- 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