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:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

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