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>
This commit is contained in:
@@ -0,0 +1,715 @@
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
#include "ParseCharUpgradeItem.h"
|
||||
#include "SendCharUpgradeItem.h"
|
||||
#include "GameClientDispatch.h"
|
||||
|
||||
#include <Network/Dispatch/ParseUtils.h>
|
||||
#include <Network/Packet/PacketStruct/CharItemPacket.h>
|
||||
|
||||
#include <Log/ItemLog.h>
|
||||
#include <Log/LogStruct.h>
|
||||
|
||||
#include <Item/Item.h>
|
||||
#include <Item/ItemStructure.h>
|
||||
#include <Item/ItemFactory.h>
|
||||
#include <Item/ItemMgr.h>
|
||||
|
||||
#include <Creature/Character/Character.h>
|
||||
#include <Creature/Npc/NPC.h>
|
||||
|
||||
#include <Castle/Castle.h>
|
||||
#include <Castle/CastleConstants.h>
|
||||
#include <Castle/CastleMgr.h>
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ν<EFBFBD><CEBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool GameClientParsePacket::ParseCharInstallSocket(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase)
|
||||
{
|
||||
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktIS), GameClientDispatch);
|
||||
|
||||
PktIS* lpPktIS = static_cast<PktIS *>(lpPktBase);
|
||||
CCharacter* lpCharacter = GameClientDispatch.GetCharacter();
|
||||
|
||||
CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd());
|
||||
|
||||
unsigned long dwCharID = lpPktIS->m_dwCharID;
|
||||
Item::ItemPos EquipPos = lpPktIS->m_equipPos;
|
||||
Item::ItemPos GemPos = lpPktIS->m_gemPos;
|
||||
|
||||
Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(lpCharacter->GetItem(EquipPos));
|
||||
Item::CItem* lpGem = lpCharacter->GetItem(GemPos);
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
if (NULL != lpEquipment)
|
||||
{
|
||||
if (NULL != lpGem)
|
||||
{
|
||||
wError = lpEquipment->InstallSocket(*lpGem);
|
||||
}
|
||||
else
|
||||
{
|
||||
wError = Item::CEquipment::E_GET_GEM_FAILED;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
wError = Item::CEquipment::E_GET_EQUIP_FAILED;
|
||||
}
|
||||
|
||||
GAMELOG::LogInstallSocket(*lpCharacter, TakeType(GemPos, EquipPos, 1),
|
||||
lpGem, lpEquipment, static_cast<GAMELOG::ERRType>(wError));
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
|
||||
if (NULL != lpGem)
|
||||
{
|
||||
if (0 == lpGem->GetNumOrDurability())
|
||||
{
|
||||
if (lpCharacter->RemoveItem(GemPos))
|
||||
{
|
||||
DELETE_ITEM(lpGem);
|
||||
}
|
||||
else
|
||||
{
|
||||
wError = Item::CEquipment::E_REMOVE_GEM_FAILED;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", lpCharacter->GetCID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (PktBase::NO_SERVER_ERR == wError && TakeType::TS_EQUIP == EquipPos.m_cPos)
|
||||
{
|
||||
lpCharacter->CalculateStatusData(false);
|
||||
}
|
||||
|
||||
if (PktBase::NO_SERVER_ERR != wError)
|
||||
{
|
||||
lpEquipment = NULL;
|
||||
}
|
||||
|
||||
return GameClientSendPacket::SendCharInstallSocket(GameClientDispatch.GetSendStream(), dwCharID,
|
||||
EquipPos, GemPos, lpEquipment, wError);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD>
|
||||
bool GameClientParsePacket::ParseCharItemChemical(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase)
|
||||
{
|
||||
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktItemChemical), GameClientDispatch);
|
||||
|
||||
PktItemChemical* lpPktIC = static_cast<PktItemChemical *>(lpPktBase);
|
||||
CCharacter* lpCharacter = GameClientDispatch.GetCharacter();
|
||||
|
||||
CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd());
|
||||
|
||||
unsigned long dwCharID = lpPktIC->m_dwCharID;
|
||||
Item::ItemPos PickkingPos = lpPktIC->m_pickkingPos;
|
||||
Item::ItemPos TargetPos = lpPktIC->m_targetPos;
|
||||
unsigned char cPickkingNum = lpPktIC->m_cPickkingNum;
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
Item::CItem* lpPickkingItem = lpCharacter->GetItem(PickkingPos);
|
||||
Item::CItem* lpTargetItem = lpCharacter->GetItem(TargetPos);
|
||||
Item::CItem* lpResultItem = NULL;
|
||||
|
||||
Item::ChemicalInfo chemicalInfo;
|
||||
|
||||
unsigned short wPickkingItemID = 0;
|
||||
unsigned char cPickkingItemNum = 0;
|
||||
|
||||
if (NULL == lpPickkingItem || NULL == lpTargetItem)
|
||||
{
|
||||
ERRLOG5(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>. "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ : (%d, 0x%04x), <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ : (%d, 0x%04x)",
|
||||
dwCharID, PickkingPos.m_cPos, PickkingPos.m_cIndex, TargetPos.m_cPos, TargetPos.m_cIndex);
|
||||
lpCharacter->GetInventory().DumpItemInfo();
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD>ø<EFBFBD> <20><> <20>ٷ<EFBFBD> <20>ռ<EFBFBD><D5BC>Ϸ<EFBFBD><CFB7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
if (0 < cPickkingNum && cPickkingNum < lpPickkingItem->GetNumOrDurability())
|
||||
{
|
||||
Item::ItemPos HoldPos(TakeType::TS_TEMP, Item::ExtraSpacePos::HOLDITEM_POS);
|
||||
Item::CItem* lpHoldItem = lpCharacter->GetItem(HoldPos);
|
||||
if (NULL != lpHoldItem)
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD><D5BC><EFBFBD> <20>õ<EFBFBD><C3B5>մϴ<D5B4>.",
|
||||
dwCharID);
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
goto SEND_PACKET;
|
||||
}
|
||||
|
||||
Item::CItem* lpSplitItem = Item::CItemFactory::GetInstance().CreateItem(lpPickkingItem->GetItemInfo());
|
||||
if (NULL == lpSplitItem)
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwCharID);
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
goto SEND_PACKET;
|
||||
}
|
||||
|
||||
lpSplitItem->SetNumOrDurability(cPickkingNum);
|
||||
|
||||
if (false == lpCharacter->SetItem(HoldPos, lpSplitItem))
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwCharID);
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
|
||||
DELETE_ITEM(lpSplitItem);
|
||||
|
||||
goto SEND_PACKET;
|
||||
}
|
||||
|
||||
lpPickkingItem->SetNumOrDurability(lpPickkingItem->GetNumOrDurability() - cPickkingNum);
|
||||
|
||||
// <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD>ؼ<EFBFBD> <20>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
lpPickkingItem = lpSplitItem;
|
||||
PickkingPos = lpPickkingItem->GetPos();
|
||||
}
|
||||
|
||||
chemicalInfo.m_wPickkingItemID = lpPickkingItem->GetPrototypeID();
|
||||
chemicalInfo.m_cPickkingItemNum = lpPickkingItem->GetNumOrDurability();
|
||||
|
||||
chemicalInfo.m_wTargetItemID = lpTargetItem->GetPrototypeID();
|
||||
chemicalInfo.m_cTargetItemNum = lpTargetItem->GetNumOrDurability();
|
||||
|
||||
wError = Item::CItemMgr::GetInstance().GetChemicalResult(chemicalInfo);
|
||||
|
||||
// <20><><EFBFBD>⼭ <20>Ϸ<EFBFBD><CFB7><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD><C6BC> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>.
|
||||
if (PktBase::NO_SERVER_ERR == wError && chemicalInfo.m_usQuestID != 0)
|
||||
{
|
||||
// <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>˻<EFBFBD>
|
||||
if( !lpCharacter->HasHistoryQuest(chemicalInfo.m_usQuestID) )
|
||||
wError = Item::Chemical::F_NOT_QUEST;
|
||||
}
|
||||
if (PktBase::NO_SERVER_ERR == wError && chemicalInfo.m_usAbilityID != 0)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ <20>˻<EFBFBD>
|
||||
short sLockCount = lpCharacter->GetSkillLockCount(chemicalInfo.m_usAbilityID);
|
||||
if(chemicalInfo.m_cAbilityLevel <= sLockCount)
|
||||
wError = PktBase::NO_SERVER_ERR;
|
||||
else
|
||||
wError = Item::Chemical::F_NOT_ABILITY;
|
||||
}
|
||||
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>
|
||||
if (0 == chemicalInfo.m_cPickkingItemNum)
|
||||
{
|
||||
if (true == lpCharacter->RemoveItem(PickkingPos))
|
||||
{
|
||||
DELETE_ITEM(lpPickkingItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwCharID);
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
goto SEND_PACKET;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lpPickkingItem->SetNumOrDurability(chemicalInfo.m_cPickkingItemNum);
|
||||
|
||||
wPickkingItemID = chemicalInfo.m_wPickkingItemID;
|
||||
cPickkingItemNum = chemicalInfo.m_cPickkingItemNum;
|
||||
}
|
||||
|
||||
// <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>
|
||||
if (0 == chemicalInfo.m_cTargetItemNum)
|
||||
{
|
||||
if (true == lpCharacter->RemoveItem(TargetPos))
|
||||
{
|
||||
DELETE_ITEM(lpTargetItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwCharID);
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
goto SEND_PACKET;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lpTargetItem->SetNumOrDurability(chemicalInfo.m_cTargetItemNum);
|
||||
|
||||
lpCharacter->RemoveItem(TargetPos);
|
||||
lpCharacter->SetItem(PickkingPos, lpTargetItem);
|
||||
|
||||
wPickkingItemID = chemicalInfo.m_wTargetItemID;
|
||||
cPickkingItemNum = chemicalInfo.m_cTargetItemNum;
|
||||
}
|
||||
|
||||
// <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>
|
||||
lpResultItem = Item::CItemFactory::GetInstance().CreateItem(chemicalInfo.m_wResultItemID);
|
||||
lpResultItem->SetNumOrDurability(chemicalInfo.m_cResultItemNum);
|
||||
lpCharacter->SetItem(TargetPos, lpResultItem);
|
||||
}
|
||||
}
|
||||
|
||||
SEND_PACKET:
|
||||
|
||||
return GameClientSendPacket::SendCharItemChemical(GameClientDispatch.GetSendStream(), dwCharID,
|
||||
PickkingPos, TargetPos, wPickkingItemID, cPickkingItemNum, lpResultItem, wError);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD>
|
||||
bool GameClientParsePacket::ParseCharUpgradeItem(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase)
|
||||
{
|
||||
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktUgI), GameClientDispatch);
|
||||
|
||||
PktUgI* lpPktUgl = static_cast<PktUgI *>(lpPktBase);
|
||||
CCharacter* lpCharacter = GameClientDispatch.GetCharacter();
|
||||
|
||||
CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd());
|
||||
|
||||
using namespace Item;
|
||||
|
||||
unsigned long dwCID = lpCharacter->GetCID();
|
||||
unsigned long dwNPCID = lpPktUgl->m_dwNPCID;
|
||||
unsigned short wError = Item::CEquipment::S_SUCCESS;
|
||||
unsigned long dwUsedGold = 0;
|
||||
unsigned char cCurrentMineralNum = 0;
|
||||
unsigned char cValue = 0;
|
||||
|
||||
Item::CItem* lpDstItem = lpCharacter->GetItem(ItemPos(TakeType::TS_EXTRA, ExtraSpacePos::UPGRADE_EQUIPMENT_POS));
|
||||
Item::CItem* lpMineral = lpCharacter->GetItem(ItemPos(TakeType::TS_EXTRA, ExtraSpacePos::UPGRADE_MATERIAL_POS));
|
||||
|
||||
Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(lpDstItem);
|
||||
|
||||
unsigned char cLastUpgradeLevel = 0;
|
||||
|
||||
if (NULL == lpDstItem)
|
||||
{
|
||||
wError = Item::CEquipment::E_GET_EQUIP_FAILED;
|
||||
}
|
||||
else if (NULL == lpMineral)
|
||||
{
|
||||
wError = Item::CEquipment::E_GET_MINERAL_FAILED;
|
||||
}
|
||||
else if (NULL == lpEquipment || !lpEquipment->IsUpgradable())
|
||||
{
|
||||
wError = Item::CEquipment::E_NOT_EQUIP;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(lpMineral->GetPrototypeID() == Item::EtcItemID::AWAKENCORE)
|
||||
cLastUpgradeLevel = lpEquipment->GetCoreLevel();
|
||||
else
|
||||
cLastUpgradeLevel = lpEquipment->GetUpgradeLevel();
|
||||
|
||||
// lpEquipment<6E><74> <20><><EFBFBD>⼭<EFBFBD><E2BCAD> <20><><EFBFBD><EFBFBD>
|
||||
wError = lpEquipment->UpgradeItem(*lpMineral, lpCharacter->GetGold(), dwUsedGold, cValue);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> NPC <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CNPC* lpNPC = CCreatureManager::GetInstance().GetNPC(dwNPCID);
|
||||
if (NULL != lpNPC && lpNPC->IsBelongToCastle())
|
||||
{
|
||||
Castle::CCastle* lpCastle = Castle::CCastleMgr::GetInstance().GetCastleByNameID(lpNPC->GetCastleNameID());
|
||||
if (NULL != lpCastle)
|
||||
{
|
||||
const unsigned long dwResmeltTax = static_cast<unsigned long>(dwUsedGold * (lpCastle->GetTax(Castle::RESMELT_TAX) / 100.0f));
|
||||
|
||||
if (dwResmeltTax > 0)
|
||||
{
|
||||
lpCastle->AddTempTaxMoney(Castle::RESMELT_TAX, dwResmeltTax);
|
||||
dwUsedGold += dwResmeltTax;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (0 < dwUsedGold)
|
||||
{
|
||||
if (dwUsedGold > lpCharacter->GetGold())
|
||||
{
|
||||
wError = Item::CEquipment::E_NOT_ENOUGH_MONEY;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
lpCharacter->DeductGold(dwUsedGold, false);
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
cCurrentMineralNum = lpMineral->GetNumOrDurability();
|
||||
if (0 == cCurrentMineralNum)
|
||||
{
|
||||
if (false == lpCharacter->RemoveItem(lpMineral->GetPos()))
|
||||
{
|
||||
wError = Item::CEquipment::E_REMOVE_GEM_FAILED;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD><CCB5><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwCID);
|
||||
}
|
||||
else
|
||||
{
|
||||
DELETE_ITEM(lpMineral);
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD>нÿ<D0BD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ְ<EFBFBD> <20><>ö <20><><EFBFBD><EFBFBD>
|
||||
if (wError == Item::CEquipment::S_BROKEN_EQUIP)
|
||||
{
|
||||
if (false == lpCharacter->RemoveItem(ItemPos(TakeType::TS_EXTRA,
|
||||
ExtraSpacePos::UPGRADE_EQUIPMENT_POS)))
|
||||
{
|
||||
wError = Item::CEquipment::E_REMOVE_EQUIP_FAILED;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD>н<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwCID);
|
||||
}
|
||||
else
|
||||
{
|
||||
DELETE_ITEM(lpDstItem);
|
||||
lpDstItem = Item::CItemFactory::GetInstance().CreateItem(EtcItemID::SCRAPS);
|
||||
|
||||
if (NULL == lpDstItem)
|
||||
{
|
||||
wError = Item::CEquipment::E_CREATE_SCRAP_FAILED;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD>н<EFBFBD> <20><>ö <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwCID);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (false == lpCharacter->SetItem(ItemPos(TakeType::TS_EXTRA,
|
||||
ExtraSpacePos::UPGRADE_EQUIPMENT_POS), lpDstItem))
|
||||
{
|
||||
wError = Item::CEquipment::E_SET_SCRAP_FAILED;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ö<EFBFBD><C3B6> <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwCID);
|
||||
|
||||
DELETE_ITEM(lpDstItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (wError == Item::CEquipment::S_BROKEN_EQUIP || wError == Item::CEquipment::S_SUCCESS)
|
||||
{
|
||||
wError = Item::CEquipment::S_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
lpDstItem = NULL;
|
||||
lpMineral = NULL;
|
||||
}
|
||||
|
||||
GAMELOG::LogUpgradeItem(*lpCharacter, lpCharacter->GetGold(), dwUsedGold,
|
||||
cLastUpgradeLevel, lpDstItem, lpMineral, cValue, wError);
|
||||
|
||||
return GameClientSendPacket::SendCharUpgradeItem(GameClientDispatch.GetSendStream(),
|
||||
dwCID, lpCharacter->GetGold(), lpDstItem, cCurrentMineralNum, cValue, wError);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20>̽<EFBFBD>
|
||||
bool GameClientParsePacket::ParseCharItemOptionGraft(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase)
|
||||
{
|
||||
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktItemOptionGraft), GameClientDispatch);
|
||||
|
||||
PktItemOptionGraft* lpPktIOG = static_cast<PktItemOptionGraft *>(lpPktBase);
|
||||
CCharacter* lpCharacter = GameClientDispatch.GetCharacter();
|
||||
|
||||
CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd());
|
||||
|
||||
unsigned long dwCID = lpPktIOG->m_dwCharID;
|
||||
unsigned char cAttributeType = lpPktIOG->m_cAttributeType;
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
unsigned long dwUsedGold = 0;
|
||||
|
||||
using namespace Item;
|
||||
|
||||
Item::CEquipment* lpOriginalItem = Item::CEquipment::DowncastToEquipment(
|
||||
lpCharacter->GetItem(Item::ItemPos(TakeType::TS_EXTRA, Item::ExtraSpacePos::GRAFT_ORIGINAL_POS)));
|
||||
Item::CEquipment* lpSacrificeItem = Item::CEquipment::DowncastToEquipment(
|
||||
lpCharacter->GetItem(Item::ItemPos(TakeType::TS_EXTRA, Item::ExtraSpacePos::GRAFT_SACRIFICE_POS)));
|
||||
|
||||
size_t nOldItemSize = 0;
|
||||
size_t nUseItemSize = 0;
|
||||
|
||||
char szOldItemData[Item::MAX_ITEM_SIZE];
|
||||
char szUseItemData[Item::MAX_ITEM_SIZE];
|
||||
|
||||
unsigned long dwOldGold = lpCharacter->GetGold();
|
||||
|
||||
if (NULL == lpOriginalItem || NULL == lpSacrificeItem)
|
||||
{
|
||||
// <20>ɼ<EFBFBD> <20>̽<EFBFBD><CCBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
// edith <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC>̽<EFBFBD> <20><>Ŷ
|
||||
|
||||
// <20>α<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> item serialize<7A><65> <20>Ѵ<EFBFBD>.
|
||||
nOldItemSize = Item::MAX_ITEM_SIZE;
|
||||
if(!lpOriginalItem->SerializeOut(szOldItemData, nOldItemSize))
|
||||
{
|
||||
nOldItemSize = 0;
|
||||
}
|
||||
|
||||
nUseItemSize = Item::MAX_ITEM_SIZE;
|
||||
if(!lpSacrificeItem->SerializeOut(szUseItemData, nUseItemSize))
|
||||
{
|
||||
nUseItemSize = 0;
|
||||
}
|
||||
|
||||
bool bUpgradeLevelLimit = false;
|
||||
|
||||
wError = lpOriginalItem->OptionGraft(lpSacrificeItem, bUpgradeLevelLimit, cAttributeType, lpCharacter->GetGold(), dwUsedGold);
|
||||
|
||||
if (PktBase::NO_SERVER_ERR == wError || wError == 5) // 5<><35> <20>ɼ<EFBFBD><C9BC>̽<EFBFBD> <20><><EFBFBD>з<EFBFBD> <20>ݾװ<DDBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>ݾ<EFBFBD>
|
||||
lpCharacter->DeductGold(dwUsedGold, false);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (false == lpCharacter->RemoveItem(lpSacrificeItem->GetPos()))
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwCID);
|
||||
}
|
||||
else
|
||||
{
|
||||
DELETE_ITEM(lpSacrificeItem);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>
|
||||
lpCharacter->MoveItem(TakeType(lpOriginalItem->GetPos(),
|
||||
ItemPos(TakeType::TS_EXTRA, ExtraSpacePos::GRAFT_RESULT_POS), 1));
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>α<EFBFBD>
|
||||
GAMELOG::LogItemAttachOption(*lpCharacter, dwOldGold, cAttributeType,
|
||||
szOldItemData, nOldItemSize, szUseItemData, nUseItemSize, lpOriginalItem, wError);
|
||||
|
||||
return GameClientSendPacket::SendCharItemOptionGraft(GameClientDispatch.GetSendStream(),
|
||||
dwCID, lpCharacter->GetGold(), lpOriginalItem, wError);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD>
|
||||
bool GameClientParsePacket::ParseCharItemCompensation(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase)
|
||||
{
|
||||
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktItemCompensation), GameClientDispatch);
|
||||
|
||||
PktItemCompensation* lpPktPIC = static_cast<PktItemCompensation *>(lpPktBase);
|
||||
CCharacter* lpCharacter = GameClientDispatch.GetCharacter();
|
||||
|
||||
CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd());
|
||||
|
||||
unsigned long dwCID = lpPktPIC->m_dwCharID;
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
Item::CItem* lpOriginalItem = lpCharacter->GetItem(Item::ItemPos(TakeType::TS_EXTRA, Item::ExtraSpacePos::COMPENSATION_POS));
|
||||
unsigned long dwOldGold = lpCharacter->GetGold();
|
||||
|
||||
Item::CEquipment* lpOriginalEquip = Item::CEquipment::DowncastToEquipment(lpOriginalItem);
|
||||
if (NULL == lpOriginalEquip)
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD><C7B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", lpCharacter->GetCID());
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
Item::CEquipment* lpResultItem = NULL;
|
||||
long lResultGold = 0;
|
||||
|
||||
wError = lpOriginalEquip->Compensation(
|
||||
static_cast<unsigned char>(lpCharacter->GetClass()), static_cast<unsigned char>(lpCharacter->GetLevel()),
|
||||
lpCharacter->GetCharStatus(), &lpResultItem, lResultGold);
|
||||
|
||||
if (NULL == lpResultItem)
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20>Ǹſ<C7B8> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", lpCharacter->GetCID());
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
|
||||
if (0 > lResultGold && static_cast<unsigned long>(abs(lResultGold)) > lpCharacter->GetGold())
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", lpCharacter->GetCID());
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
if (false == lpCharacter->RemoveItem(lpOriginalEquip->GetPos()))
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", lpCharacter->GetCID());
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
DELETE_ITEM(lpResultItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (false == lpCharacter->GiveItem(lpResultItem))
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִµ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", lpCharacter->GetCID());
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
|
||||
lpCharacter->SetItem(Item::ItemPos(TakeType::TS_EXTRA,
|
||||
Item::ExtraSpacePos::COMPENSATION_POS), lpOriginalItem);
|
||||
|
||||
DELETE_ITEM(lpResultItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (0 < lResultGold)
|
||||
{
|
||||
lpCharacter->AddGold(lResultGold, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
lpCharacter->DeductGold(abs(lResultGold), true);
|
||||
}
|
||||
|
||||
GAMELOG::LogItemCompensation(*lpCharacter, dwOldGold, lpOriginalItem, lpResultItem, 0);
|
||||
GameClientSendPacket::SendCharItemCompensation(GameClientDispatch.GetSendStream(), dwCID, 0);
|
||||
|
||||
DELETE_ITEM(lpOriginalItem);
|
||||
|
||||
// GiveItem <20><><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (lpResultItem->IsSet(Item::DetailData::STACKABLE) && 0 == lpResultItem->GetNumOrDurability())
|
||||
{
|
||||
DELETE_ITEM(lpResultItem);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GAMELOG::LogItemCompensation(*lpCharacter, dwOldGold, 0, 0, wError);
|
||||
return GameClientSendPacket::SendCharItemCompensation(GameClientDispatch.GetSendStream(), dwCID, wError);
|
||||
}
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ/<2F><><EFBFBD><EFBFBD>.
|
||||
bool GameClientParsePacket::ParseCharInstallRuneSocket(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase)
|
||||
{
|
||||
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktIRS), GameClientDispatch);
|
||||
|
||||
PktIRS* lpPktIRS = static_cast<PktIRS*>(lpPktBase);
|
||||
CCharacter* lpCharacter = GameClientDispatch.GetCharacter();
|
||||
|
||||
CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd());
|
||||
|
||||
unsigned long dwCharID = lpPktIRS->m_dwCharID;
|
||||
Item::ItemPos EquipPos = lpPktIRS->m_equipPos;
|
||||
Item::ItemPos RunePos = lpPktIRS->m_runePos;
|
||||
unsigned char PktType = lpPktIRS->m_cType;
|
||||
|
||||
Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(lpCharacter->GetItem(EquipPos));
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ĭ<EFBFBD><C4AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>.
|
||||
|
||||
bool bEquip = lpCharacter->GetEquipments().GetItem(EquipPos) == NULL ? false : true;
|
||||
|
||||
Item::CItem* lpRune = lpCharacter->GetItem(RunePos);
|
||||
|
||||
if(PktType==PktIRS::RUNE_INSTALL)
|
||||
{
|
||||
if(lpEquipment && lpRune)
|
||||
{
|
||||
Item::CEquipment::EQUIPMENT_ERROR equipError = lpEquipment->InstallRuneSocket(*lpRune, bEquip, lpCharacter->GetLevel());
|
||||
|
||||
if(equipError!=Item::CEquipment::R_SUCCESS)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(lpRune)
|
||||
{
|
||||
if(!lpRune->GetNumOrDurability())
|
||||
{
|
||||
if(lpCharacter->RemoveItem(RunePos))
|
||||
{
|
||||
DELETE_ITEM(lpRune);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", lpCharacter->GetCID());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!lpEquipment)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", lpCharacter->GetCID());
|
||||
}
|
||||
|
||||
if(!lpRune)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", lpCharacter->GetCID());
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(PktType==PktIRS::RUNE_UNINSTALL)
|
||||
{
|
||||
if(lpEquipment && lpRune)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ <20>˻<EFBFBD>.
|
||||
|
||||
SKILL skill = lpCharacter->GetSkill();
|
||||
|
||||
short sSkillPoint = lpCharacter->GetStatus().m_StatusInfo.m_wSkillPoint - skill.GetSkillNum();
|
||||
|
||||
if(sSkillPoint<0)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> Ŭ <20><><EFBFBD><EFBFBD>", lpCharacter->GetCID());
|
||||
}
|
||||
else
|
||||
{
|
||||
Item::CEquipment::EQUIPMENT_ERROR equipError = lpEquipment->UnInstallRuneSocket(*lpRune, bEquip, lpCharacter->GetLevel(), sSkillPoint);
|
||||
|
||||
if(equipError!=Item::CEquipment::R_SUCCESS)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(lpRune)
|
||||
{
|
||||
if(!lpRune->GetNumOrDurability())
|
||||
{
|
||||
if(lpCharacter->RemoveItem(RunePos))
|
||||
{
|
||||
DELETE_ITEM(lpRune);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", lpCharacter->GetCID());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!lpEquipment)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", lpCharacter->GetCID());
|
||||
}
|
||||
|
||||
if(!lpRune)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
ERRLOG1(g_Log, "CID:0x%08x <20>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", lpCharacter->GetCID());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
lpCharacter->CalculateStatusData(false);
|
||||
|
||||
return GameClientSendPacket::SendCharRuneInstallSocket(GameClientDispatch.GetSendStream(), dwCharID,
|
||||
EquipPos, RunePos, lpEquipment, PktType, wError);
|
||||
}
|
||||
Reference in New Issue
Block a user