1. Client Source -> Locale_inc.h Ekle
  2. #define WJ_NEW_DROP_DIALOG
  3. Client Source -> Packet.h Arat : HEADER_CG_ITEM_DROP2 altına ekle
  4. #ifdef WJ_NEW_DROP_DIALOG
  5. HEADER_CG_ITEM_DESTROY = 21,
  6. HEADER_CG_ITEM_SELL = 22,
  7. #endif
  8. Tekrar Arat : typedef struct command_item_drop2
  9. Satır sonuna ekle
  10. #ifdef WJ_NEW_DROP_DIALOG
  11. typedef struct command_item_destroy
  12. {
  13. BYTE header;
  14. TItemPos pos;
  15. } TPacketCGItemDestroy;
  16. typedef struct command_item_sell
  17. {
  18. BYTE header;
  19. TItemPos pos;
  20. } TPacketCGItemSell;
  21. #endif
  22. Client Source -> PythonApplicationModule.cpp Arat ;
  23. #ifdef ENABLE_COSTUME_SYSTEM
  24. PyModule_AddIntConstant(poModule, "ENABLE_COSTUME_SYSTEM", 1);
  25. #else
  26. PyModule_AddIntConstant(poModule, "ENABLE_COSTUME_SYSTEM", 0);
  27. #endif
  28. Altına ekle
  29. #ifdef WJ_NEW_DROP_DIALOG
  30. PyModule_AddIntConstant(poModule, "WJ_NEW_DROP_DIALOG", 1);
  31. #else
  32. PyModule_AddIntConstant(poModule, "WJ_NEW_DROP_DIALOG", 0);
  33. #endif
  34. Client Source -> PythonNetworkStream.h Arat;
  35. bool SendItemDropPacket(TItemPos pos, DWORD elk); Altına ekle
  36. #ifdef WJ_NEW_DROP_DIALOG
  37. bool SendItemDestroyPacket(TItemPos pos);
  38. bool SendItemSellPacket(TItemPos pos);
  39. #endif
  40. Client Source -> PythonNetworkStreamModule.cpp Arat ;
  41. PyObject* netSendItemDropPacket(PyObject* poSelf, PyObject* poArgs) Satır sonuna ekle
  42. #ifdef WJ_NEW_DROP_DIALOG
  43. PyObject* netSendItemDestroyPacket(PyObject* poSelf, PyObject* poArgs)
  44. {
  45. TItemPos Cell;
  46. if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell))
  47. return Py_BuildException();
  48. CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance();
  49. rkNetStream.SendItemDestroyPacket(Cell);
  50. return Py_BuildNone();
  51. }
  52. PyObject* netSendItemSellPacket(PyObject* poSelf, PyObject* poArgs)
  53. {
  54. TItemPos Cell;
  55. if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell))
  56. return Py_BuildException();
  57. CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance();
  58. rkNetStream.SendItemSellPacket(Cell);
  59. return Py_BuildNone();
  60. }
  61. #endif
  62. Tekrar Arat ; { "SendItemDropPacketNew", netSendItemDropPacketNew, METH_VARARGS }, altına ekle
  63. #ifdef WJ_NEW_DROP_DIALOG
  64. { "SendItemDestroyPacket", netSendItemDestroyPacket, METH_VARARGS },
  65. { "SendItemSellPacket", netSendItemSellPacket, METH_VARARGS },
  66. #endif
  67. Client Source -> PythonNetworkStreamPhaseGameItem.cpp Arat;
  68. bool CPythonNetworkStream::SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count) satır sonuna ekle
  69. #ifdef WJ_NEW_DROP_DIALOG
  70. bool CPythonNetworkStream::SendItemDestroyPacket(TItemPos pos)
  71. {
  72. if (!__CanActMainInstance())
  73. return true;
  74. TPacketCGItemDestroy itemDestroyPacket;
  75. itemDestroyPacket.header = HEADER_CG_ITEM_DESTROY;
  76. itemDestroyPacket.pos = pos;
  77. if (!Send(sizeof(itemDestroyPacket), &itemDestroyPacket))
  78. {
  79. Tracen("SendItemDestroyPacket Error");
  80. return false;
  81. }
  82. return SendSequence();
  83. }
  84. bool CPythonNetworkStream::SendItemSellPacket(TItemPos pos)
  85. {
  86. if (!__CanActMainInstance())
  87. return true;
  88. TPacketCGItemSell itemSellPacket;
  89. itemSellPacket.header = HEADER_CG_ITEM_SELL;
  90. itemSellPacket.pos = pos;
  91. if (!Send(sizeof(itemSellPacket), &itemSellPacket))
  92. {
  93. Tracen("SendItemSellPacket Error");
  94. return false;
  95. }
  96. return SendSequence();
  97. }
  98. #endif
  99. -------------------------------------------------------
  100. Server Source -> common/service.h Ekle;
  101. #define WJ_NEW_DROP_DIALOG
  102. Server Source -> game/char.h Arat : DropItem(TItemPos Cell, BYTE bCount=0); Altına ekle
  103. #ifdef WJ_NEW_DROP_DIALOG
  104. bool DestroyItem(TItemPos Cell);
  105. bool SellItem(TItemPos Cell, BYTE bCount=0);
  106. #endif
  107. Server Source -> game/char_item.cpp Arat : bool CHARACTER::DropItem(TItemPos Cell, BYTE bCount) Satır sonuna ekle
  108. #ifdef WJ_NEW_DROP_DIALOG
  109. bool CHARACTER::DestroyItem(TItemPos Cell)
  110. {
  111. LPITEM item = NULL;
  112. if (!CanHandleItem())
  113. {
  114. if (NULL != DragonSoul_RefineWindow_GetOpener())
  115. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화창을 연 상태에서는 아이템을 옮길 수 없습니다."));
  116. return false;
  117. }
  118. if (IsDead())
  119. return false;
  120. if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell)))
  121. return false;
  122. if (item->IsExchanging())
  123. return false;
  124. if (true == item->isLocked())
  125. return false;
  126. #ifdef WJ_SOULBINDING_SYSTEM
  127. if (item->IsBind() || item->IsUntilBind())
  128. {
  129. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("BIND_ITEM_NOT_DELETE"));
  130. return false;
  131. }
  132. #endif
  133. if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
  134. return false;
  135. if (item->GetCount() <= 0)
  136. return false;
  137. #ifdef WJ_GROWTH_PET_SYSTEM
  138. if (item->GetVnum() == 55701 || item->GetVnum() == 55702 || item->GetVnum() == 55703 || item->GetVnum() == 55704)
  139. if (GetNewPetSystem()->IsActivePet())
  140. return false;
  141. #endif
  142. SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 1000);
  143. ITEM_MANAGER::instance().RemoveItem(item);
  144. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ITEM_DESTROY_SUCCES"), item->GetName());
  145. return true;
  146. }
  147. bool CHARACTER::SellItem(TItemPos Cell, BYTE bCount)
  148. {
  149. LPITEM item = NULL;
  150. if (!CanHandleItem())
  151. {
  152. if (NULL != DragonSoul_RefineWindow_GetOpener())
  153. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화창을 연 상태에서는 아이템을 옮길 수 없습니다."));
  154. return false;
  155. }
  156. if (IsDead())
  157. return false;
  158. if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell)))
  159. return false;
  160. if (item->IsExchanging())
  161. return false;
  162. if (true == item->isLocked())
  163. return false;
  164. #ifdef WJ_SOULBINDING_SYSTEM
  165. if (item->IsBind() || item->IsUntilBind())
  166. {
  167. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("BIND_ITEM_NOT_SELL"));
  168. return false;
  169. }
  170. #endif
  171. if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_SELL))
  172. {
  173. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("THIS_ITEM_NOT_SELL"));
  174. return false;
  175. }
  176. if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
  177. return false;
  178. if (item->GetCount() <= 0)
  179. return false;
  180. #ifdef WJ_GROWTH_PET_SYSTEM
  181. if (item->GetVnum() == 55701 || item->GetVnum() == 55702 || item->GetVnum() == 55703 || item->GetVnum() == 55704)
  182. if (GetNewPetSystem()->IsActivePet())
  183. return false;
  184. #endif
  185. DWORD dwPrice;
  186. if (bCount == 0 || bCount > item->GetCount())
  187. bCount = item->GetCount();
  188. dwPrice = item->GetShopBuyPrice();
  189. if (IS_SET(item->GetFlag(), ITEM_FLAG_COUNT_PER_1GOLD))
  190. {
  191. if (dwPrice == 0)
  192. dwPrice = bCount;
  193. else
  194. dwPrice = bCount / dwPrice;
  195. }
  196. else
  197. dwPrice *= bCount;
  198. dwPrice /= 5;
  199. DWORD dwTax = 0;
  200. #ifdef ENABLE_NEWSTUFF
  201. if (g_iTaxes != 0)
  202. dwTax = dwPrice * g_iTaxes/100;
  203. #endif
  204. dwPrice -= dwTax;
  205. const int64_t nTotalMoney = static_cast<int64_t>(GetGold()) + static_cast<int64_t>(dwPrice);
  206. if (GOLD_MAX <= nTotalMoney)
  207. {
  208. sys_err("[OVERFLOW_GOLD] id %u name %s gold %u", GetPlayerID(), GetName(), GetGold());
  209. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20억냥이 초과하여 물품을 팔수 없습니다."));
  210. return false;
  211. }
  212. sys_log(0, "SHOP: SELL: %s item name: %s(x%d):%u price: %u", GetName(), item->GetName(), bCount, item->GetID(), dwPrice);
  213. #ifdef ENABLE_NEWSTUFF
  214. if (g_iTaxes > 0)
  215. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("판매금액의 %d %% 가 세금으로 나가게됩니다"), g_iTaxes);
  216. #endif
  217. DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), dwPrice);
  218. item->SetCount(item->GetCount() - bCount);
  219. PointChange(POINT_GOLD, dwPrice, false);
  220. ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ITEM_SELL_SUCCES"), item->GetName());
  221. return true;
  222. }
  223. #endif
  224. Server Source -> game/input.h Arat : ItemDrop2(LPCHARACTER ch, const char * data); Altına ekle
  225. #ifdef WJ_NEW_DROP_DIALOG
  226. void ItemDestroy(LPCHARACTER ch, const char * data);
  227. void ItemSell(LPCHARACTER ch, const char * data);
  228. #endif
  229. Server Source -> game/input_main.cpp Arat : void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) Satır sonuna ekle
  230. #ifdef WJ_NEW_DROP_DIALOG
  231. void CInputMain::ItemDestroy(LPCHARACTER ch, const char * data)
  232. {
  233. struct command_item_destroy * pinfo = (struct command_item_destroy *) data;
  234. if (ch)
  235. ch->DestroyItem(pinfo->Cell);
  236. }
  237. void CInputMain::ItemSell(LPCHARACTER ch, const char * data)
  238. {
  239. struct command_item_sell * pinfo = (struct command_item_sell *) data;
  240. if (ch)
  241. ch->SellItem(pinfo->Cell);
  242. }
  243. #endif
  244. Yeniden arat
  245. case HEADER_CG_ITEM_DROP2:
  246. if (!ch->IsObserverMode())
  247. ItemDrop2(ch, c_pData);
  248. break;
  249. Altına ekle
  250. #ifdef WJ_NEW_DROP_DIALOG
  251. case HEADER_CG_ITEM_DESTROY:
  252. if (!ch->IsObserverMode())
  253. ItemDestroy(ch, c_pData);
  254. break;
  255. case HEADER_CG_ITEM_SELL:
  256. if (!ch->IsObserverMode())
  257. ItemSell(ch, c_pData);
  258. break;
  259. #endif
  260. Server Source -> game/packet.h Arat : HEADER_CG_ITEM_DROP2 altına ekle
  261. #ifdef WJ_NEW_DROP_DIALOG
  262. HEADER_CG_ITEM_DESTROY = 21,
  263. HEADER_CG_ITEM_SELL = 22,
  264. #endif
  265. Tekrar arat: typedef struct command_item_drop2 satır sonuna ekle
  266. #ifdef WJ_NEW_DROP_DIALOG
  267. typedef struct command_item_destroy
  268. {
  269. BYTE header;
  270. TItemPos Cell;
  271. } TPacketCGItemDestroy;
  272. typedef struct command_item_sell
  273. {
  274. BYTE header;
  275. TItemPos Cell;
  276. } TPacketCGItemSell;
  277. #endif
  278. Server Source -> game/packet_info.cpp Arat ;
  279. Set(HEADER_CG_ITEM_DROP2, sizeof(TPacketCGItemDrop2), "ItemDrop2", false);
  280. Altına ekle
  281. #ifdef WJ_NEW_DROP_DIALOG
  282. Set(HEADER_CG_ITEM_DESTROY, sizeof(TPacketCGItemDestroy), "ItemDestroy", false);
  283. Set(HEADER_CG_ITEM_SELL, sizeof(TPacketCGItemSell), "ItemSell", false);
  284. #endif