rares2017
-
Posts
38 -
Joined
-
Last visited
-
Feedback
0%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Posts posted by rares2017
-
-
Hello everyone, has anyone else had this problem after implementing Race Height of Actors, sometimes it works, sometimes it doesn't.
-
With Active Sequence it doesn't work, without Active Sequence it works.
-
-
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; }
-
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 -
Can anyone tell me how I can make time appear next to the owner name and not above?
-
2 hours ago, nazox said:
Sorry to revive this, thanks Mali for release, i have 1 problem, i can't see white effect, only flash effect, this problem is from uiinventory ?
https://metin2.download/picture/SzcrbFhG2wOlr5v35oD46R2B2RJOHpmL/.gif
I don't have sysser and all work great only i have this problem, you can give me any idea? thanks again.
Check ActivateSlot function in ui.py if you have sash system, it may be ActivateSlotOld
- 1
-
Hi, can someone help me with tooltip for hp mast hydra dungeon.
if app.ENABLE_DEFENSE_WAVE: self.MastHp = self.GetChild("MastHp") self.MastWindow = self.GetChild("MastWindow") self.MastHp.OnMouseOverIn = ui.__mem_func__(self.MastHp.ShowToolTip) self.MastHp.OnMouseOverOut = ui.__mem_func__(self.MastHp.HideToolTip) self.MastHp.SetShowToolTipEvent(self.MastHp.OnMouseOverIn) self.MastHp.SetHideToolTipEvent(self.MastHp.OnMouseOverOut)
-
Problem solved, for who else has the problem check #define ENABLE_MOUNT_ENTITY_REFRESH
-
Hi, I also have a problem with synchronization I think or do not know exactly what it could be, the problem manifests itself as follows, when I ride a mount if I get off the mount while walking gives me back, but if I I stop and after I get down I don't back down, there is another problem with the skills, I left a video below to make it easier for you to figure out what I mean.
Sorry for my English.https://metin2.download/video/YJ0SyhsqK7gPSGhRb0FaDVj6B8kP8mE9/.mp4
-
On 8/25/2021 at 11:33 PM, Klaus said:
It works perfectly! Is it possible to change it to when the item is locked and click on it to pick up? In other words, leave the filter only on the 'Z' key?
I want this too.
- 1
- 1
-
2 minutes ago, SCOOB said:
I tried but it shows the same error
https://metin2.download/picture/m8H83at85155R2AM7T7V0WJu0u0y8gx0/.png
-
1 minute ago, SCOOB said:
oh okay, so I need to update my binary source. got it.
Any work-around it until then? Thanks.
I had this problem too and it was solved with #include "../gamelib/ItemData.h" in PythonSystem.h
-
16 minutes ago, SCOOB said:
I have this error, do you know how to solve it? https://metin2.download/picture/PzF9oR0lJ8vytSpwvBrzW2M15l2na3H8/.png
#include "../gamelib/ItemData.h" in PythonSystem.h
-
-
On 10/8/2021 at 12:22 AM, forum80 said:
costume weapon system does not work
https://metin2.download/picture/Qp37pr645dVZ03wa0svi3yh6hU3tW32M/.gif
https://metin2.download/video/0cGdnnFzp38qLY62f55c3PM1mdsc4r31/.mp4
-
How can I make all the elements appear if I have more?
-
5 minutes ago, Maze said:
@Mali
if constInfo.IS_BLEND_POTION_PERM(itemVnum):
r, g, b = (255.00 / 255.0), (102.00 / 255.0), (178.00 / 255.0)
elif constInfo.IS_BLEND_POTION_NORM(itemVnum):
r, g, b = (255.00 / 200.0), (255.00 / 255.0), (204.00 / 255.0)
else:
r, g, b = (153.00 / 200.0), (76.00 / 255.0), (0.00 / 255.0)
how do i use for example here?if constInfo.IS_BLEND_POTION_PERM(itemVnum):
isActivated = 0 != metinSocket[1]
if isActivated:
self.wndItem.ActivateSlot(i)
self.wndItem.SetSlotDiffuseColor(i, wndMgr.COLOR_TYPE_PURPLE) (or whatever color you want)
self.wndItem.SetSlotFlashEffect(i, True)
else:
self.wndItem.DeactivateSlot(i)- 1
-
1 hour ago, Maze said:
@Mali flash not work
Syserr:
0924 16:27:16495 :: uiInventory:1679: RuntimeWarning: tp_compare didn't return -1 or -2 for exception
0924 16:27:16495 :: Traceback (most recent call last):
0924 16:27:16495 :: File "game.py", line 838, in RefreshInventory
0924 16:27:16495 :: File "interfaceModule.py", line 692, in RefreshInventory
0924 16:27:16495 :: File "uiInventory.py", line 840, in RefreshItemSlot
0924 16:27:16495 :: File "uiInventory.py", line 765, in RefreshBagSlotWindow
0924 16:27:16495 :: File "uiInventory.py", line 1679, in __HighlightSlot_Refresh
0924 16:27:16495 :: SystemError
0924 16:27:16495 :: :
0924 16:27:16495 :: ..\Objects\longobject.c:998: bad argument to internal functionScriptLib/PythonUtils.cpp
comment #define PyLong_AsUnsignedLong PyLong_AsUnsignedLongLong. -
1 hour ago, EAkar said:
The effect comes when an object comes to the 2nd inventory. But when you move the mouse over the object, the effect does not go away.
I do not recommend using any of the systems it shares. It's always causing trouble and it's problematic. It also does not offer support.
Keep using Lent's reflection system and using the martysama highlight system. Because they are the best.
System it's working very well:
https://metin2.download/video/RZDy3YOtC8YauoW83ULww0GU2SXtJl76/.mp4- 3
- 2
- 3
-
I'm getting this error
Spoiler0924 16:27:16495 :: uiInventory:1679: RuntimeWarning: tp_compare didn't return -1 or -2 for exception
0924 16:27:16495 :: Traceback (most recent call last):
0924 16:27:16495 :: File "game.py", line 838, in RefreshInventory
0924 16:27:16495 :: File "interfaceModule.py", line 692, in RefreshInventory
0924 16:27:16495 :: File "uiInventory.py", line 840, in RefreshItemSlot
0924 16:27:16495 :: File "uiInventory.py", line 765, in RefreshBagSlotWindow
0924 16:27:16495 :: File "uiInventory.py", line 1679, in __HighlightSlot_Refresh
0924 16:27:16495 :: SystemError
0924 16:27:16495 :: :
0924 16:27:16495 :: ..\Objects\longobject.c:998: bad argument to internal function- 1
- 1
- 1
-
9 hours ago, Denizeri24 said:
if (Windowed) { m_isWindowed = true; RECT workArea; SystemParametersInfo(SPI_GETWORKAREA, 0, &workArea, 0); const UINT workAreaWidth = (workArea.right - workArea.left); const UINT workAreaHeight = (workArea.bottom - workArea.top); const UINT windowWidth = m_pySystem.GetWidth() + GetSystemMetrics(SM_CXBORDER) * 2 + GetSystemMetrics(SM_CXDLGFRAME) * 2 + GetSystemMetrics(SM_CXFRAME) * 2; const UINT windowHeight = m_pySystem.GetHeight() + GetSystemMetrics(SM_CYBORDER) * 2 + GetSystemMetrics(SM_CYDLGFRAME) * 2 + GetSystemMetrics(SM_CYFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION); const UINT x = workAreaWidth / 2 - windowWidth / 2; const UINT y = workAreaHeight / 2 - windowHeight / 2; SetPosition(x, y); } else { m_isWindowed = false; SetPosition(0, 0); }
It works perfectly. Thanks.
-
9 minutes ago, Maze said:
I have it like this, but only the first window is centered on me, the second keeps appearing further to the side
Just comment function for second window.
-
Race Height of Actors
in Features & Metin2 Systems
Posted
Same