Client Source -> Locale_inc.h Ekle
#define WJ_NEW_DROP_DIALOG
Client Source -> Packet.h Arat : HEADER_CG_ITEM_DROP2 altına ekle
#ifdef WJ_NEW_DROP_DIALOG
HEADER_CG_ITEM_DESTROY = 21,
HEADER_CG_ITEM_SELL = 22,
#endif
Tekrar Arat : typedef struct command_item_drop2
Satır sonuna ekle
#ifdef WJ_NEW_DROP_DIALOG
typedef struct command_item_destroy
{
BYTE header;
TItemPos pos;
} TPacketCGItemDestroy;
typedef struct command_item_sell
{
BYTE header;
TItemPos pos;
} TPacketCGItemSell;
#endif
Client Source -> PythonApplicationModule.cpp Arat ;
#ifdef ENABLE_COSTUME_SYSTEM
PyModule_AddIntConstant(poModule, "ENABLE_COSTUME_SYSTEM", 1);
#else
PyModule_AddIntConstant(poModule, "ENABLE_COSTUME_SYSTEM", 0);
#endif
Altına ekle
#ifdef WJ_NEW_DROP_DIALOG
PyModule_AddIntConstant(poModule, "WJ_NEW_DROP_DIALOG", 1);
#else
PyModule_AddIntConstant(poModule, "WJ_NEW_DROP_DIALOG", 0);
#endif
Client Source -> PythonNetworkStream.h Arat;
bool SendItemDropPacket(TItemPos pos, DWORD elk); Altına ekle
#ifdef WJ_NEW_DROP_DIALOG
bool SendItemDestroyPacket(TItemPos pos);
bool SendItemSellPacket(TItemPos pos);
#endif
Client Source -> PythonNetworkStreamModule.cpp Arat ;
PyObject* netSendItemDropPacket(PyObject* poSelf, PyObject* poArgs) Satır sonuna ekle
#ifdef WJ_NEW_DROP_DIALOG
PyObject* netSendItemDestroyPacket(PyObject* poSelf, PyObject* poArgs)
{
TItemPos Cell;
if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell))
return Py_BuildException();
CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance();
rkNetStream.SendItemDestroyPacket(Cell);
return Py_BuildNone();
}
PyObject* netSendItemSellPacket(PyObject* poSelf, PyObject* poArgs)
{
TItemPos Cell;
if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell))
return Py_BuildException();
CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance();
rkNetStream.SendItemSellPacket(Cell);
return Py_BuildNone();
}
#endif
Tekrar Arat ; { "SendItemDropPacketNew", netSendItemDropPacketNew, METH_VARARGS }, altına ekle
#ifdef WJ_NEW_DROP_DIALOG
{ "SendItemDestroyPacket", netSendItemDestroyPacket, METH_VARARGS },
{ "SendItemSellPacket", netSendItemSellPacket, METH_VARARGS },
#endif
Client Source -> PythonNetworkStreamPhaseGameItem.cpp Arat;
bool CPythonNetworkStream::SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count) satır sonuna ekle
#ifdef WJ_NEW_DROP_DIALOG
bool CPythonNetworkStream::SendItemDestroyPacket(TItemPos pos)
{
if (!__CanActMainInstance())
return true;
TPacketCGItemDestroy itemDestroyPacket;
itemDestroyPacket.header = HEADER_CG_ITEM_DESTROY;
itemDestroyPacket.pos = pos;
if (!Send(sizeof(itemDestroyPacket), &itemDestroyPacket))
{
Tracen("SendItemDestroyPacket Error");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::SendItemSellPacket(TItemPos pos)
{
if (!__CanActMainInstance())
return true;
TPacketCGItemSell itemSellPacket;
itemSellPacket.header = HEADER_CG_ITEM_SELL;
itemSellPacket.pos = pos;
if (!Send(sizeof(itemSellPacket), &itemSellPacket))
{
Tracen("SendItemSellPacket Error");
return false;
}
return SendSequence();
}
#endif
-------------------------------------------------------
Server Source -> common/service.h Ekle;
#define WJ_NEW_DROP_DIALOG
Server Source -> game/char.h Arat : DropItem(TItemPos Cell, BYTE bCount=0); Altına ekle
#ifdef WJ_NEW_DROP_DIALOG
bool DestroyItem(TItemPos Cell);
bool SellItem(TItemPos Cell, BYTE bCount=0);
#endif
Server Source -> game/char_item.cpp Arat : bool CHARACTER::DropItem(TItemPos Cell, BYTE bCount) Satır sonuna ekle
#ifdef WJ_NEW_DROP_DIALOG
bool CHARACTER::DestroyItem(TItemPos Cell)
{
LPITEM item = NULL;
if (!CanHandleItem())
{
if (NULL != DragonSoul_RefineWindow_GetOpener())
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화창을 연 상태에서는 아이템을 옮길 수 없습니다."));
return false;
}
if (IsDead())
return false;
if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell)))
return false;
if (item->IsExchanging())
return false;
if (true == item->isLocked())
return false;
#ifdef WJ_SOULBINDING_SYSTEM
if (item->IsBind() || item->IsUntilBind())
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("BIND_ITEM_NOT_DELETE"));
return false;
}
#endif
if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
return false;
if (item->GetCount() <= 0)
return false;
#ifdef WJ_GROWTH_PET_SYSTEM
if (item->GetVnum() == 55701 || item->GetVnum() == 55702 || item->GetVnum() == 55703 || item->GetVnum() == 55704)
if (GetNewPetSystem()->IsActivePet())
return false;
#endif
SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 1000);
ITEM_MANAGER::instance().RemoveItem(item);
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ITEM_DESTROY_SUCCES"), item->GetName());
return true;
}
bool CHARACTER::SellItem(TItemPos Cell, BYTE bCount)
{
LPITEM item = NULL;
if (!CanHandleItem())
{
if (NULL != DragonSoul_RefineWindow_GetOpener())
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화창을 연 상태에서는 아이템을 옮길 수 없습니다."));
return false;
}
if (IsDead())
return false;
if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell)))
return false;
if (item->IsExchanging())
return false;
if (true == item->isLocked())
return false;
#ifdef WJ_SOULBINDING_SYSTEM
if (item->IsBind() || item->IsUntilBind())
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("BIND_ITEM_NOT_SELL"));
return false;
}
#endif
if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_SELL))
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("THIS_ITEM_NOT_SELL"));
return false;
}
if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
return false;
if (item->GetCount() <= 0)
return false;
#ifdef WJ_GROWTH_PET_SYSTEM
if (item->GetVnum() == 55701 || item->GetVnum() == 55702 || item->GetVnum() == 55703 || item->GetVnum() == 55704)
if (GetNewPetSystem()->IsActivePet())
return false;
#endif
DWORD dwPrice;
if (bCount == 0 || bCount > item->GetCount())
bCount = item->GetCount();
dwPrice = item->GetShopBuyPrice();
if (IS_SET(item->GetFlag(), ITEM_FLAG_COUNT_PER_1GOLD))
{
if (dwPrice == 0)
dwPrice = bCount;
else
dwPrice = bCount / dwPrice;
}
else
dwPrice *= bCount;
dwPrice /= 5;
DWORD dwTax = 0;
#ifdef ENABLE_NEWSTUFF
if (g_iTaxes != 0)
dwTax = dwPrice * g_iTaxes/100;
#endif
dwPrice -= dwTax;
const int64_t nTotalMoney = static_cast<int64_t>(GetGold()) + static_cast<int64_t>(dwPrice);
if (GOLD_MAX <= nTotalMoney)
{
sys_err("[OVERFLOW_GOLD] id %u name %s gold %u", GetPlayerID(), GetName(), GetGold());
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20억냥이 초과하여 물품을 팔수 없습니다."));
return false;
}
sys_log(0, "SHOP: SELL: %s item name: %s(x%d):%u price: %u", GetName(), item->GetName(), bCount, item->GetID(), dwPrice);
#ifdef ENABLE_NEWSTUFF
if (g_iTaxes > 0)
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("판매금액의 %d %% 가 세금으로 나가게됩니다"), g_iTaxes);
#endif
DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), dwPrice);
item->SetCount(item->GetCount() - bCount);
PointChange(POINT_GOLD, dwPrice, false);
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ITEM_SELL_SUCCES"), item->GetName());
return true;
}
#endif
Server Source -> game/input.h Arat : ItemDrop2(LPCHARACTER ch, const char * data); Altına ekle
#ifdef WJ_NEW_DROP_DIALOG
void ItemDestroy(LPCHARACTER ch, const char * data);
void ItemSell(LPCHARACTER ch, const char * data);
#endif
Server Source -> game/input_main.cpp Arat : void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) Satır sonuna ekle
#ifdef WJ_NEW_DROP_DIALOG
void CInputMain::ItemDestroy(LPCHARACTER ch, const char * data)
{
struct command_item_destroy * pinfo = (struct command_item_destroy *) data;
if (ch)
ch->DestroyItem(pinfo->Cell);
}
void CInputMain::ItemSell(LPCHARACTER ch, const char * data)
{
struct command_item_sell * pinfo = (struct command_item_sell *) data;
if (ch)
ch->SellItem(pinfo->Cell);
}
#endif
Yeniden arat
case HEADER_CG_ITEM_DROP2:
if (!ch->IsObserverMode())
ItemDrop2(ch, c_pData);
break;
Altına ekle
#ifdef WJ_NEW_DROP_DIALOG
case HEADER_CG_ITEM_DESTROY:
if (!ch->IsObserverMode())
ItemDestroy(ch, c_pData);
break;
case HEADER_CG_ITEM_SELL:
if (!ch->IsObserverMode())
ItemSell(ch, c_pData);
break;
#endif
Server Source -> game/packet.h Arat : HEADER_CG_ITEM_DROP2 altına ekle
#ifdef WJ_NEW_DROP_DIALOG
HEADER_CG_ITEM_DESTROY = 21,
HEADER_CG_ITEM_SELL = 22,
#endif
Tekrar arat: typedef struct command_item_drop2 satır sonuna ekle
#ifdef WJ_NEW_DROP_DIALOG
typedef struct command_item_destroy
{
BYTE header;
TItemPos Cell;
} TPacketCGItemDestroy;
typedef struct command_item_sell
{
BYTE header;
TItemPos Cell;
} TPacketCGItemSell;
#endif
Server Source -> game/packet_info.cpp Arat ;
Set(HEADER_CG_ITEM_DROP2, sizeof(TPacketCGItemDrop2), "ItemDrop2", false);
Altına ekle
#ifdef WJ_NEW_DROP_DIALOG
Set(HEADER_CG_ITEM_DESTROY, sizeof(TPacketCGItemDestroy), "ItemDestroy", false);
Set(HEADER_CG_ITEM_SELL, sizeof(TPacketCGItemSell), "ItemSell", false);
#endif