Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 02/23/18 in all areas

  1. Hello. I was looking inside the official python files and I found a little fix for this: Let me explain a bit the problem. If you leave open the inventory/dragon soul inventory/expanded taskbar or the affected objects and then you are using quest for teleportation, the windows what you left open will be closed because of the quest and when the quest executed those windows what you left open before would be opened again, but the warp is killing this procedure and that happens what you can see in the video, the windows are there but you cannot see them. Btw you can close them with escape key. The fix is coming from webzen: Simple, just execute a .Hide() function before the Destroy function has been called on that object what is stuck on the main window after teleport and that's it. For example: interfaceModule.py -> Interface class -> Close function: if self.wndInventory: self.wndInventory.Hide()#fix self.wndInventory.Destroy() if self.wndDragonSoul: self.wndDragonSoul.Hide()#fix self.wndDragonSoul.Destroy()
    1 point
  2. M2 Download Center Download Here ( Internal ) Hi, I've released magc cave dungeon so i'm releasing one of the bosses for free. The model is took from blade and soul, i just edited it a little for metin. You need granny 2.9 for this boss. Pack including model + effects. Download
    1 point
  3. 1 point
  4. Technically, this is a work-around, because the previous "ghost interface" is still there, but it remains just hidden (undeleted). You get such bug due to a python's garbage collector "issue/condition" when destroying the relative class: Since, in your case, the class' object count is higher than 1, when deleting self, the object count is decreased by 1, but since it doesn't still become 0, self doesn't get destroyed at all. (and del self.wndInventory wouldn't trigger def __del__ either) Normally, the object count for gui instances should remain as 1, but (mostly in every case) if someone during a .SetEvent (or similar) passed the self parameter without proxing it (proxy=creating a weak uncounted instance of self), it will lead to create 2 self instances in two different modules (interfaceModule and ui in this case), which means the object count will be >=2, and then you'll get a "ghost interface" when rewarping. Even so, considering everything beside self gets still deleted (i mean, its internal elements get deleted except the methods; that's why ESC still works), putting a .Hide() in there is still safe. (the memory leak would still remain unfixed though; maybe after retriggering the bug the "ghost interface" gets deleted, but a new one would still be generated to replace it)
    1 point
  5. 1 point
  6. // Open service.h and add #define ENABLE_VNUMRANGE // 1. Open ClientManagerBoot.cpp and earch enum IProtoT and after , value5 add #ifdef ENABLE_VNUMRANGE , vnum_range #endif // 2. Search bool CClientManager::InitializeItemTableFromDB() and after , value5" add #ifdef ENABLE_VNUMRANGE " , vnum_range" #endif // or replace the function with bool CClientManager::InitializeItemTableFromDB() { char query[2048]; fprintf(stdout, "Loading item_proto from MySQL\n"); snprintf(query, sizeof(query), "SELECT vnum, type, subtype, name, %s, gold, shop_buy_price, weight, size," " flag, wearflag, antiflag, immuneflag+0, refined_vnum, refine_set, magic_pct," " socket_pct, addon_type, limittype0, limitvalue0, limittype1, limitvalue1," " applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2," " value0, value1, value2, value3, value4, value5" #ifdef ENABLE_VNUMRANGE " , vnum_range" #endif " FROM item_proto%s ORDER BY vnum;", g_stLocaleNameColumn.c_str(), GetTablePostfix() ); // 3. Search VERIFY_IFIELD(IProto::addon_type, item_table->sAddonType); and after add #ifdef ENABLE_VNUMRANGE VERIFY_IFIELD(IProto::vnum_range, item_table->dwVnumRange); #endif // 4. Open player.item_proto, select Design Table and add `vnum_range` tinyint(4) NOT NULL DEFAULT '0',
    1 point
  7. Pack Mob With Effect v1 4 Mob & 1 Boss DOWNLOAD Password: www.betefilase.jimdo.com
    1 point
  8. Hello again, finally I fount the solution for this bug! In char_quickslot.cpp Search this: void CHARACTER::SyncQuickslot(BYTE bType, BYTE bOldPos, BYTE bNewPos) Replace with this: void CHARACTER::SyncQuickslot(BYTE bType, WORD bOldPos, WORD bNewPos) Search this: bool CHARACTER::GetQuickslot(BYTE pos, TQuickslot ** ppSlot) Replace: bool CHARACTER::GetQuickslot(WORD pos, TQuickslot ** ppSlot) Search this: bool CHARACTER::SetQuickslot(BYTE pos, TQuickslot & rSlot) Replace: bool CHARACTER::SetQuickslot(WORD pos, TQuickslot & rSlot) Search this: bool CHARACTER::DelQuickslot(BYTE pos) Replace: bool CHARACTER::DelQuickslot(WORD pos) Search this: bool CHARACTER::SwapQuickslot(BYTE a, BYTE Replace bool CHARACTER::SwapQuickslot(WORD a, WORD Search this: void CHARACTER::ChainQuickslotItem(LPITEM pItem, BYTE bType, WORD bOldPos) Replace: void CHARACTER::ChainQuickslotItem(LPITEM pItem, BYTE bType, WORD bOldPos) Search this: if (bNewPos == 255) And replace the 255 with 400 for example. Search this in all files: SyncQuickslot( And where you find 255, replace them with 400. For example, I have this in char_item.cpp: SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 255); And I have to replace it like this: SyncQuickslot(QUICKSLOT_TYPE_ITEM, i, 400); In char.h search this: void SyncQuickslot(BYTE bType, BYTE bOldPos, BYTE bNewPos); Replace: void SyncQuickslot(BYTE bType, WORD bOldPos, WORD bNewPos); Search this: bool GetQuickslot(BYTE pos, TQuickslot ** ppSlot); Replace: bool GetQuickslot(WORD pos, TQuickslot ** ppSlot); Search this: bool SetQuickslot(BYTE pos, TQuickslot & rSlot); Replace: bool SetQuickslot(WORD pos, TQuickslot & rSlot); Search this: bool DelQuickslot(BYTE pos); Replace: bool DelQuickslot(WORD pos); Search this: bool SwapQuickslot(BYTE a, BYTE ; Replace: bool SwapQuickslot(WORD a, WORD ; Search this: void ChainQuickslotItem(LPITEM pItem, BYTE bType, BYTE bOldPos); Replace: void ChainQuickslotItem(LPITEM pItem, BYTE bType, WORD bOldPos); In packet.h search this: typedef struct command_quickslot_add { BYTE header; BYTE pos; TQuickslot slot; } TPacketCGQuickslotAdd; typedef struct command_quickslot_del { BYTE header; BYTE pos; } TPacketCGQuickslotDel; typedef struct command_quickslot_swap { BYTE header; BYTE pos; BYTE change_pos; } TPacketCGQuickslotSwap; Replace: typedef struct command_quickslot_add { BYTE header; WORD pos; TQuickslot slot; } TPacketCGQuickslotAdd; typedef struct command_quickslot_del { BYTE header; WORD pos; } TPacketCGQuickslotDel; typedef struct command_quickslot_swap { BYTE header; WORD pos; WORD change_pos; } TPacketCGQuickslotSwap; Search this: struct packet_quickslot_add { BYTE header; BYTE pos; TQuickslot slot; }; struct packet_quickslot_del { BYTE header; BYTE pos; }; struct packet_quickslot_swap { BYTE header; BYTE pos; BYTE pos_to; }; Replace: struct packet_quickslot_add { BYTE header; WORD pos; TQuickslot slot; }; struct packet_quickslot_del { BYTE header; WORD pos; }; struct packet_quickslot_swap { BYTE header; WORD pos; WORD pos_to; }; In common/tables.h search this: typedef struct SQuickslot { BYTE type; BYTE pos; } TQuickslot; Replace: typedef struct SQuickslot { BYTE type; WORD pos; } TQuickslot; Next, in the client, UserInterface/packet.h search this: typedef struct command_quickslot_add { BYTE header; BYTE pos; TQuickSlot slot; }TPacketCGQuickSlotAdd; typedef struct command_quickslot_del { BYTE header; BYTE pos; }TPacketCGQuickSlotDel; typedef struct command_quickslot_swap { BYTE header; BYTE pos; BYTE change_pos; }TPacketCGQuickSlotSwap; Replace: typedef struct command_quickslot_add { BYTE header; WORD pos; TQuickSlot slot; }TPacketCGQuickSlotAdd; typedef struct command_quickslot_del { BYTE header; WORD pos; }TPacketCGQuickSlotDel; typedef struct command_quickslot_swap { BYTE header; WORD pos; WORD change_pos; }TPacketCGQuickSlotSwap; Search this: typedef struct packet_quickslot_add { BYTE header; BYTE pos; TQuickSlot slot; } TPacketGCQuickSlotAdd; typedef struct packet_quickslot_del { BYTE header; BYTE pos; } TPacketGCQuickSlotDel; typedef struct packet_quickslot_swap { BYTE header; BYTE pos; BYTE change_pos; } TPacketGCQuickSlotSwap; Replace: typedef struct packet_quickslot_add { BYTE header; WORD pos; TQuickSlot slot; } TPacketGCQuickSlotAdd; typedef struct packet_quickslot_del { BYTE header; WORD pos; } TPacketGCQuickSlotDel; typedef struct packet_quickslot_swap { BYTE header; WORD pos; WORD change_pos; } TPacketGCQuickSlotSwap; In GameType.h search this: typedef struct SQuickSlot { BYTE Type; BYTE Position; } TQuickSlot; Replace: typedef struct SQuickSlot { BYTE Type; WORD Position; } TQuickSlot; In AbstractPlayer.h search this: virtual void AddQuickSlot(int QuickslotIndex, char IconType, char IconPosition) = 0; Replace: virtual void AddQuickSlot(int QuickslotIndex, char IconType, WORD IconPosition) = 0; In PythonNetworkStream.h search this: bool SendQuickSlotAddPacket(BYTE wpos, BYTE type, BYTE pos); bool SendQuickSlotDelPacket(BYTE wpos); bool SendQuickSlotMovePacket(BYTE wpos, BYTE change_pos); Replace: bool SendQuickSlotAddPacket(WORD wpos, BYTE type, WORD pos); bool SendQuickSlotDelPacket(WORD wpos); bool SendQuickSlotMovePacket(WORD wpos, WORD change_pos); In PythonNetworkStreamPhaseGameItem.cpp search this: bool CPythonNetworkStream::SendQuickSlotAddPacket(BYTE wpos, BYTE type, BYTE pos) Replace: bool CPythonNetworkStream::SendQuickSlotAddPacket(BYTE wpos, BYTE type, BYTE pos) Search this: bool CPythonNetworkStream::SendQuickSlotDelPacket(BYTE pos) Replace: bool CPythonNetworkStream::SendQuickSlotDelPacket(WORD pos) Search this: bool CPythonNetworkStream::SendQuickSlotMovePacket(BYTE pos, BYTE change_pos) Replace: bool CPythonNetworkStream::SendQuickSlotMovePacket(WORD pos, WORD change_pos) In PythonPlayer.cpp search this: for (BYTE i = 0; i < QUICKSLOT_MAX_NUM; ++i) Replace: for (WORD i = 0; i < QUICKSLOT_MAX_NUM; ++i) Search this: rkNetStream.SendQuickSlotMovePacket((BYTE) dwGlobalSrcSlotIndex, (BYTE)dwGlobalDstSlotIndex); Replace: rkNetStream.SendQuickSlotMovePacket((WORD) dwGlobalSrcSlotIndex, (WORD)dwGlobalDstSlotIndex); Search this: rkNetStream.SendQuickSlotAddPacket((BYTE)dwGlobalSlotIndex, (BYTE)dwWndType, (BYTE)dwWndItemPos); Replace: rkNetStream.SendQuickSlotAddPacket((WORD)dwGlobalSlotIndex, (BYTE)dwWndType, (WORD)dwWndItemPos); Search this: rkNetStream.SendQuickSlotAddPacket((BYTE)dwGlobalQuickSlotIndex, (BYTE)dwWndType, (BYTE)dwWndItemPos); Replace: rkNetStream.SendQuickSlotAddPacket((WORD)dwGlobalQuickSlotIndex, (BYTE)dwWndType, (WORD)dwWndItemPos); Search this: rkNetStream.SendQuickSlotDelPacket((BYTE)dwGlobalSlotIndex); Replace: rkNetStream.SendQuickSlotDelPacket((WORD)dwGlobalSlotIndex); Search this: void CPythonPlayer::AddQuickSlot(int QuickSlotIndex, char IconType, char IconPosition) Replace: void CPythonPlayer::AddQuickSlot(int QuickSlotIndex, char IconType, WORD IconPosition) In PythonPlayer.h search this: void AddQuickSlot(int QuickslotIndex, char IconType, char IconPosition); Replace: void AddQuickSlot(int QuickslotIndex, char IconType, WORD IconPosition); Kind regards, Randomize
    1 point
  9. Hi there, I did this long time ago and i was thinking to share it, is not something wow but im still new in c++ and i dont really understand evrything so if u find any bugs in this system you are free to say.Search in server/game/pvp.cpp for : Add under : Ok now we implement a function im not the author of it , the author is fcsk_aim So in pvp.cpp we search for: In pvp.h we search this: Now we finished with this function that helps us to check if a player is in a duel. We open char_item.cpp and we search and add under: I think thats it,I will come later with extra code for banning other potions like normal red or blessing. Have a nice day. Best regards Root.
    0 points
  10. With this function, the d.new_jump_all etc are SHIT!!! Open dungeon.h void JoinParty_Coords(LPPARTY pParty, long X, long Y); void Join_Coords(LPCHARACTER ch, long X, long Y); Open dungeon.cpp struct FWarpToDungeonCoords { FWarpToDungeonCoords(long lMapIndex, long X, long Y, LPDUNGEON d) : m_lMapIndex(lMapIndex), m_x(X), m_y(Y), m_pkDungeon(d) { } void operator () (LPCHARACTER ch) { ch->SaveExitLocation(); ch->WarpSet(m_x, m_y, m_lMapIndex); } long m_lMapIndex; long m_x; long m_y; LPDUNGEON m_pkDungeon; }; void CDungeon::Join_Coords(LPCHARACTER ch, long X, long Y) { if (SECTREE_MANAGER::instance().GetMap(m_lMapIndex) == NULL) { sys_err("CDungeon: SECTREE_MAP not found for #%ld", m_lMapIndex); return; } X*=100; Y*=100; FWarpToDungeonCoords(m_lMapIndex, X, Y, this) (ch); } void CDungeon::JoinParty_Coords(LPPARTY pParty, long X, long Y) { pParty->SetDungeon(this); m_map_pkParty.insert(std::make_pair(pParty,0)); if (SECTREE_MANAGER::instance().GetMap(m_lMapIndex) == NULL) { sys_err("CDungeon: SECTREE_MAP not found for #%ld", m_lMapIndex); return; } X*=100; Y*=100; FWarpToDungeonCoords f(m_lMapIndex, X, Y, this); pParty->ForEachOnlineMember(f); } questlua_dungeon.cpp int dungeon_join_coords(lua_State* L) { if (lua_gettop(L)<3 || !lua_isnumber(L,1) || !lua_isnumber(L, 2) || !lua_isnumber(L,3)) { sys_err("not enough argument"); return 0; } long lMapIndex = (long)lua_tonumber(L, 1); LPDUNGEON pDungeon = CDungeonManager::instance().Create(lMapIndex); if (!pDungeon) return 0; LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch->GetParty() && ch->GetParty()->GetLeaderPID() == ch->GetPlayerID()) pDungeon->JoinParty_Coords(ch->GetParty(), (long)lua_tonumber(L, 2), (long)lua_tonumber(L, 3)); else if (!ch->GetParty()) pDungeon->Join_Coords(ch, (long)lua_tonumber(L, 2), (long)lua_tonumber(L, 3)); return 0; } { "join_coords", dungeon_join_coords }, //INTO RegisterDungeonFunctionTable()
    0 points
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.