• 800阅读
  • 14回复

[转贴]MG dll 的原代碼. [复制链接]

上一主题 下一主题
离线oragon18
 
发帖
187
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2006-03-16
// MGExGS.cpp : ¶¨Òå DLL Ó¦ÓóÌÐòµÄÈë¿Úµã¡£
//

#include "stdafx.h"

BYTE FuncNotImp[]="\xC1\x1F\x0D\x01\x21\x3A\x40\x20\x20\x20\x20\x20\x20\x20\xC4\xBF\xC7\xB0\xB8\xC3\xB9\xA6\xC4\xDC\xB2\xBB\xBF\xC9\xD3\xC3\x00";


void PreIncreaseSerialNo(BYTE ProtocolID,LPBYTE pProtocol,DWORD ProtocolLen,DWORD PlayerID,DWORD bEncrypt,int EncryptSerial);



BOOL FAR PASCAL InitDLL(SocketSendProc);        //³õʼ»¯È¡µÃGSÖÐЭÒé·¢ËͳÌÐòµØÖ·.
BOOL FAR PASCAL ProcessProtocol(DWORD,LPBYTE,DWORD);
DWORD FAR PASCAL GetProcAddrEx(DWORD FuncID);

void SendToClient(DWORD,LPBYTE,DWORD);
void SendToServer(LPBYTE,DWORD);//ЭÒéÊ×Ö· ЭÒ鳤¶È
void ProcClientProtocol(BYTE ProtocolID,LPBYTE pProtocol,DWORD ProtocolLen,DWORD PlayerID,DWORD bEncrypt,int EncryptSerial);
//ЭÒéID,ЭÒéÊ×Ö·,ЭÒ鳤¶È,ÈËÎïID,ÊÇ·ñ¼ÓÃÜЭÒé(Ö»ÊDZêÖ¾,GSÓÃÀ´±£Ö¤Ä³Ð©Ð­Òé±ØÐëÊǼÓÃܺó·¢ËÍÀ´µÄ,Õâ¸öÈ¡Öµ0»ò1),¼ÓÃÜ´®ºÅ(È¡Öµ-1»òÕßC3¼ÓÃܵÝÔöµÄÄǸöÊý)

BYTE GetMapCoordAttr(DWORD,DWORD,DWORD);
BOOL IncreaseSerialNo(DWORD PlayerID,BYTE Serial);
BOOL IsSelfDefense(LPPLAYERINFO pPlayer);
int ExCalcDamage(LPPLAYERINFO pAttacker,LPPLAYERINFO pBeAttacked,int nDamage, PBYTE pBloodColor);
void SaveCharData(LPPLAYERINFO pPlayer, DWORD dwPlayerID);
void OnCharDataChange(DWORD dwPlayerID);

//È«¾Ö±äÁ¿¶¨Òå
BOOL bInit;
DWORD g_dwRequestTradeInterval;
DWORD g_dwTradeNoNPCDistance;
DWORD g_dwDragonEventInterval;
BOOL g_bNoDropWhiteItem;
BOOL g_bNoDropMoney;
BOOL g_bDropFewMoney;
BYTE g_nVIPMap;
BYTE g_nVIPMaxItemExNum;
DWORD g_dwVIPExItemDropRate;
DWORD g_dwVIPLvl10ItemDropRate;
DWORD g_dwVIPLvl11ItemDropRate;
DWORD g_dwVIPLvl12ItemDropRate;
DWORD g_dwVIPLvl13ItemDropRate;
DWORD g_dwAddExp;
BYTE g_nVIPMap_EnterX;
BYTE g_nVIPMap_EnterY;
BOOL g_bEveryoneEnterVIPMap;
BOOL g_bFakeMonster;
BYTE g_nFakeMonster_Map;
DWORD g_dwConfigReloadInterval;
BYTE g_szMoveToVIPMap_CMD[MAX_MEMBERCMDLEN+1];

BYTE g_LastGuildInfo[New_GuildInfo_Len];

BYTE g_nServerCode;

BOOL g_bDBConnect=FALSE;
HDBPROC_T hDBProc_T;

BOOL g_bEnableFriendSystem;
BOOL g_bEnableDuel;
int g_nDuelDamagePer;
int g_nDuelMaxDamage;


ThreadPool tp(8);
HANDLE g_hDLLModule;

UINT_PTR nDragonTimerID,nReloadConfigTimerID;

VOID __stdcall DoDragonEvent(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime);
VOID __stdcall ReloadExConfig(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime);



void NebulaSummon(DWORD);                    //ÐÇÔÆÕÙ»½
void IncreaseCriticalDamage(DWORD PlayerID);        //ÖÂÃüÊ¥Ó¡
void DropItemEx(int MonsterID,BYTE map,BYTE x,BYTE y,int ItemID, int ItemLevel,DWORD During,BYTE Skill,BYTE Luck,BYTE Supp,int BelongTo,BYTE ExAttr);
void DropMoneyEx(LPBYTE pMap,int Zen,DWORD x,DWORD y);

void SendPlayerGuildInfoProtocol(DWORD PlayerID,DWORD SendToPlayer,BOOL bSendToAround);

//DWORD __stdcall BeforeGameSendToClient(LPBYTE,DWORD);//ecxÒª±£´æ´«µÝ
void PlayerEnterGame(LPPLAYERINFO pPlayer);
void PlayerLeaveGame(LPPLAYERINFO pPlayer);
void ProcessDamage(LPPLAYERINFO pBeAttacked,LPPLAYERINFO pAttacker,int Damage,BYTE bSendToClient,BYTE bFirstAttack,BYTE BloodColor);

void ProcessNPCDead(LPPLAYERINFO pBeKilled,LPPLAYERINFO pKiller);
BOOL IsGuildWarOrDuel(LPPLAYERINFO pBeAttacked,LPPLAYERINFO pAttacker);
__inline void OpenForum();

BOOL APIENTRY DllMain( HANDLE hModule,
              DWORD ul_reason_for_call,
              LPVOID lpReserved
                    )
{
  if(DLL_PROCESS_ATTACH==ul_reason_for_call)
   {
       bInit=FALSE;
       //int i=sizeof(AROUNDPLAYERINFO);
       /*TCHAR szFilePath[MAX_PATH];//,szFileName[MAX_FILENAME];
       GetModuleFileName(NULL,szFilePath,MAX_PATH);
       if(stricmp(szFilePath,"D:\\Muserver\\GameServer\\gs99.exe")==0)
       {
           MessageBox(NULL,"¼ÓÔسɹ¦!","MG GameServer",MB_OK|MB_ICONINFORMATION);
           return TRUE;
       }*/
       g_hDLLModule=hModule;
       return TRUE;
#endif
   }
   return TRUE;
}

BOOL FAR PASCAL InitDLL(SocketSendProc SendProcAddr)
{
   if(bInit)return bInit;
#ifndef _MGGS_UNUSABLE
   GSSendToClient=SendProcAddr;
#endif

   if(NULL!=GSSendToClient)
   {
       bInit=TRUE;
   }

   InitChat();

#ifdef _MGGS_UNUSABLE

       srand( (unsigned)GetTickCount());//³õʼ»¯rand();
       DWORD dwRand=rand();
       _asm
       {
           jmp dwRand
       }
#endif

   g_dwRequestTradeInterval=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_REQUESTTRADEINTERVAL,GS_INI_DEFAULTREQUESTTRADEINTERVAL,GS_INI_FILENAME);
   g_dwRequestTradeInterval*=1000;

   g_dwTradeNoNPCDistance=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_TRADENONPCDISTANCE,GS_INI_DEFAULTTRADENONPCDISTANCE,GS_INI_FILENAME);
   if(g_dwTradeNoNPCDistance>255)g_dwTradeNoNPCDistance=255;


   g_dwDragonEventInterval=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_DRAGONEVENTINTERVAL,GS_INI_DEFAULTDRAGONEVENTINTERVAL,GS_INI_FILENAME);
   if(g_dwDragonEventInterval!=0&&g_dwDragonEventInterval<5)g_dwDragonEventInterval=5;
   g_dwDragonEventInterval*=60000;
   if(0!=g_dwDragonEventInterval)
   {
       nDragonTimerID=SetTimer(NULL,NULL,g_dwDragonEventInterval,DoDragonEvent);
   }

   DWORD dwTemp;
   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_NODROPWHITEITEM,GS_INI_DEFAULTNODROPWHITEITEM,GS_INI_FILENAME);
   g_bNoDropWhiteItem=(dwTemp!=0);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_NODROPMONEY,GS_INI_DEFAULTNODROPMONEY,GS_INI_FILENAME);
   g_bNoDropMoney=(dwTemp!=0);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_DROPFEWMONEY,GS_INI_DEFAULTDROPFEWMONEY,GS_INI_FILENAME);
   g_bDropFewMoney=(dwTemp!=0);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAP,GS_INI_DEFAULTVIPMAP,GS_INI_FILENAME);
   g_nVIPMap=LOBYTE(LOWORD((dwTemp)));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAP_ENTERX,GS_INI_DEFAULTVIPMAPENTERX,GS_INI_FILENAME);
   g_nVIPMap_EnterX=LOBYTE(LOWORD((dwTemp)));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAP_ENTERY,GS_INI_DEFAULTVIPMAPENTERY,GS_INI_FILENAME);
   g_nVIPMap_EnterY=LOBYTE(LOWORD((dwTemp)));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAP_EVERYONE,GS_INI_DEFAULTVIPMAPEVERYONE,GS_INI_FILENAME);
   g_bEveryoneEnterVIPMap=(dwTemp!=0);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPDROPITEMMAXEXATTRNUM,GS_INI_DEFAULTVIPMAPDROPITEMMAXEXATTRNUM,GS_INI_FILENAME);
   g_nVIPMaxItemExNum=LOBYTE(LOWORD((dwTemp)));
   if(g_nVIPMaxItemExNum>ITEM_MaxExNum)g_nVIPMaxItemExNum=ITEM_MaxExNum;

   g_dwVIPExItemDropRate=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPEXITEMDROPRATE,GS_INI_DEFAULTVIPMAPEXITEMDROPRATE,GS_INI_FILENAME);

   g_dwVIPLvl10ItemDropRate=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPLVL10ITEMDROPRATE,GS_INI_DEFAULTVIPMAPLVL10ITEMDROPRATE,GS_INI_FILENAME);
   g_dwVIPLvl11ItemDropRate=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPLVL11ITEMDROPRATE,GS_INI_DEFAULTVIPMAPLVL11ITEMDROPRATE,GS_INI_FILENAME);
   g_dwVIPLvl12ItemDropRate=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPLVL12ITEMDROPRATE,GS_INI_DEFAULTVIPMAPLVL12ITEMDROPRATE,GS_INI_FILENAME);

   g_dwVIPLvl13ItemDropRate=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPLVL13ITEMDROPRATE,GS_INI_DEFAULTVIPMAPLVL13ITEMDROPRATE,GS_INI_FILENAME);
   g_dwAddExp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_ADDEXP,GS_INI_DEFAULTADDEXP,GS_INI_FILENAME);

   if(g_dwAddExp==0)g_dwAddExp=1;


   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_ISFAKEMONSTER,GS_INI_DEFAULTISFAKEMONSTER,GS_INI_FILENAME);
   g_bFakeMonster=(dwTemp!=0);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_FAKEMONSTER_MAP,GS_INI_DEFAULTFAKEMONSTERMAP,GS_INI_FILENAME);
   g_nFakeMonster_Map=LOBYTE(LOWORD((dwTemp)));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_CONFIGRELOADINTERVAL,GS_INI_DEFAULTCONFIGRELOADINTERVAL,GS_INI_FILENAME);
   g_dwConfigReloadInterval=dwTemp*60000;//ת»»Îªms
   if(0!=g_dwConfigReloadInterval)
   {
       nReloadConfigTimerID=SetTimer(NULL,NULL,g_dwConfigReloadInterval,ReloadExConfig);
   }

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_SERVERINFO_KEYNAME_SERVERCODE,GS_SERVERINFO_DEFAULTSERVERCODE,GS_SERVERINFO_FILENAME);
   g_nServerCode=LOBYTE(LOWORD(dwTemp));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_ENABLEFRIENDSYSTEM,GS_INI_DEFAULT_ENABLEFRIENDSYSTEM,GS_INI_FILENAME);
   g_bEnableFriendSystem=LOBYTE(LOWORD(dwTemp));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_ENABLEDUEL,GS_INI_DEFAULT_ENABLEDUEL,GS_INI_FILENAME);
   g_bEnableDuel=LOBYTE(LOWORD(dwTemp));

   dwTemp = GetPrivateProfileInt( GS_INI_SECTIONNAME, GS_INI_KEYNAME_DUELDAMAGEPER, GS_INI_DEFAULTDUELDAMAGEPER, GS_INI_FILENAME );
   if ( dwTemp > 100 )
   {
       dwTemp = 100;
   }
   g_nDuelDamagePer = dwTemp;

   g_nDuelMaxDamage = GetPrivateProfileInt( GS_INI_SECTIONNAME, GS_INI_KEYNAME_DUELMAXDAMAGE, GS_INI_DEFAULTDUELMAXDAMAGE, GS_INI_FILENAME );
   if ( g_nDuelMaxDamage < 0 )
   {
       g_nDuelMaxDamage = 0;
   }


#ifdef _MGGS_UNUSABLE

       srand( (unsigned)GetTickCount());//³õʼ»¯rand();
       dwRand=rand();
       _asm
       {
           jmp dwRand
       }
#endif

   OpenLogFile();    //´ò¿ªlogÎļþ


   TCHAR szLog[MAX_LOGSTRING];
   nMemberNum=ReadMember();
   sprintf(szLog,"¹²¼ÓÔØ%d¸ö»áÔ±ÐÅÏ¢.",nMemberNum);
   WriteLogFile(szLog);
   nSpecItemNum=ParseDropFile();
   sprintf(szLog,"¹²½âÎö%d¸öÌØÊâÎïÆ·µôÂäÏî.",nSpecItemNum);
   WriteLogFile(szLog);

   if(!InitGuildInfo())
   {
       WriteLogFile("Error:½¨Á¢Õ½ÃËͬ²½Ê¼þʱ³ö´í!");
   }


   //´ò¿ªÊý¾Ý¿â
   TCHAR DBServerName[MAX_SQLSERVERNAME],DBName[MAX_SQLDBNAME],UserID[MAX_SQLUSERID],Password[MAX_SQLPWD];
   TCHAR szFilePath[MAX_PATH];

   GetExeDir(szFilePath);
   strcpy(&szFilePath[lstrlen(szFilePath)],INI_FILENAME);

   GetPrivateProfileString(INI_SECTIONNAME_ODBC,INI_KEYNAME_SERVERNAME,DEFAULT_SQL_SERVERNAME,DBServerName,MAX_SQLSERVERNAME,szFilePath);
   GetPrivateProfileString(INI_SECTIONNAME_ODBC,INI_KEYNAME_DBNAME,DEFAULT_SQL_DBNAME,DBName,MAX_SQLDBNAME,szFilePath);
   GetPrivateProfileString(INI_SECTIONNAME_ODBC,INI_KEYNAME_USERID,DEFAULT_SQL_USERID,UserID,MAX_SQLUSERID,szFilePath);
   GetPrivateProfileString(INI_SECTIONNAME_ODBC,INI_KEYNAME_PWD,DEFAULT_SQL_PWD,Password,MAX_SQLPWD,szFilePath);

   GetPrivateProfileString(GS_INI_SECTIONNAME,GS_INI_KEYNAME_MOVETOVIPCMD,GS_INI_DEFAULTMOVETOVIPCMD,(char*)g_szMoveToVIPMap_CMD,MAX_MEMBERCMDLEN,GS_INI_FILENAME);


   hDBProc_T.DBType=DBTYPE_SQL;
   hDBProc_T.hDBC=NULL;
   hDBProc_T.hENV=NULL;
   hDBProc_T.hSTMT=NULL;
#ifdef _MGGS_UNUSABLE

       srand( (unsigned)GetTickCount());//³õʼ»¯rand();
       dwRand=rand();
       _asm
       {
           jmp dwRand
       }
#endif
   ZeroMemory(hDBProc_T.PreStm,MAX_PREPARE_STMTS*sizeof(SQLHSTMT));

   if(mDBSuccess!=HDBConnect(&hDBProc_T,DBServerName,DBName,UserID,Password,1))
   {
       WriteLogFile(STRING_SQLCONNECT_FAIL);
       g_bDBConnect=FALSE;
   }
   else
   {
       WriteLogFile(STRING_SQLCONNECT_SUCCESS);
       g_bDBConnect=TRUE;

       ReadGuildInfo();
       if(nGuild>=0)
       {
           sprintf(szLog,"¹²¶ÁÈ¡%d¸öÕ½ÃËÐÅÏ¢.",nGuild);
           WriteLogFile(szLog);
       }
       ReadGuildMember();
       if(nGuildMember>=0)
       {
           sprintf(szLog,"¹²¶ÁÈ¡%d¸öÕ½Ã˳ÉÔ±ÐÅÏ¢.",nGuildMember);
           WriteLogFile(szLog);
       }
   }

#ifdef _MGGS_VER0508
   if(!InitEagleAttackTimer())//³õʼ»¯ÌìÓ¥¹¥»÷
   {
       WriteLogFile("Error:½¨Á¢ÌìÓ¥¹¥»÷Event¶ÔÏóʱʧ°Ü!");
   }
   InitDuelCheckTimer();
#endif
#ifdef _MGGS_CASTLEATTACK
   InitCastleAttack();
#endif

   InitSuitList();
   InitPShop();
#ifdef _MGGS_SHAREVER
   OpenForum();
#endif

   return bInit;
}

BOOL FAR PASCAL ProcessProtocol(DWORD ProtID,LPBYTE pProt,DWORD PlayerID)
{
   //Õâ¸ö¹¦ÄܺÃÏñûÓÃÁË..
   //char info[]="\xc3\x08\x1C\x16\x02\xD9\x28\x00";
       //
   if(0x000000a7==ProtID)
   {
       SendToClient(PlayerID,(LPBYTE)FuncNotImp,(DWORD)FuncNotImp[1]);
       return TRUE;
   }
   return FALSE;
}

DWORD FAR PASCAL GetProcAddrEx(DWORD FuncID)
{
#ifdef _MGGS_UNUSABLE

       srand( (unsigned)GetTickCount());//³õʼ»¯rand();
       DWORD dwRand=rand();
       _asm
       {
           jmp dwRand
       }
#endif
   switch (FuncID)
   {
   case FUNCID_PROCESSPROTOCOL:
       return (DWORD)ProcClientProtocol;
   case FUNCID_PROCESSNEWMAGIC:
       return GSFUNCADDR_PROCESSNEWMAGIC;
   case FUNCID_SENDTOCLIENT:
       return (DWORD)SendToClient;
   case FUNCID_DROPITEM:
       return (DWORD)DropItemEx;
   case FUNCID_DROPMONEY:
       return (DWORD)DropMoneyEx;
   case FUNCID_PLAYERENTERGAME:
       return (DWORD)PlayerEnterGame;
   case FUNCID_PLAYERLEAVEGAME:
       return (DWORD)PlayerLeaveGame;
   case FUNCID_PROCESSDAMAGE:
       return (DWORD)ProcessDamage;
   case FUNCID_NPCDEAD:
       return (DWORD)ProcessNPCDead;
   case FUNCID_GUILDWARORDUEL:
       return (DWORD)IsGuildWarOrDuel;
   case FUNCID_EXCALCDAMAGE:
       return (DWORD)ExCalcDamage;
   case FUNCID_SAVECHARDATA:
       return (DWORD)SaveCharData;
   case FUNCID_ONCHARDATACHANGE:
       return (DWORD)OnCharDataChange;
   //case FUNCID_BEFOREGAME_SENDTOCLIENT:
   //    return (DWORD)BeforeGameSendToClient;
   default: return 0;
   }
   return 0;
}

//´¦Àí¿Í»§¶Ë·¢¹ýÀ´µÄЭÒé
void ProcClientProtocol(BYTE ProtocolID,LPBYTE pProtocol,DWORD ProtocolLen,DWORD PlayerID,DWORD bEncrypt,int EncryptSerial)
{
   //µ÷ÓÃGSÔ­À´µÄ´¦Àí³ÌÐò
   DWORD dwCurrTick=GetTickCount();
   if(PlayerID<MIN_PLAYERID||PlayerID>MAX_PLAYERID)return;
   LPPLAYERINFO pPlayer=(LPPLAYERINFO)(PlayerID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);

   //ÅжÏЭÒéÊDz»ÊÇC1-c4,Èç¹û²»ÊÇ£¬Ö±½Ó·µ»Ø
   if (pProtocol[0] < (BYTE)0xC1 || pProtocol[0] > (BYTE)0xC4)
   {
       char szMsg[MAX_C1LEN];
       sprintf(szMsg, "Invalid Protocol Head: %d", pProtocol[0]);
       WriteLogFile(szMsg);
       return;
   }
   //Èç¹ûÕý±»block,Ôò²»´¦ÀíijЩЭÒé²¢·µ»Ø
#ifdef _TestAntiHack
   if(PlayerExInfo[PlayerID-MIN_PLAYERID].dwBlockTickCount>dwCurrTick)
   {
       if(IsBlockProtocol(ProtocolID))
       {
           if(bEncrypt)
               PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
           return;
       }
   }
   else
   {
       PlayerExInfo[PlayerID-MIN_PLAYERID].dwBlockTickCount=dwCurrTick;
   }
#endif

   if(ProtocolID==(BYTE)CProtocol_GuildDuty)return;//ÆÁ±ÎÕ½ÃË"Ö°Ôð"¹¦ÄÜ
   if(ProtocolID==(BYTE)PROTOCOL_CHAT)return;//ÆÁ±Îµã»÷ºÃÓÑÁÄÌ칦ÄÜ
   if(ProtocolID==(BYTE)Protocol_AlliedInfo)return;//ÆÁ±ÎÕ½ÃËÁªÃËÐÅÏ¢
   if ( ( BYTE )Protocol_CryWolf_Status == ProtocolID ) return;//ÆÁ±ÎѪÀdzDZ¤Ð­Òé

#ifdef _TestAntiHack
   //Èç¹ûΪ×ß·ЭÒé,ÅжÏÊDz»ÊÇÓÐÍâ¹Ò¼ÓËÙ
   if(ProtocolID==(BYTE)CProtocol_Walking&&ProtocolLen>5)
   {
       DWORD dwTime=dwCurrTick-pPlayer->LastWalkTickCount;
       if(dwTime<100)
       {
           DWORD dwTick=PlayerExInfo[PlayerID-MIN_PLAYERID].dwBlockTickCount;
           dwTick=dwTick>dwCurrTick?dwTick:dwCurrTick;
           dwTick+=(100-dwTime)*80;
           if(dwTick-dwCurrTick>1000)
           {
               dwTick=dwCurrTick+3000;
           }
           PlayerExInfo[PlayerID-MIN_PLAYERID].dwBlockTickCount=dwTick;
       }
   }

   //ÏÞÖÆÁ½´Î¹¥»÷µÄʱ¼ä¼ä¾à
   if(ProtocolID==(BYTE)CProtocol_NewAttackIDs)
   {
       if(PlayerExInfo[PlayerID-MIN_PLAYERID].dwLastAttackTickCount-dwCurrTick<300)
       {
           PlayerExInfo[PlayerID-MIN_PLAYERID].dwLastAttackTickCount=dwCurrTick;
           if(bEncrypt)
               PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
           return;
       }
       PlayerExInfo[PlayerID-MIN_PLAYERID].dwLastAttackTickCount=dwCurrTick;
   }
#endif

   if(ProtocolID==Protocol_Talking&&ProtocolLen>MIN_TALK_PROTOCOLLEN)
   {
       if(strcmp((char*)&pProtocol[MIN_TALK_PROTOCOLLEN],(char*)g_szMoveToVIPMap_CMD)==0)
       {
           if(pPlayer->ConnectStatus==ConnectStat_Playing)
           {
               if(g_bEveryoneEnterVIPMap||IsMember(pPlayer))
               {
                   GSPlayerMoveProc(PlayerID,(DWORD)g_nVIPMap,(WORD)g_nVIPMap_EnterX,(WORD)g_nVIPMap_EnterY);
                   TCHAR szTipLogText[MAX_LOGSTRING]={0};
                   sprintf(szTipLogText,"ÕʺÅ[%s]:½ÇÉ«Ãû[%s]½øÈë»áÔ±µØͼ!",pPlayer->Account,pPlayer->Name);
                   WriteLogFile(szTipLogText);
                   return;
               }
               else
               {
                   C1TipPlayer(PlayerID,TIP_NOTMEMBER,C1TIP_TIP);
                   return;
               }
           }
       }
#ifdef _MGGS_VER0508
       if(ProcessTalk(pPlayer,(char*)&pProtocol[MIN_TALK_PROTOCOLLEN],ProtocolLen-MIN_TALK_PROTOCOLLEN))
       {
           return;        //Èç¹ûDLL´¦ÀíÍê³É,ÔòÖ±½Ó·µ»Ø,·ñÔò½»¸øºóÃæ´¦Àí
       }
#endif
   }
   if(ProtocolID==CProtocol_AuxSkill)
   {
       if(pProtocol[3]==Skill_IncreaseCriticalDamage)
       {
           PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
           IncreaseCriticalDamage(PlayerID);
           return;
       }
       if(pProtocol[3]==Skill_NebulaSummon)
       {
           PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
           NebulaSummon(PlayerID);
           GSResponseAuxSkill(pPlayer,Skill_NebulaSummon,PlayerID,1);
           return;
       }
   }
#ifndef _MGGS_NEW_VERSION
   if(ProtocolID==Protocol_D0)
   {
       BYTE buff[7];
       buff[0]=0xC1;
       buff[1]=0x07;
       buff[2]=ProtocolID;
       buff[3]=HIBYTE(PlayerID);
       buff[4]=LOBYTE(PlayerID);
       buff[5]=pProtocol[3];
       buff[6]=pProtocol[4];
       GSSendToAround(pPlayer,buff,sizeof(buff));
       return;
   }
#endif
   if(ProtocolID==CProtocol_RequestTrade)
   {
       DWORD CurrTick=GetTickCount();
       if(CurrTick-pPlayer->LastTradeRequestTick<g_dwRequestTradeInterval)
       {
           PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
           C1TipPlayer(PlayerID,TIP_FORBIDTRADE,C1TIP_TIP);
           return;
       }
       if(g_dwTradeNoNPCDistance>0)
       {
           for(WORD index=ID_MONSTER_START;index<=ID_MONSTER_END;index++)
           {
               LPPLAYERINFO pPlayer=(LPPLAYERINFO)(PlayerID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
               LPNPCINFO pNPC=(LPNPCINFO)(index*sizeof(NPCINFO)+GS_BasePlayerAddr);
               if(pNPC->NPCType==NPC_NPC&&pNPC->MapNO==pPlayer->MapNO)
               {
                   if(GSGetPlayerDistance(pPlayer,pNPC)<g_dwTradeNoNPCDistance)
                   {
                       PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
                       C1TipPlayer(PlayerID,TIP_NPC_DISTANCE,C1TIP_TIP);
                       return;
                   }
               }
           }
       }
   }
#ifdef _MGGS_NEW_VERSION
   if(ProtocolID==Protocol_NewGuildInfo)
   {
       return;
   }
#endif
#ifdef _MGGS_VER0508
   if(ProtocolID==CPROTOCOL_EAGLEATTACKMODE)//ÌìÓ¥¸Ä±ä¹¥»÷·½Ê½
   {
       if(ProtocolLen==sizeof(ProtStruct_EagleAttackMode))
       {
           LPProtStruct_EagleAttackMode pAttackModeProt=(LPProtStruct_EagleAttackMode)pProtocol;
           PlayerExInfo[PlayerID-MIN_PLAYERID].EagleAttackMode=pAttackModeProt->AttackMode;
           PlayerExInfo[PlayerID-MIN_PLAYERID].dwLastEagleAttackTickCount=GetTickCount();
           if(pAttackModeProt->AttackMode==EAGLE_ATTACKMODE_SPECIFIED)
           {
               PlayerExInfo[PlayerID-MIN_PLAYERID].dwEagleAttackID=MAKELONG(MAKEWORD(pAttackModeProt->AttackID_LOBYTE,pAttackModeProt->AttackID_HIBYTE),0);
           }
       }
   }

   if(ProtocolID==PROTOCOL_ADDFRIEND&&ProtocolLen==0x0d&&g_bEnableFriendSystem)
   {
   }
   
   if(ProtocolID==PROTOCOL_DELFRIEND&&ProtocolLen==0x0d&&g_bEnableFriendSystem)
   {
       char szFriendName[MAX_PLAYERNAMELEN+1]={0};
       strncpy(szFriendName,(char*)&pProtocol[3],MAX_PLAYERNAMELEN);
       int nResult=DelFriend(pPlayer,szFriendName);
       if(FRIEND_SUCCESS==nResult)
       {
           char szDelFriendProtocol[0x0e];
           szDelFriendProtocol[0]=PROTOCOL_C1;
           szDelFriendProtocol[1]=sizeof(szDelFriendProtocol);
           szDelFriendProtocol[2]=PROTOCOL_DELFRIEND;
           szDelFriendProtocol[3]=1;//ɾ³ý³É¹¦
           strncpy(&szDelFriendProtocol[4],szFriendName,10);
           GSSendToClient(PlayerID,(LPBYTE)szDelFriendProtocol,szDelFriendProtocol[1]);
       }
       return;
   }
   if(ProtocolID==Protocol_Duel_Request&&g_bEnableDuel)//ÑûÇë¾ö¶·
   {
       //C3´®ºÅ´¦Àí
       PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);

       if(pPlayer->MapNO>MAP_Icarus&&pPlayer->MapNO<MAP_Kalima1)
       {
           C1TipPlayer(PlayerID,TIP_FORBIDDUEL_MAP,C1TIP_TIP);
           return;
       }
       if(pPlayer->PKLevel==6)
       {
           C1TipPlayer(PlayerID,TIP_FORBIDDUEL_FIEND,C1TIP_TIP);
           return;
       }
       if(IsSelfDefense(pPlayer))
       {
           C1TipPlayer(PlayerID,TIP_FORBIDDUEL_SELFDEFENSE,C1TIP_TIP);
           return;
       }

#ifdef _MGGS_CASTLEATTACK //¹¥³Ç

       //¹¥³Çʱ½ûÖ¹ÔÚ¹¥³ÇµØͼ¾ö¶·
       if (pPlayer->MapNO == MAP_Castle && g_CastleAttack.Status == Attacking)
       {
           C1TipPlayer(PlayerID,TIP_FORBIDDUEL_ATTACKINGCASTLE,C1TIP_TIP);
           return;
       }

#endif

       LPCPROT_REQUESTDUEL pRequestDuel=(LPCPROT_REQUESTDUEL)pProtocol;
       DWORD BeRequestedID=MAKELONG(MAKEWORD(pRequestDuel->BeRequestedID_LOBYTE,pRequestDuel->BeRequestedID_HIBYTE),0);
       if(BeRequestedID<MIN_PLAYERID||BeRequestedID>MAX_PLAYERID)return;
       LPPLAYERINFO pBeRequestedPlayer=(LPPLAYERINFO)(BeRequestedID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
       if(pBeRequestedPlayer->ConnectStatus<ConnectStat_Playing||pBeRequestedPlayer->QuitSecond>=0)return;

       if(pBeRequestedPlayer->PKLevel==6)
       {
           C1TipPlayer(PlayerID,TIP_FORBIDDUEL_VS_FIEND,C1TIP_TIP);
           return;
       }
       if(IsSelfDefense(pBeRequestedPlayer))
       {
           C1TipPlayer(PlayerID,TIP_FORBIDDUEL_VS_SELFDEFENSE,C1TIP_TIP);
           return;
       }

       if(PlayerExInfo[PlayerID-MIN_PLAYERID].bDuel)
       {
           C1TipPlayer(PlayerID,TIP_FORBIDDUEL_BEINGDUEL,C1TIP_TIP);
           return;
       }

       if(PlayerExInfo[BeRequestedID-MIN_PLAYERID].bDuel)
       {
           C1TipPlayer(PlayerID,TIP_FORBIDDUEL_VS_BEINGDUEL,C1TIP_TIP);
           return;
       }

       char szName[MAX_PLAYERNAMELEN+1]={0};
       strncpy(szName,pRequestDuel->Name,MAX_PLAYERNAMELEN);
       char szTip[MAX_C1LEN]={0};
       sprintf(szTip,TIP_REQUESTDUEL,szName);//·¢Ë͸ø×Ô¼º
       C1TipPlayer(PlayerID,szTip,C1TIP_TIP);

       return;
   }
   if(ProtocolID==Protocol_Duel_BeRequested&&g_bEnableDuel)//±»ÑûÇ뷽ͬÒâ/¾Ü¾ø¾ö¶·
   {

   }
   if(ProtocolID==Protocol_Duel_Cancel)
   {
       PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
       CancelDuel(PlayerID);
       return;
   }

#endif
#ifdef _MGGS_CASTLEATTACK
   if(g_CastleAttack.Enable)
   {
       if(ProtocolID==Protocol_NPCTalk)//ºÍNPC½»Ì¸
       {
           LPCPROTSTRUCT_TALKTONPC pTalkToNPC=(LPCPROTSTRUCT_TALKTONPC)pProtocol;
           DWORD dwMonsterID=MAKELONG(MAKEWORD(pTalkToNPC->ID_LOBYTE,pTalkToNPC->ID_HIBYTE),0);
           if(dwMonsterID<=ID_MONSTER_END)
           {
               LPMONSTERINFO pMonster=(LPMONSTERINFO)(dwMonsterID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
               if(pMonster->Job==NPCID_CASTLEGUARDER)//Èç¹ûÊǹ¥³ÇÊØÎÀ
               {
                   PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
                   if(g_CastleAttack.Status!=Attacking)
                   {
                       SPROTSTRUCT_TALKTONPC TalkToGuarder;
                       TalkToGuarder.ProtocolHeader=PROTOCOL_C3;
                       TalkToGuarder.ProtocolID=Protocol_NPCTalk;
                       TalkToGuarder.ProtocolLen=sizeof(TalkToGuarder);
                       TalkToGuarder.DialogID=0x0d;
                       TalkToGuarder.Preserved=0;
                       GSSendToClient(PlayerID,(LPBYTE)&TalkToGuarder,TalkToGuarder.ProtocolLen);
                       SendCastleAttackInfo(PlayerID);
                       return;
                   }
                   else
                   {
                       NPCTalk(PlayerID,dwMonsterID,"¹¥³ÇÖв»Äܲ鿴¹¥³ÇÐÅÏ¢");
                       return;
                   }
               }
               else if(pMonster->Job==NPCID_CASTLEATTACKMANGONEL)//Èç¹ûÊǹ¥»÷Ͷʯ³µ
               {
                   PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
                   //¹¥»÷Ͷʯ³µ´¦Àí
                   return;
               }
           }
           
       }
       else if(ProtocolID==Protocol_AttackCastle)//¹¥³ÇЭÒé
       {
           ProcessCastleAttackProt(PlayerID,pProtocol,ProtocolLen);
           return;
       }
       else if(ProtocolID==Protocol_AttackCastle_Flag)//¹¥³ÇµØͼÖÐÆìÖÄÉϵijDZ¤Õ¼Óз½Õ½Ã˵ÄLogo
       {
           ProcessCastleAttackFlag(PlayerID,pProtocol,ProtocolLen);
           return;
       }
       else if(ProtocolID==Protocol_AttackCastle_DeclareInfo)
       {
           ProcessCastleAttack_DeclareInfo(PlayerID);
           return;
       }
       else if(ProtocolID==Protocol_AttackCastle_PrepareInfo)
       {
           ProcessCastleAttack_PrepareInfo(PlayerID);
           return;
       }
       else if(ProtocolID==Protocol_Gate&&pProtocol[3]==GateNo_CastleAttack_IntoBroadRoom)
       {
           if(GetPlayerCastleJoinInfo(pPlayer)!=CJ_Owner&&g_CastleAttack.Status!=Attacking)
           {
                   PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
                   C1TipPlayer(PlayerID,"²»ÊdzÇÖ÷ËùÊôÕ½ÃË,²»ÄܽøÈë!",C1TIP_TIP);
                   SPROTSTRUCT_GATE spGate;
                   spGate.ProtocolHeader=PROTOCOL_C3;
                   spGate.ProtocolID=Protocol_Gate;
                   spGate.ProtocolLen=sizeof(spGate);
                   spGate.GateNo=GateNo_CastleAttack_IntoBroadRoom;
                   spGate.x=pPlayer->x;
                   spGate.y=pPlayer->y;
                   spGate.Dir=pPlayer->Dir;
                   spGate.MapNo=pPlayer->MapNO;
                   SendToClient(PlayerID,(LPBYTE)&spGate,sizeof(spGate));
                   return;
           }
       }
   }
#endif
#ifdef _MGGS_PSHOP
   if (ProtocolID == PROTOCOL_PERSONALSHOP) //¸öÈËÉ̵ê
   {
       //c3´¦Àí
       PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
       PersonalShopProc(pPlayer, pProtocol, ProtocolLen);
       return;//²»ÔÙ½»ÓÉGS´¦Àí
   }
   if (ProtocolID == Protocol_MoveItem)
   {
       if (PersonalShop_ItemMove(pPlayer, pProtocol, ProtocolLen))
       {
           //c3´¦Àí
           PreIncreaseSerialNo(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);//IncreaseSerialNo(PlayerID,EncryptSerial);
           return; //Èç¹ûÒѾ­´¦Àí£¬Ôò²»½»ÓÉGS´¦Àí
       }
   }

#endif
   if ( pProtocol[ 0 ] == PROTOCOL_C1
       && ProtocolID == Protocol_Status
       && pProtocol[ 3 ] == STATUS_ADDPOINT )
   {
       LPCLIENTADDPOINT pAdd = ( LPCLIENTADDPOINT ) pProtocol;
       if ( pAdd->Type > ADDPOINT_ENERGY )
       {
           return;
       }
   }
   GSProtocolProc(ProtocolID,pProtocol,ProtocolLen,PlayerID,bEncrypt,EncryptSerial);
}
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
凡事要向好的那方去看,但要有最壞的打算.
离线oragon18
发帖
187
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 沙发  发表于: 2006-03-16
//?¢ËÍÊý¾Ýµ½¿Í»§¶Ë
void SendToClient(DWORD PlayerID,LPBYTE pProtocol,DWORD ProtocolLen)
{
   if(PlayerID<MIN_PLAYERID||PlayerID>MAX_PLAYERID)return;
   LPPLAYERINFO pPlayer=(LPPLAYERINFO)(PlayerID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
   if(g_bFakeMonster&&pPlayer->MapNO==g_nFakeMonster_Map&&ProtocolLen>MIN_C2LEN&&(BYTE)pProtocol[0]==PROTOCOL_C2&&(BYTE)pProtocol[3]==SProtocol_NPCAppear)//NPC³öÏÖЭÒé,ЭÒéoffset 7µÄWORDÖµ±íʾNPC´úºÅ
   {
       BYTE nBytesPerNPC;
#ifdef _MGGX_NEW_VERSION
       nBytesPerNPC=16;
#else
       nBytesPerNPC=12;
#endif
       int nNum=(((BYTE)pProtocol[1]*256+(BYTE)pProtocol[2])-5)/nBytesPerNPC;//ÿ12×Ö½ÚÒ»¸öNPC
       srand( (unsigned)GetTickCount());//³õʼ»¯rand();
       for(int i=0;i<nNum;i++)
       {
           int nAttackMonster=GetAttackMonsterNum();
           unsigned int nRandID=(unsigned)rand()%nAttackMonster;
           nRandID=AttackMonsterList[nRandID];
           int nOffset=i*nBytesPerNPC+7;
           _asm
           {
               mov eax,nRandID
               mov ecx,pProtocol
               add ecx,nOffset
               and eax,0x0ffff
               xchg al,ah
               mov [ecx],ax
           }
       }
   }
//begin of ÈËÎï³öÏÖ
#ifdef _MGGS_CASTLEATTACK
   if(pProtocol[0]==PROTOCOL_C2&&(BYTE)SProtocol_PlayerAppear==pProtocol[3])
   {
       BYTE nPlayer=pProtocol[4];
       for(BYTE nIndex=0;nIndex<nPlayer;nIndex++)
       {
           int nBytesPerPlayer=40;//ÿ¸ö½ÇÉ«ÐÅÏ¢40×Ö½Ú,Í?¹²Õ¼5×Ö½Ú
           DWORD dwPlayerID=MAKELONG(MAKEWORD(pProtocol[6 + nIndex * nBytesPerPlayer],pProtocol[5 + nIndex * nBytesPerPlayer]),0);
           if(dwPlayerID<MIN_PLAYERID||dwPlayerID>MAX_PLAYERID)continue;

           LPPLAYERINFO pCAPlayer = (LPPLAYERINFO)(dwPlayerID * sizeof(PLAYERINFO) + GS_BasePlayerAddr);
           CastleAttack_Join cjInfo = GetPlayerCastleJoinInfo(pCAPlayer);
           if(CJ_Owner==cjInfo)
           {
               pProtocol[27+nIndex*40]|=0x04;//bit2±íʾÊسÇ?½
           }
           else if(CJ_Attacker==cjInfo)
           {
               pProtocol[27+nIndex*40]|=0x08;//bit3±íʾ¹¥³Ç?½
           }
       }
   }
#endif
#ifdef _MGGS_SUIT
   if(pProtocol[0] == PROTOCOL_C2 && (BYTE)SProtocol_PlayerAppear == pProtocol[3])
   {
       BYTE nPlayer = pProtocol[4];
       for(BYTE nIndex = 0; nIndex < nPlayer; nIndex++)
       {
           int nBytesPerPlayer = 40;//ÿ¸ö½ÇÉ«ÐÅÏ¢40×Ö½Ú,Í?¹²Õ¼5×Ö½Ú
           DWORD dwPlayerID = MAKELONG(MAKEWORD(pProtocol[6 + nIndex * nBytesPerPlayer], pProtocol[5 + nIndex * nBytesPerPlayer]), 0);
           if (dwPlayerID < MIN_PLAYERID || dwPlayerID > MAX_PLAYERID) continue;

           DWORD dwExPlayerID = dwPlayerID - MIN_PLAYERID;
           pProtocol[20 + nIndex * 40] = PlayerExInfo[dwExPlayerID].Protocol_PlayerSuit;
       }
   }
#endif
//end of ÈËÎï³öÏÖ

#ifdef _MGGS_NEW_VERSION
   BYTE ProtocolID;
   if(pProtocol[0]==(BYTE)PROTOCOL_C1||pProtocol[0]==(BYTE)PROTOCOL_C3)
       ProtocolID=pProtocol[2];
   else
       ProtocolID=pProtocol[3];

   if(ProtocolID==SProtocol_OldGuildInfo)
   {
       /*BYTE *pBuffer=g_LastGuildInfo;//[New_GuildInfo_Len]={0};//еÄÕ½ÃËЭÒéΪ0x3C×Ö½Ú,Ô­À´Îª2F
       ProtocolLen=New_GuildInfo_Len;
       pBuffer[0]=PROTOCOL_C1;//ЭÒé±ä³ÉC1;
       pBuffer[1]=New_GuildInfo_Len;//³¤¶È
       pBuffer[2]=Protocol_NewGuildInfo;//ÐÂЭÒéID
       pBuffer[3]=0;//²»ÖªµÀÊÇʲô...=_=
       pBuffer[4]=pProtocol[5];
       pBuffer[5]=pProtocol[6];
       memcpy((char*)&pBuffer[6],"\x03\x00\x00\x00\x01\x00\x14\xD5\x12\x0F\xFF",0x0b);//²»ÖªµÀʲôÒâ˼=_=
       memcpy((char*)&pBuffer[17],&pProtocol[7],40);//Õ½ÃËÃû³ÆΪͼ±ê(8+32)
       //ºóÃæÈý¸öΪ0µÄ×Ö½ÚÒѾ­ÔÚ³õʼ»¯Ê±Íê³É ,¾ßÌå²»ÖªµÀÒâ˼.
       //GSSendToClient(PlayerID,pBuffer,ProtocolLen);*/
       return;
   }
   if(ProtocolID==SProtocol_OldPlayerJoinGuild)
   {
       ProtocolLen=0x11;
       WORD wPlayerID=MAKEWORD(pProtocol[4],pProtocol[3]&0x7f);
       if(wPlayerID<MIN_PLAYERID||wPlayerID>MAX_PLAYERID)return;
       LPPLAYERINFO pGuildPlayer=(LPPLAYERINFO)((DWORD)wPlayerID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
       try
       {
           BYTE *pBuffer=new BYTE[ProtocolLen];
           ZeroMemory(pBuffer,ProtocolLen);
           pBuffer[0]=PROTOCOL_C2;        //C2
           pBuffer[1]=HIBYTE(LOWORD(ProtocolLen));//ЭÒ鳤¶È
           pBuffer[2]=LOBYTE(LOWORD(ProtocolLen));
           pBuffer[3]=SProtocol_NewPlayerJoinGuild;//ÐÂЭÒéID
           pBuffer[4]=1;//Ö»ÓÐ1¸öÈË
           pBuffer[5]=HIBYTE(LOWORD(pGuildPlayer->GuildID));
           pBuffer[6]=LOBYTE(LOWORD(pGuildPlayer->GuildID));
           pBuffer[7]=3;
           pBuffer[12]=pProtocol[3];
           pBuffer[13]=pProtocol[4];
           GSSendToClient(PlayerID,pBuffer,ProtocolLen);
           SendPlayerGuildInfoProtocol(wPlayerID,PlayerID,FALSE);
           delete[] pBuffer;
           return;
       }
       catch(...)
       {
           return;
       }

   }
   if(ProtocolID==SProtocol_CreateGuildResponse)
   {
       ProtocolLen=5;
       unsigned char buffer[5]={0};
       memcpy(buffer,pProtocol,4);
       buffer[1]=ProtocolLen;
       pProtocol=buffer;
#ifdef _MGGS_GUILD_EX
       if(pProtocol[3]==CREATEGUILD_SUCCESS)
       {
           tp.Call((LPVOIDLPVOIDFUNC)PlayerCreateGuild,(LPVOID)pPlayer);
       }
#endif
   }
#endif
#ifdef _MGGS_GUILD_EX
   if(ProtocolID==(BYTE)Protocol_Status&&ProtocolLen>7&&pProtocol[3]==STATUS_SELECTPLAYER)
   {
       int nPlayerNum=pProtocol[6];//µÃµ½½ÇÉ«¸öÊý
       LPSELECTPLAYERINFO pSelectPlayer;
       for(int i=0;i<nPlayerNum;i++)
       {
           pSelectPlayer=(LPSELECTPLAYERINFO)&pProtocol[7+sizeof(SELECTPLAYERINFO)*i];
           pSelectPlayer->GuildDuty=GetPlayerGuildDuty((LPCTSTR)pSelectPlayer->Name);
       }
   }
   if(ProtocolID==(BYTE)SProtocol_QuitGuild)
   {
       if(pProtocol[3]==QUITGUILD_GUILDDEL)
       {
           PlayerDelGuild(pPlayer);
       }
       else if (pProtocol[3]==QUITGUILD_QUIT)
       {
           PlayerQuitGuild(pPlayer);
       }
   }
   if(ProtocolID==(BYTE)SProtocol_JoinGuildResponse)
   {
       if(pProtocol[3]==JOINGUILDRESPONSE_CAN)
       {
           tp.Call((LPVOIDLPVOIDFUNC)PlayerJoinGuild,(LPVOID)pPlayer);
       }
   }
#endif

#ifdef _MGGS_PSHOP
   if (pProtocol[0] == PROTOCOL_C4 && ProtocolID == (BYTE)Protocol_Status && pProtocol[4] == STATUS_INVENTORYINFO)//C4 xx xx F3 10
   {
       ExSendInventoryInfo(pPlayer, pProtocol, ProtocolLen);
       return;
   }
#endif

#ifdef _MGGS_NEW_VERSION
   if ( ProtocolID == (BYTE)Protocol_Status && pProtocol[3] == STATUS_CHARINFO)//C1 xx F3 03
   {
       LPCHARINFO pInfo = ( LPCHARINFO ) pProtocol;
       pInfo->Command = 2006; //ÈÃͳ˧±ä³É2006
   }

   if ( ProtocolID == (BYTE)Protocol_Transform ) //а汾µÄ±äÉíЭÒé
   {
       ExTransformSend( pPlayer, pProtocol, ProtocolLen );
       return;
   }
#endif

   GSSendToClient(PlayerID,pProtocol,ProtocolLen);

//Attention:ÒÔÏÂÊÇÔÚGSÒѾ­?¢ËÍÍê±ÏºóµÄ´¦Àí

#ifdef _MGGS_SUIT
   if ( ProtocolID == (BYTE)Protocol_Status && pProtocol[3] == STATUS_CHARINFO)//C1 xx F3 03
   {
       OnCharDataChange(pPlayer->Index); //ÊÖ¶¯Ë¢ÐÂÒ»ÏÂÈËÎïµÄÌ××°ÊôÐÔÖµ,ÀíÂÛÉÏÔÚÕâ֮ǰÌ××°»¹Ã»ÓмÆËã¹ý
   }
#endif

#ifdef _MGGS_PSHOP //ÈËÎï³öÏÖʱ?¢É̵êÐÅÏ¢
   if(pProtocol[0] == PROTOCOL_C2 && (BYTE)SProtocol_PlayerAppear == pProtocol[3])
   {
       BYTE nPlayer = pProtocol[4];
       for(BYTE nIndex = 0; nIndex < nPlayer; nIndex++)
       {
           int nBytesPerPlayer = 40;//ÿ¸ö½ÇÉ«ÐÅÏ¢40×Ö½Ú,Í?¹²Õ¼5×Ö½Ú
           DWORD dwPlayerID = MAKELONG(MAKEWORD(pProtocol[6 + nIndex * nBytesPerPlayer], pProtocol[5 + nIndex * nBytesPerPlayer]), 0);
           if (dwPlayerID < MIN_PLAYERID || dwPlayerID > MAX_PLAYERID) continue;

           SendPlayerShopInfo(pPlayer, dwPlayerID);            
       }
   }

   //Çå³ýн¨½ÇÉ«µÄ¸öÈËÉ̵ê
   if ( ProtocolID == (BYTE)Protocol_Status
       && pProtocol[3] == STATUS_CREATEPLAYER)//C1 xx F3 01
   {
       LPCREATEPLAYERRESULT pResult = ( LPCREATEPLAYERRESULT )pProtocol;
       if ( pResult->Result == CREATEPLAYER_SUCCESS )
       {
           char szPlayerName[ MAX_PLAYERNAMELEN + 1] = { 0 };
           strncpy( szPlayerName, pResult->Name, MAX_PLAYERNAMELEN );
           PShop_Clear( szPlayerName );
       }
   }
#endif
}

//ÐÇÔÆÕÙ»½´¦Àí×Ó³ÌÐò
void NebulaSummon(DWORD PlayerID)
{
   int TeamID;
   LPPLAYERINFO pPlayer=(LPPLAYERINFO)(PlayerID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
   if(pPlayer->NPCType!=NPC_PLAYER&&(int)pPlayer->RecallMobID==-1)return;
   TeamID=pPlayer->TeamID;
   if((int)TeamID==-1) return;
   LPTEAMINFO pTeam=(LPTEAMINFO)(TeamID*sizeof(TEAMINFO)+GS_BaseTeamAddr);
   BYTE x,y,map;
   map=pPlayer->MapNO;
   for(unsigned int i=0;i<pTeam->PlayerNum&&i<TEAM_MAXPLAYER;i++)
   {
       DWORD MovedPlayerID=pTeam->Players;
       if(MovedPlayerID==PlayerID)continue;
       if(MovedPlayerID<MIN_PLAYERID||MovedPlayerID>MAX_PLAYERID)continue;

       LPPLAYERINFO pMovedPlayer=(LPPLAYERINFO)(MovedPlayerID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
       if(pMovedPlayer->NPCType!=NPC_PLAYER)continue;
       if(pMovedPlayer->ConnectStatus<ConnectStat_Playing)continue;
       if(map<=MAP_Icarus&&map!=MAP_DevilSquare&&map!=g_nVIPMap)
       {
           if(pMovedPlayer->MapNO<=MAP_Icarus&&pMovedPlayer->MapNO!=MAP_DevilSquare)
           {
               DWORD CurrTick=GetTickCount();
               if(CurrTick-pMovedPlayer->LastWalkTickCount<RECALLWALKINTERVAL)continue;
               if(GetMapNeedLevel(pMovedPlayer,map)>pMovedPlayer->Level)continue;

               if(map==MAP_Atlans)
               {
                   WORD ItemID=pMovedPlayer->pInventory->Angel.ID;
                   if(ItemID==ITEM_Unicorn||ItemID==ITEM_Dinolant)continue;
               }
               if(map==MAP_Icarus)
               {
                   WORD ItemID=pMovedPlayer->pInventory->LeftRing.ID;
                   if(ItemID==ITEM_TransformationRing)continue;
                   ItemID=pMovedPlayer->pInventory->RightRing.ID;
                   if(ItemID==ITEM_TransformationRing)continue;

                   ItemID=pMovedPlayer->pInventory->Wing.ID;
                   if(!IsWing(ItemID))
                   {
                       ItemID=pMovedPlayer->pInventory->Angel.ID;
                       if(ItemID!=ITEM_Dinolant)continue;
                   }
               }

               pMovedPlayer->MapNO=map;
               x=LOBYTE(pPlayer->x);
               y=LOBYTE(pPlayer->y);
               BYTE offsetx,offsety;
               switch(i)
               {
               case 0:offsetx=-2;offsety=0;break;
               case 1:offsetx=0;offsety=-2;break;
               case 2:offsetx=2;offsety=0;break;
               case 3:offsetx=0;offsety=2;break;
               case 4:offsetx=1;offsety=1;break;
               }
               if(x>2&&x<254)x+=offsetx;
               if(y>2&&y<254)y+=offsety;
               BYTE retCoordAttr=GetMapCoordAttr((DWORD)map,(DWORD)x,(DWORD)y);
               if(COORDINATE_ATTACKABLE!=retCoordAttr)
               {
                   x=LOBYTE(pPlayer->x);
                   y=LOBYTE(pPlayer->y);
               }
               pMovedPlayer->x=x;
               pMovedPlayer->x=y;
               //GSPreMoveProc(pMovedPlayer);
               //GSPlayerMoveProc(pMovedPlayer,0,map,x,y,pMovedPlayer->Dir);
               GSPlayerMoveProc(MovedPlayerID,(DWORD)map,(WORD)x,(WORD)y);
               //GSPlayerMoveProc(MovedPlayerID,flag);
           }
       }
   }
}

//µÝÔöÈËÎï¼ÓÃÜÓô®ºÅ
BOOL IncreaseSerialNo(DWORD PlayerID,BYTE Serial)
{
   LPPLAYERINFO pPlayer=(LPPLAYERINFO)(PlayerID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
   if(pPlayer->NPCType!=NPC_PLAYER)return TRUE;
   SERIALINFO *pSerial=(SERIALINFO*)(PlayerID*sizeof(SERIALINFO)+GS_PlayerSerialAddr);
   if(pSerial->SerialNo++!=Serial)return FALSE;
   return TRUE;
   /*_asm
   {
       mov ecx,pSerial
   }
   GSIncSerialNoProc(Serial);*/
}

//µÃµ½µØͼ×ø±êµãµÄÊôÐÔ
BYTE GetMapCoordAttr(DWORD map,DWORD x,DWORD y)
{
   LPMAPINFO pMapInfo=(LPMAPINFO)(GS_MapInfoAddr+map*sizeof(MAPINFO));
   BYTE retvalue;
   _asm
   {
       mov ecx,pMapInfo
       push y
       push x
       call GSGetCoordAttr
       mov retvalue,al
   }
   return retvalue;
}

//ÖÂÃüÊ¥Ó¡´¦Àí
void IncreaseCriticalDamage(DWORD PlayerID)
{
   int TeamID;
   //BYTE MapFlag[]={0x11,0x11,0x16,0x1b,0x2a,0x11,0x11,0x31,0x39,0x11,0x11};
   LPPLAYERINFO pPlayer=(LPPLAYERINFO)(PlayerID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
   TeamID=pPlayer->TeamID;
   if(TeamID==-1)
   {
       /*BYTE x,y,map;
       x=LOBYTE(pPlayer->x);
       y=LOBYTE(pPlayer->y);
       map=pPlayer->MapNO;
       GetMapCoordAttr(map,x,y);*/

       BYTE status=pPlayer->Status;
       status|=0x80;                                            //18f.bit7
       pPlayer->Status=status;
       DWORD IncreasedDamage=20+pPlayer->Energy/15+pPlayer->Strength/100;        //ÖÇÁ¦/15+Á¦Á¿/100+10
       if(pPlayer->Job==JOB_WIZARD)IncreasedDamage=IncreasedDamage*9/10;
       if(pPlayer->Job==JOB_WARRIOR)IncreasedDamage=IncreasedDamage*11/10;
       pPlayer->DLEnhanceAttack=IncreasedDamage;
       pPlayer->DLEnhanceAttackTime=pPlayer->Energy/12;
       GSResponseAuxSkill(pPlayer,Skill_IncreaseCriticalDamage,PlayerID,1);
       return;
   }
   LPTEAMINFO pTeam=(LPTEAMINFO)(TeamID*sizeof(TEAMINFO)+GS_BaseTeamAddr);
   for(unsigned int i=0;i<pTeam->PlayerNum&&i<TEAM_MAXPLAYER;i++)
   {
       DWORD ToPlayerID=pTeam->Players;
       LPPLAYERINFO pToPlayer=(LPPLAYERINFO)(ToPlayerID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
       if(pPlayer->MapNO==pToPlayer->MapNO)
       {
           if(GSGetPlayerDistance(pToPlayer,pPlayer)<10)
           {
               BYTE status=pToPlayer->Status;
               status|=0x80;
               pToPlayer->Status=status;
               
               DWORD IncreasedDamage=20+pPlayer->Energy/15+pPlayer->Strength/100;        //ÖÇÁ¦/15+Á¦Á¿/100+10
               if(pToPlayer->Job==JOB_WIZARD)IncreasedDamage=IncreasedDamage*9/10;
               if(pToPlayer->Job==JOB_WARRIOR)IncreasedDamage=IncreasedDamage*11/10;

               pToPlayer->DLEnhanceAttack=IncreasedDamage;
               pToPlayer->DLEnhanceAttackTime=pPlayer->Energy/12;
               GSResponseAuxSkill(pPlayer,Skill_IncreaseCriticalDamage,ToPlayerID,1);
           }
       }
   }

}



//»ðÁúÏ®»÷
void __stdcall DoDragonEvent(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
   /*HWND hWnd=::FindWindow(GS_WindowClass,NULL);
   if(NULL!=hWnd)
   {
       SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(GS_IDM_DragonEvent,0),NULL);
   }*/
   _asm
   {
               mov ecx,ds:[GS_DragonEventStructAddr]
               call GSChkDragonEvent
               and eax,0xff
               test eax,eax
               je DragonStart
               mov ecx,ds:[GS_DragonEventStructAddr]
               call GSEndDragonEvent
               jmp DragonProcExit
   DragonStart:
               mov ecx,ds:[GS_DragonEventStructAddr]
               call GSStartDragonEvent
   DragonProcExit:
   }
}
__declspec( naked ) void PreIncreaseSerialNo(BYTE ProtocolID,LPBYTE pProtocol,DWORD ProtocolLen,DWORD PlayerID,DWORD bEncrypt,int EncryptSerial)

{
   _asm
       {
                   push ebp
                   mov ebp,esp
                   cmp dword ptr ss:[ebp+0x1C],0
                   jl No_EncryptSerial
                   mov ecx,dword ptr ss:[ebp+0x14]
                   imul ecx,ecx,0x0D0C
                   xor edx,edx
                   mov dl,byte ptr ds:[ecx+0x4CEE7D4]
                   cmp edx,1
                   jnz No_EncryptSerial
                   mov al,byte ptr ss:[ebp+0x1C]
                   push eax
                   mov ecx,dword ptr ss:[ebp+0x14]
                   lea ecx,dword ptr ds:[ecx*8+0x62D36F0]
                   mov eax,0x00401050
                   call eax
                   test eax,eax
                   jnz No_EncryptSerial
                   mov edx,dword ptr ss:[ebp+0x1C]
                   push edx
                   mov eax,dword ptr ss:[ebp+0x14]
                   lea ecx,dword ptr ds:[eax*8+0x62D36F0]
                   mov eax,0x00401974
                   call eax
                   push eax
                   mov ecx,dword ptr ss:[ebp+8]
                   and ecx,0xFF
                   push ecx
                   mov edx,dword ptr ss:[ebp+0x14]
                   imul edx,edx,0x0D0C
                   add edx,0x04CEE7D7
                   push edx
                   push 0x005096E0
                   call dword ptr ds:[0x4BEAD9C]
                   add esp,0x14
                   mov eax,dword ptr ss:[ebp+0x14]
                   push eax
                   mov eax,0x0040103C
                   call eax
                   add esp,4
No_EncryptSerial:
                   mov esp,ebp
                   pop ebp
                   retn
       }
}

//ÎïÆ?µôÂä´¦Àí
//4.12×¢Òâµ±ºÏ³ÉÎïÆ?ʱҲҪÓõ½Õâ¸ö³ÌÐò,²»¹ýmap=0xff
void DropItemEx(int MonsterID,BYTE map,BYTE x,BYTE y,int ItemID, int ItemLevel,DWORD During,BYTE Skill,BYTE Luck,BYTE Supp,int BelongTo,BYTE ExAttr)
{
   srand( (unsigned)GetTickCount());//³õʼ»¯rand();
   LPMONSTERINFO pMonster=NULL;
   if(MonsterID>=0&&MonsterID<=ID_MONSTER_END)
   pMonster=(LPMONSTERINFO)(MonsterID*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
   
   //2005.8.3¼ÓÈë¶ÔÎïÆ?µôÂäÕßÈç¹û²»ÊǹÖÎïµÄ»°Ôò²»½øÐд¦Àí
   if(MonsterID >= ID_MONSTER_START
       && MonsterID <= ID_MONSTER_END
       && map != 0xff
       && NULL != pMonster
       && ItemID >= ITEM_MinMountedItem
       && ItemID <= ITEM_MaxMountedItem)        //Èç¹ûÎïÆ?²»ÊÇ׿ԽÎïÆ?
   {
       //int nTotalRate;//×Ü»úÂÊ,°üÀ¨×¿Ô½,+10,+11,+12,+13
       
       int *pRateSpace;
       try
       {
           pRateSpace=new int[5+nSpecItemNum];
       }
       catch(...)
       {
           return;
       }
       //int RateSpace[5];//´æ?Åÿ¸öµôÂä»úÂÊÖµ
       pRateSpace[0]=g_dwVIPExItemDropRate;
       pRateSpace[1]=g_dwVIPLvl10ItemDropRate+pRateSpace[0];
       pRateSpace[2]=g_dwVIPLvl11ItemDropRate+pRateSpace[1];
       pRateSpace[3]=g_dwVIPLvl12ItemDropRate+pRateSpace[2];
       pRateSpace[4]=g_dwVIPLvl13ItemDropRate+pRateSpace[3];
       for(int SpaceIndex=5;SpaceIndex<5+nSpecItemNum;SpaceIndex++)
       {
           pRateSpace[SpaceIndex]=pRateSpace[SpaceIndex-1]+SpecItemDropList[SpaceIndex-5].DropRate;
       }
       int nTotalRate=pRateSpace[4+nSpecItemNum];
       if(nTotalRate>ITEMDROPRATE_BASE)nTotalRate=ITEMDROPRATE_BASE;
       if(nTotalRate>0)
       {
           int nRandVal=rand()%ITEMDROPRATE_BASE;
           if(nRandVal<=nTotalRate)
           {
               for(int SpaceIndex=3+nSpecItemNum;SpaceIndex>3;SpaceIndex--)
               {
                   if(nRandVal>pRateSpace[SpaceIndex])
                   {
                       if(pMonster==NULL||SpecItemDropList[SpaceIndex-4].MinLevel<=pMonster->Level)
                       {
                           if(!SpecItemDropList[SpaceIndex-4].bVIPOnly||map==g_nVIPMap)
                           {
                               ItemLevel=SpecItemDropList[SpaceIndex-4].ItemLevel;
                               ItemID=SpecItemDropList[SpaceIndex-4].ItemID;
                               GSDropItemProc(MonsterID,map,x,y,ItemID,ItemLevel,During,Skill,Luck,Supp,BelongTo,ExAttr);
                               return;
                           }
                       }
                   }
               }
               if(map==g_nVIPMap)        //»áÔ±µØͼµÄ´¦Àí
               {
                   if(nRandVal>pRateSpace[3])
                   {
                       ItemLevel=13;
                   }
                   else if(nRandVal>pRateSpace[2])
                   {
                       ItemLevel=12;
                   }
                   else if(nRandVal>pRateSpace[1])
                   {
                       ItemLevel=11;
                   }
                   else if(nRandVal>pRateSpace[0])
                   {
                       ItemLevel=10;
                   }
                   else
                   {
                       int nExNum=0;
                       nRandVal=rand();
                       int nMaxExNum=nRandVal%g_nVIPMaxItemExNum;
                       int nMod=1;
                       for(int i=1;i<=ITEM_MaxExNum;i++)//¼ÆËã׿ԽÊôÐÔ.
                       {
                           nMod<<=1;
                           if(nRandVal%nMod==1)
                           {
                               ExAttr|=(nMod>>1);
                               nExNum++;
                           }
                           if(nExNum>nMaxExNum)break;
                       }
                       if(nExNum==0)        //Èç¹û֮ǰûÓÐÈκÎÊôÐÔÃüÖÐ,Ôò´Ó6ÖÖÊôÐÔÌôÑ¡Ò»ÖÖ.
                       {
                           nMod=1;
                           nMod<<=nRandVal%ITEM_MaxExNum;
                           ExAttr|=nMod;
                       }
                       if(IsSkillWeapon(LOWORD(ItemID)))
                       {
                           Skill=TRUE;
                       };
                   }
               }
           }
       }
       delete[] pRateSpace;

#ifdef _MGGS_SUIT
       for (int nLvl = SUIT_LEVEL_NUM - 1; nLvl >= 0; nLvl --)
       {
           if (pMonster->Level >= g_nSuit_DropLevel[nLvl]) //´óÓÚijÌ××°×îµÍ¹ÖÎïµôÂäµÈ¼¶
           {
               if (rand() % 100 < g_nSuit_DropRate) //Èç¹ûRand³É¹¦
               {
                   int nNum = 0;
                   for (int i = 0; i < SUIT_LEVEL_MAXSUITNUM; i++) //È¡µÃ¸ÃµÈ¼¶ÖÐÓм¸ÖÖÌ××°
                   {
                       if (SuitLevelList[nLvl] > 0)
                       {
                           nNum ++;
                       }
                   }
                   int nIndex = rand() % nNum; //Ëæ»úÈ¡ÆäÖÐÒ»ÖÖÌ××°Index
                   int SuitID = SuitLevelList[nLvl][nIndex];
                   nIndex = rand() % SuitList[SuitID].MaxItemNum; //Ëæ»úÈ¡Ì××°ÖеÄÒ»¼þÎïÆ?Index;

                   ItemID = SuitList[SuitID].ItemIDList[nIndex];
                   nIndex = rand() % 3;    //Ëæ»ú¼ÓÊôÐÔ1-3
                   if (nIndex == 0)
                   {
                       ItemLevel |= 0x00050000;
                   }
                   else if (nIndex == 1)
                   {
                       ItemLevel |= 0x00090000;
                   }
                   else
                   {
                       ItemLevel |= 0x000d0000;
                   }

                   if ( IsSkillWeapon( LOWORD( ItemID ) ) )
                   {
                       Skill = TRUE;
                   }
               }
               break;
           }
           //Èç¹û²»´óÓڸߵȼ¶µÄµôÂäÒªÇó,Ôò¼ÆËãÏÂÒ»µÈ¼¶
       }
#endif
   }
   if(map != 0xff
       && g_bNoDropWhiteItem
       && ItemID >= ITEM_MinMountedItem
       && ItemID <= ITEM_MaxMountedItem
       && ItemLevel < 10)
   {
       if(Skill==0&&Luck==0&&Supp==0&&ExAttr==0)
       {
           return;
       }
   }
   GSDropItemProc(MonsterID,map,x,y,ItemID,ItemLevel,During,Skill,Luck,Supp,BelongTo,ExAttr);
}

//½ðÇ®µôÂä´¦Àí
void DropMoneyEx(LPBYTE pMap,int Zen,DWORD x,DWORD y)
{
   if(g_bNoDropMoney)return;
   if(g_bDropFewMoney&&Zen>7)
   {
       Zen=(Zen-7)/g_dwAddExp+7;
       if(Zen<0)Zen=7;
   }
   _asm
   {
       push y
       push x
       push Zen
       mov ecx,pMap
       call GSDropMoneyProc
   }
}


void SendPlayerGuildInfoProtocol(DWORD PlayerID,DWORD SendToPlayer,BOOL bSendToAround)
{
       
}



void PlayerEnterGame(LPPLAYERINFO pPlayer)
{
   DWORD dwPlayerID=pPlayer->Index;
   DWORD dwTickCount=GetTickCount();
   //ClearPlayerExSuitProp(pPlayer); ÕâÀïÒѾ­ÔÚÈËÎï½øÓÎÏ?Ì××°³õʼ»¯Íê±ÏÁË,ËùÒÔ²»ÄÜÇå
   PlayerExInfo[dwPlayerID-MIN_PLAYERID].dwLastEagleAttackTickCount=dwTickCount;
   PlayerExInfo[dwPlayerID-MIN_PLAYERID].dwLastServerChannelTickCount=0;
   PlayerExInfo[dwPlayerID-MIN_PLAYERID].Duel_Score=0;
   PlayerExInfo[dwPlayerID-MIN_PLAYERID].EagleAttackMode=0;
   PlayerExInfo[dwPlayerID-MIN_PLAYERID].nDuelEnemyID=-1;
   PlayerExInfo[dwPlayerID-MIN_PLAYERID].bDuel=FALSE;


   if(g_bEnableFriendSystem)
   {
       FRIENDSTATUSINFO FriendNameList[MAX_FRIENDNUM]={0};
       int nFriendNum=GetPlayerFriend(pPlayer,(LPFRIENDSTATUSINFO)FriendNameList);
       if(nFriendNum>0)
       {
           try
           {
               int nProtocolLen=7+nFriendNum*11;
               char *pBuffer=new char[nProtocolLen];
               pBuffer[0]=PROTOCOL_C2;
               pBuffer[1]=HIBYTE(LOWORD(nProtocolLen));
               pBuffer[2]=LOBYTE(LOWORD(nProtocolLen));
               pBuffer[3]=SPROTOCOL_FRIENDLIST;
               pBuffer[4]=0;//ÐÂÓʼþΪ0
               pBuffer[5]=0x32;//×î¶à50?âÓʼþ
               pBuffer[6]=LOBYTE(LOWORD(nFriendNum));
               for(int i=0;i<nFriendNum;i++)
               {
                   char *pThisFriend=&pBuffer[7+i*11];
                   strncpy(pThisFriend,FriendNameList.Name,10);
                   if(FriendNameList.bOnline)
                   {
                       pThisFriend[10]=g_nServerCode;
                   }
                   else
                   {
                       pThisFriend[10]=0xff;
                   }
               }
               GSSendToClient(pPlayer->Index,(LPBYTE)pBuffer,nProtocolLen);
               delete[] pBuffer;
           }
           catch(...)
           {
           }
       }
   }
   DisplayPlayerExOption(pPlayer->Index);
   TipFriendStatusChange(pPlayer,FSC_ONLINE);
   if(pPlayer->MapNO==MAP_Castle&&g_CastleAttack.Status==Attacking)
   {
       //if(GetPlayerCastleJoinInfo(pPlayer)!=CJ_Owner)//Èç¹û²»ÊÇÊسÇ?½,Ôò½«Íæ¼ÒÒƶ¯µ½µØͼָ¶¨µØͼָ¶¨ÇøÓò
       //²»ÂÛÊÇ?ñÊسÇ?½,ÖØÐÂÉÏÏ߶¼½«ÆäÒƶ¯µ½¸´»îÇø
       {
               int xl,yl,xh,yh;
               xl=60;
               yl=20;
               xh=130;
               yh=50;
               int x,y;
               x=xl+rand()%(xh-xl);
               y=yl+rand()%(yh-yl);
               if(GetMapCoordAttr(MAP_Castle,x,y)!=COORDINATE_ATTACKABLE)
               {
                   x=100;
                   y=30;
               }
               GSPlayerMoveProc(dwPlayerID,MAP_Castle,(WORD)x,(WORD)y);
       }
   }
   //SendCastleStartProtocol(pPlayer->Index);//ÕâÀï½ÇÉ«»¹Î´³öÏÖÔÚÓÎÏ?Ö®ÖÐÄØ

}

void PlayerLeaveGame(LPPLAYERINFO pPlayer)
{
   CancelDuel(pPlayer->Index);
   TipFriendStatusChange(pPlayer,FSC_OFFLINE);
   SetPlayerExOption(pPlayer->Index);
}

//´Ë×Ó³ÌÐòÖ»´¦ÀíµôѪµÄÏÔʾ
void ProcessDamage(LPPLAYERINFO pBeAttacked,LPPLAYERINFO pAttacker,int Damage,BYTE bSendToClient,BYTE bFirstAttack,BYTE BloodColor)
{
   GS_ProcessDamage(pBeAttacked,pAttacker,Damage,bSendToClient,bFirstAttack,BloodColor);
}

//GSÖÐNPCËÀÍö´¦Àí³ÌÐòµÄÀ©Õ¹
void ProcessNPCDead(LPPLAYERINFO pBeKilled,LPPLAYERINFO pKiller)
{
   GSNPCDead(pBeKilled,pKiller);
}

//ÅжÏË«?½ÊÇ?ñÕýÔÚ¾ö¶?»òÕßÃËÕ½»òÕß¹¥»÷ÕßÕýÔÚ¹¥³ÇÕ½ÖÐ
BOOL IsGuildWarOrDuel(LPPLAYERINFO pBeAttacked,LPPLAYERINFO pAttacker)
{
   return GS_IsBeingGuildWar(pBeAttacked,pAttacker);
}

//ÊÇ?ñ´¦ÓÚÕýµ±?ÀÎÀ״̬
BOOL IsSelfDefense(LPPLAYERINFO pPlayer)
{
   int nSelfDefenseNum=sizeof(pPlayer->SelfDefenseIDList)/sizeof(pPlayer->SelfDefenseIDList[0]);
   for(int i=0;i<nSelfDefenseNum;i++)
   {
       int nSelfDefenseID=pPlayer->SelfDefenseIDList;
       if(nSelfDefenseID>=MIN_PLAYERID&&nSelfDefenseID<=MAX_PLAYERID)
       {
           return TRUE;
       }
   }
   return FALSE;
}

//À©Õ¹É˺¦´¦Àí,GSÖмÆËãÍê×îÖÕÉ˺¦ºóÌøתµ½´Ë
int ExCalcDamage(LPPLAYERINFO pAttacker,LPPLAYERINFO pBeAttacked,int nDamage, PBYTE pBloodColor)
//×¢:BloodColor Bit7:XY Bit6:׿Խ Bit5:Miss Bit4:ÎÞÊÓ Bit3:?´ÉË
{
   DWORD dwAttackerID,dwBeAttackedID;
   dwAttackerID=pAttacker->Index;
   dwBeAttackedID=pBeAttacked->Index;

#ifdef _MGGS_SUIT
   if (pAttacker->NPCType == NPC_PLAYER)
   {
       DWORD dwExPlayerID = dwAttackerID - MIN_PLAYERID;
       if (*pBloodColor & 0x80)
       {
           nDamage += PlayerExInfo[dwExPlayerID].LuckAttack_Plus;//XYÉ˺¦Ôö¼Ó
       }
       else if (*pBloodColor & 0x40)
       {
           nDamage += PlayerExInfo[dwExPlayerID].ExcellentAttack_Plus;//׿ԽÉ˺¦Ôö¼Ó
       }

       if (pAttacker->Job == JOB_WIZARD || pAttacker->Job == JOB_MG)        //ħ?¨¹¥»÷Á¦Ôö¼Ó(½öÏÞħ?¨Ê¦ºÍħ½£Ê¿)
       {
           if (pAttacker->pInventory->LeftHand.ID >> 5 == 5) //Èç¹û×óÊÖ×°±¸µÄÕȵĻ°²ÅÔö¼Óħ?¨¹¥»÷Á¦
           {
               nDamage += nDamage * PlayerExInfo[dwExPlayerID].MagicDamagePer_Plus / 100;
           }
       }
       if (pAttacker->Job != JOB_WIZARD)//¼¼Äܹ¥»÷Á¦Ôö¼Ó
       {
           if (pAttacker->Job != JOB_MG || pAttacker->pInventory->LeftHand.ID >> 5 != 5) //Èç¹û×óÊÖ×°±¸µÄÕȵĻ°Ôò²»Ôö¼Ó¼¼Äܹ¥»÷Á¦
           {
               nDamage += PlayerExInfo[dwExPlayerID].SkillAttack_Plus;
           }
       }
       if ( (*pBloodColor & 0xF8) == 0) //ÆÕͨÉ˺¦Ê±ÔòÅжÏÖÂÃüÉ˺¦/ÎÞÊÓ
       {
           srand( (unsigned)GetTickCount());//³õʼ»¯rand();
           DWORD dwRandPer = rand() % 100;
           
           if (dwRandPer <= PlayerExInfo[dwExPlayerID].CriticalDamageRate_Plus) //ÖÂÃüÉ˺¦
           {
               nDamage *= 2;
               //ÖÂÃüÉ˺¦µÄÑÕɫʹÓÃ×Ô¶¨ÒåÒ»¸öÖж¾µÄÑÕÉ«(ÔÚGSÖÐ×îºó´¦Àíת»»Îª5)
               *pBloodColor |= 0x08;
           }
           else if (dwRandPer > PlayerExInfo[dwExPlayerID].CriticalDamageRate_Plus
               && dwRandPer <= PlayerExInfo[dwExPlayerID].CriticalDamageRate_Plus + PlayerExInfo[dwExPlayerID].IgnoreDefenceRate_Plus) //ÎÞÊÓ»úÂÊ
           {
               nDamage += pBeAttacked->Defence; //ÒÔÉ˺¦Öµ¼ÓÉÏ?ÀÓùÁ¦±íʾÎÞÊÓ
               *pBloodColor |= 0x10;
           }
       }

   }
#endif

   if(g_bEnableDuel)
   {
       if(pAttacker->NPCType==NPC_PLAYER&&pBeAttacked->NPCType==NPC_PLAYER)
       {
           if(PlayerExInfo[dwBeAttackedID-MIN_PLAYERID].bDuel)
           {
               if(PlayerExInfo[dwBeAttackedID-MIN_PLAYERID].nDuelEnemyID==dwAttackerID)
               {
                   nDamage = nDamage * g_nDuelDamagePer / 100; //¾ö¶?ʱÉ˺¦°Ù?Ö±È
               }
               else
               {
                   nDamage = 0;//Èç¹û?Ǿö¶?Ë«?½,ÔòÉ˺¦ÖµÎª0
               }

               if ( g_nDuelMaxDamage > 0 && nDamage > g_nDuelMaxDamage )
               {
                   nDamage = g_nDuelMaxDamage; //ÏÞ¶¨×î´óµôѪֵ
               }
           }
       }
   }
   return nDamage;
}


void __stdcall ReloadExConfig(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
   g_dwRequestTradeInterval=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_REQUESTTRADEINTERVAL,GS_INI_DEFAULTREQUESTTRADEINTERVAL,GS_INI_FILENAME);
   g_dwRequestTradeInterval*=1000;

   g_dwTradeNoNPCDistance=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_TRADENONPCDISTANCE,GS_INI_DEFAULTTRADENONPCDISTANCE,GS_INI_FILENAME);
   if(g_dwTradeNoNPCDistance>255)g_dwTradeNoNPCDistance=255;

   g_dwDragonEventInterval=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_DRAGONEVENTINTERVAL,GS_INI_DEFAULTDRAGONEVENTINTERVAL,GS_INI_FILENAME);
   if(g_dwDragonEventInterval!=0&&g_dwDragonEventInterval<5)g_dwDragonEventInterval=5;
   g_dwDragonEventInterval*=60000;
   if(0!=g_dwDragonEventInterval)
   {
       if(0!=nDragonTimerID)
       {
           KillTimer(NULL,nDragonTimerID);
       }
       nDragonTimerID=SetTimer(NULL,NULL,g_dwDragonEventInterval,DoDragonEvent);
   }

   DWORD dwTemp;
   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_NODROPWHITEITEM,GS_INI_DEFAULTNODROPWHITEITEM,GS_INI_FILENAME);
   g_bNoDropWhiteItem=(dwTemp!=0);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_NODROPMONEY,GS_INI_DEFAULTNODROPMONEY,GS_INI_FILENAME);
   g_bNoDropMoney=(dwTemp!=0);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_DROPFEWMONEY,GS_INI_DEFAULTDROPFEWMONEY,GS_INI_FILENAME);
   g_bDropFewMoney=(dwTemp!=0);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAP,GS_INI_DEFAULTVIPMAP,GS_INI_FILENAME);
   g_nVIPMap=LOBYTE(LOWORD((dwTemp)));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAP_ENTERX,GS_INI_DEFAULTVIPMAPENTERX,GS_INI_FILENAME);
   g_nVIPMap_EnterX=LOBYTE(LOWORD((dwTemp)));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAP_ENTERY,GS_INI_DEFAULTVIPMAPENTERY,GS_INI_FILENAME);
   g_nVIPMap_EnterY=LOBYTE(LOWORD((dwTemp)));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAP_EVERYONE,GS_INI_DEFAULTVIPMAPEVERYONE,GS_INI_FILENAME);
   g_bEveryoneEnterVIPMap=(dwTemp!=0);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPDROPITEMMAXEXATTRNUM,GS_INI_DEFAULTVIPMAPDROPITEMMAXEXATTRNUM,GS_INI_FILENAME);
   g_nVIPMaxItemExNum=LOBYTE(LOWORD((dwTemp)));
   if(g_nVIPMaxItemExNum>ITEM_MaxExNum)g_nVIPMaxItemExNum=ITEM_MaxExNum;

   g_dwVIPExItemDropRate=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPEXITEMDROPRATE,GS_INI_DEFAULTVIPMAPEXITEMDROPRATE,GS_INI_FILENAME);

   g_dwVIPLvl10ItemDropRate=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPLVL10ITEMDROPRATE,GS_INI_DEFAULTVIPMAPLVL10ITEMDROPRATE,GS_INI_FILENAME);
   g_dwVIPLvl11ItemDropRate=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPLVL11ITEMDROPRATE,GS_INI_DEFAULTVIPMAPLVL11ITEMDROPRATE,GS_INI_FILENAME);
   g_dwVIPLvl12ItemDropRate=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPLVL12ITEMDROPRATE,GS_INI_DEFAULTVIPMAPLVL12ITEMDROPRATE,GS_INI_FILENAME);

   g_dwVIPLvl13ItemDropRate=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_VIPMAPLVL13ITEMDROPRATE,GS_INI_DEFAULTVIPMAPLVL13ITEMDROPRATE,GS_INI_FILENAME);
   g_dwAddExp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_ADDEXP,GS_INI_DEFAULTADDEXP,GS_INI_FILENAME);

   if(g_dwAddExp==0)g_dwAddExp=1;

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_ISFAKEMONSTER,GS_INI_DEFAULTISFAKEMONSTER,GS_INI_FILENAME);
   g_bFakeMonster=(dwTemp!=0);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_FAKEMONSTER_MAP,GS_INI_DEFAULTFAKEMONSTERMAP,GS_INI_FILENAME);
   g_nFakeMonster_Map=LOBYTE(LOWORD((dwTemp)));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_CONFIGRELOADINTERVAL,GS_INI_DEFAULTCONFIGRELOADINTERVAL,GS_INI_FILENAME);
   g_dwConfigReloadInterval=dwTemp*60000;//ת»»Îªms
   if(0!=g_dwConfigReloadInterval)
   {
       if(nReloadConfigTimerID!=0)
       {
           KillTimer(NULL,nReloadConfigTimerID);
       }
       nReloadConfigTimerID=SetTimer(NULL,NULL,g_dwConfigReloadInterval,ReloadExConfig);
   }

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_SERVERINFO_KEYNAME_SERVERCODE,GS_SERVERINFO_DEFAULTSERVERCODE,GS_SERVERINFO_FILENAME);
   g_nServerCode=LOBYTE(LOWORD(dwTemp));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_ENABLEFRIENDSYSTEM,GS_INI_DEFAULT_ENABLEFRIENDSYSTEM,GS_INI_FILENAME);
   g_bEnableFriendSystem=LOBYTE(LOWORD(dwTemp));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME,GS_INI_KEYNAME_ENABLEDUEL,GS_INI_DEFAULT_ENABLEDUEL,GS_INI_FILENAME);
   g_bEnableDuel=LOBYTE(LOWORD(dwTemp));

   TCHAR szLog[MAX_LOGSTRING];
   nMemberNum=ReadMember();
   sprintf(szLog,"¹²¼ÓÔØ%d¸ö»áÔ±ÐÅÏ¢.",nMemberNum);
   WriteLogFile(szLog);

#ifdef _MGGS_VER0508
   InitChat();
#endif


//²»ÖØгõʼ»¯¹¥³Ç
/*
#ifdef _MGGS_CASTLEATTACK
   InitCastleAttack();
#endif
*/
   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME, GS_INI_KEYNAME_ENABLEEAGLEATTACK,GS_INI_DEFAULT_ENABLEEAGLEATTACK,GS_INI_FILENAME);
   g_bEnableEagleAttack=LOBYTE(LOWORD(dwTemp));

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME, GS_INI_KEYNAME_MINEAGLEDAMAGEMUL,GS_INI_DEFAULTMINEAGLEDAMAGEMUL,GS_INI_FILENAME);
   wMinEagleDamageMul=LOWORD(dwTemp);

   dwTemp=GetPrivateProfileInt(GS_INI_SECTIONNAME, GS_INI_KEYNAME_MAXEAGLEDAMAGEMUL,GS_INI_DEFAULTMAXEAGLEDAMAGEMUL,GS_INI_FILENAME);
   wMaxEagleDamageMul=LOWORD(dwTemp);



}

void SendToServer(LPBYTE pProt,DWORD ProtocolLen)
{
   for(int i=MIN_PLAYERID;i<=MAX_PLAYERID;i++)
   {
       LPPLAYERINFO pSendToPlayer=(LPPLAYERINFO)(i*sizeof(PLAYERINFO)+GS_BasePlayerAddr);
       if(pSendToPlayer->ConnectStatus>=ConnectStat_Playing)
       {
               GSSendToClient(i,pProt,ProtocolLen);
       }
   }
}

//---------------------------------------------------------------------------------------------------------------
//ÕâÀïÏ൱ÓÚÖØÔØGSSaveCharDataº¯Êý.
void SaveCharData(LPPLAYERINFO pPlayer, DWORD dwPlayerID)
{
#ifdef _MGGS_PSHOP
   SavePlayerPShop(pPlayer);
#endif
#ifdef _MGGS_SUIT
   DWORD dwExPlayerID = pPlayer->Index - MIN_PLAYERID;
   SubExSuitProp(pPlayer);
   ClearPlayerExSuitProp(pPlayer);//ÇåÀíµô¸ÃIndexµÄÀ©Õ¹ÊôÐÔÒÔ?½±ãºóÃæµÄʹÓÃ
   PlayerExInfo[dwExPlayerID].bNotFirstFlag = FALSE;//Í˳öÓÎÏ?ÐèÇå´ËÖµ
   PlayerExInfo[dwExPlayerID].Protocol_PlayerSuit = 0;
#endif
   GSSaveCharData(pPlayer, dwPlayerID);
}

//---------------------------------------------------------------------------
//ÕâÀï¿ÉÒÔÌáÇ°°ÑÌ××°µÄ¼Ó³É¼ÆËãºÃ,Ì××°¶Ô?ǼÆËãÊôÐÔÖµ(ÀýÈçÁ¦Á¿/ÖÇÁ¦/ÌåÁ¦µÈ)ÔÚGS´¦ÀíÇ°´¦Àí,¶ÔÓÚÐèÒª¼ÆËãµÃ³öµÄÊôÐÔÖµ(±ÈÈç?ÀÓùÁ¦/ÂÊ),ÔòÔÚGS´¦ÀíºóÔÙ´¦Àí
void OnCharDataChange(DWORD dwPlayerID)
{
   LPPLAYERINFO pPlayer = (LPPLAYERINFO)(dwPlayerID * sizeof(PLAYERINFO) + GS_BasePlayerAddr);
#ifdef _MGGS_SUIT
   DWORD dwExPlayerID = dwPlayerID - MIN_PLAYERID;
   if (PlayerExInfo[dwExPlayerID].bNotFirstFlag)    //ÈËÎï¸Õ½øÈëÓÎÏ?ʱ?¢ËÍÒ»´ó¶ÑÈËÎïÊý¾ÝʱÏȲ»¼ÆËã,ÉÔºóÔÚ?¢Ë͸ÃЭÒéºóÊÖ¶¯Ë¢ÐÂÒ»ÏÂ,ÒÔÃâ¿Í»§¶ËÏÔʾ³öË«±¶µÄÌ××°ÊôÐÔÖµÀ´
   {
       BeforeCharDataChange(pPlayer);
   }
#endif
   GSOnCharDataChange(dwPlayerID);
#ifdef _MGGS_SUIT
   if (PlayerExInfo[dwExPlayerID].bNotFirstFlag)
   {
       AfterCharDataChange(pPlayer);
   }
   PlayerExInfo[dwExPlayerID].bNotFirstFlag = TRUE;
#endif
}

#ifdef _MGGS_SHAREVER
void OpenForumThread()
{
   ShellExecute( NULL, "open", "http://www.freemg.net", NULL, NULL, SW_SHOW );
}
__inline void OpenForum()
{
   CreateThread(NULL, 0, ( LPTHREAD_START_ROUTINE )OpenForumThread, NULL, 0, NULL);
}
#endif
凡事要向好的那方去看,但要有最壞的打算.
离线oragon18
发帖
187
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 板凳  发表于: 2006-03-16
#define MAX_PATH    260
#define MAX_FILENAME    64

#define GS_INI_FILENAME "..\\data\\commonserver.cfg"
#define GS_INI_SECTIONNAME "GameServerInfo"

#define GS_SERVERINFO_FILENAME "..\\data\\ServerInfo.dat"

#define GS_SERVERINFO_KEYNAME_SERVERCODE "ServerCode"
#define GS_SERVERINFO_DEFAULTSERVERCODE 0 //?þÎñÆ÷±àºÅ

#define GS_INI_KEYNAME_REQUESTTRADEINTERVAL "RequestTradeInterval"
#define GS_INI_DEFAULTREQUESTTRADEINTERVAL 0x0a        //ĬÈÏÁ½´ÎÇëÇó½»Ò×ʱ¼ä¼ä¸ô(s)

#define GS_INI_KEYNAME_TRADENONPCDISTANCE "TradeNoNPCDistance"
#define GS_INI_DEFAULTTRADENONPCDISTANCE 0x0        //½»Ò×ʱ¾àÀëNPCµÄ×î¶Ì¾àÀë,Ϊ0±íʾ²»ÏÞ

#define GS_INI_KEYNAME_DRAGONEVENTINTERVAL "DragonEventInterval"
#define GS_INI_DEFAULTDRAGONEVENTINTERVAL 120        //»ðÁúÍõÏ®»÷¼ä¸ô

//²»µôÀ¬»ø×°±¸,Ö»µô׿ԽºÍ±¦Ê¯ by ÀÏţţ
//ÌØÊâÎïÆ?¼°µôÂäÂÊÓÉרÓÃÎļþÉ趨
#define GS_INI_KEYNAME_NODROPWHITEITEM "NoDropWhiteItem"
#define GS_INI_DEFAULTNODROPWHITEITEM 0x0        //²»µô°×ɫװ±¸

#define GS_INI_KEYNAME_NODROPMONEY "NoDropMoney"
#define GS_INI_DEFAULTNODROPMONEY 0x0        //²»µôÇ®

#define GS_INI_KEYNAME_DROPFEWMONEY "DropFewMoney"
#define GS_INI_DEFAULTDROPFEWMONEY 0x0        //µôÇ®²»ÊÜAddExpirenceÓ°Ïì


//»áÔ±µØͼ,by flykiss
#define GS_INI_KEYNAME_VIPMAP "VIP_Map"
#define GS_INI_DEFAULTVIPMAP 0x1F        //ĬÈÏ31ºÅµØͼΪ»áÔ±µØͼ

#define GS_INI_KEYNAME_VIPMAP_ENTERX "VIP_Map_EnterX"
#define GS_INI_DEFAULTVIPMAPENTERX 62        //ĬÈÏ31ºÅµØͼΪ»áÔ±µØͼ,Èë¿Úx×ø±êΪ70

#define GS_INI_KEYNAME_VIPMAP_ENTERY "VIP_Map_EnterY"
#define GS_INI_DEFAULTVIPMAPENTERY 11        //ĬÈÏ31ºÅµØͼΪ»áÔ±µØͼ,Èë¿Úx×ø±êΪ70

#define GS_INI_KEYNAME_VIPMAP_EVERYONE "VIP_Map_Everyone"
#define GS_INI_DEFAULTVIPMAPEVERYONE 0x0        //ĬÈÏ31ºÅµØͼΪ»áÔ±µØͼ


#define GS_INI_KEYNAME_VIPMAPDROPITEMMAXEXATTRNUM "VIPMap_ItemMaxExAttrNum"
#define GS_INI_DEFAULTVIPMAPDROPITEMMAXEXATTRNUM 0x4        //»áÔ±µØͼµôÂäÎïÆ?׿Խ×î¶àÊôÐÔ.

#define ITEMDROPRATE_BASE 10000 //ÎïÆ?µôÂäÂʱ»³ýÊý

#define GS_INI_KEYNAME_VIPMAPEXITEMDROPRATE "VIPMap_ExItemDropRate"
#define GS_INI_DEFAULTVIPMAPEXITEMDROPRATE 0x0a        //»áÔ±µØͼµôÂä׿ԽÎïÆ?»úÂÊ,ÉèÖÃÖµ*µôÂäÎïÆ?ÂÊ/10000

#define GS_INI_KEYNAME_VIPMAPLVL10ITEMDROPRATE "VIPMap_Lvl10ItemDropRate"
#define GS_INI_DEFAULTVIPMAPLVL10ITEMDROPRATE 0x20        //»áÔ±µØͼµôÂä+10ÎïÆ?»úÂÊ,ÉèÖÃÖµ*µôÂäÎïÆ?ÂÊ/10000

#define GS_INI_KEYNAME_VIPMAPLVL11ITEMDROPRATE "VIPMap_Lvl11ItemDropRate"
#define GS_INI_DEFAULTVIPMAPLVL11ITEMDROPRATE 0x10        //»áÔ±µØͼµôÂä+11ÎïÆ?»úÂÊ,ÉèÖÃÖµ*µôÂäÎïÆ?ÂÊ/10000

#define GS_INI_KEYNAME_VIPMAPLVL12ITEMDROPRATE "VIPMap_Lvl12ItemDropRate"
#define GS_INI_DEFAULTVIPMAPLVL12ITEMDROPRATE 0x08        //»áÔ±µØͼµôÂä+12ÎïÆ?»úÂÊ,ÉèÖÃÖµ*µôÂäÎïÆ?ÂÊ/10000

#define GS_INI_KEYNAME_VIPMAPLVL13ITEMDROPRATE "VIPMap_Lvl13ItemDropRate"
#define GS_INI_DEFAULTVIPMAPLVL13ITEMDROPRATE 0x04        //»áÔ±µØͼµôÂä+13ÎïÆ?»úÂÊ,ÉèÖÃÖµ*µôÂäÎïÆ?ÂÊ/10000

#define GS_INI_KEYNAME_ADDEXP "AddExperience"
#define GS_INI_DEFAULTADDEXP 0x1        //¾­Ñ鱶Êý

#define GS_INI_KEYNAME_ISFAKEMONSTER "IsFakeMonster"    //ÊÇ?ñÔÚÌض¨µØͼÈùÖÎï²»ÏÔʾÕæÉí
#define GS_INI_DEFAULTISFAKEMONSTER 0x1    //ĬÈÏΪÊÇ

#define GS_INI_KEYNAME_FAKEMONSTER_MAP "FakeMonster_Map"    //¹ÖÎï²»ÏÔʾÕæÉíµØͼ
#define GS_INI_DEFAULTFAKEMONSTERMAP 0x1F    //ĬÈÏΪ31ºÅµØͼ

#define GS_INI_KEYNAME_CONFIGRELOADINTERVAL "Config_Reload_Interval"    //ÅäÖÃÐÅÏ¢ÖØÐÂ×°ÔØʱ¼ä¼ä¸ô,µ¥Î»Îª?ÖÖÓ
#define GS_INI_DEFAULTCONFIGRELOADINTERVAL 60    //ĬÈÏΪ1Сʱ

#define GS_INI_KEYNAME_MOVETOVIPCMD "MoveToVipMapCmd" //Òƶ¯µ½»áÔ±µØͼÃüÁî,²»Äܳ¬¹ý64×Ö½Ú
#define GS_INI_DEFAULTMOVETOVIPCMD "/»áÔ±µØͼ"    //ĬÈÏΪ"/»áÔ±µØͼ"

#define TIP_FORBIDTRADE "¡¼ÏµÍ³Ìáʾ¡½½ûÖ¹½»Ò×"
#define TIP_NPC_DISTANCE "¡¼ÏµÍ³Ìáʾ¡½½»Ò×ʱÇëÓëNPC±£³Ö¾àÀë"
#define TIP_NOTMEMBER "¡¼ÏµÍ³Ìáʾ¡½?Ç»áÔ±²»ÄܽøÈë´ËµØͼ"

#define TIP_REQUESTDUEL "¡¼ÏµÍ³Ìáʾ¡½Ïò%s?¢³ö¾ö¶?ÑûÇë."

#define TIP_FORBIDDUEL_FIEND "¡¼ÏµÍ³Ìáʾ¡½Ä§Í?²»Äܾö¶?!"
#define TIP_FORBIDDUEL_MAP "¡¼ÏµÍ³Ìáʾ¡½µ±Ç°µØͼ½ûÖ¹¾ö¶?!"

#define TIP_FORBIDDUEL_SELFDEFENSE "¡¼ÏµÍ³Ìáʾ¡½Õýµ±?ÀÎÀ״̬ϽûÖ¹¾ö¶?!"
#define TIP_FORBIDDUEL_VS_FIEND "¡¼ÏµÍ³Ìáʾ¡½¶Ô?½ÊÇħÍ?,²»Äܾö¶?!"
#define TIP_FORBIDDUEL_VS_SELFDEFENSE "¡¼ÏµÍ³Ìáʾ¡½¶Ô?½´¦ÔÚÕýµ±?ÀÎÀ״̬ÏÂ,²»Äܾö¶?!"
#define TIP_FORBIDDUEL_BEINGDUEL "¡¼ÏµÍ³Ìáʾ¡½ÄúÒѾ­ÔÚ¾ö¶?ÖÐ."
#define TIP_FORBIDDUEL_VS_BEINGDUEL "¡¼ÏµÍ³Ìáʾ¡½¶Ô?½ÕýÔÚÓëÆäËûÈ˾ö¶?,²»ÄÜ?¢³öÑûÇë."
#define TIP_FORBIDDUEL_ATTACKINGCASTLE "¡¼ÏµÍ³Ìáʾ¡½¹¥³ÇÕ½½øÐÐÖнûÖ¹ÔÚ¹¥³ÇµØͼ¾ö¶?!"

#define GS_INI_KEYNAME_DUELDAMAGEPER "Duel_DamagePer" //¾ö¶?ʱµÄÉ˺¦°Ù?Ö±È
#define GS_INI_DEFAULTDUELDAMAGEPER 60    //ĬÈÏΪ60%

#define GS_INI_KEYNAME_DUELMAXDAMAGE "Duel_MaxDamage" //¾ö¶?ʱµÄ×î´óµôѪֵ
#define GS_INI_DEFAULTDUELMAXDAMAGE 0    //ĬÈÏΪ0,±íʾ²»ÏÞÖÆ

//¶¨Òå?ÇGS¼¶±ðÊý¾Ý¿âÏà¹Ø¶¨Òå
#define MAX_SQLSERVERNAME 128
#define MAX_SQLDBNAME 64
#define MAX_SQLUSERID 256
#define MAX_SQLPWD 256
#define MAX_MEMBERCMDLEN 64

#define DEFAULT_SQL_SERVERNAME _T("(local)")
#define DEFAULT_SQL_DBNAME _T("MuOnline")
#define DEFAULT_SQL_USERID _T("")
#define DEFAULT_SQL_PWD _T("")

#define INI_FILENAME _T("config.ini")
#define INI_SECTIONNAME_ODBC _T("ODBC")

#define INI_KEYNAME_SERVERNAME _T("ServerName")
#define INI_KEYNAME_DBNAME _T("DatabaseName")
#define INI_KEYNAME_USERID _T("UserID")
#define INI_KEYNAME_PWD _T("UserPassword")

#define STRING_SQLCONNECT_FAIL _T("Á¬½Óµ½Êý¾Ý¿âʱ?¢Éú´íÎó,Çë¼ì²éÉèÖÃÎļþ!")
#define STRING_SQLCONNECT_SUCCESS _T("³É¹¦Á¬½Óµ½Êý¾Ý¿â!")
凡事要向好的那方去看,但要有最壞的打算.
离线xianwen
发帖
1203
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 地板  发表于: 2006-03-16
离线youilove
发帖
114
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 4楼 发表于: 2006-03-16
牛!!!但是看不懂,后面注释的怎么都乱码了哦
离线sf菜鸟
发帖
985
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 5楼 发表于: 2006-03-16

FreeMGCzF


做中国最后一个免费帮人架设奇迹SF的人
离线knight1990
发帖
818
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 6楼 发表于: 2006-03-16
靠,用C写的呀,这么长,晕4了
离线chy888
发帖
1127
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 7楼 发表于: 2006-03-16
...............

离线174001602
发帖
468
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 8楼 发表于: 2006-03-16
收下了
bbs 338c.com
blog 338c.com/blog
离线6228767
发帖
337
祝福宝石
0
威望
2136
玛雅之石
0
创造宝石
0
只看该作者 9楼 发表于: 2006-03-16
我要成为高手!!!!

………………吼吼…………………………!!!!
离线auldey
发帖
1022
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 10楼 发表于: 2006-03-16
MuChina
离线龙狸+
发帖
35
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 11楼 发表于: 2006-03-16
ftp://[email protected]/myexgs.zip下这个吧!!!!!!!!!!!!!!!
http://mucool.104.tofor.com
离线alansos
发帖
202
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 12楼 发表于: 2006-03-16
呵呵 龙狸
      原以为我隐身别人就找不到了,没有用的!象我这样拉风的男人,无论在什么地方,都像漆黑中的萤火虫一样,那样的鲜明,那样的出众.我那忧郁的眼神,稀嘘的胡喳子,神乎奇迹的刀法,还有那杯Dry Martine,都深深地出卖了我.....


            众人的偶像 ALAN
离线6622354
发帖
420
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 13楼 发表于: 2006-03-16
jhgjhgjhgjhgjhgjhgj
离线alansos
发帖
202
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 14楼 发表于: 2006-03-17
赚钱真难了 哎~~
      原以为我隐身别人就找不到了,没有用的!象我这样拉风的男人,无论在什么地方,都像漆黑中的萤火虫一样,那样的鲜明,那样的出众.我那忧郁的眼神,稀嘘的胡喳子,神乎奇迹的刀法,还有那杯Dry Martine,都深深地出卖了我.....


            众人的偶像 ALAN
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个

      管理员联系信箱 [email protected] 所有内容均来之互联网,如侵犯您的隐私和权益,请和我们及时联系!