Text aus einer XML Datei auslesen und anzeigen lassen?

  • Ob modDesc oder extra XML, man kann damit doch eh die Texte beliebig ändern (vorausgesetzt man kann einen Texteditor bedienen und lesen/schreiben). Und weil ich ja ein Freund von international verständliche Mods bin finde ich die Lösung mit den g_i18n und der modDesc um ein vielfaches besser, da man das dann gleich Sprachspezifisch hat. Da die Texte wohl eh Mapspezifisch sein werden bietet es sich an dafür die modDesc der Map zu verwenden.

  • :D ...stimmt auch wieder, das stammt von mir.
    Weil der TE ja gleich davon gesprochen hat, die Texte aus einer zusätzlichen XML auszulesen. Da bin ich davon ausgegangen das er es so anbieten will, das jeder User die texte frei ändern kann und somit in jeder Map eingebaut werden kann, mit individuellen Texten.



    EDIT:


    Da hat bassaddict nun auch wieder recht, daher ist es wohl doch am besten, das ganze als extraSource einzubauen in die Map. So braucht man, wegen der "Spracherkennung" nicht das Skript um einige Zeilen erweitern um auch internationale Texte anzubieten.

  • Weil der TE ja gleich davon gesprochen hat, die Texte aus einer zusätzlichen XML auszulesen.


    Genau so war es auch von Anfang an gedacht, sonst wäre ich nicht auf die Idee mit der extra XML gekommen ;)


    Aber man könnte das genauso gut auch in die modDesc der Map auslagern, weil das Symbol ja eh eingefügt werden muss...

  • Ich habe ihm bei dem ganzem mal geholfen, funktioniert auch soweit. Wird jetzt über extraSource direkt in der Map geladen.


    Aber da man ja immer was lernen will, stelle ich das "fertige" nochmal hier rein, wenn es etwas auszubessern gibt bzw etwas falsch geschrieben ist, würde ich mich über Verbesserungen der Profis freuen:


    Attribute im GE sind folgende:

    Code
    <UserAttribute nodeId="13">
    <Attribute name="InfoField" type="string" value="info1"/>
    <Attribute name="onCreate" type="scriptCallback" value="modOnCreate.customInfoTriggerOnCreate"/>
    </UserAttribute>


    In der Moddesc der Map der text bei den l10n einträgen:

    XML
    <text name="info1">
    <en>Hallo.</en>
    <de>Hallo. </de>
    </text>


    [lua]customInfoTrigger = {}


    local customInfoTrigger_mt = Class(customInfoTrigger);


    function customInfoTrigger.onCreate(id)
    g_currentMission:addUpdateable(customInfoTrigger:new(id));
    end;


    function customInfoTrigger:new(id)
    local instance = {};
    setmetatable(instance, customInfoTrigger_mt);


    instance.triggerId = id;
    addTrigger(id, "triggerCallback", instance);

    instance.infoSymbol = getChildAt(id, 0);
    local x, y, z = getTranslation(instance.infoSymbol);
    instance.posY = y;
    instance.jump = 0.05;


    instance.isEnabled = true;
    instance.textInfo = getUserAttribute(id, "InfoField");
    instance.playerInTrigger = false;
    instance.timer = 0;
    instance.timerBackup = 0;
    instance.startTimer = false;
    return instance;

    end;


    function customInfoTrigger:delete()
    removeTrigger(self.triggerId);
    end;


    function customInfoTrigger:triggerCallback(triggerId, otherId, onEnter, onLeave, onStay)
    if onEnter and self.isEnabled then
    if (g_currentMission.player ~= nil and otherId == g_currentMission.player.rootNode) or (g_currentMission.controlledVehicle ~= nil and otherId == g_currentMission.controlledVehicle.components[1].node) then
    self.isEnabled = false;
    self.playerInTrigger = true;
    end;
    elseif onLeave then
    if (g_currentMission.player ~= nil and otherId == g_currentMission.player.rootNode) or (g_currentMission.controlledVehicle ~= nil and otherId == g_currentMission.controlledVehicle.components[1].node) then
    self.playerInTrigger = false;
    end;
    end;
    end;


    function customInfoTrigger:update(dt)



    if self.isEnabled then
    rotate(self.infoSymbol, 0, 0.005 * dt, 0);
    self.jump = self.jump - 0.00015 * dt;
    local x, y, z = getTranslation(self.infoSymbol);
    setTranslation(self.infoSymbol, x, y + self.jump, z);

    if y + self.jump <= self.posY then
    self.jump = 0.05;
    end;
    end;



    if self.playerInTrigger then
    --setTextBold(true);
    --setTextColor(1,1,1,1);
    --renderText(0.32, 0.515, 0.015, g_i18n:getText(self.textInfo));
    --setVisibility(self.triggerId, false);
    self.startTimer = true;
    end;


    if self.startTimer then
    self.timer = self.timer + dt;
    if self.timer >= 1 and self.timer <= 6000 then
    setTextBold(true);
    setTextColor(1,1,1,1);
    renderText(0.32, 0.515, 0.015, g_i18n:getText(self.textInfo));
    setVisibility(self.triggerId, false);
    elseif self.timer >= 6000 then
    self.startTimer = false;
    self.timer = self.timerBackup;
    end;
    end;



    end;



    g_onCreateUtil.addOnCreateFunction("customInfoTriggerOnCreate", customInfoTrigger.onCreate);
    [/lua]


    Ist jetzt also so, das der Text für eine bestimmte Zeit eingeblendet wird.

  • Mir fehlt da so irgendwie die Möglichkeit die Texte mit Mausklick ausblenden zu lassen. Halt so wie bei den originalen Infotriggern auch. In LS11 gab es dafür eine eigene Funktion (ich geh mal davon aus, dass es die in LS13 auch noch gibt), mir fällt allerdings beim besten Willen nicht mehr ein, wie die Funktion heißt.

  • Hi,


    jo nochmals vielen Dank euch allen für die Hilfe. Bin soweit sehr zufrieden mit dem Script.


    Was man allerdings noch machen müsste:


    - Die Trigger nach dem einladen der Map nicht mehr anzeigen lassen (z.Z werden die nach dem Laden wieder neu auf die Map gesetzt)
    - Im MP gibt es das Problem, das die trigger da sind. Was ja eigentlich auch OK ist aber... Wenn ein Client in den Trigger geht wird der Text angezeigt und das Symbol ist weg aber nur für den Client. Der Host kann ebenfalls drüber gehen und das Symbol verschwindet auch für ihn.


    Geht aber erst der Host in den Trigger, ist er für die Clients zwar noch da aber wenn man als Client drüber geht bleibt das Symbol regungslos stehen und es wird KEIN Text angezeigt!
    Meine Idee wäre, die Trigger im MP erst gar nicht anzeigen zu lassen.


    Habe aber noch keine Lösung dafür gefunden :(


    lg
    Webby

  • Mahlzeit!


    Deine gesuchten Funktionen dürften "not g_currentMission.missionInfo.isValid " (gibt Auskunft darüber ob das Savegame schonmal gespeichert wurde) und "g_currentMission.missionDynamicInfo.isMultiplayer" (detektiert ein MP-Spiel) sein - zumindest haben diese Funktionen beim LS11 funktioniert.


    Ich bin immo selbst noch nicht soweit mit meiner Map, bzw. warte auf den finalen Patch - von daher werde ich das erst später testen, wie ich die InfoTrigger an's Laufen bekomme.


    LG


    IRCox


    P.S.: Ein kleines Feedback wäre schön, ob's denn geklappt hat :whistling:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!