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,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;
|
||||
}
|
||||
Reference in New Issue
Block a user