加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
GameMir.cpp 46.72 KB
一键复制 编辑 原始数据 按行查看 历史
Shaker 提交于 2014-08-12 21:17 . *提交到Git@OSC
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995
// GameMir.cpp : 实现文件
//
#include "stdafx.h"
#include "TurboMir.h"
#include "talktonpcdlg.h"
#include "gamemir.h"
// 转换字符串为UNICODE
LPCWSTR ToUnicode(LPCSTR lpMultiByteStr, LPWSTR lpWideCharStr, int cchWideChar)
{
int retval=MultiByteToWideChar(CP_ACP, 0, lpMultiByteStr, -1, lpWideCharStr, cchWideChar );
lpWideCharStr[retval]=static_cast<WCHAR>(0);
return lpWideCharStr;
}
LPCSTR ToAnsi(LPCWSTR lpWideCharStr, LPSTR lpMultiByteStr, int cchMultiByteChar)
{
int retval=WideCharToMultiByte(CP_ACP, 0, lpWideCharStr, -1, lpMultiByteStr, cchMultiByteChar, NULL, NULL );
lpMultiByteStr[retval]=static_cast<CHAR>(0);
return lpMultiByteStr;
}
#define CLASS_GAME CGameMir
IMPLEMENT_DYNAMIC(CGameMir,CNet);
// CGameMir
std::string ParseName(std::string txt)
{
size_t iFind=txt.find('/');
if(iFind!=std::string::npos)
{
txt=txt.substr(0,iFind);
}
iFind=txt.find('\\');
if(iFind!=std::string::npos)
{
txt=txt.substr(0,iFind);
}
return txt;
}
int DecodeName(const char * in, char * out)
{
int i = 0;
while( in[i] != '\0' )
{
out[i] = (in[i] & 0x3f ) << 2;
out[i] |= (in[i + 1] & 0xc0 ) >> 6;
i ++;
}
out[i] = '\0';
return 1;
}
void CGameMir::InitData(void)
{
m_AreaStateValue=0;
m_NeededAttackMode=0;
m_EatingItem=0;
m_HpProtectTime=0;
m_CharName.clear();
sig_UpdateSelfInfo();
sig_UpdateUseItem();
sig_ClearBag();
sig_ClearActors();
ZeroMemory(&m_UseItems,sizeof(m_UseItems));
POINT pos;
pos.x=m_Self.xx;
pos.y=m_Self.yy;
sig_PositionChange(pos);
m_BagItems.clear();
m_DropedItems.clear();
m_Magics.clear();
m_ActorList.clear();
}
CGameMir::CGameMir(CMainFrame& wnd)
: m_Map((GetMainDir()+"\\data\\map.dat").c_str())
, m_Action(*this)
, m_AutoFight(NULL)
, m_AreaStateValue(0)
, m_NeededAttackMode(0)
, m_EatingItem(0)
, m_HpProtectTime(0)
, m_CharName("")
, m_SettingMgr(*this)
{
CGameMir& game=*this;
m_LuaMachine->GetGlobals().RegisterDirect("Sleep", game, &CGameMir::l_Sleep);
m_LuaMachine->GetGlobals().RegisterDirect("Print", game, &CGameMir::l_Print);
m_LuaMachine->GetGlobals().RegisterDirect("GetItemCount", game, &CGameMir::l_GetItemCount);
m_LuaMachine->GetGlobals().RegisterDirect("GetMapName", game, &CGameMir::l_GetMapName);
m_LuaMachine->GetGlobals().RegisterDirect("Disconnect", game, &CGameMir::l_Disconnect);
m_LuaMachine->GetGlobals().RegisterDirect("MapMove", game, &CGameMir::l_MapMove);
m_LuaMachine->GetGlobals().RegisterDirect("StartFight", game, &CGameMir::l_StartFight);
m_LuaMachine->GetGlobals().RegisterDirect("UseItem", game, &CGameMir::l_UseItem);
m_LuaMachine->GetGlobals().RegisterDirect("TalkNpc", game, &CGameMir::l_TalkNpc);
m_LuaMachine->GetGlobals().RegisterDirect("Say", game, &CGameMir::l_Say);
m_LuaMachine->GetGlobals().RegisterDirect("DialogSelect", game, &CGameMir::l_DialogSelect);
m_LuaMachine->GetGlobals().RegisterDirect("Buy", game, &CGameMir::l_Buy);
InitializeCriticalSection(&m_LuaCS);
sig_HpChange.connect(boost::bind(&CGameMir::OnHpChange,boost::ref(*this),_1,_2));
sig_MpChange.connect(boost::bind(&CGameMir::OnMpChange,boost::ref(*this),_1,_2));
InitData();
}
CGameMir::~CGameMir()
{
DeleteCriticalSection(&m_LuaCS);
}
// CGameMir 成员函数
void CGameMir::Login(const std::string& ServerAddress, const std::string& ServerName, UINT ServerPort,
const std::string& Account, const std::string& Password, eCharSelect CharSelect)
{
sig_SetGameStatus("开始登录...");
InitData();
Close();
m_GameStage=GS_LOGIN;
Create();
m_ServerAddress=ServerAddress;
m_ServerName=ServerName;
m_ServerPort=ServerPort;
m_Account=Account;
m_Password=Password;
m_CharSelect=CharSelect;
AddLog(crMessage,"\n");
AddLog(crGreen,"开始登录!==>%s[%s]\n", ServerName.c_str(), ServerAddress.c_str());
Connect(ServerAddress.c_str(),ServerPort);
}
const unsigned char Decode6BitMask[5] = { 0xfc, 0xf8, 0xf0, 0xe0, 0xc0 };
int CGameMir::fnEncode6BitBufA(unsigned char *pszSrc, char *pszDest, int nSrcLen, int nDestLen)
{
int nDestPos = 0;
int nRestCount = 0;
unsigned char chMade = 0, chRest = 0;
for (int i = 0; i < nSrcLen; i++)
{
if (nDestPos >= nDestLen) break;
chMade = ((chRest | (pszSrc[i] >> (2 + nRestCount))) & 0x3f);
chRest = (((pszSrc[i] << (8 - (2 + nRestCount))) >> 2) & 0x3f);
nRestCount += 2;
if (nRestCount < 6)
pszDest[nDestPos++] = chMade + 0x3c;
else
{
if (nDestPos < nDestLen - 1)
{
pszDest[nDestPos++] = chMade + 0x3c;
pszDest[nDestPos++] = chRest + 0x3c;
}
else
pszDest[nDestPos++] = chMade + 0x3c;
nRestCount = 0;
chRest = 0;
}
}
if (nRestCount > 0)
pszDest[nDestPos++] = chRest + 0x3c;
//pszDest[nDestPos] = '\0';
return nDestPos;
}
int CGameMir::fnDecode6BitBufA(const char *pszSrc, char *pszDest, int nDestLen)
{
int nLen = strlen((const char *)pszSrc);
int nDestPos = 0, nBitPos = 2;
int nMadeBit = 0;
unsigned char ch, chCode, tmp;
for (int i = 0; i < nLen; i++)
{
if ( pszSrc[i]==0 ) break;
if ((pszSrc[i] - 0x3c) >= 0)
ch = pszSrc[i] - 0x3c;
else
{
continue;
}
if (nDestPos >= nDestLen) break;
if ((nMadeBit + 6) >= 8)
{
chCode = (tmp | ((ch & 0x3f) >> (6 - nBitPos)));
pszDest[nDestPos++] = chCode;
nMadeBit = 0;
if (nBitPos < 6)
nBitPos += 2;
else
{
nBitPos = 2;
continue;
}
}
tmp = ((ch << nBitPos) & Decode6BitMask[nBitPos - 2]);
nMadeBit += (8 - nBitPos);
}
//pszDest[nDestPos] = '\0';
return nDestPos;
}
void CGameMir::OnConnect(int nErrorCode)
{
sMirMessage msg;
ZeroMemory(&msg,sizeof(msg));
switch(m_GameStage)
{
case GS_LOGIN:
AddLog(crMessage,"登陆服务器连接成功!\n");
msg.wCmd=CM_IDPASSWORD;
SendMsg(msg,(m_Account+"/"+m_Password).c_str());
break;
case GS_SEL:
AddLog(crMessage,"选人网关连接成功! 请求角色列表...\n");
msg.wCmd=CM_QUERYCHR;
SendMsg(msg,(m_Account+"/"+m_SID).c_str());
break;
case GS_GAME:
{
AddLog(crMessage,"游戏服务器连接成功!\n");
char buf[0x100];
sprintf(buf,"**%s/%s/%s/%d/0",m_Account.c_str(),m_CharName.c_str(),m_SID.c_str(),MIR2_VERSION);
AddLog(crDebug,"%s\n",buf);
SendMsg(*((sMirMessage*)buf),&buf[sizeof(sMirMessage)]);
}
m_SettingMgr.Load();
break;
}
CNet::OnConnect(nErrorCode);
}
void CGameMir::OnResult(const char * result)
{
// if tagstr = 'PWR' then BoNextTimePowerHit := TRUE; //促澜锅俊 powerhit阑 锭副 荐 乐澜...
// if tagstr = 'LNG' then BoCanLongHit := TRUE;
// if tagstr = 'ULNG' then BoCanLongHit := FALSE;
// if tagstr = 'WID' then BoCanWideHit := TRUE;
// if tagstr = 'UWID' then BoCanWideHit := FALSE;
// if tagstr = 'CRS' then BoCanCrossHit := TRUE;
// if tagstr = 'UCRS' then BoCanCrossHit := FALSE;
// // 2003/07/15 脚痹公傍 眠啊
// if tagstr = 'TWN' then BoCanTwinHit := TRUE;
// if tagstr = 'UTWN' then BoCanTwinHit := FALSE;
// if tagstr = 'FIR' then begin
//BoNextTimeFireHit := TRUE; //堪拳搬捞 技泼等 惑怕
//LatestFireHitTime := GetTickCount;
// //Myself.SendMsg (SM_READYFIREHIT, Myself.XX, Myself.YY, Myself.Dir, 0, 0, '', 0);
// end;
// if tagstr = 'STN' then BoCanStoneHit := TRUE;
// if tagstr = 'USTN' then BoCanStoneHit := FALSE;
//
// if tagstr = 'UFIR' then BoNextTimeFireHit := FALSE;
// if tagstr = 'GOOD' then begin
//ActionLock := FALSE;
// Inc (ReceiveCount);
//i:=StrToInt(data);
//ServerTime:=i div 1000;
// end;
// if tagstr = 'FAIL' then begin
// ActionFailed;
//ActionLock := FALSE;
// Inc (ReceiveCount);
//i:=StrToInt(data);
//ServerTime:=i div 1000;
// end;
// if data <> '' then begin
// CheckSpeedHack (Str_ToInt(data, 0));
// end;
// exit;
// end;
// if Length(datablock) < DEFBLOCKSIZE then begin
// if datablock[1] = '=' then begin
//data := Copy (datablock, 2, Length(datablock)-1);
// if data = 'DIG' then begin
// Myself.BoDigFragment := TRUE;
// end;
// end;
// exit;
/*
std::vector<std::string> sl;
char buf[32];
strncpy(buf,result,32);
SplitString( buf, "/", sl );
if ( sl[0]=="LNG" )
m_FrameWnd.AddLog(crDebug,"刺杀开启\n");
else if ( sl[0]=="ULNG" )
m_FrameWnd.AddLog(crDebug,"刺杀关闭\n");
else// if ( !m_Action.OnResult(result) )
m_FrameWnd.AddLog(crDebug,"%s\n",result);
*/
m_Action.OnResult(result);
}
void CGameMir::OnMessage(const sMirMessage& msg,const char* body)
{
switch(msg.wCmd)
{
ROUTINE_MM_ENTRY(SM_PASSOK_SELECTSERVER);
ROUTINE_MM_ENTRY(SM_PASSWD_FAIL);
ROUTINE_MM_ENTRY(SM_SELECTSERVER_OK);
ROUTINE_MM_ENTRY(SM_QUERYCHR);
ROUTINE_MM_ENTRY(SM_STARTPLAY);
ROUTINE_MM_ENTRY(SM_SENDNOTICE);
ROUTINE_MM_ENTRY(SM_SYSMESSAGE);
ROUTINE_MM_ENTRY(SM_WHISPER);
ROUTINE_MM_ENTRY(SM_HEAR);
ROUTINE_MM_ENTRY(SM_GUILDMESSAGE);
ROUTINE_MM_ENTRY(SM_TURN);
ROUTINE_MM_ENTRY(SM_WALK);
ROUTINE_MM_ENTRY(SM_RUN);
ROUTINE_MM_ENTRY(SM_DISAPPEAR);
ROUTINE_MM_ENTRY(SM_ABILITY);
ROUTINE_MM_ENTRY(SM_NEWMAP);
ROUTINE_MM_ENTRY(SM_LOGON);
ROUTINE_MM_ENTRY(SM_HIT);
ROUTINE_MM_ENTRY(SM_BACKSTEP);
ROUTINE_MM_ENTRY(SM_MERCHANTSAY);
ROUTINE_MM_ENTRY(SM_HEAVYHIT);
ROUTINE_MM_ENTRY(SM_POWERHIT);
ROUTINE_MM_ENTRY(SM_LONGHIT);
ROUTINE_MM_ENTRY(SM_WIDEHIT);
ROUTINE_MM_ENTRY(SM_FIREHIT);
ROUTINE_MM_ENTRY(SM_BIGHIT);
ROUTINE_MM_ENTRY(SM_USERNAME);
ROUTINE_MM_ENTRY(SM_WINEXP);
ROUTINE_MM_ENTRY(SM_MAPDESCRIPTION);
ROUTINE_MM_ENTRY(SM_BAGITEMS);
ROUTINE_MM_ENTRY(SM_SENDUSEITEMS);
ROUTINE_MM_ENTRY(SM_CLEAROBJECTS);
ROUTINE_MM_ENTRY(SM_CHANGEMAP);
ROUTINE_MM_ENTRY(SM_HEALTHSPELLCHANGED);
ROUTINE_MM_ENTRY(SM_NOWDEATH);
ROUTINE_MM_ENTRY(SM_DEATH);
ROUTINE_MM_ENTRY(SM_SENDMYMAGIC);
ROUTINE_MM_ENTRY(SM_STRUCK);
ROUTINE_MM_ENTRY(SM_DURACHANGE);
ROUTINE_MM_ENTRY(SM_ADDITEM);
ROUTINE_MM_ENTRY(SM_FEATURECHANGED);
ROUTINE_MM_ENTRY(SM_CHANGELIGHT);
ROUTINE_MM_ENTRY(SM_AREASTATE);
ROUTINE_MM_ENTRY(SM_GOLDCHANGED);
ROUTINE_MM_ENTRY(SM_READMINIMAP_OK);
ROUTINE_MM_ENTRY(SM_READMINIMAP_FAIL);
ROUTINE_MM_ENTRY(SM_ALIVE);
ROUTINE_MM_ENTRY(SM_EAT_OK);
ROUTINE_MM_ENTRY(SM_EAT_FAIL);
ROUTINE_MM_ENTRY(SM_ITEMSHOW);
ROUTINE_MM_ENTRY(SM_ITEMHIDE);
ROUTINE_MM_ENTRY(SM_SENDGOODSLIST);
ROUTINE_MM_ENTRY(SM_MERCHANTDLGCLOSE);
ROUTINE_MM_ENTRY(SM_BUYITEM_SUCCESS);
ROUTINE_MM_ENTRY(SM_WEIGHTCHANGED);
ROUTINE_MM_ENTRY(SM_SENDDETAILGOODSLIST);
ROUTINE_MM_ENTRY(SM_BUYITEM_FAIL);
ROUTINE_MM_ENTRY(SM_TAKEON_OK);
ROUTINE_MM_ENTRY(SM_TAKEON_FAIL);
ROUTINE_MM_ENTRY(SM_MAGICFIRE);
ROUTINE_MM_ENTRY(SM_MENU_OK);
// 忽略消息
IGNORE_MM_ENTRY(SM_CHANGENAMECOLOR);
IGNORE_MM_ENTRY(SM_SHOWEVENT);
IGNORE_MM_ENTRY(SM_HIDEEVENT);
IGNORE_MM_ENTRY(SM_DAYCHANGING);
IGNORE_MM_ENTRY(SM_CHECK_CLIENTVALID);
#ifndef PUBLIC_EDTION
default:
DebugOut("cmd=% 5u flag=% 8X w1=% 4X w2=% 4X w3=% 4X data=【%s】\n",
msg.wCmd, msg.dwFlag, msg.w1, msg.w2, msg.w3, body);
if(m_Self.ServerId!=0 && m_Self.ServerId==msg.dwFlag)
AddLog(crDebug,"**** cmd=% 5u flag=% 8X w1=% 4X w2=% 4X w3=% 4X data=【%s】\n",
msg.wCmd, msg.dwFlag, msg.w1, msg.w2, msg.w3, body);
break;
#endif
}
}
//************************************
// 消息: SM_PASSOK_SELECTSERVER
// 作用: 验证通过
//************************************
IMPLEMENT_MM_ENTRY(SM_PASSOK_SELECTSERVER)
{
char servername[256];
ZeroMemory(servername,sizeof(servername));
fnDecode6BitBufA(body,servername,sizeof(servername));
AddLog(crMessage,"验证通过\n");
SendMsg(CM_SELECTSERVER,0,0,0,0,m_ServerName.c_str());
AddLog(crMessage,"Servers:%s\n",servername);
}
//************************************
// 消息: SM_PASSWD_FAIL
// 作用: 验证失败
//************************************
IMPLEMENT_MM_ENTRY(SM_PASSWD_FAIL)
{
Close();
switch((signed)msg.dwFlag)
{
case -1:
AddLog(crError,"密码错误。\n");
break;
case -2:
AddLog(crError,"连续三次密码错误。你将在一段时间内无法再次连接。\n");
break;
case -3:
AddLog(crError,"这个帐号正在使用,或者是被异常的终止锁定了,请稍后再试。\n");
Sleep(5000);
Login(m_ServerAddress,m_ServerName,m_ServerPort,m_Account,m_Password,m_CharSelect);
break;
case -4:
AddLog(crError,"这个帐户不能正确访问。请改变帐户,或者申请付费注册。\n");
break;
case -5:
AddLog(crError,"这个帐户被禁止了。\n");
break;
default:
AddLog(crError,"ID不存在或未知错误:ERR=%d\n",msg.dwFlag);
break;
}
}
//************************************
// 消息: SM_SELECTSERVER_OK
// 作用: 选服成功
//************************************
IMPLEMENT_MM_ENTRY(SM_SELECTSERVER_OK)
{
char seladdress[256];
ZeroMemory(seladdress,sizeof(seladdress));
fnDecode6BitBufA(body,seladdress,sizeof(seladdress));
std::vector<std::string> sl;
SplitString(seladdress,"/",sl);
if ( sl.size() < 3 )
{
AddLog(crError,"返回选人网关地址错误!\n");
Close();
}
std::string SelAddress,strTmp;
UINT SelPort;
SelAddress=sl[0];
strTmp=sl[1];
SelPort=boost::lexical_cast<UINT>(strTmp);
m_SID=sl[2];
Close();
m_GameStage=GS_SEL;
Create();
Connect(SelAddress.c_str(),SelPort);
AddLog(crMessage,"\n");
AddLog(crMessage,"开始连接 选人网关 !\n");
}
//************************************
// 消息: SM_QUERYCHR
// 作用: 人物信息
//************************************
IMPLEMENT_MM_ENTRY(SM_QUERYCHR)
{
char charlist[256];
ZeroMemory(charlist,sizeof(charlist));
fnDecode6BitBufA(body,charlist,sizeof(charlist));
AddLog(crMessage,"得到角色列表(%s)\n",charlist);
std::string strTmp;
std::vector<std::string> sl;
SplitString(charlist,"/",sl);
int c=sl.size();
std::string names[2];
int d=0;
int j=0;
for(int i=4;i<c;i+=5,j++)
{
strTmp=sl[i-4];
if(strTmp[0]=='*')
{
d=j;
strTmp=strTmp.substr(1);
}
names[j]=strTmp;
}
AddLog(crMessage,"得到角色列表(%d)\n",j);
if ( (m_CharSelect==csLeftChar && j<1 ) || (m_CharSelect==csRightChar && j<2 ) )
{
Close();
MessageBox(NULL,"不能按要求选择角色,请确认你的输入!","选人错误",MB_OK|MB_ICONSTOP);
return;
}
switch( m_CharSelect )
{
case csLeftChar:
m_CharName=names[0];
break;
case csRightChar:
m_CharName=names[1];
break;
case csDefaultChar:
default:
m_CharName=names[d];
break;
}
AddLog(crMessage,"使用[%s]登陆游戏.\n",m_CharName.c_str());
sMirMessage smsg;
ZeroMemory(&smsg,sizeof(smsg));
smsg.wCmd=0x67;
SendMsg(smsg,(m_Account+"/"+m_CharName).c_str());
}
//************************************
// 消息: SM_STARTPLAY
// 作用: 开始游戏
//************************************
IMPLEMENT_MM_ENTRY(SM_STARTPLAY)
{
char gameaddress[256];
ZeroMemory(gameaddress,sizeof(gameaddress));
fnDecode6BitBufA(body,gameaddress,sizeof(gameaddress));
std::vector<std::string> sl;
SplitString(gameaddress,"/",sl);
if ( sl.size() < 2 )
{
AddLog(crError,"返回游戏服务器地址错误!\n");
Close();
}
std::string GameAddress,strTmp;
UINT GamePort;
GameAddress=sl[0];
strTmp=sl[1];
GamePort=boost::lexical_cast<UINT>(strTmp);
Close();
m_GameStage=GS_GAME;
Create();
Connect(GameAddress.c_str(),GamePort);
AddLog(crMessage,"\n");
AddLog(crMessage,"开始连接 游戏服务器 !%s:%d\n",GameAddress.c_str(),GamePort);
}
//************************************
// 消息: SM_SENDNOTICE
// 作用: 游戏公告
//************************************
IMPLEMENT_MM_ENTRY(SM_SENDNOTICE) // 游戏公告
{
char notice[4096];
ZeroMemory(notice,sizeof(notice));
fnDecode6BitBufA(body,notice,sizeof(notice));
AddLog(crMessage,"得到游戏公告,进入游戏世界...\n");
char*buf=notice;
buf=strtok(buf,"\x1b");
while(buf!=NULL)
{
AddLog(crGameNotice,"%s\n",buf);
buf=strtok(NULL,"\x1b");
}
SendMsg(CM_LOGINNOTICEOK,0,0,0,0);
}
//************************************
// 消息: SM_SYSMESSAGE
// 作用: 系统信息
//************************************
IMPLEMENT_MM_ENTRY(SM_SYSMESSAGE) // 系统信息
{
char saytext[4096];
ZeroMemory(saytext,sizeof(saytext));
int len=fnDecode6BitBufA(body,saytext,sizeof(saytext));
char*buf=saytext;
while((buf=strchr(buf,'\x0a'))!=NULL)
{
*buf=' ';
}
buf=saytext;
while((buf=strchr(buf,'\x0d'))!=NULL)
{
*buf=' ';
}
BYTE f=msg.w1&0xff;
BYTE b=(msg.w1&0xff00)>>8;
strcat(saytext,"\n");
AddChat(saytext,f,b);
if ( msg.wCmd==SM_SYSMESSAGE )
{
std::string str=saytext;
const boost::regex reAttackMode("^.*?\\[攻击模式:\\s*(.+?)\\].*$",boost::regbase::normal|boost::regbase::icase);
boost::smatch match;
if (boost::regex_match( str, match, reAttackMode))
{
str=match.str(1);
const char ATTACK_MODE_STR[8][16]={ "和平攻击", "全体攻击", "夫妻攻击", "师徒攻击", "编组攻击", "行会攻击", "国家攻击", "红名攻击" };
for ( int mode=0; mode<8; ++mode)
{
if ( str==ATTACK_MODE_STR[mode] )
{
m_CurrentAttackMode=mode;
if ( m_CurrentAttackMode!=m_NeededAttackMode )
{
ChangeAttackMode(m_NeededAttackMode);
}
break;
}
}
}
}
}
//************************************
// 消息: SM_WHISPER
// 作用: 私聊频道
//************************************
IMPLEMENT_MM_ENTRY(SM_WHISPER)//私聊频道
{
REDIRECT_MM_ENTRY(SM_SYSMESSAGE)
}
//************************************
// 消息: SM_HEAR
// 作用: 聊天频道
//************************************
IMPLEMENT_MM_ENTRY(SM_HEAR)//聊天频道
{
REDIRECT_MM_ENTRY(SM_SYSMESSAGE)
}
//************************************
// 消息: SM_GUILDMESSAGE
// 作用: 行会聊天
//************************************
IMPLEMENT_MM_ENTRY(SM_GUILDMESSAGE)//行会聊天
{
REDIRECT_MM_ENTRY(SM_SYSMESSAGE)
}
//************************************
// 消息: SM_NOWDEATH
// 作用: 死亡
//************************************
IMPLEMENT_MM_ENTRY(SM_NOWDEATH) // 死亡
{
REDIRECT_MM_ENTRY(SM_DISAPPEAR)
}
//************************************
// 消息: SM_DISAPPEAR
// 作用: 消失
//************************************
IMPLEMENT_MM_ENTRY(SM_DISAPPEAR)//actor消失
{
itActor actor=FindActor(msg.dwFlag);
if (!isOverEnd(actor))
{
sig_UpdateActor(*actor, false );
m_ActorList.erase(actor);
}
}
//************************************
// 消息: SM_TURN
// 作用: 转动
//************************************
IMPLEMENT_MM_ENTRY(SM_TURN)//转动方向
{
if ( msg.dwFlag==m_Self.ServerId )
{
AddLog(crDebug,"SM_TURN with Id equalto MyServerId\n");
return;
}
char data[512];
ZeroMemory(data,sizeof(data));
fnDecode6BitBufA(body,data,sizeof(data));
sCharDesc * cd = static_cast<sCharDesc *>( static_cast<void *>( data ) );
char buf[512];
DecodeName(data+8,buf);
itActor pact = NewActor( msg.dwFlag, msg.w1, msg.w2, LOBYTE( msg.w3 ), cd->Feature, cd->Status, buf );
sig_TargetPosChange(msg.dwFlag, msg.w1, msg.w2,pact->Name.c_str());
sig_UpdateActor( *pact, true );
}
//************************************
// 消息: SM_BACKSTEP
// 作用: 后退
//************************************
IMPLEMENT_MM_ENTRY(SM_BACKSTEP) // 后退
{
REDIRECT_MM_ENTRY(SM_TURN);
}
//************************************
// 消息: SM_WALK
// 作用: 走路
//************************************
IMPLEMENT_MM_ENTRY(SM_WALK)//走路
{
REDIRECT_MM_ENTRY(SM_TURN);
}
//************************************
// 消息: SM_RUN
// 作用: 跑
//************************************
IMPLEMENT_MM_ENTRY(SM_RUN)//跑
{
REDIRECT_MM_ENTRY(SM_TURN);
}
//************************************
// 消息: SM_ABILITY
// 作用: 角色属性
//************************************
IMPLEMENT_MM_ENTRY(SM_ABILITY)//角色属性
{
ZeroMemory(&m_Self.Ability,sizeof(m_Self.Ability));
fnDecode6BitBufA(body,(char*)&m_Self.Ability,sizeof(m_Self.Ability));
m_Self.Gold=msg.dwFlag;
m_Self.Job=static_cast<BYTE>(msg.w1);
sig_UpdateSelfInfo();
long a;
a=m_Self.Ability.Hp;
sig_HpChange(m_Self.Ability.Hp,m_Self.Ability.MaxHp);
a=m_Self.Ability.Mp;
sig_MpChange(m_Self.Ability.Mp,m_Self.Ability.MaxMp);
a=m_Self.Ability.Exp;
sig_ExpChange(m_Self.Ability.Exp,m_Self.Ability.MaxExp);
a=m_Self.Ability.BagWeight;
sig_WeightChange(m_Self.Ability.BagWeight,m_Self.Ability.MaxBagWeight);
POINT pos;
pos.x=m_Self.xx;
pos.y=m_Self.yy;
sig_PositionChange(pos);
}
//************************************
// 消息: SM_NEWMAP
// 作用: 新地图
//************************************
IMPLEMENT_MM_ENTRY(SM_NEWMAP)//新地图
{
char mapname[512];
ZeroMemory(mapname,sizeof(mapname));
fnDecode6BitBufA(body,mapname,sizeof(mapname));
m_Map.LoadMap(mapname);
AddLog(crMessage,"加载地图%s\n",mapname);
m_Self.xx=msg.w1;
m_Self.yy=msg.w2;
sig_UpdateSelfInfo();
POINT pos;
pos.x=m_Self.xx;
pos.y=m_Self.yy;
sig_PositionChange(pos);
SendMsg(CM_WANTMINIMAP);
}
//************************************
// 消息: SM_CLEAROBJECTS
// 作用: 切换地图 删除所有对象
//************************************
IMPLEMENT_MM_ENTRY(SM_CLEAROBJECTS) // 准备切换地图 删除所有对象
{
m_ActorList.clear();
sig_ClearActors();
m_DropedItems.clear();
std::vector<POINT> path;
path.clear();
sig_SetPath(path);
MerchantClose();
}
//************************************
// 消息: SM_CHANGEMAP
// 作用: 切换地图
//************************************
IMPLEMENT_MM_ENTRY(SM_CHANGEMAP)
{
char mapname[512];
ZeroMemory(mapname,sizeof(mapname));
fnDecode6BitBufA(body,mapname,sizeof(mapname));
m_Map.LoadMap(mapname);
AddLog(crMessage,"加载地图%s %d %d %d\n",mapname,msg.w1,msg.w2,msg.w3);
m_Self.xx=msg.w1;
m_Self.yy=msg.w2;
sig_UpdateSelfInfo();
POINT pos;
pos.x=m_Self.xx;
pos.y=m_Self.yy;
sig_PositionChange(pos);
SendMsg(CM_WANTMINIMAP);
}
//************************************
// 消息: SM_LOGON
// 作用: 登录游戏
//************************************
IMPLEMENT_MM_ENTRY(SM_LOGON)
{
m_Magics.clear();
sMessageBodyWL wl;
//char data[512];
ZeroMemory(&wl,sizeof(wl));
fnDecode6BitBufA(body,(char*)&wl,sizeof(wl));
//sMessageBodyWL*wl=static_cast<sMessageBodyWL*>(static_cast<void*>(const_cast<char*>(data)));
m_Self.xx=msg.w1;
m_Self.yy=msg.w2;
m_Self.dir=msg.w3;
m_Self.Feature=wl.lParam1;
m_Self.State=wl.lParam2;
m_Self.ServerId=msg.dwFlag;
AddLog(crMessage,"我出现在%d,%d\n",msg.w1,msg.w2);
SendMsg(CM_QUERYBAGITEMS,0,0,0,0);
sig_UpdateSelfInfo();
POINT pos;
pos.x=m_Self.xx;
pos.y=m_Self.yy;
sig_PositionChange(pos);
sig_SetGameStatus( ( m_CharName + " - 游戏中" ).c_str() );
LuaDoFile(m_SettingMgr.LoginScript.c_str());
}
//************************************
// 消息: SM_STRUCK
// 作用: 被攻击
//************************************
IMPLEMENT_MM_ENTRY(SM_STRUCK)
{
sMessageBodyWL wl;
ZeroMemory(&wl,sizeof(sMessageBodyWL));
fnDecode6BitBufA(body,(char*)&wl,sizeof(sMessageBodyWL));
itActor itor;
if ( msg.dwFlag==m_Self.ServerId )
{
m_Self.Ability.Hp=msg.w1;
m_Self.Ability.MaxHp=msg.w2;
sig_UpdateSelfInfo();
long hp=m_Self.Ability.Hp,mp=m_Self.Ability.Mp;
sig_HpChange(m_Self.Ability.Hp,m_Self.Ability.MaxHp);
sig_MpChange(m_Self.Ability.Mp,m_Self.Ability.MaxMp);
}
else
{
itor=FindActor(msg.dwFlag);
if(!isOverEnd(itor))
{
itor->Hp=msg.w1;
itor->MaxHp=msg.w2;
itor->AttackWithoutHpLose=0;
}
sig_TargetHpChange(msg.dwFlag,msg.w1,msg.w2);
}
}
//************************************
// 消息: SM_HIT
// 作用: 攻击
//************************************
IMPLEMENT_MM_ENTRY(SM_HIT)
{
itActor itor;
itor=FindActor(msg.dwFlag);
if(!isOverEnd(itor))
{
itor->xx=msg.w1;
itor->yy=msg.w2;
itor->dir=msg.w3&7;
sig_UpdateActor( *itor, true );
}
}
//************************************
// 消息: SM_HEAVYHIT
// 作用: 攻击
//************************************
IMPLEMENT_MM_ENTRY(SM_HEAVYHIT)
{
REDIRECT_MM_ENTRY(SM_HIT);
}
//************************************
// 消息: SM_BIGHIT
// 作用: 攻击
//************************************
IMPLEMENT_MM_ENTRY(SM_BIGHIT)
{
REDIRECT_MM_ENTRY(SM_HIT);
}
//************************************
// 消息: SM_POWERHIT
// 作用: 攻击
//************************************
IMPLEMENT_MM_ENTRY(SM_POWERHIT)
{
REDIRECT_MM_ENTRY(SM_HIT);
}
//************************************
// 消息: SM_LONGHIT
// 作用: 攻击
//************************************
IMPLEMENT_MM_ENTRY(SM_LONGHIT)
{
REDIRECT_MM_ENTRY(SM_HIT);
}
//************************************
// 消息: SM_WIDEHIT
// 作用: 攻击
//************************************
IMPLEMENT_MM_ENTRY(SM_WIDEHIT)
{
REDIRECT_MM_ENTRY(SM_HIT);
}
//************************************
// 消息: SM_FIREHIT
// 作用: 攻击
//************************************
IMPLEMENT_MM_ENTRY(SM_FIREHIT)
{
REDIRECT_MM_ENTRY(SM_HIT);
}
//************************************
// 消息: SM_MERCHANTSAY
// 作用: NPC对话
//************************************
IMPLEMENT_MM_ENTRY(SM_MERCHANTSAY)
{
char merchantsay[BUFFER_SIZE+1];
ZeroMemory(merchantsay,sizeof(merchantsay));
fnDecode6BitBufA(body,merchantsay,BUFFER_SIZE);
Merchant.ID=msg.dwFlag;
Merchant.OnMerchantSay(merchantsay);
}
//************************************
// 消息: SM_SENDGOODSLIST
// 作用: 商店物品
//************************************
IMPLEMENT_MM_ENTRY(SM_SENDGOODSLIST)
{
Merchant.Items.clear();
char GoodList[BUFFER_SIZE+1];
ZeroMemory(GoodList,sizeof(GoodList));
fnDecode6BitBufA(body,GoodList,BUFFER_SIZE);
std::vector<std::string> sl;
SplitString(GoodList,"/",sl);
while((sl.size()&3)!=0)
{
sl.push_back("0");
}
std::vector<std::string>::iterator pos;
pos=sl.begin();
int idx=0;
int i=0;
while(pos!=sl.end())
{
sMerchantItem item;
item.strName=*pos;
pos++;
item.bNeedDetial=(boost::lexical_cast<int>(*pos)!=0);
pos++;
item.iPrice=boost::lexical_cast<int>(*pos);
pos++;
item.iCount=boost::lexical_cast<int>(*pos);
pos++;
ZeroMemory(&item.ciItem,sizeof(item.ciItem));
Merchant.Items.push_back(item);
}
Merchant.OnSetItemList(Merchant.Items);
}
//************************************
// 消息: SM_SENDDETAILGOODSLIST
// 作用: 商店物品信息
//************************************
IMPLEMENT_MM_ENTRY(SM_SENDDETAILGOODSLIST)
{
Merchant.Items.clear();
char buf[BUFFER_SIZE+1];
buf[fnDecode6BitBufA(body,buf,BUFFER_SIZE)]=static_cast<char>(0);
std::vector<std::string> sl;
CGameMir::SplitString(buf,"/",sl);
sClientItemList ItemList;
for ( std::vector<std::string>::iterator pos=sl.begin(); pos!=sl.end(); ++pos )
{
sMerchantItem item;
fnDecode6BitBufA(pos->c_str(),(char*)&item.ciItem,sizeof(item.ciItem));
item.strName=GetDelphiString(item.ciItem.S.Name,14,buf);
item.bNeedDetial=false;
item.iPrice=item.ciItem.S.Price;
item.iCount=1;
Merchant.Items.push_back(item);
}
Merchant.OnSetItemList(Merchant.Items);
}
//************************************
// 消息: SM_MERCHANTDLGCLOSE
// 作用: NPC对话关闭
//************************************
IMPLEMENT_MM_ENTRY(SM_MERCHANTDLGCLOSE)
{
MerchantClose();
}
//************************************
// 消息: SM_USERNAME
// 作用: 用户名字
//************************************
IMPLEMENT_MM_ENTRY(SM_USERNAME)
{
char username[256];
ZeroMemory(username,sizeof(username));
fnDecode6BitBufA(body,username,sizeof(username));
if ( msg.dwFlag==m_Self.ServerId )
{
m_Self.Name=username;
sig_UpdateSelfInfo();
}
else
{
itActor actor=FindActor(msg.dwFlag);
if ( !isOverEnd(actor) )
{
if ( AT_Baby==actor->Type || AT_Monst==actor->Type )
{
if ( NULL==strchr(username,'(') )
{
actor->Type=AT_Monst;
}
else
{
actor->Type=AT_Baby;
}
}
actor->Name=username;
sig_UpdateActor( *actor, true );
sig_TargetPosChange(msg.dwFlag, actor->xx, actor->yy,actor->Name.c_str());
}
}
}
//************************************
// 消息: SM_WINEXP
// 作用: 经验值增加
//************************************
IMPLEMENT_MM_ENTRY(SM_WINEXP)
{
m_Self.Ability.Exp=msg.dwFlag;
AddLog(crWhite,"经验值增加%d\n",msg.w1);
sig_UpdateSelfInfo();
long exp;
exp=static_cast<long>(msg.dwFlag);
sig_ExpChange(m_Self.Ability.Exp,m_Self.Ability.MaxExp);
}
//************************************
// 消息: SM_MAPDESCRIPTION
// 作用: 地图名字
//************************************
IMPLEMENT_MM_ENTRY(SM_MAPDESCRIPTION)
{
char maptitle[256];
ZeroMemory(maptitle,sizeof(maptitle));
fnDecode6BitBufA(body,maptitle,sizeof(maptitle));
m_Self.MapTitle=maptitle;
sig_UpdateSelfInfo();
POINT pos;
pos.x=m_Self.xx;
pos.y=m_Self.yy;
sig_PositionChange(pos);
}
//************************************
// 消息: SM_BAGITEMS
// 作用: 背包物品
//************************************
IMPLEMENT_MM_ENTRY(SM_BAGITEMS)
{
m_BagItems.clear();
sig_ClearBag();
sClientItem ci;
std::vector<std::string> sl;
SplitString(const_cast<char*>(body),"/",sl);
for ( std::vector<std::string>::iterator str=sl.begin(); str!=sl.end(); ++str )
{
ZeroMemory(&ci,sizeof(sClientItem));
int len=fnDecode6BitBufA(str->c_str(),(char*)&ci,sizeof(sClientItem));
AddItem(ci);
}
}
//************************************
// 消息: SM_ADDITEM
// 作用: 获得物品
//************************************
IMPLEMENT_MM_ENTRY(SM_ADDITEM)
{
sClientItem ci;
ZeroMemory(&ci,sizeof(sClientItem));
int len=fnDecode6BitBufA(body,(char*)&ci,sizeof(sClientItem));
AddItem(ci);
char str[32];
ZeroMemory(str,32);
memcpy(str,ci.S.Name,sizeof(ci.S.Name));
str[ci.S.NameLen]=static_cast<char>(0);
AddLog(crGreen,"发现%s!\n",str,ci.S.StdMode);
}
//************************************
// 消息: SM_SENDUSEITEMS
// 作用: 装备
//************************************
IMPLEMENT_MM_ENTRY(SM_SENDUSEITEMS)
{
ZeroMemory(m_UseItems,sizeof(m_UseItems));
char*s=const_cast<char*>(body);
char*n;
char str[64];
char buf[256];
DWORD len;
while((n=strchr(s,'/'))!=NULL)
{
len=n-s;
memcpy(str,s,len);
str[len]=static_cast<char>(0);
int idx=atoi(str);
if(idx>MAX_USE_ITEMS)
break;//throw "Use Items Index Fail!!";
s=++n;
if(((n=strchr(s,'/'))!=NULL))
{
len=n-s;
memcpy(buf,s,len);
buf[len]=static_cast<char>(0);
s=++n;
ZeroMemory(&m_UseItems[idx],sizeof(sClientItem));
int len=fnDecode6BitBufA(buf,(char*)&m_UseItems[idx],sizeof(sClientItem));
if(m_UseItems[idx].S.NameLen==0)
{
m_UseItems[idx].MakeIndex=0;
}
}
else
{
break;
}
}
sig_UpdateUseItem();
}
//************************************
// 消息: SM_SENDMYMAGIC
// 作用: 技能
//************************************
IMPLEMENT_MM_ENTRY(SM_SENDMYMAGIC)
{
m_Magics.clear();
char*s=const_cast<char*>(body);
std::vector<std::string> sl;
std::vector<std::string>::iterator str;
SplitString( s, "/", sl );
sClientMagic magic;
for ( str=sl.begin(); str!=sl.end(); ++str )
{
ZeroMemory(&magic,sizeof(sClientMagic));
int len=fnDecode6BitBufA(str->c_str(),(char*)&magic,sizeof(sClientMagic));
m_Magics.push_back(magic);
}
}
//************************************
// 消息: SM_HEALTHSPELLCHANGED
// 作用: HP变动
//************************************
IMPLEMENT_MM_ENTRY(SM_HEALTHSPELLCHANGED)
{
static DWORD tt=0;
if ( msg.dwFlag==m_Self.ServerId )
{
m_Self.Ability.Hp=msg.w1;
m_Self.Ability.Mp=msg.w2;
m_Self.Ability.MaxHp=msg.w3;
sig_UpdateSelfInfo();
tt=GetTickCount();
long hp=m_Self.Ability.Hp,mp=m_Self.Ability.Mp;
sig_HpChange(m_Self.Ability.Hp,m_Self.Ability.MaxHp);
sig_MpChange(m_Self.Ability.Mp,m_Self.Ability.MaxMp);
return;
}
itActor actor=FindActor(msg.dwFlag);
if(!isOverEnd(actor))
{
actor->Hp=msg.w1;
actor->MaxHp=msg.w3;
actor->AttackWithoutHpLose=0;
}
sig_TargetHpChange(msg.dwFlag,msg.w1,msg.w2);
}
//************************************
// 消息: SM_DURACHANGE
// 作用: 持久变化
//************************************
IMPLEMENT_MM_ENTRY(SM_DURACHANGE)
{
WORD idx=msg.w1;
if(idx<MAX_USE_ITEMS)
{
m_UseItems[idx].Dura=LOWORD(msg.dwFlag);
m_UseItems[idx].DuraMax=msg.w2;
}
}
//************************************
// 消息: SM_FEATURECHANGED
// 作用:
//************************************
IMPLEMENT_MM_ENTRY(SM_FEATURECHANGED)
{
if ( msg.dwFlag==m_Self.ServerId )
{
m_Self.Feature=*static_cast<const DWORD*>(static_cast<const void*>(&msg.w1));
}
else
{
itActor actor=FindActor(msg.dwFlag);
if ( !isOverEnd(actor) )
{
actor->Feature=*static_cast<const DWORD*>(static_cast<const void*>(&msg.w1));
}
}
}
//************************************
// 消息: SM_CHANGELIGHT
// 作用:
//************************************
IMPLEMENT_MM_ENTRY(SM_CHANGELIGHT)
{
if ( msg.dwFlag==m_Self.ServerId )
{
m_Self.ChrLight=msg.w1;
}
else
{
itActor actor=FindActor(msg.dwFlag);
if ( !isOverEnd(actor) )
{
actor->ChrLight=msg.w1;
}
}
}
//************************************
// 消息: SM_AREASTATE
// 作用:
//************************************
IMPLEMENT_MM_ENTRY(SM_AREASTATE)
{
m_AreaStateValue = msg.dwFlag;
}
//************************************
// 消息: SM_GOLDCHANGED
// 作用: 金币变化
//************************************
IMPLEMENT_MM_ENTRY(SM_GOLDCHANGED)
{
AddLog(crGreen,"%d 金币增加.\n",msg.dwFlag-m_Self.Gold);
m_Self.Gold = msg.dwFlag;
}
//************************************
// 消息: SM_READMINIMAP_OK
// 作用:
//************************************
IMPLEMENT_MM_ENTRY(SM_READMINIMAP_OK)
{
}
//************************************
// 消息: SM_READMINIMAP_FAIL
// 作用:
//************************************
IMPLEMENT_MM_ENTRY(SM_READMINIMAP_FAIL)
{
}
//************************************
// 消息: SM_DEATH
// 作用:
//************************************
IMPLEMENT_MM_ENTRY(SM_DEATH)
{
REDIRECT_MM_ENTRY(SM_NOWDEATH);
}
//************************************
// 消息: SM_ALIVE
// 作用:
//************************************
IMPLEMENT_MM_ENTRY(SM_ALIVE)
{
sCharDesc cd;
fnDecode6BitBufA(body,(char*)&cd,sizeof(sCharDesc));
itActor actor=NewActor(msg.dwFlag,msg.w1,msg.w2,msg.w3&7,cd.Feature,cd.Status,"");
sig_UpdateActor(*actor,true);
SendMsg(CM_QUERYUSERNAME,msg.dwFlag,msg.w1,msg.w2,0);
}
//************************************
// 消息: SM_EAT_OK
// 作用: 使用物品成功
//************************************
IMPLEMENT_MM_ENTRY(SM_EAT_OK)
{
if ( !CanEat() ) // eating
{
std::list<sClientItem>::iterator item=std::find_if(m_BagItems.begin(),m_BagItems.end(),fCompareMakeId(m_EatingItem));
sig_UpdateBagItem(*item,false);
m_BagItems.erase(item);
m_EatingItem=0;
}
}
//************************************
// 消息: SM_EAT_FAIL
// 作用: 使用物品失败
//************************************
IMPLEMENT_MM_ENTRY(SM_EAT_FAIL)
{
m_EatingItem=0;
}
//************************************
// 消息: SM_ITEMSHOW
// 作用: 物品出现
//************************************
IMPLEMENT_MM_ENTRY(SM_ITEMSHOW)
{
char ItemName[STRING_BUFFER_LENGTH+1];
ItemName[fnDecode6BitBufA(body,ItemName,STRING_BUFFER_LENGTH)]=static_cast<char>(0);
for ( itDropedItem pos=m_DropedItems.begin(); pos!=m_DropedItems.end(); ++pos )
{
if ( pos->ServerId==msg.dwFlag )
{
pos->Name=ItemName;
pos->ServerId=msg.dwFlag;
pos->x=msg.w1;
pos->y=msg.w2;
pos->LastPick=0;
pos->RetryCount=0;
sig_EventItemShow(*pos);
return;
}
}
sDropedItem di;
di.Name=ItemName;
di.ServerId=msg.dwFlag;
di.x=msg.w1;
di.y=msg.w2;
di.LastPick=0;
di.RetryCount=0;
di.PickupTimes=0;
m_DropedItems.push_back(di);
sig_EventItemShow(di);
}
//************************************
// 消息: SM_ITEMHIDE
// 作用: 物品消失
//************************************
IMPLEMENT_MM_ENTRY(SM_ITEMHIDE)
{
for ( itDropedItem pos=m_DropedItems.begin(); pos!=m_DropedItems.end(); ++pos )
{
if ( pos->ServerId==msg.dwFlag )
{
m_DropedItems.erase(pos);
sig_EventItemHide(*pos);
break;
}
}
}
//************************************
// 消息: SM_BUYITEM_SUCCESS
// 作用: 购买物品成功
//************************************
IMPLEMENT_MM_ENTRY(SM_BUYITEM_SUCCESS)
{
m_Self.Gold=msg.dwFlag;
sig_UpdateSelfInfo();
}
//************************************
// 消息: SM_BUYITEM_FAIL
// 作用: 购买物品失败
//************************************
IMPLEMENT_MM_ENTRY(SM_BUYITEM_FAIL)
{
switch(msg.dwFlag)
{
case 1:
AddLog(crYellow,"物品被卖出。\n");
break;
case 2:
AddLog(crYellow,"没有更多物品可以携带了。\n");
break;
case 3:
AddLog(crYellow,"你没有足够的钱来购买物品。\n");
break;
default:
AddLog(crYellow,"买物品失败,未知原因。\n");
break;
}
}
//************************************
// 消息: SM_WEIGHTCHANGED
// 作用: 负重变化
//************************************
IMPLEMENT_MM_ENTRY(SM_WEIGHTCHANGED)
{
m_Self.Ability.BagWeight=LOWORD(msg.dwFlag);
m_Self.Ability.BodyWeight=LOBYTE(msg.w1);
m_Self.Ability.HandWeight=LOBYTE(msg.w2);
sig_UpdateSelfInfo();
sig_WeightChange(m_Self.Ability.BagWeight,m_Self.Ability.MaxBagWeight);
}
//************************************
// 消息: SM_TAKEON_OK
// 作用: 着装成功
//************************************
IMPLEMENT_MM_ENTRY(SM_TAKEON_OK)
{
itClientItem item=FindItem(WaitingUseItem.item);
m_UseItems[WaitingUseItem.pos]=*item;
sig_UpdateBagItem(*item,false);
sig_UpdateUseItem();
m_BagItems.erase(item);
}
//************************************
// 消息: SM_TAKEON_FAIL
// 作用: 着装失败
//************************************
IMPLEMENT_MM_ENTRY(SM_TAKEON_FAIL)
{
WaitingUseItem.item=0;
WaitingUseItem.pos=0;
AddLog(crYellow,"装备物品失败!\n");
}
//************************************
// 消息: SM_MENU_OK
// 作用: NPC聊天对话框
//************************************
IMPLEMENT_MM_ENTRY(SM_MENU_OK)
{
std::vector<std::string> sl;
char buf[BUFFER_SIZE+1];
buf[fnDecode6BitBufA(body,buf,BUFFER_SIZE)]=static_cast<char>(0);
CGameMir::SplitString(buf,"\\\\",sl);
std::string text;
//text.empty();
for(std::vector<std::string>::iterator pos=sl.begin();pos!=sl.end();pos++,text+="\n")
{
text+=*pos;
}
sig_MessageBox(text.c_str(),MB_OK);
}
IMPLEMENT_MM_ENTRY(SM_MAGICFIRE)
{
}
class fFindActor{
private:
DWORD d;
public:
fFindActor( DWORD id ):d(id) {}
fFindActor( fFindActor& o ):d(o.d) {}
~fFindActor(){}
bool operator()(const CGameMir::sActor& s)const{ return (s.ServerId==d); }
};
CGameMir::itActor CGameMir::FindActor(DWORD id)
{
return find_if(m_ActorList.begin(),m_ActorList.end(),fFindActor(id));
}
itClientItem CGameMir::FindItem(DWORD id)
{
for(itClientItem pos=m_BagItems.begin();pos!=m_BagItems.end();pos++)
{
if ( pos->MakeIndex == id )
return pos;
}
return m_BagItems.end();
}
CGameMir::itDropedItem CGameMir::FindDropedItem(DWORD id)
{
for(itDropedItem pos=m_DropedItems.begin();pos!=m_DropedItems.end();pos++)
{
if ( pos->ServerId == id )
return pos;
}
return m_DropedItems.end();
}
CGameMir::sActorList::iterator CGameMir::NewActor(DWORD id, WORD x, WORD y, WORD dir, DWORD feature, DWORD state, const char* name )
{
bool bNewActor=false;
itActor pact = FindActor( id );
if( isOverEnd( pact ) )
{
sActor act;
act.ServerId=id;
act.Type=AT_Unknow;
m_ActorList.push_back( act );
pact = FindActor( id );
bNewActor=true;
}
pact->xx=x;
pact->yy=y;
pact->dir=dir;
pact->Hp=0;
pact->MaxHp=0;
pact->Feature=feature;
pact->Status=state;
pact->AttackWithoutHpLose=0;
//pact->Death=false;
switch(LOBYTE(LOWORD(feature)))
{
case 0:
pact->Type=AT_Human;
break;
case 12:
case 45:
pact->Type=AT_Guard;
break;
case 50:
pact->Type=AT_Merchant;
break;
case 52:
case 53:
case 54:
case 55:
case 63:
//Baby
case 9:
case 10:
case 11:
case 13:
case 14:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 41:
case 42:
if ( bNewActor || pact->Type==AT_Unknow ) // 新添加
{
pact->Type=AT_Monst;
}
break;
default:
pact->Type=AT_Unknow;
break;
}
if( strlen( name ) > 0 )
{
pact->Name=name;
if ( AT_Baby==pact->Type || AT_Monst==pact->Type || AT_Unknow==pact->Type )
{
if ( NULL==strchr(name,'(') )
{
pact->Type=AT_Monst;
}
else
{
pact->Type=AT_Baby;
}
}
pact->Name=ParseName(pact->Name);
size_t iFind=pact->Name.find('/');
}
else if (bNewActor)
{
SendMsg(CM_QUERYUSERNAME,id,x,y,0);
}
if ( bNewActor && m_AutoFight!=NULL )
{
m_AutoFight->ActorAppear();
}
return pact;
}
bool CGameMir::CanMove(int x, int y)
{
if(!m_Map.TestMap(x,y))
return false;
for(sActorList::iterator itor=m_ActorList.begin();itor!=m_ActorList.end();++itor)
{
if(itor->xx==x && itor->yy==y)
return false;
}
return true;
}
bool CGameMir::CanWalk(const POINT& pnt, int dir)
{
int x,y;
x=pnt.x+xofs_walk[dir];
y=pnt.y+yofs_walk[dir];
return CanMove(x,y);
}
bool CGameMir::CanRun(const POINT& pnt, int dir)
{
int x,y;
x=pnt.x;
y=pnt.y;
for ( int i=0; i<2; i++ )
{
x+=xofs_walk[dir];
y+=yofs_walk[dir];
if ( !CanMove(x,y) )
return false;
}
return true;
}
void CGameMir::ChangeAttackMode(int mode)
{
m_NeededAttackMode=mode;
if ( m_NeededAttackMode!=m_CurrentAttackMode )
{
m_Action.SendSay("@AttackMode");
}
}
int CGameMir::GetAttackMode( void )
{
return m_CurrentAttackMode;
}
bool CGameMir::EatItem(DWORD idx,const char* name)
{
if ( CanEat() )
{
if ( idx!=0 )
{
m_EatingItem=idx;
SendMsg(CM_EAT,m_EatingItem,0,0,0,name);
return true;
}
else
{
for ( std::list<sClientItem>::iterator item=m_BagItems.begin(); item!=m_BagItems.end(); ++item )
{
char str[16];
ZeroMemory(str,sizeof(str));
memcpy(str,item->S.Name,min(item->S.NameLen,sizeof(item->S.Name)));
if ( strcmp(name,str)==0 )
{
m_EatingItem=item->MakeIndex;
SendMsg(CM_EAT,m_EatingItem,0,0,0,str);
return true;
}
}
}
}
return false;
}
void CGameMir::AddItem(sClientItem item)
{
m_BagItems.remove_if(fCompareMakeId(item.MakeIndex));
sig_UpdateBagItem(item,false);
if(item.S.NameLen!=0 && item.MakeIndex!=0)
{
m_BagItems.push_back(item);
sig_UpdateBagItem(item,true);
}
}
itClientMagic CGameMir::FindMagic(LPCTSTR magicName)
{
for ( itClientMagic magic=m_Magics.begin(); magic!=m_Magics.end(); ++magic )
{
char str[16];
ZeroMemory(str,sizeof(str));
int len=min(magic->Def.MagicNameLen,12);
memcpy(str,magic->Def.MagicName,len);
if ( strcmp(magicName,str)==0 )
{
return magic;
}
}
return m_Magics.end();
}
void CGameMir::TakeOnItem(DWORD idx, WORD pos)
{
//if (WaitingUseItem.item!=0)
// return;
char buf[16];
WaitingUseItem.pos=pos;
WaitingUseItem.item=idx;
SendMsg(CM_TAKEONITEM,FindItem(idx)->MakeIndex,pos,0,0,GetDelphiString(FindItem(idx)->S.Name,14,buf));
AddLog(crGreen,"装备物品%s.%d\n",GetDelphiString(FindItem(idx)->S.Name,14,buf),pos);
}
void CGameMir::OnHpChange( long /*Hp*/, long /*MaxHp*/ )
{
long Hp=Self.Ability.Hp;
long MaxHp=Self.Ability.MaxHp;
if ( m_SettingMgr.HpKeeper && (GetTickCount()>m_HpProtectTime) ) // hp保护开启
{
int percent=(Hp*100)/MaxHp;
if ( percent<m_SettingMgr.HpKeepLevel) // 需要保护
{
if ( !CanEat() )
{
DelayDo(boost::bind(&CGameMir::OnHpChange,boost::ref(*this),0,0),10);
return;
}
std::string name;
char buf[32];
int len;
for ( std::map<std::string,std::pair<int,int> >::iterator pos=m_SettingMgr.m_ProtectItems.begin(); pos!=m_SettingMgr.m_ProtectItems.end(); ++pos )
{
if ( pos->second.second == 1 ) // 是hp保护物品
{
std::string name = pos->first;
for ( std::list<sClientItem>::iterator item=m_BagItems.begin(); item!=m_BagItems.end(); ++item )
{
len = min( sizeof(item->S.Name), item->S.NameLen );
memcpy(buf,item->S.Name,len);
buf[len]=static_cast<char>(0);
if ( name==buf )
{
EatItem( item->MakeIndex, buf );
AddLog(crHpProtect,"智能HP保护使用:%s 当前hp %d/%d %d%%\n",buf,Hp,MaxHp,percent);
m_HpProtectTime=GetTickCount()+pos->second.first;
DelayDo(boost::bind(&CGameMir::OnHpChange,boost::ref(*this),0,0),pos->second.first);
return;
}
}
}
}
// 需要保护 但找不到保护物品
for ( std::map<std::string,std::pair<int,int> >::iterator pos=m_SettingMgr.m_ProtectItems.begin(); pos!=m_SettingMgr.m_ProtectItems.end(); ++pos )
{
if ( pos->second.second == 1 ) // 是hp保护物品
{
std::string BinderName;
if ( m_DataManager.GetBinderName(pos->first,BinderName) )
{
for ( std::list<sClientItem>::iterator item=m_BagItems.begin(); item!=m_BagItems.end(); ++item )
{
len = min( sizeof(item->S.Name), item->S.NameLen );
memcpy(buf,item->S.Name,len);
buf[len]=static_cast<char>(0);
if ( (46-GetBagItemCount())>5 )
{
if ( BinderName==buf )
{
EatItem( item->MakeIndex, buf );
AddLog(crHpProtect,"智能HP保护解包:%s\n",buf);
//m_FrameWnd.SetTimer(TIMER_MP_PROTECT,10,NULL);
DelayDo(boost::bind(&CGameMir::OnHpChange,boost::ref(*this),0,0),10);
return;
}
}
else
{
AddLog(crHpProtect,"智能HP保护解包 :背包剩余空格不足!\n",buf);
//m_FrameWnd.SetTimer(TIMER_HP_PROTECT,10000,NULL);
DelayDo(boost::bind(&CGameMir::OnHpChange,boost::ref(*this),0,0),10);
return;
}
}
}
}
}
}
}
}
void CGameMir::OnMpChange( long Mp, long MaxMp )
{
if ( m_SettingMgr.MpKeeper && (GetTickCount()>m_MpProtectTime) ) // Mp保护开启
{
int percent=(Mp*100)/MaxMp;
if ( percent<m_SettingMgr.MpKeepLevel) // 需要保护
{
if ( !CanEat() )
{
DelayDo(boost::bind(&CGameMir::OnMpChange,boost::ref(*this),0,0),10);
//m_FrameWnd.SetTimer(TIMER_MP_PROTECT,10,NULL);
return;
}
std::string name;
char buf[32];
int len;
for ( std::map<std::string,std::pair<int,int> >::iterator pos=m_SettingMgr.m_ProtectItems.begin(); pos!=m_SettingMgr.m_ProtectItems.end(); ++pos )
{
if ( pos->second.second == 2 ) // 是Mp保护物品
{
std::string name = pos->first;
for ( std::list<sClientItem>::iterator item=m_BagItems.begin(); item!=m_BagItems.end(); ++item )
{
len = min( sizeof(item->S.Name), item->S.NameLen );
memcpy(buf,item->S.Name,len);
buf[len]=static_cast<char>(0);
if ( name==buf )
{
EatItem( item->MakeIndex, buf );
AddLog(crMpProtect,"智能MP保护使用:%s 当前Mp %d/%d %d%%\n",buf,Mp,MaxMp,percent);
m_MpProtectTime=GetTickCount()+pos->second.first;
//m_FrameWnd.SetTimer(TIMER_MP_PROTECT,pos->second.first,NULL);
DelayDo(boost::bind(&CGameMir::OnMpChange,boost::ref(*this),0,0),pos->second.first);
return;
}
}
}
}
// 需要保护 但找不到保护物品
for ( std::map<std::string,std::pair<int,int> >::iterator pos=m_SettingMgr.m_ProtectItems.begin(); pos!=m_SettingMgr.m_ProtectItems.end(); ++pos )
{
if ( pos->second.second == 2 ) // 是hp保护物品
{
std::string BinderName;
if ( m_DataManager.GetBinderName(pos->first,BinderName) )
{
for ( std::list<sClientItem>::iterator item=m_BagItems.begin(); item!=m_BagItems.end(); ++item )
{
len = min( sizeof(item->S.Name), item->S.NameLen );
memcpy(buf,item->S.Name,len);
buf[len]=static_cast<char>(0);
if ( (46-GetBagItemCount())>5 )
{
if ( BinderName==buf )
{
EatItem( item->MakeIndex, buf );
AddLog(crMpProtect,"智能MP保护解包:%s\n",buf);
DelayDo(boost::bind(&CGameMir::OnMpChange,boost::ref(*this),0,0),10);
//m_FrameWnd.SetTimer(TIMER_MP_PROTECT,10,NULL);
return;
}
}
else
{
AddLog(crMpProtect,"智能MP保护解包 :背包剩余空格不足!\n",buf);
DelayDo(boost::bind(&CGameMir::OnMpChange,boost::ref(*this),0,0),10);
//m_FrameWnd.SetTimer(TIMER_MP_PROTECT,10000,NULL);
return;
}
}
}
}
}
}
}
}
void CGameMir::OnClose(int nErrorCode)
{
AddLog(crError,"连接被关闭!\n");
Close();
CNet::OnClose(nErrorCode);
}
void CGameMir::ClickNPC(DWORD dwNpcIndex)
{
SendMsg(CM_CLICKNPC,dwNpcIndex);
}
bool CGameMir::MerchantDialogSelect(LPCTSTR cmd)
{
if(Merchant.ID==0)
return false;
SendMsg(CM_MERCHANTDLGSELECT,Merchant.ID,0,0,0,cmd);
AddLog(crMessage,"%s\n",cmd);
return true;
}
// 返回0 正常购买
// 返回1 需要详细列表
// 返回-1 失败
int CGameMir::BuyItem(LPCTSTR name, DWORD index)
{
if(Merchant.ID==0)
return -1;
for(std::vector<sMerchantItem>::iterator pos=Merchant.Items.begin();pos!=Merchant.Items.end();pos++)
{
if(pos->strName==name)
{
if(pos->bNeedDetial) // 需要获取详细列表
{
SendMsg(CM_USERGETDETAILITEM,Merchant.ID,0,0,0,name);
return 1;
}
if(pos->ciItem.S.NameLen==0) // 普通购买(卷轴药水类)
{
SendMsg(CM_USERBUYITEM,Merchant.ID,pos->iCount,0,0,name);
return 0;
}
// 带属性购买(装备类)
if(index==0||index==pos->ciItem.MakeIndex) // 不指定具体ID
{
SendMsg(CM_USERBUYITEM,Merchant.ID,LOWORD(index),HIWORD(index),0,name);
return 0;
}
}
}
return -1;
}
void CGameMir::MerchantClose()
{
Merchant.ID=0;
Merchant.OnClose();
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化