client/UserInterface/PythonNetworkStreamCommand.cpp

558 lines
17 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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