// 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);
}