[C++/Python]17.5 Element Image on target

10/28/2017 09:39 Factory_Owner#1
Hey there,

I have an Halloween gift for you all. i have been working for a few hours on official like element image on target window(See screens below).

When you click on a mob if it is defined as elemental, it will open an element image in addition to the target window.

Don't forget to hit the like button!

(C) Metin2 guild wars - coded by [GA]Ruin - 27/10/2017 (I create custom metin2 systems in c++/python. if you want a custom system send me a pm and we can talk over skype).



Client files: Attached to this post.

Let's begin!


Server Side:

Open service.h, add in the end:

Code:
#define ELEMENT_TARGET


Open char.cpp, search for
Code:
else
	{
		p.dwVID = 0;
		p.bHPPercent = 0;
}


add below:

Code:
#ifdef ELEMENT_TARGET
	const int ELEMENT_BASE = 11;
	DWORD curElementBase = ELEMENT_BASE;
	DWORD raceFlag;
	if (m_pkChrTarget && m_pkChrTarget->IsMonster() && (raceFlag = m_pkChrTarget->GetMobTable().dwRaceFlag) >= RACE_FLAG_ATT_ELEC)
	{
		for (int i = RACE_FLAG_ATT_ELEC; i <= RACE_FLAG_ATT_DARK; i *= 2)
		{
			curElementBase++;
			int diff = raceFlag - i;
			if (abs(diff) <= 1024)
				break;
		}
		p.bElement = curElementBase - ELEMENT_BASE;
	}
	else
	{
		p.bElement = 0;
	}

#endif


open packet.h, search for:

Code:
} TPacketGCTarget;
add above:

Code:
#ifdef ELEMENT_TARGET
	BYTE	bElement;
#endif


Client side:

open locale_inc.h, add in the end:

Code:
#define ELEMENT_TARGET
open packet.h, search for*

Code:
} TPacketGCTarget;
add above:

Code:
#ifdef ELEMENT_TARGET
	BYTE bElement;
#endif
open PythonNetworkPhaseGame.cpp, look for:

Code:
else if (pInstPlayer->CanViewTargetHP(*pInstTarget))
replace below with the following:

Code:
#ifdef ELEMENT_TARGET
				PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(iii)", TargetPacket.dwVID, TargetPacket.bHPPercent, TargetPacket.bElement));
#else

				PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(ii)", TargetPacket.dwVID, TargetPacket.bHPPercent));
#endif
open PythonApplicationModule.cpp, look for*

Code:
#ifdef ENABLE_ENERGY_SYSTEM
add above:

Code:
#ifdef ELEMENT_TARGET
	PyModule_AddIntConstant(poModule, "ENABLE_VIEW_ELEMENT", 1);
#else
	PyModule_AddIntConstant(poModule, "ENABLE_VIEW_ELEMENT", 0);
#endif
open game.py, look for*
Code:
def SetHPTargetBoard(self, vid, hpPercentage):
			if vid != self.targetBoard.GetTargetVID():
				self.targetBoard.ResetTargetBoard()
				self.targetBoard.SetEnemyVID(vid)

			self.targetBoard.SetHP(hpPercentage)
			self.targetBoard.Show()
replace with:

Code:
if app.ENABLE_VIEW_ELEMENT:
		def SetHPTargetBoard(self, vid, hpPercentage,bElement):
			if vid != self.targetBoard.GetTargetVID():
				self.targetBoard.ResetTargetBoard()
				self.targetBoard.SetEnemyVID(vid)
			
			self.targetBoard.SetHP(hpPercentage)
			self.targetBoard.SetElementImage(bElement)
			self.targetBoard.Show()
	else:
		def SetHPTargetBoard(self, vid, hpPercentage):
			if vid != self.targetBoard.GetTargetVID():
				self.targetBoard.ResetTargetBoard()
				self.targetBoard.SetEnemyVID(vid)

			self.targetBoard.SetHP(hpPercentage)
			self.targetBoard.Show()
open uitarget.py, look for*

Code:
import background
add below:

Code:
if app.ENABLE_VIEW_ELEMENT:
	ELEMENT_IMAGE_DIC = {1: "elect", 2: "fire", 3: "ice", 4: "wind", 5: "earth", 6 : "dark"}
look for:

Code:
self.isShowButton = False
add below:

Code:
if app.ENABLE_VIEW_ELEMENT:
			self.elementImage = None
inside Destroy method, look for:
Code:
self.__Initialize()
add below:

Code:
if app.ENABLE_VIEW_ELEMENT:
			self.elementImage = None
inside ResetTargetBoard method, look for:

Code:
self.hpGauge.Hide()
add below:

Code:
if app.ENABLE_VIEW_ELEMENT and self.elementImage:
			self.elementImage = None
look for :

Code:
def SetElementImage(self,elementId):
add above:
Code:
if app.ENABLE_VIEW_ELEMENT:
		def SetElementImage(self,elementId):
			try:
				if elementId > 0 and elementId in ELEMENT_IMAGE_DIC.keys():
					self.elementImage = ui.ImageBox()
					self.elementImage.SetParent(self.name)
					self.elementImage.SetPosition(-60,-12)
					self.elementImage.LoadImage("d:/ymir work/ui/game/12zi/element/%s.sub" % (ELEMENT_IMAGE_DIC[elementId]))
					self.elementImage.Show()
			except:
				pass


Compile server, client source and root pack and that's it!

Enjoy!

Happy halloween! :)

[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]
10/28/2017 13:16 The Panic#2
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(iiiii)", TargetPacket.dwVID, TargetPacket.bHPPercent, TargetPacket.bElement));

Change with:

PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(iii)", TargetPacket.dwVID, TargetPacket.bHPPercent, TargetPacket.bElement));

Thanks for release!
10/28/2017 15:44 Foxxielove#3
Thanks nice ;)
10/28/2017 18:56 Factory_Owner#4
Quote:
Originally Posted by The Panic View Post
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(iiiii)", TargetPacket.dwVID, TargetPacket.bHPPercent, TargetPacket.bElement));

Change with:

PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(iii)", TargetPacket.dwVID, TargetPacket.bHPPercent, TargetPacket.bElement));

Thanks for release!
Thanks i'v updated my post :)
10/30/2017 08:44 Factory_Owner#5
Small update:

Added tool tip to make it more clear for players, follow the steps below to have it.
Like this post if you find it useful :)

Screens:

[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]



in _init_ and in Destroy methods*look for:

Code:
if app.ENABLE_VIEW_ELEMENT:
	self.elementImage = None
replace with:

Code:
if app.ENABLE_VIEW_ELEMENT:
	self.elementImage = None
	self.elementId = None
	self.elementImageToolTip = None
search for:

Code:
def Close(self):
add inside the method:

Code:
if app.ENABLE_VIEW_ELEMENT and self.elementImage:
	self.elementImage.Hide()
inside ResetTargetBoard method look for:

Code:
if app.ENABLE_VIEW_ELEMENT and self.elementImage:
	self.elementImage = None
replace with:
Code:
if app.ENABLE_VIEW_ELEMENT and self.elementImage:
  self.elementImage = None
  self.elementId = None
  if self.elementImageToolTip:
  self.elementImageToolTip.Hide()
Search for:

Code:
ELEMENT_IMAGE_DIC = {1: "elect", 2: "fire", 3: "ice", 4: "wind", 5: "earth", 6: "dark"}
add above:
Code:
import uiToolTip
Look for:

Code:
def SetElementImage(self, elementId):
replace the whole method with:

Code:
def SetElementImage(self, elementId):
			try:
				if elementId > 0 and elementId in ELEMENT_IMAGE_DIC.keys():
					self.elementId = elementId
					self.elementImage = ui.ImageBox()
					self.elementImage.SAFE_SetStringEvent("MOUSE_OVER_IN", self.OnElementImageOverIn)
					self.elementImage.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.OnElementImageOverOut)
					self.elementImage.SetPosition(self.GetLeft() - 40, self.GetTop())
					self.elementImage.LoadImage(
						"d:/ymir work/ui/game/12zi/element/%s.sub" % (ELEMENT_IMAGE_DIC[elementId]))
					self.elementImage.Show()
			except:
				pass

		def OnElementImageOverIn(self):
			if not self.elementImageToolTip:
				self.elementImageToolTip = uiToolTip.ToolTip()
			self.elementImageToolTip.ClearToolTip()
			self.elementImageToolTip.AppendTextLine(ELEMENT_IMAGE_DIC[self.elementId] + " element")
			self.elementImageToolTip.SetToolTipPosition(self.GetLeft() - 40, self.GetTop() + 70)
			self.elementImageToolTip.Show()

		def OnElementImageOverOut(self):
			if self.elementImageToolTip:
				self.elementImageToolTip.Hide()
That's it.

Enjoy!
10/30/2017 10:36 x_Core_x#6
Looks nice, thank you
10/30/2017 13:24 'Crusher#7
Looks great, your skype addy?
10/31/2017 18:44 Factory_Owner#8
Small update #2

If you have installed my official like new elemental bonuses. follow the small guide below to view element icon*of a target*that wears

the new rings, like in official.

[Only registered and activated users can see links. Click Here To Register...]



open char.cpp,look for:
Code:
#ifdef ELEMENT_TARGET
replace the entire content of the #ifdef, until the #endif with the following:
Code:
#ifdef ELEMENT_TARGET
	p.bElement = 0;
	BYTE elementBase = 0;
	DWORD raceFlag;
	if (m_pkChrTarget)
	{
		if (m_pkChrTarget->IsMonster() && (raceFlag = m_pkChrTarget->GetMobTable().dwRaceFlag) >= RACE_FLAG_ATT_ELEC)
		{
			for (int i = RACE_FLAG_ATT_ELEC; i > 1; i /= 2)
			{
				elementBase++;
			}
			DWORD curElementBase = elementBase;
			const int ELEMENT_BASE_FLAG = pow(2, elementBase);
			for (int i = RACE_FLAG_ATT_ELEC; i <= RACE_FLAG_ATT_DARK; i *= 2)
			{
				curElementBase++;
				int diff = raceFlag - i;
				if (abs(diff) < ELEMENT_BASE_FLAG)
					break;
			}
			p.bElement = curElementBase - elementBase;
		}
		else if (m_pkChrTarget->IsPC())
		{
			LPITEM pItem = m_pkChrTarget->GetWear(WEAR_RING1);
			if (pItem)
			{
				const int BASE_ELEMENT = APPLY_ATTBONUS_ELEC;
				for (int i = 0; i < ITEM_SOCKET_MAX_NUM; i++)
				{
					if (pItem->GetNewAttributeType(i) >= APPLY_ATTBONUS_ELEC && pItem->GetSocket(i) <= APPLY_ATTBONUS_DARK)
					{
						p.bElement = pItem->GetNewAttributeType(i) - BASE_ELEMENT + 1;
						break;
					}
				}
			}
		}
	}

#endif

Compile server and that's it. now, when you select a target that wear a ring with elemental bonuses, an element icon will appear next to the target.