client/UserInterface/PythonNetworkStreamCommand.cpp

558 lines
17 KiB
C++
Raw Normal View History

#include "StdAfx.h"
#include "PythonNetworkStream.h"
#include "PythonNonPlayer.h"
#include "AbstractApplication.h"
#include "AbstractPlayer.h"
#include "AbstractCharacterManager.h"
#include "AbstractChat.h"
#include "InstanceBase.h"
#define ishan(ch) (((ch) & 0xE0) > 0x90)
#define ishanasc(ch) (isascii(ch) || ishan(ch))
#define ishanalp(ch) (isalpha(ch) || ishan(ch))
#define isnhdigit(ch) (!ishan(ch) && isdigit(ch))
#define isnhspace(ch) (!ishan(ch) && isspace(ch))
#define LOWER(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) + ('a' - 'A')) : (c))
#define UPPER(c) (((c) >= 'a' && (c) <= 'z') ? ((c) + ('A' - 'a')) : (c))
void SkipSpaces(char **string)
{
for (; **string != '\0' && isnhspace((unsigned char) **string); ++(*string));
}
char *OneArgument(char *argument, char *first_arg)
{
char mark = FALSE;
if (!argument)
{
*first_arg = '\0';
return NULL;
}
SkipSpaces(&argument);
while (*argument)
{
if (*argument == '\"')
{
mark = !mark;
++argument;
continue;
}
if (!mark && isnhspace((unsigned char) *argument))
break;
*(first_arg++) = LOWER(*argument);
++argument;
}
*first_arg = '\0';
SkipSpaces(&argument);
return (argument);
}
void AppendMonsterList(const CPythonNonPlayer::TMobTableList & c_rMobTableList, const char * c_szHeader, int iType)
{
DWORD dwMonsterCount = 0;
std::string strMonsterList = c_szHeader;
CPythonNonPlayer::TMobTableList::const_iterator itor = c_rMobTableList.begin();
for (; itor!=c_rMobTableList.end(); ++itor)
{
const CPythonNonPlayer::TMobTable * c_pMobTable = *itor;
if (iType == c_pMobTable->bRank)
{
if (dwMonsterCount != 0)
strMonsterList += ", ";
strMonsterList += c_pMobTable->szLocaleName;
if (++dwMonsterCount > 5)
break;
}
}
if (dwMonsterCount > 0)
{
IAbstractChat& rkChat=IAbstractChat::GetSingleton();
rkChat.AppendChat(CHAT_TYPE_INFO, strMonsterList.c_str());
}
}
bool CPythonNetworkStream::ClientCommand(const char * c_szCommand)
{
return false;
}
bool SplitToken(const char * c_szLine, CTokenVector * pstTokenVector, const char * c_szDelimeter = " ")
{
pstTokenVector->reserve(10);
pstTokenVector->clear();
std::string stToken;
std::string strLine = c_szLine;
DWORD basePos = 0;
do
{
int beginPos = strLine.find_first_not_of(c_szDelimeter, basePos);
if (beginPos < 0)
return false;
int endPos;
if (strLine[beginPos] == '"')
{
++beginPos;
endPos = strLine.find_first_of("\"", beginPos);
if (endPos < 0)
return false;
basePos = endPos + 1;
}
else
{
endPos = strLine.find_first_of(c_szDelimeter, beginPos);
basePos = endPos;
}
pstTokenVector->push_back(strLine.substr(beginPos, endPos - beginPos));
// <20>߰<EFBFBD> <20>ڵ<EFBFBD>. <20>ǵڿ<C7B5> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>츦 üũ<C3BC>Ѵ<EFBFBD>. - [levites]
if (int(strLine.find_first_not_of(c_szDelimeter, basePos)) < 0)
break;
} while (basePos < strLine.length());
return true;
}
void CPythonNetworkStream::ServerCommand(char * c_szCommand)
{
// #0000811: [M2EU] <20>ܼ<EFBFBD>â <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (strcmpi(c_szCommand, "ConsoleEnable") == 0)
return;
if (m_apoPhaseWnd[PHASE_WINDOW_GAME])
{
bool isTrue;
if (PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
"BINARY_ServerCommand_Run",
Py_BuildValue("(s)", c_szCommand),
&isTrue
))
{
if (isTrue)
return;
}
}
else if (m_poSerCommandParserWnd)
{
bool isTrue;
if (PyCallClassMemberFunc(m_poSerCommandParserWnd,
"BINARY_ServerCommand_Run",
Py_BuildValue("(s)", c_szCommand),
&isTrue
))
{
if (isTrue)
return;
}
}
CTokenVector TokenVector;
if (!SplitToken(c_szCommand, &TokenVector))
return;
if (TokenVector.empty())
return;
const char * szCmd = TokenVector[0].c_str();
if (!strcmpi(szCmd, "quit"))
{
PostQuitMessage(0);
}
else if (!strcmpi(szCmd, "BettingMoney"))
{
if (2 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
//UINT uMoney= atoi(TokenVector[1].c_str());
}
// GIFT NOTIFY
else if (!strcmpi(szCmd, "gift"))
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "Gift_Show", Py_BuildValue("()"));
}
// CUBE
else if (!strcmpi(szCmd, "cube"))
{
if (TokenVector.size() < 2)
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
if ("open" == TokenVector[1])
{
if (3 > TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
DWORD npcVNUM = (DWORD)atoi(TokenVector[2].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Open", Py_BuildValue("(i)", npcVNUM));
}
else if ("close" == TokenVector[1])
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Close", Py_BuildValue("()"));
}
else if ("info" == TokenVector[1])
{
if (5 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
UINT gold = atoi(TokenVector[2].c_str());
UINT itemVnum = atoi(TokenVector[3].c_str());
UINT count = atoi(TokenVector[4].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_UpdateInfo", Py_BuildValue("(iii)", gold, itemVnum, count));
}
else if ("success" == TokenVector[1])
{
if (4 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
UINT itemVnum = atoi(TokenVector[2].c_str());
UINT count = atoi(TokenVector[3].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Succeed", Py_BuildValue("(ii)", itemVnum, count));
}
else if ("fail" == TokenVector[1])
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Failed", Py_BuildValue("()"));
}
else if ("r_list" == TokenVector[1])
{
// result list (/cube r_list npcVNUM resultCount resultText)
// 20383 4 72723,1/72725,1/72730.1/50001,5 <- <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "/" <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD>е<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>
if (5 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, 5);
return;
}
DWORD npcVNUM = (DWORD)atoi(TokenVector[2].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_ResultList", Py_BuildValue("(is)", npcVNUM, TokenVector[4].c_str()));
}
else if ("m_info" == TokenVector[1])
{
// material list (/cube m_info requestStartIndex resultCount MaterialText)
// ex) requestStartIndex: 0, resultCount : 5 - <20>ش<EFBFBD> NPC<50><43> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 0~4<><34>°<EFBFBD><C2B0> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MaterialText<78><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ټ<EFBFBD><D9BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "@" <20><><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD>
// 0 5 125,1|126,2|127,2|123,5&555,5&555,4/120000 <- <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>
if (5 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, 5);
return;
}
UINT requestStartIndex = (UINT)atoi(TokenVector[2].c_str());
UINT resultCount = (UINT)atoi(TokenVector[3].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_MaterialInfo", Py_BuildValue("(iis)", requestStartIndex, resultCount, TokenVector[4].c_str()));
}
}
// CUEBE_END
else if (!strcmpi(szCmd, "ObserverCount"))
{
if (2 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
UINT uObserverCount= atoi(TokenVector[1].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
"BINARY_BettingGuildWar_UpdateObserverCount",
Py_BuildValue("(i)", uObserverCount)
);
}
else if (!strcmpi(szCmd, "ObserverMode"))
{
if (2 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
UINT uMode= atoi(TokenVector[1].c_str());
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
rkPlayer.SetObserverMode(uMode ? true : false);
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
"BINARY_BettingGuildWar_SetObserverMode",
Py_BuildValue("(i)", uMode)
);
}
else if (!strcmpi(szCmd, "ObserverTeamInfo"))
{
}
else if (!strcmpi(szCmd, "StoneDetect"))
{
if (4 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
// vid distance(1-3) angle(0-360)
DWORD dwVID = atoi(TokenVector[1].c_str());
BYTE byDistance = atoi(TokenVector[2].c_str());
float fAngle = atof(TokenVector[3].c_str());
fAngle = fmod(540.0f - fAngle, 360.0f);
Tracef("StoneDetect [VID:%d] [Distance:%d] [Angle:%d->%f]\n", dwVID, byDistance, atoi(TokenVector[3].c_str()), fAngle);
IAbstractCharacterManager& rkChrMgr=IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(dwVID);
if (!pInstance)
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Not Exist Instance", c_szCommand);
return;
}
TPixelPosition PixelPosition;
D3DXVECTOR3 v3Rotation(0.0f, 0.0f, fAngle);
pInstance->NEW_GetPixelPosition(&PixelPosition);
PixelPosition.y *= -1.0f;
switch (byDistance)
{
case 0:
CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/firecracker/find_out.mse");
CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/firecracker/find_out.mse", PixelPosition, v3Rotation);
break;
case 1:
CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_small.mse");
CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_small.mse", PixelPosition, v3Rotation);
break;
case 2:
CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_middle.mse");
CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_middle.mse", PixelPosition, v3Rotation);
break;
case 3:
CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_large.mse");
CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_large.mse", PixelPosition, v3Rotation);
break;
default:
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Distance", c_szCommand);
break;
}
#ifdef _DEBUG
IAbstractChat& rkChat=IAbstractChat::GetSingleton();
rkChat.AppendChat(CHAT_TYPE_INFO, c_szCommand);
#endif
}
else if (!strcmpi(szCmd, "StartStaminaConsume"))
{
if (3 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
DWORD dwConsumePerSec = atoi(TokenVector[1].c_str());
DWORD dwCurrentStamina = atoi(TokenVector[2].c_str());
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
rPlayer.StartStaminaConsume(dwConsumePerSec, dwCurrentStamina);
}
else if (!strcmpi(szCmd, "StopStaminaConsume"))
{
if (2 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, TokenVector.size());
return;
}
DWORD dwCurrentStamina = atoi(TokenVector[1].c_str());
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
rPlayer.StopStaminaConsume(dwCurrentStamina);
}
else if (!strcmpi(szCmd, "sms"))
{
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
rPlayer.SetMobileFlag(TRUE);
}
else if (!strcmpi(szCmd, "nosms"))
{
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
rPlayer.SetMobileFlag(FALSE);
}
else if (!strcmpi(szCmd, "mobile_auth"))
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnMobileAuthority", Py_BuildValue("()"));
}
else if (!strcmpi(szCmd, "messenger_auth"))
{
const std::string & c_rstrName = TokenVector[1].c_str();
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnMessengerAddFriendQuestion", Py_BuildValue("(s)", c_rstrName.c_str()));
}
else if (!strcmpi(szCmd, "combo"))
{
int iFlag = atoi(TokenVector[1].c_str());
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
rPlayer.SetComboSkillFlag(iFlag);
m_bComboSkillFlag = iFlag ? true : false;
}
else if (!strcmpi(szCmd, "setblockmode"))
{
int iFlag = atoi(TokenVector[1].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnBlockMode", Py_BuildValue("(i)", iFlag));
}
// Emotion Start
else if (!strcmpi(szCmd, "french_kiss"))
{
int iVID1 = atoi(TokenVector[1].c_str());
int iVID2 = atoi(TokenVector[2].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance1 = rkChrMgr.GetInstancePtr(iVID1);
CInstanceBase * pInstance2 = rkChrMgr.GetInstancePtr(iVID2);
if (pInstance1 && pInstance2)
pInstance1->ActDualEmotion(*pInstance2, CRaceMotionData::NAME_FRENCH_KISS_START, CRaceMotionData::NAME_FRENCH_KISS_START);
}
else if (!strcmpi(szCmd, "kiss"))
{
int iVID1 = atoi(TokenVector[1].c_str());
int iVID2 = atoi(TokenVector[2].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance1 = rkChrMgr.GetInstancePtr(iVID1);
CInstanceBase * pInstance2 = rkChrMgr.GetInstancePtr(iVID2);
if (pInstance1 && pInstance2)
pInstance1->ActDualEmotion(*pInstance2, CRaceMotionData::NAME_KISS_START, CRaceMotionData::NAME_KISS_START);
}
else if (!strcmpi(szCmd, "slap"))
{
int iVID1 = atoi(TokenVector[1].c_str());
int iVID2 = atoi(TokenVector[2].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance1 = rkChrMgr.GetInstancePtr(iVID1);
CInstanceBase * pInstance2 = rkChrMgr.GetInstancePtr(iVID2);
if (pInstance1 && pInstance2)
pInstance1->ActDualEmotion(*pInstance2, CRaceMotionData::NAME_SLAP_HURT_START, CRaceMotionData::NAME_SLAP_HIT_START);
}
else if (!strcmpi(szCmd, "clap"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_CLAP);
}
else if (!strcmpi(szCmd, "cheer1"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_CHEERS_1);
}
else if (!strcmpi(szCmd, "cheer2"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_CHEERS_2);
}
else if (!strcmpi(szCmd, "dance1"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_DANCE_1);
}
else if (!strcmpi(szCmd, "dance2"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_DANCE_2);
}
else if (!strcmpi(szCmd, "dig_motion"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_DIG);
}
// Emotion End
else
{
static std::map<std::string, int> s_emotionDict;
static bool s_isFirst = true;
if (s_isFirst)
{
s_isFirst = false;
s_emotionDict["dance3"] = CRaceMotionData::NAME_DANCE_3;
s_emotionDict["dance4"] = CRaceMotionData::NAME_DANCE_4;
s_emotionDict["dance5"] = CRaceMotionData::NAME_DANCE_5;
s_emotionDict["dance6"] = CRaceMotionData::NAME_DANCE_6;
s_emotionDict["congratulation"] = CRaceMotionData::NAME_CONGRATULATION;
s_emotionDict["forgive"] = CRaceMotionData::NAME_FORGIVE;
s_emotionDict["angry"] = CRaceMotionData::NAME_ANGRY;
s_emotionDict["attractive"] = CRaceMotionData::NAME_ATTRACTIVE;
s_emotionDict["sad"] = CRaceMotionData::NAME_SAD;
s_emotionDict["shy"] = CRaceMotionData::NAME_SHY;
s_emotionDict["cheerup"] = CRaceMotionData::NAME_CHEERUP;
s_emotionDict["banter"] = CRaceMotionData::NAME_BANTER;
s_emotionDict["joy"] = CRaceMotionData::NAME_JOY;
}
std::map<std::string, int>::iterator f = s_emotionDict.find(szCmd);
if (f == s_emotionDict.end())
{
TraceError("Unknown Server Command %s | %s", c_szCommand, szCmd);
}
else
{
int emotionIndex = f->second;
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(emotionIndex);
}
}
}