Jump to content

Window Type Functions


Recommended Posts

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 :D

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

  • Love 3
Link to comment
Share on other sites

  • Honorable Member

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 by xP3NG3Rx
Actualized from GF
  • Love 3
Link to comment
Share on other sites

  • Honorable Member

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;
	}
}

 

 

  • Love 2
Link to comment
Share on other sites

  • 2 years later...

Announcements



×
×
  • 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.