Jodie 4 Posted August 7, 2016 Share Posted August 7, 2016 I was looking at metin2client.bin about the new functions. I wanted to share one function with you. They're probably using this for new systems. So, let's do this Open PythonPlayerModule.cpp PyObject * playerWindowTypeToSlotType(PyObject * poSelf, PyObject * poArgs) { int iWindowType = 0; if (!PyTuple_GetInteger(poArgs, 0, &iWindowType)) return Py_BuildException(); return Py_BuildValue("i", WindowTypeToSlotType(iWindowType)); } Search this { "SendDragonSoulRefine", playerSendDragonSoulRefine, METH_VARARGS }, Add this { "WindowTypeToSlotType", playerWindowTypeToSlotType, METH_VARARGS }, Open GameType.h and search this BYTE SlotTypeToInvenType(BYTE bSlotType); After add this BYTE WindowTypeToSlotType(BYTE bWindowType); Open GameType.cpp and add this. BYTE c_aWindowTypeToSlotType[WINDOW_TYPE_MAX] = { RESERVED_WINDOW, // SLOT_TYPE_NONE SLOT_TYPE_INVENTORY, // SLOT_TYPE_INVENTORY RESERVED_WINDOW, // SLOT_TYPE_NONE SLOT_TYPE_SAFEBOX, // SLOT_TYPE_SAFEBOX SLOT_TYPE_MALL, // SLOT_TYPE_MALL SLOT_TYPE_DRAGON_SOUL_INVENTORY, // SLOT_TYPE_DRAGON_SOUL_INVENTORY RESERVED_WINDOW, // SLOT_TYPE_NONE RESERVED_WINDOW, // SLOT_TYPE_NONE }; BYTE WindowTypeToSlotType(BYTE bWindowType) { if (bWindowType >= WINDOW_TYPE_MAX) return RESERVED_WINDOW; return c_aWindowTypeToSlotType[bWindowType]; } - Jodie 3 Link to comment Share on other sites More sharing options...
Honorable Member xP3NG3Rx 19751 Posted August 9, 2016 Honorable Member Share Posted August 9, 2016 (edited) Khm.. enum EWindows { RESERVED_WINDOW, INVENTORY, // ±âş» ŔÎşĄĹ丮. (45Ä ÂĄ¸®°ˇ 2ĆäŔĚÁö Á¸Ŕç = 90Ä) EQUIPMENT, SAFEBOX, MALL, DRAGON_SOUL_INVENTORY, BELT_INVENTORY, // NOTE: W2.1 ąöŔüżˇ »ő·Î Ăß°ˇµÇ´Â ş§Ć® ˝˝·Ô ľĆŔĚĹŰŔĚ Á¦°řÇĎ´Â ş§Ć® ŔÎşĄĹ丮 #ifdef ENABLE_GUILDRENEWAL_SYSTEM GUILDBANK, #endif #ifdef ENABLE_ACCE_COSTUME_SYSTEM ACCEREFINE, #endif GROUND, // NOTE: 2013łâ 2żů5ŔĎ ÇöŔç±îÁö unused.. żÖ Ŕִ°ĹÁö??? #ifdef ENABLE_GROWTH_PET_SYSTEM PET_FEED, #endif #ifdef ENABLE_CHANGE_LOOK_SYSTEM CHANGELOOK, #endif WINDOW_TYPE_MAX, }; BYTE c_aSlotTypeToInvenType[SLOT_TYPE_MAX] = { RESERVED_WINDOW, // SLOT_TYPE_NONE INVENTORY, // SLOT_TYPE_INVENTORY RESERVED_WINDOW, // SLOT_TYPE_SKILL RESERVED_WINDOW, // SLOT_TYPE_EMOTION RESERVED_WINDOW, // SLOT_TYPE_SHOP RESERVED_WINDOW, // SLOT_TYPE_EXCHANGE_OWNER RESERVED_WINDOW, // SLOT_TYPE_EXCHANGE_TARGET RESERVED_WINDOW, // SLOT_TYPE_QUICK_SLOT RESERVED_WINDOW, // SLOT_TYPE_SAFEBOX <- SAFEBOX, MALLŔÇ °ćżě Çϵĺ ÄÚµůµÇľîŔÖ´Â LEGACY Äڵ带 ŔŻÁöÇÔ. #ifdef ENABLE_GUILDRENEWAL_SYSTEM GUILDBANK, // SLOT_TYPE_GUILDBANK #endif #ifdef ENABLE_ACCE_COSTUME_SYSTEM SLOT_TYPE_ACCE, // ACCEREFINE #endif RESERVED_WINDOW, // SLOT_TYPE_PRIVATE_SHOP RESERVED_WINDOW, // SLOT_TYPE_MALL <- SAFEBOX, MALLŔÇ °ćżě Çϵĺ ÄÚµůµÇľîŔÖ´Â LEGACY Äڵ带 ŔŻÁöÇÔ. DRAGON_SOUL_INVENTORY, // SLOT_TYPE_DRAGON_SOUL_INVENTORY #ifdef ENABLE_GROWTH_PET_SYSTEM PET_FEED, // SLOT_TYPE_PET_FEED_WINDOW #endif EQUIPMENT, // SLOT_TYPE_EQUIPMENT BELT_INVENTORY, // SLOT_TYPE_BELT_INVENTORY #ifdef ENABLE_AUTO_SYSTEM RESERVED_WINDOW, // SLOT_TYPE_AUTO #endif #ifdef ENABLE_CHANGE_LOOK_SYSTEM CHANGELOOK, // SLOT_TYPE_CHANGE_LOOK #endif }; BYTE c_aWndTypeToSlotType[WINDOW_TYPE_MAX] = { SLOT_TYPE_NONE, SLOT_TYPE_INVENTORY, // INVENTORY SLOT_TYPE_EQUIPMENT, // EQUIPMENT SLOT_TYPE_SAFEBOX, // SAFEBOX SLOT_TYPE_MALL, // MALL SLOT_TYPE_DRAGON_SOUL_INVENTORY, // DRAGON_SOUL_INVENTORY SLOT_TYPE_BELT_INVENTORY, // BELT_INVENTORY #ifdef ENABLE_GUILDRENEWAL_SYSTEM SLOT_TYPE_GUILDBANK, // GUILDBANK #endif #ifdef ENABLE_ACCE_COSTUME_SYSTEM SLOT_TYPE_ACCE, // ACCEREFINE #endif #ifdef ENABLE_GROWTH_PET_SYSTEM SLOT_TYPE_PET_FEED_WINDOW, // PET_FEED #endif #ifdef ENABLE_CHANGE_LOOK_SYSTEM SLOT_TYPE_CHANGE_LOOK, // CHANGELOOK #endif }; Edited August 10, 2016 by xP3NG3Rx Actualized from GF 3 Link to comment Share on other sites More sharing options...
Jodie 4 Posted August 9, 2016 Author Share Posted August 9, 2016 It depends on who wants to add those things but you're right Meanwhile, you forgot GUILDBANK, PET_FEED and so on - Jodie Link to comment Share on other sites More sharing options...
Honorable Member xP3NG3Rx 19751 Posted August 10, 2016 Honorable Member Share Posted August 10, 2016 Yes but updated now :). They changed the whole TItemPos also, by split the inventories into variables by windowtypes. I mean: Now the Cell of acce is: LOBYTE(v50) = 2;//EQUIPMENT page *(unsigned __int16 *)((char *)&v50 + 1) = 22;//ACCE slotIndex absorbedItemVnum = CPythonPlayer::GetItemMetinSocket(0, (int)&v17, v50, 0); in C++: DWORD absorbedItemVnum = CPythonPlayer::instance().GetItemMetinSocket(TItemPos(EQUIPMENT, c_Costume_Slot_Acce), 0); But in prior version(and in the public src also) looks like this: LOBYTE(v4) = 1;//INVENTORY page *(_WORD *)((char *)&v4 + 1) = 112;//ACCE slotIndex absorbedItemVnum = CPythonPlayer::GetItemMetinSocket(0, v4, 0); in C++: DWORD absorbedItemVnum = CPythonPlayer::instance().GetItemMetinSocket(TItemPos(INVENTORY, c_Costume_Slot_Acce), 0); This is the new version of IsValidCell for every inventory page: char __fastcall TItemPos::IsValidCell(int a1) { char result; // al@2 switch ( *(_BYTE *)a1 )//wndType { case INVENTORY: result = (unsigned int)*(_WORD *)(a1 + sizeof(BYTE)/*1*/) < 180; break; case EQUIPMENT: result = (unsigned int)*(_WORD *)(a1 + sizeof(BYTE)/*1*/) < 44; break; case BELT_INVENTORY: result = (unsigned int)*(_WORD *)(a1 + sizeof(BYTE)/*1*/) < 16; break; case DRAGON_SOUL_INVENTORY: result = (signed int)*(_WORD *)(a1 + sizeof(BYTE)/*1*/) < 960; break; default: result = 0; break; } return result; } So, they were do like this way: typedef struct SPlayerStatus { TItemData aInventoryItem[c_Inventory_Count];//180 = 4*45 TItemData aEquipmentItem[c_Wear_Max + c_DragonSoul_Equip_Slot_Max * DS_DECK_MAX_NUM];//44 = 32 + 2*6 TItemData aDSInventoryItem[c_DragonSoul_Inventory_Count];//960 = 6*5*32 TItemData aBeltInventoryItem[c_Belt_Inventory_Slot_Count];//16 = 4*4 TQuickSlot aQuickSlot[QUICKSLOT_MAX_NUM]; TSkillInstance aSkill[SKILL_MAX_NUM]; long long m_allPoint[POINT_MAX_NUM]; long lQuickPageIndex; void SetPoint(UINT ePoint, long long llPoint); long long GetPoint(UINT ePoint); } TPlayerStatus; TPlayerStatus m_playerStatus; const TItemData * CPythonPlayer::GetItemData(TItemPos Cell) const { if (!Cell.IsValidCell()) return NULL; switch (Cell.window_type) { case INVENTORY: return &m_playerStatus.aInventoryItem[Cell.cell]; case EQUIPMENT: return &m_playerStatus.aEquipmentItem[Cell.cell]; case DRAGON_SOUL_INVENTORY: return &m_playerStatus.aDSInventoryItem[Cell.cell]; case BELT_INVENTORY: return &m_playerStatus.aBeltInventoryItem[Cell.cell]; default: return NULL; } } 2 Link to comment Share on other sites More sharing options...
Jodie 4 Posted August 11, 2016 Author Share Posted August 11, 2016 Yeah, they're changing a lot things at the moment Link to comment Share on other sites More sharing options...
lordsas61 16 Posted August 19, 2018 Share Posted August 19, 2018 Hi very nice but Penger codes is all problem " _WORD , _BYTE , _fastcall " Is there anything about these variables? Link to comment Share on other sites More sharing options...
Recommended Posts