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,337 @@
#include "stdafx.h"
#include <Item/Item.h>
#include <Item/ItemFactory.h>
#include <Creature/NPC/NPC.h>
#include <Creature/CreatureManager.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Network/Dispatch/GameClient/SendCharCommunity.h>
#include <Network/Packet/PacketStruct/CharCommunityPacket.h>
#include <Map/FieldMap/VirtualArea/VirtualArea.h>
#include <Map/FieldMap/VirtualArea/VirtualAreaMgr.h>
#include <Log/ItemLog.h>
#include "Character.h"
unsigned long CCharacter::RepairItem(const unsigned long dwNPCID, Item::ItemPos itemPos, unsigned short& wError)
{
CCreature* lpCreature = CCreatureManager::GetInstance().GetCreature(dwNPCID);
if (NULL == lpCreature)
{
ERRLOG2(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9><EFBFBD>İ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. CID:%10u", m_dwCID, dwNPCID);
wError = PktRpI::FAIL_NOT_CREATURE;
return 0;
}
if (Creature::CT_NPC == Creature::GetCreatureType(dwNPCID))
{
int nZone = CServerSetup::GetInstance().GetServerZone();
if (GetMapIndex() != 0)
{
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(GetMapIndex());
if (NULL != lpVirtualArea)
{
nZone = static_cast<int>(lpVirtualArea->GetVirtualZone());
}
}
CNPC* lpNPC = reinterpret_cast<CNPC*>(lpCreature);
if (lpNPC->GetZone() != nZone)
{
ERRLOG3(g_Log, "CID:%10u NPC<50><43> <20><> <20><>ȣ<EFBFBD><C8A3> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>. Server Zone : %d, NPC Zone : %d", m_dwCID, nZone, lpNPC->GetZone());
wError = PktRpI::FAIL_NOT_NPCZONE;
return 0;
}
}
Item::CItem* lpItem = GetItem(itemPos);
if (NULL == lpItem)
{
ERRLOG3(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d Pos, %d Index<65><78> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", m_dwCID, itemPos.m_cPos, itemPos.m_cIndex);
wError = PktRpI::FAIL_NOT_POSITEM;
return 0;
}
if (true == lpItem->IsSet(Item::DetailData::STACKABLE))
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", m_dwCID);
wError = PktRpI::FAIL_NOT_STACKABLE;
return 0;
}
if (false == lpItem->IsSet(Item::DetailData::EQUIP))
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", m_dwCID);
wError = PktRpI::FAIL_NOT_EQUIP;
return 0;
}
if (lpItem->GetNumOrDurability() >= lpItem->GetMaxNumOrDurability())
{
// ERRLOG4(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."
// " <20><><EFBFBD><EFBFBD>ID:%d, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d, <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d", m_dwCID, lpItem->GetPrototypeID(),
// lpItem->GetNumOrDurability(), lpItem->GetMaxNumOrDurability());
wError = PktRpI::FAIL_FULL_DRUA;
return 0;
}
Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(lpItem);
unsigned long dwGold = lpCreature->RepairItem(lpEquipment, m_DBData.m_Info.Gold);
if (0 != dwGold)
{
CalculateStatusData(false);
}
else
{
wError = PktRpAI::FAIL_NOT_REPAIR;
}
return dwGold;
}
unsigned long CCharacter::RepairAllItem(const unsigned long dwNPCID, unsigned short& wError)
{
CCreature* lpCreature = CCreatureManager::GetInstance().GetCreature(dwNPCID);
if (NULL == lpCreature)
{
ERRLOG2(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9><EFBFBD>İ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. CID:%10u", m_dwCID, dwNPCID);
wError = PktRpAI::FAIL_NOT_CREATURE;
return 0;
}
if (Creature::CT_NPC == Creature::GetCreatureType(dwNPCID))
{
int nZone = CServerSetup::GetInstance().GetServerZone();
if (GetMapIndex() != 0)
{
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(GetMapIndex());
if (NULL != lpVirtualArea)
{
nZone = static_cast<int>(lpVirtualArea->GetVirtualZone());
}
}
CNPC* lpNPC = reinterpret_cast<CNPC*>(lpCreature);
if (lpNPC->GetZone() != nZone)
{
ERRLOG3(g_Log, "CID:%10u NPC<50><43> <20><> <20><>ȣ<EFBFBD><C8A3> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>. Server Zone : %d, NPC Zone : %d", m_dwCID, nZone, lpNPC->GetZone());
wError = PktRpAI::FAIL_NOT_NPCZONE;
return 0;
}
}
unsigned long dwRepairGold = 0;
Item::ItemPos itemPos;
itemPos.m_cPos = TakeType::TS_EQUIP;
// 1<>ܰ<EFBFBD> <20>˻<EFBFBD>
for (unsigned char cIndex = 0; cIndex < Item::EquipmentPos::MAX_EQUPMENT_POS; ++cIndex)
{
if (GetRace() == CClass::AKHAN &&
(Item::EquipmentPos::SHIRT == cIndex ||
Item::EquipmentPos::TUNIC == cIndex ||
Item::EquipmentPos::SHIELD_HAND2 == cIndex ||
Item::EquipmentPos::WEAPON_HAND2 < cIndex))
{
continue;
}
itemPos.m_cIndex = cIndex;
Item::CItem* lpItem = GetItem(itemPos);
if (NULL == lpItem) { continue; }
if (true == lpItem->IsSet(Item::DetailData::STACKABLE))
{
// ȭ<><C8AD>/<2F><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
continue;
}
if (false == lpItem->IsSet(Item::DetailData::EQUIP))
{
ERRLOG3(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴմϴ<D5B4>. (%d Pos, %d Index)",
m_dwCID, itemPos.m_cPos, itemPos.m_cIndex);
continue;
}
if (lpItem->GetNumOrDurability() >= lpItem->GetMaxNumOrDurability())
{
// Ǯ<><C7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ŵ
continue;
}
// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(lpItem);
if(lpEquipment)
dwRepairGold += lpEquipment->GetRepairPrice();
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (dwRepairGold > GetGold())
{
wError = PktRpAI::NOT_ENOUGH_GOLD;
return 0;
}
dwRepairGold = 0;
// 2<>ܰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
for (unsigned char cIndex = 0; cIndex < Item::EquipmentPos::MAX_EQUPMENT_POS; ++cIndex)
{
if (GetRace() == CClass::AKHAN &&
(Item::EquipmentPos::SHIRT == cIndex ||
Item::EquipmentPos::TUNIC == cIndex ||
Item::EquipmentPos::SHIELD_HAND2 == cIndex ||
Item::EquipmentPos::WEAPON_HAND2 < cIndex))
{
continue;
}
itemPos.m_cIndex = cIndex;
Item::CItem* lpItem = GetItem(itemPos);
if (NULL == lpItem) { continue; }
if (true == lpItem->IsSet(Item::DetailData::STACKABLE))
{
// ȭ<><C8AD>/<2F><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
continue;
}
if (false == lpItem->IsSet(Item::DetailData::EQUIP))
{
ERRLOG3(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴմϴ<D5B4>. (%d Pos, %d Index)",
m_dwCID, itemPos.m_cPos, itemPos.m_cIndex);
continue;
}
if (lpItem->GetNumOrDurability() >= lpItem->GetMaxNumOrDurability())
{
// Ǯ<><C7AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ŵ
continue;
}
Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(lpItem);
if(lpEquipment)
dwRepairGold += lpCreature->RepairItem(lpEquipment, m_DBData.m_Info.Gold);
}
if (0 != dwRepairGold)
{
CalculateStatusData(false);
}
else
{
wError = PktRpAI::FAIL_NOT_REPAIR;
}
return dwRepairGold;
}
Item::CItem* CCharacter::SellToCharacter(CCharacter *lpCustomer, unsigned short wKindItem, TakeType takeType,
Item::CItem* lpRequestItem, unsigned long &dwPrice, unsigned short wCouponID, unsigned short &usError)
{
Item::CItem* lpItem = m_Stall.GetItem(takeType.m_srcPos);
if (NULL == lpItem) { return NULL; }
unsigned long dwCustomerCID = lpCustomer->GetCID();
unsigned long dwCurrentGold = lpCustomer->GetGold();
dwPrice = lpItem->GetBuyPrice() * takeType.m_cNum;
if (dwPrice > dwCurrentGold)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. <20><><EFBFBD><EFBFBD>:%d, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d", dwPrice, dwCurrentGold);
GAMELOG::LogTradeItem(*this, dwCustomerCID, dwPrice, lpItem, takeType.m_srcPos, PktTr::TRC_SELL, PktTr::FAIL_ITEM_BUY);
return NULL;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>
if (GetGold() > ULONG_MAX - dwPrice)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ŷ<EFBFBD><C5B7><EFBFBD> Gold<6C><64> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD><CAB0>մϴ<D5B4>. <20><><EFBFBD><EFBFBD>:%d, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%d", dwPrice, GetGold());
GAMELOG::LogTradeItem(*this, dwCustomerCID, dwPrice, lpItem, takeType.m_srcPos, PktTr::TRC_SELL, PktTr::FAIL_GOLD_OVERFLOW);
return NULL;
}
if (false == lpCustomer->GetInventory().TestItem(takeType.m_dstPos, lpItem->GetPrototypeID(), takeType.m_cNum))
{
Item::CItemContainer* lpItemContainer = lpCustomer->GetItemContainer(takeType.m_dstPos.m_cPos);
if (NULL != lpItemContainer)
{
lpItemContainer->DumpItemInfo();
}
else
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwCustomerCID);
}
ERRLOG4(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>:%d<><64> (%2d:%2d)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD>.",
dwCustomerCID, lpItem->GetPrototypeID(), takeType.m_dstPos.m_cPos, takeType.m_dstPos.m_cIndex);
return NULL;
}
bool bStackable = lpItem->IsSet(Item::DetailData::STACKABLE);
unsigned char cNumOrDurability = lpItem->GetNumOrDurability();
Item::ItemPos ItemPos = lpItem->GetPos();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>.
if (!(bStackable && (cNumOrDurability < takeType.m_cNum)))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD>ϰų<CFB0>, <20><><EFBFBD><EFBFBD> <20>Ĵ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if (!bStackable || (bStackable && (takeType.m_cNum == lpItem->GetNumOrDurability())))
{
if (false == m_Stall.RemoveItem(takeType.m_srcPos))
{
ERRLOG3(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (%2d, %4x)<29><>ġ<EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.",
m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_srcPos.m_cIndex);
GAMELOG::LogTradeItem(*this, dwCustomerCID, dwPrice, lpItem, takeType.m_srcPos, PktTr::TRC_SELL, PktTr::FAIL_ITEM_BUY);
return NULL;
}
else
{
RemoveItem(ItemPos);
m_Stall.SendRemoveItem(takeType, PktStRI::SC_CANCEL, lpCustomer->GetCharacterName());
}
}
else
{
lpItem->SetNumOrDurability(cNumOrDurability - takeType.m_cNum);
m_Stall.SendRemoveItem(takeType, PktStRI::SC_CANCEL, lpCustomer->GetCharacterName());
unsigned short usProtoTypeID = lpItem->GetPrototypeID();
lpItem = Item::CItemFactory::GetInstance().CreateItem(usProtoTypeID);
if (NULL == lpItem)
{
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. ProtoTypeID : %d", usProtoTypeID);
GAMELOG::LogTradeItem(*this, dwCustomerCID, dwPrice, lpItem, takeType.m_srcPos, PktTr::TRC_SELL, PktTr::FAIL_ITEM_BUY);
return NULL;
}
lpItem->SetNumOrDurability(takeType.m_cNum);
}
AddGold(dwPrice, false);
if (NULL != m_lpGameClientDispatch)
{
GameClientSendPacket::SendCharTradeItem(m_lpGameClientDispatch->GetSendStream(), this, lpCustomer->GetCID(),
Item::ItemPos(), NULL, ItemPos, takeType.m_cNum, 0);
}
}
else
{
ERRLOG4(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : (%2d, %4x)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : %d<><64> <20>ȷ<EFBFBD><C8B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : %d<><64>",
takeType.m_srcPos.m_cPos, takeType.m_srcPos.m_cIndex, cNumOrDurability, takeType.m_cNum);
GAMELOG::LogTradeItem(*this, dwCustomerCID, dwPrice, lpItem, takeType.m_srcPos, PktTr::TRC_SELL, PktTr::FAIL_ITEM_BUY);
return NULL;
}
GAMELOG::LogTradeItem(*this, dwCustomerCID, dwPrice, lpItem, takeType.m_srcPos, PktTr::TRC_SELL, PktTr::NO_SERVER_ERR);
return lpItem;
}