Files
Client/GameTools/NeoRylClient/Network.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
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>
2025-11-29 20:17:20 +09:00

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