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

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

Impressum