Jump to content

Race Height of Actors


Recommended Posts

  • Honorable Member

M2 Download Center

Hidden Content

    Give reaction to this post to see the hidden content.
( Internal )

Hello.

 

Today I'd like to share this little stuff what I reversed from the official binary a month ago.
This will fix the positions of textails(name position changes by every update packet on the main character), and also the position of the emotions when you are on a mount :).
I've made a little demonstration video where you can see a private server without the fix, my fixxed version and the official aswell.

 

1. Client/bin/playersettingmodule.py

Spoiler

1. Add the following code above of the loadGameDataDict declaration:


# SetRaceHeight
def __LoadRaceHeight():
	try:
		lines = open("race_height.txt", "r").readlines()
	except IOError:
		return

	for line in lines:
		tokens = line[:-1].split("\t")
		if len(tokens) == 0 or not tokens[0]:
			continue

		vnum = int(tokens[0])
		height = float(tokens[1])

		chrmgr.SetRaceHeight(vnum, height)

2. Add the following line below of the dict or extend it however you want:


loadGameDataDict.update({"RACE_HEIGHT": __LoadRaceHeight,})

2.1 extension:


	"RACE_HEIGHT" : __LoadRaceHeight,

 

2. Client/bin/introLoading.py

Spoiler

1. Paste the following line below of the self.__LoadNPC() in the DEBUG_LoadData function:


		self.__LoadRaceHeight()

2. Add the following line below of the self.loadStepList definition in the LoadData function:


		self.loadStepList+=[(98, ui.__mem_func__(self.__LoadRaceHeight)),]

2.1 or extend it:


			(98, ui.__mem_func__(self.__LoadRaceHeight)),

3. Add the following function after the __LoadNPC function or anywhere you want:
 


	def __LoadRaceHeight(self):
		playerSettingModule.LoadGameData("RACE_HEIGHT")

 

3. Place the

Hidden Content

    Give reaction to this post to see the hidden content.
from the official client into the yours and pack it in the root.
4. Client/UserInterface/PythonCharacterManagerModule.cpp

Spoiler

1. Add the new function to the module:


PyObject * chrmgrSetRaceHeight(PyObject* poSelf, PyObject* poArgs)
{
	int iRaceIndex;
	if (!PyTuple_GetInteger(poArgs, 0, &iRaceIndex))
		return Py_BadArgument();
	float fRaceHeight = 0.0f;
	if (!PyTuple_GetFloat(poArgs, 1, &fRaceHeight))
		return Py_BadArgument();

	CRaceManager::Instance().SetRaceHeight(iRaceIndex, fRaceHeight);
	return Py_BuildNone();
}

And to the methodlist:


		{ "SetRaceHeight",				chrmgrSetRaceHeight,					METH_VARARGS },

 

5. Client/GameLib/RaceManager.h

Spoiler

1. Add these new functions as public:


		void SetRaceHeight(int iVnum, float fHeight);
		float GetRaceHeight(int iVnum);

2. And define the new map which will stores the informations as protected:


		std::map<int, float>				m_kMap_iRaceKey_fRaceAdditionalHeight;

 

6. Client/GameLib/RaceManager.cpp

Spoiler

1. Add the new functions anywhere you want:


void CRaceManager::SetRaceHeight(int iVnum, float fHeight)
{
	m_kMap_iRaceKey_fRaceAdditionalHeight.insert(std::map<int, float>::value_type(iVnum, fHeight));
}

float CRaceManager::GetRaceHeight(int iVnum)
{
	std::map<int, float>::iterator it = m_kMap_iRaceKey_fRaceAdditionalHeight.find(iVnum);
	if (m_kMap_iRaceKey_fRaceAdditionalHeight.end() == it)
		return 0.0f;

	return it->second;
}

 

7. Client/UserInterface/InstanceBase.h

Spoiler

1. Paste the following definition of function below of the definition of GetDistance as public:


		float					GetBaseHeight();

 

8. Client/UserInterface/InstanceBase.cpp

Spoiler

0. Add to the includes:


#include "../gamelib/RaceManager.h"

1. Add the function anywhere you want:


float CInstanceBase::GetBaseHeight()
{
	CActorInstance* pkHorse = m_kHorse.GetActorPtr();
	if (!m_kHorse.IsMounting() || !pkHorse)
		return 0.0f;

	DWORD dwHorseVnum = m_kHorse.m_pkActor->GetRace();
	if ((dwHorseVnum >= 20101 && dwHorseVnum <= 20109) ||
		(dwHorseVnum == 20029 || dwHorseVnum == 20030))
		return 100.0f;

	float fRaceHeight = CRaceManager::instance().GetRaceHeight(dwHorseVnum);
	if (fRaceHeight == 0.0f)
		return 100.0f;
	else
		return fRaceHeight;
}

 

9. Client/UserInterface/InstanceBaseEffect.cpp

Spoiler

1. Replace the fTextTailHeight definition of variable in the AttachTextTail function with this:


		float fTextTailHeight = GetBaseHeight() + 10.0f;

2. Replace the following in the SetEmoticon function:


		v3Pos.z += float(m_GraphicThingInstance.GetHeight());

With this:


		v3Pos.z += float(GetBaseHeight() + m_GraphicThingInstance.GetHeight());

Twice!!! The are two times this line, replace both of them!
 

10. Client/UserInterface/PythonTextTail.cpp

Spoiler

1. Replace the following code in the RegisterChatTail function:


	TTextTail * pTextTail = RegisterTextTail(VirtualID,
											 c_szChat,
											 pCharacterInstance->GetGraphicThingInstancePtr(),
											 pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + 10.0f,
											 c_TextTail_Chat_Color);

With this:
 


	TTextTail * pTextTail = RegisterTextTail(VirtualID,
											 c_szChat,
											 pCharacterInstance->GetGraphicThingInstancePtr(),
											 pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + pCharacterInstance->GetBaseHeight() + 10.0f,
											 c_TextTail_Chat_Color);

 

11. Client/GameLib/ActorInstance.cpp

Spoiler

0. Add the following to the includes:


#include "RaceManager.h"

1. Replace the whole GetHeight function with this:


float CActorInstance::GetHeight()
{
	DWORD dwRace = GetRace();
	float fRaceHeight = CRaceManager::instance().GetRaceHeight(dwRace);
	if (fRaceHeight == 0.0f)
	{
		fRaceHeight = CGraphicThingInstance::GetHeight();
		CRaceManager::instance().SetRaceHeight(dwRace, fRaceHeight);
	}

	return fRaceHeight;
}

 

 

I hope you like it, and if you find any problem just let me know in this topic.

  • Metin2 Dev 4
  • Love 59
  • Love 2
  • Good 5
  • Confused 1
Link to comment
  • Replies 19
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

I've modified def __LoadRaceHeight for my own purpose, here it is in case someone needs it:

Spoiler
def __LoadRaceHeight():
	directory = "npcheight.txt"
	try:
		lines = open(directory, "r").readlines()
	except IOError:
		return

	#import dbg
	for line in lines:
		try: # to avoid problems .. (paranoia)
			tokens = line[:-1].split("\t")
			#dbg.TraceError("__LoadRaceHeight tokens %s" % (str(tokens)))

			if len(tokens) <= 1 or not tokens[0]:
				continue

			if tokens[0].find("#") != -1:
				continue
			if tokens[1].find("#") != -1:
				tokens[1] = tokens[1].split("#")[0].replace("\s","")
			if tokens[1].find("#") != -1:
				continue

			vnum = int(tokens[0])
			height = float(tokens[1])
			#dbg.TraceError("__LoadRaceHeight %d %s" % (vnum,tokens[1]))
			chrmgr.SetRaceHeight(vnum, height)
		except:
			import dbg
			dbg.TraceError("I could not read the lines of %s" % directory)

 

I wanted to use comment tags inside the .txt file :D

Spoiler
# horse
20030	220.00
20101	220.00
20102	220.00
20103	220.00
20104	220.00
20105	220.00
20106	220.00
20107	220.00
20108	220.00
20109	220.00

# shop
30000	150.00

# mount
20212	0.01 # uff.. the mounts need to have 0.01
29212	0.01

# dragon
2493	300.00

 

 

EDIT:

iI think I was too sleepy at 4 AM when I wrote this reply, I didn't think I could modifty it into a dictionary :facepalm:

def __LoadRaceHeight():
	Dict = npcheight.NPC_HEIGHT

	for k,v in Dict.items():
		chrmgr.SetRaceHeight(k, v)
NPC_HEIGHT = {
	# horse
	20030 : 220.00,
	20101 : 220.00,
	20102 : 220.00,
	20103 : 220.00,
	20104 : 220.00,
	20105 : 220.00,
	20106 : 220.00,
	20107 : 220.00,
	20108 : 220.00,
	20109 : 220.00,
	# shop
	30000 : 150.00,
	# mount
	20212 : 0.01, # uff.. the mounts need to have 0.01
	29212 : 0.01,
	# dragon
	2493 : 300.00,
}

 

  • Love 6
Link to comment
  • Honorable Member

I have 4 errors:

16> InstanceBase.cpp (48): error C2653: "CRaceManager": not a class name or namespace name
16> InstanceBase.cpp (48): error C2228: left ".GetRaceHeight" must be of type struct/union
16> InstanceBase.cpp (48): error C3861: "instance": id was not found
198	IntelliSense: name followed by '::' must be a class or namespace name

nSJEeJF.png

Can anyone help?

dKMsrOV.png

Link to comment
2 hours ago, Tatsumaru said:

I have 4 errors:

16> InstanceBase.cpp (48): error C2653: "CRaceManager": not a class name or namespace name
16> InstanceBase.cpp (48): error C2228: left ".GetRaceHeight" must be of type struct/union
16> InstanceBase.cpp (48): error C3861: "instance": id was not found
198	IntelliSense: name followed by '::' must be a class or namespace name

nSJEeJF.png

Can anyone help?

#include "../gamelib/RaceManager.h"
  • Love 2
Link to comment
  • VIP
4 hours ago, Meruem said:

good has worked for me, since I do not get
This function
 

v3Pos.z += float(m_GraphicThingInstance.GetHeight());

33145781_220445875225715_879935895399458

  • Love 1
If code.isTurkisch:
    self.suicide();
elif code.isPoland:
   self.giveHate()

 

Link to comment
49 minutes ago, avertuss said:

Idk why but my client getting crash after login without errors in syserr when i have added python side. 

are you sure that you packed the text file in your root package?

On 5/15/2018 at 11:47 PM, xP3NG3Rx said:

3. Place the

Hidden Content

    Give reaction to this post to see the hidden content.
from the official client into the yours and pack it in the root.

 

  • Love 1
  • Vomit 1
Link to comment

I think there are some "bugs". If u mount for example the power mounts the texttail is floating miles above you. Also if you're not riding a mount the texttail above them ("XZY's Horse") is also miles above them. Maybe you can take a look for this "bugs". But nice release anyway.

Thanks P3ng3r

Link to comment

i added some new values to race_height.txt such as mounts as the name appears in the air 

but it dosent work , had to add them in source not sure if the race_height.txt is even working 

Link to comment
On 5/28/2018 at 2:43 AM, PeaceMaker said:

i added some new values to race_height.txt such as mounts as the name appears in the air 

but it dosent work , had to add them in source not sure if the race_height.txt is even working 

yup same here, tried adding values and changing existing values, I even tried to delete all the data, and nothing changes in game.

Link to comment
  • 4 weeks later...
  • VIP

 

La 26.05.2018 la 21:57, Tryn a spus:

I think there are some "bugs". If u mount for example the power mounts the texttail is floating miles above you. Also if you're not riding a mount the texttail above them ("XZY's Horse") is also miles above them. Maybe you can take a look for this "bugs". But nice release anyway.

Thanks P3ng3r

 

La 29.05.2018 la 12:28, 3bd0 a spus:

yup same here, tried adding values and changing existing values, I even tried to delete all the data, and nothing changes in game.

Use what exygo posted.

 

If you want the dictionary in the same file, you'll have to modify 

 

Dict = npcheight.NPC_HEIGHT

to 

Dict = NPC_HEIGHT

Open instancebase.cpp and search for->

	if ((dwHorseVnum >= 20101 && dwHorseVnum <= 20109) ||
		(dwHorseVnum == 20029 || dwHorseVnum == 20030))
		return 100.0f;

Make a new case under it and put your mounts vnums, in my case it is:

	if ((dwHorseVnum >= 20110 || dwHorseVnum <= 20266))
		return 50.0f;

Then, enter PlayerSettingModule.py and use Exygo's dict as this for mounts->

    20110 : 160.00,
    20111 : 160.00,
    20112 : 160.00,
    20113 : 160.00,
    20114 : 160.00,
    20115 : 160.00,
    ...............
    20266 : 160,00,

 

  • Love 1
Link to comment
  • 9 months later...
  • 5 months later...
  • 2 months later...

Build Error. 

The code section of Metin2Dev is very bad. When you copy and paste "?" adding signs. Wretched. Please do not enter your codes here. Use an additional site.

Can someone tell me why you're giving this crap :)

2346666.png

 


ActorInstance.cpp

 

ActorInstance.png

 

PhytonCharacterManagerModule.cpp / Also
{ "SetRaceHeight", chrmgrSetRaceHeight, METH_VARARGS }, Add - (No Image)

 

charactermodule.png

 

RaceManager.cpp

 

RaceManager..png

 

RaceManager.h 

 

RaceManagerh.png

 

Also All

#include attached.

 

 

Link to comment
  • 1 year later...
  • VIP
Posted (edited)

spacer.pngspacer.png

 

I don't know if it should be like this, but this looks really wrong to me. I'm using the latest race_height.txt from DE

 

spacer.png


That's also not how it supposed to be.. Checked already twice, I did it correctly.

Edited by .Avenue™
Link to comment
  • VIP
17 hours ago, .Avenue™ said:

Hidden Content

    Give reaction to this post to see the hidden content.

Hidden Content

    Give reaction to this post to see the hidden content.

 

I don't know if it should be like this, but this looks really wrong to me. I'm using the latest race_height.txt from DE

 

Hidden Content

    Give reaction to this post to see the hidden content.


That's also not how it supposed to be.. Checked already twice, I did it correctly.

Open file playersettingmodule.py
and Replace this part.


 

def __LoadRaceHeight():
	try:
		lines = pack_open("race_height.txt", "r").readlines()
	except IOError:
		import dbg
		dbg.LogBox("__LoadRaceHeight: load text file error!")
		app.Abort()
		
	for line in lines:
		tokens = line[:-1].split("\t")
		if len(tokens) == 0 or not tokens[0]:
			continue
			
		vnum = int(tokens[0])
		height = float(tokens[1])
		
		chrmgr.SetRaceHeight(vnum, height)

This should help. Probably a file race_height.txt it wasn't read.

  • Love 4
  • Good 3
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


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