Spachausgabe und Anzeigename einer Einheit ändern/deaktivieren
» Siedler Map Source Forum » Siedler DEdK Script Forum » Spachausgabe und Anzeigename einer Einheit ändern/deaktivieren
Seiten: 1
Messoras
|
#1 30.11.2016 16:52 Beiträge: 84 |
Spachausgabe und Anzeigename einer Einheit ändern/deaktivieren
Hallo zusammen,
heute möchte ich eine Karte bauen, bei der mein Held zu Anfang ein einfacher Leibeigener ist.
Im Laufe der Missionen muss man ein paar Aufgaben machen und wird dann zu einem Krieger ausgebildet, woraufhin der Held ein schwarzer Ritter wird.
Mein Problem ist nur: Der Leibeigene quasselt so viel Unsinn. Die Sprüche sind zwar mega lustig im Spiel, aber mein Held sollte einfach gar nichts sagen. Kann man das vielleicht irgendwie ausschalten?
Bei der Gelegenheit wollte ich auch noch mal fragen, ob es möglich ist den über dem Kopf der Einheit angezeigten Namen zu ändern, so dass da statt "Leibeigener" "Held" oder so steht. Den Namen unten neben dem Auswahlfenster mit dem Bildchen habe ich per XGUIEng schon geändert.
Kann mir jemand helfen?
Liebe Grüße,
Messoras
____________________
Six feet of earth make us all equal.
Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.
mcb
|
#2 30.11.2016 17:09 Beiträge: 1472 |
Den Namen zu ändern ist relativ einfach, wenn du den S5Hook nutzt.
An der Sprachausgabe kann man leider nur bedingt etwas ändern, die meisten Sprüche werden nicht per Lua gesteuert.
Messoras
|
#3 30.11.2016 17:21 Beiträge: 84 |
Zitat von mcb:
Den Namen zu ändern ist relativ einfach, wenn du den S5Hook nutzt.
An der Sprachausgabe kann man leider nur bedingt etwas ändern, die meisten Sprüche werden nicht per Lua gesteuert.
Ah ich sehe schon, die S5Hook Tools scheinen recht nützlich zu sein.
Die richtige Implementierung für die Namensänderung wäre dann irgendwo in der FirstMapAction in der Art
local cnTable = { ["heldleibi"] = "Held" , ["held"] = "Held" } S5Hook.SetCustomNames(cnTable)
richtig?
Was heißt bedingt? Mir würde es ja schon reichen die Sprüche für die eine Einheit einfach abzustellen
Gruß,
Messoras
#EDIT: Sehr cool, die S5Hook funktioniert super! Danke für den Tipp.
____________________
Six feet of earth make us all equal.
Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.
Dieser Beitrag wurde von Messoras am 30.11.2016 um 17:34 editiert.
mcb
|
#4 30.11.2016 18:39 Beiträge: 1472 |
Das einzige Problem mit dem Hook ist, das er nicht Savegame-Sicher ist. Du musst also alle Änderungen nach dem Laden neu ausführen. (oder du siehst dir mal das hier an: http://www.siedler-maps.de/for...t-Forum/s5HookLoader-20421.htm)
Das Problem bei den Sprüchen ist, das sie nicht alle Zentral an einem Ort behandelt werden. Wenn du einen Bewegungsbefehl erteilst, kommt die entsprechende Bestätigung irgendwo im C++ Code vor. (Da kommt man zwar ran, siehe Hook, das ist aber ziemlich kompliziert) Wenn du ein Entity Selektierst, wird der Spruch im Selection-Changed-Callback verarbeitet. Den könntest du Theoretisch neu schreiben, (ist aber ne ziemlich lange und unschöne Funktion) das würde aber andere Sprüche nicht abstellen.
Peter-FS
|
#5 05.12.2016 20:34 Beiträge: 1086 |
Das sind zwar unschöne Feinheiten, aber ich denke das stört den Spieler nicht wirklich. Wichtig ist eine gute Story und ein fehlerfreier Ablauf.
Die Fantasie spielt ja auch noch mit, das reicht.
____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!
Messoras
|
#6 14.12.2016 16:13 Beiträge: 84 |
Stack Overflow beim Überschreiben von GUIUpdateSelectionName
Huhu,
wie gesagt hatte ich das mit den Anzeigenamen über die XGUIEng geregelt. Die hat auch gut funktioniert, bis ich andere Entities für Spieler 1 auf der Map hatte.
Der Debugger gibt, sobald ich eine andere Entity auf der Map als "messoras_child" oder "messoras_dream" selektiere, eine StackOverflow Exception an der markierten Stelle aus.
function ChangeNames() GUIUpdate_SelectionNameOrig = GUIUpdate_SelectionName GUIUpdate_SelectionName = function() local sel = GUI.GetSelectedEntity() if sel == GetID("messoras_child") or sel == GetID("messoras_dream") then -- StackOverflow Exception XGUIEng.SetText(XGUIEng.GetCurrentWidgetID(), Umlaute("Messoras")) else GUIUpdate_SelectionNameOrig() end end cnTable = { ["messoras_child"] = "Messoras", ["messoras"] = "Messoras", ["josie_1"] = "Josephine", ["sawyer_1"] = "Master Sawyer", ["bill_1"] = "Bill", ["messoras_dream"] = "messoras", } S5Hook.SetCustomNames(cnTable) end
"messoras_child" ist mein Leibeigener Held und "messoras_dream" ist ein Wolf von Spieler 8, der später in einer Traumsequenz das Team wechselt und vom Spieler übernommen wird. Beide zeigen den Namen richtig an, alle anderen Entities haben gar keinen Namen oder heißen auch "Messoras"...
Weiß jemand woran das liegen könnte?
Was vielleicht noch wichtig ist: Ich rufe die Methode alle 10 Sekunden auf und aktiviere die S5Hook Tools, falls sie nicht aktiv sind, damit das ganze auch nach dem Laden noch funktioniert.
Gruß,
( der richtige ) Messoras
____________________
Six feet of earth make us all equal.
Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.
Dieser Beitrag wurde von Messoras am 14.12.2016 um 16:23 editiert.
mcb
|
#7 14.12.2016 16:40 Beiträge: 1472 |
Da du die Funktion öfter als ein mal Aufrufst, überschreibst du dein Backup:
--vor 1. Aufruf GUIUpdate_SelectionNameOrig - nil GUIUpdate_SelectionName - function original -- nach 1. aufruf (so sollte es sein) GUIUpdate_SelectionNameOrig - function original GUIUpdate_SelectionName - function neu -- nach 2. aufruf GUIUpdate_SelectionNameOrig - function neu GUIUpdate_SelectionName - function neu
Bei GUIUpdate_SelectionNameOrig() ruft sich also eine funktion selbst wieder auf, ohne irgendwas am Zustand des Programmes zu ändern. Ergibt eine typische Endlosrekursion.
Messoras
|
#8 14.12.2016 20:30 Beiträge: 84 |
Gibt es denn irgendeine Alternative zu gewährleisten, dass die Namensänderungen auch nach dem Ladevorgang noch laufen, so wie eine Methode, die nach dem Laden aufgerufen wird?
Das beste wäre ja ein entsprechendes TriggerEvent
-> Trigger.RequestTrigger( Events.LOGIC_EVENT_MAPLOAD,"","UpdateNamesJob",1 ) oder so...
Gruß,
Messoras
____________________
Six feet of earth make us all equal.
Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.
mcb
|
#9 14.12.2016 22:31 Beiträge: 1472 |
Einen Trigger gibt es dafür nicht, aber einen Callback: Mission_OnSaveGameLoaded (Das ist wohl der Callback, der von mir am häufigsten überschrieben wird)
Du darfst aber die GUIUpdate_SelectionName nicht wieder überschreiben, da das Original eine Lua-Funktion ist, wird sie normal gespeichert und wieder geladen. Nur C++ Funktionen (wie die in Logic unf Trigger) werden nicht gespeichert sondern neu erzeugt.
Messoras
|
#10 14.12.2016 23:57 Beiträge: 84 |
Soo meine Lösung funktioniert jetzt auch.
function UpdateNamesJob() if not S5Hook then InstallS5Hook() ChangeNames() end end function InitNames() GUIUpdate_SelectionNameOrig = GUIUpdate_SelectionName end function ChangeNames() --if not GUIUpdate_SelectionNameOrig then InitNames() end GUIUpdate_SelectionName = function() local sel = GUI.GetSelectedEntity() if sel == GetID("messoras_child") or sel == GetID("messoras_dream") then XGUIEng.SetText(XGUIEng.GetCurrentWidgetID(), Umlaute("Messoras")) else GUIUpdate_SelectionNameOrig() end end cnTable = { ["messoras_child"] = "Messoras", ["messoras"] = "Messoras", ["josie_1"] = "Josephine", ["sawyer_1"] = "Master Sawyer", ["bill_1"] = "Bill", ["messoras_dream"] = "Messoras", --["josie_hut"] = "Josie's House" } S5Hook.SetCustomNames(cnTable) end
Der Job wird aus der FMA als SimpleJob aufgerufen, könnte aber natürlich auch einmalig nach dem Spielstand-Laden-Callback aufgerufen werden.
Gruß,
Messoras
____________________
Six feet of earth make us all equal.
Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.
Seiten: 1