Braxy 618 Posted August 4, 2023 Share Posted August 4, 2023 (edited) Download Center This is the hidden content, please Sign In or Sign Up or This is the hidden content, please Sign In or Sign Up Heyo, this is something i did a while ago, perhaps it will be of use for some. https://metin2.download/video/1TuHiFX0RtqWuXyyV0350K1bCqKHW1WE/.mp4 Edited August 4, 2023 by Braxy Core X - External 2 Internal 127 2 14 2 41 As long as I'll be a threat for you , i will always be your target :3 Link to comment Share on other sites More sharing options...
xGalardo 13 Posted August 5, 2023 Share Posted August 5, 2023 Hey! Thanks for the release! Maybe could it be possible to open as many boxes as you need until the inventory is full? So that the items are not drop on the ground when someone opens say 10,000pcs crates. Link to comment Share on other sites More sharing options...
Endymion 320 Posted August 6, 2023 Share Posted August 6, 2023 item->SetCount(MAX(0, item->GetCount() - loopCount)); if (item) item->Lock(false); You should no longer use the "item" pointer after using the SetCount function, which may delete this object. Link to comment Share on other sites More sharing options...
Braxy 618 Posted August 7, 2023 Author Share Posted August 7, 2023 (edited) 9 hours ago, Endymion said: item->SetCount(MAX(0, item->GetCount() - loopCount)); if (item) item->Lock(false); You should no longer use the "item" pointer after using the SetCount function, which may delete this object. You're right, git updated. Edited August 7, 2023 by Braxy As long as I'll be a threat for you , i will always be your target :3 Link to comment Share on other sites More sharing options...
Thrall 182 Posted August 8, 2023 Share Posted August 8, 2023 For who uses gold directly in chests, i added this: Spoiler case CSpecialItemGroup::GOLD: { // Prevents yang overfloww if (llItemCount + GetGold() >= GOLD_MAX) { ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("»ç¿ë Á¦ÇÑ·®À» ÃÊ°úÇÏ¿´½À´Ï´Ù.")); if (item) item->Lock(false); return false; } Link to comment Share on other sites More sharing options...
Braxy 618 Posted August 9, 2023 Author Share Posted August 9, 2023 9 hours ago, Thrall said: For who uses gold directly in chests, i added this: Hide contents case CSpecialItemGroup::GOLD: { // Prevents yang overfloww if (llItemCount + GetGold() >= GOLD_MAX) { ChatPacket(CHAT_TYPE_TALKING, LC_TEXT("»ç¿ë Á¦ÇÑ·®À» ÃÊ°úÇÏ¿´½À´Ï´Ù.")); if (item) item->Lock(false); return false; } PointChange already checks for the maximum gold limit. What you did will eventually stop the loop and you will lose the other chest items. (you can get a crash as well by calling the deleted item) If you want to atleast give the gold they can receive upon their gold limit you can do it like this: case CSpecialItemGroup::GOLD: { if (llItemCount + GetGold() > GOLD_MAX) llItemCount = MIN(llItemCount, GOLD_MAX - GetGold()); PointChange(POINT_GOLD, llItemCount); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You have received %d Yang."), llItemCount); } 1 As long as I'll be a threat for you , i will always be your target :3 Link to comment Share on other sites More sharing options...
PandiCore 9 Posted December 20, 2023 Share Posted December 20, 2023 Hi i have this problem in client source Severity Code Description Project File Line Suppression State Details Error (active) E0135 class "CPythonNetworkStream" has no member "SendOpenChestPacket" UserInterface F:\Server_file_2024_v.0.0.1\Client Source\source\UserInterface\PythonNetworkStreamPhaseGameItem.cpp 558 Error (active) E0020 identifier "__CanActMainInstance" is undefined UserInterface F:\Server_file_2024_v.0.0.1\Client Source\source\UserInterface\PythonNetworkStreamPhaseGameItem.cpp 560 Error (active) E0020 identifier "__PlayInventoryItemUseSound" is undefined UserInterface F:\Server_file_2024_v.0.0.1\Client Source\source\UserInterface\PythonNetworkStreamPhaseGameItem.cpp 562 Error (active) E0020 identifier "Send" is undefined UserInterface F:\Server_file_2024_v.0.0.1\Client Source\source\UserInterface\PythonNetworkStreamPhaseGameItem.cpp 569 Link to comment Share on other sites More sharing options...
Psycho 95 Posted December 24, 2023 Share Posted December 24, 2023 On 12/20/2023 at 9:53 AM, PandiCore said: Hi i have this problem in client source Severity Code Description Project File Line Suppression State Details Error (active) E0135 class "CPythonNetworkStream" has no member "SendOpenChestPacket" UserInterface F:\Server_file_2024_v.0.0.1\Client Source\source\UserInterface\PythonNetworkStreamPhaseGameItem.cpp 558 Error (active) E0020 identifier "__CanActMainInstance" is undefined UserInterface F:\Server_file_2024_v.0.0.1\Client Source\source\UserInterface\PythonNetworkStreamPhaseGameItem.cpp 560 Error (active) E0020 identifier "__PlayInventoryItemUseSound" is undefined UserInterface F:\Server_file_2024_v.0.0.1\Client Source\source\UserInterface\PythonNetworkStreamPhaseGameItem.cpp 562 Error (active) E0020 identifier "Send" is undefined UserInterface F:\Server_file_2024_v.0.0.1\Client Source\source\UserInterface\PythonNetworkStreamPhaseGameItem.cpp 569 PythonNetworkStreamPhaseGameItem.cpp paste this file Link to comment Share on other sites More sharing options...
rares2017 31 Posted February 19 Share Posted February 19 When I use ctrl+rclick it takes me back to login and this appears in syserr from ch1: Process: UNKNOWN HEADER: 146, LAST HEADER: 22(6), REMAIN BYTES: 1, fd: 19 Link to comment Share on other sites More sharing options...
Psycho 95 Posted February 19 Share Posted February 19 On 12/24/2023 at 5:19 PM, Psycho said: PythonNetworkStreamPhaseGameItem.cpp paste this file . Link to comment Share on other sites More sharing options...
Active+ Member m2Ciaran 389 Posted February 19 Active+ Member Share Posted February 19 for (int i = 0; i < ITEM_LIMIT_MAX_NUM; ++i) { long limitValue = item->GetProto()->aLimits[i].lValue; switch (item->GetProto()->aLimits[i].bType) { case LIMIT_LEVEL: if (GetLevel() < limitValue) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아이템의 레벨 제한보다 레벨이 낮습니다.")); return false; } break; } } I suggest everyone to add this piece of code to avoid players opening (Apprentice) level chest below required level Link to comment Share on other sites More sharing options...
rares2017 31 Posted February 20 Share Posted February 20 PythonNetworkStreamPhaseGameItem.cpp Spoiler #include "StdAfx.h" #include "PythonNetworkStream.h" #include "PythonItem.h" #include "PythonShop.h" #include "PythonExchange.h" #include "PythonSafeBox.h" #include "PythonCharacterManager.h" #include "AbstractPlayer.h" ////////////////////////////////////////////////////////////////////////// // SafeBox bool CPythonNetworkStream::SendSafeBoxMoneyPacket(BYTE byState, DWORD dwMoney) { assert(!"CPythonNetworkStream::SendSafeBoxMoneyPacket - 사용하지 않는 함수"); return false; // TPacketCGSafeboxMoney kSafeboxMoney; // kSafeboxMoney.bHeader = HEADER_CG_SAFEBOX_MONEY; // kSafeboxMoney.bState = byState; // kSafeboxMoney.dwMoney = dwMoney; // if (!Send(sizeof(kSafeboxMoney), &kSafeboxMoney)) // return false; // // return SendSequence(); } bool CPythonNetworkStream::SendSafeBoxCheckinPacket(TItemPos InventoryPos, BYTE bySafeBoxPos) { __PlayInventoryItemDropSound(InventoryPos); TPacketCGSafeboxCheckin kSafeboxCheckin; kSafeboxCheckin.bHeader = HEADER_CG_SAFEBOX_CHECKIN; kSafeboxCheckin.ItemPos = InventoryPos; kSafeboxCheckin.bSafePos = bySafeBoxPos; if (!Send(sizeof(kSafeboxCheckin), &kSafeboxCheckin)) return false; return SendSequence(); } bool CPythonNetworkStream::SendSafeBoxCheckoutPacket(BYTE bySafeBoxPos, TItemPos InventoryPos) { __PlaySafeBoxItemDropSound(bySafeBoxPos); TPacketCGSafeboxCheckout kSafeboxCheckout; kSafeboxCheckout.bHeader = HEADER_CG_SAFEBOX_CHECKOUT; kSafeboxCheckout.bSafePos = bySafeBoxPos; kSafeboxCheckout.ItemPos = InventoryPos; if (!Send(sizeof(kSafeboxCheckout), &kSafeboxCheckout)) return false; return SendSequence(); } #ifdef INCREASE_STACK_LIMIT bool CPythonNetworkStream::SendSafeBoxItemMovePacket(BYTE bySourcePos, BYTE byTargetPos, WORD byCount) #else bool CPythonNetworkStream::SendSafeBoxItemMovePacket(BYTE bySourcePos, BYTE byTargetPos, BYTE byCount) #endif { __PlaySafeBoxItemDropSound(bySourcePos); TPacketCGItemMove kItemMove; kItemMove.header = HEADER_CG_SAFEBOX_ITEM_MOVE; kItemMove.pos = TItemPos(INVENTORY, bySourcePos); kItemMove.num = byCount; kItemMove.change_pos = TItemPos(INVENTORY, byTargetPos); if (!Send(sizeof(kItemMove), &kItemMove)) return false; return SendSequence(); } bool CPythonNetworkStream::RecvSafeBoxSetPacket() { TPacketGCItemSet2 kItemSet; if (!Recv(sizeof(kItemSet), &kItemSet)) return false; TItemData kItemData; kItemData.vnum = kItemSet.vnum; kItemData.count = kItemSet.count; kItemData.flags = kItemSet.flags; kItemData.anti_flags = kItemSet.anti_flags; for (int isocket=0; isocket<ITEM_SOCKET_SLOT_MAX_NUM; ++isocket) kItemData.alSockets[isocket] = kItemSet.alSockets[isocket]; for (int iattr=0; iattr<ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++iattr) kItemData.aAttr[iattr] = kItemSet.aAttr[iattr]; CPythonSafeBox::Instance().SetItemData(kItemSet.Cell.cell, kItemData); __RefreshSafeboxWindow(); return true; } bool CPythonNetworkStream::RecvSafeBoxDelPacket() { TPacketGCItemDel kItemDel; if (!Recv(sizeof(kItemDel), &kItemDel)) return false; CPythonSafeBox::Instance().DelItemData(kItemDel.pos); __RefreshSafeboxWindow(); return true; } bool CPythonNetworkStream::RecvSafeBoxWrongPasswordPacket() { TPacketGCSafeboxWrongPassword kSafeboxWrongPassword; if (!Recv(sizeof(kSafeboxWrongPassword), &kSafeboxWrongPassword)) return false; PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnSafeBoxError", Py_BuildValue("()")); return true; } bool CPythonNetworkStream::RecvSafeBoxSizePacket() { TPacketGCSafeboxSize kSafeBoxSize; if (!Recv(sizeof(kSafeBoxSize), &kSafeBoxSize)) return false; CPythonSafeBox::Instance().OpenSafeBox(kSafeBoxSize.bSize); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenSafeboxWindow", Py_BuildValue("(i)", kSafeBoxSize.bSize)); return true; } bool CPythonNetworkStream::RecvSafeBoxMoneyChangePacket() { TPacketGCSafeboxMoneyChange kMoneyChange; if (!Recv(sizeof(kMoneyChange), &kMoneyChange)) return false; CPythonSafeBox::Instance().SetMoney(kMoneyChange.dwMoney); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshSafeboxMoney", Py_BuildValue("()")); return true; } // SafeBox ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // Mall bool CPythonNetworkStream::SendMallCheckoutPacket(BYTE byMallPos, TItemPos InventoryPos) { __PlayMallItemDropSound(byMallPos); TPacketCGMallCheckout kMallCheckoutPacket; kMallCheckoutPacket.bHeader = HEADER_CG_MALL_CHECKOUT; kMallCheckoutPacket.bMallPos = byMallPos; kMallCheckoutPacket.ItemPos = InventoryPos; if (!Send(sizeof(kMallCheckoutPacket), &kMallCheckoutPacket)) return false; return SendSequence(); } bool CPythonNetworkStream::RecvMallOpenPacket() { TPacketGCMallOpen kMallOpen; if (!Recv(sizeof(kMallOpen), &kMallOpen)) return false; CPythonSafeBox::Instance().OpenMall(kMallOpen.bSize); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenMallWindow", Py_BuildValue("(i)", kMallOpen.bSize)); return true; } bool CPythonNetworkStream::RecvMallItemSetPacket() { TPacketGCItemSet2 kItemSet; if (!Recv(sizeof(kItemSet), &kItemSet)) return false; TItemData kItemData; kItemData.vnum = kItemSet.vnum; kItemData.count = kItemSet.count; kItemData.flags = kItemSet.flags; kItemData.anti_flags = kItemSet.anti_flags; for (int isocket=0; isocket<ITEM_SOCKET_SLOT_MAX_NUM; ++isocket) kItemData.alSockets[isocket] = kItemSet.alSockets[isocket]; for (int iattr=0; iattr<ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++iattr) kItemData.aAttr[iattr] = kItemSet.aAttr[iattr]; CPythonSafeBox::Instance().SetMallItemData(kItemSet.Cell.cell, kItemData); __RefreshMallWindow(); return true; } bool CPythonNetworkStream::RecvMallItemDelPacket() { TPacketGCItemDel kItemDel; if (!Recv(sizeof(kItemDel), &kItemDel)) return false; CPythonSafeBox::Instance().DelMallItemData(kItemDel.pos); __RefreshMallWindow(); Tracef(" >> CPythonNetworkStream::RecvMallItemDelPacket\n"); return true; } // Mall ////////////////////////////////////////////////////////////////////////// // Item // Recieve bool CPythonNetworkStream::RecvItemSetPacket() { TPacketGCItemSet packet_item_set; if (!Recv(sizeof(TPacketGCItemSet), &packet_item_set)) return false; TItemData kItemData; kItemData.vnum = packet_item_set.vnum; kItemData.count = packet_item_set.count; kItemData.flags = 0; for (int i=0; i<ITEM_SOCKET_SLOT_MAX_NUM; ++i) kItemData.alSockets[i]=packet_item_set.alSockets[i]; for (int j=0; j<ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++j) kItemData.aAttr[j]=packet_item_set.aAttr[j]; IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); rkPlayer.SetItemData(packet_item_set.Cell, kItemData); __RefreshInventoryWindow(); return true; } bool CPythonNetworkStream::RecvItemSetPacket2() { TPacketGCItemSet2 packet_item_set; if (!Recv(sizeof(TPacketGCItemSet2), &packet_item_set)) return false; TItemData kItemData; kItemData.vnum = packet_item_set.vnum; kItemData.count = packet_item_set.count; kItemData.flags = packet_item_set.flags; kItemData.anti_flags = packet_item_set.anti_flags; for (int i=0; i<ITEM_SOCKET_SLOT_MAX_NUM; ++i) kItemData.alSockets[i]=packet_item_set.alSockets[i]; for (int j=0; j<ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++j) kItemData.aAttr[j]=packet_item_set.aAttr[j]; IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); rkPlayer.SetItemData(packet_item_set.Cell, kItemData); if (packet_item_set.highlight) PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Highlight_Item", Py_BuildValue("(ii)", packet_item_set.Cell.window_type, packet_item_set.Cell.cell)); __RefreshInventoryWindow(); return true; } bool CPythonNetworkStream::RecvItemUsePacket() { TPacketGCItemUse packet_item_use; if (!Recv(sizeof(TPacketGCItemUse), &packet_item_use)) return false; __RefreshInventoryWindow(); return true; } bool CPythonNetworkStream::RecvItemUpdatePacket() { TPacketGCItemUpdate packet_item_update; if (!Recv(sizeof(TPacketGCItemUpdate), &packet_item_update)) return false; IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); rkPlayer.SetItemCount(packet_item_update.Cell, packet_item_update.count); for (int i = 0; i < ITEM_SOCKET_SLOT_MAX_NUM; ++i) rkPlayer.SetItemMetinSocket(packet_item_update.Cell, i, packet_item_update.alSockets[i]); for (int j = 0; j < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++j) rkPlayer.SetItemAttribute(packet_item_update.Cell, j, packet_item_update.aAttr[j].bType, packet_item_update.aAttr[j].sValue); __RefreshInventoryWindow(); return true; } bool CPythonNetworkStream::RecvItemGroundAddPacket() { TPacketGCItemGroundAdd recv; if (!Recv(sizeof(TPacketGCItemGroundAdd), &recv)) return false; __GlobalPositionToLocalPosition(recv.lX, recv.lY); #ifdef ENABLE_EXTENDED_ITEMNAME_ON_GROUND CPythonItem::Instance().CreateItem(recv.dwVID, recv.dwVnum, recv.lX, recv.lY, recv.lZ, recv.dwCount, true, recv.alSockets, recv.aAttrs); #else CPythonItem::Instance().CreateItem(recv.dwVID, recv.dwVnum, recv.lX, recv.lY, recv.lZ); #endif return true; } bool CPythonNetworkStream::RecvItemOwnership() { TPacketGCItemOwnership p; if (!Recv(sizeof(TPacketGCItemOwnership), &p)) return false; CPythonItem::Instance().SetOwnership(p.dwVID, p.szName); return true; } bool CPythonNetworkStream::RecvItemGroundDelPacket() { TPacketGCItemGroundDel packet_item_ground_del; if (!Recv(sizeof(TPacketGCItemGroundDel), &packet_item_ground_del)) return false; CPythonItem::Instance().DeleteItem(packet_item_ground_del.vid); return true; } bool CPythonNetworkStream::RecvQuickSlotAddPacket() { TPacketGCQuickSlotAdd packet_quick_slot_add; if (!Recv(sizeof(TPacketGCQuickSlotAdd), &packet_quick_slot_add)) return false; IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); rkPlayer.AddQuickSlot(packet_quick_slot_add.pos, packet_quick_slot_add.slot.Type, packet_quick_slot_add.slot.Position); __RefreshInventoryWindow(); return true; } bool CPythonNetworkStream::RecvQuickSlotDelPacket() { TPacketGCQuickSlotDel packet_quick_slot_del; if (!Recv(sizeof(TPacketGCQuickSlotDel), &packet_quick_slot_del)) return false; IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); rkPlayer.DeleteQuickSlot(packet_quick_slot_del.pos); __RefreshInventoryWindow(); return true; } bool CPythonNetworkStream::RecvQuickSlotMovePacket() { TPacketGCQuickSlotSwap packet_quick_slot_swap; if (!Recv(sizeof(TPacketGCQuickSlotSwap), &packet_quick_slot_swap)) return false; IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); rkPlayer.MoveQuickSlot(packet_quick_slot_swap.pos, packet_quick_slot_swap.change_pos); __RefreshInventoryWindow(); return true; } bool CPythonNetworkStream::SendShopEndPacket() { if (!__CanActMainInstance()) return true; TPacketCGShop packet_shop; packet_shop.header = HEADER_CG_SHOP; packet_shop.subheader = SHOP_SUBHEADER_CG_END; if (!Send(sizeof(packet_shop), &packet_shop)) { Tracef("SendShopEndPacket Error\n"); return false; } return SendSequence(); } bool CPythonNetworkStream::SendShopBuyPacket(BYTE bPos) { if (!__CanActMainInstance()) return true; TPacketCGShop PacketShop; PacketShop.header = HEADER_CG_SHOP; PacketShop.subheader = SHOP_SUBHEADER_CG_BUY; if (!Send(sizeof(TPacketCGShop), &PacketShop)) { Tracef("SendShopBuyPacket Error\n"); return false; } BYTE bCount=1; if (!Send(sizeof(BYTE), &bCount)) { Tracef("SendShopBuyPacket Error\n"); return false; } if (!Send(sizeof(BYTE), &bPos)) { Tracef("SendShopBuyPacket Error\n"); return false; } return SendSequence(); } bool CPythonNetworkStream::SendShopSellPacket(BYTE bySlot) { if (!__CanActMainInstance()) return true; TPacketCGShop PacketShop; PacketShop.header = HEADER_CG_SHOP; PacketShop.subheader = SHOP_SUBHEADER_CG_SELL; if (!Send(sizeof(TPacketCGShop), &PacketShop)) { Tracef("SendShopSellPacket Error\n"); return false; } if (!Send(sizeof(BYTE), &bySlot)) { Tracef("SendShopAddSellPacket Error\n"); return false; } return SendSequence(); } #ifdef INCREASE_STACK_LIMIT typedef struct fckOFF { UINT bySlot; WORD byCount; } TfckOFF; bool CPythonNetworkStream::SendShopSellPacketNew(UINT bySlot, WORD byCount) { if (!__CanActMainInstance()) return true; TPacketCGShop PacketShop; PacketShop.header = HEADER_CG_SHOP; PacketShop.subheader = SHOP_SUBHEADER_CG_SELL2; TfckOFF second; second.byCount = byCount; second.bySlot = bySlot; if (!Send(sizeof(TPacketCGShop), &PacketShop)) { Tracef("SendShopSellPacket Error\n"); return false; } if (!Send(sizeof(TfckOFF), &second)) { Tracef("SendShopAddSellPacket Error\n"); return false; } /*if (!Send(sizeof(WORD), &byCount)) { Tracef("SendShopAddSellPacket Error\n"); return false; }*/ Tracef(" SendShopSellPacketNew(bySlot=%d, byCount=%u)\n", bySlot, byCount); return SendSequence(); } #else bool CPythonNetworkStream::SendShopSellPacketNew(UINT bySlot, BYTE byCount) { if (!__CanActMainInstance()) return true; TPacketCGShop PacketShop; PacketShop.header = HEADER_CG_SHOP; PacketShop.subheader = SHOP_SUBHEADER_CG_SELL2; if (!Send(sizeof(TPacketCGShop), &PacketShop)) { Tracef("SendShopSellPacket Error\n"); return false; } if (!Send(sizeof(UINT), &bySlot)) { Tracef("SendShopAddSellPacket Error\n"); return false; } if (!Send(sizeof(BYTE), &byCount)) { Tracef("SendShopAddSellPacket Error\n"); return false; } Tracef(" SendShopSellPacketNew(bySlot=%d, byCount=%d)\n", bySlot, byCount); return SendSequence(); } #endif // Send bool CPythonNetworkStream::SendItemUsePacket(TItemPos pos) { if (!__CanActMainInstance()) return true; if (__IsEquipItemInSlot(pos)) { if (CPythonExchange::Instance().isTrading()) { PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AppendNotifyMessage", Py_BuildValue("(s)", "CANNOT_EQUIP_EXCHANGE")); return true; } if (CPythonShop::Instance().IsOpen()) { PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AppendNotifyMessage", Py_BuildValue("(s)", "CANNOT_EQUIP_SHOP")); return true; } if (__IsPlayerAttacking()) return true; } __PlayInventoryItemUseSound(pos); TPacketCGItemUse itemUsePacket; itemUsePacket.header = HEADER_CG_ITEM_USE; itemUsePacket.pos = pos; if (!Send(sizeof(TPacketCGItemUse), &itemUsePacket)) { Tracen("SendItemUsePacket Error"); return false; } return SendSequence(); } #ifdef ENABLE_CHEST_OPEN_RENEWAL bool CPythonNetworkStream::SendOpenChestPacket(TItemPos pos, WORD wOpenCount) { if (!__CanActMainInstance()) return true; __PlayInventoryItemUseSound(pos); TPacketCGOpenChest chestUsePacket; chestUsePacket.header = HEADER_CG_CHEST_OPEN; chestUsePacket.pos = pos; chestUsePacket.wOpenCount = wOpenCount; if (!Send(sizeof(TPacketCGOpenChest), &chestUsePacket)) { Tracen("SendOpenChestPacket Error"); return false; } return SendSequence(); } #endif bool CPythonNetworkStream::SendItemUseToItemPacket(TItemPos source_pos, TItemPos target_pos) { if (!__CanActMainInstance()) return true; TPacketCGItemUseToItem itemUseToItemPacket; itemUseToItemPacket.header = HEADER_CG_ITEM_USE_TO_ITEM; itemUseToItemPacket.source_pos = source_pos; itemUseToItemPacket.target_pos = target_pos; if (!Send(sizeof(TPacketCGItemUseToItem), &itemUseToItemPacket)) { Tracen("SendItemUseToItemPacket Error"); return false; } #ifdef _DEBUG Tracef(" << SendItemUseToItemPacket(src=%d, dst=%d)\n", source_pos, target_pos); #endif return SendSequence(); } bool CPythonNetworkStream::SendItemDropPacket(TItemPos pos, DWORD elk) { if (!__CanActMainInstance()) return true; TPacketCGItemDrop itemDropPacket; itemDropPacket.header = HEADER_CG_ITEM_DROP; itemDropPacket.pos = pos; itemDropPacket.elk = elk; if (!Send(sizeof(TPacketCGItemDrop), &itemDropPacket)) { Tracen("SendItemDropPacket Error"); return false; } return SendSequence(); } bool CPythonNetworkStream::SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count) { if (!__CanActMainInstance()) return true; TPacketCGItemDrop2 itemDropPacket; itemDropPacket.header = HEADER_CG_ITEM_DROP2; itemDropPacket.pos = pos; itemDropPacket.gold = elk; itemDropPacket.count = count; if (!Send(sizeof(itemDropPacket), &itemDropPacket)) { Tracen("SendItemDropPacket Error"); return false; } return SendSequence(); } bool CPythonNetworkStream::__IsEquipItemInSlot(TItemPos uSlotPos) { IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); return rkPlayer.IsEquipItemInSlot(uSlotPos); } void CPythonNetworkStream::__PlayInventoryItemUseSound(TItemPos uSlotPos) { IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); DWORD dwItemID=rkPlayer.GetItemIndex(uSlotPos); CPythonItem& rkItem=CPythonItem::Instance(); rkItem.PlayUseSound(dwItemID); } void CPythonNetworkStream::__PlayInventoryItemDropSound(TItemPos uSlotPos) { IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); DWORD dwItemID=rkPlayer.GetItemIndex(uSlotPos); CPythonItem& rkItem=CPythonItem::Instance(); rkItem.PlayDropSound(dwItemID); } //void CPythonNetworkStream::__PlayShopItemDropSound(UINT uSlotPos) //{ // DWORD dwItemID; // CPythonShop& rkShop=CPythonShop::Instance(); // if (!rkShop.GetSlotItemID(uSlotPos, &dwItemID)) // return; // // CPythonItem& rkItem=CPythonItem::Instance(); // rkItem.PlayDropSound(dwItemID); //} void CPythonNetworkStream::__PlaySafeBoxItemDropSound(UINT uSlotPos) { DWORD dwItemID; CPythonSafeBox& rkSafeBox=CPythonSafeBox::Instance(); if (!rkSafeBox.GetSlotItemID(uSlotPos, &dwItemID)) return; CPythonItem& rkItem=CPythonItem::Instance(); rkItem.PlayDropSound(dwItemID); } void CPythonNetworkStream::__PlayMallItemDropSound(UINT uSlotPos) { DWORD dwItemID; CPythonSafeBox& rkSafeBox=CPythonSafeBox::Instance(); if (!rkSafeBox.GetSlotMallItemID(uSlotPos, &dwItemID)) return; CPythonItem& rkItem=CPythonItem::Instance(); rkItem.PlayDropSound(dwItemID); } #ifdef INCREASE_STACK_LIMIT bool CPythonNetworkStream::SendItemMovePacket(TItemPos pos, TItemPos change_pos, WORD num) #else bool CPythonNetworkStream::SendItemMovePacket(TItemPos pos, TItemPos change_pos, BYTE num) #endif { if (!__CanActMainInstance()) return true; if (__IsEquipItemInSlot(pos)) { if (CPythonExchange::Instance().isTrading()) { if (pos.IsEquipCell() || change_pos.IsEquipCell()) { PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AppendNotifyMessage", Py_BuildValue("(s)", "CANNOT_EQUIP_EXCHANGE")); return true; } } if (CPythonShop::Instance().IsOpen()) { if (pos.IsEquipCell() || change_pos.IsEquipCell()) { PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AppendNotifyMessage", Py_BuildValue("(s)", "CANNOT_EQUIP_SHOP")); return true; } } if (__IsPlayerAttacking()) return true; } __PlayInventoryItemDropSound(pos); TPacketCGItemMove itemMovePacket; itemMovePacket.header = HEADER_CG_ITEM_MOVE; itemMovePacket.pos = pos; itemMovePacket.change_pos = change_pos; itemMovePacket.num = num; if (!Send(sizeof(TPacketCGItemMove), &itemMovePacket)) { Tracen("SendItemMovePacket Error"); return false; } return SendSequence(); } bool CPythonNetworkStream::SendItemPickUpPacket(DWORD vid) { if (!__CanActMainInstance()) return true; TPacketCGItemPickUp itemPickUpPacket; itemPickUpPacket.header = HEADER_CG_ITEM_PICKUP; itemPickUpPacket.vid = vid; if (!Send(sizeof(TPacketCGItemPickUp), &itemPickUpPacket)) { Tracen("SendItemPickUpPacket Error"); return false; } return SendSequence(); } bool CPythonNetworkStream::SendQuickSlotAddPacket(UINT wpos, BYTE type, UINT pos) { if (!__CanActMainInstance()) return true; TPacketCGQuickSlotAdd quickSlotAddPacket; quickSlotAddPacket.header = HEADER_CG_QUICKSLOT_ADD; quickSlotAddPacket.pos = wpos; quickSlotAddPacket.slot.Type = type; quickSlotAddPacket.slot.Position = pos; if (!Send(sizeof(TPacketCGQuickSlotAdd), &quickSlotAddPacket)) { Tracen("SendQuickSlotAddPacket Error"); return false; } return SendSequence(); } bool CPythonNetworkStream::SendQuickSlotDelPacket(UINT pos) { if (!__CanActMainInstance()) return true; TPacketCGQuickSlotDel quickSlotDelPacket; quickSlotDelPacket.header = HEADER_CG_QUICKSLOT_DEL; quickSlotDelPacket.pos = pos; if (!Send(sizeof(TPacketCGQuickSlotDel), &quickSlotDelPacket)) { Tracen("SendQuickSlotDelPacket Error"); return false; } return SendSequence(); } bool CPythonNetworkStream::SendQuickSlotMovePacket(UINT pos, UINT change_pos) { if (!__CanActMainInstance()) return true; TPacketCGQuickSlotSwap quickSlotSwapPacket; quickSlotSwapPacket.header = HEADER_CG_QUICKSLOT_SWAP; quickSlotSwapPacket.pos = pos; quickSlotSwapPacket.change_pos = change_pos; if (!Send(sizeof(TPacketCGQuickSlotSwap), &quickSlotSwapPacket)) { Tracen("SendQuickSlotSwapPacket Error"); return false; } return SendSequence(); } bool CPythonNetworkStream::RecvSpecialEffect() { TPacketGCSpecialEffect kSpecialEffect; if (!Recv(sizeof(kSpecialEffect), &kSpecialEffect)) return false; DWORD effect = -1; bool bPlayPotionSound = false; //포션을 먹을 경우는 포션 사운드를 출력하자.!! bool bAttachEffect = true; //캐리터에 붙는 어태치 이펙트와 일반 이펙트 구분.!! switch (kSpecialEffect.type) { case SE_HPUP_RED: effect = CInstanceBase::EFFECT_HPUP_RED; bPlayPotionSound = true; break; case SE_SPUP_BLUE: effect = CInstanceBase::EFFECT_SPUP_BLUE; bPlayPotionSound = true; break; case SE_SPEEDUP_GREEN: effect = CInstanceBase::EFFECT_SPEEDUP_GREEN; bPlayPotionSound = true; break; case SE_DXUP_PURPLE: effect = CInstanceBase::EFFECT_DXUP_PURPLE; bPlayPotionSound = true; break; case SE_CRITICAL: effect = CInstanceBase::EFFECT_CRITICAL; break; case SE_PENETRATE: effect = CInstanceBase::EFFECT_PENETRATE; break; case SE_BLOCK: effect = CInstanceBase::EFFECT_BLOCK; break; case SE_DODGE: effect = CInstanceBase::EFFECT_DODGE; break; case SE_CHINA_FIREWORK: effect = CInstanceBase::EFFECT_FIRECRACKER; bAttachEffect = false; break; case SE_SPIN_TOP: effect = CInstanceBase::EFFECT_SPIN_TOP; bAttachEffect = false; break; case SE_SUCCESS : effect = CInstanceBase::EFFECT_SUCCESS ; bAttachEffect = false ; break ; case SE_FAIL : effect = CInstanceBase::EFFECT_FAIL ; break ; case SE_FR_SUCCESS: effect = CInstanceBase::EFFECT_FR_SUCCESS; bAttachEffect = false ; break; case SE_LEVELUP_ON_14_FOR_GERMANY: //레벨업 14일때 ( 독일전용 ) effect = CInstanceBase::EFFECT_LEVELUP_ON_14_FOR_GERMANY; bAttachEffect = false ; break; case SE_LEVELUP_UNDER_15_FOR_GERMANY: //레벨업 15일때 ( 독일전용 ) effect = CInstanceBase::EFFECT_LEVELUP_UNDER_15_FOR_GERMANY; bAttachEffect = false ; break; case SE_PERCENT_DAMAGE1: effect = CInstanceBase::EFFECT_PERCENT_DAMAGE1; break; case SE_PERCENT_DAMAGE2: effect = CInstanceBase::EFFECT_PERCENT_DAMAGE2; break; case SE_PERCENT_DAMAGE3: effect = CInstanceBase::EFFECT_PERCENT_DAMAGE3; break; case SE_AUTO_HPUP: effect = CInstanceBase::EFFECT_AUTO_HPUP; break; case SE_AUTO_SPUP: effect = CInstanceBase::EFFECT_AUTO_SPUP; break; case SE_EQUIP_RAMADAN_RING: effect = CInstanceBase::EFFECT_RAMADAN_RING_EQUIP; break; case SE_EQUIP_HALLOWEEN_CANDY: effect = CInstanceBase::EFFECT_HALLOWEEN_CANDY_EQUIP; break; case SE_EQUIP_HAPPINESS_RING: effect = CInstanceBase::EFFECT_HAPPINESS_RING_EQUIP; break; case SE_EQUIP_LOVE_PENDANT: effect = CInstanceBase::EFFECT_LOVE_PENDANT_EQUIP; break; default: TraceError("%d 는 없는 스페셜 이펙트 번호입니다.TPacketGCSpecialEffect",kSpecialEffect.type); break; } if (bPlayPotionSound) { IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); if(rkPlayer.IsMainCharacterIndex(kSpecialEffect.vid)) { CPythonItem& rkItem=CPythonItem::Instance(); rkItem.PlayUsePotionSound(); } } if (-1 != effect) { CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(kSpecialEffect.vid); if (pInstance) { if(bAttachEffect) pInstance->AttachSpecialEffect(effect); else pInstance->CreateSpecialEffect(effect); } } return true; } bool CPythonNetworkStream::RecvSpecificEffect() { TPacketGCSpecificEffect kSpecificEffect; if (!Recv(sizeof(kSpecificEffect), &kSpecificEffect)) return false; CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(kSpecificEffect.vid); //EFFECT_TEMP if (pInstance) { CInstanceBase::RegisterEffect(CInstanceBase::EFFECT_TEMP, "", kSpecificEffect.effect_file, false); pInstance->AttachSpecialEffect(CInstanceBase::EFFECT_TEMP); } return true; } bool CPythonNetworkStream::RecvDragonSoulRefine() { TPacketGCDragonSoulRefine kDragonSoul; if (!Recv(sizeof(kDragonSoul), &kDragonSoul)) return false; switch (kDragonSoul.bSubType) { case DS_SUB_HEADER_OPEN: PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_DragonSoulRefineWindow_Open", Py_BuildValue("()")); break; case DS_SUB_HEADER_REFINE_FAIL: case DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE: case DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL: case DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY: case DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL: case DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL: PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_DragonSoulRefineWindow_RefineFail", Py_BuildValue("(iii)", kDragonSoul.bSubType, kDragonSoul.Pos.window_type, kDragonSoul.Pos.cell)); break; case DS_SUB_HEADER_REFINE_SUCCEED: PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_DragonSoulRefineWindow_RefineSucceed", Py_BuildValue("(ii)", kDragonSoul.Pos.window_type, kDragonSoul.Pos.cell)); break; } return true; } Link to comment Share on other sites More sharing options...
rares2017 31 Posted February 20 Share Posted February 20 Link to comment Share on other sites More sharing options...
rares2017 31 Posted February 20 Share Posted February 20 With Active Sequence it doesn't work, without Active Sequence it works. Link to comment Share on other sites More sharing options...
Recommended Posts