292 lines
7.4 KiB
C++
292 lines
7.4 KiB
C++
#include "StdAfx.h"
|
|
#include "PythonNetworkStream.h"
|
|
#include "Packet.h"
|
|
|
|
extern DWORD g_adwEncryptKey[4];
|
|
extern DWORD g_adwDecryptKey[4];
|
|
|
|
// Select Character ---------------------------------------------------------------------------
|
|
void CPythonNetworkStream::SetSelectPhase()
|
|
{
|
|
if ("Select" != m_strPhase)
|
|
m_phaseLeaveFunc.Run();
|
|
|
|
Tracen("");
|
|
Tracen("## Network - Select Phase ##");
|
|
Tracen("");
|
|
|
|
m_strPhase = "Select";
|
|
|
|
m_dwChangingPhaseTime = ELTimer_GetMSec();
|
|
m_phaseProcessFunc.Set(this, &CPythonNetworkStream::SelectPhase);
|
|
m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveSelectPhase);
|
|
|
|
if (__DirectEnterMode_IsSet())
|
|
{
|
|
PyCallClassMemberFunc(m_poHandler, "SetLoadingPhase", Py_BuildValue("()"));
|
|
}
|
|
else
|
|
{
|
|
if (IsSelectedEmpire())
|
|
PyCallClassMemberFunc(m_poHandler, "SetSelectCharacterPhase", Py_BuildValue("()"));
|
|
else
|
|
PyCallClassMemberFunc(m_poHandler, "SetSelectEmpirePhase", Py_BuildValue("()"));
|
|
}
|
|
}
|
|
|
|
void CPythonNetworkStream::SelectPhase()
|
|
{
|
|
TPacketHeader header;
|
|
|
|
if (!CheckPacket(&header))
|
|
return;
|
|
|
|
switch (header)
|
|
{
|
|
case HEADER_GC_PHASE:
|
|
if (RecvPhasePacket())
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_EMPIRE:
|
|
if (__RecvEmpirePacket())
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_LOGIN_SUCCESS3:
|
|
if (__RecvLoginSuccessPacket3())
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_LOGIN_SUCCESS4:
|
|
if (__RecvLoginSuccessPacket4())
|
|
return;
|
|
break;
|
|
|
|
|
|
case HEADER_GC_PLAYER_CREATE_SUCCESS:
|
|
if (__RecvPlayerCreateSuccessPacket())
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_PLAYER_CREATE_FAILURE:
|
|
if (__RecvPlayerCreateFailurePacket())
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_PLAYER_DELETE_WRONG_SOCIAL_ID:
|
|
if (__RecvPlayerDestroyFailurePacket())
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_PLAYER_DELETE_SUCCESS:
|
|
if (__RecvPlayerDestroySuccessPacket())
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_CHANGE_NAME:
|
|
if (__RecvChangeName())
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_HANDSHAKE:
|
|
RecvHandshakePacket();
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_HANDSHAKE_OK:
|
|
RecvHandshakeOKPacket();
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_HYBRIDCRYPT_KEYS:
|
|
RecvHybridCryptKeyPacket();
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_HYBRIDCRYPT_SDB:
|
|
RecvHybridCryptSDBPacket();
|
|
return;
|
|
break;
|
|
|
|
case HEADER_GC_PLAYER_POINT_CHANGE:
|
|
TPacketGCPointChange PointChange;
|
|
Recv(sizeof(TPacketGCPointChange), &PointChange);
|
|
return;
|
|
break;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
case HEADER_GC_PING:
|
|
if (RecvPingPacket())
|
|
return;
|
|
break;
|
|
}
|
|
|
|
RecvErrorPacket(header);
|
|
}
|
|
|
|
bool CPythonNetworkStream::SendSelectEmpirePacket(DWORD dwEmpireID)
|
|
{
|
|
TPacketCGEmpire kPacketEmpire;
|
|
kPacketEmpire.bHeader=HEADER_CG_EMPIRE;
|
|
kPacketEmpire.bEmpire=dwEmpireID;
|
|
|
|
if (!Send(sizeof(kPacketEmpire), &kPacketEmpire))
|
|
{
|
|
Tracen("SendSelectEmpirePacket - Error");
|
|
return false;
|
|
}
|
|
|
|
SetEmpireID(dwEmpireID);
|
|
return SendSequence();
|
|
}
|
|
|
|
bool CPythonNetworkStream::SendSelectCharacterPacket(BYTE Index)
|
|
{
|
|
TPacketCGSelectCharacter SelectCharacterPacket;
|
|
|
|
SelectCharacterPacket.header = HEADER_CG_PLAYER_SELECT;
|
|
SelectCharacterPacket.player_index = Index;
|
|
|
|
if (!Send(sizeof(TPacketCGSelectCharacter), &SelectCharacterPacket))
|
|
{
|
|
Tracen("SendSelectCharacterPacket - Error");
|
|
return false;
|
|
}
|
|
|
|
return SendSequence();
|
|
}
|
|
|
|
bool CPythonNetworkStream::SendDestroyCharacterPacket(BYTE index, const char * szPrivateCode)
|
|
{
|
|
TPacketCGDestroyCharacter DestroyCharacterPacket;
|
|
|
|
DestroyCharacterPacket.header = HEADER_CG_PLAYER_DESTROY;
|
|
DestroyCharacterPacket.index = index;
|
|
strncpy(DestroyCharacterPacket.szPrivateCode, szPrivateCode, PRIVATE_CODE_LENGTH-1);
|
|
|
|
if (!Send(sizeof(TPacketCGDestroyCharacter), &DestroyCharacterPacket))
|
|
{
|
|
Tracen("SendDestroyCharacterPacket");
|
|
return false;
|
|
}
|
|
|
|
return SendSequence();
|
|
}
|
|
|
|
bool CPythonNetworkStream::SendCreateCharacterPacket(BYTE index, const char *name, BYTE job, BYTE shape, BYTE byCON, BYTE byINT, BYTE bySTR, BYTE byDEX)
|
|
{
|
|
TPacketCGCreateCharacter createCharacterPacket;
|
|
|
|
createCharacterPacket.header = HEADER_CG_PLAYER_CREATE;
|
|
createCharacterPacket.index = index;
|
|
strncpy(createCharacterPacket.name, name, CHARACTER_NAME_MAX_LEN);
|
|
createCharacterPacket.job = job;
|
|
createCharacterPacket.shape = shape;
|
|
createCharacterPacket.CON = byCON;
|
|
createCharacterPacket.INT = byINT;
|
|
createCharacterPacket.STR = bySTR;
|
|
createCharacterPacket.DEX = byDEX;
|
|
|
|
if (!Send(sizeof(TPacketCGCreateCharacter), &createCharacterPacket))
|
|
{
|
|
Tracen("Failed to SendCreateCharacterPacket");
|
|
return false;
|
|
}
|
|
|
|
return SendSequence();
|
|
}
|
|
|
|
bool CPythonNetworkStream::SendChangeNamePacket(BYTE index, const char *name)
|
|
{
|
|
TPacketCGChangeName ChangeNamePacket;
|
|
ChangeNamePacket.header = HEADER_CG_CHANGE_NAME;
|
|
ChangeNamePacket.index = index;
|
|
strncpy(ChangeNamePacket.name, name, CHARACTER_NAME_MAX_LEN);
|
|
|
|
if (!Send(sizeof(TPacketCGChangeName), &ChangeNamePacket))
|
|
{
|
|
Tracen("Failed to SendChangeNamePacket");
|
|
return false;
|
|
}
|
|
|
|
return SendSequence();
|
|
}
|
|
|
|
bool CPythonNetworkStream::__RecvPlayerCreateSuccessPacket()
|
|
{
|
|
TPacketGCPlayerCreateSuccess kCreateSuccessPacket;
|
|
|
|
if (!Recv(sizeof(kCreateSuccessPacket), &kCreateSuccessPacket))
|
|
return false;
|
|
|
|
if (kCreateSuccessPacket.bAccountCharacterSlot>=PLAYER_PER_ACCOUNT4)
|
|
{
|
|
TraceError("CPythonNetworkStream::RecvPlayerCreateSuccessPacket - OUT OF RANGE SLOT(%d) > PLATER_PER_ACCOUNT(%d)",
|
|
kCreateSuccessPacket.bAccountCharacterSlot, PLAYER_PER_ACCOUNT4);
|
|
return true;
|
|
}
|
|
|
|
m_akSimplePlayerInfo[kCreateSuccessPacket.bAccountCharacterSlot]=kCreateSuccessPacket.kSimplePlayerInfomation;
|
|
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_CREATE], "OnCreateSuccess", Py_BuildValue("()"));
|
|
return true;
|
|
}
|
|
|
|
bool CPythonNetworkStream::__RecvPlayerCreateFailurePacket()
|
|
{
|
|
TPacketGCCreateFailure packet;
|
|
|
|
if (!Recv(sizeof(TPacketGCCreateFailure), &packet))
|
|
return false;
|
|
|
|
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_CREATE], "OnCreateFailure", Py_BuildValue("(i)", packet.bType));
|
|
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_SELECT], "OnCreateFailure", Py_BuildValue("(i)", packet.bType));
|
|
return true;
|
|
}
|
|
|
|
bool CPythonNetworkStream::__RecvPlayerDestroySuccessPacket()
|
|
{
|
|
TPacketGCDestroyCharacterSuccess packet;
|
|
if (!Recv(sizeof(TPacketGCDestroyCharacterSuccess), &packet))
|
|
return false;
|
|
|
|
memset(&m_akSimplePlayerInfo[packet.account_index], 0, sizeof(m_akSimplePlayerInfo[packet.account_index]));
|
|
m_adwGuildID[packet.account_index] = 0;
|
|
m_astrGuildName[packet.account_index] = "";
|
|
|
|
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_SELECT], "OnDeleteSuccess", Py_BuildValue("(i)", packet.account_index));
|
|
return true;
|
|
}
|
|
|
|
bool CPythonNetworkStream::__RecvPlayerDestroyFailurePacket()
|
|
{
|
|
TPacketGCBlank packet_blank;
|
|
if (!Recv(sizeof(TPacketGCBlank), &packet_blank))
|
|
return false;
|
|
|
|
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_SELECT], "OnDeleteFailure", Py_BuildValue("()"));
|
|
return true;
|
|
}
|
|
|
|
bool CPythonNetworkStream::__RecvChangeName()
|
|
{
|
|
TPacketGCChangeName ChangeNamePacket;
|
|
if (!Recv(sizeof(TPacketGCChangeName), &ChangeNamePacket))
|
|
return false;
|
|
|
|
for (int i = 0; i < PLAYER_PER_ACCOUNT4; ++i)
|
|
{
|
|
if (ChangeNamePacket.pid == m_akSimplePlayerInfo[i].dwID)
|
|
{
|
|
m_akSimplePlayerInfo[i].bChangeName = FALSE;
|
|
strncpy(m_akSimplePlayerInfo[i].szName, ChangeNamePacket.name, CHARACTER_NAME_MAX_LEN);
|
|
|
|
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_SELECT], "OnChangeName", Py_BuildValue("(is)", i, ChangeNamePacket.name));
|
|
return true;
|
|
}
|
|
}
|
|
|
|
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_SELECT], "OnCreateFailure", Py_BuildValue("(i)", 100));
|
|
return true;
|
|
}
|