Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
8225 lines
242 KiB
C++
8225 lines
242 KiB
C++
// Network.cpp: implementation of the CNetwork class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
//#include <crtdbg.h>
|
|
#include "Network.h"
|
|
#include "Network\Packet\PacketCommand.h"
|
|
#include "Network\Packet\PacketStruct\ServerInfo.h"
|
|
#include "ClientMain.h"
|
|
#include <CharacterControl.h>
|
|
#include "GUITextEdit.h"
|
|
#include "GUITooltipItem.h"
|
|
#include "DataTable.h"
|
|
#include "GUIMessageBox.h"
|
|
#include "GUIMessageBoxManager.h"
|
|
#include "SkillSystem.h"
|
|
#include "HumanVault.h"
|
|
#include "HumanStreetStall.h"
|
|
|
|
#include "Item\ItemMgr.h"
|
|
#include "Item\ItemFactory.h"
|
|
#include "Skill\SkillMgr.h"
|
|
#include "Creature\Monster\MonsterMgr.h"
|
|
|
|
#define CLIENT_VERSION 1
|
|
|
|
ClientSocket *CNetwork::m_pSocket;
|
|
|
|
NetworkState CNetwork::m_nsNetworkStateforCastObject;
|
|
NetworkState CNetwork::m_nsNetworkState;
|
|
unsigned long CNetwork::m_dwNetworkError;
|
|
long CNetwork::m_lShoutCounter;
|
|
long CNetwork::m_lFameInfoCounter;
|
|
long CNetwork::m_lPartyFindCounter;
|
|
long CNetwork::m_lPartyCmdCounter;
|
|
long CNetwork::m_lSetSkillCounter;
|
|
|
|
// chant, enchant 시전 effect add 시켜주는 함수
|
|
// lpUseCreature : 이 스킬을 쓴 CCreature pointer
|
|
|
|
static void SetHitEffect(AtType &pAtType, CCreature *lpCreature,CCreature *lpUseCreature,int iDIndex)
|
|
{
|
|
const Skill::ProtoType *lpSkillTypeTemp = g_SkillMgr.GetSkillProtoType(pAtType.m_wType);
|
|
if(lpSkillTypeTemp)
|
|
{
|
|
const Skill::ProtoType *lpSkillType = &lpSkillTypeTemp[pAtType.m_cSkillLockCount];
|
|
if(lpSkillType)
|
|
{
|
|
if(lpSkillType->m_eSkillType == Skill::Type::CHANT)
|
|
{
|
|
if(strcmp(lpSkillType->m_szEffectFileName, ""))
|
|
{
|
|
// Chant 시전 effect
|
|
float fChrDir = lpCreature->m_fDirection;
|
|
fChrDir = -fChrDir;
|
|
fChrDir -= FLOAT_PHI / 2.0f;
|
|
|
|
vector3 vecChrToward;
|
|
vecChrToward.x = cosf(fChrDir);
|
|
vecChrToward.z = sinf(fChrDir);
|
|
vecChrToward.y = 0.0f;
|
|
vecChrToward.Normalize();
|
|
|
|
|
|
CEffScript *test_script;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
test_script = new CEffScript;
|
|
if(g_CharacterData.GetClientType(lpCreature->m_dwChrID, TRUE) == CT_MONSTER && lpCreature->GetChantFlag(17))
|
|
{
|
|
test_script->GetScriptBinData((char *)lpSkillType->m_szEffectFileName, false);
|
|
} else
|
|
{
|
|
test_script->GetScriptBinData((char *)lpSkillType->m_szEffectFileName, true);
|
|
}
|
|
test_script->SetStartPos(lpCreature->m_vecPos.x, lpCreature->m_vecPos.y, lpCreature->m_vecPos.z);
|
|
test_script->SetEndPos((D3DXVECTOR3 *)&lpCreature->m_vecPos, 1);
|
|
test_script->SetChant(true);
|
|
test_script->SetPlayer(lpCreature,lpCreature->m_dwChrID);
|
|
test_script->SetChr(lpCreature->m_lpChrModel,lpCreature->m_lpChrModel);
|
|
test_script->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
|
|
if(g_ClientMain.m_csStatus.CheckPartyMember(lpCreature->m_dwChrID) || lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
test_script->SetMine(true);
|
|
} else
|
|
{
|
|
test_script->SetMine(false);
|
|
}
|
|
CSceneManager::m_EffectManager.AddEffScript(test_script);
|
|
//
|
|
}
|
|
} else // 2차 Skill 이팩트
|
|
{
|
|
|
|
|
|
if(strcmp(lpSkillType->m_szHitFileName, ""))
|
|
{
|
|
if((strstr(lpSkillType->m_szHitFileName,"E_Lightning") != NULL) || iDIndex != 0) { // 처음 타겟팅 된 몹이 아닐때
|
|
|
|
CEffScript *test_script;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
test_script = new CEffScript;
|
|
if(g_CharacterData.GetClientType(lpCreature->m_dwChrID, TRUE) == CT_MONSTER && lpCreature->GetChantFlag(17))
|
|
{
|
|
test_script->GetScriptBinData((char *)lpSkillType->m_szHitFileName, false);
|
|
} else
|
|
{
|
|
test_script->GetScriptBinData((char *)lpSkillType->m_szHitFileName, true);
|
|
}
|
|
|
|
//if(lpUseCreature != NULL && (strstr(lpSkillType->m_szHitFileName,"E_Lightning") != NULL)) {
|
|
|
|
if(lpUseCreature != NULL &&
|
|
( (strstr(lpSkillType->m_szHitFileName,"E_Lightning") != NULL) || // lightning
|
|
(strstr(lpSkillType->m_szHitFileName,"E_Grease") != NULL) || // 그리스
|
|
(strstr(lpSkillType->m_szHitFileName,"E_Entangle") != NULL) || // 인텡글
|
|
(strstr(lpSkillType->m_szHitFileName,"E_LSTRENGTH") != NULL) || // 로우어 스트렝스
|
|
(strstr(lpSkillType->m_szHitFileName,"E_A_Rot") != NULL) || // 랏
|
|
(strstr(lpSkillType->m_szHitFileName,"E_A_Shock") != NULL) || // 쇼크
|
|
(strstr(lpSkillType->m_szHitFileName,"E_A_Root") != NULL) || // 루트
|
|
(strstr(lpSkillType->m_szHitFileName,"E_CureWounds") != NULL) || // 큐어운즈
|
|
(strstr(lpSkillType->m_szHitFileName,"E_purification") != NULL) || // 퓨리피 케이션
|
|
(strstr(lpSkillType->m_szHitFileName,"E_Dispel") != NULL) // 디스펠
|
|
)) {
|
|
// 광역 effect (쏜사람 존재할때)
|
|
float fChrDir = lpUseCreature->m_fDirection;
|
|
fChrDir = -fChrDir;
|
|
fChrDir -= FLOAT_PHI / 2.0f;
|
|
|
|
vector3 vecChrToward;
|
|
vecChrToward.x = cosf(fChrDir);
|
|
vecChrToward.z = sinf(fChrDir);
|
|
vecChrToward.y = 0.0f;
|
|
vecChrToward.Normalize();
|
|
|
|
test_script->SetStartPos(lpUseCreature->m_vecPos.x,lpUseCreature->m_vecPos.y,lpUseCreature->m_vecPos.z);
|
|
test_script->SetPlayer(lpUseCreature,lpUseCreature->m_dwChrID);
|
|
test_script->SetChr(lpUseCreature->m_lpChrModel,lpCreature->m_lpChrModel);
|
|
test_script->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
|
|
|
|
if(lpUseCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
LPEffectNode lpEffect;
|
|
lpEffect = new EffectNode;
|
|
lpEffect->m_lpEffect = test_script;
|
|
lpEffect->m_dwTargetID = lpCreature->m_dwChrID;
|
|
g_SkillSystem.m_lstEffect.push_back(lpEffect);
|
|
}
|
|
} else
|
|
{
|
|
float fChrDir = lpCreature->m_fDirection;
|
|
fChrDir = -fChrDir;
|
|
fChrDir -= FLOAT_PHI / 2.0f;
|
|
|
|
vector3 vecChrToward;
|
|
vecChrToward.x = cosf(fChrDir);
|
|
vecChrToward.z = sinf(fChrDir);
|
|
vecChrToward.y = 0.0f;
|
|
vecChrToward.Normalize();
|
|
|
|
test_script->SetStartPos(lpCreature->m_vecPos.x, lpCreature->m_vecPos.y, lpCreature->m_vecPos.z);
|
|
test_script->SetPlayer(lpCreature,lpCreature->m_dwChrID);
|
|
test_script->SetChr(lpCreature->m_lpChrModel,lpCreature->m_lpChrModel);
|
|
test_script->SetChrFwd(-vecChrToward.x,-vecChrToward.y,-vecChrToward.z);
|
|
}
|
|
test_script->SetEndPos(lpCreature->m_vecPos.x,lpCreature->m_vecPos.y,lpCreature->m_vecPos.z);
|
|
if(g_ClientMain.m_csStatus.CheckPartyMember(lpCreature->m_dwChrID) || lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
test_script->SetMine(true);
|
|
} else
|
|
{
|
|
test_script->SetMine(false);
|
|
}
|
|
|
|
CSceneManager::m_EffectManager.AddEffScript(test_script);
|
|
} // if(iDIndex != 0)
|
|
} // if(strcmp(lpSkillType->m_szHitFileName, ""))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CNetwork::CNetwork()
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
m_nsNetworkStateforCastObject = NS_NOWAITING;
|
|
m_bLoginSuccess = FALSE;
|
|
m_bUpdateAddressPacket = TRUE;
|
|
m_bCompleteDeposit = FALSE;
|
|
m_bCharLoginSuccess = FALSE;
|
|
|
|
m_lUDPPacketTotalByte = m_lUDPPacketOldByte = 0;
|
|
m_lTCPPacketTotalByte = m_lTCPPacketOldByte = 0;
|
|
|
|
m_lShoutCounter = 0;
|
|
m_lFameInfoCounter = 0;
|
|
m_lPartyFindCounter = 0;
|
|
m_lSetSkillCounter = 0;
|
|
}
|
|
|
|
CNetwork::~CNetwork()
|
|
{
|
|
if(m_pSocket) { delete m_pSocket; m_pSocket = NULL; }
|
|
}
|
|
|
|
BOOL CNetwork::Create(HWND hWnd)
|
|
{
|
|
m_pSocket = new ClientSocket(hWnd);
|
|
if(m_pSocket == NULL) return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CNetwork::ConnectToGameServer(char *strServerIP)
|
|
{
|
|
m_nsNetworkState = NS_CONNECTGAMESERVER;
|
|
|
|
if(m_pSocket->ConnectToGameServer(strServerIP))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ConnectToAuthServer(char *strServerIP)
|
|
{
|
|
m_nsNetworkState = NS_CONNECTAUTHSERVER;
|
|
|
|
if(m_pSocket->ConnectToAuthServer(strServerIP))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::Login(void)
|
|
{
|
|
g_ClientMain.m_csStatus.Destroy();
|
|
|
|
if(m_nsNetworkState == NS_CONNECTAUTHSERVER)
|
|
{
|
|
m_nsNetworkState = NS_USERLOGIN;
|
|
|
|
m_pSocket->UserLogin(g_ClientMain.m_dwSessionID, g_ClientMain.m_dwUserID, g_ClientMain.m_dwServerID, g_ClientMain.m_dwVersion);
|
|
// m_pSocket->UserLogin(g_ClientMain.m_dwUserID, g_ClientMain.m_dwServerID, (void*)g_ClientMain.m_dwServerPointer);
|
|
} else if(m_nsNetworkState == NS_SERVERMOVE)
|
|
{
|
|
m_nsNetworkState = NS_CHARLOGIN;
|
|
|
|
m_pSocket->CharLogin(g_ClientMain.m_dwUserID, g_ClientMain.m_scLoginChar[g_ClientMain.m_dwSelectChr].UID, g_ClientMain.m_dwSessionID);
|
|
// m_pSocket->CharLogin(g_ClientMain.m_dwUserID, g_ClientMain.m_dwMyChrID, m_pSocket->GetRegPointer());
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CNetwork::CharSelect(unsigned long dwChrID)
|
|
{
|
|
m_nsNetworkState = NS_CHARSELECT;
|
|
|
|
if(m_pSocket->CharSelect(g_ClientMain.m_dwUserID, dwChrID))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
void CNetwork::PacketProcess(LPARAM lParam, BOOL bUDP)
|
|
{
|
|
switch(WSAGETSELECTEVENT(lParam))
|
|
{
|
|
case FD_CONNECT:
|
|
Login();
|
|
break;
|
|
|
|
case FD_READ:
|
|
PacketProcess(bUDP);
|
|
break;
|
|
|
|
case FD_CLOSE:
|
|
MessageBox(NULL, g_StringTable.m_strString[270], g_StringTable.m_strString[21], MB_OK);
|
|
SendMessage(g_ClientMain.m_hWnd, WM_DESTROY, 0, 0);
|
|
g_ClientMain.m_dwClientMode = CLIENT_END;
|
|
/* CGUIMessageBox *lpMessageBox;
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create("접속이 끊겼습니다.", MB_EXIT | MB_CONFIRM);*/
|
|
break;
|
|
}
|
|
|
|
switch(WSAGETSELECTERROR(lParam))
|
|
{
|
|
case WSAENETDOWN:
|
|
break;
|
|
|
|
case WSAECONNREFUSED:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CNetwork::PacketProcess(BOOL bUDP)
|
|
{
|
|
unsigned long dwError;
|
|
bool bRecv = false;
|
|
int nRecv;
|
|
|
|
if(bUDP)
|
|
{
|
|
m_pSocket->UDPRecv();
|
|
}
|
|
else
|
|
{
|
|
m_pSocket->Recv();
|
|
}
|
|
|
|
while((bUDP ? nRecv = m_pSocket->PutUDPRecvBufferToPtBuffer(m_aryBuffer, BUFFERSIZE) : nRecv = m_pSocket->PutRecvBufferToPtBuffer(m_aryBuffer, BUFFERSIZE)))
|
|
{
|
|
if(bUDP)
|
|
{
|
|
m_lUDPPacketTotalByte += nRecv;
|
|
} else
|
|
{
|
|
m_lTCPPacketTotalByte += nRecv;
|
|
}
|
|
m_cNetworkPacketCommand = ((LPPktBase)m_aryBuffer)->GetCmd();
|
|
switch(m_cNetworkPacketCommand)
|
|
{
|
|
case CmdUserLogin:
|
|
if(!ParseUserLogin(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharSelect:
|
|
if(!ParseCharSelect(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharLogin:
|
|
if(!ParseCharLogin(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharCreate:
|
|
if(!ParseCharCreate(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharDelete:
|
|
if(!ParseCharDelete(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharUpdateAddress:
|
|
if(!ParseCharUpdateAddress(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharMove:
|
|
// if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_ZONEMOVE && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharMove(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharCellLogin:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharCellLogin(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharCellLogout:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharCellLogout(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharAddressInfo:
|
|
// if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_ZONEMOVE && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharAddressInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharChat:
|
|
if(!ParseCharChat(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdMonMove:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseMonMove(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharAttack:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharAttack(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharRespawn:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharRespawn(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharAttackInfo:
|
|
// if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_ZONEMOVE && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharAttackInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdGameCellInfo:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseGameCellInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharPullDown:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharPullDown(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharPullDownInfo:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharPullDownInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharPickUp:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharPickUp(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharPickUpInfo:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharPickUpInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharAttacked:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharAttacked(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharTakeItem:
|
|
if(!ParseCharTakeItem(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharSwapItem:
|
|
if(!ParseCharSwapItem(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharTradeItem:
|
|
if(!ParseCharTradeItem(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharShapeInfo:
|
|
// if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_ZONEMOVE && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharShapeInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharPartyCmd:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharPartyCmd(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharPartyInfo:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharPartyInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharUseItem:
|
|
if(!ParseCharUseItem(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharSkillLock:
|
|
if(!ParseCharSkillLock(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharSkillErase:
|
|
if(!ParseCharSkillErase(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharSkillCreate:
|
|
if(!ParseCharSkillCreate(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharRepairItem:
|
|
if(!ParseCharRepairItem(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharInstallSocket:
|
|
if(!ParseCharInstallSocket(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharSplitItem:
|
|
if(!ParseCharSplitItem(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharUpgradeItem:
|
|
if(!ParseCharUpgradeItem(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharAward:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharAward(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharLevelUp:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharLevelUp(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharLevelUpInfo:
|
|
// if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_ZONEMOVE && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharLevelUpInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharIncreasePoint:
|
|
if(!ParseCharIncreasePoint(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharHPRegen:
|
|
if(!ParseCharHPRegen(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharBindPosition:
|
|
if(!ParseCharBindPos(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharQuickSlotMove:
|
|
if(!ParseCharQuickSlotMove(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharPartyMemInfo:
|
|
// if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_ZONEMOVE && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharPartyMemInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharClassUpgrade:
|
|
if(!ParseCharClassUpgrade(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCellBroadCasting:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCellBroadCasting(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharCastObjectInfo:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharCastObjectInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharPartyCmdInfo:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharPartyCmdInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharRequireInfo:
|
|
// if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_ZONEMOVE && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharRequireInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharWhisper:
|
|
if(!ParseCharWhisper(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharExchangeCmd:
|
|
if(!ParseCharExchangeCmd(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharExchangeItem:
|
|
if(!ParseCharExchangeItem(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharTakeGold:
|
|
if(!ParseCharTakeGold(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharDuelCmd:
|
|
if(!ParseCharDuelCmd(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharFameInfo:
|
|
if(!ParseCharFameInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharPartyFind:
|
|
if(!ParseCharPartyFind(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharSpellInfo:
|
|
if(g_ClientMain.m_dwClientMode != CLIENT_GAME && g_ClientMain.m_dwClientMode != CLIENT_GAMELOADING) break;
|
|
if(!ParseCharSpellInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharControlOption:
|
|
if(!ParseControlOption(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharSkillUnLock:
|
|
if(!ParseCharSkillUnLock(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdServerZone:
|
|
if(!ParseServerZone(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharMoveZone:
|
|
if(!ParseCharMoveZone(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdDepositUpdate:
|
|
if(!ParseDepositUpdate(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdDeposit:
|
|
if(!ParseDeposit(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharStallOpen:
|
|
if(!ParseCharStallOpen(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharStallEnter:
|
|
if(!ParseCharStallEnter(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharStallRegisterItem:
|
|
if(!ParseCharStallRegisterItem(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharStallItemInfo:
|
|
if(!ParseCharStallItemInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharTeamBattleInfo:
|
|
if(!ParseCharTeamBattleInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdEliteBonus:
|
|
if(!ParseCharEliteBonus(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharStartQuest:
|
|
if(!ParseCharStartQuest(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharOperateTrigger:
|
|
if(!ParseCharOperateTrigger(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdFriendDB:
|
|
if(!ParseCharFriendDB(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdFriendAck:
|
|
if(!ParseCharFriendAck(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdFriendAddRequest:
|
|
if(!ParseCharFriendRegistered(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdQuestDB:
|
|
if(!ParseCharQuestInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharEndQuest:
|
|
if(!ParseCharEndQuest(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharPeaceMode:
|
|
if(!ParseCharPeaceMode(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdCharAuthorizePanel:
|
|
if(!ParseCharAuthorizePanel(m_aryBuffer)) ProcessError();
|
|
break;
|
|
/* // Connected Login Server
|
|
case CmdLULUAck: //로그인서버에서 캐릭터 정보를 가져옴
|
|
if(!ParseLUAck(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdLUCSAck: //캐릭터 선택했음 여기서 에이전트 서버 진입함
|
|
if(!ParseLUCSAck(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdSULiAck: //에이전트 서버에 접속 했음
|
|
if(!ParseSULiAck(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdSULiChInfo: //캐릭터 정보를 받아옴
|
|
if(!ParseSULiChInfo(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdSUUAAck:
|
|
if(!ParseSUUAAck(m_aryBuffer)) ProcessError();
|
|
break;
|
|
|
|
case CmdSUCt:
|
|
if(!ParseSUCt(m_aryBuffer)) ProcessError();
|
|
dwError = 0;
|
|
break;*/
|
|
|
|
default:
|
|
dwError = 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL CNetwork::ParseUserLogin(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long UserID;
|
|
m_dwNetworkError = m_pSocket->HandleUserLogin(aryBuffer, &UserID, g_ClientMain.m_scLoginChar);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(UserID == g_ClientMain.m_dwUserID) m_bLoginSuccess = TRUE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharSelect(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned short aryChannel[2];
|
|
unsigned char cZone;
|
|
m_dwNetworkError = m_pSocket->HandleCharSelect(aryBuffer, &cZone, aryChannel);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(cZone == 3)
|
|
{
|
|
g_ClientMain.m_dwChannelID = 0;
|
|
}
|
|
|
|
if(g_ClientMain.m_bTestServerVersion)
|
|
{
|
|
g_ClientMain.m_dwChannelID = 0;
|
|
m_pSocket->ServerZone(cZone, g_ClientMain.m_dwChannelID);
|
|
} else
|
|
{
|
|
if(cZone == 2 || cZone == 4 || cZone == 5 || cZone == 6)
|
|
{
|
|
g_ClientMain.m_dwChannelID = 0;
|
|
}
|
|
|
|
m_pSocket->ServerZone(cZone, g_ClientMain.m_dwChannelID);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharMoveZone(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned short aryChannel[2];
|
|
unsigned char cZone;
|
|
m_dwNetworkError = m_pSocket->HandleCharMoveZone(aryBuffer, &cZone, aryChannel);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
unsigned long dwChannelCount = 0;
|
|
for(unsigned long i = 0; i < 2; i++)
|
|
{
|
|
if(aryChannel[i]) dwChannelCount++;
|
|
}
|
|
|
|
g_ClientMain.m_dwNextZone = cZone;
|
|
|
|
if(dwChannelCount == 1)
|
|
{
|
|
for(i = 0; i < 2; i++)
|
|
{
|
|
if(aryChannel[i])
|
|
{
|
|
g_ClientMain.m_dwClientMode = CLIENT_ZONEMOVE;
|
|
m_nsNetworkState = NS_ZONEMOVE;
|
|
if(g_ClientMain.m_bTestServerVersion)
|
|
{
|
|
m_pSocket->ServerZone(g_ClientMain.m_dwNextZone, 0);
|
|
} else
|
|
{
|
|
if(g_ClientMain.m_dwNextZone == 2 || g_ClientMain.m_dwNextZone == 4 ||
|
|
g_ClientMain.m_dwNextZone == 5 || g_ClientMain.m_dwNextZone == 6)
|
|
{
|
|
m_pSocket->ServerZone(g_ClientMain.m_dwNextZone, 0);
|
|
} else
|
|
{
|
|
m_pSocket->ServerZone(g_ClientMain.m_dwNextZone, i);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
} else
|
|
{
|
|
if(g_ClientMain.m_lpInterface)
|
|
{
|
|
if(dwChannelCount == 1 && !aryChannel[0])
|
|
{
|
|
g_ClientMain.m_lpInterface->InitChannel(2, aryChannel);
|
|
} else
|
|
{
|
|
g_ClientMain.m_lpInterface->InitChannel((unsigned char)dwChannelCount, aryChannel);
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseServerZone(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwServerID;
|
|
m_dwNetworkError = m_pSocket->HandleServerZone(aryBuffer, &dwServerID);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
SERVER_ID siServer;
|
|
siServer.dwID = g_ClientMain.m_dwServerID = dwServerID;
|
|
g_ClientMain.m_dwChannelID = siServer.GetChannel();
|
|
g_ClientMain.m_dwPresentZone = siServer.GetZone();
|
|
|
|
g_ClientMain.m_lpCommonInterface->FadeIn();
|
|
g_ClientMain.m_bSelectChar = TRUE;
|
|
if(g_ClientMain.m_lpBackGroundMusic)
|
|
{
|
|
try
|
|
{
|
|
g_ClientMain.m_lpBackGroundMusic->Destroy();
|
|
g_ClientMain.m_lpBackGroundMusic = NULL;
|
|
} catch(exception & e)
|
|
{
|
|
e = 0;
|
|
g_ClientMain.m_lpBackGroundMusic = NULL;
|
|
}
|
|
}
|
|
|
|
m_nsNetworkState = NS_SERVERMOVE;
|
|
|
|
m_pSocket->ConnectToGameServer(m_pSocket->GetRegString());
|
|
|
|
return TRUE;
|
|
} else
|
|
{
|
|
if(g_ClientMain.m_dwClientMode == CLIENT_ZONEMOVE)
|
|
{
|
|
g_ClientMain.m_dwClientMode = CLIENT_GAME;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharCreate(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long ChrID, Slot;
|
|
CHAR_VIEW lpCharView;
|
|
m_dwNetworkError = m_pSocket->HandleCharCreate(aryBuffer, &ChrID, &Slot, &lpCharView);
|
|
g_MessageBoxManager.DestroyList();
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
memcpy(&g_ClientMain.m_scLoginChar[Slot], &lpCharView, sizeof(CHAR_VIEW));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharDelete(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long UserID, Slot;
|
|
m_dwNetworkError = m_pSocket->HandleCharDelete(aryBuffer, &UserID, &Slot);
|
|
g_MessageBoxManager.DestroyList();
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(UserID == g_ClientMain.m_dwUserID)
|
|
{
|
|
ZeroMemory(&g_ClientMain.m_scLoginChar[Slot], sizeof(CHAR_VIEW));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharLogin(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
CHAR_POS Pos;
|
|
|
|
bool bPeace;
|
|
unsigned short wEquipSize, wInvenSize, wExtraSize, wExchangeSize;
|
|
char *lpEquipBuffer, *lpInvenBuffer, *lpExtraBuffer, *lpExchangeBuffer, cAdmin;
|
|
QUICK pQuickSlot;
|
|
m_dwNetworkError = m_pSocket->HandleCharLogin(aryBuffer, &cAdmin, &bPeace, &g_ClientMain.m_csStatus.m_Info, &g_ClientMain.m_csStatus.m_Skill,
|
|
&pQuickSlot, &Pos, &g_ClientMain.m_dwServerTime, &wEquipSize, &lpEquipBuffer, &wInvenSize, &lpInvenBuffer, &wExtraSize, &lpExtraBuffer, &wExchangeSize, &lpExchangeBuffer);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
g_ClientMain.m_dwMyChrID = g_ClientMain.m_csStatus.m_Info.UID;
|
|
g_ClientMain.m_bPeaceMode = bPeace;
|
|
g_ClientMain.m_vecStartPosition.x = Pos.LastPoint.fPointX * 100.0f;
|
|
g_ClientMain.m_vecStartPosition.y = Pos.LastPoint.fPointY * 100.0f;
|
|
g_ClientMain.m_vecStartPosition.z = Pos.LastPoint.fPointZ * 100.0f;
|
|
|
|
// 어드민 모드
|
|
if(cAdmin) g_ClientMain.m_bAdminMode = TRUE; else g_ClientMain.m_bAdminMode = FALSE;
|
|
|
|
// 장비 아이템
|
|
unsigned short wBufferSize = 0;
|
|
while(wBufferSize < wEquipSize)
|
|
{
|
|
CItemInstance *lpItem;
|
|
lpItem = new CItemInstance;
|
|
size_t nDBSize = wEquipSize - wBufferSize;
|
|
lpItem->SetItemInfo(lpEquipBuffer, nDBSize);
|
|
|
|
wBufferSize += nDBSize;
|
|
lpEquipBuffer += nDBSize;
|
|
|
|
g_ClientMain.m_csStatus.AddEquipItem(lpItem->m_lpItemBase->GetPos().m_cIndex, lpItem, FALSE);
|
|
}
|
|
|
|
// 인벤 아이템
|
|
wBufferSize = 0;
|
|
while(wBufferSize < wInvenSize)
|
|
{
|
|
CItemInstance *lpItem;
|
|
lpItem = new CItemInstance;
|
|
size_t nDBSize = wInvenSize - wBufferSize;
|
|
lpItem->SetItemInfo(lpInvenBuffer, nDBSize);
|
|
|
|
wBufferSize += nDBSize;
|
|
lpInvenBuffer += nDBSize;
|
|
|
|
g_ClientMain.m_csStatus.AddInventoryItem(lpItem, FALSE);
|
|
}
|
|
|
|
// Extra 아이템
|
|
wBufferSize = 0;
|
|
while(wBufferSize < wExtraSize)
|
|
{
|
|
CItemInstance *lpItem;
|
|
lpItem = new CItemInstance;
|
|
size_t nDBSize = wExtraSize - wBufferSize;
|
|
lpItem->SetItemInfo(lpExtraBuffer, nDBSize);
|
|
|
|
if(nDBSize)
|
|
{
|
|
wBufferSize += nDBSize;
|
|
lpExtraBuffer += nDBSize;
|
|
|
|
switch(lpItem->GetItemPos())
|
|
{
|
|
case ClientSocket::ItemPos_Upgrade:
|
|
g_ClientMain.m_csStatus.m_lpUpgrade[lpItem->m_lpItemBase->GetPos().m_cIndex] = lpItem;
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Temp:
|
|
g_ClientMain.SetPickItem(lpItem, FALSE);
|
|
break;
|
|
}
|
|
} else
|
|
{
|
|
delete lpItem;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Exchange 아이템
|
|
wBufferSize = 0;
|
|
while(wBufferSize < wExchangeSize)
|
|
{
|
|
CItemInstance *lpItem;
|
|
lpItem = new CItemInstance;
|
|
size_t nDBSize = wExchangeSize - wBufferSize;
|
|
lpItem->SetItemInfo(lpExchangeBuffer, nDBSize);
|
|
|
|
if(nDBSize)
|
|
{
|
|
wBufferSize += nDBSize;
|
|
lpExchangeBuffer += nDBSize;
|
|
|
|
g_ClientMain.m_csStatus.AddExchangeItem(lpItem, TRUE, FALSE);
|
|
} else
|
|
{
|
|
delete lpItem;
|
|
break;
|
|
}
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.SetClassSkill();
|
|
for(int i = 0; i < 20; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_Skill.SSlot[i].SKILLINFO.wSkill)
|
|
{
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[i] = new CItemInstance;
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[i]->SetSkillInfo(g_ClientMain.m_csStatus.m_Skill.SSlot[i].SKILLINFO.wSkill,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[i].SKILLINFO.cLockCount, g_ClientMain.m_csStatus.m_Skill.SSlot[i].SKILLINFO.cSkillLevel,
|
|
ClientSocket::ItemPos_SSlot, i, 0);
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[i] = NULL;
|
|
}
|
|
}
|
|
|
|
for(i = 0; i < 10; i++)
|
|
{
|
|
if(pQuickSlot.Slots[i].wID)
|
|
{
|
|
switch(pQuickSlot.Slots[i].nType)
|
|
{
|
|
case QUICKSLOT::SKILL:
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i] = new CItemInstance;
|
|
if(!g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetSkillInfo(pQuickSlot.Slots[i].wID,
|
|
pQuickSlot.Slots[i].nSkillLockCount, pQuickSlot.Slots[i].nSkillLevel, ClientSocket::ItemPos_QSlot,
|
|
i, 0))
|
|
{
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetItemPos(ClientSocket::ItemPos_QSlot);
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->m_lpItemBase = new Item::CItem;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetPos(i);
|
|
g_ClientMain.m_Network.SendQuickSlotMove(g_ClientMain.m_csStatus.m_lstQuickSlot[i], ClientSocket::ItemPos_None, i);
|
|
}
|
|
// g_ClientMain.m_csStatus.m_lstQuickSlot[i]->ShowTooltip(FALSE);
|
|
break;
|
|
|
|
case QUICKSLOT::ITEM:
|
|
{
|
|
Item::ItemPos pItemIndex;
|
|
pItemIndex.m_cIndex = i;
|
|
pItemIndex.m_cPos = ClientSocket::ItemPos_QSlot;
|
|
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i] = new CItemInstance;
|
|
if(!g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetItemInfofromID(pQuickSlot.Slots[i].wID, pItemIndex))
|
|
{
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetItemPos(ClientSocket::ItemPos_QSlot);
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->m_lpItemBase = new Item::CItem;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetPos(i);
|
|
g_ClientMain.m_Network.SendQuickSlotMove(g_ClientMain.m_csStatus.m_lstQuickSlot[i], ClientSocket::ItemPos_None, i);
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.SetQuickSlotItemNumber(g_ClientMain.m_csStatus.m_lstQuickSlot[i]);
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
{
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i] = new CItemInstance;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetItemPos(ClientSocket::ItemPos_QSlot);
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->m_lpItemBase = new Item::CItem;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetPos(i);
|
|
g_ClientMain.m_Network.SendQuickSlotMove(g_ClientMain.m_csStatus.m_lstQuickSlot[i], ClientSocket::ItemPos_None, i);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
m_bCharLoginSuccess = TRUE;
|
|
if(m_bCharLoginSuccess && m_bCompleteDeposit)
|
|
{
|
|
m_nsNetworkState = NS_UPDATEADDRESS;
|
|
m_bUpdateAddressPacket = FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*BOOL CNetwork::ParseCharInfo(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharInfo(aryBuffer, &g_ClientMain.m_csStatus.m_Info);
|
|
// m_dwNetworkError = m_pSocket->HandleSULiChInfoPt(aryBuffer,
|
|
// &g_ClientMain.m_csStatus.m_Info, &g_ClientMain.m_csStatus.m_Item, &g_ClientMain.m_csStatus.m_InfoEx,
|
|
// &g_ClientMain.m_csStatus.m_Relation, &g_ClientMain.m_csStatus.m_InfoPos, &g_ClientMain.m_dwServerTime);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
g_ClientMain.m_dwStartTime = GetTickCount();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}*/
|
|
|
|
BOOL CNetwork::ParseCharUpdateAddress(char *aryBuffer)
|
|
{
|
|
if(m_nsNetworkState == NS_UPDATEADDRESS)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
}
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharUpdateAddress(aryBuffer);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(!m_bUpdateAddressPacket)
|
|
{
|
|
m_bUpdateAddressPacket = TRUE;
|
|
|
|
// 게임시작
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
g_ClientMain.m_lpInterface->InitGame();
|
|
|
|
SOCKADDR_IN pPubAddress, pPriAddress;
|
|
pPubAddress = m_pSocket->GetPubAddress();
|
|
pPriAddress = m_pSocket->GetPriAddress();
|
|
|
|
#ifdef _DEBUG
|
|
char a[200];
|
|
sprintf(a, "0. 0x%08x = Pub : %d.%d.%d.%d:%d, Pri : %d.%d.%d.%d:%d", g_ClientMain.m_dwMyChrID,
|
|
pPubAddress.sin_addr.s_net, pPubAddress.sin_addr.s_host, pPubAddress.sin_addr.s_lh, pPubAddress.sin_addr.s_impno, pPubAddress.sin_port,
|
|
pPriAddress.sin_addr.s_net, pPriAddress.sin_addr.s_host, pPriAddress.sin_addr.s_lh, pPriAddress.sin_addr.s_impno, pPriAddress.sin_port);
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
#endif
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharMove(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID, dwChant, dwEnchant, dwPtCount;
|
|
unsigned short wUpperAction, wLowerAction;
|
|
char wLevel;
|
|
float fDir;
|
|
vector3 vecDst;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharMove(aryBuffer, &dwChrID, (LPPOS)&vecDst, &fDir, &wUpperAction, &wLowerAction, &wLevel, &dwChant, &dwEnchant, &dwPtCount);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
g_CharacterData.AddActionData(dwChrID, wUpperAction, wLowerAction, fDir, vecDst);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharCellLogin(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned char cCommand;
|
|
SOCKADDR_IN pPubAddress, pPriAddress;
|
|
POS pPos;
|
|
vector3 vecPos;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharCellLogin(aryBuffer, &dwChrID, &pPos, &pPubAddress, &pPriAddress, &cCommand);
|
|
vecPos = vector3(pPos.fPointX * 100.0f, 0.0f, pPos.fPointZ * 100.0f);
|
|
vecPos.y = CSceneManager::m_HeightField.GetHeight(vecPos) + 15.0f;
|
|
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID) return TRUE;
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cCommand)
|
|
{
|
|
case ClientSocket::CellOper_Login:
|
|
if(g_CharacterData.GetClientType(dwChrID) == CT_PC)
|
|
{
|
|
unsigned long dwResult = m_pSocket->InsertIntoAddressList(ClientSocket::ListType_Client, dwChrID, pPubAddress, pPriAddress);
|
|
|
|
#ifdef _DEBUG
|
|
char a[200];
|
|
sprintf(a, "1. 0x%08x = Pub : %d.%d.%d.%d:%d, Pri : %d.%d.%d.%d:%d %d", dwChrID,
|
|
pPubAddress.sin_addr.s_net, pPubAddress.sin_addr.s_host, pPubAddress.sin_addr.s_lh, pPubAddress.sin_addr.s_impno, pPubAddress.sin_port,
|
|
pPriAddress.sin_addr.s_net, pPriAddress.sin_addr.s_host, pPriAddress.sin_addr.s_lh, pPriAddress.sin_addr.s_impno, pPriAddress.sin_port, m_pSocket->GetPeerType(pPubAddress, pPriAddress));
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
#endif
|
|
|
|
if(dwResult == ClientSocket::ListOper_Insert)
|
|
{
|
|
m_pSocket->CharRequireInfo(g_ClientMain.m_dwMyChrID, dwChrID, ClientSocket::Require_Shape);
|
|
m_lstSendShape.push_back(dwChrID);
|
|
|
|
if(!g_CharacterData.GetCreature(dwChrID))
|
|
{
|
|
g_CharacterData.AddCharacter(dwChrID, vecPos); // 공간만 만듬
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::CellOper_Respawn:
|
|
if(g_CharacterData.GetClientType(dwChrID) == CT_PC)
|
|
{
|
|
unsigned long dwResult = m_pSocket->InsertIntoAddressList(ClientSocket::ListType_Client, dwChrID, pPubAddress, pPriAddress);
|
|
|
|
#ifdef _DEBUG
|
|
char a[200];
|
|
sprintf(a, "2. 0x%08x = Pub : %d.%d.%d.%d:%d, Pri : %d.%d.%d.%d:%d %d", dwChrID,
|
|
pPubAddress.sin_addr.s_net, pPubAddress.sin_addr.s_host, pPubAddress.sin_addr.s_lh, pPubAddress.sin_addr.s_impno, pPubAddress.sin_port,
|
|
pPriAddress.sin_addr.s_net, pPriAddress.sin_addr.s_host, pPriAddress.sin_addr.s_lh, pPriAddress.sin_addr.s_impno, pPriAddress.sin_port, m_pSocket->GetPeerType(pPubAddress, pPriAddress));
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
#endif
|
|
|
|
if(dwResult == ClientSocket::ListOper_Insert)
|
|
{
|
|
m_pSocket->CharRequireInfo(g_ClientMain.m_dwMyChrID, dwChrID, ClientSocket::Require_Shape);
|
|
m_lstSendShape.push_back(dwChrID);
|
|
|
|
if(!g_CharacterData.GetCreature(dwChrID))
|
|
{
|
|
g_CharacterData.AddCharacter(dwChrID, vecPos); // 공간만 만듬
|
|
}
|
|
}
|
|
} else if(g_CharacterData.GetClientType(dwChrID) == CT_MONSTER)
|
|
{
|
|
// 몬스터 리스폰 시
|
|
}
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharCellLogout(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned char cCommand;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharCellLogout(aryBuffer, &dwChrID, &cCommand);
|
|
|
|
// if(dwChrID == g_ClientMain.m_dwMyChrID) return TRUE;
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cCommand)
|
|
{
|
|
case ClientSocket::CellOper_Logout:
|
|
switch(g_CharacterData.GetClientType(dwChrID))
|
|
{
|
|
case CT_PC:
|
|
m_pSocket->DeleteFromAddressList(ClientSocket::ListType_Client, dwChrID);
|
|
g_CharacterData.UnLoadChr(dwChrID);
|
|
break;
|
|
|
|
case CT_MONSTER:
|
|
{
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
|
|
/* char a[MAX_PATH];
|
|
sprintf(a, "0x%08x놈이 죽었다.", dwChrID);
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 0);*/
|
|
|
|
if(lpCreature)
|
|
{
|
|
lpCreature->Dead();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::CellOper_Respawn:
|
|
m_pSocket->DeleteFromAddressList(ClientSocket::ListType_Client, dwChrID);
|
|
g_CharacterData.UnLoadChr(dwChrID);
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharAddressInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
SOCKADDR_IN PublicAddress, PrivateAddress;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharAddressInfo(aryBuffer, &dwChrID, &PublicAddress, &PrivateAddress);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(g_ClientMain.m_csStatus.CheckPartyMember(dwChrID))
|
|
{
|
|
if(!m_pSocket->IsExistToList(ClientSocket::ListType_Party, dwChrID))
|
|
{
|
|
// 파티리스트 추가
|
|
unsigned long dwResult = m_pSocket->InsertIntoAddressList(ClientSocket::ListType_Party, dwChrID, PublicAddress, PrivateAddress);
|
|
|
|
#ifdef _DEBUG
|
|
char a[200];
|
|
sprintf(a, "3. 0x%08x = Pub : %d.%d.%d.%d:%d, Pri : %d.%d.%d.%d:%d %d", dwChrID,
|
|
PublicAddress.sin_addr.s_net, PublicAddress.sin_addr.s_host, PublicAddress.sin_addr.s_lh, PublicAddress.sin_addr.s_impno, PublicAddress.sin_port,
|
|
PrivateAddress.sin_addr.s_net, PrivateAddress.sin_addr.s_host, PrivateAddress.sin_addr.s_lh, PrivateAddress.sin_addr.s_impno, PrivateAddress.sin_port, m_pSocket->GetPeerType(PublicAddress, PrivateAddress));
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
#endif
|
|
|
|
if(dwResult == ClientSocket::ListOper_Insert)
|
|
{
|
|
// m_pSocket->CharRequireInfo(g_ClientMain.m_dwMyChrID, dwChrID, ClientSocket::Require_Shape);
|
|
// m_lstSendShape.push_back(dwChrID);
|
|
|
|
if(!g_CharacterData.GetCreature(dwChrID))
|
|
{
|
|
g_CharacterData.AddCharacter(dwChrID, vector3(0.0f, 0.0f, 0.0f)); // 공간만 만듬
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharChat(char *aryBuffer)
|
|
{
|
|
unsigned long dwSender;
|
|
unsigned short wCommand;
|
|
char strMessage[MAX_PATH];
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharChat(aryBuffer, &dwSender, &wCommand, strMessage);
|
|
|
|
if(m_dwNetworkError == 0)
|
|
{
|
|
switch(wCommand)
|
|
{
|
|
case CHATMODE_CHAT:
|
|
g_TextEdit.AddNormalChatMessage(strMessage, dwSender, wCommand);
|
|
break;
|
|
|
|
case CHATMODE_PARTY:
|
|
g_TextEdit.AddNormalChatMessage(strMessage, dwSender, wCommand);
|
|
g_TextEdit.AddPartyChatMessage(strMessage, dwSender, wCommand);
|
|
break;
|
|
|
|
case CHATMODE_GUILD:
|
|
g_TextEdit.AddNormalChatMessage(strMessage, dwSender, wCommand);
|
|
g_TextEdit.AddGuildChatMessage(strMessage, dwSender, wCommand);
|
|
break;
|
|
|
|
case ClientSocket::ChatType_Stall:
|
|
g_TextEdit.AddStallChatMessage(strMessage, dwSender, wCommand);
|
|
break;
|
|
|
|
case ClientSocket::ChatType_Shout: // 외치기
|
|
g_TextEdit.AddMessage(strMessage, dwSender, wCommand);
|
|
break;
|
|
|
|
case 255: // 공지
|
|
g_TextEdit.AddNotice(strMessage, 0);
|
|
break;
|
|
}
|
|
/* switch(wCommand)
|
|
{
|
|
case 4: // 공지
|
|
CUserInterface::AddNoticeMessage(strMessage, dwCmd);
|
|
break;
|
|
|
|
default: // 채팅 메시지
|
|
g_TextEdit.AddChatMessage(strMessage, dwSender, wCommand);
|
|
break;
|
|
}*/
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseMonMove(char *aryBuffer)
|
|
{
|
|
unsigned long dwMonID;
|
|
unsigned short wAction, wAniNum;
|
|
float fDir, fVec;
|
|
POS Pos;
|
|
m_dwNetworkError = m_pSocket->HandleMonMove(aryBuffer, &dwMonID, &Pos, &fDir, &fVec, &wAction, &wAniNum);
|
|
//#pragma message(__FILE__LINE__" TODO : 여기 몬스터 애니넘버 고치시오\n")
|
|
|
|
if(m_dwNetworkError == 0)
|
|
{
|
|
fDir += FLOAT_PHI / 2.0f;
|
|
fDir = -fDir;
|
|
|
|
Pos.fPointX *= 100.0f;
|
|
Pos.fPointY *= 100.0f;
|
|
Pos.fPointZ *= 100.0f;
|
|
|
|
/* if(Action & 0xFFFF0000)
|
|
{
|
|
unsigned short wState = (Action & 0xFFFF0000) >> 16;
|
|
|
|
if(wState == 5)
|
|
{
|
|
int abc = 0;
|
|
}
|
|
}*/
|
|
|
|
unsigned long dwFrame;
|
|
const CMonsterMgr::MonsterProtoType *lpMonster = g_MonsterMgr.GetMonsterProtoType(dwMonID & 0x0000FFFF);
|
|
if(lpMonster)
|
|
{
|
|
if(wAction == CA_WALK)
|
|
{
|
|
dwFrame = lpMonster->m_MonsterInfo.m_MonsterMotions[0].m_dwFrame;
|
|
} else if(wAction == CA_RUN)
|
|
{
|
|
dwFrame = lpMonster->m_MonsterInfo.m_MonsterMotions[1].m_dwFrame;
|
|
}
|
|
} else
|
|
{
|
|
dwFrame = 20;
|
|
}
|
|
|
|
if(!g_CharacterData.GetIsExistChar(dwMonID))
|
|
{
|
|
if(lpMonster)
|
|
{
|
|
g_CharacterData.AddCharacter(dwMonID, lpMonster->m_MonsterInfo.m_strName, (char *)lpMonster->m_MonsterInfo.m_strModelingFlag, (vector3 &)Pos, fDir);
|
|
/* char strText[100];
|
|
sprintf(strText, "0x%08x인 몬스터를 추가 했습니다.", dwMonID);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);*/
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwMonID);
|
|
if(lpCreature)
|
|
{
|
|
lpCreature->m_fScale = lpMonster->m_MonsterInfo.m_fSize;
|
|
if(lpCreature->m_lpChrModel)
|
|
{
|
|
lpCreature->m_lpChrModel->SetScale(lpMonster->m_MonsterInfo.m_fSize);
|
|
} else
|
|
{
|
|
int a = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
g_CharacterData.AddActionData(dwMonID, wAction, wAction, fDir, (vector3 &)Pos, fVec, wAniNum, dwFrame);
|
|
// g_CharacterData.AddActionData(dwMonID, CA_RUN, CA_RUN, fDir, (vector3 &)Pos, fVec);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharAttack(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID, dwIndex, dwValue, dwLeftIndex, dwLeftValue;
|
|
unsigned char cDefenserNum;
|
|
unsigned short wHp, wMp;
|
|
DefenserNode *Node;
|
|
AtType pAtType;
|
|
char cJudge;
|
|
m_dwNetworkError = m_pSocket->HandleCharAttack(aryBuffer, &dwChrID, &pAtType, &wHp, &wMp, &dwIndex, &dwValue, &dwLeftIndex, &dwLeftValue, &cJudge, &cDefenserNum, &Node);
|
|
|
|
if(pAtType.m_wType & 0x8000)
|
|
{
|
|
int a = 0;
|
|
}
|
|
|
|
if(m_dwNetworkError == 0)
|
|
{
|
|
List<DWORD> SendCharacterList;
|
|
g_CharacterData.GetSendCharacterAroundList(SendCharacterList);
|
|
for(int i=0;i<SendCharacterList.num;i++)
|
|
{
|
|
m_pSocket->RegistInstanceUDPList(SendCharacterList[i]);
|
|
}
|
|
m_pSocket->CharAttackInfo(dwChrID, pAtType, cDefenserNum, Node);
|
|
|
|
CCreature *lpCreature;
|
|
if(g_CharacterData.GetClientType(dwChrID) == CT_MONSTER)
|
|
{
|
|
lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
lpCreature->Attack(CA_ATTACK, CA_ATTACK);
|
|
}
|
|
|
|
BOOL bShow = FALSE;
|
|
stDamage pDamage;
|
|
pDamage.wMode = cJudge;
|
|
pDamage.sLifeTime = 1500;
|
|
pDamage.fScale = 1.0f;
|
|
switch(cJudge)
|
|
{
|
|
case ClientSocket::Judge_Heal:
|
|
pDamage.lValue = wHp - g_ClientMain.m_csStatus.m_Info.HP;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lstDamageNumber.Add(pDamage);
|
|
bShow = TRUE;
|
|
break;
|
|
|
|
case ClientSocket::Judge_ManaHeal:
|
|
pDamage.lValue = wMp - g_ClientMain.m_csStatus.m_Info.MP;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lstDamageNumber.Add(pDamage);
|
|
bShow = TRUE;
|
|
break;
|
|
|
|
case ClientSocket::Judge_Chant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Enchant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Disenchant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_NonShow:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Evade:
|
|
bShow = TRUE;
|
|
break;
|
|
|
|
case ClientSocket::Judge_Resist:
|
|
bShow = TRUE;
|
|
break;
|
|
|
|
default:
|
|
if(g_ClientMain.m_csStatus.m_Info.HP > wHp)
|
|
{
|
|
pDamage.lValue = g_ClientMain.m_csStatus.m_Info.HP - wHp;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lstDamageNumber.Add(pDamage);
|
|
bShow = TRUE;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if(bShow)
|
|
{
|
|
DefenserNode DNode;
|
|
DNode.m_dwCharID = g_ClientMain.m_dwMyChrID;
|
|
DNode.m_wDamage = pDamage.lValue;
|
|
DNode.m_wMaxHP = g_ClientMain.m_csStatus.m_lAddMaxHP + g_ClientMain.m_csStatus.m_MaxHP;
|
|
DNode.m_sCurrHP = wHp;
|
|
DNode.m_wMaxMP = g_ClientMain.m_csStatus.m_lAddMaxMP + g_ClientMain.m_csStatus.m_MaxMP;
|
|
DNode.m_sCurrMP = wMp;
|
|
DNode.m_cJudge = pDamage.wMode;
|
|
List<DWORD> SendCharacterList;
|
|
g_CharacterData.GetSendCharacterAroundList(SendCharacterList);
|
|
for(int i=0;i<SendCharacterList.num;i++)
|
|
{
|
|
m_pSocket->RegistInstanceUDPList(SendCharacterList[i]);
|
|
}
|
|
m_pSocket->CharAttackInfo(dwChrID, pAtType, 1, &DNode);
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.m_Info.HP = wHp;
|
|
g_ClientMain.m_csStatus.m_Info.MP = wMp;
|
|
if(wHp <= 0)
|
|
{
|
|
// 자살
|
|
g_ClientMain.m_csStatus.m_Info.HP = 0;
|
|
g_CharacterData.InitGlobalAction();
|
|
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_sCurrHP = 0;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->Dead();
|
|
g_ClientMain.m_csStatus.ChantDisable();
|
|
g_ClientMain.SetAutoRun(FALSE);
|
|
SendMovingPacket(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwUpperChrAction,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos);
|
|
}
|
|
|
|
// 장비 내구도 달기
|
|
if(dwIndex < Item::EquipmentPos::MAX_EQUPMENT_POS && g_ClientMain.m_csStatus.m_lstEquipment[dwIndex])
|
|
{
|
|
g_ClientMain.m_csStatus.m_lstEquipment[dwIndex]->SetNowDurability(dwValue);
|
|
|
|
if(dwValue == 0)
|
|
{
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[271], g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
}
|
|
|
|
// 장비 내구도 달기
|
|
if(dwLeftIndex < Item::EquipmentPos::MAX_EQUPMENT_POS && g_ClientMain.m_csStatus.m_lstEquipment[dwLeftIndex])
|
|
{
|
|
g_ClientMain.m_csStatus.m_lstEquipment[dwLeftIndex]->SetNowDurability(dwLeftValue);
|
|
|
|
if(dwLeftValue == 0)
|
|
{
|
|
unsigned long dwType = g_ClientMain.m_csStatus.m_lstEquipment[dwLeftIndex]->GetItemType();
|
|
if(dwType == Item::CItemType::ARROW || dwType == Item::CItemType::BOLT)
|
|
{
|
|
delete g_ClientMain.m_csStatus.m_lstEquipment[dwLeftIndex];
|
|
g_ClientMain.m_csStatus.m_lstEquipment[dwLeftIndex] = NULL;
|
|
|
|
switch(dwType)
|
|
{
|
|
case Item::CItemType::ARROW:
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[356], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
|
|
case Item::CItemType::BOLT:
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[357], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
}
|
|
} else
|
|
{
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[271], g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(cDefenserNum)
|
|
{
|
|
for(int i = 0; i < cDefenserNum; i++)
|
|
{
|
|
lpCreature = g_CharacterData.GetCreature(Node[i].m_dwCharID);
|
|
|
|
if(lpCreature)
|
|
{
|
|
if(lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.HP = Node[i].m_sCurrHP;
|
|
g_ClientMain.m_csStatus.m_Info.MP = Node[i].m_sCurrMP;
|
|
if(Node[i].m_sCurrHP <= 0)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.HP = 0;
|
|
g_CharacterData.m_bAutoTargetAttack = false;
|
|
g_CharacterData.m_dwAutoTargetID = 0xFFFFFFFF;
|
|
}
|
|
} else
|
|
{
|
|
// 스킬 2차 이펙트를 붙인다.
|
|
if((pAtType.m_wType & 0x8000) && (pAtType.m_cSkillLevel || pAtType.m_cSkillLockCount))
|
|
{
|
|
CCreature *AttCreature = NULL;
|
|
AttCreature = g_CharacterData.GetCreature(dwChrID);
|
|
if(AttCreature != NULL) {
|
|
SetHitEffect(pAtType, lpCreature,AttCreature,i);
|
|
}
|
|
else {
|
|
SetHitEffect(pAtType, lpCreature,NULL,i);
|
|
}
|
|
}
|
|
|
|
lpCreature->m_wMaxHP = Node[i].m_wMaxHP;
|
|
lpCreature->m_sCurrHP = Node[i].m_sCurrHP;
|
|
lpCreature->m_wMaxMP = Node[i].m_wMaxMP;
|
|
lpCreature->m_sCurrMP = Node[i].m_sCurrMP;
|
|
}
|
|
|
|
stDamage pDamage;
|
|
pDamage.wMode = Node[i].m_cJudge;
|
|
switch(pDamage.wMode)
|
|
{
|
|
case ClientSocket::Judge_ManaShell:
|
|
lpCreature->AddBodyEffect("chant_ManaShell.esf", (unsigned long)0, true);
|
|
pDamage.wMode = ClientSocket::Judge_Guard;
|
|
case ClientSocket::Judge_Guard:
|
|
pDamage.sLifeTime = 1500;
|
|
pDamage.lValue = Node[i].m_wDamage;
|
|
pDamage.fScale = 1.0f;
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
{
|
|
CEffScript *test_script;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
test_script = new CEffScript;
|
|
CSceneManager::AddEffectScript(test_script);
|
|
test_script->GetScriptBinData("guard_blocking.esf");
|
|
|
|
test_script->SetStartPos(lpCreature->m_vecPos.x, lpCreature->m_vecPos.y, lpCreature->m_vecPos.z);
|
|
test_script->SetEndPos(lpCreature->m_vecPos.x, lpCreature->m_vecPos.y, lpCreature->m_vecPos.z);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::Judge_Critical:
|
|
pDamage.sLifeTime = 1500;
|
|
pDamage.lValue = Node[i].m_wDamage;
|
|
pDamage.fScale = 1.0f;
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
|
|
{
|
|
CEffScript *test_script;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
test_script = new CEffScript;
|
|
CSceneManager::AddEffectScript(test_script);
|
|
test_script->GetScriptBinData("guard_critical.esf");
|
|
|
|
test_script->SetStartPos(lpCreature->m_vecPos.x, lpCreature->m_vecPos.y, lpCreature->m_vecPos.z);
|
|
test_script->SetEndPos(lpCreature->m_vecPos.x, lpCreature->m_vecPos.y, lpCreature->m_vecPos.z);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::Judge_Chant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Enchant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Disenchant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_NonShow:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Evade:
|
|
pDamage.sLifeTime = 1500;
|
|
pDamage.lValue = Node[i].m_wDamage;
|
|
pDamage.fScale = 1.0f;
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
case ClientSocket::Judge_Resist:
|
|
pDamage.sLifeTime = 1500;
|
|
pDamage.lValue = Node[i].m_wDamage;
|
|
pDamage.fScale = 1.0f;
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
default:
|
|
pDamage.sLifeTime = 1500;
|
|
pDamage.lValue = Node[i].m_wDamage;
|
|
pDamage.fScale = 1.0f;
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
}
|
|
|
|
/* char a[200];
|
|
sprintf(a, "ID가 0x%08x인 %s을 %d만큼 정말 아프게 때렸습니다.", lpCreature->m_dwChrID, lpCreature->m_strName, Node[i].m_wDamage);
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 0);*/
|
|
|
|
if(Node[i].m_sCurrHP <= 0 && cJudge != ClientSocket::Judge_NonShow)
|
|
{
|
|
lpCreature->m_wMaxHP = 0;
|
|
lpCreature->m_sCurrHP = -1;
|
|
lpCreature->m_wMaxMP = 0;
|
|
lpCreature->m_sCurrMP = -1;
|
|
|
|
if(g_CharacterData.GetClientType(lpCreature->m_dwChrID) == CT_PC)
|
|
{
|
|
char strText[MAX_PATH], *strName = g_CharacterData.GetCreatureName(Node[i].m_dwCharID);
|
|
unsigned long dwCreatureType = g_CharacterData.GetClientType(Node[i].m_dwCharID);
|
|
if(strName)
|
|
{
|
|
if(dwCreatureType == CT_PC)
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[372], strName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
} else
|
|
{
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[373], g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
|
|
lpCreature->Dead();
|
|
if(lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
SendMovingPacket(lpCreature->m_dwUpperChrAction, lpCreature->m_dwLowerChrAction,
|
|
lpCreature->m_fDirection, lpCreature->m_vecPos);
|
|
}
|
|
} else
|
|
{
|
|
lpCreature->Dead();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
} else
|
|
{
|
|
if(pAtType.m_wType & 0x8000)
|
|
{
|
|
const Skill::ProtoType *lpSkillProtoType = g_SkillMgr.GetSkillProtoType(pAtType.m_wType);
|
|
|
|
if(lpSkillProtoType && lpSkillProtoType->m_cEndCoolDown)
|
|
{
|
|
g_ClientMain.SetSkillCoolDown(pAtType.m_wType);
|
|
}
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharRespawn(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID, dwGold;
|
|
unsigned short wHp, wMp;
|
|
POS Pos;
|
|
__int64 ddExp;
|
|
m_dwNetworkError = m_pSocket->HandleCharRespawn(aryBuffer, &dwChrID, &wHp, &wMp, &Pos, &ddExp, &dwGold);
|
|
|
|
if(m_dwNetworkError == 0)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
if(g_ClientMain.m_dwPresentZone == 100)
|
|
{
|
|
if(g_ClientMain.m_lpBackGroundMusic)
|
|
{
|
|
try
|
|
{
|
|
g_ClientMain.m_lpBackGroundMusic->Destroy();
|
|
g_ClientMain.m_lpBackGroundMusic = NULL;
|
|
} catch(exception & e)
|
|
{
|
|
e = 0;
|
|
g_ClientMain.m_lpBackGroundMusic = NULL;
|
|
}
|
|
}
|
|
|
|
g_ClientMain.m_dwPresentZone = g_ClientMain.m_dwNextZone;
|
|
g_ClientMain.m_lpInterface->InitZone(g_ClientMain.m_dwPresentZone);
|
|
g_ClientMain.m_lpCommonInterface->InitLoading();
|
|
g_ClientMain.m_dwClientState = GAME_PLAYING;
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.m_Info.HP = wHp;
|
|
g_ClientMain.m_csStatus.m_Info.MP = wMp;
|
|
g_ClientMain.m_csStatus.m_Info.Exp = ddExp;
|
|
g_ClientMain.m_csStatus.m_Info.Gold = dwGold;
|
|
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
lpCreature->Respawn();
|
|
vector3 vecPos = vector3(Pos.fPointX * 100.0f, 0.0f, Pos.fPointZ * 100.0f);
|
|
vecPos.y = g_ClientMain.m_lpSceneManager->m_HeightField.GetHeight(vecPos) + 15.0f;
|
|
lpCreature->m_lpChrModel->SetPosition(vecPos);
|
|
|
|
CEffScript *pRespawnEff;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
pRespawnEff=new CEffScript;
|
|
CSceneManager::AddEffectScript(pRespawnEff);
|
|
|
|
pRespawnEff->GetScriptBinData("respawn.esf");
|
|
pRespawnEff->SetStartPos(Pos.fPointX * 100.0f, Pos.fPointY * 100.0f, Pos.fPointZ * 100.0f);
|
|
pRespawnEff->SetEndPos((D3DXVECTOR3 *)&(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos), 1);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharAttackInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned char cDefenserNum;
|
|
DefenserNode *Node;
|
|
AtType pAtType;
|
|
m_dwNetworkError = m_pSocket->HandleCharAttackInfo(aryBuffer, &dwChrID, &pAtType, &cDefenserNum, &Node);
|
|
|
|
if(m_dwNetworkError == 0)
|
|
{
|
|
if(Node[0].m_cJudge != ClientSocket::Judge_Poisoned && dwChrID == g_ClientMain.m_dwMyChrID) return TRUE;
|
|
|
|
CCreature *lpCreature;
|
|
if(g_CharacterData.GetClientType(dwChrID) == CT_MONSTER)
|
|
{
|
|
lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
if(lpCreature)
|
|
{
|
|
lpCreature->Attack(CA_ATTACK, CA_ATTACK);
|
|
}
|
|
}
|
|
|
|
char *strKillerName = g_CharacterData.GetCreatureName(dwChrID);
|
|
unsigned long dwKillerType = g_CharacterData.GetClientType(dwChrID);
|
|
|
|
if(cDefenserNum)
|
|
{
|
|
for(int i = 0; i < cDefenserNum; i++)
|
|
{
|
|
if(Node[i].m_dwCharID == g_ClientMain.m_dwMyChrID) continue;
|
|
|
|
lpCreature = g_CharacterData.GetCreature(Node[i].m_dwCharID);
|
|
if(lpCreature)
|
|
{
|
|
lpCreature->m_wMaxHP = Node[i].m_wMaxHP;
|
|
lpCreature->m_sCurrHP = Node[i].m_sCurrHP;
|
|
lpCreature->m_wMaxMP = Node[i].m_wMaxMP;
|
|
lpCreature->m_sCurrMP = Node[i].m_sCurrMP;
|
|
lpCreature->m_sDamage = Node[i].m_wDamage;
|
|
|
|
stDamage pDamage;
|
|
pDamage.sLifeTime = 1500;
|
|
pDamage.lValue = Node[i].m_wDamage;
|
|
pDamage.wMode = Node[i].m_cJudge;
|
|
pDamage.fScale = 0.5f;
|
|
switch(Node[i].m_cJudge)
|
|
{
|
|
case ClientSocket::Judge_ManaShell:
|
|
lpCreature->AddBodyEffect("chant_ManaShell.esf",(unsigned long)0,true);
|
|
pDamage.wMode = ClientSocket::Judge_Guard;
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
case ClientSocket::Judge_ManaHeal:
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
case ClientSocket::Judge_Heal:
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
case ClientSocket::Judge_Chant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Enchant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Disenchant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_NonShow:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Evade:
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
case ClientSocket::Judge_Resist:
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
default:
|
|
g_CharacterData.RegistAttacked(dwChrID, Node[i].m_dwCharID, pAtType.m_wType);
|
|
lpCreature->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
}
|
|
|
|
// 스킬 2차 이펙트를 붙인다.
|
|
if((pAtType.m_wType & 0x8000) && (pAtType.m_cSkillLevel || pAtType.m_cSkillLockCount))
|
|
{
|
|
CCreature *AttCreature = NULL;
|
|
AttCreature = g_CharacterData.GetCreature(dwChrID);
|
|
if(AttCreature != NULL) {
|
|
SetHitEffect(pAtType, lpCreature,AttCreature,i);
|
|
}
|
|
else {
|
|
SetHitEffect(pAtType, lpCreature,NULL,i);
|
|
}
|
|
}
|
|
|
|
if(Node[i].m_sCurrHP <= 0 && Node[i].m_cJudge != ClientSocket::Judge_NonShow)
|
|
{
|
|
lpCreature->m_wMaxHP = 0;
|
|
lpCreature->m_sCurrHP = -1;
|
|
lpCreature->m_wMaxMP = 0;
|
|
lpCreature->m_sCurrMP = -1;
|
|
|
|
lpCreature->Dead();
|
|
if(g_CharacterData.GetClientType(lpCreature->m_dwChrID) == CT_PC)
|
|
{
|
|
char strText[MAX_PATH], *strName = g_CharacterData.GetCreatureName(lpCreature->m_dwChrID);
|
|
if(strName)
|
|
{
|
|
char strTemp[50];
|
|
|
|
if(dwKillerType == CT_PC)
|
|
{
|
|
if(lpCreature->m_dwChrID != dwChrID)
|
|
{
|
|
if(strKillerName)
|
|
{
|
|
strcpy(strTemp, strKillerName);
|
|
strcat(strTemp, g_StringTable.m_strString[374]);
|
|
} else
|
|
{
|
|
strcpy(strTemp, g_StringTable.m_strString[375]);
|
|
}
|
|
sprintf(strText, g_StringTable.m_strString[376], strTemp, strName);
|
|
} else
|
|
{
|
|
if(strKillerName)
|
|
{
|
|
strcpy(strTemp, strKillerName);
|
|
strcat(strTemp, g_StringTable.m_strString[374]);
|
|
} else
|
|
{
|
|
strcpy(strTemp, g_StringTable.m_strString[375]);
|
|
}
|
|
sprintf(strText, g_StringTable.m_strString[377], strTemp);
|
|
}
|
|
} else
|
|
{
|
|
if(strKillerName)
|
|
{
|
|
strcpy(strTemp, strKillerName);
|
|
strcat(strTemp, g_StringTable.m_strString[378]);
|
|
} else
|
|
{
|
|
strcpy(strTemp, g_StringTable.m_strString[379]);
|
|
}
|
|
sprintf(strText, g_StringTable.m_strString[380], strName, strTemp);
|
|
}
|
|
|
|
if(g_CharacterData.GetClientType(lpCreature->m_dwChrID, TRUE) == CT_PC)
|
|
{
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 129);
|
|
} else
|
|
{
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
}
|
|
}
|
|
/* if(g_CharacterData.GetClientType(lpCreature->m_dwChrID) == CT_PC)
|
|
{
|
|
if(lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
SendMovingPacket(lpCreature->m_dwUpperChrAction, lpCreature->m_dwLowerChrAction,
|
|
lpCreature->m_fDirection, lpCreature->m_vecPos);
|
|
}
|
|
}*/
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*BOOL CNetwork::ParseCharItemInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned char cPos;
|
|
unsigned short wSize;
|
|
|
|
char *lpItemBuffer;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharItemInfo(aryBuffer, &dwChrID, &cPos, &wSize, &lpItemBuffer);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
// Item_DB::LPITEM_BASE lpItemBaseDB = reinterpret_cast<Item_DB::LPITEM_BASE>(lpItemBuffer);
|
|
// Item::LPItemBase lpItembase = Item::MakeItemFromItemDB(lpItemBaseDB);
|
|
// lpItemBuffer += lpItemBaseDB->GetRealSize();// 여러개일때
|
|
|
|
unsigned short wBufferSize = 0;
|
|
while(wBufferSize < wSize)
|
|
{
|
|
Item_DB::LPITEM_BASE lpItemBaseDB = reinterpret_cast<Item_DB::LPITEM_BASE>(lpItemBuffer);
|
|
CItemInstance *lpItem;
|
|
lpItem = new CItemInstance;
|
|
ItemIndex pItemIndex;
|
|
pItemIndex.m_cIndex = 0xFF;
|
|
int nDBSize = lpItem->SetItemInfo(lpItemBaseDB, cPos, pItemIndex);
|
|
wBufferSize += nDBSize;
|
|
lpItemBuffer += nDBSize;
|
|
// 이 곳은 인덱스와 포지션을 집어넣을 필요 없다.
|
|
|
|
|
|
switch(cPos)
|
|
{
|
|
case ClientSocket::ItemPos_Inven:
|
|
g_ClientMain.m_csStatus.AddInventoryItem(lpItem);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Equip:
|
|
if(lpItem->m_lpItemBase->m_ItemInfo.m_nItemIndex.m_cIndex == 128)
|
|
{
|
|
g_ClientMain.SetPickItem(lpItem, FALSE);
|
|
g_ClientMain.m_lpPickItem->m_dwItemPos = ClientSocket::ItemPos_Temp;
|
|
g_ClientMain.m_lpPickItem->m_lpItemBase->m_ItemInfo.m_nItemIndex.m_cIndex = 0;
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.m_lstEquipment[lpItem->m_lpItemBase->m_ItemInfo.m_nItemIndex.m_cIndex] = lpItem;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
/* unsigned long dwChrID;
|
|
unsigned char cPos; // 1 장비 2 인벤
|
|
unsigned short wLength;
|
|
unsigned char *lpItem;
|
|
// m_dwNetworkError = m_pSocket->HandleCharItemInfo(aryBuffer, &dwChrID, &cPos, &wLength, &lpItem);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
for(int i = 0; i < wLength; i++)
|
|
{
|
|
|
|
}
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}*/
|
|
|
|
BOOL CNetwork::ParseGameCellInfo(char *aryBuffer)
|
|
{
|
|
unsigned char cObjectNum;
|
|
LPFieldObject lpFieldObject;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleGameCellInfo(aryBuffer, &cObjectNum, &lpFieldObject);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
unsigned long dwMonsterID[1000], dwMonsterCount = 0;
|
|
|
|
for(int i = 0; i < cObjectNum; i++)
|
|
{
|
|
if((lpFieldObject->m_dwOID & 0x80000000) && (lpFieldObject->m_dwTypeID == 0x80000000))
|
|
{
|
|
dwMonsterID[dwMonsterCount] = lpFieldObject->m_dwOID;
|
|
dwMonsterCount++;
|
|
} else
|
|
{
|
|
g_ClientMain.AddFieldObject(lpFieldObject);
|
|
}
|
|
lpFieldObject++;
|
|
}
|
|
|
|
if(dwMonsterCount)
|
|
{
|
|
int j;
|
|
BOOL bAlive;
|
|
/* for(i = 0; i < g_CharacterData.m_lstCharData.num;)
|
|
{
|
|
if(g_CharacterData.GetClientType(g_CharacterData.m_lstCharData[i]->m_dwChrID) == CT_MONSTER)
|
|
{
|
|
bAlive = FALSE;
|
|
for(j = 0; j < dwMonsterCount; j++)
|
|
{
|
|
if(g_CharacterData.m_lstCharData[i]->m_dwChrID == dwMonsterID[j])
|
|
{
|
|
bAlive = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!bAlive)
|
|
{
|
|
g_CharacterData.UnLoadChr(g_CharacterData.m_lstCharData[i]->m_dwChrID);
|
|
} else
|
|
{
|
|
i++;
|
|
}
|
|
} else
|
|
{
|
|
i++;
|
|
}
|
|
}*/
|
|
for(i = g_CharacterData.m_lstCharData.num - 1; i >= 1; i--)
|
|
{
|
|
if(g_CharacterData.GetClientType(g_CharacterData.m_lstCharData[i]->m_dwChrID) == CT_MONSTER)
|
|
{
|
|
/////////////단거
|
|
bAlive = FALSE;
|
|
for(j = 0; j < dwMonsterCount; j++)
|
|
{
|
|
if(g_CharacterData.m_lstCharData[i]->m_dwChrID == dwMonsterID[j])
|
|
{
|
|
bAlive = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!bAlive)
|
|
{
|
|
//g_CharacterData.UnLoadChr(g_CharacterData.m_lstCharData[i]->m_dwChrID);
|
|
}/* else
|
|
{
|
|
i++;
|
|
}*/
|
|
}/* else
|
|
{
|
|
i++;
|
|
}*/
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharPullDownInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
FieldObject FieldObject;
|
|
m_dwNetworkError = m_pSocket->HandleCharPullDownInfo(aryBuffer, &dwChrID, &FieldObject);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
g_ClientMain.AddFieldObject(&FieldObject);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharPickUp(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID, dwObjectID, dwGold, dwSize;
|
|
unsigned char cNum;
|
|
char *lpItemBuffer;
|
|
Item::ItemPos pItemIndex;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharPickUp(aryBuffer, &dwChrID, &dwObjectID, &pItemIndex,
|
|
&dwGold, &dwSize, &cNum, &lpItemBuffer);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
/* Item_DB::LPITEM_BASE lpItemBaseDB = reinterpret_cast<Item_DB::LPITEM_BASE>(lpItemBuffer);
|
|
Item::LPItemBase lpItembase = Item::MakeItemFromItemDB(lpItemBase
|
|
DB);
|
|
lpItemBuffer += lpItemBaseDB->GetRealSize();*/// 여러개일때
|
|
|
|
char strSoundFilename[256];
|
|
|
|
sprintf(strSoundFilename,"%s\\Interface\\money.mnd",SOUNDFILEPATH);
|
|
|
|
CSoundManager &sm = CSoundManager::GetInstance();
|
|
ISoundObject &sb = sm.GetBuffer(strSoundFilename, false);
|
|
int nBuffer=sb.Play(false);
|
|
|
|
if(dwSize) // 아이템일때
|
|
{
|
|
char strString[200];
|
|
CItemInstance *lpItem;
|
|
lpItem = new CItemInstance;
|
|
lpItem->SetItemInfo(lpItemBuffer, (size_t &)dwSize);
|
|
g_ClientMain.m_csStatus.AddInventoryItem(lpItem);
|
|
|
|
if(lpItem->GetIsEnableStack())
|
|
{
|
|
sprintf(strString, g_StringTable.m_strString[272], lpItem->GetItemInfo().m_SpriteData.m_szName, lpItem->GetNowDurability());
|
|
g_TextEdit.AddMessage(strString, g_ClientMain.m_dwMyChrID, 128);
|
|
} else
|
|
{
|
|
sprintf(strString, g_StringTable.m_strString[273], lpItem->GetItemInfo().m_SpriteData.m_szName);
|
|
g_TextEdit.AddMessage(strString, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
} else
|
|
{
|
|
if(dwGold)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Gold += dwGold;
|
|
|
|
char strString[200];
|
|
sprintf(strString, g_StringTable.m_strString[274], dwGold);
|
|
g_TextEdit.AddMessage(strString, g_ClientMain.m_dwMyChrID, 128);
|
|
} else
|
|
{
|
|
char strString[200];
|
|
CItemInstance *lpExistItem = g_ClientMain.m_csStatus.GetInventoryItem(pItemIndex.m_cIndex);
|
|
if(lpExistItem)
|
|
{
|
|
sprintf(strString, g_StringTable.m_strString[272], lpExistItem->GetItemInfo().m_SpriteData.m_szName, cNum);
|
|
g_TextEdit.AddMessage(strString, g_ClientMain.m_dwMyChrID, 128);
|
|
|
|
// 스택이 일어난다.
|
|
unsigned dwNum = lpExistItem->GetNowDurability() + cNum;
|
|
lpExistItem->SetNowDurability(dwNum);
|
|
g_ClientMain.m_csStatus.SetQuickSlot(lpExistItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
} else
|
|
{
|
|
if(m_dwNetworkError == 2 || m_dwNetworkError == 3 || m_dwNetworkError == 6)
|
|
{
|
|
g_ClientMain.DeleteFieldObject(dwObjectID);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharPickUpInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID, dwObjectID;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharPickUpInfo(aryBuffer, &dwChrID, &dwObjectID);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
g_ClientMain.DeleteFieldObject(dwObjectID);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharAttacked(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned short wJudge;
|
|
unsigned char cIndex, cValue;
|
|
float fDir;
|
|
POS psPos;
|
|
AtType pAtType;
|
|
unsigned short wHp, wMp;
|
|
m_dwNetworkError = m_pSocket->HandleCharAttacked(aryBuffer, &dwChrID, &pAtType, &psPos, &fDir, &wJudge, &wHp, &wMp,
|
|
&cIndex, &cValue);
|
|
|
|
if(m_dwNetworkError == 0)
|
|
{
|
|
if(g_CharacterData.m_nFocusCharacter == -1) return TRUE;
|
|
|
|
stDamage pDamage;
|
|
pDamage.sLifeTime = 1500;
|
|
pDamage.wMode = wJudge;
|
|
pDamage.fScale = 1.0f;
|
|
switch(wJudge)
|
|
{
|
|
case ClientSocket::Judge_ManaShell:
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->AddBodyEffect("chant_ManaShell.esf", (unsigned long)0, true);
|
|
pDamage.wMode = ClientSocket::Judge_Guard;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
case ClientSocket::Judge_ManaHeal:
|
|
pDamage.lValue = wMp - g_ClientMain.m_csStatus.m_Info.MP;
|
|
if(!pDamage.lValue)
|
|
{
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[275], g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
case ClientSocket::Judge_Heal:
|
|
pDamage.lValue = wHp - g_ClientMain.m_csStatus.m_Info.HP;
|
|
if(!pDamage.lValue)
|
|
{
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[275], g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
case ClientSocket::Judge_Chant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_NonShow:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Enchant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Disenchant:
|
|
break;
|
|
|
|
case ClientSocket::Judge_Evade:
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
case ClientSocket::Judge_Resist:
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
|
|
default:
|
|
pDamage.lValue = g_ClientMain.m_csStatus.m_Info.HP - wHp;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lstDamageNumber.Add(pDamage);
|
|
break;
|
|
}
|
|
|
|
BOOL bCastCancel = TRUE;
|
|
if(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->GetChantFlag(18) ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->GetChantFlag(23))
|
|
{
|
|
if(pAtType.m_wType & 0x8000)
|
|
{
|
|
const Skill::ProtoType *lpSkillType = g_SkillMgr.GetSkillProtoType(pAtType.m_wType);
|
|
if(lpSkillType)
|
|
{
|
|
if(lpSkillType->m_bProtection)
|
|
{
|
|
bCastCancel = FALSE;
|
|
}
|
|
}
|
|
} else
|
|
{
|
|
bCastCancel = FALSE;
|
|
}
|
|
}
|
|
|
|
if(pAtType.m_wType & 0x8000)
|
|
{
|
|
const Skill::ProtoType *lpSkillType = g_SkillMgr.GetSkillProtoType(pAtType.m_wType);
|
|
if(lpSkillType)
|
|
{
|
|
if(!lpSkillType->m_bInterrupt)
|
|
{
|
|
bCastCancel = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(bCastCancel)
|
|
{
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
// 스킬 캐스팅 실패.....
|
|
if(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bStillCasting &&
|
|
!(wJudge == ClientSocket::Judge_Heal || wJudge == ClientSocket::Judge_ManaHeal))
|
|
{
|
|
CCameraControl::SetFadeOut(1.0f, 1.0f, 30.0f);
|
|
|
|
g_CharacterData.m_bSkillExecuted = FALSE;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->CancelSkill();
|
|
|
|
const Skill::ProtoType *lpSkillTypeTemp = g_SkillMgr.GetSkillProtoType(g_ClientMain.m_csStatus.m_lpQuickSelected->GetProtoTypeID());
|
|
const Skill::ProtoType *lpSkillType = &lpSkillTypeTemp[g_CharacterData.m_dwCastingSkillGrade];
|
|
|
|
unsigned long cLevel;
|
|
if(Skill::Type::INSTANCE == lpSkillType->m_eSkillType)
|
|
{
|
|
cLevel = (unsigned char)g_CharacterData.m_dwCastingSkillTick;
|
|
} else
|
|
{
|
|
unsigned long dwLevelTick = lpSkillType->m_LevelTick * ((500 - ((g_ClientMain.m_csStatus.m_Info.DEX + g_ClientMain.m_csStatus.m_lAddDEX) - 20)) / 500.0f);
|
|
cLevel = g_CharacterData.m_dwCastingSkillTick / dwLevelTick;
|
|
}
|
|
|
|
unsigned long dwDefenser[10];
|
|
ZeroMemory(&dwDefenser, sizeof(unsigned long) * 10);
|
|
SendCharAttack(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection - FLOAT_PHI / 2.0f,
|
|
g_ClientMain.m_csStatus.m_lpQuickSelected->GetProtoTypeID(),
|
|
g_CharacterData.m_dwCastingSkillGrade, cLevel, 0, 0, dwDefenser);
|
|
g_ClientMain.SetSkillCoolDown(g_CharacterData.m_dwCastingSkillGrade, 0);
|
|
}/**/
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
|
}
|
|
|
|
switch(pDamage.wMode)
|
|
{
|
|
case ClientSocket::Judge_Resist:
|
|
case ClientSocket::Judge_Guard:
|
|
{
|
|
CEffScript *test_script;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
test_script = new CEffScript;
|
|
CSceneManager::AddEffectScript(test_script);
|
|
test_script->GetScriptBinData("guard_blocking.esf");
|
|
|
|
test_script->SetStartPos(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.x,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.y,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.z);
|
|
test_script->SetEndPos(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.x,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.y,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.z);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::Judge_Critical:
|
|
{
|
|
CEffScript *test_script;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
test_script = new CEffScript;
|
|
CSceneManager::AddEffectScript(test_script);
|
|
test_script->GetScriptBinData("guard_critical.esf");
|
|
|
|
test_script->SetStartPos(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.x,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.y,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.z);
|
|
test_script->SetEndPos(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.x,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.y,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos.z);
|
|
}
|
|
break;
|
|
}
|
|
|
|
if(g_CharacterData.GetClientType(dwChrID) == CT_MONSTER || pDamage.wMode == ClientSocket::Judge_Poisoned)
|
|
{
|
|
DefenserNode DNode;
|
|
DNode.m_dwCharID = g_ClientMain.m_dwMyChrID;
|
|
if(wJudge == ClientSocket::Judge_ManaHeal)
|
|
DNode.m_wDamage = wMp - g_ClientMain.m_csStatus.m_Info.MP;
|
|
else if(wJudge == ClientSocket::Judge_Heal)
|
|
DNode.m_wDamage = wHp - g_ClientMain.m_csStatus.m_Info.HP;
|
|
else
|
|
DNode.m_wDamage = g_ClientMain.m_csStatus.m_Info.HP - wHp;
|
|
DNode.m_wMaxHP = g_ClientMain.m_csStatus.m_MaxHP;
|
|
DNode.m_sCurrHP = wHp;
|
|
DNode.m_wMaxMP = g_ClientMain.m_csStatus.m_MaxMP;
|
|
DNode.m_sCurrMP = wMp;
|
|
DNode.m_cJudge = wJudge;
|
|
List<DWORD> SendCharacterList;
|
|
g_CharacterData.GetSendCharacterAroundList(SendCharacterList);
|
|
for(int i=0;i<SendCharacterList.num;i++)
|
|
{
|
|
m_pSocket->RegistInstanceUDPList(SendCharacterList[i]);
|
|
}
|
|
m_pSocket->CharAttackInfo(dwChrID, pAtType, 1, &DNode);
|
|
}
|
|
|
|
if(g_CharacterData.GetClientType(dwChrID) == CT_MONSTER)
|
|
{
|
|
CCreature *lpCreature;
|
|
lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
|
|
if(lpCreature)
|
|
{
|
|
if(lpCreature->m_lpChrModel)
|
|
{
|
|
// char a[200];
|
|
// sprintf(a, "ID가 0x%08x인 우라질같은 %s놈이 %d만큼 때렸습니다.", dwChrID, lpCreature->m_strName, DNode.m_wDamage);
|
|
// g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
|
|
if(lpCreature->m_dwLowerChrAction == CA_RUN || lpCreature->m_dwLowerChrAction == CA_WALK)
|
|
lpCreature->m_lpChrModel->AddMotion("ATTACK", 3, 1.0f);
|
|
else
|
|
lpCreature->SetAction(CA_ATTACK, CA_ATTACK);
|
|
lpCreature->m_lpChrModel->SetDirection(-(fDir) - FLOAT_PHI / 2.0f);
|
|
}
|
|
} else
|
|
{
|
|
const CMonsterMgr::MonsterProtoType *lpMonster = g_MonsterMgr.GetMonsterProtoType(dwChrID & 0x0000FFFF);
|
|
if(lpMonster)
|
|
{
|
|
vector3 vecPos = vector3(psPos.fPointX * 100.0f, psPos.fPointY * 100.0f, psPos.fPointZ * 100.0f);
|
|
g_CharacterData.AddCharacter(dwChrID, lpMonster->m_MonsterInfo.m_strName,
|
|
(char *)lpMonster->m_MonsterInfo.m_strModelingFlag, vecPos, -(fDir) - FLOAT_PHI / 2.0f);
|
|
lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
|
|
if(lpCreature && lpCreature->m_lpChrModel)
|
|
{
|
|
if(lpCreature->m_dwLowerChrAction == CA_RUN || lpCreature->m_dwLowerChrAction == CA_WALK)
|
|
lpCreature->m_lpChrModel->AddMotion("ATTACK", 3, 1.0f);
|
|
else
|
|
lpCreature->SetAction(CA_ATTACK, CA_ATTACK);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
g_CharacterData.RegistAttacked(dwChrID, g_ClientMain.m_dwMyChrID, pAtType.m_wType);
|
|
|
|
// 장비 내구도 달기
|
|
if(cIndex < Item::EquipmentPos::MAX_EQUPMENT_POS && g_ClientMain.m_csStatus.m_lstEquipment[cIndex])
|
|
{
|
|
g_ClientMain.m_csStatus.m_lstEquipment[cIndex]->SetNowDurability(cValue);
|
|
|
|
if(cValue == 0)
|
|
{
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[271], g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
}
|
|
|
|
// 스킬 2차 이펙트를 붙인다.
|
|
if((pAtType.m_wType & 0x8000) && (pAtType.m_cSkillLevel || pAtType.m_cSkillLockCount))
|
|
{
|
|
CCreature *AttCreature = NULL;
|
|
AttCreature = g_CharacterData.GetCreature(dwChrID);
|
|
if(AttCreature != NULL)
|
|
{
|
|
if( g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter] == AttCreature ) // 마법을 쏜사람이 자신일때
|
|
SetHitEffect(pAtType, g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter],AttCreature,0);
|
|
else
|
|
SetHitEffect(pAtType, g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter],AttCreature,1);
|
|
}
|
|
else
|
|
{
|
|
SetHitEffect(pAtType, g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter],NULL,1);
|
|
}
|
|
}
|
|
|
|
/* char a[100];
|
|
sprintf(a, "%d로 HP가 왔다.", wHp);
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);*/
|
|
|
|
if(wHp > 0)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.HP = wHp;
|
|
} else if(wJudge != ClientSocket::Judge_NonShow)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.HP = 0;
|
|
g_CharacterData.InitGlobalAction();
|
|
|
|
char strText[MAX_PATH], *strName = g_CharacterData.GetCreatureName(dwChrID);
|
|
unsigned long dwCreatureType = g_CharacterData.GetClientType(dwChrID);
|
|
|
|
if(strName)
|
|
{
|
|
if(dwCreatureType == CT_PC)
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[381], strName);
|
|
} else
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[382], strName);
|
|
}
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 129);
|
|
} else
|
|
{
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[383], g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_sCurrHP = 0;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->Dead();
|
|
g_ClientMain.m_csStatus.ChantDisable();
|
|
g_ClientMain.SetAutoRun(FALSE);
|
|
SendMovingPacket(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwUpperChrAction,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos);
|
|
}
|
|
g_ClientMain.m_csStatus.m_Info.MP = wMp;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharTakeItem(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID;
|
|
TakeType pTakeType;
|
|
m_dwNetworkError = m_pSocket->HandleCharTakeItem(aryBuffer, &dwChrID, &pTakeType);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID != g_ClientMain.m_dwMyChrID) return FALSE;
|
|
/* list<CItemInstance *>::iterator it;
|
|
for(it = g_ClientMain.m_csStatus.m_lstInventory.being(); it <= g_ClientMain.m_csStatus.m_lstInventory.end(); it++)
|
|
{
|
|
if((*it)->m_lpItem->m_lpItemBase->m_ItemInfo.m_nItemIndex.m_cIndex == pTakeType.m_srcPos.m_cIndex)
|
|
{
|
|
if(pTakeType.m_srcPos.m_cPos == TakeType::TS_INVEN)
|
|
{
|
|
g_ClientMain.m_lpPickItem->m_lpItem->m_lpItemBase->m_ItemInfo.m_nItemIndex = pTakeType.m_dstPos;
|
|
g_ClientMain.m_csStatus.m_lstEquipment[pTakeType.m_dstPos.m_cIndex] = g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
}
|
|
}
|
|
}*/
|
|
// list<CItemInstance *>::iterator it;
|
|
// for(it = g_ClientMain.m_csStatus.m_lstInventory.being(); it <= g_ClientMain.m_csStatus.m_lstInventory.end(); it++)
|
|
// if(pTakeType.m_srcPos.m_cPos == TakeType::TS_INVEN)
|
|
if(g_ClientMain.m_lpPickItem->GetIsEnableStack()) // 스택 가능한 물건
|
|
{
|
|
switch(pTakeType.m_dstPos.m_cPos)
|
|
{
|
|
case TakeType::TS_INVEN:
|
|
{
|
|
CItemInstance *lpInstance = g_ClientMain.m_csStatus.GetInventoryItem(pTakeType.m_dstPos.m_cIndex);
|
|
if(lpInstance)
|
|
{
|
|
// 목적지에 아이템이 있다.
|
|
unsigned long dwNum = lpInstance->GetNowDurability() + pTakeType.m_cNum;
|
|
lpInstance->SetNowDurability(dwNum);
|
|
g_ClientMain.m_csStatus.SetQuickSlot(lpInstance);
|
|
|
|
if(g_ClientMain.m_lpPickItem->GetNowDurability() == pTakeType.m_cNum)
|
|
{
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
} else
|
|
{
|
|
dwNum = g_ClientMain.m_lpPickItem->GetNowDurability() - pTakeType.m_cNum;
|
|
g_ClientMain.m_lpPickItem->SetNowDurability(dwNum);
|
|
}
|
|
} else
|
|
{
|
|
// 목적지에 아이템이 없다.
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_dstPos);
|
|
g_ClientMain.m_csStatus.AddInventoryItem(g_ClientMain.m_lpPickItem);
|
|
g_ClientMain.SetPickItem(NULL);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case TakeType::TS_EQUIP:
|
|
{
|
|
CItemInstance *lpInstance = g_ClientMain.m_csStatus.m_lstEquipment[pTakeType.m_dstPos.m_cIndex];
|
|
if(lpInstance)
|
|
{
|
|
// 목적지에 아이템이 있다.
|
|
unsigned long dwNum = lpInstance->GetNowDurability() + pTakeType.m_cNum;
|
|
lpInstance->SetNowDurability(dwNum);
|
|
g_ClientMain.m_csStatus.SetQuickSlot(lpInstance);
|
|
|
|
if(g_ClientMain.m_lpPickItem->GetNowDurability() == pTakeType.m_cNum)
|
|
{
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
} else
|
|
{
|
|
dwNum = g_ClientMain.m_lpPickItem->GetNowDurability() - pTakeType.m_cNum;
|
|
g_ClientMain.m_lpPickItem->SetNowDurability(dwNum);
|
|
}
|
|
} else
|
|
{
|
|
// 목적지에 아이템이 없다.
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_dstPos);
|
|
g_ClientMain.m_csStatus.m_lstEquipment[pTakeType.m_dstPos.m_cIndex] = g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case TakeType::TS_UPGRADE:
|
|
if(g_ClientMain.m_csStatus.m_lpUpgrade[pTakeType.m_dstPos.m_cIndex])
|
|
{
|
|
// 목적지에 아이템이 있다.
|
|
unsigned long dwNum = g_ClientMain.m_csStatus.m_lpUpgrade[pTakeType.m_dstPos.m_cIndex]->GetNowDurability() + pTakeType.m_cNum;
|
|
g_ClientMain.m_csStatus.m_lpUpgrade[pTakeType.m_dstPos.m_cIndex]->SetNowDurability(dwNum);
|
|
|
|
if(g_ClientMain.m_lpPickItem->GetNowDurability() == pTakeType.m_cNum)
|
|
{
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
} else
|
|
{
|
|
dwNum = g_ClientMain.m_lpPickItem->GetNowDurability() - pTakeType.m_cNum;
|
|
g_ClientMain.m_lpPickItem->SetNowDurability(dwNum);
|
|
}
|
|
} else
|
|
{
|
|
// 목적지에 아이템이 없다.
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_dstPos);
|
|
g_ClientMain.m_csStatus.m_lpUpgrade[pTakeType.m_dstPos.m_cIndex] = g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
}
|
|
break;
|
|
|
|
case TakeType::TS_EXCHANGE:
|
|
{
|
|
CItemInstance *lpInstance = g_ClientMain.m_csStatus.GetExchangeItem(pTakeType.m_dstPos.m_cIndex);
|
|
if(lpInstance)
|
|
{
|
|
// 목적지에 아이템이 있다.
|
|
unsigned long dwNum = lpInstance->GetNowDurability() + pTakeType.m_cNum;
|
|
lpInstance->SetNowDurability(dwNum);
|
|
g_ClientMain.m_csStatus.SetQuickSlot(lpInstance);
|
|
|
|
if(g_ClientMain.m_lpPickItem->GetNowDurability() == pTakeType.m_cNum)
|
|
{
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
} else
|
|
{
|
|
dwNum = g_ClientMain.m_lpPickItem->GetNowDurability() - pTakeType.m_cNum;
|
|
g_ClientMain.m_lpPickItem->SetNowDurability(dwNum);
|
|
}
|
|
} else
|
|
{
|
|
// 목적지에 아이템이 없다.
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_dstPos);
|
|
g_ClientMain.m_csStatus.AddExchangeItem(g_ClientMain.m_lpPickItem);
|
|
g_ClientMain.SetPickItem(NULL);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Deposit:
|
|
{
|
|
CItemInstance *lpInstance = g_ClientMain.m_csStatus.GetDepositItem(pTakeType.m_dstPos.m_cIndex);
|
|
|
|
g_ClientMain.m_csStatus.PayDepositPrice(g_ClientMain.m_lpPickItem->m_ipPreIndex.m_cPos, pTakeType.m_dstPos.m_cPos);
|
|
|
|
if(lpInstance)
|
|
{
|
|
// 목적지에 아이템이 있다.
|
|
unsigned long dwNum = lpInstance->GetNowDurability() + pTakeType.m_cNum;
|
|
lpInstance->SetNowDurability(dwNum);
|
|
g_ClientMain.m_csStatus.SetQuickSlot(lpInstance);
|
|
|
|
if(g_ClientMain.m_lpPickItem->GetNowDurability() == pTakeType.m_cNum)
|
|
{
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
} else
|
|
{
|
|
dwNum = g_ClientMain.m_lpPickItem->GetNowDurability() - pTakeType.m_cNum;
|
|
g_ClientMain.m_lpPickItem->SetNowDurability(dwNum);
|
|
}
|
|
} else
|
|
{
|
|
// 목적지에 아이템이 없다.
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_dstPos);
|
|
g_ClientMain.m_csStatus.AddDepositItem(g_ClientMain.m_lpPickItem);
|
|
g_ClientMain.SetPickItem(NULL);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
} else
|
|
{ // 그냥 평범한 장비
|
|
switch(pTakeType.m_dstPos.m_cPos)
|
|
{
|
|
case TakeType::TS_EQUIP:
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_dstPos);
|
|
g_ClientMain.m_csStatus.AddEquipItem(pTakeType.m_dstPos.m_cIndex, g_ClientMain.m_lpPickItem);
|
|
g_ClientMain.m_Network.SendCharShape();
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
g_ClientMain.SetPickItem(NULL);
|
|
break;
|
|
|
|
case TakeType::TS_INVEN:
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_dstPos);
|
|
g_ClientMain.m_csStatus.AddInventoryItem(g_ClientMain.m_lpPickItem);
|
|
g_ClientMain.SetPickItem(NULL);
|
|
break;
|
|
|
|
case TakeType::TS_UPGRADE:
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_dstPos);
|
|
g_ClientMain.m_csStatus.m_lpUpgrade[pTakeType.m_dstPos.m_cIndex] = g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
break;
|
|
|
|
case TakeType::TS_EXCHANGE:
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_dstPos);
|
|
g_ClientMain.m_csStatus.AddExchangeItem(g_ClientMain.m_lpPickItem);
|
|
g_ClientMain.SetPickItem(NULL);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Deposit:
|
|
g_ClientMain.m_csStatus.PayDepositPrice(g_ClientMain.m_lpPickItem->m_ipPreIndex.m_cPos, pTakeType.m_dstPos.m_cPos);
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_dstPos);
|
|
g_ClientMain.m_csStatus.AddDepositItem(g_ClientMain.m_lpPickItem);
|
|
g_ClientMain.SetPickItem(NULL);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstExchange.empty() || !g_ClientMain.m_csStatus.m_dwExchangeGold)
|
|
{
|
|
g_ClientMain.m_lpInterface->ProcessExchangeCmd(g_ClientMain.m_dwMyChrID, 100);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharSplitItem(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID;
|
|
TakeType pTakeType;
|
|
unsigned char cSize;
|
|
size_t dwSize;
|
|
char *lpItemBuffer;
|
|
m_dwNetworkError = m_pSocket->HandleCharSplitItem(aryBuffer, &dwChrID, &pTakeType, &cSize, &lpItemBuffer);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID != g_ClientMain.m_dwMyChrID) return FALSE;
|
|
|
|
dwSize = cSize;
|
|
|
|
CItemInstance *lpExistItem = NULL;
|
|
switch(pTakeType.m_srcPos.m_cPos)
|
|
{
|
|
case ClientSocket::ItemPos_Inven:
|
|
lpExistItem = g_ClientMain.m_csStatus.GetInventoryItem(pTakeType.m_srcPos.m_cIndex);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Upgrade:
|
|
lpExistItem = g_ClientMain.m_csStatus.m_lpUpgrade[1];
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Exchange:
|
|
lpExistItem = g_ClientMain.m_csStatus.GetExchangeItem(pTakeType.m_srcPos.m_cIndex);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Equip:
|
|
lpExistItem = g_ClientMain.m_csStatus.m_lstEquipment[pTakeType.m_srcPos.m_cIndex];
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Deposit:
|
|
lpExistItem = g_ClientMain.m_csStatus.GetDepositItem(pTakeType.m_srcPos.m_cIndex);
|
|
break;
|
|
}
|
|
|
|
if(!lpExistItem) return FALSE;
|
|
|
|
CItemInstance *lpItem;
|
|
lpItem = new CItemInstance;
|
|
lpItem->SetItemInfo(lpItemBuffer, dwSize);
|
|
lpItem->SetPos(pTakeType.m_dstPos);
|
|
|
|
switch(pTakeType.m_dstPos.m_cPos)
|
|
{
|
|
case ClientSocket::ItemPos_Inven:
|
|
g_ClientMain.m_csStatus.AddInventoryItem(lpItem);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Exchange:
|
|
g_ClientMain.m_csStatus.AddExchangeItem(lpItem);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Upgrade:
|
|
g_ClientMain.m_csStatus.m_lpUpgrade[pTakeType.m_dstPos.m_cIndex] = lpItem;
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Equip:
|
|
g_ClientMain.m_csStatus.m_lstEquipment[pTakeType.m_dstPos.m_cIndex] = lpItem;
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Deposit:
|
|
g_ClientMain.m_csStatus.PayDepositPrice(pTakeType.m_srcPos.m_cPos, pTakeType.m_dstPos.m_cPos);
|
|
g_ClientMain.m_csStatus.AddDepositItem(lpItem);
|
|
break;
|
|
}
|
|
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstExchange.empty() || !g_ClientMain.m_csStatus.m_dwExchangeGold)
|
|
{
|
|
g_ClientMain.m_lpInterface->ProcessExchangeCmd(g_ClientMain.m_dwMyChrID, 100);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharPullDown(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID;
|
|
Item::ItemPos pItemIndex;
|
|
FieldObject FieldObject;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharPullDown(aryBuffer, &dwChrID, &pItemIndex, &FieldObject);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstExchange.empty() || !g_ClientMain.m_csStatus.m_dwExchangeGold)
|
|
{
|
|
g_ClientMain.m_lpInterface->ProcessExchangeCmd(g_ClientMain.m_dwMyChrID, 100);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
} else
|
|
{
|
|
if(m_dwNetworkError == 5)
|
|
{
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstExchange.empty() || !g_ClientMain.m_csStatus.m_dwExchangeGold)
|
|
{
|
|
g_ClientMain.m_lpInterface->ProcessExchangeCmd(g_ClientMain.m_dwMyChrID, 100);
|
|
}
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharSwapItem(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID;
|
|
TakeType pSrcType, pDstType;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharSwapItem(aryBuffer, &dwChrID, &pSrcType, &pDstType);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
CItemInstance *lpTemp;
|
|
switch(pDstType.m_srcPos.m_cPos)
|
|
{
|
|
case ClientSocket::ItemPos_Equip:
|
|
lpTemp = g_ClientMain.m_csStatus.m_lstEquipment[pDstType.m_srcPos.m_cIndex];
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Inven:
|
|
lpTemp = g_ClientMain.m_csStatus.GetInventoryItem(pDstType.m_srcPos.m_cIndex);
|
|
{
|
|
CItemInstance *lpStallItem = g_ClientMain.m_csStatus.GetStreetTradeItem(lpTemp->m_dwItemUID);
|
|
if(lpStallItem)
|
|
{
|
|
TakeType pTakeType;
|
|
pTakeType.m_srcPos.m_cPos = ClientSocket::ItemPos_Stall;
|
|
pTakeType.m_srcPos.m_cIndex = 0;
|
|
pTakeType.m_dstPos = lpStallItem->m_lpItemBase->GetPos();
|
|
if(lpStallItem->GetIsEnableStack())
|
|
{
|
|
pTakeType.m_cNum = lpStallItem->GetNowDurability();
|
|
} else
|
|
{
|
|
pTakeType.m_cNum = 1;
|
|
}
|
|
g_ClientMain.m_Network.m_nsNetworkState = NS_STALLREGISTERITEM;
|
|
g_ClientMain.m_Network.m_pSocket->CharStallRegisterItem(g_ClientMain.m_dwMyChrID, pTakeType, 0, ClientSocket::StallCmd_Cancel);
|
|
}
|
|
}
|
|
g_ClientMain.m_csStatus.DeleteInventoryItem(lpTemp);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Exchange:
|
|
lpTemp = g_ClientMain.m_csStatus.GetExchangeItem(pDstType.m_srcPos.m_cIndex);
|
|
g_ClientMain.m_csStatus.DeleteExchangeItem(lpTemp);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Upgrade:
|
|
lpTemp = g_ClientMain.m_csStatus.m_lpUpgrade[pDstType.m_srcPos.m_cIndex];
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Deposit:
|
|
lpTemp = g_ClientMain.m_csStatus.GetDepositItem(pDstType.m_srcPos.m_cIndex);
|
|
g_ClientMain.m_csStatus.DeleteDepositItem(lpTemp);
|
|
break;
|
|
}
|
|
|
|
lpTemp->SetPos(pDstType.m_dstPos);
|
|
|
|
if(!g_ClientMain.m_lpPickItem)
|
|
{
|
|
CItemInstance *lpTemp;
|
|
switch(pSrcType.m_srcPos.m_cPos)
|
|
{
|
|
case ClientSocket::ItemPos_Equip:
|
|
lpTemp = g_ClientMain.m_csStatus.m_lstEquipment[pSrcType.m_srcPos.m_cIndex];
|
|
g_ClientMain.m_csStatus.m_lstEquipment[pSrcType.m_srcPos.m_cIndex] = NULL;
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Inven:
|
|
lpTemp = g_ClientMain.m_csStatus.GetInventoryItem(pSrcType.m_srcPos.m_cIndex);
|
|
{
|
|
CItemInstance *lpStallItem = g_ClientMain.m_csStatus.GetStreetTradeItem(lpTemp->m_dwItemUID);
|
|
if(lpStallItem)
|
|
{
|
|
TakeType pTakeType;
|
|
pTakeType.m_srcPos.m_cPos = ClientSocket::ItemPos_Stall;
|
|
pTakeType.m_srcPos.m_cIndex = 0;
|
|
pTakeType.m_dstPos = lpStallItem->m_lpItemBase->GetPos();
|
|
if(lpStallItem->GetIsEnableStack())
|
|
{
|
|
pTakeType.m_cNum = lpStallItem->GetNowDurability();
|
|
} else
|
|
{
|
|
pTakeType.m_cNum = 1;
|
|
}
|
|
g_ClientMain.m_Network.m_nsNetworkState = NS_STALLREGISTERITEM;
|
|
g_ClientMain.m_Network.m_pSocket->CharStallRegisterItem(g_ClientMain.m_dwMyChrID, pTakeType, 0, ClientSocket::StallCmd_Cancel);
|
|
}
|
|
}
|
|
g_ClientMain.m_csStatus.DeleteInventoryItem(lpTemp);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Exchange:
|
|
lpTemp = g_ClientMain.m_csStatus.GetExchangeItem(pSrcType.m_srcPos.m_cIndex);
|
|
g_ClientMain.m_csStatus.DeleteExchangeItem(lpTemp);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Upgrade:
|
|
lpTemp = g_ClientMain.m_csStatus.m_lpUpgrade[pSrcType.m_srcPos.m_cIndex];
|
|
g_ClientMain.m_csStatus.m_lpUpgrade[pSrcType.m_srcPos.m_cIndex] = NULL;
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Deposit:
|
|
lpTemp = g_ClientMain.m_csStatus.GetDepositItem(pSrcType.m_srcPos.m_cIndex);
|
|
g_ClientMain.m_csStatus.DeleteDepositItem(lpTemp);
|
|
break;
|
|
}
|
|
|
|
if(lpTemp)
|
|
{
|
|
g_ClientMain.SetPickItem(lpTemp);
|
|
} else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.PayDepositPrice(g_ClientMain.m_lpPickItem->m_ipPreIndex.m_cPos, pSrcType.m_dstPos.m_cPos);
|
|
g_ClientMain.m_lpPickItem->SetPos(pSrcType.m_dstPos);
|
|
|
|
switch(pSrcType.m_dstPos.m_cPos)
|
|
{
|
|
case ClientSocket::ItemPos_Equip:
|
|
g_ClientMain.m_csStatus.AddEquipItem(pSrcType.m_dstPos.m_cIndex, g_ClientMain.m_lpPickItem);
|
|
g_ClientMain.m_Network.SendCharShape();
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Exchange:
|
|
g_ClientMain.m_csStatus.AddExchangeItem(g_ClientMain.m_lpPickItem);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Inven:
|
|
g_ClientMain.m_csStatus.AddInventoryItem(g_ClientMain.m_lpPickItem);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Deposit:
|
|
g_ClientMain.m_csStatus.AddDepositItem(g_ClientMain.m_lpPickItem);
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Upgrade:
|
|
g_ClientMain.m_csStatus.m_lpUpgrade[pSrcType.m_dstPos.m_cIndex] = g_ClientMain.m_lpPickItem;
|
|
break;
|
|
}
|
|
|
|
g_ClientMain.SetPickItem(lpTemp);
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstExchange.empty() || !g_ClientMain.m_csStatus.m_dwExchangeGold)
|
|
{
|
|
g_ClientMain.m_lpInterface->ProcessExchangeCmd(g_ClientMain.m_dwMyChrID, 100);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharTradeItem(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID, dwNPCID, dwGold = 0;
|
|
size_t dwSize;
|
|
unsigned short wSize;
|
|
unsigned char cPos, cNum;
|
|
Item::ItemPos pItemIndex;
|
|
char *lpItemBuffer;
|
|
m_dwNetworkError = m_pSocket->HandleCharTradeItem(aryBuffer, &dwChrID, &dwNPCID, &cPos, &pItemIndex, &cNum, &dwGold, &wSize, &lpItemBuffer);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
dwSize = wSize;
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
switch(wSize)
|
|
{
|
|
case 0: // 팔때
|
|
// if(dwGold)
|
|
// {
|
|
g_ClientMain.m_csStatus.m_Info.Gold = g_ClientMain.m_csStatus.m_Info.Gold + dwGold;
|
|
/* } else
|
|
{
|
|
if(g_ClientMain.m_lpPickItem->GetIsEnableStack())
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Gold = g_ClientMain.m_csStatus.m_Info.Gold +
|
|
(g_ClientMain.m_lpPickItem->m_lpItemBase->GetSellPrice() * g_ClientMain.m_lpPickItem->GetNowDurability());
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Gold = g_ClientMain.m_csStatus.m_Info.Gold + g_ClientMain.m_lpPickItem->m_lpItemBase->GetSellPrice();
|
|
}
|
|
}*/
|
|
|
|
if(g_ClientMain.m_lpPickItem && g_ClientMain.m_lpPickItem->m_lpItemBase->GetPos() == pItemIndex)
|
|
{
|
|
g_ClientMain.m_csStatus.SetQuickSlot(g_ClientMain.m_lpPickItem);
|
|
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
} else
|
|
{
|
|
CItemInstance *lpItem = g_ClientMain.m_csStatus.GetInventoryItem(pItemIndex);
|
|
if(lpItem)
|
|
{
|
|
if(lpItem->GetIsEnableStack())
|
|
{
|
|
unsigned long dwNum = lpItem->GetNowDurability() - cNum;
|
|
lpItem->SetNowDurability(dwNum);
|
|
} else
|
|
{
|
|
lpItem->SetNowDurability(0);
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.SetQuickSlot(lpItem);
|
|
|
|
if(lpItem->GetNowDurability() == 0)
|
|
{
|
|
g_ClientMain.m_csStatus.DeleteInventoryItem(lpItem);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
default: // 살때
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Gold = g_ClientMain.m_csStatus.m_Info.Gold - dwGold;
|
|
|
|
CItemInstance *lpItem;
|
|
lpItem = new CItemInstance;
|
|
lpItem->SetItemInfo(lpItemBuffer, dwSize);
|
|
g_ClientMain.m_csStatus.AddInventoryItem(lpItem);
|
|
// if(0 != dwGold)
|
|
// {
|
|
// }
|
|
// else
|
|
// {
|
|
/* char strText[MAX_PATH];
|
|
sprintf(strText, "%d", dwGold);
|
|
MessageBox(NULL, strText, g_StringTable.m_strString[21], MB_OK);*/
|
|
/*
|
|
if(g_ClientMain.m_lpInterface->GetIsBlackMarket())
|
|
{
|
|
if(lpItem->GetIsEnableStack())
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Gold = g_ClientMain.m_csStatus.m_Info.Gold - (lpItem->m_lpItemBase->GetBuyBlackPrice() * lpItem->GetNowDurability());
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Gold = g_ClientMain.m_csStatus.m_Info.Gold - lpItem->m_lpItemBase->GetBuyBlackPrice();
|
|
}
|
|
} else
|
|
{
|
|
if(lpItem->GetIsEnableStack())
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Gold = g_ClientMain.m_csStatus.m_Info.Gold - (lpItem->m_lpItemBase->GetBuyPrice() * lpItem->GetNowDurability());
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Gold = g_ClientMain.m_csStatus.m_Info.Gold - lpItem->m_lpItemBase->GetBuyPrice();
|
|
}
|
|
}
|
|
}*/
|
|
}
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharShapeInfo(char *aryBuffer)
|
|
{
|
|
CHAR_VIEW pCharView;
|
|
unsigned char cSelectedHand;
|
|
unsigned long dwStatusFlag;
|
|
char strStallName[32];
|
|
bool bPeace;
|
|
m_dwNetworkError = m_pSocket->HandleCharShapeInfo(aryBuffer, &pCharView, &cSelectedHand, &dwStatusFlag, &bPeace, (char *)strStallName);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(pCharView.UID);
|
|
if(lpCreature)
|
|
{
|
|
lpCreature->m_dwSpendTime[1] = lpCreature->m_dwSpendTime[2] =
|
|
lpCreature->m_dwSpendTime[3] = lpCreature->m_dwSpendTime[4] = lpCreature->m_dwSpendTime[5] = GetTickCount();
|
|
|
|
// 캐릭터 복장
|
|
char *strTemp;
|
|
for(int i = 0; i < 15; i++)
|
|
{
|
|
strTemp = (char *)g_ItemMgr.GetEquipName(pCharView.Equip[i]);
|
|
if(strTemp) strcpy(lpCreature->m_strShape[i], strTemp); else strcpy(lpCreature->m_strShape[i], "");
|
|
// strcpy(lpCreature->m_strShape[i], g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strShape[i]);
|
|
}
|
|
|
|
lpCreature->m_dwPartyID = pCharView.Party;
|
|
lpCreature->m_wClass = pCharView.Class;
|
|
lpCreature->m_dwWeaponPos = cSelectedHand;
|
|
lpCreature->m_cLevel = pCharView.Level;
|
|
lpCreature->m_cNation = pCharView.Nationality;
|
|
lpCreature->m_cSex = pCharView.Sex;
|
|
lpCreature->m_bPeaceMode = bPeace;
|
|
strcpy(lpCreature->m_strStreetStallName, strStallName);
|
|
|
|
if(lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
lpCreature->SetChantEffect(dwStatusFlag, TRUE);
|
|
else
|
|
lpCreature->SetChantEffect(dwStatusFlag, FALSE);
|
|
|
|
if(!lpCreature->m_bUsed)
|
|
{
|
|
lpCreature->m_bUsed = TRUE;
|
|
strcpy(lpCreature->m_strName, pCharView.Name);
|
|
|
|
switch(pCharView.Nationality)
|
|
{
|
|
case NATION_HUMAN:
|
|
if(pCharView.Sex == 1)
|
|
strcpy(lpCreature->m_strGCMDSName, "PC_MAN.GCMDS");
|
|
else
|
|
strcpy(lpCreature->m_strGCMDSName, "PC_WOMAN.GCMDS");
|
|
break;
|
|
|
|
case NATION_AKHAN:
|
|
if(pCharView.Sex == 1)
|
|
strcpy(lpCreature->m_strGCMDSName, "PC_Akhan_A.GCMDS");
|
|
else
|
|
strcpy(lpCreature->m_strGCMDSName, "PC_Akhan_B.GCMDS");
|
|
break;
|
|
}
|
|
sprintf(lpCreature->m_strFaceType, "FACE%02d", pCharView.Face);
|
|
sprintf(lpCreature->m_strHairStyle, "HAIR%02d", pCharView.Hair);
|
|
// strcpy(lpCreature->m_strGCMDSName, g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strGCMDSName);
|
|
// strcpy(lpCreature->m_strFaceType, g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strFaceType);
|
|
// strcpy(lpCreature->m_strHairStyle, g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strHairStyle);
|
|
|
|
lpCreature->m_lpChrModel = g_CharacterData.AllocCharacter(lpCreature->m_strGCMDSName, lpCreature->m_strFaceType, lpCreature->m_strHairStyle, lpCreature->m_ChrNodeID, lpCreature->m_strShape);
|
|
lpCreature->m_lpChrModel->SetPosition(lpCreature->m_vecPos);
|
|
lpCreature->m_lpChrModel->SetDirection(lpCreature->m_fDirection);
|
|
lpCreature->m_bFirstPositionSend = FALSE;
|
|
if(lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
lpCreature->SetChantEffect(lpCreature->m_dwChant, TRUE);
|
|
else
|
|
lpCreature->SetChantEffect(lpCreature->m_dwChant, FALSE);
|
|
|
|
m_lstRecvShape.push_back(pCharView.UID);
|
|
list<unsigned long>::iterator it;
|
|
for(it = m_lstSendShape.begin(); it != m_lstSendShape.end(); it++)
|
|
{
|
|
if((*it) == pCharView.UID)
|
|
{
|
|
m_lstSendShape.erase(it);
|
|
break;
|
|
}
|
|
}
|
|
|
|
} else
|
|
{
|
|
lpCreature->SetShape(lpCreature->m_strShape);
|
|
}
|
|
|
|
lpCreature->m_dwSpendTime[4] = GetTickCount();
|
|
} else
|
|
{
|
|
g_CharacterData.AddCharacter(pCharView.UID, vector3(0.0f, 0.0f, 0.0f));
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(pCharView.UID);
|
|
if(lpCreature)
|
|
{
|
|
lpCreature->m_dwSpendTime[1] = lpCreature->m_dwSpendTime[2] =
|
|
lpCreature->m_dwSpendTime[3] = lpCreature->m_dwSpendTime[4] = lpCreature->m_dwSpendTime[5] = GetTickCount();
|
|
|
|
char *strTemp;
|
|
for(int i = 0; i < 15; i++)
|
|
{
|
|
strTemp = (char *)g_ItemMgr.GetEquipName(pCharView.Equip[i]);
|
|
if(strTemp) strcpy(lpCreature->m_strShape[i], strTemp); else strcpy(lpCreature->m_strShape[i], "");
|
|
// strcpy(lpCreature->m_strShape[i], g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strShape[i]);
|
|
}
|
|
|
|
lpCreature->m_dwPartyID = pCharView.Party;
|
|
lpCreature->m_bUsed = TRUE;
|
|
lpCreature->m_wClass = pCharView.Class;
|
|
lpCreature->m_dwWeaponPos = cSelectedHand;
|
|
lpCreature->m_cLevel = pCharView.Level;
|
|
lpCreature->m_cNation = pCharView.Nationality;
|
|
lpCreature->m_cSex = pCharView.Sex;
|
|
lpCreature->m_bPeaceMode = bPeace;
|
|
strcpy(lpCreature->m_strStreetStallName, strStallName);
|
|
if(lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
lpCreature->SetChantEffect(dwStatusFlag, TRUE);
|
|
else
|
|
lpCreature->SetChantEffect(dwStatusFlag, FALSE);
|
|
strcpy(lpCreature->m_strName, pCharView.Name);
|
|
|
|
switch(pCharView.Nationality)
|
|
{
|
|
case NATION_HUMAN:
|
|
if(pCharView.Sex == 1)
|
|
strcpy(lpCreature->m_strGCMDSName, "PC_MAN.GCMDS");
|
|
else
|
|
strcpy(lpCreature->m_strGCMDSName, "PC_WOMAN.GCMDS");
|
|
break;
|
|
|
|
case NATION_AKHAN:
|
|
if(pCharView.Sex == 1)
|
|
strcpy(lpCreature->m_strGCMDSName, "PC_Akhan_A.GCMDS");
|
|
else
|
|
strcpy(lpCreature->m_strGCMDSName, "PC_Akhan_B.GCMDS");
|
|
break;
|
|
}
|
|
sprintf(lpCreature->m_strFaceType, "FACE%02d", pCharView.Face);
|
|
sprintf(lpCreature->m_strHairStyle, "HAIR%02d", pCharView.Hair);
|
|
// strcpy(lpCreature->m_strGCMDSName, g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strGCMDSName);
|
|
// strcpy(lpCreature->m_strFaceType, g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strFaceType);
|
|
// strcpy(lpCreature->m_strHairStyle, g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strHairStyle);
|
|
|
|
lpCreature->m_lpChrModel = g_CharacterData.AllocCharacter(lpCreature->m_strGCMDSName, lpCreature->m_strFaceType, lpCreature->m_strHairStyle, lpCreature->m_ChrNodeID, lpCreature->m_strShape);
|
|
lpCreature->m_lpChrModel->SetPosition(lpCreature->m_vecPos);
|
|
lpCreature->m_lpChrModel->SetDirection(lpCreature->m_fDirection);
|
|
lpCreature->m_bFirstPositionSend = FALSE;
|
|
if(lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
lpCreature->SetChantEffect(lpCreature->m_dwChant, TRUE);
|
|
else
|
|
lpCreature->SetChantEffect(lpCreature->m_dwChant, FALSE);
|
|
|
|
m_lstRecvShape.push_back(pCharView.UID);
|
|
|
|
lpCreature->m_dwSpendTime[4] = GetTickCount();
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharPartyCmd(char *aryBuffer)
|
|
{
|
|
unsigned long dwSenderID, dwRecvID, dwPartyID;
|
|
unsigned short wCmd;
|
|
char strName[32];
|
|
AddressInfo pAddressInfo;
|
|
m_dwNetworkError = m_pSocket->HandleCharPartyCmd(aryBuffer, &pAddressInfo, strName, &dwSenderID, &dwRecvID, &dwPartyID, &wCmd);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(wCmd)
|
|
{
|
|
case ClientSocket::PartyCmd_Invite:
|
|
if(g_ClientMain.m_lpInterface)
|
|
{
|
|
if(g_ClientMain.m_lpInterface->GetBusy())
|
|
{
|
|
SendPartyCmd(dwSenderID, ClientSocket::PartyCmd_Refuse);
|
|
} else
|
|
{
|
|
g_ClientMain.m_lpInterface->m_dwPartyCmdResult = 0;
|
|
g_ClientMain.m_lpInterface->m_dwPartyCmdType = ClientSocket::PartyCmd_Invite;
|
|
g_ClientMain.m_lpInterface->m_dwPartyCmdSenderID = dwSenderID;
|
|
char strText[200];
|
|
sprintf(strText, g_StringTable.m_strString[276], strName);
|
|
CGUIMessageBox *lpMessageBox;
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(strText, MB_EXIT | MB_YES | MB_NO);
|
|
lpMessageBox->SetResult(&g_ClientMain.m_lpInterface->m_dwPartyCmdResult);
|
|
lpMessageBox->SetEnableEnter(FALSE);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_Accept:
|
|
{
|
|
char strText[200];
|
|
sprintf(strText, g_StringTable.m_strString[277], strName);
|
|
g_ClientMain.m_csStatus.AddPartyPlayer(dwSenderID, dwRecvID, strName);
|
|
|
|
g_ClientMain.m_bPartyFind = FALSE;
|
|
g_ClientMain.m_bPartyPlayerFind = FALSE;
|
|
|
|
if(dwSenderID != g_ClientMain.m_dwMyChrID)
|
|
{
|
|
unsigned long dwResult = m_pSocket->InsertIntoAddressList(ClientSocket::ListType_Party, pAddressInfo.m_dwCharID, pAddressInfo.m_PublicAddress, pAddressInfo.m_PrivateAddress);
|
|
|
|
#ifdef _DEBUG
|
|
char a[200];
|
|
sprintf(a, "4. 0x%08x = Pub : %d.%d.%d.%d:%d, Pri : %d.%d.%d.%d:%d %d", pAddressInfo.m_dwCharID,
|
|
pAddressInfo.m_PublicAddress.sin_addr.s_net, pAddressInfo.m_PublicAddress.sin_addr.s_host, pAddressInfo.m_PublicAddress.sin_addr.s_lh, pAddressInfo.m_PublicAddress.sin_addr.s_impno, pAddressInfo.m_PublicAddress.sin_port,
|
|
pAddressInfo.m_PrivateAddress.sin_addr.s_net, pAddressInfo.m_PrivateAddress.sin_addr.s_host, pAddressInfo.m_PrivateAddress.sin_addr.s_lh, pAddressInfo.m_PrivateAddress.sin_addr.s_impno, pAddressInfo.m_PrivateAddress.sin_port, m_pSocket->GetPeerType(pAddressInfo.m_PublicAddress, pAddressInfo.m_PrivateAddress));
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
#endif
|
|
|
|
if(dwResult == ClientSocket::ListOper_Insert)
|
|
{
|
|
if(!g_CharacterData.GetCreature(pAddressInfo.m_dwCharID))
|
|
{
|
|
// m_pSocket->CharRequireInfo(g_ClientMain.m_dwMyChrID, pAddressInfo.m_dwCharID, ClientSocket::Require_Shape);
|
|
// m_lstSendShape.push_back(pAddressInfo.m_dwCharID);
|
|
|
|
g_CharacterData.AddCharacter(pAddressInfo.m_dwCharID, vector3(0.0f, 0.0f, 0.0f)); // 공간만 만듬
|
|
}
|
|
}
|
|
// CharAddressRequireInfo(g_ClientMain.m_dwMyChrID, dwSenderID);
|
|
}
|
|
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_Refuse:
|
|
{
|
|
char strText[200];
|
|
sprintf(strText, g_StringTable.m_strString[278], strName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_Login:
|
|
{
|
|
g_ClientMain.m_bPartyFind = FALSE;
|
|
g_ClientMain.m_bPartyPlayerFind = FALSE;
|
|
|
|
char *strName = g_ClientMain.m_csStatus.LoginPartyPlayer(dwSenderID, dwRecvID);
|
|
if(strName)
|
|
{
|
|
if(dwSenderID != g_ClientMain.m_dwMyChrID)
|
|
{
|
|
unsigned long dwResult = m_pSocket->InsertIntoAddressList(ClientSocket::ListType_Party, pAddressInfo.m_dwCharID, pAddressInfo.m_PublicAddress, pAddressInfo.m_PrivateAddress);
|
|
|
|
#ifdef _DEBUG
|
|
char a[200];
|
|
sprintf(a, "5. 0x%08x = Pub : %d.%d.%d.%d:%d, Pri : %d.%d.%d.%d:%d %d", pAddressInfo.m_dwCharID,
|
|
pAddressInfo.m_PublicAddress.sin_addr.s_net, pAddressInfo.m_PublicAddress.sin_addr.s_host, pAddressInfo.m_PublicAddress.sin_addr.s_lh, pAddressInfo.m_PublicAddress.sin_addr.s_impno, pAddressInfo.m_PublicAddress.sin_port,
|
|
pAddressInfo.m_PrivateAddress.sin_addr.s_net, pAddressInfo.m_PrivateAddress.sin_addr.s_host, pAddressInfo.m_PrivateAddress.sin_addr.s_lh, pAddressInfo.m_PrivateAddress.sin_addr.s_impno, pAddressInfo.m_PrivateAddress.sin_port, m_pSocket->GetPeerType(pAddressInfo.m_PublicAddress, pAddressInfo.m_PrivateAddress));
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
#endif
|
|
|
|
if(dwResult == ClientSocket::ListOper_Insert)
|
|
{
|
|
if(!g_CharacterData.GetCreature(pAddressInfo.m_dwCharID))
|
|
{
|
|
// m_pSocket->CharRequireInfo(g_ClientMain.m_dwMyChrID, pAddressInfo.m_dwCharID, ClientSocket::Require_Shape);
|
|
// m_lstSendShape.push_back(pAddressInfo.m_dwCharID);
|
|
|
|
g_CharacterData.AddCharacter(pAddressInfo.m_dwCharID, vector3(0.0f, 0.0f, 0.0f)); // 공간만 만듬
|
|
}
|
|
}
|
|
// CharAddressRequireInfo(g_ClientMain.m_dwMyChrID, dwSenderID);
|
|
}
|
|
char strText[200];
|
|
sprintf(strText, g_StringTable.m_strString[279], strName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_Logout:
|
|
{
|
|
g_ClientMain.m_bPartyFind = FALSE;
|
|
g_ClientMain.m_bPartyPlayerFind = FALSE;
|
|
|
|
char *strName = g_ClientMain.m_csStatus.LogoutPartyPlayer(dwSenderID);
|
|
if(strName)
|
|
{
|
|
if(dwSenderID != g_ClientMain.m_dwMyChrID)
|
|
{
|
|
m_pSocket->DeleteFromAddressList(ClientSocket::ListType_Party, dwSenderID);
|
|
}
|
|
|
|
g_CharacterData.UnLoadChr(dwSenderID);
|
|
|
|
char strText[200];
|
|
sprintf(strText, g_StringTable.m_strString[280], strName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_Banish:
|
|
g_ClientMain.m_bPartyFind = FALSE;
|
|
g_ClientMain.m_bPartyPlayerFind = FALSE;
|
|
|
|
if(dwSenderID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i])
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i] != g_ClientMain.m_dwMyChrID)
|
|
{
|
|
m_pSocket->DeleteFromAddressList(ClientSocket::ListType_Party, g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.DestroyParty();
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[281], g_ClientMain.m_dwMyChrID, 129);
|
|
SendCharShape();
|
|
} else
|
|
{
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i] == dwSenderID)
|
|
{
|
|
char strText[200];
|
|
sprintf(strText, g_StringTable.m_strString[282], g_ClientMain.m_csStatus.m_PartyInfo.Name[i]);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
break;
|
|
}
|
|
}
|
|
m_pSocket->DeleteFromAddressList(ClientSocket::ListType_Party, dwSenderID);
|
|
g_ClientMain.m_csStatus.DeletePartyPlayer(dwSenderID);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_Secession:
|
|
g_ClientMain.m_bPartyFind = FALSE;
|
|
g_ClientMain.m_bPartyPlayerFind = FALSE;
|
|
|
|
if(dwSenderID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i])
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i] != g_ClientMain.m_dwMyChrID)
|
|
{
|
|
m_pSocket->DeleteFromAddressList(ClientSocket::ListType_Party, g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.DestroyParty();
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[283], g_ClientMain.m_dwMyChrID, 128);
|
|
SendCharShape();
|
|
} else
|
|
{
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i] == dwSenderID)
|
|
{
|
|
m_pSocket->DeleteFromAddressList(ClientSocket::ListType_Party, dwSenderID);
|
|
char strText[200];
|
|
sprintf(strText, g_StringTable.m_strString[284], g_ClientMain.m_csStatus.m_PartyInfo.Name[i]);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
break;
|
|
}
|
|
}
|
|
g_ClientMain.m_csStatus.DeletePartyPlayer(dwSenderID);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_Transfer:
|
|
{
|
|
g_ClientMain.m_bPartyFind = FALSE;
|
|
g_ClientMain.m_bPartyPlayerFind = FALSE;
|
|
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i] == dwSenderID)
|
|
{
|
|
char strText[200];
|
|
sprintf(strText, g_StringTable.m_strString[285], g_ClientMain.m_csStatus.m_PartyInfo.Name[i]);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
break;
|
|
}
|
|
}
|
|
g_ClientMain.m_csStatus.m_PartyInfo.m_dwLeaderID = dwSenderID;
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_Destroy:
|
|
{
|
|
g_ClientMain.m_bPartyFind = FALSE;
|
|
g_ClientMain.m_bPartyPlayerFind = FALSE;
|
|
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i])
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i] != g_ClientMain.m_dwMyChrID)
|
|
{
|
|
m_pSocket->DeleteFromAddressList(ClientSocket::ListType_Party, g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.DestroyParty();
|
|
// SendCharShape();
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[286], g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_FindParty:
|
|
g_ClientMain.m_bPartyFind = dwRecvID;
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_FindMember:
|
|
g_ClientMain.m_bPartyPlayerFind = dwRecvID;
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharPartyInfo(char *aryBuffer)
|
|
{
|
|
m_dwNetworkError = m_pSocket->HandleCharPartyInfo(aryBuffer, &g_ClientMain.m_csStatus.m_PartyInfo);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
/* for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i])
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i] != g_ClientMain.m_dwMyChrID)
|
|
{
|
|
CharAddressRequireInfo(g_ClientMain.m_dwMyChrID, g_ClientMain.m_csStatus.m_PartyInfo.MemberCID[i]);
|
|
}
|
|
}
|
|
}*/
|
|
|
|
return TRUE;
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.m_PartyInfo.m_cMemberNum = 0;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharUseItem(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwSenderID, dwRecverID;
|
|
Item::ItemPos pItemIndex;
|
|
m_dwNetworkError = m_pSocket->HandleCharUseItem(aryBuffer, &dwSenderID, &dwRecverID, &pItemIndex);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
CItemInstance *lpItem = g_ClientMain.m_csStatus.GetInventoryItem(pItemIndex.m_cIndex);
|
|
if(lpItem)
|
|
{
|
|
switch(lpItem->GetItemType())
|
|
{
|
|
case Item::CItemType::SKILLBOOK:
|
|
if(dwSenderID == g_ClientMain.m_dwMyChrID && dwSenderID == dwRecverID)
|
|
{
|
|
g_ClientMain.m_csStatus.DeleteInventoryItem(lpItem);
|
|
delete lpItem;
|
|
}
|
|
break;
|
|
|
|
case Item::CItemType::POTION:
|
|
case Item::CItemType::AMMO:
|
|
{
|
|
unsigned dwNum = lpItem->GetNowDurability() - 1;
|
|
lpItem->SetNowDurability(dwNum);
|
|
if(lpItem->GetNowDurability() <= 0)
|
|
{
|
|
g_ClientMain.m_csStatus.DeleteInventoryItem(lpItem);
|
|
delete lpItem;
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.SetQuickSlot(lpItem);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
} else
|
|
{
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharSkillLock(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned short wSkill;
|
|
unsigned char cIndex;
|
|
m_dwNetworkError = m_pSocket->HandleCharSkillLock(aryBuffer, &dwChrID, &wSkill, &cIndex);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(g_ClientMain.m_dwMyChrID == dwChrID)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill == wSkill)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cLockCount++;
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel = 0;
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex])
|
|
{
|
|
delete g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex];
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex] = new CItemInstance;
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->SetSkillInfo(g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cLockCount,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel,
|
|
ClientSocket::ItemPos_SSlot, cIndex, 0);
|
|
|
|
char strText[MAX_PATH];
|
|
sprintf(strText, g_StringTable.m_strString[287], g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->GetItemInfo().m_SpriteData.m_szName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
}
|
|
|
|
long lCoolTime;
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lstQuickSlot[i] && g_ClientMain.m_csStatus.m_lstQuickSlot[i]->GetProtoTypeID() == wSkill)
|
|
{
|
|
lCoolTime = g_ClientMain.m_csStatus.m_lstQuickSlot[i]->m_lCoolDownTimeCount;
|
|
|
|
BOOL bSelected = FALSE;
|
|
if(g_ClientMain.m_csStatus.m_lpQuickSelected == g_ClientMain.m_csStatus.m_lstQuickSlot[i])
|
|
{
|
|
bSelected = TRUE;
|
|
g_ClientMain.m_Network.SetChant(NULL);
|
|
g_ClientMain.m_csStatus.SetActivateSkill(NULL);
|
|
}
|
|
|
|
delete g_ClientMain.m_csStatus.m_lstQuickSlot[i];
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i] = new CItemInstance;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetSkillInfo(g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cLockCount,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel,
|
|
ClientSocket::ItemPos_QSlot, i, lCoolTime);
|
|
|
|
if(bSelected)
|
|
{
|
|
g_ClientMain.m_Network.SetChant(g_ClientMain.m_csStatus.m_lstQuickSlot[i]);
|
|
g_ClientMain.m_csStatus.SetActivateSkill(g_ClientMain.m_csStatus.m_lstQuickSlot[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharSkillErase(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID;
|
|
unsigned short wSkill;
|
|
unsigned char cIndex;
|
|
m_dwNetworkError = m_pSocket->HandleCharSkillErase(aryBuffer, &dwChrID, &wSkill, &cIndex);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(g_ClientMain.m_dwMyChrID == dwChrID)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill == wSkill)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel--;
|
|
g_ClientMain.m_csStatus.m_Skill.wSkillNum--;
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex])
|
|
{
|
|
unsigned long dwNum = g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->GetNowDurability() - 1;
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->SetNowDurability(dwNum);
|
|
}
|
|
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lstQuickSlot[i] && g_ClientMain.m_csStatus.m_lstQuickSlot[i]->GetProtoTypeID() == wSkill)
|
|
{
|
|
unsigned long dwNum = g_ClientMain.m_csStatus.m_lstQuickSlot[i]->GetNowDurability() - 1;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetNowDurability(dwNum);
|
|
}
|
|
}
|
|
|
|
if(!g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel &&
|
|
!g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cLockCount)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lpQuickSelected)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lpQuickSelected->GetProtoTypeID() == wSkill)
|
|
{
|
|
g_ClientMain.m_Network.SetChant(NULL);
|
|
g_ClientMain.m_csStatus.SetActivateSkill(NULL);
|
|
}
|
|
}
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lstQuickSlot[i])
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lstQuickSlot[i]->GetProtoTypeID() == wSkill)
|
|
{
|
|
g_ClientMain.m_Network.SendQuickSlotMove(g_ClientMain.m_csStatus.m_lstQuickSlot[i], ClientSocket::ItemPos_None, 0);
|
|
}
|
|
}
|
|
}
|
|
delete g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex];
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex] = NULL;
|
|
|
|
for(int j = cIndex; j < 19; j++)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[j].dwSkillSlot = g_ClientMain.m_csStatus.m_Skill.SSlot[j + 1].dwSkillSlot;
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[j] = g_ClientMain.m_csStatus.m_lstSkillSlot[j + 1];
|
|
}
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[19].dwSkillSlot = 0;
|
|
g_ClientMain.m_csStatus.m_Skill.wSlotNum--;
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[19] = NULL;
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharSkillCreate(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned short wSkill;
|
|
unsigned char cIndex;
|
|
m_dwNetworkError = m_pSocket->HandleCharSkillCreate(aryBuffer, &dwChrID, &wSkill, &cIndex);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(g_ClientMain.m_dwMyChrID == dwChrID)
|
|
{
|
|
/* for(int ccIndex = 0; ccIndex < 20; ccIndex++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_Skill.SSlot[ccIndex].SKILLINFO.wSkill == wSkill)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(ccIndex != 20)
|
|
{
|
|
if(ccIndex != cIndex) cIndex = ccIndex;
|
|
} else
|
|
{
|
|
for(ccIndex = 0; ccIndex < 20; ccIndex++)
|
|
{
|
|
if(!g_ClientMain.m_csStatus.m_Skill.SSlot[ccIndex].SKILLINFO.wSkill)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(ccIndex != cIndex) cIndex = ccIndex;
|
|
}*/
|
|
|
|
if(g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill == wSkill)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Skill.wSkillNum++;
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel++;
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex])
|
|
{
|
|
char strText[MAX_PATH];
|
|
sprintf(strText, g_StringTable.m_strString[288], g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->GetItemInfo().m_SpriteData.m_szName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
|
|
unsigned long dwNum = g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->GetNowDurability() + 1;
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->SetNowDurability(dwNum);
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
}
|
|
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lstQuickSlot[i] && g_ClientMain.m_csStatus.m_lstQuickSlot[i]->GetProtoTypeID() == wSkill)
|
|
{
|
|
unsigned long dwNum = g_ClientMain.m_csStatus.m_lstQuickSlot[i]->GetNowDurability() + 1;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetNowDurability(dwNum);
|
|
}
|
|
}
|
|
}
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill = wSkill;
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cLockCount = 0;
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel = 1;
|
|
g_ClientMain.m_csStatus.m_Skill.wSkillNum++;
|
|
g_ClientMain.m_csStatus.m_Skill.wSlotNum++;
|
|
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex] = new CItemInstance;
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->SetSkillInfo(g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cLockCount,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel,
|
|
ClientSocket::ItemPos_SSlot, cIndex, 0);
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex])
|
|
{
|
|
char strText[MAX_PATH];
|
|
sprintf(strText, g_StringTable.m_strString[289], g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->GetItemInfo().m_SpriteData.m_szName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharRepairItem(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID, dwGold;
|
|
Item::ItemPos pItemIndex;
|
|
m_dwNetworkError = m_pSocket->HandleCharRepairItem(aryBuffer, &dwChrID, &pItemIndex, &dwGold);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
switch(pItemIndex.m_cPos)
|
|
{
|
|
case ClientSocket::ItemPos_Equip:
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lstEquipment[pItemIndex.m_cIndex])
|
|
{
|
|
g_ClientMain.m_csStatus.m_lstEquipment[pItemIndex.m_cIndex]->SetNowDurability(
|
|
g_ClientMain.m_csStatus.m_lstEquipment[pItemIndex.m_cIndex]->GetMaxDurability());
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Inven:
|
|
{
|
|
CItemInstance *lpItem = g_ClientMain.m_csStatus.GetInventoryItem(pItemIndex.m_cIndex);
|
|
if(lpItem)
|
|
{
|
|
lpItem->SetNowDurability(lpItem->GetMaxDurability());
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
if(g_ClientMain.m_csStatus.m_Info.Gold > dwGold)
|
|
g_ClientMain.m_csStatus.m_Info.Gold -= dwGold;
|
|
else
|
|
g_ClientMain.m_csStatus.m_Info.Gold = 0;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharInstallSocket(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
Item::ItemPos pEquipItemIndex, pSocketItemIndex;
|
|
char *lpItemBuffer;
|
|
size_t dwSize;
|
|
unsigned short wSize;
|
|
m_dwNetworkError = m_pSocket->HandleCharInstallSocket(aryBuffer, &dwChrID, &pEquipItemIndex, &pSocketItemIndex, &wSize, &lpItemBuffer);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
dwSize = wSize;
|
|
if(g_ClientMain.m_dwMyChrID == dwChrID)
|
|
{
|
|
CItemInstance *lpItem;
|
|
switch(pEquipItemIndex.m_cPos)
|
|
{
|
|
case ClientSocket::ItemPos_Equip:
|
|
delete g_ClientMain.m_csStatus.m_lstEquipment[pEquipItemIndex.m_cIndex];
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Inven:
|
|
lpItem = g_ClientMain.m_csStatus.GetInventoryItem(pEquipItemIndex.m_cIndex);
|
|
g_ClientMain.m_csStatus.DeleteInventoryItem(lpItem);
|
|
delete lpItem;
|
|
break;
|
|
}
|
|
|
|
lpItem = new CItemInstance;
|
|
lpItem->SetItemInfo(lpItemBuffer, dwSize);
|
|
|
|
switch(pEquipItemIndex.m_cPos)
|
|
{
|
|
case ClientSocket::ItemPos_Equip:
|
|
g_ClientMain.m_csStatus.m_lstEquipment[pEquipItemIndex.m_cIndex] = lpItem;
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Inven:
|
|
g_ClientMain.m_csStatus.AddInventoryItem(lpItem);
|
|
break;
|
|
}
|
|
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
}
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstExchange.empty() || !g_ClientMain.m_csStatus.m_dwExchangeGold)
|
|
{
|
|
g_ClientMain.m_lpInterface->ProcessExchangeCmd(g_ClientMain.m_dwMyChrID, 100);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharUpgradeItem(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
Item::ItemPos pEquipItemIndex, pSocketItemIndex;
|
|
char *lpItemBuffer;
|
|
unsigned char cSize;
|
|
size_t dwSize;
|
|
m_dwNetworkError = m_pSocket->HandleCharUpgradeItem(aryBuffer, &dwChrID, &cSize, &lpItemBuffer);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
dwSize = cSize;
|
|
|
|
if(g_ClientMain.m_dwMyChrID == dwChrID)
|
|
{
|
|
unsigned char cPos = g_ClientMain.m_csStatus.m_lpUpgrade[0]->GetItemPos();
|
|
// Item::ItemPos pItemIndex = g_ClientMain.m_csStatus.m_lpUpgrade[0]->m_lpItemBase->GetPos();
|
|
delete g_ClientMain.m_csStatus.m_lpUpgrade[0];
|
|
|
|
g_ClientMain.m_csStatus.m_lpUpgrade[0] = new CItemInstance;
|
|
g_ClientMain.m_csStatus.m_lpUpgrade[0]->SetItemInfo(lpItemBuffer, dwSize);
|
|
// g_ClientMain.m_csStatus.m_lpUpgrade[0]->m_lpItemBase = Item::CItemFactory::GetInstance().CreateItem(lpItemBuffer, (size_t &)cSize);
|
|
// g_ClientMain.m_csStatus.m_lpUpgrade[0]->SetItemPos(cPos);
|
|
// g_ClientMain.m_csStatus.m_lpUpgrade[0]->SetPos(pEquipItemIndex.m_cIndex);
|
|
|
|
delete g_ClientMain.m_csStatus.m_lpUpgrade[1];
|
|
g_ClientMain.m_csStatus.m_lpUpgrade[1] = NULL;
|
|
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharAward(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID, dwExp;
|
|
m_dwNetworkError = m_pSocket->HandleCharAward(aryBuffer, &dwChrID, &dwExp);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Exp += dwExp;
|
|
|
|
char a[100];
|
|
sprintf(a, g_StringTable.m_strString[290], dwExp);
|
|
// sprintf(a, "사악한 몬스터가 죽어서 경험치 %d으로 산화되었습니다.", dwExp);
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
|
|
if(g_ClientMain.m_csStatus.m_Info.Exp >= g_dtDateTable.MAXEXPTABLE[g_ClientMain.m_csStatus.m_Info.Level])
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Exp = 0;
|
|
/* for(int i = g_ClientMain.m_csStatus.m_Info.Level;; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_Info.Exp < g_dtDateTable.MAXEXPTABLE[i])
|
|
break;
|
|
g_ClientMain.m_csStatus.m_Info.Exp -= g_dtDateTable.MAXEXPTABLE[i];
|
|
}*/
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharLevelUp(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned char cLevel;
|
|
ChState pChState;
|
|
m_dwNetworkError = m_pSocket->HandleCharLevelUp(aryBuffer, &dwChrID, &cLevel, &pChState);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
char a[100];
|
|
sprintf(a, g_StringTable.m_strString[291], cLevel);
|
|
// sprintf(a, "우리의 용사가 레벨 %d에서 레벨 %d로 성장했습니다.", g_ClientMain.m_csStatus.m_Info.Level, cLevel);
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
|
|
g_ClientMain.m_csStatus.m_Info.Level = cLevel;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_cLevel = g_ClientMain.m_csStatus.m_Info.Level;
|
|
g_ClientMain.m_csStatus.m_Info.IP = pChState.m_wIP;
|
|
g_ClientMain.m_csStatus.m_Info.STR = pChState.m_wSTR;
|
|
g_ClientMain.m_csStatus.m_Info.DEX = pChState.m_wDEX;
|
|
g_ClientMain.m_csStatus.m_Info.INT = pChState.m_wINT;
|
|
g_ClientMain.m_csStatus.m_Info.CON = pChState.m_wCON;
|
|
g_ClientMain.m_csStatus.m_Info.WIS = pChState.m_wWIS;
|
|
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
g_ClientMain.m_csStatus.m_Info.HP = g_ClientMain.m_csStatus.m_MaxHP;
|
|
g_ClientMain.m_csStatus.m_Info.MP = g_ClientMain.m_csStatus.m_MaxMP;
|
|
|
|
if(cLevel >= 10)
|
|
{
|
|
char strTrainer[MAX_PATH], strClass[3][MAX_PATH], strMessage[MAX_PATH];
|
|
unsigned long dwClass;
|
|
BOOL bShow = TRUE;
|
|
strcpy(strTrainer, g_StringTable.m_strString[450 + g_ClientMain.m_csStatus.m_Info.Class]);
|
|
switch(g_ClientMain.m_csStatus.m_Info.Class)
|
|
{
|
|
case 1: // Fighter
|
|
dwClass = 2;
|
|
strcpy(strClass[0], g_StringTable.m_strString[455]);
|
|
strcpy(strClass[1], g_StringTable.m_strString[456]);
|
|
break;
|
|
|
|
case 2: // Rogue
|
|
dwClass = 2;
|
|
strcpy(strClass[0], g_StringTable.m_strString[457]);
|
|
strcpy(strClass[1], g_StringTable.m_strString[458]);
|
|
break;
|
|
|
|
case 3: // Mage
|
|
dwClass = 2;
|
|
strcpy(strClass[0], g_StringTable.m_strString[459]);
|
|
strcpy(strClass[1], g_StringTable.m_strString[460]);
|
|
break;
|
|
|
|
case 4: // Acolyte
|
|
dwClass = 2;
|
|
strcpy(strClass[0], g_StringTable.m_strString[461]);
|
|
strcpy(strClass[1], g_StringTable.m_strString[462]);
|
|
break;
|
|
|
|
case 17: // Combatent
|
|
dwClass = 3;
|
|
strcpy(strClass[0], g_StringTable.m_strString[469]);
|
|
strcpy(strClass[1], g_StringTable.m_strString[470]);
|
|
strcpy(strClass[2], g_StringTable.m_strString[471]);
|
|
break;
|
|
|
|
case 18: // Opiciator
|
|
dwClass = 3;
|
|
strcpy(strClass[0], g_StringTable.m_strString[472]);
|
|
strcpy(strClass[1], g_StringTable.m_strString[473]);
|
|
strcpy(strClass[2], g_StringTable.m_strString[474]);
|
|
break;
|
|
|
|
default:
|
|
bShow = FALSE;
|
|
break;
|
|
}
|
|
|
|
if(bShow)
|
|
{
|
|
sprintf(strMessage, "당신은 %d레벨이 되었습니다. %s 트레이너를 찾아가 %s", cLevel, strTrainer, strClass[0]);
|
|
for(unsigned long i = 1; i < dwClass; i++)
|
|
{
|
|
strcat(strMessage, ", ");
|
|
strcat(strMessage, strClass[i]);
|
|
}
|
|
strcat(strMessage, "중 하나로 전직 하실 수 있습니다.");
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
}
|
|
|
|
List<DWORD> SendCharacterList;
|
|
g_CharacterData.GetSendCharacterAroundList(SendCharacterList);
|
|
for(int i=0;i<SendCharacterList.num;i++)
|
|
{
|
|
m_pSocket->RegistInstanceUDPList(SendCharacterList[i]);
|
|
}
|
|
|
|
m_pSocket->CharLevelUpInfo(g_ClientMain.m_dwMyChrID, cLevel);
|
|
|
|
CCreature *pCreature=g_CharacterData.GetCreature(g_ClientMain.m_dwMyChrID);
|
|
if(pCreature && pCreature->m_lpChrModel)
|
|
{
|
|
vector3 vecPos;
|
|
pCreature->m_lpChrModel->GetPosition(vecPos);
|
|
|
|
CEffScript *pLevelUpEff;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
pLevelUpEff=new CEffScript;
|
|
CSceneManager::AddEffectScript(pLevelUpEff);
|
|
|
|
pLevelUpEff->GetScriptBinData("respawn.esf");
|
|
pLevelUpEff->SetStartPos(vecPos.x,vecPos.y,vecPos.z);
|
|
pLevelUpEff->SetEndPos((D3DXVECTOR3 *)&(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos), 1);
|
|
|
|
}
|
|
|
|
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharLevelUpInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned char cLevel;
|
|
m_dwNetworkError = m_pSocket->HandleCharLevelUpInfo(aryBuffer, &dwChrID, &cLevel);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
//dwChrID가 레벨업 했다.
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
if(lpCreature)
|
|
{
|
|
lpCreature->m_cLevel = cLevel;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharIncreasePoint(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
ChState pChState;
|
|
m_dwNetworkError = m_pSocket->HandleCharIncreasePoint(aryBuffer, &dwChrID, &pChState);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.IP = pChState.m_wIP;
|
|
g_ClientMain.m_csStatus.m_Info.STR = pChState.m_wSTR;
|
|
g_ClientMain.m_csStatus.m_Info.DEX = pChState.m_wDEX;
|
|
g_ClientMain.m_csStatus.m_Info.INT = pChState.m_wINT;
|
|
g_ClientMain.m_csStatus.m_Info.CON = pChState.m_wCON;
|
|
g_ClientMain.m_csStatus.m_Info.WIS = pChState.m_wWIS;
|
|
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharHPRegen(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned short wHP, wMP;
|
|
m_dwNetworkError = m_pSocket->HandleCharHPRegen(aryBuffer, &dwChrID, &wHP, &wMP);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.HP = wHP;
|
|
g_ClientMain.m_csStatus.m_Info.MP = wMP;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharBindPos(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned char cCmd;
|
|
char cZone;
|
|
POS psPos;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharBindPos(aryBuffer, &dwChrID, &cCmd, &psPos, &cZone);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cCmd)
|
|
{
|
|
case 0:
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[292], g_ClientMain.m_dwMyChrID, 128);
|
|
break;
|
|
|
|
case 1:
|
|
{
|
|
if(cZone == 100)
|
|
{
|
|
if(g_ClientMain.m_lpBackGroundMusic)
|
|
{
|
|
try
|
|
{
|
|
g_ClientMain.m_lpBackGroundMusic->Destroy();
|
|
g_ClientMain.m_lpBackGroundMusic = NULL;
|
|
} catch(exception & e)
|
|
{
|
|
e = 0;
|
|
g_ClientMain.m_lpBackGroundMusic = NULL;
|
|
}
|
|
}
|
|
|
|
g_ClientMain.m_dwNextZone = g_ClientMain.m_dwPresentZone;
|
|
g_ClientMain.m_dwPresentZone = cZone;
|
|
g_ClientMain.m_lpInterface->InitZone(g_ClientMain.m_dwPresentZone);
|
|
g_ClientMain.m_lpCommonInterface->InitLoading();
|
|
g_ClientMain.m_dwClientState = GAME_PLAYING;
|
|
}
|
|
|
|
vector3 vecPos = vector3(psPos.fPointX * 100.0f, psPos.fPointY * 100.0f, psPos.fPointZ * 100.0f);
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lpChrModel->SetPosition(vecPos);
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[293], g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
{
|
|
vector3 vecPos = vector3(psPos.fPointX * 100.0f, psPos.fPointY * 100.0f, psPos.fPointZ * 100.0f);
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lpChrModel->SetPosition(vecPos);
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[293], g_ClientMain.m_dwMyChrID, 128);
|
|
|
|
// 리콜 스킬
|
|
CEffScript *test_script;
|
|
test_script = new CEffScript;
|
|
if(test_script)
|
|
{
|
|
if(test_script->GetScriptBinData("recall2.esf"))
|
|
{
|
|
// 스킬 사용시 타격 이팩트 처리
|
|
test_script->SetStartPos(vecPos.x, vecPos.y, vecPos.z);
|
|
test_script->SetEndPos(vecPos.x, vecPos.y, vecPos.z);
|
|
|
|
float fChrDir = g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection;
|
|
fChrDir = -fChrDir;
|
|
fChrDir -= FLOAT_PHI / 2.0f;
|
|
|
|
vector3 vecChrToward;
|
|
vecChrToward.x = cosf(fChrDir);
|
|
vecChrToward.z = sinf(fChrDir);
|
|
vecChrToward.y = 0.0f;
|
|
vecChrToward.Normalize();
|
|
test_script->SetChrFwd(-vecChrToward.x, -vecChrToward.y, -vecChrToward.z);
|
|
test_script->SetMine(true);
|
|
test_script->SetBSkill(true);
|
|
|
|
if(!CSceneManager::m_EffectManager.AddEffScript(test_script)) // 이펙트 스크립트를 읽으면 나오는 인덱스
|
|
{
|
|
delete test_script;
|
|
}
|
|
} else
|
|
{
|
|
delete test_script;
|
|
}
|
|
}
|
|
|
|
CastObject pCastObject;
|
|
pCastObject.m_wTypeID = 0;
|
|
pCastObject.m_cObjectType = 200;
|
|
pCastObject.m_cObjectLevel = 0;
|
|
pCastObject.m_DstPos.fPointX = vecPos.x;
|
|
pCastObject.m_DstPos.fPointY = vecPos.y;
|
|
pCastObject.m_DstPos.fPointZ = vecPos.z;
|
|
|
|
List<DWORD> SendCharacterList;
|
|
g_CharacterData.GetSendCharacterAroundList(SendCharacterList);
|
|
for(int i=0;i<SendCharacterList.num;i++)
|
|
{
|
|
g_ClientMain.m_Network.m_pSocket->RegistInstanceUDPList(SendCharacterList[i]);
|
|
}
|
|
g_ClientMain.m_Network.m_pSocket->CharCastObjectInfo(g_ClientMain.m_dwMyChrID, g_ClientMain.m_dwMyChrID, pCastObject);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharQuickSlotMove(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
TakeType pTakeType;
|
|
m_dwNetworkError = m_pSocket->HandleCharQuickSlotMove(aryBuffer, &pTakeType);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(pTakeType.m_srcPos.m_cPos)
|
|
{
|
|
case TakeType::TS_INVEN: // Move
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex] = new CItemInstance;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex]->SetItemInfofromID(g_ClientMain.m_lpPickItem->GetProtoTypeID(), pTakeType.m_dstPos);
|
|
|
|
{
|
|
CItemInstance *lpExistItem = g_ClientMain.m_csStatus.GetInventoryItem(g_ClientMain.m_lpPickItem->m_lpItemBase->GetPos());
|
|
if(lpExistItem)
|
|
{
|
|
unsigned long dwNum = lpExistItem->GetNowDurability() + g_ClientMain.m_lpPickItem->GetNowDurability();
|
|
lpExistItem->SetNowDurability(dwNum);
|
|
|
|
g_ClientMain.m_csStatus.SetQuickSlot(lpExistItem);
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.AddInventoryItem(g_ClientMain.m_lpPickItem);
|
|
g_ClientMain.SetPickItem(NULL);
|
|
}
|
|
}
|
|
return TRUE;
|
|
|
|
case TakeType::TS_TEMP:
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex] = new CItemInstance;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex]->SetItemInfofromID(g_ClientMain.m_lpPickItem->GetProtoTypeID(), pTakeType.m_dstPos);
|
|
|
|
{
|
|
FieldInstance pFI;
|
|
Item::ItemPos pItemIndex;
|
|
pFI.m_dwTypeID = g_ClientMain.m_lpPickItem->GetProtoTypeID();
|
|
pFI.m_cNum = g_ClientMain.m_lpPickItem->GetNowDurability();
|
|
|
|
if(g_ClientMain.m_csStatus.GetAbleInven(&pFI, pItemIndex, TRUE))
|
|
{
|
|
CItemInstance *lpExistItem = g_ClientMain.m_csStatus.GetInventoryItem(pItemIndex.m_cIndex);
|
|
if(lpExistItem)
|
|
{
|
|
SendTakeItem(g_ClientMain.m_lpPickItem, &lpExistItem->m_lpItemBase->GetPos(), g_ClientMain.m_lpPickItem->GetNowDurability());
|
|
/*
|
|
lpExistItem->m_lpItemBase->m_nNowDurability += g_ClientMain.m_lpPickItem->m_lpItemBase->m_nNowDurability;
|
|
g_ClientMain.m_csStatus.SetQuickSlot(lpExistItem);
|
|
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);*/
|
|
} else
|
|
{
|
|
SendTakeItem(g_ClientMain.m_lpPickItem, &pItemIndex, g_ClientMain.m_lpPickItem->GetNowDurability());
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
|
|
case TakeType::TS_SSLOT: // Move
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex] = g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex]->SetPos(pTakeType.m_dstPos);
|
|
|
|
if(pTakeType.m_cNum == 0)
|
|
{
|
|
g_ClientMain.m_Network.SetChant(g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex]);
|
|
g_ClientMain.m_csStatus.SetActivateSkill(g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex]);
|
|
}
|
|
g_ClientMain.SetPickItem(NULL);
|
|
return TRUE;
|
|
}
|
|
|
|
switch(pTakeType.m_dstPos.m_cPos)
|
|
{
|
|
case TakeType::TS_QSLOT: // Swap
|
|
{
|
|
CItemInstance *lpQuick = g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex];
|
|
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex] = g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_dstPos.m_cIndex]->SetPos(pTakeType.m_dstPos);
|
|
|
|
if(lpQuick)
|
|
{
|
|
if(lpQuick == g_ClientMain.m_csStatus.m_lpQuickSelected)
|
|
{
|
|
g_ClientMain.m_csStatus.m_lpQuickSelected = NULL;
|
|
}
|
|
|
|
g_ClientMain.SetPickItem(lpQuick);
|
|
g_ClientMain.m_lpPickItem->SetPos(pTakeType.m_srcPos);
|
|
} else
|
|
{
|
|
g_ClientMain.SetPickItem(NULL);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case TakeType::TS_NONE: // Delete
|
|
if(g_ClientMain.m_lpPickItem &&
|
|
g_ClientMain.m_lpPickItem->GetItemPos() == ClientSocket::ItemPos_QSlot)
|
|
{
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
} else
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_srcPos.m_cIndex])
|
|
{
|
|
delete g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_srcPos.m_cIndex];
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[pTakeType.m_srcPos.m_cIndex] = NULL;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharPartyMemInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID, dwPartyID, dwChant, dwEnchant;
|
|
unsigned short wMaxHP, wMaxMP;
|
|
unsigned short wCurHP, wCurMP;
|
|
unsigned char cClass;
|
|
char cLevel;
|
|
SOCKADDR_IN pPubAddress, pPriAddress;
|
|
m_dwNetworkError = m_pSocket->HandleCharPartyMemInfo(aryBuffer, &dwChrID, &dwPartyID, &cClass, &cLevel,
|
|
&wMaxHP, &wCurHP, &wMaxMP, &wCurMP, &dwChant, &dwEnchant, &pPubAddress, &pPriAddress);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwPartyID == g_ClientMain.m_csStatus.m_PartyInfo.m_dwPartyID)
|
|
{
|
|
CCreature *lpCreature;
|
|
|
|
unsigned long dwResult = m_pSocket->InsertIntoAddressList(ClientSocket::ListType_Party, dwChrID, pPubAddress, pPriAddress);
|
|
|
|
#ifdef _DEBUG
|
|
char a[200];
|
|
sprintf(a, "6. 0x%08x = Pub : %d.%d.%d.%d:%d, Pri : %d.%d.%d.%d:%d %d", dwChrID,
|
|
pPubAddress.sin_addr.s_net, pPubAddress.sin_addr.s_host, pPubAddress.sin_addr.s_lh, pPubAddress.sin_addr.s_impno, pPubAddress.sin_port,
|
|
pPriAddress.sin_addr.s_net, pPriAddress.sin_addr.s_host, pPriAddress.sin_addr.s_lh, pPriAddress.sin_addr.s_impno, pPriAddress.sin_port, m_pSocket->GetPeerType(pPubAddress, pPriAddress));
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
#endif
|
|
|
|
if(dwResult == ClientSocket::ListOper_Insert)
|
|
{
|
|
// m_pSocket->CharRequireInfo(g_ClientMain.m_dwMyChrID, dwChrID, ClientSocket::Require_Shape);
|
|
// m_lstSendShape.push_back(dwChrID);
|
|
|
|
if(!g_CharacterData.GetCreature(dwChrID))
|
|
{
|
|
g_CharacterData.AddCharacter(dwChrID, vector3(0.0f, 0.0f, 0.0f)); // 공간만 만듬
|
|
}
|
|
}
|
|
|
|
lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
if(lpCreature)
|
|
{
|
|
lpCreature->m_dwPartyID = dwPartyID;
|
|
lpCreature->m_cLevel = cLevel;
|
|
lpCreature->m_wClass = cClass;
|
|
lpCreature->m_wMaxHP = wMaxHP;
|
|
lpCreature->m_wMaxMP = wMaxMP;
|
|
lpCreature->m_sCurrHP = wCurHP;
|
|
lpCreature->m_sCurrMP = wCurMP;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharClassUpgrade(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID;
|
|
unsigned short wClass;
|
|
ChState pState;
|
|
m_dwNetworkError = m_pSocket->HandleCharClassUpgrade(aryBuffer, &dwChrID, &wClass, &pState);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
// 전직 전의 정보 세팅
|
|
g_ClientMain.m_csStatus.m_BeforeInfo = g_ClientMain.m_csStatus.m_Info;
|
|
|
|
g_ClientMain.m_csStatus.m_Info.Class = wClass;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_wClass = g_ClientMain.m_csStatus.m_Info.Class;
|
|
g_ClientMain.m_csStatus.m_Info.STR = pState.m_wSTR;
|
|
g_ClientMain.m_csStatus.m_Info.DEX = pState.m_wDEX;
|
|
g_ClientMain.m_csStatus.m_Info.CON = pState.m_wCON;
|
|
g_ClientMain.m_csStatus.m_Info.INT = pState.m_wINT;
|
|
g_ClientMain.m_csStatus.m_Info.WIS = pState.m_wWIS;
|
|
g_ClientMain.m_csStatus.m_Info.IP = pState.m_wIP;
|
|
g_ClientMain.m_csStatus.SetClassSkill();
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
|
|
char strText[MAX_PATH];
|
|
sprintf(strText, g_StringTable.m_strString[294], g_ClientMain.m_lpCommonInterface->GetClassName(wClass));
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
// 전직 effect script load
|
|
CEffScript *test_script;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
test_script = new CEffScript;
|
|
|
|
// 전직 effect ptr Setting
|
|
g_ClientMain.m_ClassEffectPtr = test_script;
|
|
/*
|
|
[1], "Fighter"
|
|
[2], "Rogue");
|
|
[3], "Mage");
|
|
[4], "Acolyte");
|
|
[5], "Defender");
|
|
[6], "Warrior");
|
|
[7], "Assasin");
|
|
[8], "Archer");
|
|
[9], "Sorcerer");
|
|
[10], "Enchanter");
|
|
[11], "Priest");
|
|
[12], "Cleric");
|
|
[13], "Adventurer");
|
|
|
|
*/
|
|
test_script->SetInterfaceSet(true);
|
|
switch(wClass) {
|
|
|
|
case 5: //defender
|
|
test_script->GetScriptBinData("inter_job_defender.esf");
|
|
break;
|
|
case 6: //warrior
|
|
test_script->GetScriptBinData("inter_job_warrior.esf");
|
|
break;
|
|
case 7: //Assasin
|
|
test_script->GetScriptBinData("inter_job_assassin1.esf");
|
|
break;
|
|
case 8: //Archer
|
|
test_script->GetScriptBinData("inter_job_archer1.esf");
|
|
break;
|
|
case 9://sorcerer
|
|
test_script->GetScriptBinData("inter_job_sorcerer1.esf");
|
|
break;
|
|
case 10://enchanter
|
|
test_script->GetScriptBinData("inter_job_enchanter1.esf");
|
|
break;
|
|
case 11: //priest
|
|
test_script->GetScriptBinData("inter_job_priest.esf");
|
|
break;
|
|
case 12: //cleric
|
|
test_script->GetScriptBinData("inter_job_cleric.esf");
|
|
break;
|
|
//akhan class
|
|
case 19: //templer
|
|
test_script->GetScriptBinData("inter_job_templar1.esf");
|
|
break;
|
|
case 20: //attacker
|
|
test_script->GetScriptBinData("inter_job_attacker1.esf");
|
|
break;
|
|
case 21: //gunner
|
|
test_script->GetScriptBinData("inter_job_gunner1.esf");
|
|
break;
|
|
case 22: //rune ope
|
|
test_script->GetScriptBinData("inter_job_runeoff1.esf");
|
|
break;
|
|
case 23: //life ope
|
|
test_script->GetScriptBinData("inter_job_lifeoff1.esf");
|
|
break;
|
|
case 24: //shadow ope
|
|
test_script->GetScriptBinData("inter_job_shadowoff1.esf");
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
test_script->m_InterfacePos[0] += (-190.0f);
|
|
test_script->m_InterfacePos[1] += 10.0f;
|
|
|
|
CSceneManager::m_EffectManager.AddInterfaceScript(test_script);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCellBroadCasting(char *aryBuffer)
|
|
{
|
|
LPINETAddressInfo lpAddress;
|
|
unsigned short wCharNum;
|
|
m_dwNetworkError = m_pSocket->HandleCellBroadCasting(aryBuffer, &wCharNum, &lpAddress);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
/* char a[100];
|
|
sprintf(a, "BroadCasting : %d", wCharNum);
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 129);*/
|
|
|
|
m_pSocket->m_ClientList->DeleteAllFromList();
|
|
|
|
unsigned long dwResult;
|
|
SOCKADDR_IN siPublic, siPrivate;
|
|
for(int i = 0; i < wCharNum; i++)
|
|
{
|
|
if(lpAddress[i].m_dwCharID == g_ClientMain.m_dwMyChrID) continue;
|
|
|
|
siPublic = lpAddress[i].GetPublicAddress();
|
|
siPrivate = lpAddress[i].GetPrivateAddress();
|
|
dwResult = m_pSocket->InsertIntoAddressList(ClientSocket::ListType_Client, lpAddress[i].m_dwCharID, siPublic, siPrivate);
|
|
|
|
#ifdef _DEBUG
|
|
char a[200];
|
|
sprintf(a, "7. 0x%08x = Pub : %d.%d.%d.%d:%d, Pri : %d.%d.%d.%d:%d %d", lpAddress[i].m_dwCharID,
|
|
siPublic.sin_addr.s_net, siPublic.sin_addr.s_host, siPublic.sin_addr.s_lh, siPublic.sin_addr.s_impno, siPublic.sin_port,
|
|
siPrivate.sin_addr.s_net, siPrivate.sin_addr.s_host, siPrivate.sin_addr.s_lh, siPrivate.sin_addr.s_impno, siPrivate.sin_port, m_pSocket->GetPeerType(siPublic, siPrivate));
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
#endif
|
|
if(dwResult == ClientSocket::ListOper_Insert)
|
|
{
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(lpAddress[i].m_dwCharID);
|
|
if(!lpCreature || (lpCreature && lpCreature->m_bUsed == FALSE))
|
|
{
|
|
m_pSocket->CharRequireInfo(g_ClientMain.m_dwMyChrID, lpAddress[i].m_dwCharID, ClientSocket::Require_Shape);
|
|
|
|
if(!lpCreature)
|
|
{
|
|
m_lstSendShape.push_back(lpAddress[i].m_dwCharID);
|
|
g_CharacterData.AddCharacter(lpAddress[i].m_dwCharID, vector3(0.0f, 0.0f, 0.0f)); // 공간만 만듬
|
|
}
|
|
}
|
|
}
|
|
|
|
if(g_ClientMain.m_csStatus.CheckPartyMember(lpAddress[i].m_dwCharID))
|
|
{
|
|
dwResult = m_pSocket->InsertIntoAddressList(ClientSocket::ListType_Party, lpAddress[i].m_dwCharID, siPublic, siPrivate);
|
|
|
|
#ifdef _DEBUG
|
|
char a[200];
|
|
sprintf(a, "8. 0x%08x = Pub : %d.%d.%d.%d:%d, Pri : %d.%d.%d.%d:%d %d", lpAddress[i].m_dwCharID,
|
|
siPublic.sin_addr.s_net, siPublic.sin_addr.s_host, siPublic.sin_addr.s_lh, siPublic.sin_addr.s_impno, siPublic.sin_port,
|
|
siPrivate.sin_addr.s_net, siPrivate.sin_addr.s_host, siPrivate.sin_addr.s_lh, siPrivate.sin_addr.s_impno, siPrivate.sin_port, m_pSocket->GetPeerType(siPublic, siPrivate));
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
#endif
|
|
|
|
if(dwResult == ClientSocket::ListOper_Insert)
|
|
{
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(lpAddress[i].m_dwCharID);
|
|
if(!lpCreature)
|
|
{
|
|
g_CharacterData.AddCharacter(lpAddress[i].m_dwCharID, vector3(0.0f, 0.0f, 0.0f)); // 공간만 만듬
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL bAlive;
|
|
for(i = 1; i < g_CharacterData.m_lstCharData.num;)
|
|
{
|
|
if(g_CharacterData.GetClientType(g_CharacterData.m_lstCharData[i]->m_dwChrID) == CT_PC)
|
|
{
|
|
bAlive = FALSE;
|
|
for(int j = 0; j < wCharNum; j++)
|
|
{
|
|
if(g_CharacterData.m_lstCharData[i]->m_dwChrID == lpAddress[j].m_dwCharID)
|
|
{
|
|
bAlive = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!bAlive && !g_ClientMain.m_csStatus.CheckPartyMember(g_CharacterData.m_lstCharData[i]->m_dwChrID))
|
|
{
|
|
g_CharacterData.UnLoadChr(g_CharacterData.m_lstCharData[i]->m_dwChrID);
|
|
} else
|
|
{
|
|
i++;
|
|
}
|
|
} else
|
|
{
|
|
i++;
|
|
}
|
|
}
|
|
/*
|
|
/* BOOL bExist;
|
|
for(i = g_CharacterData.m_lstCharData.num - 1; i >= 1; i--)
|
|
{
|
|
if(g_CharacterData.GetClientType(g_CharacterData.m_lstCharData[i]->m_dwChrID) == CT_PC)
|
|
{
|
|
/////////////단거
|
|
bExist = FALSE;
|
|
for(int j = 0; j < wCharNum; j++)
|
|
{
|
|
if(g_CharacterData.m_lstCharData[i]->m_dwChrID == lpAddress[j].m_dwCharID)
|
|
{
|
|
bExist = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!bExist)
|
|
{
|
|
g_CharacterData.UnLoadChr(g_CharacterData.m_lstCharData[i]->m_dwChrID);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* for(i = 0; i < g_CharacterData.m_lstCharData.num; i++)
|
|
{
|
|
if(g_CharacterData.GetClientType(g_CharacterData.m_lstCharData[j]->m_dwChrID) == CT_PC)
|
|
{
|
|
bExist = FALSE;
|
|
for(int j = 0; j < wCharNum; j++)
|
|
{
|
|
if(g_CharacterData.m_lstCharData[i]->m_dwChrID == lpAddress[j].m_dwCharID)
|
|
{
|
|
bExist = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
if(!bExist)
|
|
{
|
|
g_CharacterData.UnLoadChr(g_CharacterData.m_lstCharData[i]->m_dwChrID);
|
|
}
|
|
}
|
|
}*/
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharCastObjectInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID, dwRecvChrID;
|
|
CastObject pCastObject;
|
|
m_dwNetworkError = m_pSocket->HandleCharCastObjectInfo(aryBuffer, &dwChrID, &dwRecvChrID, &pCastObject);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(pCastObject.m_cObjectType <= 43)
|
|
{
|
|
unsigned short wSkill = pCastObject.m_wTypeID;
|
|
unsigned short wGrade = pCastObject.m_cObjectLevel;
|
|
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
if(wSkill & 0x8000)
|
|
{
|
|
const Skill::ProtoType *lpSkillTypeTemp = g_SkillMgr.GetSkillProtoType(wSkill);
|
|
const Skill::ProtoType *lpSkillType = NULL;
|
|
|
|
if(lpSkillTypeTemp) lpSkillType = &lpSkillTypeTemp[wGrade];
|
|
if(lpCreature && lpSkillType)
|
|
{
|
|
lpCreature->CancelSkill();
|
|
lpCreature->EndSkill((char *)lpSkillType->m_szCastingFileName);
|
|
|
|
CEffScript *test_script;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
test_script = new CEffScript;
|
|
if(test_script)
|
|
{
|
|
if(lpCreature->m_cSex == 1)
|
|
test_script->SetSkillInfo(1, pCastObject.m_cObjectType);
|
|
else
|
|
test_script->SetSkillInfo(2, pCastObject.m_cObjectType);
|
|
|
|
if(test_script->GetScriptBinData((char *)lpSkillType->m_szEffectFileName))
|
|
{
|
|
// 스킬 사용시 타격 이팩트 처리
|
|
if(wSkill == 0x8603) // chain action
|
|
g_CharacterData.m_SkillAttackValue = lpSkillType->m_cStrikeNum; //Hit Count Setting
|
|
|
|
test_script->SetStartPos(lpCreature->m_vecPos.x, lpCreature->m_vecPos.y, lpCreature->m_vecPos.z);
|
|
test_script->SetEndPos(pCastObject.m_DstPos.fPointX, pCastObject.m_DstPos.fPointY, pCastObject.m_DstPos.fPointZ);
|
|
CCreature *lpTargetCreature = g_CharacterData.GetCreature(dwRecvChrID);
|
|
if(lpTargetCreature)
|
|
{
|
|
test_script->SetChr(lpCreature->m_lpChrModel, lpTargetCreature->m_lpChrModel);
|
|
}
|
|
|
|
float fChrDir = lpCreature->m_fDirection;
|
|
fChrDir = -fChrDir;
|
|
fChrDir -= FLOAT_PHI / 2.0f;
|
|
|
|
vector3 vecChrToward;
|
|
vecChrToward.x = cosf(fChrDir);
|
|
vecChrToward.z = sinf(fChrDir);
|
|
vecChrToward.y = 0.0f;
|
|
vecChrToward.Normalize();
|
|
test_script->SetChrFwd(-vecChrToward.x, -vecChrToward.y, -vecChrToward.z);
|
|
test_script->SetPlayer(lpCreature,lpCreature->m_dwChrID);
|
|
test_script->SetMine(false);
|
|
test_script->SetBSkill(true);
|
|
|
|
if(!CSceneManager::m_EffectManager.AddEffScript(test_script)) // 이펙트 스크립트를 읽으면 나오는 인덱스
|
|
{
|
|
delete test_script;
|
|
}
|
|
} else
|
|
{
|
|
delete test_script;
|
|
}
|
|
}
|
|
}
|
|
} else if(wSkill == AtType::Bow || wSkill == AtType::CrossBow)
|
|
{
|
|
if(lpCreature)
|
|
{
|
|
CEffScript *test_script;
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
test_script = new CEffScript;
|
|
if(test_script)
|
|
{
|
|
if(lpCreature->m_cSex == 1)
|
|
test_script->SetSkillInfo(1, pCastObject.m_cObjectType);
|
|
else
|
|
test_script->SetSkillInfo(2, pCastObject.m_cObjectType);
|
|
|
|
if(test_script->GetScriptBinData("arrow_normal.esf"))
|
|
{
|
|
test_script->SetStartPos(lpCreature->m_vecPos.x, lpCreature->m_vecPos.y, lpCreature->m_vecPos.z);
|
|
CCreature *lpTargetCreature = g_CharacterData.GetCreature(dwRecvChrID);
|
|
if(lpTargetCreature)
|
|
{
|
|
test_script->SetEndPos((D3DXVECTOR3 *)&lpTargetCreature->m_vecPos, 1);
|
|
test_script->SetChr(lpCreature->m_lpChrModel, lpTargetCreature->m_lpChrModel);
|
|
}
|
|
|
|
float fChrDir = lpCreature->m_fDirection;
|
|
fChrDir = -fChrDir;
|
|
fChrDir -= FLOAT_PHI / 2.0f;
|
|
|
|
vector3 vecChrToward;
|
|
vecChrToward.x = cosf(fChrDir);
|
|
vecChrToward.z = sinf(fChrDir);
|
|
vecChrToward.y = 0.0f;
|
|
vecChrToward.Normalize();
|
|
test_script->SetChrFwd(-vecChrToward.x, -vecChrToward.y, -vecChrToward.z);
|
|
|
|
test_script->SetMine(false);
|
|
test_script->SetBSkill(true);
|
|
|
|
if(!CSceneManager::m_EffectManager.AddEffScript(test_script)) // 이펙트 스크립트를 읽으면 나오는 인덱스
|
|
{
|
|
delete test_script;
|
|
}
|
|
} else
|
|
{
|
|
delete test_script;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if(pCastObject.m_cObjectType == 200)
|
|
{
|
|
CEffScript *test_script;
|
|
test_script = new CEffScript;
|
|
if(test_script)
|
|
{
|
|
if(test_script->GetScriptBinData("recall2.esf"))
|
|
{
|
|
// 스킬 사용시 타격 이팩트 처리
|
|
test_script->SetStartPos(pCastObject.m_DstPos.fPointX, pCastObject.m_DstPos.fPointY, pCastObject.m_DstPos.fPointZ);
|
|
test_script->SetEndPos(pCastObject.m_DstPos.fPointX, pCastObject.m_DstPos.fPointY, pCastObject.m_DstPos.fPointZ);
|
|
|
|
float fChrDir = g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection;
|
|
fChrDir = -fChrDir;
|
|
fChrDir -= FLOAT_PHI / 2.0f;
|
|
|
|
vector3 vecChrToward;
|
|
vecChrToward.x = cosf(fChrDir);
|
|
vecChrToward.z = sinf(fChrDir);
|
|
vecChrToward.y = 0.0f;
|
|
vecChrToward.Normalize();
|
|
test_script->SetChrFwd(-vecChrToward.x, -vecChrToward.y, -vecChrToward.z);
|
|
test_script->SetMine(false);
|
|
test_script->SetBSkill(true);
|
|
|
|
if(!CSceneManager::m_EffectManager.AddEffScript(test_script)) // 이펙트 스크립트를 읽으면 나오는 인덱스
|
|
{
|
|
delete test_script;
|
|
}
|
|
} else
|
|
{
|
|
delete test_script;
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharPartyCmdInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwMemberID, dwPartyID;
|
|
unsigned short wPartyCmd;
|
|
m_dwNetworkError = m_pSocket->HandleCharPartyCmdInfo(aryBuffer, &dwMemberID, &dwPartyID, &wPartyCmd);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwMemberID);
|
|
|
|
if(lpCreature)
|
|
{
|
|
switch(wPartyCmd)
|
|
{
|
|
case ClientSocket::PartyCmd_Secession:
|
|
case ClientSocket::PartyCmd_Banish:
|
|
lpCreature->m_dwPartyID = 0;
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_Accept:
|
|
lpCreature->m_dwPartyID = dwPartyID;
|
|
break;
|
|
|
|
case ClientSocket::PartyCmd_Destroy:
|
|
{
|
|
for(int i = 0; i < g_CharacterData.m_lstCharData.num; i++)
|
|
{
|
|
if(g_CharacterData.m_lstCharData[i]->m_dwPartyID == dwPartyID)
|
|
{
|
|
g_CharacterData.m_lstCharData[i]->m_dwPartyID = 0;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharRequireInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned char cCmd;
|
|
SOCKADDR_IN pPubAddress, pPriAddress;
|
|
m_dwNetworkError = m_pSocket->HandleCharRequireInfo(aryBuffer, &dwChrID, &pPubAddress, &pPriAddress, &cCmd);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cCmd)
|
|
{
|
|
case ClientSocket::Require_Shape:
|
|
{
|
|
unsigned long dwResult = m_pSocket->InsertIntoAddressList(ClientSocket::ListType_Client, dwChrID, pPubAddress, pPriAddress);
|
|
|
|
#ifdef _DEBUG
|
|
char a[200];
|
|
sprintf(a, "9. 0x%08x = Pub : %d.%d.%d.%d:%d, Pri : %d.%d.%d.%d:%d %d", dwChrID,
|
|
pPubAddress.sin_addr.s_net, pPubAddress.sin_addr.s_host, pPubAddress.sin_addr.s_lh, pPubAddress.sin_addr.s_impno, pPubAddress.sin_port,
|
|
pPriAddress.sin_addr.s_net, pPriAddress.sin_addr.s_host, pPriAddress.sin_addr.s_lh, pPriAddress.sin_addr.s_impno, pPriAddress.sin_port, m_pSocket->GetPeerType(pPubAddress, pPriAddress));
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
#endif
|
|
|
|
if(dwResult == ClientSocket::ListOper_Insert)
|
|
{
|
|
m_pSocket->CharRequireInfo(g_ClientMain.m_dwMyChrID, dwChrID, ClientSocket::Require_Shape);
|
|
m_lstSendShape.push_back(dwChrID);
|
|
|
|
if(!g_CharacterData.GetCreature(dwChrID))
|
|
{
|
|
vector3 vecPos = vector3(0.0f, 0.0f, 0.0f);
|
|
g_CharacterData.AddCharacter(dwChrID, vecPos); // 공간만 만듬
|
|
}
|
|
}
|
|
|
|
SendCharShape(dwChrID);
|
|
}
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharWhisper(char *aryBuffer)
|
|
{
|
|
char strSendName[MAX_PATH], strRecvName[MAX_PATH], strMessage[MAX_PATH];
|
|
m_dwNetworkError = m_pSocket->HandleCharWhisper(aryBuffer, strSendName, strRecvName, strMessage);
|
|
|
|
char strChat[MAX_PATH];
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
sprintf(strChat, "(from. %s) %s", strSendName, strMessage);
|
|
strcpy(g_ClientMain.m_strRecentChatChrID, strSendName);
|
|
g_TextEdit.AddMessage(strChat, g_ClientMain.m_dwMyChrID, 10);
|
|
|
|
return TRUE;
|
|
} else
|
|
{
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2:
|
|
if(strcmp(g_ClientMain.m_strWhisperChrID, ""))
|
|
{
|
|
strcpy(g_ClientMain.m_strWhisperChrID, "");
|
|
}
|
|
|
|
sprintf(strChat, g_StringTable.m_strString[351], strRecvName);
|
|
g_TextEdit.AddMessage(strChat, g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharExchangeCmd(char *aryBuffer)
|
|
{
|
|
unsigned long dwSendID, dwRecvID;
|
|
unsigned char cCmd;
|
|
m_dwNetworkError = m_pSocket->HandleCharExchangeCmd(aryBuffer, &dwSendID, &dwRecvID, &cCmd);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cCmd)
|
|
{
|
|
case ClientSocket::ExchangeCmd_Propose:
|
|
if(g_ClientMain.m_lpInterface)
|
|
{
|
|
if(g_ClientMain.m_lpInterface->GetBusy())
|
|
{
|
|
SendExchangeCmd(dwSendID, ClientSocket::ExchangeCmd_Refuse);
|
|
} else
|
|
{
|
|
g_ClientMain.m_lpInterface->m_dwExchangeCmdResult = 0;
|
|
g_ClientMain.m_lpInterface->m_dwExchangeCmdType = ClientSocket::ExchangeCmd_Propose;
|
|
g_ClientMain.m_lpInterface->m_dwExchangeCmdSenderID = dwSendID;
|
|
char strText[200];
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwSendID);
|
|
if(lpCreature)
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[353], lpCreature->m_strName);
|
|
CGUIMessageBox *lpMessageBox;
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(strText, MB_EXIT | MB_YES | MB_NO);
|
|
lpMessageBox->SetResult(&g_ClientMain.m_lpInterface->m_dwExchangeCmdResult);
|
|
lpMessageBox->SetEnableEnter(FALSE);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::ExchangeCmd_Refuse:
|
|
{
|
|
char strText[200];
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwSendID);
|
|
if(lpCreature)
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[354], lpCreature->m_strName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::ExchangeCmd_Accept:
|
|
if(dwSendID == g_ClientMain.m_dwMyChrID)
|
|
g_ClientMain.m_lpInterface->m_dwExchangeCmdSenderID = dwRecvID;
|
|
else
|
|
g_ClientMain.m_lpInterface->m_dwExchangeCmdSenderID = dwSendID;
|
|
case ClientSocket::ExchangeCmd_OK:
|
|
case ClientSocket::ExchangeCmd_Cancel:
|
|
case ClientSocket::ExchangeCmd_Exchange:
|
|
case ClientSocket::ExchangeCmd_Quit:
|
|
case ClientSocket::ExchangeCmd_Lock:
|
|
case ClientSocket::ExchangeCmd_UnLock:
|
|
g_ClientMain.m_lpInterface->ProcessExchangeCmd(dwSendID, cCmd);
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharExchangeItem(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID, dwSize;
|
|
unsigned char cType, cNum;
|
|
Item::ItemPos pItemIndex;
|
|
char *lpItemBuffer;
|
|
m_dwNetworkError = m_pSocket->HandleCharExchangeItem(aryBuffer, &dwChrID, &dwSize, &pItemIndex, &cType, &cNum, &lpItemBuffer);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cType)
|
|
{
|
|
case 0: // Item
|
|
if(dwSize)
|
|
{
|
|
CItemInstance *lpItem = g_ClientMain.m_csStatus.GetExchangeItem(pItemIndex.m_cIndex, FALSE);
|
|
if(lpItem)
|
|
{
|
|
g_ClientMain.m_csStatus.DeleteExchangeItem(lpItem, FALSE);
|
|
}
|
|
|
|
lpItem = new CItemInstance;
|
|
lpItem->SetItemInfo(lpItemBuffer, (size_t &)dwSize);
|
|
// lpItem->m_lpItemBase = Item::CItemFactory::GetInstance().CreateItem(lpItemBuffer, (size_t &)dwSize);
|
|
// lpItem->SetItemPos(ClientSocket::ItemPos_Exchange);
|
|
// lpItem->SetPos(pItemIndex.m_cIndex);
|
|
|
|
g_ClientMain.m_csStatus.AddExchangeItem(lpItem, FALSE);
|
|
g_ClientMain.m_lpInterface->InitPos(lpItem);
|
|
} else
|
|
{
|
|
CItemInstance *lpExistItem = g_ClientMain.m_csStatus.GetExchangeItem(pItemIndex.m_cIndex, FALSE);
|
|
if(lpExistItem)
|
|
{
|
|
unsigned long dwNum = lpExistItem->GetNowDurability() + cNum;
|
|
lpExistItem->SetNowDurability(dwNum);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 1: // Gold
|
|
g_ClientMain.m_csStatus.m_dwExchange2Gold = dwSize;
|
|
break;
|
|
|
|
case 2:
|
|
{
|
|
CItemInstance *lpExistItem = g_ClientMain.m_csStatus.GetExchangeItem(pItemIndex.m_cIndex, FALSE);
|
|
if(lpExistItem)
|
|
{
|
|
g_ClientMain.m_csStatus.DeleteExchangeItem(lpExistItem, FALSE);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharTakeGold(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID, dwGold;
|
|
unsigned char cSrcPos, cDstPos;
|
|
m_dwNetworkError = m_pSocket->HandleCharTakeGold(aryBuffer, &dwChrID, &cSrcPos, &cDstPos, &dwGold);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
switch(cSrcPos)
|
|
{
|
|
case ClientSocket::ItemPos_Inven:
|
|
if(dwGold <= g_ClientMain.m_csStatus.m_Info.Gold)
|
|
g_ClientMain.m_csStatus.m_Info.Gold -= dwGold;
|
|
else
|
|
g_ClientMain.m_csStatus.m_Info.Gold = 0;
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Exchange:
|
|
// 교환창에서 돈 빼기
|
|
if(dwGold <= g_ClientMain.m_csStatus.m_dwExchangeGold)
|
|
g_ClientMain.m_csStatus.m_dwExchangeGold -= dwGold;
|
|
else
|
|
g_ClientMain.m_csStatus.m_dwExchangeGold = 0;
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Deposit:
|
|
if(dwGold <= g_ClientMain.m_csStatus.m_dwDepositGold)
|
|
g_ClientMain.m_csStatus.m_dwDepositGold -= dwGold;
|
|
else
|
|
g_ClientMain.m_csStatus.m_dwDepositGold = 0;
|
|
break;
|
|
}
|
|
|
|
switch(cDstPos)
|
|
{
|
|
case ClientSocket::ItemPos_Inven:
|
|
if(0xFFFFFFFF - g_ClientMain.m_csStatus.m_Info.Gold >= dwGold)
|
|
g_ClientMain.m_csStatus.m_Info.Gold += dwGold;
|
|
else
|
|
g_ClientMain.m_csStatus.m_Info.Gold = 0xFFFFFFFF;
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Exchange:
|
|
// 교환창에 돈 넣기
|
|
if(0xFFFFFFFF - g_ClientMain.m_csStatus.m_dwExchangeGold >= dwGold)
|
|
g_ClientMain.m_csStatus.m_dwExchangeGold += dwGold;
|
|
else
|
|
g_ClientMain.m_csStatus.m_dwExchangeGold = 0xFFFFFFFF;
|
|
break;
|
|
|
|
case ClientSocket::ItemPos_Deposit:
|
|
if(0xFFFFFFFF - g_ClientMain.m_csStatus.m_dwDepositGold >= dwGold)
|
|
g_ClientMain.m_csStatus.m_dwDepositGold += dwGold;
|
|
else
|
|
g_ClientMain.m_csStatus.m_dwDepositGold = 0xFFFFFFFF;
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharDuelCmd(char *aryBuffer)
|
|
{
|
|
unsigned long dwSendID, dwRecvID;
|
|
unsigned char cCmd;
|
|
m_dwNetworkError = m_pSocket->HandleCharDuelCmd(aryBuffer, &dwSendID, &dwRecvID, &cCmd);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cCmd)
|
|
{
|
|
case ClientSocket::DuelCmd_Propose:
|
|
if(g_ClientMain.m_lpInterface->GetBusy())
|
|
{
|
|
m_pSocket->CharDuelCmd(g_ClientMain.m_dwMyChrID, dwSendID, ClientSocket::DuelCmd_Refuse);
|
|
} else if(g_ClientMain.m_lpInterface)
|
|
{
|
|
g_ClientMain.m_lpInterface->m_dwDuelCmdResult = 0;
|
|
g_ClientMain.m_lpInterface->m_dwDuelCmdType = ClientSocket::DuelCmd_Propose;
|
|
g_ClientMain.m_lpInterface->m_dwDuelCmdSenderID = dwSendID;
|
|
char strText[200];
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwSendID);
|
|
if(lpCreature)
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[359],
|
|
lpCreature->m_strName, lpCreature->m_cLevel,
|
|
g_ClientMain.m_lpCommonInterface->GetClassName(lpCreature->m_wClass));
|
|
CGUIMessageBox *lpMessageBox;
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(strText, MB_EXIT | MB_YES | MB_NO);
|
|
lpMessageBox->SetResult(&g_ClientMain.m_lpInterface->m_dwDuelCmdResult);
|
|
lpMessageBox->SetEnableEnter(FALSE);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::DuelCmd_Refuse:
|
|
{
|
|
char strText[200];
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwSendID);
|
|
if(lpCreature)
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[360], lpCreature->m_strName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::DuelCmd_Ready:
|
|
// 듀얼 시작
|
|
{
|
|
g_CharacterData.InitDuelTarget();
|
|
if(dwSendID == g_ClientMain.m_dwMyChrID)
|
|
g_CharacterData.SetPreDuelTarget(dwRecvID);
|
|
// g_CharacterData.m_dwPreDuelTargetID = dwRecvID;
|
|
else
|
|
g_CharacterData.SetPreDuelTarget(dwSendID);
|
|
// g_CharacterData.m_dwPreDuelTargetID = dwSendID;
|
|
|
|
if(g_CharacterData.m_lpDuelReady)
|
|
{
|
|
CSceneManager::m_EffectManager.DeleteInterfaceScript(g_CharacterData.m_lpDuelReady);
|
|
g_CharacterData.m_lpDuelReady = NULL;
|
|
}
|
|
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
g_CharacterData.m_lpDuelReady = new CEffScript;
|
|
g_CharacterData.m_lpDuelReady->SetInterfaceSet(true);
|
|
g_CharacterData.m_lpDuelReady->GetScriptBinData("inter_duel.esf");
|
|
CSceneManager::m_EffectManager.AddInterfaceScript(g_CharacterData.m_lpDuelReady);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::DuelCmd_Logout:
|
|
{
|
|
if(dwSendID == g_ClientMain.m_dwMyChrID)
|
|
g_CharacterData.InitDuelTarget();
|
|
else
|
|
g_CharacterData.DeleteDuelTarget(dwSendID);
|
|
// g_CharacterData.m_dwDuelTargetID = 0;
|
|
// g_CharacterData.m_dwPreDuelTargetID = 0;
|
|
|
|
char strText[200];
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwSendID);
|
|
if(lpCreature)
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[361], lpCreature->m_strName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
|
|
SendFameInfo(ClientSocket::FameInfoType_Fame);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::DuelCmd_Dead:
|
|
{
|
|
if(dwSendID == g_ClientMain.m_dwMyChrID)
|
|
g_CharacterData.InitDuelTarget();
|
|
else
|
|
g_CharacterData.DeleteDuelTarget(dwSendID);
|
|
// g_CharacterData.m_dwDuelTargetID = 0;
|
|
// g_CharacterData.m_dwPreDuelTargetID = 0;
|
|
|
|
if(dwSendID != g_ClientMain.m_dwMyChrID)
|
|
{
|
|
char strText[200];
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwSendID);
|
|
if(lpCreature)
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[362], lpCreature->m_strName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 129);
|
|
}
|
|
}
|
|
|
|
SendFameInfo(ClientSocket::FameInfoType_Fame);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::DuelCmd_Cancel:
|
|
g_CharacterData.InitDuelTarget();
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharFameInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID, dwFameOrMerits;
|
|
unsigned char cCmd;
|
|
unsigned char cRaceRank, cClassRank;
|
|
m_dwNetworkError = m_pSocket->HandleCharFameInfo(aryBuffer, &dwChrID, &cCmd, &dwFameOrMerits, &cRaceRank, &cClassRank);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cCmd)
|
|
{
|
|
case ClientSocket::FameInfoType_Fame:
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Fame = dwFameOrMerits;
|
|
|
|
char strText[200], strRace[100], strClass[100];
|
|
if(cRaceRank) sprintf(strRace, g_StringTable.m_strString[363], cRaceRank); else strcpy(strRace, g_StringTable.m_strString[369]);
|
|
if(cClassRank) sprintf(strClass, g_StringTable.m_strString[363], cClassRank); else strcpy(strClass, g_StringTable.m_strString[369]);
|
|
sprintf(strText, g_StringTable.m_strString[364], g_ClientMain.m_csStatus.m_Info.Fame, strRace, strClass);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::FameInfoType_Merits:
|
|
{
|
|
g_ClientMain.m_csStatus.m_Info.Merits = dwFameOrMerits;
|
|
|
|
char strText[200], strRace[100], strClass[100];
|
|
if(cRaceRank) sprintf(strRace, g_StringTable.m_strString[363], cRaceRank); else strcpy(strRace, g_StringTable.m_strString[369]);
|
|
if(cClassRank) sprintf(strClass, g_StringTable.m_strString[363], cClassRank); else strcpy(strClass, g_StringTable.m_strString[369]);
|
|
sprintf(strText, g_StringTable.m_strString[384], g_ClientMain.m_csStatus.m_Info.Merits, strRace, strClass);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharPartyFind(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID;
|
|
unsigned char cMemberFindPartyNum, cPartyFindMemberNum;
|
|
LPMemberFindParty lpMember;
|
|
LPPartyFindMember lpParty;
|
|
m_dwNetworkError = m_pSocket->HandleCharPartyFind(aryBuffer, &dwChrID, &cMemberFindPartyNum, &cPartyFindMemberNum, &lpMember, &lpParty);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
unsigned long i;
|
|
|
|
g_ClientMain.m_cNumMember = cMemberFindPartyNum;
|
|
ZeroMemory(g_ClientMain.m_mfpMember, sizeof(g_ClientMain.m_mfpMember));
|
|
for(i = 0; i < cMemberFindPartyNum; i++)
|
|
{
|
|
strcpy(g_ClientMain.m_mfpMember[i].m_strName, lpMember[i].m_strName);
|
|
g_ClientMain.m_mfpMember[i].m_cLevel = lpMember[i].m_cLevel;
|
|
g_ClientMain.m_mfpMember[i].m_cClass = lpMember[i].m_cClass;
|
|
}
|
|
|
|
g_ClientMain.m_cNumParty = cPartyFindMemberNum;
|
|
ZeroMemory(g_ClientMain.m_pfmParty, sizeof(g_ClientMain.m_pfmParty));
|
|
for(i = 0; i < cPartyFindMemberNum; i++)
|
|
{
|
|
strcpy(g_ClientMain.m_pfmParty[i].m_strLeaderName, lpParty[i].m_strLeaderName);
|
|
g_ClientMain.m_pfmParty[i].m_cAverageLevel = lpParty[i].m_cAverageLevel;
|
|
g_ClientMain.m_pfmParty[i].m_cMemberNum = lpParty[i].m_cMemberNum;
|
|
}
|
|
/*
|
|
g_ClientMain.m_cNumMember = 20;
|
|
ZeroMemory(g_ClientMain.m_mfpMember, sizeof(g_ClientMain.m_mfpMember));
|
|
for(i = 0; i < 20; i++)
|
|
{
|
|
strcpy(g_ClientMain.m_mfpMember[i].m_strName, "Belldandy");
|
|
g_ClientMain.m_mfpMember[i].m_cLevel = i + 1;
|
|
g_ClientMain.m_mfpMember[i].m_cClass = 18;
|
|
}
|
|
|
|
g_ClientMain.m_cNumParty = 20;
|
|
ZeroMemory(g_ClientMain.m_pfmParty, sizeof(g_ClientMain.m_pfmParty));
|
|
for(i = 0; i < 20; i++)
|
|
{
|
|
strcpy(g_ClientMain.m_pfmParty[i].m_strLeaderName, "Belldandy");
|
|
g_ClientMain.m_pfmParty[i].m_cAverageLevel = i + 1;
|
|
g_ClientMain.m_pfmParty[i].m_cMemberNum = 18;
|
|
}*/
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharSpellInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned char cSpellType;
|
|
unsigned short wEnchantLevel;
|
|
bool bOnOff;
|
|
m_dwNetworkError = m_pSocket->HandleCharSpellInfo(aryBuffer, &dwChrID, &cSpellType, &wEnchantLevel, &bOnOff);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
if(lpCreature)
|
|
{
|
|
if(bOnOff)
|
|
{
|
|
if(lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
lpCreature->SetChantEffect(cSpellType, TRUE, TRUE);
|
|
else
|
|
lpCreature->SetChantEffect(cSpellType, TRUE, FALSE);
|
|
|
|
if(lpCreature->GetChantFlag(17) && lpCreature->m_dwChrID == g_CharacterData.m_dwAutoTargetID)
|
|
{
|
|
g_CharacterData.m_bAutoTargetAttack = false;
|
|
g_CharacterData.m_dwAutoTargetID = 0xFFFFFFFF;
|
|
}
|
|
} else
|
|
{
|
|
if(lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
lpCreature->SetChantEffect(cSpellType, FALSE, TRUE);
|
|
else
|
|
lpCreature->SetChantEffect(cSpellType, FALSE, FALSE);
|
|
}
|
|
}
|
|
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
if(bOnOff)
|
|
{
|
|
g_ClientMain.m_csStatus.m_aryEnchantLevel[cSpellType - 1] = wEnchantLevel;
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.m_aryEnchantLevel[cSpellType - 1] = 0;
|
|
unsigned short wSkill = g_ClientMain.m_csStatus.GetSkillIDbyChantID(cSpellType);
|
|
if(wSkill) g_ClientMain.SetSkillCoolDown(wSkill);
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
|
|
if(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->GetChantFlag(25) ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->GetChantFlag(26))
|
|
{
|
|
g_CharacterData.InitGlobalAction();
|
|
if(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_RUN ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_SWIM ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_WALK ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_WALKBACK ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_WALKLEFT ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_WALKRIGHT ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_FORWARDJUMP ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_BACKJUMP ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_JUMPATTACK ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_FRONTDASH ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_BACKDASH ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_LEFTDASH ||
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwLowerChrAction == CA_RIGHTDASH)
|
|
{
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bUpperAble = TRUE;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bLowerAble = TRUE;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bUpperAnimating = FALSE;
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bLowerAnimating = FALSE;
|
|
if(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->GetChantFlag(25))
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->SetAction(CA_WAIT, CA_WAIT);
|
|
else
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->SetAction(CA_STUN, CA_STUN);
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseControlOption(char *aryBuffer)
|
|
{
|
|
RejectOption roOption;
|
|
unsigned long dwChrID;
|
|
m_dwNetworkError = m_pSocket->HandleControlOption(aryBuffer, &dwChrID, &roOption);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
g_ClientMain.m_roOption.m_wReject = roOption.m_wReject;
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharSkillUnLock(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned long dwChrID, dwGold;
|
|
unsigned short wSkill;
|
|
unsigned char cIndex;
|
|
Item::ItemPos pItemIndex;
|
|
m_dwNetworkError = m_pSocket->HandleCharSkillUnLock(aryBuffer, &dwChrID, &wSkill, &cIndex, &pItemIndex, &dwGold);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(g_ClientMain.m_dwMyChrID == dwChrID)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill == wSkill)
|
|
{
|
|
g_ClientMain.m_csStatus.m_Skill.wSkillNum -= g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel;
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cLockCount--;
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel = 6;
|
|
|
|
if(g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex])
|
|
{
|
|
delete g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex];
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex] = new CItemInstance;
|
|
g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->SetSkillInfo(g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cLockCount,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel,
|
|
ClientSocket::ItemPos_SSlot, cIndex, 0);
|
|
|
|
char strText[MAX_PATH];
|
|
sprintf(strText, g_StringTable.m_strString[385], g_ClientMain.m_csStatus.m_lstSkillSlot[cIndex]->GetItemInfo().m_SpriteData.m_szName);
|
|
g_TextEdit.AddMessage(strText, g_ClientMain.m_dwMyChrID, 128);
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
}
|
|
|
|
long lCoolTime;
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lstQuickSlot[i] && g_ClientMain.m_csStatus.m_lstQuickSlot[i]->GetProtoTypeID() == wSkill)
|
|
{
|
|
lCoolTime = g_ClientMain.m_csStatus.m_lstQuickSlot[i]->m_lCoolDownTimeCount;
|
|
|
|
BOOL bSelected = FALSE;
|
|
if(g_ClientMain.m_csStatus.m_lpQuickSelected == g_ClientMain.m_csStatus.m_lstQuickSlot[i])
|
|
{
|
|
bSelected = TRUE;
|
|
g_ClientMain.m_Network.SetChant(NULL);
|
|
g_ClientMain.m_csStatus.SetActivateSkill(NULL);
|
|
}
|
|
|
|
delete g_ClientMain.m_csStatus.m_lstQuickSlot[i];
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i] = new CItemInstance;
|
|
g_ClientMain.m_csStatus.m_lstQuickSlot[i]->SetSkillInfo(g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.wSkill,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cLockCount,
|
|
g_ClientMain.m_csStatus.m_Skill.SSlot[cIndex].SKILLINFO.cSkillLevel,
|
|
ClientSocket::ItemPos_QSlot, i, lCoolTime);
|
|
|
|
if(bSelected)
|
|
{
|
|
g_ClientMain.m_Network.SetChant(g_ClientMain.m_csStatus.m_lstQuickSlot[i]);
|
|
g_ClientMain.m_csStatus.SetActivateSkill(g_ClientMain.m_csStatus.m_lstQuickSlot[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 아이템 삭제
|
|
CItemInstance *lpItem = g_ClientMain.m_csStatus.GetInventoryItem(pItemIndex.m_cIndex);
|
|
if(lpItem)
|
|
{
|
|
unsigned long dwNum = lpItem->GetNowDurability() - 1;
|
|
lpItem->SetNowDurability(dwNum);
|
|
if(lpItem->GetNowDurability() <= 0)
|
|
{
|
|
g_ClientMain.m_csStatus.DeleteInventoryItem(lpItem);
|
|
delete lpItem;
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.SetQuickSlot(lpItem);
|
|
}
|
|
} else
|
|
{
|
|
}
|
|
|
|
// 골드
|
|
g_ClientMain.m_csStatus.m_Info.Gold = dwGold;
|
|
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseDepositUpdate(char *aryBuffer)
|
|
{
|
|
unsigned long dwFlag;
|
|
unsigned char cTab;
|
|
unsigned short wStoreSize;
|
|
bool bComplete;
|
|
char *lpStoreBuffer;
|
|
m_dwNetworkError = m_pSocket->HandleDepositUpdate(aryBuffer, &dwFlag, &cTab, &bComplete, &wStoreSize, &lpStoreBuffer);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
g_ClientMain.m_csStatus.m_dwDepositFlag = dwFlag;
|
|
|
|
// 창고 아이템
|
|
unsigned short wBufferSize = 0;
|
|
while(wBufferSize < wStoreSize)
|
|
{
|
|
CItemInstance *lpItem;
|
|
lpItem = new CItemInstance;
|
|
size_t nDBSize = wStoreSize - wBufferSize;
|
|
lpItem->SetItemInfo(lpStoreBuffer, nDBSize);
|
|
|
|
wBufferSize += nDBSize;
|
|
lpStoreBuffer += nDBSize;
|
|
|
|
g_ClientMain.m_csStatus.AddDepositItem(lpItem, FALSE);
|
|
}
|
|
|
|
if(g_ClientMain.m_csStatus.m_dwDepositFlag & PktDepositUpdateDB::ITEM_TAB1) g_ClientMain.m_csStatus.m_dwMaxTab = 1;
|
|
if(g_ClientMain.m_csStatus.m_dwDepositFlag & PktDepositUpdateDB::ITEM_TAB2) g_ClientMain.m_csStatus.m_dwMaxTab = 2;
|
|
if(g_ClientMain.m_csStatus.m_dwDepositFlag & PktDepositUpdateDB::ITEM_TAB3) g_ClientMain.m_csStatus.m_dwMaxTab = 3;
|
|
if(g_ClientMain.m_csStatus.m_dwDepositFlag & PktDepositUpdateDB::ITEM_TAB4) g_ClientMain.m_csStatus.m_dwMaxTab = 4;
|
|
|
|
if(g_ClientMain.m_csStatus.m_dwDepositFlag & PktDepositUpdateDB::USED_DEPOSIT)
|
|
g_ClientMain.m_csStatus.m_cUsedDeposit = 1;
|
|
else
|
|
g_ClientMain.m_csStatus.m_cUsedDeposit = 0;
|
|
if(g_ClientMain.m_csStatus.m_dwDepositFlag & PktDepositUpdateDB::SAVED_PASSWORD)
|
|
g_ClientMain.m_csStatus.m_cSavePass = 1;
|
|
else
|
|
g_ClientMain.m_csStatus.m_cSavePass = 0;
|
|
|
|
if(bComplete)
|
|
{
|
|
m_bCompleteDeposit = TRUE;
|
|
|
|
if(m_bCharLoginSuccess && m_bCompleteDeposit)
|
|
{
|
|
m_nsNetworkState = NS_UPDATEADDRESS;
|
|
m_bUpdateAddressPacket = FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseDeposit(char *aryBuffer)
|
|
{
|
|
unsigned char cCmd;
|
|
unsigned long dwGold;
|
|
char cSavePass;
|
|
m_dwNetworkError = m_pSocket->HandleDeposit(aryBuffer, &cCmd, &dwGold, &cSavePass);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
// 창고 아이템
|
|
switch(cCmd)
|
|
{
|
|
case PktDeposit::LOGIN:
|
|
((CHumanVault *)g_ClientMain.m_lpInterface->m_lstWindow[19])->ShowNormal();
|
|
((CHumanVault *)g_ClientMain.m_lpInterface->m_lstWindow[19])->m_bLogined = TRUE;
|
|
strcpy(((CHumanVault *)g_ClientMain.m_lpInterface->m_lstWindow[19])->m_strCurPass, "");
|
|
strcpy(((CHumanVault *)g_ClientMain.m_lpInterface->m_lstWindow[19])->m_strNewPass, "");
|
|
g_ClientMain.SetFocus();
|
|
g_TextEdit.InitMessage();
|
|
g_TextEdit.m_dwEditMode = EDITMODE_CHAT;
|
|
g_TextEdit.SetEditLength(100);
|
|
break;
|
|
|
|
case PktDeposit::BUY_TAB:
|
|
{
|
|
unsigned long dwGold[4] = { 0, 100000, 1000000, 5000000 };
|
|
g_ClientMain.m_csStatus.m_Info.Gold -= dwGold[g_ClientMain.m_csStatus.m_dwMaxTab];
|
|
g_ClientMain.m_csStatus.m_dwMaxTab++;
|
|
}
|
|
break;
|
|
|
|
case PktDeposit::LOGOUT:
|
|
break;
|
|
|
|
case PktDeposit::CHANGE_PASS:
|
|
if(!g_ClientMain.m_csStatus.m_cUsedDeposit)
|
|
{
|
|
m_pSocket->StoreLogin(((CHumanVault *)g_ClientMain.m_lpInterface->m_lstWindow[19])->m_strNewPass,
|
|
((CHumanVault *)g_ClientMain.m_lpInterface->m_lstWindow[19])->m_cSavePass);
|
|
g_ClientMain.m_csStatus.m_cUsedDeposit = 1;
|
|
} else
|
|
{
|
|
((CHumanVault *)g_ClientMain.m_lpInterface->m_lstWindow[19])->ShowNormal();
|
|
g_ClientMain.SetFocus();
|
|
g_TextEdit.InitMessage();
|
|
g_TextEdit.m_dwEditMode = EDITMODE_CHAT;
|
|
g_TextEdit.SetEditLength(100);
|
|
}
|
|
break;
|
|
|
|
case PktDeposit::SAVED_PASS:
|
|
g_ClientMain.m_csStatus.m_dwDepositGold = dwGold;
|
|
g_ClientMain.m_csStatus.m_cSavePass = cSavePass;
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
} else
|
|
{
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 3:
|
|
g_TextEdit.InitMessage();
|
|
strcpy(((CHumanVault *)g_ClientMain.m_lpInterface->m_lstWindow[19])->m_strCurPass, "");
|
|
strcpy(((CHumanVault *)g_ClientMain.m_lpInterface->m_lstWindow[19])->m_strNewPass, "");
|
|
switch(cCmd)
|
|
{
|
|
case PktDeposit::LOGIN:
|
|
g_TextEdit.m_dwEditMode = EDITMODE_DEPOSITPASS;
|
|
break;
|
|
|
|
case PktDeposit::CHANGE_PASS:
|
|
g_TextEdit.m_dwEditMode = EDITMODE_CURPASS;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharStallOpen(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
char strStallName[32];
|
|
m_dwNetworkError = m_pSocket->HandleCharStallOpen(aryBuffer, &dwChrID, strStallName);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwChrID);
|
|
if(strcmp(strStallName, ""))
|
|
{
|
|
// 노점상을 열었다.
|
|
if(lpCreature)
|
|
{
|
|
strcpy(lpCreature->m_strStreetStallName, strStallName);
|
|
|
|
if(lpCreature->m_dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
if(g_ClientMain.m_lpInterface)
|
|
g_ClientMain.m_lpInterface->InitStreetStall(lpCreature->m_dwChrID, lpCreature->m_strName);
|
|
}
|
|
}
|
|
} else
|
|
{
|
|
// 노점상을 닫았다.
|
|
if(lpCreature) strcpy(lpCreature->m_strStreetStallName, "");
|
|
|
|
if(((CHumanStreetStall *)g_ClientMain.m_lpInterface->m_lstWindow[20]))
|
|
{
|
|
if(((CHumanStreetStall *)g_ClientMain.m_lpInterface->m_lstWindow[20])->m_bShow)
|
|
{
|
|
if(((CHumanStreetStall *)g_ClientMain.m_lpInterface->m_lstWindow[20])->m_dwMarketOwnerID == dwChrID)
|
|
{
|
|
((CHumanStreetStall *)g_ClientMain.m_lpInterface->m_lstWindow[20])->ShowWindow(FALSE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharStallEnter(char *aryBuffer)
|
|
{
|
|
unsigned long dwCustomerID, dwOwner;
|
|
m_dwNetworkError = m_pSocket->HandleCharStallEnter(aryBuffer, &dwCustomerID, &dwOwner);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwOwner)
|
|
{
|
|
if(dwCustomerID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
// 내가 들어갔다.
|
|
g_ClientMain.m_bStreetStallEnter = TRUE;
|
|
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwOwner);
|
|
if(lpCreature)
|
|
{
|
|
if(g_ClientMain.m_lpInterface)
|
|
{
|
|
g_ClientMain.m_lpInterface->InitStreetStall(lpCreature->m_dwChrID, lpCreature->m_strName);
|
|
return TRUE;
|
|
}
|
|
}
|
|
} else
|
|
{
|
|
// 누가 들어왔다.
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwCustomerID);
|
|
char strText[MAX_PATH];
|
|
if(lpCreature)
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[392], lpCreature->m_strName);
|
|
} else
|
|
{
|
|
strcpy(strText, g_StringTable.m_strString[393]);
|
|
}
|
|
g_TextEdit.AddStallChatMessage(strText, dwCustomerID, 128);
|
|
}
|
|
} else
|
|
{
|
|
if(dwCustomerID != g_ClientMain.m_dwMyChrID)
|
|
{
|
|
// 사람이 나갔다.
|
|
CCreature *lpCreature = g_CharacterData.GetCreature(dwCustomerID);
|
|
char strText[MAX_PATH];
|
|
if(lpCreature)
|
|
{
|
|
sprintf(strText, g_StringTable.m_strString[394], lpCreature->m_strName);
|
|
} else
|
|
{
|
|
strcpy(strText, g_StringTable.m_strString[395]);
|
|
}
|
|
g_TextEdit.AddStallChatMessage(strText, dwCustomerID, 128);
|
|
} else
|
|
{
|
|
g_ClientMain.m_bStreetStallEnter = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharStallRegisterItem(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
unsigned char cCmd;
|
|
unsigned long dwChrID, dwGold;
|
|
TakeType pTakeType;
|
|
m_dwNetworkError = m_pSocket->HandleCharStallRegisterItem(aryBuffer, &dwChrID, &pTakeType, &dwGold, &cCmd);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cCmd)
|
|
{
|
|
case ClientSocket::StallCmd_Register:
|
|
{ // 물건을 등록했다.
|
|
CItemInstance *lpItem = new CItemInstance;
|
|
if(lpItem->SetItemInfo(g_ClientMain.m_lpPickItem, pTakeType.m_dstPos))
|
|
{
|
|
lpItem->m_lpItemBase->SetStallPrice(dwGold);
|
|
lpItem->m_bTradeItem = TRUE;
|
|
g_ClientMain.m_csStatus.AddStreetTradeItem(lpItem);
|
|
g_ClientMain.m_csStatus.AddInventoryItem(g_ClientMain.m_lpPickItem);
|
|
g_ClientMain.SetPickItem(NULL);
|
|
} else
|
|
{
|
|
g_ClientMain.m_Network.m_pSocket->CharStallRegisterItem(g_ClientMain.m_dwMyChrID, pTakeType, dwGold, ClientSocket::StallCmd_Cancel);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::StallCmd_ChangePrice:
|
|
// 가격을 바꿨다.
|
|
{
|
|
CItemInstance *lpItem = g_ClientMain.m_csStatus.GetStreetTradeItem(pTakeType.m_dstPos);
|
|
if(lpItem)
|
|
{
|
|
lpItem->m_lpItemBase->SetStallPrice(dwGold);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::StallCmd_Cancel:
|
|
// 물건을 내리거나 팔렸다.
|
|
{
|
|
CItemInstance *lpItem = g_ClientMain.m_csStatus.GetStreetTradeItem(pTakeType.m_dstPos);
|
|
if(lpItem)
|
|
{
|
|
if(lpItem->GetIsEnableStack())
|
|
{
|
|
if(lpItem->GetNowDurability() > pTakeType.m_cNum)
|
|
{
|
|
unsigned long dwNum = lpItem->GetNowDurability() - pTakeType.m_cNum;
|
|
lpItem->SetNowDurability(dwNum);
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.DeleteStreetTradeItem(lpItem);
|
|
}
|
|
} else
|
|
{
|
|
g_ClientMain.m_csStatus.DeleteStreetTradeItem(lpItem);
|
|
}
|
|
} else if(g_ClientMain.m_lpPickItem)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
delete g_ClientMain.m_lpPickItem;
|
|
g_ClientMain.SetPickItem(NULL);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharStallItemInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwSize, *dwPrice;
|
|
char *lpBuffer;
|
|
unsigned short wItemNum;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharStallItemInfo(aryBuffer, &dwSize, &lpBuffer, &wItemNum, &dwPrice);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
unsigned short wBufferSize = 0, count = 0;
|
|
while(wBufferSize < dwSize)
|
|
{
|
|
CItemInstance *lpItem;
|
|
lpItem = new CItemInstance;
|
|
size_t nDBSize = dwSize - wBufferSize;
|
|
lpItem->SetItemInfo(lpBuffer, nDBSize);
|
|
lpItem->m_bTradeItem = TRUE;
|
|
lpItem->m_lpItemBase->SetStallPrice(dwPrice[count]);
|
|
count++;
|
|
|
|
wBufferSize += nDBSize;
|
|
lpBuffer += nDBSize;
|
|
|
|
g_ClientMain.m_csStatus.AddStreetTradeItem(lpItem, FALSE);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharTeamBattleInfo(char *aryBuffer)
|
|
{
|
|
unsigned long aryMemberID[10], dwChrID;
|
|
unsigned char cMember, cCmd, aryMemberLevel[10];
|
|
char strName[16];
|
|
|
|
ZeroMemory(strName, sizeof(strName));
|
|
m_dwNetworkError = m_pSocket->HandleCharTeamBattleInfo(aryBuffer, &dwChrID, strName, &cCmd, &cMember, aryMemberID, aryMemberLevel);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(!g_ClientMain.m_lpInterface) return TRUE;
|
|
|
|
switch(cCmd)
|
|
{
|
|
case ClientSocket::DuelCmd_RequestPartyInfo:
|
|
{
|
|
g_ClientMain.m_lpInterface->m_dwPartyDuelCmdResult = 0;
|
|
g_ClientMain.m_lpInterface->m_dwPartyDuelCmdType = ClientSocket::DuelCmd_RequestPartyInfo;
|
|
g_ClientMain.m_lpInterface->m_dwPartyDuelCmdSenderID = dwChrID;
|
|
|
|
char strText[MAX_PATH], strTemp[MAX_PATH];
|
|
sprintf(strText, g_StringTable.m_strString[396], strName, cMember, aryMemberLevel[0]);
|
|
for(unsigned long i = 1; i < cMember; i++)
|
|
{
|
|
sprintf(strTemp, ",%d", aryMemberLevel[i]);
|
|
strcat(strText, strTemp);
|
|
}
|
|
strcat(strText, g_StringTable.m_strString[397]);
|
|
|
|
CGUIMessageBox *lpMessageBox;
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->SetWordBreak(TRUE);
|
|
lpMessageBox->Create(strText, MB_EXIT | MB_YES | MB_NO);
|
|
lpMessageBox->SetResult(&g_ClientMain.m_lpInterface->m_dwPartyDuelCmdResult);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::DuelCmd_PartyPropose:
|
|
{
|
|
g_ClientMain.m_lpInterface->m_dwPartyDuelCmdResult = 0;
|
|
g_ClientMain.m_lpInterface->m_dwPartyDuelCmdType = ClientSocket::DuelCmd_PartyPropose;
|
|
g_ClientMain.m_lpInterface->m_dwPartyDuelCmdSenderID = dwChrID;
|
|
|
|
char strText[MAX_PATH], strTemp[MAX_PATH];
|
|
sprintf(strText, g_StringTable.m_strString[396], strName, cMember, aryMemberLevel[0]);
|
|
for(unsigned long i = 1; i < cMember; i++)
|
|
{
|
|
sprintf(strTemp, ",%d", aryMemberLevel[i]);
|
|
strcat(strText, strTemp);
|
|
}
|
|
strcat(strText, g_StringTable.m_strString[398]);
|
|
|
|
CGUIMessageBox *lpMessageBox;
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->SetWordBreak(TRUE);
|
|
lpMessageBox->Create(strText, MB_EXIT | MB_YES | MB_NO);
|
|
lpMessageBox->SetResult(&g_ClientMain.m_lpInterface->m_dwPartyDuelCmdResult);
|
|
}
|
|
break;
|
|
|
|
case ClientSocket::DuelCmd_PartyReady:
|
|
// 팀 배틀 시작
|
|
{
|
|
g_CharacterData.InitDuelTarget();
|
|
for(unsigned long i = 0; i < cMember; i++)
|
|
{
|
|
g_CharacterData.SetPreDuelTarget(aryMemberID[i]);
|
|
}
|
|
|
|
if(g_CharacterData.m_lpDuelReady)
|
|
{
|
|
CSceneManager::m_EffectManager.DeleteInterfaceScript(g_CharacterData.m_lpDuelReady);
|
|
g_CharacterData.m_lpDuelReady = NULL;
|
|
}
|
|
|
|
// _ASSERTE(_CrtCheckMemory());
|
|
g_CharacterData.m_lpDuelReady = new CEffScript;
|
|
g_CharacterData.m_lpDuelReady->SetInterfaceSet(true);
|
|
g_CharacterData.m_lpDuelReady->GetScriptBinData("inter_duel.esf");
|
|
CSceneManager::m_EffectManager.AddInterfaceScript(g_CharacterData.m_lpDuelReady);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharEliteBonus(char *aryBuffer)
|
|
{
|
|
char cNation;
|
|
unsigned char cLevel;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleCharEliteBonus(aryBuffer, &cNation, &cLevel);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
g_ClientMain.m_cEliteNation = cNation;
|
|
g_ClientMain.m_cEliteLevel = cLevel;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharStartQuest(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID, dwNpcID;
|
|
unsigned short wQuestID;
|
|
m_dwNetworkError = m_pSocket->HandleCharStartQuest(aryBuffer, &dwChrID, &dwNpcID, &wQuestID);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
LPNPCNode lpNode = g_NPCList.GetNPCNode(dwNpcID);
|
|
if(lpNode)
|
|
{
|
|
LPQuestNode lpQuest = lpNode->GetQuestforID(wQuestID);
|
|
if(lpQuest)
|
|
{
|
|
// CharStatus에 있는 퀘스트 구조체와 스크립트에 있는 퀘스트를 링크시킨다.
|
|
// 자동적으로 페이즈1이 시작
|
|
LPQuestInstance lpQuestInstance = new QuestInstance;
|
|
lpQuestInstance->m_dwQuestID = wQuestID;
|
|
lpQuestInstance->m_lpQuestScript = lpQuest;
|
|
lpQuestInstance->StartPhase(1);
|
|
g_ClientMain.m_csStatus.m_lstQuest.push_front(lpQuestInstance);
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharOperateTrigger(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned short wQuestID;
|
|
unsigned char cPhase, cTrigger, cCount;
|
|
m_dwNetworkError = m_pSocket->HandleCharOperateTrigger(aryBuffer, &dwChrID, &wQuestID, &cPhase, &cTrigger, &cCount);
|
|
|
|
BOOL bSuccessTrigger;
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
bSuccessTrigger = TRUE;
|
|
} else
|
|
{
|
|
bSuccessTrigger = FALSE;
|
|
}
|
|
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
LPQuestInstance lpQuest = g_ClientMain.m_csStatus.GetProcessQuest(wQuestID);
|
|
if(lpQuest)
|
|
{
|
|
if(lpQuest->m_dwPresentPhase == cPhase)
|
|
{
|
|
// 현재 페이즈
|
|
lpQuest->StartTrigger(lpQuest->m_lpPhaseScript->m_lstTrigger[cTrigger], bSuccessTrigger);
|
|
} else
|
|
{
|
|
// 다른 페이즈
|
|
lpQuest->StartPhase(cPhase);
|
|
lpQuest->StartTrigger(lpQuest->m_lpPhaseScript->m_lstTrigger[cTrigger], bSuccessTrigger);
|
|
}
|
|
|
|
if(bSuccessTrigger)
|
|
{
|
|
lpQuest->m_lstTriggerCount[cTrigger] = cCount;
|
|
}
|
|
} else
|
|
{
|
|
// 실행중이지 않은 퀘스트
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharDisappearItme(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
Item::ItemPos pItemIndex;
|
|
unsigned char cNum;
|
|
m_dwNetworkError = m_pSocket->HandleCharDisappearItme(aryBuffer, &dwChrID, &pItemIndex, &cNum);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(g_ClientMain.m_lpPickItem)
|
|
{
|
|
switch(g_ClientMain.m_lpPickItem->GetItemPos())
|
|
{
|
|
case ClientSocket::ItemPos_Inven:
|
|
g_ClientMain.m_csStatus.AddInventoryItem(g_ClientMain.m_lpPickItem);
|
|
break;
|
|
}
|
|
}
|
|
|
|
CItemInstance *lpTemp = g_ClientMain.m_csStatus.GetInventoryItem(pItemIndex);
|
|
if(lpTemp)
|
|
{
|
|
if(cNum == 0)
|
|
{
|
|
g_ClientMain.m_csStatus.DeleteInventoryItem(lpTemp);
|
|
} else
|
|
{
|
|
lpTemp->SetNowDurability(cNum);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharFriendDB(char *aryBuffer)
|
|
{
|
|
char *lpFriendList;
|
|
unsigned long dwSize;
|
|
unsigned char cDataType;
|
|
m_dwNetworkError = m_pSocket->HandleCharFriendDB(aryBuffer, &cDataType, &lpFriendList, &dwSize);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cDataType)
|
|
{
|
|
case PktFriendDB::FRIEND_LIST:
|
|
{
|
|
unsigned long dwNum = dwSize / sizeof(FriendInfo);
|
|
FriendInfo *lpFriendInfo;
|
|
for(unsigned long i = 0; i < dwNum; i++)
|
|
{
|
|
lpFriendInfo = new FriendInfo;
|
|
lpFriendInfo->m_dwCID = ((FriendInfo *)lpFriendList)->m_dwCID;
|
|
lpFriendInfo->m_dwStatusFlag = ((FriendInfo *)lpFriendList)->m_dwStatusFlag;
|
|
strcpy(lpFriendInfo->m_szName, ((FriendInfo *)lpFriendList)->m_szName);
|
|
g_ClientMain.m_csStatus.m_lstFriendList.push_back(lpFriendInfo);
|
|
lpFriendList += sizeof(FriendInfo);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PktFriendDB::BAN_LIST:
|
|
{
|
|
unsigned long dwNum = dwSize / sizeof(BanInfo);
|
|
BanInfo *lpBanInfo;
|
|
for(unsigned long i = 0; i < dwNum; i++)
|
|
{
|
|
lpBanInfo = new BanInfo;
|
|
lpBanInfo->m_dwCID = ((BanInfo *)lpFriendList)->m_dwCID;
|
|
strcpy(lpBanInfo->m_szName, ((BanInfo *)lpFriendList)->m_szName);
|
|
g_ClientMain.m_csStatus.m_lstBanList.push_back(lpBanInfo);
|
|
lpFriendList += sizeof(BanInfo);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharFriendAck(char *aryBuffer)
|
|
{
|
|
unsigned char cCmd;
|
|
unsigned long dwCID;
|
|
char *strName;
|
|
m_dwNetworkError = m_pSocket->HandleCharFriendAck(aryBuffer, &cCmd, &dwCID, &strName);
|
|
|
|
char strMessage[MAX_PATH];
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
switch(cCmd)
|
|
{
|
|
case PktFriendAck::ADD_FRIEND_ACK:
|
|
g_ClientMain.m_csStatus.AddFriend(dwCID, strName);
|
|
sprintf(strMessage, g_StringTable.m_strString[407], strName);
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 128);
|
|
break;
|
|
|
|
case PktFriendAck::MOVE_BAN_TO_FRIEND:
|
|
g_ClientMain.m_csStatus.DeleteBan(dwCID);
|
|
g_ClientMain.m_csStatus.AddFriend(dwCID, strName);
|
|
sprintf(strMessage, g_StringTable.m_strString[407], strName);
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 128);
|
|
break;
|
|
|
|
case PktFriendAck::REMOVE_FRIEND_ACK:
|
|
g_ClientMain.m_csStatus.DeleteFriend(dwCID);
|
|
sprintf(strMessage, g_StringTable.m_strString[408], strName);
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 128);
|
|
break;
|
|
|
|
case PktFriendAck::FRIEND_LOGIN:
|
|
{
|
|
FriendInfo *lpFriend = g_ClientMain.m_csStatus.GetFriend(dwCID);
|
|
if(lpFriend)
|
|
{
|
|
lpFriend->SetLoginStatus(true);
|
|
sprintf(strMessage, g_StringTable.m_strString[409], strName);
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PktFriendAck::FRIEND_LOGOUT:
|
|
{
|
|
FriendInfo *lpFriend = g_ClientMain.m_csStatus.GetFriend(dwCID);
|
|
if(lpFriend)
|
|
{
|
|
lpFriend->SetLoginStatus(false);
|
|
sprintf(strMessage, g_StringTable.m_strString[410], strName);
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 128);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case PktFriendAck::ADD_BAN_ACK:
|
|
g_ClientMain.m_csStatus.AddBan(dwCID, strName);
|
|
sprintf(strMessage, g_StringTable.m_strString[411], strName);
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 128);
|
|
break;
|
|
|
|
case PktFriendAck::MOVE_FRIEND_TO_BAN:
|
|
g_ClientMain.m_csStatus.DeleteFriend(dwCID);
|
|
g_ClientMain.m_csStatus.AddBan(dwCID, strName);
|
|
sprintf(strMessage, g_StringTable.m_strString[411], strName);
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 128);
|
|
break;
|
|
|
|
case PktFriendAck::REMOVE_BAN_ACK:
|
|
g_ClientMain.m_csStatus.DeleteBan(dwCID);
|
|
sprintf(strMessage, g_StringTable.m_strString[412], strName);
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 128);
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharFriendRegistered(char *aryBuffer)
|
|
{
|
|
char strName[16];
|
|
unsigned long dwChrID;
|
|
m_dwNetworkError = m_pSocket->HandleCharFriendRegistered(aryBuffer, &dwChrID, strName);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
char strMessage[MAX_PATH];
|
|
if(g_ClientMain.m_csStatus.GetIsFriend(dwChrID))
|
|
{
|
|
sprintf(strMessage, g_StringTable.m_strString[413], strName, g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strName);
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 128);
|
|
} else
|
|
{
|
|
sprintf(strMessage, g_StringTable.m_strString[414], strName);
|
|
CGUIMessageBox *lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->SetWordBreak(TRUE);
|
|
lpMessageBox->Create(strMessage, MB_YES | MB_NO | MB_EXIT);
|
|
lpMessageBox->SetResult(&g_ClientMain.m_dwFriendResult);
|
|
g_ClientMain.m_dwFriendResult = 0;
|
|
strcpy(g_ClientMain.m_strFriendName, strName);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharQuestInfo(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned short wEQNum, wHQNum;
|
|
PktQuestDB::ExecutingQuest *lpEQ;
|
|
unsigned short *lpHQ;
|
|
m_dwNetworkError = m_pSocket->HandleCharQuestInfo(aryBuffer, &dwChrID, &wEQNum, &lpEQ, &wHQNum, &lpHQ);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
unsigned long i;
|
|
for(i = 0; i < wEQNum; i++)
|
|
{
|
|
LPQuestNode lpQuest = g_NPCList.GetQuest(lpEQ[i].m_wQuestID);
|
|
if(lpQuest)
|
|
{
|
|
LPQuestInstance lpQuestInstance = new QuestInstance;
|
|
lpQuestInstance->m_dwQuestID = lpEQ[i].m_wQuestID;
|
|
lpQuestInstance->m_lpQuestScript = lpQuest;
|
|
lpQuestInstance->m_dwPresentPhase = lpEQ[i].m_cPhase;
|
|
lpQuestInstance->m_lpPhaseScript = lpQuestInstance->m_lpQuestScript->GetPhase(lpQuestInstance->m_dwPresentPhase);
|
|
for(unsigned long j = 0; j < PktQuestDB::MAX_TRIGGER; j++)
|
|
{
|
|
lpQuestInstance->m_lstTriggerCount.push_back((unsigned long)lpEQ[i].m_cTriggerCount[j]);
|
|
}
|
|
|
|
g_ClientMain.m_csStatus.m_lstQuest.push_back(lpQuestInstance);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}/**/
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharEndQuest(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned short wQuestID;
|
|
bool bSave;
|
|
m_dwNetworkError = m_pSocket->HandleCharEndQuest(aryBuffer, &dwChrID, &wQuestID, &bSave);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
LPQuestInstance lpQuest = g_ClientMain.m_csStatus.GetProcessQuest(wQuestID);
|
|
if(lpQuest)
|
|
{
|
|
g_ClientMain.m_csStatus.DeleteQuest(lpQuest);
|
|
} else
|
|
{
|
|
// 실행중이지 않은 퀘스트
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharPeaceMode(char *aryBuffer)
|
|
{
|
|
unsigned long dwChrID;
|
|
unsigned char cHour;
|
|
bool bPeace;
|
|
m_dwNetworkError = m_pSocket->HandleCharPeaceMode(aryBuffer, &dwChrID, &cHour, &bPeace);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(dwChrID == g_ClientMain.m_dwMyChrID)
|
|
{
|
|
if(cHour)
|
|
{
|
|
char strMessage[MAX_PATH];
|
|
if(bPeace)
|
|
{
|
|
sprintf(strMessage, "%d시간 이후에 가입하실 수 있습니다.", cHour);
|
|
} else
|
|
{
|
|
sprintf(strMessage, "%d시간 이후에 탈퇴하실 수 있습니다.", cHour);
|
|
}
|
|
g_TextEdit.AddMessage(strMessage, g_ClientMain.m_dwMyChrID, 129);
|
|
} else
|
|
{
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bPeaceMode = bPeace;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseCharAuthorizePanel(char *aryBuffer)
|
|
{
|
|
unsigned long dwCasterID;
|
|
char strCasterName[16];
|
|
unsigned char cCmd;
|
|
m_dwNetworkError = m_pSocket->HandleCharAuthorizePanel(aryBuffer, &dwCasterID, strCasterName, &cCmd);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
if(!g_ClientMain.m_cAuthorizeCmd)
|
|
{
|
|
char strMessage[MAX_PATH];
|
|
|
|
switch(cCmd)
|
|
{
|
|
case ClientSocket::APCmd_Resurrection:
|
|
sprintf(strMessage, "%s님이 레저렉션을 당신에게 시전하셨습니다. 현재 자리에서 되살아나시겠습니까? HP와 MP는 10씩 남게 됩니다.", strCasterName);
|
|
break;
|
|
|
|
case ClientSocket::APCmd_Recall:
|
|
sprintf(strMessage, "%s님이 리콜을 시전하셨습니다. 해당 위치로 이동하시겠습니까?", strCasterName);
|
|
break;
|
|
}
|
|
CGUIMessageBox *lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->SetWordBreak(TRUE);
|
|
lpMessageBox->Create(strMessage, MB_YES | MB_NO | MB_EXIT);
|
|
lpMessageBox->SetResult(&g_ClientMain.m_dwAuthorizeResult);
|
|
g_ClientMain.m_dwAuthorizeResult = 0;
|
|
g_ClientMain.m_dwAuthorizeCasterID = dwCasterID;
|
|
g_ClientMain.m_cAuthorizeCmd = cCmd;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
/*BOOL CNetwork::ParseLUAck(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleLULUAckPt(aryBuffer, &g_ClientMain.m_dwUserID, g_ClientMain.m_scLoginChar);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseLUCSAck(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleLUCSAckPt(m_aryBuffer, &g_ClientMain.m_dwUserID);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
ConnectToAgentServer();
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseSULiAck(char *aryBuffer)
|
|
{
|
|
POS Pos;
|
|
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleSULiAckPt(m_aryBuffer, &g_ClientMain.m_dwMyChrID, &Pos);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
g_ClientMain.m_vecStartPosition.x = Pos.fPointX * 100.0f;
|
|
g_ClientMain.m_vecStartPosition.y = Pos.fPointY * 100.0f;
|
|
g_ClientMain.m_vecStartPosition.z = Pos.fPointZ * 100.0f;
|
|
|
|
// m_nServerIndexX = g_ClientMain.m_vecStartPosition.x / 800.0f;
|
|
// m_nServerIndexY = g_ClientMain.m_vecStartPosition.z / 800.0f;
|
|
|
|
m_nsNetworkState = NS_RECVCHARINFO;
|
|
m_pSocket->GSSUpdateClientUDP(g_ClientMain.m_dwMyChrID);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseSULiChInfo(char *aryBuffer)
|
|
{
|
|
m_nsNetworkState = NS_NOWAITING;
|
|
|
|
m_dwNetworkError = m_pSocket->HandleSULiChInfoPt(aryBuffer,
|
|
&g_ClientMain.m_csStatus.m_Info, &g_ClientMain.m_csStatus.m_Item, &g_ClientMain.m_csStatus.m_InfoEx,
|
|
&g_ClientMain.m_csStatus.m_Relation, &g_ClientMain.m_csStatus.m_InfoPos, &g_ClientMain.m_dwServerTime);
|
|
|
|
if(0 == m_dwNetworkError)
|
|
{
|
|
g_ClientMain.m_dwStartTime = GetTickCount();
|
|
|
|
// 스킬 창 뻑나는 것을 잡기위한 코드
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/* for(int i = 0; i < MAX_SKILLSLOT; i++)
|
|
{
|
|
if(!GetSkillData(m_Status.m_InfoEx.Skill.SSlot[i].SKILLINFO.wSkill))
|
|
{
|
|
m_Status.m_InfoEx.Skill.SSlot[i].SKILLINFO.wSkill = 0;
|
|
}
|
|
}*/
|
|
/* //////////////////////////////////////////////////////////////////////////////
|
|
g_ClientMain.m_csStatus.StatusUpdate();
|
|
|
|
// 게임 시작
|
|
g_ClientMain.m_lpInterface->InitGame();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseSUUAAck(char *aryBuffer)
|
|
{
|
|
m_dwNetworkError = m_pSocket->HandleSUUAAckPt(aryBuffer);
|
|
|
|
if(!m_pSocket->IsRealIP())
|
|
{
|
|
m_pSocket->UASConnect(g_ClientMain.m_dwMyChrID);
|
|
}
|
|
|
|
if(m_dwNetworkError != 0)
|
|
{
|
|
return FALSE;
|
|
// CUserInterface::AddChatMessage("UDP Connect Failed",m_dwChrID,0);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CNetwork::ParseSUCt(char *aryBuffer)
|
|
{
|
|
unsigned long dwSender, dwCmd;
|
|
char strMessage[MAX_PATH];
|
|
|
|
m_dwNetworkError = m_pSocket->HandleSUCtPt(aryBuffer, &dwSender, strMessage, (int *)&dwCmd);
|
|
|
|
if(m_dwNetworkError == 0)
|
|
{
|
|
switch(dwCmd)
|
|
{
|
|
/* case 3: // NPC 대화
|
|
if(CUserInterface::m_nSelectNPCMethod == 0)
|
|
{
|
|
CUserInterface::AddChatMessage(strMessage, dwSender, dwCmd);
|
|
}
|
|
break;
|
|
|
|
case 4: // 공지
|
|
CUserInterface::AddNoticeMessage(strMessage, dwCmd);
|
|
break;
|
|
*/
|
|
/* default: // 채팅 메시지
|
|
g_TextEdit.AddChatMessage(strMessage, dwSender, dwCmd);
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
} else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}*/
|
|
|
|
void CNetwork::ProcessError(void)
|
|
{
|
|
CGUIMessageBox *lpMessageBox;
|
|
|
|
if(m_dwNetworkError == 1) //1 = 서버 에러
|
|
{
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[296]);
|
|
|
|
return;
|
|
}
|
|
|
|
switch(m_cNetworkPacketCommand)
|
|
{
|
|
case CmdUserLogin:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 데이터 얻기 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[297]);
|
|
break;
|
|
|
|
case 3:
|
|
MessageBox(NULL, g_StringTable.m_strString[298], g_StringTable.m_strString[21], MB_OK);
|
|
SendMessage(g_ClientMain.m_hWnd, WM_DESTROY, 0, 0);
|
|
g_ClientMain.m_dwClientMode = CLIENT_END;
|
|
break;
|
|
|
|
case 4:
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[386]);
|
|
break;
|
|
|
|
case 5:
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[387]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharSelect:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 서버 포화
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[365]);
|
|
break;
|
|
|
|
case 3: //3 = 캐릭터 로드 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[370]);
|
|
break;
|
|
/*
|
|
case 4: //4 = 서버 찾기 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[371]);
|
|
break;*/
|
|
}
|
|
break;
|
|
|
|
case CmdCharMoveZone:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 5: //2 = 세션이 열려 있지 않음
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[388]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdServerZone:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: // 2 = 캐릭터 존이 잘못 되어 있습니다.
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[389]);
|
|
break;
|
|
|
|
case 4: // 4 = 인원이 초과
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[390]);
|
|
break;
|
|
|
|
case 5: // 5 = 세샨이 열려 있지 않음
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[388]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharCreate:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 데이터 얻기 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[299]);
|
|
break;
|
|
|
|
case 3: //3 = 존재하는 캐릭터 이름
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[300]);
|
|
break;
|
|
|
|
case 4: //4 = 비어있지 않은 슬롯
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[301]);
|
|
break;
|
|
|
|
case 5: //5 = 적당하지 않은 이름
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[302]);
|
|
break;
|
|
|
|
case 6: //6 = 잘못된 생성 데이터
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[303]);
|
|
break;
|
|
|
|
case 7: //7 = 금지된 단어 들어간 캐릭터 이름
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[304]);
|
|
break;
|
|
|
|
case 8: //8 = 세션이 열려 있지 않음
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[388]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharDelete:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 데이터 삭제 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[305]);
|
|
break;
|
|
|
|
case 3: //3 = 이미 로그인 삭제
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[306]);
|
|
break;
|
|
|
|
case 4: //4 = 세션이 열려 있지 않음
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[388]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharLogin:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 데이터 얻기 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[307]);
|
|
break;
|
|
|
|
case 4: //4 = 이미 접속중
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[308]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharTakeItem:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 아이템 이동 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[309]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharSwapItem:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 소스 이동 실패
|
|
case 3: //3 = 대상 이동 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[310]);
|
|
break;
|
|
|
|
case 4: //4 = 스왑 불가능
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[311]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharTradeItem:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 아이템 추출 실패(장비/인벤)
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[312]);
|
|
break;
|
|
|
|
case 3: //3 = NPC 찾을 수 없음
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[313]);
|
|
break;
|
|
|
|
case 4: //4 = 아이템 사기 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[314]);
|
|
break;
|
|
|
|
case 5: //5 = 아이템 넣기 실패(장비/인벤)
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[315]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharPickUp:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 셀 얻기 실패
|
|
case 3: //3 = 셀로부터 아이템 얻기 실패
|
|
case 6: //4 = 아이템이 없음
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[316]);
|
|
break;
|
|
|
|
case 5: //5 = 소유권이 없음
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[317], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
|
|
case 4: //4 = 인벤에 넣기 실패
|
|
case 7: //7 = 아이템 생성 실패
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[318], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharPullDown:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 셀 얻기 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[319]);
|
|
break;
|
|
|
|
case 3: //3 = 인벤에서 아이템 얻기 실패
|
|
case 4: //4 = 아이템 떨구기 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[320]);
|
|
break;
|
|
|
|
case 5: //5 = 부적절한 아이템입니다.
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[321]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharPartyCmd:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 이미 파티에 가입되어 있는 경우
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[322]);
|
|
break;
|
|
|
|
case 3: //3 = 가입 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[323]);
|
|
break;
|
|
|
|
case 4: //4 = 퇴장 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[324]);
|
|
break;
|
|
|
|
case 5: //5 = 탈퇴 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[325]);
|
|
break;
|
|
|
|
case 6: //4 = 양도 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[326]);
|
|
break;
|
|
|
|
case 7: //5 = 파티 인원 초과
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[327]);
|
|
break;
|
|
|
|
case 9: // 9 = 파티 거부
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[366], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharUseItem:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 사용 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[328]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharSkillLock:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 해당 인덱스에 스킬 없음
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[329]);
|
|
break;
|
|
|
|
case 3: //3 = 스킬당 락 수 초과
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[330]);
|
|
break;
|
|
|
|
case 4: //4 = 락 할수 없는 스킬 레벨
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[331]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharSkillErase:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 해당 인덱스에 스킬 없음
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[332]);
|
|
break;
|
|
|
|
case 3: //3 = 스킬 지우기 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[333]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharSkillCreate:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 슬롯당 스킬 수 초과
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[334]);
|
|
break;
|
|
|
|
case 3: //3 = 다른 레벨 스킬 익힐수 없음
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[335]);
|
|
break;
|
|
|
|
case 4: //4 = 남는 스킬 슬롯 없음
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[336]);
|
|
|
|
{
|
|
char strText[MAX_PATH], strTemp[MAX_PATH];
|
|
strcpy(strText, "[SkillErr Log] ");
|
|
sprintf(strTemp, "Skill Create Failed = Level : %d, Int : %d, AddInt : %d", g_ClientMain.m_csStatus.m_Info.Level, g_ClientMain.m_csStatus.m_Info.INT, g_ClientMain.m_csStatus.m_lAddINT);
|
|
strcat(strText, strTemp);
|
|
m_pSocket->CharChat(g_ClientMain.m_dwMyChrID, ClientSocket::ChatType_ClientLog, strText, strlen(strText));
|
|
}
|
|
break;
|
|
|
|
case 5: //5 = 해당 클래스 스킬 아님
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[337]);
|
|
break;
|
|
|
|
case 6: //6 = 스킬 제한 스테이터스 초과
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[338]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharUpgradeItem:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 장비 얻기 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[339]);
|
|
break;
|
|
|
|
case 3: //3 = 광물 얻기 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[340]);
|
|
break;
|
|
|
|
case 4: //4 = 장비 아이템 아님
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[341]);
|
|
break;
|
|
|
|
case 5: //5 = 광물 아이템 아님
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[342]);
|
|
break;
|
|
|
|
case 6: //6 = 요구 광물 틀림
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[343]);
|
|
break;
|
|
|
|
case 7: //7 = 요구 광물 수 틀림
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[344]);
|
|
break;
|
|
|
|
case 8: //8 = 장비 제거 실패
|
|
case 9: //9 = 아이템 생성 실패
|
|
case 10: //10 = 광물 제거 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[345]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharInstallSocket:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 장비 얻기 실패
|
|
case 4: //4 = 장비 아이템 아님
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[346]);
|
|
break;
|
|
|
|
case 3: //3 = 젬 얻기 실패
|
|
case 5: //5 = 젬 아이템 아님
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[347]);
|
|
break;
|
|
|
|
case 6: //6 = 젬 제거 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[348]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharIncreasePoint:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 필요 증가 포인트 부족
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[349]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharSplitItem:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: //2 = 아이템 스택 실패
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[350]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharExchangeCmd:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2:
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[352], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
|
|
case 3:
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[355], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
|
|
case 4: // 4 = 교환 거부
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[367], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharDuelCmd:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 3: // 3 = 듀얼 거부
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[368], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharShapeInfo:
|
|
// lpMessageBox = new CGUIMessageBox;
|
|
// lpMessageBox->Create("캐릭터 모양을 받는데 실패했습니다.");
|
|
break;
|
|
|
|
case CmdCharTakeGold:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2:
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[399]);
|
|
break;
|
|
|
|
case 3:
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[400]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdDeposit:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: // 2 = INSUFFICIENT_MONEY
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[401]);
|
|
break;
|
|
|
|
case 3: // 3 = AUTH_FAILED
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[402]);
|
|
break;
|
|
|
|
case 4: // 4 = INVALID_ARGUMENT
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[403]);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharStallEnter:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2: // 2 = 노점상이 꽉 차있다.
|
|
break;
|
|
|
|
case 3: // 3 = 이미 들어가 있다.
|
|
SendStallLeave();
|
|
break;
|
|
|
|
case 4: // 4 = 이미 나가 있다.
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharWhisper:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 3: // 3 = 귀속말 거부
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[358], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
|
|
case 4: // 4 = 다른 종족 귓속말
|
|
g_TextEdit.AddMessage(g_StringTable.m_strString[404], g_ClientMain.m_dwMyChrID, 129);
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case CmdCharPeaceMode:
|
|
switch(m_dwNetworkError)
|
|
{
|
|
case 2:
|
|
g_TextEdit.AddMessage("모드전환에 실패했습니다. 다시 시도해 주세요.", g_ClientMain.m_dwMyChrID, 129);
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bPeaceMode = !g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bPeaceMode;
|
|
break;
|
|
}
|
|
break;
|
|
/* case CmdCharInfo:
|
|
break;
|
|
|
|
case CmdCharUpdateAddress:
|
|
break;
|
|
|
|
case CmdCharMove:
|
|
break;
|
|
|
|
case CmdCharCellLogin:
|
|
break;
|
|
|
|
case CmdCharCellLogout:
|
|
break;
|
|
|
|
case CmdCharAddressInfo:
|
|
break;
|
|
|
|
case CmdCharChat:
|
|
break;
|
|
|
|
case CmdMonMove:
|
|
break;
|
|
|
|
case CmdCharAttack:
|
|
break;
|
|
|
|
case CmdCharRespawn:
|
|
break;
|
|
|
|
case CmdCharAttackInfo:
|
|
break;
|
|
|
|
case CmdCharItemInfo:
|
|
break;
|
|
|
|
case CmdGameCellInfo:
|
|
break;
|
|
|
|
case CmdCharPullDownInfo:
|
|
break;
|
|
|
|
case CmdCharPickUpInfo:
|
|
break;
|
|
|
|
case CmdCharAttacked:
|
|
break;
|
|
|
|
case CmdCharShapeInfo:
|
|
break;
|
|
|
|
case CmdCharPartyInfo:
|
|
break;
|
|
|
|
case CmdCharRepairItem:
|
|
break;
|
|
|
|
case CmdCharAward:
|
|
break;
|
|
|
|
case CmdCharLevelUp:
|
|
break;
|
|
|
|
case CmdCharLevelUpInfo:
|
|
break;
|
|
|
|
case CmdCharHPRegen:
|
|
break;
|
|
*/
|
|
default:
|
|
{
|
|
/* CGUIMessageBox *lpMessageBox;
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create("Unknown Packet*/
|
|
/* char strError[MAX_PATH], strPacket[MAX_PATH];
|
|
sprintf(strPacket, "0x%04x", ((LPPktBase)m_aryBuffer)->GetCmd());
|
|
sprintf(strError, "0x%04x", m_dwNetworkError);
|
|
MessageBox(NULL, strError, strPacket, MB_OK);//"Risk Your Life 패킷 에러", MB_OK);*/
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*BOOL CNetwork::LoginLoginServer(unsigned long dwUserID, unsigned long dwServerID, unsigned long dwLoginChrPointer)
|
|
{
|
|
m_nsNetworkState = NS_IDPASSLOGINSERVER;
|
|
|
|
if(m_pSocket->LoginUser(dwUserID, dwServerID, (void*)dwLoginChrPointer))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
void CNetwork::LoginCharSelect(unsigned long dwChrSelect)
|
|
{
|
|
// m_nsNetworkState = NS_CREATECHRSELECT;
|
|
// m_pSocket->GLSSelectCharacter(g_ClientMain.m_dwUserID, g_ClientMain.m_scLoginChar[dwChrSelect].UID);
|
|
}
|
|
|
|
void CNetwork::ConnectToAgentServer()
|
|
{
|
|
// m_nsNetworkState = NS_CONNECTAGENTSERVER;
|
|
// m_pSocket->ConnectToGSS();
|
|
}
|
|
|
|
void CNetwork::LoginAgentServer()
|
|
{
|
|
// m_nsNetworkState = NS_LOGINAGENTSERVER;
|
|
// m_pSocket->GSSLoginChar(g_ClientMain.m_dwUserID, g_ClientMain.m_scLoginChar[0].UID);
|
|
}*/
|
|
|
|
bool CNetwork::IsExistToList(unsigned short List_In, unsigned long CharID_In)
|
|
{
|
|
return m_pSocket->IsExistToList(List_In, CharID_In);
|
|
}
|
|
|
|
bool CNetwork::CharAddressRequireInfo(unsigned long SenderID_In, unsigned long CharID_In)
|
|
{
|
|
#ifdef _DEBUG
|
|
g_ClientMain.m_lpInterface->m_dwSpendTime[0] = GetTickCount();
|
|
#endif
|
|
|
|
return m_pSocket->CharRequireInfo(SenderID_In, CharID_In, ClientSocket::Require_UDPInfo);
|
|
}
|
|
|
|
BOOL CNetwork::SendChatMessage(const char *strName, const char *strMessage, unsigned long dwCommand)
|
|
{
|
|
char strNameMsg[MAX_PATH];
|
|
|
|
/* switch(dwCommand)
|
|
{
|
|
case 1: // 귓속말
|
|
memset(strNameMsg, 0, MAX_PATH);
|
|
strcpy(strNameMsg, strName);
|
|
strcat(&strNameMsg[0x10], g_ClientMain.m_csStatus.m_Info.Name);
|
|
strcat(&strNameMsg[0x20], strMessage);
|
|
// if(!m_pSocket->GSSChat(g_ClientMain.m_dwMyChrID, strNameMsg, 0x20 + strlen(strMessage), dwCommand)) return FALSE;
|
|
break;
|
|
|
|
/* case 6: // 무시
|
|
memset(strNameMsg, 0, 0x10);
|
|
strcpy(strNameMsg, name);
|
|
m_pSocket->GSSChat(m_dwChrID, strNameMsg, 0x10, dwCommand);
|
|
break;*/
|
|
/*
|
|
case 10:
|
|
m_pSocket->GSSChat(m_dwChrID, NULL, 0, dwCommand);
|
|
break;
|
|
|
|
default:
|
|
sprintf(strNameMsg, "%s : %s", g_ClientMain.m_csStatus.m_Info.Name, strMessage);
|
|
if(!m_pSocket->CharChat(g_ClientMain.m_dwMyChrID, dwCommand, strNameMsg, strlen(strNameMsg))) return FALSE;
|
|
break;
|
|
}*/
|
|
|
|
if(dwCommand == ClientSocket::ChatType_Shout && CNetwork::m_lShoutCounter > 0) return FALSE;
|
|
|
|
switch(dwCommand)
|
|
{
|
|
case 10:
|
|
sprintf(strNameMsg, "(to. %s) %s", strName, strMessage);
|
|
break;
|
|
|
|
case ClientSocket::ChatType_Stall:
|
|
{
|
|
char strName[16];
|
|
memcpy(strName, g_ClientMain.m_csStatus.m_Info.Name, 15);
|
|
strName[15] = 0;
|
|
sprintf(strNameMsg, "%s : %s", strName, strMessage);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
{
|
|
char strName[16];
|
|
memcpy(strName, g_ClientMain.m_csStatus.m_Info.Name, 15);
|
|
strName[15] = 0;
|
|
sprintf(strNameMsg, "%s : %s", strName, strMessage);
|
|
strcpy(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strChatMessage, strNameMsg);
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fChatTimer = 2000.0f;
|
|
}
|
|
break;
|
|
}
|
|
|
|
List<DWORD> SendCharacterList;
|
|
if(g_ClientMain.m_bAdminMode)
|
|
{
|
|
g_CharacterData.GetSendCharacterAroundList(SendCharacterList);
|
|
} else
|
|
{
|
|
if(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bPeaceMode)
|
|
g_CharacterData.GetSendCharacterAroundList(SendCharacterList);
|
|
else
|
|
g_CharacterData.GetSendCharacterChatList(SendCharacterList);
|
|
}
|
|
for(int i=0;i<SendCharacterList.num;i++)
|
|
{
|
|
m_pSocket->RegistInstanceUDPList(SendCharacterList[i]);
|
|
}
|
|
/**/
|
|
|
|
|
|
switch(dwCommand)
|
|
{
|
|
case CHATMODE_CHAT:
|
|
g_TextEdit.AddNormalChatMessage(strNameMsg, g_ClientMain.m_dwMyChrID, dwCommand);
|
|
if(!m_pSocket->CharChat(g_ClientMain.m_dwMyChrID, ClientSocket::ChatType_Normal, strNameMsg, strlen(strNameMsg))) return FALSE;
|
|
break;
|
|
|
|
case CHATMODE_PARTY:
|
|
g_TextEdit.AddPartyChatMessage(strNameMsg, g_ClientMain.m_dwMyChrID, dwCommand);
|
|
g_TextEdit.AddNormalChatMessage(strNameMsg, g_ClientMain.m_dwMyChrID, dwCommand);
|
|
if(!m_pSocket->CharChat(g_ClientMain.m_dwMyChrID, ClientSocket::ChatType_Party, strNameMsg, strlen(strNameMsg))) return FALSE;
|
|
break;
|
|
|
|
case CHATMODE_GUILD:
|
|
g_TextEdit.AddGuildChatMessage(strNameMsg, g_ClientMain.m_dwMyChrID, dwCommand);
|
|
g_TextEdit.AddNormalChatMessage(strNameMsg, g_ClientMain.m_dwMyChrID, dwCommand);
|
|
if(!m_pSocket->CharChat(g_ClientMain.m_dwMyChrID, ClientSocket::ChatType_Guild, strNameMsg, strlen(strNameMsg))) return FALSE;
|
|
break;
|
|
|
|
case ClientSocket::ChatType_Shout:
|
|
m_pSocket->CharChat(g_ClientMain.m_dwMyChrID, ClientSocket::ChatType_Shout, strNameMsg, strlen(strNameMsg));
|
|
m_lShoutCounter = 30000;
|
|
break;
|
|
|
|
case ClientSocket::ChatType_Stall:
|
|
if(!m_pSocket->CharChat(g_ClientMain.m_dwMyChrID, ClientSocket::ChatType_Stall, strNameMsg, strlen(strNameMsg))) return FALSE;
|
|
break;
|
|
|
|
case 10: // 귓속말
|
|
{
|
|
char strMyName[16];
|
|
memcpy(strMyName, g_ClientMain.m_csStatus.m_Info.Name, 15);
|
|
strMyName[15] = 0;
|
|
g_TextEdit.AddMessage(strNameMsg, g_ClientMain.m_dwMyChrID, dwCommand);
|
|
if(!m_pSocket->CharWhisper((char *)strMyName, (char *)strName, (char *)strMessage, strlen(strMessage))) return FALSE;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CNetwork::SendMovingPacket(unsigned long dwUpperAni, unsigned long dwLowerAni, float fDir, vector3 &vecMove)
|
|
{
|
|
List<DWORD> SendCharacterList;
|
|
g_CharacterData.GetSendCharacterList(SendCharacterList);
|
|
for(int i=0;i<SendCharacterList.num;i++)
|
|
{
|
|
if(!m_pSocket->RegistInstanceUDPList(SendCharacterList[i]))
|
|
{
|
|
if(!g_ClientMain.m_csStatus.CheckPartyMember(SendCharacterList[i]))
|
|
g_CharacterData.UnLoadChr(SendCharacterList[i]);
|
|
}
|
|
}
|
|
|
|
/* char a[200];
|
|
sprintf(a, "%d, %d, %d", m_pSocket->m_ClientList->GetListCount(), SendCharacterList.num, m_pSocket->m_InstanceClientList->GetListCount());
|
|
g_TextEdit.AddMessage(a, g_ClientMain.m_dwMyChrID, 128);
|
|
|
|
/**/
|
|
if(m_pSocket->CharMove(g_ClientMain.m_dwMyChrID, (LPPOS)&vecMove, fDir, dwUpperAni, dwLowerAni, g_ClientMain.m_csStatus.m_Info.Level, 0, 0))
|
|
{
|
|
int b=0;
|
|
}
|
|
else
|
|
{
|
|
int a=0;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CNetwork::SendMoveUpdatePacket(float fDir, vector3 &vecPosition)
|
|
{
|
|
if(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bSitMode)
|
|
m_pSocket->CharMoveUpdate(g_ClientMain.m_dwMyChrID, true, (LPPOS)&vecPosition, fDir);
|
|
else
|
|
m_pSocket->CharMoveUpdate(g_ClientMain.m_dwMyChrID, false, (LPPOS)&vecPosition, fDir);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CNetwork::SendCreateChar(unsigned long dwSlot, CHAR_CREATE &pCreateChar)
|
|
{
|
|
m_nsNetworkState = NS_CREATECHAR;
|
|
|
|
if(m_pSocket->CharCreate(g_ClientMain.m_dwUserID, dwSlot, pCreateChar))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendDeleteChar(unsigned long dwSlot, unsigned long dwUID)
|
|
{
|
|
m_nsNetworkState = NS_DELETECHAR;
|
|
|
|
if(m_pSocket->CharDelete(g_ClientMain.m_dwUserID, dwUID, dwSlot))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendCharAttack(vector3 &vecPos, float fDir, unsigned short wType, unsigned char cSkillLock, unsigned char cSkillLevel, unsigned char cAtCount, unsigned short wDefenserNum, unsigned long dwDefenser[10])
|
|
{
|
|
AtNode AtList;
|
|
AtList.m_wDefenserNum = wDefenserNum;
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
AtList.m_dwDefenser[i] = dwDefenser[i];
|
|
}
|
|
|
|
AtType pAtType;
|
|
pAtType.m_cAtCount = cAtCount;
|
|
pAtType.m_cSkillLevel = cSkillLevel;
|
|
pAtType.m_cSkillLockCount = cSkillLock;
|
|
pAtType.m_wType = wType;
|
|
|
|
POS psPos;
|
|
psPos.fPointX = vecPos.x / 100.0f;
|
|
psPos.fPointY = vecPos.y / 100.0f;
|
|
psPos.fPointZ = vecPos.z / 100.0f;
|
|
|
|
if(m_pSocket->CharAttack(g_ClientMain.m_dwUserID, &psPos, fDir, pAtType, AtList))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendCharRespawn(unsigned long dwChrID)
|
|
{
|
|
if(g_ClientMain.m_dwPresentZone == 3 || g_ClientMain.m_dwPresentZone == 6)
|
|
{
|
|
if(g_ClientMain.m_lpInterface && !g_ClientMain.m_lpInterface->GetIsRespawn())
|
|
{
|
|
g_ClientMain.m_lpInterface->InitRespawn((unsigned char)g_ClientMain.m_dwPresentZone);
|
|
}
|
|
|
|
return FALSE;
|
|
} else if(g_ClientMain.m_dwPresentZone == 4 || g_ClientMain.m_dwPresentZone == 5)
|
|
{
|
|
if(!g_ClientMain.m_lpInterface->GetIsRespawn())
|
|
{
|
|
CGUIMessageBox *lpMessageBox;
|
|
lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->SetWordBreak(TRUE);
|
|
lpMessageBox->Create(g_StringTable.m_strString[405], MB_YES | MB_NO | MB_EXIT);
|
|
lpMessageBox->SetResult(&g_ClientMain.m_dwRespawnResult);
|
|
g_ClientMain.m_dwRespawnResult = 0;
|
|
}
|
|
|
|
return FALSE;
|
|
} else
|
|
{
|
|
m_nsNetworkState = NS_RESPAWN;
|
|
POS psPos = { 0.0f, 0.0f, 0.0f };
|
|
|
|
if(m_pSocket->CharRespawn(dwChrID, 0, psPos))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL CNetwork::SendFieldObjectPickUp(unsigned long dwFieldID, Item::ItemPos &pItemIndex)
|
|
{
|
|
m_nsNetworkState = NS_TAKEITEM;
|
|
|
|
if(m_pSocket->CharPickUp(g_ClientMain.m_dwMyChrID, dwFieldID, pItemIndex))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendTakeItem(CItemInstance *lpTakeItem, Item::ItemPos *lpTakeIndex, unsigned char cNum)
|
|
{
|
|
if(lpTakeItem->m_lpItemBase->GetPos().m_cPos != ClientSocket::ItemPos_Deposit && lpTakeIndex->m_cPos == ClientSocket::ItemPos_Deposit)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_Info.Gold < g_ClientMain.m_csStatus.m_Info.Level * 20)
|
|
{
|
|
CGUIMessageBox *lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[401]);
|
|
lpMessageBox->SetTimer(1000);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
m_nsNetworkState = NS_TAKEITEM;
|
|
|
|
TakeType pTakeType;
|
|
pTakeType.m_srcPos = lpTakeItem->m_lpItemBase->GetPos();
|
|
pTakeType.m_dstPos = *lpTakeIndex;
|
|
pTakeType.m_cNum = cNum;
|
|
|
|
if(m_pSocket->CharTakeItem(g_ClientMain.m_dwMyChrID, pTakeType))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendSplitItem(CItemInstance *lpTakeItem, Item::ItemPos *lpTakeIndex, unsigned char cNum)
|
|
{
|
|
if(lpTakeItem->m_lpItemBase->GetPos().m_cPos != ClientSocket::ItemPos_Deposit && lpTakeIndex->m_cPos == ClientSocket::ItemPos_Deposit)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_Info.Gold < g_ClientMain.m_csStatus.m_Info.Level * 20)
|
|
{
|
|
CGUIMessageBox *lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[401]);
|
|
lpMessageBox->SetTimer(1000);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
m_nsNetworkState = NS_TAKEITEM;
|
|
|
|
TakeType pTakeType;
|
|
pTakeType.m_srcPos = lpTakeItem->m_lpItemBase->GetPos();
|
|
pTakeType.m_dstPos = *lpTakeIndex;
|
|
pTakeType.m_cNum = cNum;
|
|
|
|
if(m_pSocket->CharSplitItem(g_ClientMain.m_dwMyChrID, pTakeType))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendQuickSlotMove(CItemInstance *lpTakeItem, unsigned char cPos, unsigned char cIndex, unsigned char cNum)
|
|
{
|
|
m_nsNetworkState = NS_TAKEITEM;
|
|
|
|
TakeType pTakeType;
|
|
pTakeType.m_srcPos = lpTakeItem->m_lpItemBase->GetPos();
|
|
pTakeType.m_dstPos.m_cPos = cPos;
|
|
pTakeType.m_dstPos.m_cIndex = cIndex;
|
|
pTakeType.m_cNum = cNum;
|
|
|
|
unsigned short wSkill = 0;
|
|
if(lpTakeItem->m_bClassSkill)
|
|
{
|
|
wSkill = lpTakeItem->GetProtoTypeID();
|
|
}
|
|
|
|
if(m_pSocket->CharQuickSlotMove(pTakeType, wSkill))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendFieldObjectPullDown(unsigned long dwNum, Item::ItemPos &pItemIndex)
|
|
{
|
|
m_nsNetworkState = NS_TAKEITEM;
|
|
|
|
if(m_pSocket->CharPullDown(g_ClientMain.m_dwMyChrID, pItemIndex, dwNum))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendSwapItem(CItemInstance *lpSrcItem, Item::ItemPos *lpSrcIndex, CItemInstance *lpDstItem)
|
|
{
|
|
if(lpSrcItem->m_lpItemBase->GetPos().m_cPos != ClientSocket::ItemPos_Deposit && lpSrcIndex->m_cPos == ClientSocket::ItemPos_Deposit)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_Info.Gold < g_ClientMain.m_csStatus.m_Info.Level * 20)
|
|
{
|
|
CGUIMessageBox *lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[401]);
|
|
lpMessageBox->SetTimer(1000);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
m_nsNetworkState = NS_TAKEITEM;
|
|
|
|
TakeType SrcTakeType, DstTakeType;
|
|
|
|
SrcTakeType.m_srcPos = lpSrcItem->m_lpItemBase->GetPos();
|
|
|
|
// SrcTakeType.m_dstPos.m_cPos = lpDstItem->m_dwItemPos;
|
|
SrcTakeType.m_dstPos = *lpSrcIndex;
|
|
|
|
if(lpSrcItem->GetIsEnableStack())
|
|
SrcTakeType.m_cNum = lpSrcItem->GetNowDurability();
|
|
else
|
|
SrcTakeType.m_cNum = 1;
|
|
|
|
DstTakeType.m_srcPos = lpDstItem->m_lpItemBase->GetPos();
|
|
|
|
DstTakeType.m_dstPos.m_cPos = ClientSocket::ItemPos_Temp;
|
|
DstTakeType.m_dstPos.m_cIndex = 0;
|
|
|
|
if(lpDstItem->GetIsEnableStack())
|
|
DstTakeType.m_cNum = lpDstItem->GetNowDurability();
|
|
else
|
|
DstTakeType.m_cNum = 1;
|
|
|
|
if(m_pSocket->CharSwapItem(g_ClientMain.m_dwMyChrID, SrcTakeType, DstTakeType))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendTradeItem(unsigned long dwNPCID, unsigned short wTypeID, unsigned long dwNum, Item::ItemPos &pSrcPos, Item::ItemPos &pDstPos)
|
|
{
|
|
m_nsNetworkState = NS_TRADEITEM;
|
|
|
|
TakeType pTakeType;
|
|
pTakeType.m_srcPos = pSrcPos;
|
|
pTakeType.m_dstPos = pDstPos;
|
|
pTakeType.m_cNum = dwNum;
|
|
|
|
if(m_pSocket->CharTradeItem(g_ClientMain.m_dwMyChrID, dwNPCID, wTypeID, pTakeType))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendCharShape(unsigned long dwChrID)
|
|
{
|
|
CHAR_VIEW pCharView;
|
|
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwWeaponPos = g_ClientMain.m_csStatus.m_cWeaponPos;
|
|
|
|
pCharView.UID = g_ClientMain.m_dwMyChrID;
|
|
|
|
char strName[16];
|
|
memcpy(strName, g_ClientMain.m_csStatus.m_Info.Name, 15);
|
|
strName[15] = 0;
|
|
strcpy(pCharView.Name, strName); // 캐릭터 이름
|
|
pCharView.Sex = g_ClientMain.m_csStatus.m_Info.Sex; // 캐릭터 성
|
|
pCharView.Hair = g_ClientMain.m_csStatus.m_Info.Hair; // 캐릭터 머리 모양
|
|
pCharView.Face = g_ClientMain.m_csStatus.m_Info.Face; // 캐릭터 얼굴 모양
|
|
pCharView.Nationality = g_ClientMain.m_csStatus.m_Info.Nationality; // 캐릭터 국가
|
|
pCharView.Class = g_ClientMain.m_csStatus.m_Info.Class; // 캐릭터 클래스
|
|
|
|
pCharView.Merits = g_ClientMain.m_csStatus.m_Info.Merits; // 공헌도
|
|
pCharView.Fame = g_ClientMain.m_csStatus.m_Info.Fame; // 명성
|
|
pCharView.Guild = g_ClientMain.m_csStatus.m_Info.Guild; // 캐릭터 길드
|
|
pCharView.Party = g_ClientMain.m_csStatus.m_PartyInfo.m_dwPartyID; // 캐릭터 파티
|
|
pCharView.Level = g_ClientMain.m_csStatus.m_Info.Level; // 캐릭터 레벨
|
|
|
|
for(int i = 0; i < 15; i++) // 장비(겉보기)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lstEquipment[i])
|
|
pCharView.Equip[i] = g_ClientMain.m_csStatus.m_lstEquipment[i]->GetProtoTypeID();
|
|
else
|
|
pCharView.Equip[i] = 0;
|
|
}
|
|
|
|
char strShape[15][256], *strTemp;
|
|
for(i = 0; i < 15; i++) // 장비(겉보기)
|
|
{
|
|
strTemp = (char *)g_ItemMgr.GetEquipName(pCharView.Equip[i]);
|
|
|
|
if(strTemp)
|
|
{
|
|
strcpy(strShape[i], strTemp);
|
|
}
|
|
else
|
|
{
|
|
strcpy(strShape[i], "");
|
|
}
|
|
}
|
|
/**/
|
|
|
|
bool bResult = false;
|
|
if(dwChrID != 0xFFFFFFFF)
|
|
{
|
|
bResult = m_pSocket->CharShapeInfo(dwChrID, &pCharView,
|
|
(unsigned char)g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwWeaponPos,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwChant,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bPeaceMode,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strStreetStallName);
|
|
} else
|
|
{
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->SetShape(strShape);
|
|
|
|
List<DWORD> SendCharacterList;
|
|
g_CharacterData.GetSendCharacterAroundList(SendCharacterList);
|
|
for(i=0;i<SendCharacterList.num;i++)
|
|
{
|
|
m_pSocket->RegistInstanceUDPList(SendCharacterList[i]);
|
|
}
|
|
|
|
bResult = m_pSocket->CharShapeInfo(&pCharView,
|
|
(unsigned char)g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwWeaponPos,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwChant,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bPeaceMode,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_strStreetStallName);
|
|
}
|
|
|
|
if(bResult)
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendCharSwitchHand(void)
|
|
{
|
|
if(m_pSocket->CharSwitchHand(g_ClientMain.m_csStatus.m_cWeaponPos + 1))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendMyInfoforParty(void)
|
|
{
|
|
if(m_pSocket->CharPartyMemInfo(g_ClientMain.m_dwMyChrID, g_ClientMain.m_csStatus.m_PartyInfo.m_dwPartyID,
|
|
g_ClientMain.m_csStatus.m_Info.Class, g_ClientMain.m_csStatus.m_Info.Level,
|
|
g_ClientMain.m_csStatus.m_MaxHP + g_ClientMain.m_csStatus.m_lAddMaxHP, g_ClientMain.m_csStatus.m_Info.HP,
|
|
g_ClientMain.m_csStatus.m_MaxMP + g_ClientMain.m_csStatus.m_lAddMaxMP, g_ClientMain.m_csStatus.m_Info.MP,
|
|
0, 0))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendFameInfo(unsigned short wCmd)
|
|
{
|
|
if(CNetwork::m_lFameInfoCounter <= 0)
|
|
{
|
|
m_pSocket->CharFameInfo(g_ClientMain.m_dwMyChrID, wCmd);
|
|
m_lFameInfoCounter = 3000;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
long CNetwork::SendPartyFind(void)
|
|
{
|
|
long lCounter = m_lPartyFindCounter;
|
|
|
|
if(CNetwork::m_lPartyFindCounter <= 0)
|
|
{
|
|
m_pSocket->CharPartyFind(g_ClientMain.m_dwMyChrID);
|
|
m_lPartyFindCounter = 10000;
|
|
}
|
|
|
|
return lCounter;
|
|
}
|
|
|
|
long CNetwork::SendPartyCmd(unsigned long dwReferenceID, unsigned short wCmd)
|
|
{
|
|
long lCounter = m_lPartyCmdCounter;
|
|
|
|
if(wCmd == ClientSocket::PartyCmd_FindParty || wCmd == ClientSocket::PartyCmd_FindMember)
|
|
{
|
|
if(CNetwork::m_lPartyCmdCounter <= 0)
|
|
{
|
|
m_pSocket->CharPartyCmd(g_ClientMain.m_dwMyChrID, dwReferenceID, g_ClientMain.m_csStatus.m_PartyInfo.m_dwPartyID, wCmd);
|
|
m_lPartyCmdCounter = 3000;
|
|
}
|
|
} else
|
|
{
|
|
m_pSocket->CharPartyCmd(g_ClientMain.m_dwMyChrID, dwReferenceID, g_ClientMain.m_csStatus.m_PartyInfo.m_dwPartyID, wCmd);
|
|
lCounter = m_lPartyFindCounter = 0;
|
|
}
|
|
|
|
return lCounter;
|
|
}
|
|
|
|
void CNetwork::SendChant(CItemInstance *lpChantSkill)
|
|
{
|
|
/* if(g_ClientMain.m_csStatus.m_lpQuickSelected)
|
|
{
|
|
Skill::LPProtoType lpSkillType = g_SkillMgr.GetSkillProtoType(g_ClientMain.m_csStatus.m_lpQuickSelected->GetProtoTypeID());
|
|
|
|
if(lpSkillType && Skill::Type::CHANT == lpSkillType->m_cSkillType)
|
|
{
|
|
unsigned long dwDefenser[10];
|
|
ZeroMemory(&dwDefenser, sizeof(unsigned long) * 10);
|
|
dwDefenser[0] = g_ClientMain.m_dwMyChrID;
|
|
g_ClientMain.m_Network.SendCharAttack(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection - FLOAT_PHI / 2.0f,
|
|
g_ClientMain.m_csStatus.m_lpQuickSelected->GetProtoTypeID(),
|
|
0, 0, 1, 1, dwDefenser);
|
|
}
|
|
}*/
|
|
|
|
if(lpChantSkill)
|
|
{
|
|
if(Skill::Type::CHANT == lpChantSkill->GetSkillType())
|
|
{
|
|
unsigned long dwDefenser[10];
|
|
ZeroMemory(&dwDefenser, sizeof(unsigned long) * 10);
|
|
dwDefenser[0] = g_ClientMain.m_dwMyChrID;
|
|
g_ClientMain.m_Network.SendCharAttack(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection - FLOAT_PHI / 2.0f,
|
|
lpChantSkill->GetProtoTypeID(), lpChantSkill->GetMaxDurability(),
|
|
lpChantSkill->GetNowDurability(), 1, 1, dwDefenser);
|
|
g_ClientMain.m_csStatus.m_bUseChant = TRUE;
|
|
}
|
|
} else
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_lpQuickSelected)
|
|
{
|
|
if(Skill::Type::CHANT == g_ClientMain.m_csStatus.m_lpQuickSelected->GetSkillType())
|
|
{
|
|
unsigned long dwDefenser[10];
|
|
ZeroMemory(&dwDefenser, sizeof(unsigned long) * 10);
|
|
dwDefenser[0] = g_ClientMain.m_dwMyChrID;
|
|
g_ClientMain.m_Network.SendCharAttack(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_vecPos,
|
|
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_fDirection - FLOAT_PHI / 2.0f,
|
|
g_ClientMain.m_csStatus.m_lpQuickSelected->GetProtoTypeID(),
|
|
0, 0, 1, 1, dwDefenser);
|
|
g_ClientMain.m_csStatus.m_bUseChant = FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL CNetwork::SendExchangeCmd(unsigned long dwSendID, unsigned short wCmd)
|
|
{
|
|
if(m_pSocket->CharExchangeCmd(g_ClientMain.m_dwMyChrID, dwSendID, wCmd))
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void CNetwork::SetChant(CItemInstance *lpChantSkill)
|
|
{
|
|
if(lpChantSkill)
|
|
{
|
|
if(lpChantSkill->GetSkillType() == Skill::Type::CHANT)
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_bUseChant)
|
|
{
|
|
SendChant(NULL);
|
|
}
|
|
|
|
m_lSetSkillCounter = 1000;
|
|
}
|
|
} else
|
|
{
|
|
if(g_ClientMain.m_csStatus.m_bUseChant)
|
|
{
|
|
SendChant(NULL);
|
|
}
|
|
|
|
m_lSetSkillCounter = 0;
|
|
}
|
|
}
|
|
|
|
void CNetwork::SendClientLog(unsigned short wCmd, char *strString, char *strString2)
|
|
{
|
|
char strText[MAX_PATH];
|
|
|
|
static BOOL bBadStatus = TRUE;
|
|
|
|
switch(wCmd)
|
|
{
|
|
case 0: // 스테이터스 이상
|
|
if(bBadStatus)
|
|
{
|
|
strcpy(strText, "[Hack Log] ");
|
|
strcat(strText, g_StringTable.m_strString[391]);
|
|
g_ClientMain.m_Network.m_pSocket->CharChat(g_ClientMain.m_dwMyChrID, ClientSocket::ChatType_ClientLog, strText, strlen(strText));
|
|
bBadStatus = FALSE;
|
|
}
|
|
break;
|
|
|
|
case 1: // 욕설
|
|
char Temp[MAX_PATH];
|
|
strcpy(Temp, "None");
|
|
if(!strString)
|
|
{
|
|
strString2 = Temp;
|
|
}
|
|
sprintf(strText, "[Abuse Log] ''%s'', ''%s''", strString, strString2);
|
|
g_ClientMain.m_Network.m_pSocket->CharChat(g_ClientMain.m_dwMyChrID, ClientSocket::ChatType_ClientLog, strText, strlen(strText));
|
|
break;
|
|
}
|
|
}
|
|
|
|
BOOL CNetwork::SendStallEnter(unsigned long dwStallChrID)
|
|
{
|
|
if(!g_ClientMain.m_bStreetStallEnter)
|
|
{
|
|
g_ClientMain.m_Network.m_pSocket->CharStallEnter(g_ClientMain.m_dwMyChrID, dwStallChrID);
|
|
|
|
return TRUE;
|
|
} else
|
|
{
|
|
if(g_ClientMain.m_lpInterface && g_ClientMain.m_lpInterface->GetIsTrade())
|
|
{
|
|
CGUIMessageBox *lpMessageBox = new CGUIMessageBox;
|
|
lpMessageBox->Create(g_StringTable.m_strString[406]);
|
|
} else
|
|
{
|
|
g_ClientMain.m_bStreetStallEnter = FALSE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CNetwork::SendStallLeave(void)
|
|
{
|
|
if(g_ClientMain.m_bStreetStallEnter)
|
|
{
|
|
g_ClientMain.m_Network.m_pSocket->CharStallEnter(g_ClientMain.m_dwMyChrID, 0);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|