Questhintergrund dauerhaft ändern

11/22/2015 14:13 Metinsoul#1
Halloooooooooooooooo :)

Habe mal eine Frage an die Leute die sich mit dem Clienten bzw. mit diesen Phyton auskennen. Ich würde gerne einen neuen Questhintergrund haben bzw. den Standartmäßigen überschreiben, sodass er halt meinen eigenen(eine tga datei) ausliest und anzeigt. Ich würde das Problem ungern über die setbgimage('background.tga') Funktion lösen, da ich es zu umständlich finde in jeder Quest dieses Ding einzufügen und es meiner Meinung nach im Clienten die schönere Variante ist.

Freue mich über jede Hilfe :)

LG Metinsoul
11/22/2015 17:31 .Various#2
Hey,

Der Questhintergrund ist das standard implementierte "thinboard".
Öffne pack/uiscript/questdialog.py, dort siehst du sowas:
Code:
		{
			"name" : "board",
			"type" : "thinboard",
			"style" : ("attach", "ignore_size",),

			"x" : 0,
			"y" : 0,

			"horizontal_align" : "center",
			"vertical_align" : "center",

			"width" : 350,
			"height" : 300,
		},
Die ThinBoard Klasse sieht so aus:
Code:
class ThinBoard(Window):

	CORNER_WIDTH = 16
	CORNER_HEIGHT = 16
	LINE_WIDTH = 16
	LINE_HEIGHT = 16
	BOARD_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.51)

	LT = 0
	LB = 1
	RT = 2
	RB = 3
	L = 0
	R = 1
	T = 2
	B = 3

	def __init__(self, layer = "UI"):
		Window.__init__(self, layer)

		CornerFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Corner_"+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ]
		LineFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Line_"+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ]

		self.Corners = []
		for fileName in CornerFileNames:
			Corner = ExpandedImageBox()
			Corner.AddFlag("attach")
			Corner.AddFlag("not_pick")
			Corner.LoadImage(fileName)
			Corner.SetParent(self)
			Corner.SetPosition(0, 0)
			Corner.Show()
			self.Corners.append(Corner)

		self.Lines = []
		for fileName in LineFileNames:
			Line = ExpandedImageBox()
			Line.AddFlag("attach")
			Line.AddFlag("not_pick")
			Line.LoadImage(fileName)
			Line.SetParent(self)
			Line.SetPosition(0, 0)
			Line.Show()
			self.Lines.append(Line)

		Base = Bar()
		Base.SetParent(self)
		Base.AddFlag("attach")
		Base.AddFlag("not_pick")
		Base.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT)
		Base.SetColor(self.BOARD_COLOR)
		Base.Show()
		self.Base = Base

		self.Lines[self.L].SetPosition(0, self.CORNER_HEIGHT)
		self.Lines[self.T].SetPosition(self.CORNER_WIDTH, 0)

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

	def SetSize(self, width, height):

		width = max(self.CORNER_WIDTH*2, width)
		height = max(self.CORNER_HEIGHT*2, height)
		Window.SetSize(self, width, height)

		self.Corners[self.LB].SetPosition(0, height - self.CORNER_HEIGHT)
		self.Corners[self.RT].SetPosition(width - self.CORNER_WIDTH, 0)
		self.Corners[self.RB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT)
		self.Lines[self.R].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT)
		self.Lines[self.B].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT)

		verticalShowingPercentage = float((height - self.CORNER_HEIGHT*2) - self.LINE_HEIGHT) / self.LINE_HEIGHT
		horizontalShowingPercentage = float((width - self.CORNER_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH
		self.Lines[self.L].SetRenderingRect(0, 0, 0, verticalShowingPercentage)
		self.Lines[self.R].SetRenderingRect(0, 0, 0, verticalShowingPercentage)
		self.Lines[self.T].SetRenderingRect(0, 0, horizontalShowingPercentage, 0)
		self.Lines[self.B].SetRenderingRect(0, 0, horizontalShowingPercentage, 0)
		self.Base.SetSize(width - self.CORNER_WIDTH*2, height - self.CORNER_HEIGHT*2)

	def ShowInternal(self):
		self.Base.Show()
		for wnd in self.Lines:
			wnd.Show()
		for wnd in self.Corners:
			wnd.Show()

	def HideInternal(self):
		self.Base.Hide()
		for wnd in self.Lines:
			wnd.Hide()
		for wnd in self.Corners:
			wnd.Hide()
Das für dich Relevante ist:
Code:
CornerFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Corner_"+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ]
LineFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Line_"+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ]
Nun zum Guide:

Öffne die root und such die ui.py und öffne sie.
Änder in der ThinBoard Klasse:
Code:
	def __init__(self, layer = "UI"):
zu:
Code:
	def __init__(self, layer = "UI", path = "d:/ymir work/ui/pattern/ThinBoard_Corner_"):
und:
Code:
		CornerFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Corner_"+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ]
		LineFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Line_"+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ]
zu:
Code:
		CornerFileNames = [ path+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ]
		LineFileNames = [ path+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ]
dann fügst du am Ende der Klasse folgende Funktion hinzu:
Code:
	def SetNewBaseColor(self, color):
		self.Base.SetColor(color)
Nun suchst du :
Code:
			elif Type == "thinboard":
				parent.Children[Index] = ThinBoard()
				parent.Children[Index].SetParent(parent)
				self.LoadElementThinBoard(parent.Children[Index], ElementValue, parent)
und schreibst darunter (ACHTUNG! DEN PFAD & COLOR ANPASSEN!):
Code:
			elif Type = "questboard":
				parent.Children[Index] = ThinBoard("UI","d:/dein/neuer/pfad/ThinBoard_Corner_")
				parent.Children[Index].SetParent(parent)
				parent.Children[Index].SetNewBaseColor(DEINE_COLOR)
				self.LoadElementThinBoard(parent.Children[Index], ElementValue, parent)
Nun wieder in die questdialog.py (uiscript):
Änder:
Code:
			"type" : "thinboard",
zu:
Code:
			"type" : "questboard",
Pack wieder die root & die uiscript.
Fertig.

Deine tga's müssen dabei natürlich die Vorgaben einhalten:

"LeftTop","LeftBottom","RightTop","RightBottom "

"Left","Right","Top","Bottom"

Kleines Beispiel:
Code:
			elif Type = "questboard":
				parent.Children[Index] = ThinBoard("UI","d:/ymir work/ui/questboard/questboard_")
				parent.Children[Index].SetParent(parent)
				color = grp.GenerateColor(0.0, 0.0, 1.0, 0.50)
				parent.Children[Index].SetNewBaseColor(color)
				self.LoadElementThinBoard(parent.Children[Index], ElementValue, parent)
Die tga's müssten dann so heißen:

questboard_LeftTop, questboard_LeftBottom usw.

___________________________________________
Ist nicht getestet, sollte aber gehen.

MfG, .Various


EDIT:

Ich sehe grade, du willst ein komplettes Bild als Hintergrund machen... Naja, ich lasse es mal so stehen.
Bei meiner Änderung kannst du halt neue Lines/Corners & die Base (Mitte) des Hintergrund erstellen.

Ein ganzes Bild wäre bei deinem Vorhaben meines Erachtens auch unvorteilhaft weil du das Bild ja je nach Größe des Questfensters skalieren müsstest.. Das würde das Bild verzerren.

Wenn du fragen hast, schreib sie einfach hier :)
11/22/2015 18:08 Metinsoul#3
Wow Danke! :D

Bin es nicht gewohnt das die Antworten so ausführlich sind^^

Wie könnte ich es jetzt einstellen das es eine komplette tga abruft? Will es zumindest mal begutachtet haben^^.
11/22/2015 18:29 .K0rí#4
Quote:
Originally Posted by .Various View Post
Hey,

Der Questhintergrund ist das standard implementierte "thinboard".
Öffne pack/uiscript/questdialog.py, dort siehst du sowas:
Code:
		{
			"name" : "board",
			"type" : "thinboard",
			"style" : ("attach", "ignore_size",),

			"x" : 0,
			"y" : 0,

			"horizontal_align" : "center",
			"vertical_align" : "center",

			"width" : 350,
			"height" : 300,
		},
Die ThinBoard Klasse sieht so aus:
Code:
class ThinBoard(Window):

	CORNER_WIDTH = 16
	CORNER_HEIGHT = 16
	LINE_WIDTH = 16
	LINE_HEIGHT = 16
	BOARD_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.51)

	LT = 0
	LB = 1
	RT = 2
	RB = 3
	L = 0
	R = 1
	T = 2
	B = 3

	def __init__(self, layer = "UI"):
		Window.__init__(self, layer)

		CornerFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Corner_"+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ]
		LineFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Line_"+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ]

		self.Corners = []
		for fileName in CornerFileNames:
			Corner = ExpandedImageBox()
			Corner.AddFlag("attach")
			Corner.AddFlag("not_pick")
			Corner.LoadImage(fileName)
			Corner.SetParent(self)
			Corner.SetPosition(0, 0)
			Corner.Show()
			self.Corners.append(Corner)

		self.Lines = []
		for fileName in LineFileNames:
			Line = ExpandedImageBox()
			Line.AddFlag("attach")
			Line.AddFlag("not_pick")
			Line.LoadImage(fileName)
			Line.SetParent(self)
			Line.SetPosition(0, 0)
			Line.Show()
			self.Lines.append(Line)

		Base = Bar()
		Base.SetParent(self)
		Base.AddFlag("attach")
		Base.AddFlag("not_pick")
		Base.SetPosition(self.CORNER_WIDTH, self.CORNER_HEIGHT)
		Base.SetColor(self.BOARD_COLOR)
		Base.Show()
		self.Base = Base

		self.Lines[self.L].SetPosition(0, self.CORNER_HEIGHT)
		self.Lines[self.T].SetPosition(self.CORNER_WIDTH, 0)

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

	def SetSize(self, width, height):

		width = max(self.CORNER_WIDTH*2, width)
		height = max(self.CORNER_HEIGHT*2, height)
		Window.SetSize(self, width, height)

		self.Corners[self.LB].SetPosition(0, height - self.CORNER_HEIGHT)
		self.Corners[self.RT].SetPosition(width - self.CORNER_WIDTH, 0)
		self.Corners[self.RB].SetPosition(width - self.CORNER_WIDTH, height - self.CORNER_HEIGHT)
		self.Lines[self.R].SetPosition(width - self.CORNER_WIDTH, self.CORNER_HEIGHT)
		self.Lines[self.B].SetPosition(self.CORNER_HEIGHT, height - self.CORNER_HEIGHT)

		verticalShowingPercentage = float((height - self.CORNER_HEIGHT*2) - self.LINE_HEIGHT) / self.LINE_HEIGHT
		horizontalShowingPercentage = float((width - self.CORNER_WIDTH*2) - self.LINE_WIDTH) / self.LINE_WIDTH
		self.Lines[self.L].SetRenderingRect(0, 0, 0, verticalShowingPercentage)
		self.Lines[self.R].SetRenderingRect(0, 0, 0, verticalShowingPercentage)
		self.Lines[self.T].SetRenderingRect(0, 0, horizontalShowingPercentage, 0)
		self.Lines[self.B].SetRenderingRect(0, 0, horizontalShowingPercentage, 0)
		self.Base.SetSize(width - self.CORNER_WIDTH*2, height - self.CORNER_HEIGHT*2)

	def ShowInternal(self):
		self.Base.Show()
		for wnd in self.Lines:
			wnd.Show()
		for wnd in self.Corners:
			wnd.Show()

	def HideInternal(self):
		self.Base.Hide()
		for wnd in self.Lines:
			wnd.Hide()
		for wnd in self.Corners:
			wnd.Hide()
Das für dich Relevante ist:
Code:
CornerFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Corner_"+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ]
LineFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Line_"+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ]
Nun zum Guide:

Öffne die root und such die ui.py und öffne sie.
Änder in der ThinBoard Klasse:
Code:
	def __init__(self, layer = "UI"):
zu:
Code:
	def __init__(self, layer = "UI", path = "d:/ymir work/ui/pattern/ThinBoard_Corner_"):
und:
Code:
		CornerFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Corner_"+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ]
		LineFileNames = [ "d:/ymir work/ui/pattern/ThinBoard_Line_"+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ]
zu:
Code:
		CornerFileNames = [ path+dir+".tga" for dir in ["LeftTop","LeftBottom","RightTop","RightBottom"] ]
		LineFileNames = [ path+dir+".tga" for dir in ["Left","Right","Top","Bottom"] ]
dann fügst du am Ende der Klasse folgende Funktion hinzu:
Code:
	def SetNewBaseColor(self, color):
		self.Base.SetColor(color)
Nun suchst du :
Code:
			elif Type == "thinboard":
				parent.Children[Index] = ThinBoard()
				parent.Children[Index].SetParent(parent)
				self.LoadElementThinBoard(parent.Children[Index], ElementValue, parent)
und schreibst darunter (ACHTUNG! DEN PFAD & COLOR ANPASSEN!):
Code:
			elif Type = "questboard":
				parent.Children[Index] = ThinBoard("UI","d:/dein/neuer/pfad/ThinBoard_Corner_")
				parent.Children[Index].SetParent(parent)
				parent.Children[Index].SetNewBaseColor(DEINE_COLOR)
				self.LoadElementThinBoard(parent.Children[Index], ElementValue, parent)
Nun wieder in die questdialog.py (uiscript):
Änder:
Code:
			"type" : "thinboard",
zu:
Code:
			"type" : "questboard",
Pack wieder die root & die uiscript.
Fertig.

Deine tga's müssen dabei natürlich die Vorgaben einhalten:

"LeftTop","LeftBottom","RightTop","RightBottom "

"Left","Right","Top","Bottom"

Kleines Beispiel:
Code:
			elif Type = "questboard":
				parent.Children[Index] = ThinBoard("UI","d:/ymir work/ui/questboard/questboard_")
				parent.Children[Index].SetParent(parent)
				color = grp.GenerateColor(0.0, 0.0, 1.0, 0.50)
				parent.Children[Index].SetNewBaseColor(color)
				self.LoadElementThinBoard(parent.Children[Index], ElementValue, parent)
Die tga's müssten dann so heißen:

questboard_LeftTop, questboard_LeftBottom usw.

___________________________________________
Ist nicht getestet, sollte aber gehen.

MfG, .Various


EDIT:

Ich sehe grade, du willst ein komplettes Bild als Hintergrund machen... Naja, ich lasse es mal so stehen.
Bei meiner Änderung kannst du halt neue Lines/Corners & die Base (Mitte) des Hintergrund erstellen.

Ein ganzes Bild wäre bei deinem Vorhaben meines Erachtens auch unvorteilhaft weil du das Bild ja je nach Größe des Questfensters skalieren müsstest.. Das würde das Bild verzerren.

Wenn du fragen hast, schreib sie einfach hier :)
Ist zwar nett gemeint aber damit änderst du leider alles auch normale thinboards. Ich würde eine neue Klasse erstellen bzw einfach in der uiscript ein Image angeben statt thinboard. Ich werde morgen mittag das mal hier rein schreiben bin leider nicht Zuhause um das Jezt zu machen.
11/22/2015 18:44 .Various#5
Quote:
Originally Posted by .K0rí View Post
Ist zwar nett gemeint aber damit änderst du leider alles auch normale thinboards. Ich würde eine neue Klasse erstellen bzw einfach in der uiscript ein Image angeben statt thinboard. Ich werde morgen mittag das mal hier rein schreiben bin leider nicht Zuhause um das Jezt zu machen.
Nicht das ich wüsste. Da ich den normalen Pfad als Standard setze, gibt das mit allen anderen Thinboards keine Komplikation:

Code:
def __init__(self, layer = "UI", path = "d:/ymir work/ui/pattern/ThinBoard_Corner_"):
Dieser wird nur geändert, wenn man es angibt wie in meinem Beispiel.

Wenn ich mich irre, korrigiere mich bitte :)
11/22/2015 21:19 Metinsoul#6
Quote:
Ist zwar nett gemeint aber damit änderst du leider alles auch normale thinboards. Ich würde eine neue Klasse erstellen bzw einfach in der uiscript ein Image angeben statt thinboard. Ich werde morgen mittag das mal hier rein schreiben bin leider nicht Zuhause um das Jezt zu machen.
Wäre sehr nett, wenn du das machen könntest :)