Register for your free account! | Forgot your password?

You last visited: Today at 10:57

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



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

Discussion on [C++/Python]17.5 Element Image on target within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Feb 2015
Posts: 168
Received Thanks: 74
Thumbs up [C++/Python]17.5 Element Image on target

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!









Attached Files
File Type: rar element_image_client_files.rar (124.5 KB, 216 views)
Factory_Owner is offline  
Thanks
10 Users
Old 10/28/2017, 13:16   #2
 
elite*gold: 0
Join Date: Dec 2012
Posts: 8
Received Thanks: 6
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!
The Panic is offline  
Thanks
2 Users
Old 10/28/2017, 15:44   #3
 
elite*gold: 0
Join Date: Jan 2017
Posts: 21
Received Thanks: 3
Thanks nice
Foxxielove is offline  
Old 10/28/2017, 18:56   #4
 
elite*gold: 0
Join Date: Feb 2015
Posts: 168
Received Thanks: 74
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
Factory_Owner is offline  
Old 10/30/2017, 08:44   #5
 
elite*gold: 0
Join Date: Feb 2015
Posts: 168
Received Thanks: 74
Smile

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:







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!
Factory_Owner is offline  
Thanks
2 Users
Old 10/30/2017, 10:36   #6
 
x_Core_x's Avatar
 
elite*gold: 11
Join Date: Nov 2012
Posts: 256
Received Thanks: 168
Looks nice, thank you
x_Core_x is offline  
Old 10/30/2017, 13:24   #7
 
'Crusher's Avatar
 
elite*gold: 8
Join Date: Mar 2015
Posts: 1,176
Received Thanks: 355
Looks great, your skype addy?
'Crusher is offline  
Old 10/31/2017, 18:44   #8
 
elite*gold: 0
Join Date: Feb 2015
Posts: 168
Received Thanks: 74
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.





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.
Factory_Owner is offline  
Reply


Similar Threads Similar Threads
Target self / Target enemy ? >.>
03/21/2011 - General Gaming Discussion - 2 Replies
Well, i just looked through all the existing rose-hack-threads (not that any of them would work...), when i saw those "Levelbots" with a "Target self" and a "Target Enemy" Skill :o Well, my question is: Where can i find this Skill? O_o I´m playing AruaRose, but i neither got it from beginning nor being able to buy it anywhere :o Well, it would be nice if u could tell me... :> Edit: Oh, and if one of the Maker of those "Rose online Privatserver"-Threads should read this, would you...
WoW Hide My Target - Hide your target!
10/24/2010 - WoW Exploits, Hacks, Tools & Macros - 46 Replies
Voerst: Hier geht es um einen kleinen Hack, um euer Target zu verstecken. Andere werden euer aktuelles Target nicht mehr sehen. Dieser kleine Hack ist aus Langeweile entstanden, wenn ihr ihn also unnütz findet, steht es euch frei diesen Thread ohne jeglichen noch sinnloseren Kommentar zu verlassen, danke! Wie funktioniert der Hack? Code der verändert wrid in WoW: 00518E07 - 5 Bytes (0x90, 0x90, 0x90, 0x90, 0x90) 00524311 - 5 Bytes (0x90, 0x90, 0x90, 0x90, 0x90) 00528306 - 5 Bytes...
[Help] Invalid Target/Cannot find Target(ZSZC)
05/29/2010 - SRO Private Server - 4 Replies
Some write they have Problems with ZSZC SRO-DB, by mobs for example "Ishade/Penon/Ujigi(lvl50-56)", in the Textbox right side down a message: "Invalid Target" or " Cannot Find Target", All have this Problem, a good message, i have the solution! You need Use SRO-DB Bot V0.8 and NOT V0.9a! +++Use this and you will have Fun by Botting+++



All times are GMT +2. The time now is 10:57.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.