S5Hook & GUI Editor

» Siedler Map Source Forum » Siedler DEdK Script Forum » S5Hook & GUI Editor

Seiten: Zurück 1 2 3 4 5 6 7 Nächste Seite

andre111
#26
13.06.2014 16:56
Beiträge: 220

Hm ok, wenn ich allerdings die selbe Entity xml zum Beispiel in die patchex packe funktioniert alles problemlos

bobby
#27
14.06.2014 21:55
Beiträge: 393

Naja... die Funktionen sind natürlich noch nicht komplett ausgereift
Du kannst mir die patchex ja mal schicken dann schau ich es mir an.

____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

bobby
#28
19.06.2014 16:40
Beiträge: 393

Bedienungsanleitung

Es gibt nun eine recht ausführliche Bedienungsanleitung zum GUI Editor.
Hier zu finden: Editor Guide
Hoffentlich sehen wir bald ein paar neue Widgets.

@andre111: Kann es sein das du die Entität zum selben Zeitpunkt erstellst wie du ReloadEntities() aufrufst?

____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

Dieser Beitrag wurde von bobby am 24.03.2016 um 14:19 editiert.

Zedeg
#29
20.06.2014 11:36
Beiträge: 428

Das Problem sitzt in 99% der Fälle vorm Pc...

Der Patch 1.06 funktioniert nun (mal wieder hatte der Feuervogel die Hände im Spiel gehabt ), in ItM gehen die Arbeiter in ihre Werkstätten (endlich) und die Demomap funktioniert (tolle Musik-spielt nur leider parallel zur normalen, wenn man einen Spielstand lädt).

Ich habe mit dem Patch 1.05 den GUI-Editor v0.1 geöffnet. Widgets einfügen oder alte aus ingame.xml laden ging, doch die Texturen kamen nicht. Wollte ich manuell neue laden, kam selbst bei den spieleigenen Texturen ,,Invalid Path´´. Aha, funktioniert also doch nicht mit dem alten Patch. Doch jetzt habe ich mit Patch 1.06 und dem GUI-Editor v0.2 immer noch das gleiche Problem.

____________________
Journalisten erkundigen sich bei Wissenschaftlern meist nicht nach Grundlagen, sondern eher nach Ergebnissen und Folgerungen. Das erklärt womöglich auch, warum sich Forschungsberichte in den Medien so häufig als feststehende Erkenntnisse lesen, nicht aber als Ideen, Entdeckungen oder Indizien, um die es sich genau genommen in den meisten Fällen handelt. -Axel Bojowski

mcb
#30
20.06.2014 12:36
Beiträge: 1472

Entpack die Texturen mal neu und lösch die alten. Eventuell als Admin starten. Vielleicht hilfts.

bobby
#31
20.06.2014 14:15
Beiträge: 393

Zitat von Zedeg:
Ich habe mit dem Patch 1.05 den GUI-Editor v0.1 geöffnet. Widgets einfügen oder alte aus ingame.xml laden ging, doch die Texturen kamen nicht. Wollte ich manuell neue laden, kam selbst bei den spieleigenen Texturen ,,Invalid Path´´. Aha, funktioniert also doch nicht mit dem alten Patch. Doch jetzt habe ich mit Patch 1.06 und dem GUI-Editor v0.2 immer noch das gleiche Problem.


Wo du das Programm das erste mal gestartet hast, hast du ja einen leeren Ordner als Arbeitsverzeichnis gewählt.
Geh mal in den Ordner und lösche alles was dort drinnen ist.
Dann starte den Editor und geh unter Settings auf Set Working Directory. Wähle den Ordner neu aus und es sollte gehen.
Falls nicht schau noch mal in den Ordner und wenn der leer ist, dann stimmt irgendwas mit deiner Registry nicht und wir schauen weiter.

____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

Zedeg
#32
20.06.2014 15:10
Beiträge: 428

Und zu diesen 99% der Fälle gehöre ich..

Dabei habe ich das schon zweimal ausprobiert. Warum 's erst jetzt klappt... seufz. Auf jeden Fall habe ich schon eine Idee, was ich einbauen könnte.

____________________
Journalisten erkundigen sich bei Wissenschaftlern meist nicht nach Grundlagen, sondern eher nach Ergebnissen und Folgerungen. Das erklärt womöglich auch, warum sich Forschungsberichte in den Medien so häufig als feststehende Erkenntnisse lesen, nicht aber als Ideen, Entdeckungen oder Indizien, um die es sich genau genommen in den meisten Fällen handelt. -Axel Bojowski

daniBIGdani
#33
23.06.2014 12:08
Beiträge: 153

SetString Funktion?

Hi,

gibt es eine Möglichkeit eigene Strings in bestehende .xml Dateien einzufügen und wie packe ich es dann in meine Map?

Mit S5Hook.ChangeString kann ich ja jeden bestehenden Text verändern, aber eben keine Neuen in die .xml Datei schreiben.

LG Daniel

bobby
#34
23.06.2014 14:12
Beiträge: 393

Was für Strings und XML Dateien meinst du genau?

Grundsätzlich gilt: Entity Definitionen aus den XMLs können geladen werden, es ist aber noch nicht sehr stabil.

____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

daniBIGdani
#35
23.06.2014 16:56
Beiträge: 153

Ich meine die Texte.xml Dateien z.b. menutop.xml in der data.bba des Orginal Spiels. Hier würde ich gerne einen neuen Eintrag hinzufügen ala:

<string id="Find_hero1" mod="20041102152922" MasterMod="" WorkInProgress="true" CharacterName="" Recordingneeded="" Comments="" TimeSync="" TimeSyncDuration="">@color:180,180,180,255 Dario @cr @color:255,255,255,255 Springt zu Dario und selektiert ihn. Wenn Feinde in Darios Nähe sind, leuchtet dieser Button blau.</string>



Leider weiss ich nicht, wie ich die veränderte Datei dann in meine Map lade, denn nur die Ordnerstruktur nachzubauen klappt scheinbar nicht.

Deshalb hatte ich gehofft, dass es die Möglichkeit per Skriptbefehl gibt, einen neuen Eintrag in eine bestehende .xml Datei einzufügen.

z.b.

S5Hook.SetString("xml-dateiname", "key" "text");


function S5Hook.SetString(file, key, text)
  open(file); then
  setString(<string id=key mod="20041102152922" MasterMod="" WorkInProgress="true" CharacterName="" Recordingneeded="" Comments="" TimeSync="" TimeSyncDuration="">text</string>)
end
...



LG Daniel

mcb
#36
23.06.2014 17:53
Beiträge: 1472

Wozu? Sämtliche GUI-Texte lassen sich per XGUIEng.SetText(widget, text) verändern, die Texte über Entities mit S5Hook.SetCustomNames. Da muss man nicht die xmls für ändern.

Oder meinst du S5Hook.ChangeString(identifier, newString)? Die Funktion ändert den String nur bis zum nächsten laden.

daniBIGdani
#37
23.06.2014 18:03
Beiträge: 153

Aus Prinzip.

Ich möchte nun mal so gut programmieren wie es technisch möglich ist. Vielleicht hast du dir schon mal die Kampagnen oder Singleplayermaps der Entwickler genauer angeschaut. Da wird viel ausgelagert, was einen schönen Programmierstil zeigt.

Zum S5Hook.ChangeString: Wenn man die Funktion bei Laden der Map wieder aufruft bleibt der geänderte Text stehen!

LG Daniel

mcb
#38
23.06.2014 18:10
Beiträge: 1472

Versuch mal per S5Hook.AddArchive(path , true) die Map-Datei erneut zu laden, ansonsten musst du sie in die patchex.bba auslagern.

bobby
#39
23.06.2014 18:38
Beiträge: 393

Es ist möglich die bestehenden Einträge dieser von dir genannten XMLs zu ändern jedoch nicht Neue einzufügen.
Die Bestehenden können durch ChangeString geändert werden, was wie mcb jedoch schon erwähnt hat nicht sehr sinnvoll ist da man sie so oder so in lua ändern kann.
Dazu kommt auch noch das ChangeString maximal 24 Zeichen erlaubt da es sonst zu unvorhersehbaren Fehlern kommen könnte. Es könnte zwar so erweitert werden, dass es möglich wird maximal so viele Zeichen einzufügen wie zuvor gespeichert waren. Dies ist der Aufwand aber nicht wert, da es ja in lua auch geht.
Wahrscheinlich kann ein neues StringTable im XML Format eingefügt werden, was aber ebenfalls nicht sehr sinnvoll ist.

Wenn du jetzt einen Eintrag ändern willst geht das so:

S5Hook.ChangeString("menutop/find_hero1", "Foobar")



____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

andre111
#40
27.06.2014 09:47
Beiträge: 220

Könnte es auch möglich sein Text wieder aus der log-Datei auszulesen?

Ich suche seit längerem einen Weg Daten von einer Map in eine andere zu übertragen.
(z.B: Spieler startet Map 1 - ... - bestimmte daten werden irgentwie gespeichert(z.B. Log-Datei) - map 2 wird automatisch gestartet und läd diese Daten wieder)

mcb
#41
27.06.2014 11:14
Beiträge: 1472

Nimm GDB.SetSring(name, string) und GDB.GetString(name). Sie Speichern/Lesen aus der GDB-Datei des Spielers (da wird auch gespeichert, ob eine Map bereits gewonnen ist).

andre111
#42
27.06.2014 16:15
Beiträge: 220

Ok, vielen dank.

Ich habe mir nun um es leicher zu machen die Comfortfunktionen
GDB_SetTable und GDB_GetTable geschrieben um ganze tables abzuspeichern.

Ich schreibe sie mal hier rein falls jemand interessiert ist.
Verbesserungsvorschläge sind erwünscht, besonders weil ich mir fast sicher bin, dass das ganze einfacher/besser umzusetzen ist.
Verwendet werden dabei die "GDB-Strings": *name*0, *name*1, ...

Ich habe auch eine Beispielfunktion hinzugefügt: testGDB

function testGDB()
	local tableSave = {
		key1 = "text",
		key2 = 123,
		key_table = {
			key1_1 = "innen1"
		},
		key3 = false,
		leerertable = {}
	}
	GDB_SetTable("and111_test_testTable",tableSave)
	
	for k,v in pairs(tableSave) do
		Message("Save: Key="..k..", Value="..tostring(v))
	end
	
	local tableLoad = GDB_GetTable("and111_test_testTable")
	
	for k,v in pairs(tableLoad) do
		Message("Load: Key="..k..", Value="..tostring(v))
	end
end

function GDB_SetTable(_saveName, _tableO)
	assert(type(_tableO) == "table", "Kann nur tables speichern!")

	saveTableInternal(_saveName, _tableO, 0)
end

function saveTableInternal(_saveName, _table, _currentID)
	local count = 0
	for k,v in pairs(_table) do
		count = count + 1
	end
	GDB.SetString(_saveName.._currentID, count)
	
	for k,v in pairs(_table) do
		assert(type(k) == "string", "Der Table darf nur Strings als Keys enthalten!")
	
		if type(v) == "string" then
			_currentID = _currentID + 1
			GDB.SetString(_saveName.._currentID, "string")
			_currentID = _currentID + 1
			GDB.SetString(_saveName.._currentID, k)
			_currentID = _currentID + 1
			GDB.SetString(_saveName.._currentID, v)
		elseif type(v) == "number" then
			_currentID = _currentID + 1
			GDB.SetString(_saveName.._currentID, "number")
			_currentID = _currentID + 1
			GDB.SetString(_saveName.._currentID, k)
			_currentID = _currentID + 1
			GDB.SetString(_saveName.._currentID, v)
		elseif type(v) == "nil" then

		elseif type(v) == "boolean" then
			_currentID = _currentID + 1
			GDB.SetString(_saveName.._currentID, "boolean")
			_currentID = _currentID + 1
			GDB.SetString(_saveName.._currentID, k)
			_currentID = _currentID + 1
			if v then
				GDB.SetString(_saveName.._currentID, "true")
			else
				GDB.SetString(_saveName.._currentID, "false")
			end
		elseif type(v) == "table" then
			_currentID = _currentID + 1
			GDB.SetString(_saveName.._currentID, "table")
			_currentID = _currentID + 1
			GDB.SetString(_saveName.._currentID, k)
			_currentID = _currentID + 1
			_currentID = saveTableInternal(_saveName, v, _currentID)
		else
			assert(false, "Type "..type(v).." kann nicht abgespeichert werden!")
		end
	end
	
	return _currentID
end

function GDB_GetTable(_saveName)
	local _tableO = {}
	
	loadTableInternal(_saveName, _tableO, 0)
	return _tableO
end

function loadTableInternal(_saveName, _table, _currentID)
	local count = tonumber(GDB.GetString(_saveName.._currentID))
	
	for i = 1, count do
		_currentID = _currentID + 1
		local typeS = GDB.GetString(_saveName.._currentID)

		if typeS == "string" then
			_currentID = _currentID + 1
			local key = GDB.GetString(_saveName.._currentID)
			_currentID = _currentID + 1
			local value = GDB.GetString(_saveName.._currentID)
			
			_table[key] = value
		elseif typeS == "number" then
			_currentID = _currentID + 1
			local key = GDB.GetString(_saveName.._currentID)
			_currentID = _currentID + 1
			local value = GDB.GetString(_saveName.._currentID)
			
			_table[key] = tonumber(value)
		elseif typeS == "boolean" then
			_currentID = _currentID + 1
			local key = GDB.GetString(_saveName.._currentID)
			_currentID = _currentID + 1
			local value = GDB.GetString(_saveName.._currentID)
			
			if value == "true" then
				_table[key] = true
			else
				_table[key] = false
			end
		elseif typeS == "table" then
			_currentID = _currentID + 1
			local key = GDB.GetString(_saveName.._currentID)
			
			_table[key] = {}
			_currentID = _currentID + 1
			_currentID = loadTableInternal(_saveName, _table[key], _currentID)
		else
			assert(false, "Unbekannter Type: "..typeS)
		end
	end
	
	return _currentID
end

mcb
#43
27.06.2014 20:10
Beiträge: 1472

Ich denke es wäre einfacher, das ganze table in einen string zu packen:
key1===value1|||key2===value2 ...
Sowas wie === und ||| lässt sich mit string.find einfach erkennen, untertables müssten irgendwie anders gekennzeichnet werden.

andre111
#44
27.06.2014 20:52
Beiträge: 220

Hm ja das wäre ne gute Idee, ich hatte vermutet, dass GDB.SetString irgendein nicht allzu großes Limit hat.
Wie lag darf ein String in GDB sein oder ist das sogar unlimitiert?

Wenn das ganze unlimitiert und groß genug ist schreibe ich die funktionen nochmal neu.

mcb
#45
27.06.2014 22:12
Beiträge: 1472

Da hab ich ehrlich gesagt keine Ahnung... Ich hab bisher nur einzelne, kurze strings da abgelegt. Müsste man ausprobieren.

andre111
#46
05.07.2014 17:50
Beiträge: 220

Ich habe ein weiteres Problem:

Wenn ich die Map und S5Hooks einmal gestartet habe, kann ich weder die Karte neustarten noch laden/eine andere Karte starten ohne, dass das Spiel abstürtzt.

bobby
#47
05.07.2014 17:59
Beiträge: 393

Falls du AddArchive aufrufst und im 2. Argument true mitgibst musst du dass so machen sonst passiert das von dir Beschriebene:

  if S5Hook.RuntimeLoad("AddedMapArchive_Mapname") ~= "yes" then
    S5Hook.AddArchive("extra2/shr/maps/user/" .. Framework.GetCurrentMapName() .. ".s5x", true)
    S5Hook.RuntimeStore("AddedMapArchive_Mapname", "yes")
  end

Dafür benötigst du den S5Hook v0.4.

____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

andre111
#48
05.07.2014 19:43
Beiträge: 220

Danke, das Problem ist damit gelöst.

Den crash mit veränderten Entities konnte ich zwar noch nicht fixen, aber da ich jetzt wieder vernünftiges Internet habe werde ich dir morgen die Entity xml mal schicken

wilma456
#49
07.07.2014 18:12
Beiträge: 460

Bei mir ist das Arbeitsverzeichnis leer! Ich kann nicht wie in der Anleitung beschrieben etwas laden.

____________________
Schlacht um Crawford

Wilmasmod

Zedeg
#50
07.07.2014 18:50
Beiträge: 428

Meinst du den GUI-Editor? Dann schau dir doch mal Beitrag 31 von bobby an, vielleicht hilft 's.

____________________
Journalisten erkundigen sich bei Wissenschaftlern meist nicht nach Grundlagen, sondern eher nach Ergebnissen und Folgerungen. Das erklärt womöglich auch, warum sich Forschungsberichte in den Medien so häufig als feststehende Erkenntnisse lesen, nicht aber als Ideen, Entdeckungen oder Indizien, um die es sich genau genommen in den meisten Fällen handelt. -Axel Bojowski

Seiten: Zurück 1 2 3 4 5 6 7 Nächste Seite

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum