Register for your free account! | Forgot your password?
Rust Cheats

You last visited: Today at 15:50

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

Advertisement



[Python] TextReader & MultiTextLine

Discussion on [Python] TextReader & MultiTextLine within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.

Reply
 
Old   #1
 
elite*gold: 130
Join Date: May 2013
Posts: 399
Received Thanks: 313
[Python] TextReader & MultiTextLine

Hey,

1. Pythonseitiger TextReader
hier hab ich einen kleinen TextReader in Python für euch, durch den ihr Textdateien aus dem Clienten auslesen könnt inkl. Formatierung (automatisches [ENTER] nach jeder Zeile) und 3 Befehlen (if, elseif & else). Außerdem können Keywords angegeben werden, die er mit einem gewünschten Wert ersetzt. Somit könnt ihr sehr einfach "Template-Dateien" einlesen & "übersetzen" lassen. Hier eine kleine Beispiel-Datei, die der Reader lesen könnte:
Code:
Sei gegrüßt, [PLAYER_NAME]!

Ich habe dir den Auftrag gegeben, dass du
mir [ITEM_MAX_COUNT] Items bringen sollst.
[IF:[ITEM_COUNT]=0]
Du hast mir noch keins gebracht.
[ELSEIF:[ITEM_COUNT]=1]
Du hast mir bisher eins gebracht.
[ELSE]
Du hast mir bisher [ITEM_COUNT] Items gebracht.
[ENDIF]

Bring mir noch [ITEM_NEED_COUNT] Items!
Das dazugehörige Python-Script könnte in etwa so aussehen:
Code:
def GetTemplateText(fileName):
	import uiTextReader
	TextReader = uiTextReader.TextReader() # hier kann noch als Argument angegeben werden, ob nach jeder Zeile ein [ENTER] gemacht werden soll (TRUE = ja, FALSE = nein, standart: TRUE)

	TextReader.AddKeyWord("[PLAYER_NAME]", player.GetName())
	TextReader.AddKeyWord("[ITEM_NEED_COUNT]", 20)
	TextReader.AddKeyWord("[ITEM_COUNT]", 3)

	TextReader.LoadFile(fileName) # hier dateiname angeben (oder eben beim Funktionsaufruf wenn man es auf die Funktion bezieht, z.B.: "locale/de/template.txt")
	return TextReader.GetText()
Zurückgegeben wird folgender Text:
Code:
Sei gegrüßt, WieIchEbenHeiße!

Ich habe dir den Auftrag gegeben, dass du
mir 20 Items bringen sollst.
Du hast mir bisher 3 Items gebracht.

Bring mir noch 17 Items!
Download im Anhang.

2. Pythonseitige TextLine mit erzwungenem Zeilenumbruch
außerdem, als kleine Anbindung um von der [ENTER]-Rückgabe vom PyTextReader gebrauch zu machen, hab ich hier noch eine kleine Klasse für euch: die MultiTextLine-Klasse. Sie lässt sich - sobald sie wie gleich gesagt wird eingebaut wird - in jeder uiscript-Datei (z.B. inventorywindow.py etc.) durch den "type" : "multi_text" benutzen (dabei muss eine max. Breite festlegt werden durch "width", ansonsten einfach wie gewohnt als TextLine behandeln).

HowTo Einbauen:
1. Ihr öffnet eure ui.py (und entpackt davor eure root-Dateien).
2. Ihr sucht nach
Code:
class TextLine(Window):
3. Ihr fügt darüber folgenden Code ein:
Code:
class MultiTextLine(Window):

	RETURN_STRING = "[ENTER]"
	LINE_HEIGHT = 17

	def __init__(self):
		Window.__init__(self)

		self.lines = []
		self.alignCenter = FALSE
		self.text = ""

	def __del__(self):
		Window.__init__(self)

	def SetWidth(self, width):
		self.SetSize(width, self.GetHeight())
		self.SetText(self.GetText())

	def NewTextLine(self):
		line = TextLine()
		line.SetParent(self)
		line.SetPosition(0, len(self.lines) * self.LINE_HEIGHT)
		if self.alignCenter == TRUE:
			line.SetWindowHorizontalAlignCenter()
			line.SetHorizontalAlignCenter()
		line.Show()
		self.lines.append(line)

		return self.lines[len(self.lines) - 1]

	def Clear(self):
		self.text = ""
		self.lines = []

	def SetTextHorizontalAlignCenter(self):
		self.alignCenter = TRUE
		self.SetText(self.GetText())

	def SetText(self, text):
		self.Clear()

		self.text = text

		line = self.NewTextLine()
		pos = 0
		newStartPos = 0
		while pos < len(text):
			line.SetText(text[:pos+1])

			newLine = FALSE
			if len(text) >= pos + len(self.RETURN_STRING):
				if text[pos:pos+len(self.RETURN_STRING)] == self.RETURN_STRING:
					newLine = TRUE
					newStartPos = pos+len(self.RETURN_STRING)
			if newLine == FALSE and pos > 0:
				if line.GetTextWidth() > self.GetWidth():
					newLine = TRUE
					newStartPos = pos

			if newLine == TRUE:
				line.SetText(text[:pos])

				line = self.NewTextLine()
				text = text[newStartPos:]
				if text[:1] == " ":
					text = text[1:]
				pos = 0
			else:
				pos += 1

		self.SetSize(self.GetWidth(), len(self.lines) * self.LINE_HEIGHT)

	def GetText(self):
		return self.text
4. Ihr sucht nach
Code:
elif Type == "text":
5. Ihr fügt darüber folgenden Code ein:
Code:
			elif Type == "multi_text":
				parent.Children[Index] = MultiTextLine()
				parent.Children[Index].SetParent(parent)
				self.LoadElementMultiText(parent.Children[Index], ElementValue)
6. Ihr sucht nach
Code:
def LoadElementText(self, window, value):
7. Ihr fügt darüber folgenden Code ein:
Code:
## MultiTextLine
	def LoadElementMultiText(self, window, value):

		if TRUE == value.has_key("width"):
			window.SetWidth(int(value.get("width", 0)))

		if TRUE == value.has_key("text_horizontal_align"):
			if value["text_horizontal_align"] == "center":
				window.SetTextHorizontalAlignCenter()

		if TRUE == value.has_key("text"):
			window.SetText(value["text"])

		self.LoadDefaultData(window, value)

		return TRUE
So, das wars dann auch, ist alles nicht die einzige Möglichkeit es zu coden, es gibt noch andere Wege die ebenfalls zum Ziel führen und es ist möglicherweise auch nicht immer der allerperfekteste und performanteste Weg gewählt, aber zu Laggs führen wird es ganz bestimmt nicht. Dieser Code ist dazu da um zu funktionieren und nicht um perfekt zu sein.

Wünsche euch viel Spaß damit,

Liebe Grüße,
Das Cureya Team.
Attached Files
File Type: rar uiTextReader.rar (1.4 KB, 188 views)
xTryx is offline  
Thanks
14 Users
Old 11/14/2014, 18:17   #2
 
Alergix2's Avatar
 
elite*gold: 103
Join Date: Aug 2014
Posts: 1,425
Received Thanks: 315
Sehr interessant!
Weiter so
Alergix2 is offline  
Old 11/14/2014, 18:23   #3

 
elite*gold: 5
Join Date: Dec 2013
Posts: 549
Received Thanks: 197
Weiter so
Sir.? is offline  
Old 11/14/2014, 18:26   #4
 
DEMONKING.'s Avatar
 
elite*gold: 5
Join Date: Oct 2012
Posts: 290
Received Thanks: 357
niice n usefull release . thank you
DEMONKING. is offline  
Old 11/16/2014, 17:17   #5
 
sema1995's Avatar
 
elite*gold: 0
Join Date: May 2011
Posts: 254
Received Thanks: 68
in the class ui.TextLine

if line.GetTextWidth() <--- dont exists the def GetTextWidth() <-- can u share it? Thanks.
sema1995 is offline  
Old 11/16/2014, 17:26   #6
 
elite*gold: 0
Join Date: Jan 2014
Posts: 268
Received Thanks: 373
Well just add this code below the other functions of the class (in the ui.py):
Code:
	def GetTextWidth(self):
		(w, h) = self.GetTextSize()
		return w

	def GetTextHeight(self):
		(w, h) = self.GetTextSize()
		return h
Kind Regards
Lefloyd is offline  
Thanks
2 Users
Reply


Similar Threads Similar Threads
[Python-Modul]EXP-Donator (kompatibel mit Python Loader)
11/23/2013 - Metin2 Hacks, Bots, Cheats, Exploits & Macros - 27 Replies
Moin, da man mich danach gefragt hat und ich sowieso mal ein Beispiel für die Benutzung meines Python Loaders veröffentlichen wollte, habe ich die Gelegenheit genutzt und euch eben einen EXP-Spendebot geschrieben. Man kann ihn einfach mit dem oben verlinkten Python Module Loader laden und ihn mit F5 aktivieren/deaktivieren. Sobald ihr mehr als 99 Erfahrungspunkte habt (man kann nur in 100er Schritten spenden), werden alle Erfahrungspunkte an eure Gilde gespendet. Wer Lust hat und...
[Python]Python Loader vs import
07/29/2013 - Metin2 Private Server - 2 Replies
when i tried to inject my bot with this pyScrLoader = ui.PythonScriptLoader() pyScrLoader.LoadScriptFile(self, "eigenartig/mainboard.py") syserr shows me: 0728 16:55:05139 :: CEffectManager::RegisterEffect - LoadScript(d:/ymir work/effect/hit/percent_damage1.mse) Error 0728 16:55:05139 :: CInstanceBase::RegisterEffect(eEftType=264, c_szEftAttachBone=, c_szEftName=d:/ymir work/effect/hit/percent_damage1.mse, isCache=1) - Error 0728 16:55:05139 :: CEffectManager::RegisterEffect...
Help to make a python file works with python loader
03/03/2013 - Metin2 - 2 Replies
Hey epvp! I want make a very. Little hack works on pythonn loader can anybody help me please?
Metin2 - Python - Wie Python Hacks verschlüsseln und Server überprüfen (GF/PServe)
09/23/2012 - Metin2 - 2 Replies
Ich wollte fragen, wie man Python Hacks am besten Verschlüsselt ? und wie man feststellen kann ob man auf einem GF / Pserver spielt. ?
Python + Eric Python IDE installieren ?!
07/05/2011 - General Coding - 0 Replies
hat sich erledigt.



All times are GMT +1. The time now is 15:51.


Powered by vBulletin®
Copyright ©2000 - 2026, 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 ©2026 elitepvpers All Rights Reserved.