triggerId zu Trigger Object

  • Hallo,


    ich bekomme eine triggerId als callback eines Raycasts. Wie genau kommen ich von dieser id zum eigentlichen trigger object? Mit trigger object meine ich das wirkliche Object, in dem alle restlichen Daten (zusätzlich zur triggerId) angegeben sind. Bei einem SprayerFillTrigger also z.B. der fillType bzw. sprayType, litersPerSqmPerSecond, name usw.


    Ich habe bisher folgende Methoden versucht, alle jedoch ohne Erfolg:
    [lua]
    g_currentMission:getNodeObject
    --testweise noch folgende probiert, quasi aus Jux und Dollerei
    g_currentMission.nodeToVehicle
    g_currentMission.objectToTrailer
    [/lua]


    Hat jemand vlt. ne Idee wie man das hinbekommen könnte? Danke im Voraus.

  • Du könntest es mit g_currentMission.nodeObjects versuchen. Wobei ich zwar vermute, dass sich getNodeObject der Tabelle bedient, aber versuchen kann mans ja trotzdem.


    Wenn das nicht klappt könntest du dir g_currentMission.updateables mal genauer angucken.

  • Hi Bass, danke erstmal für die Idee.


    g_cM:getNodeObject() holt, wie du schon angedeutet hast, in der Tat nur die Daten aus g_cM.nodeObjects, wo die Trigger aber nicht drin sind. Ich hab mir schon die g_cM.nonUpdateables, wo zumindest die SprayTriggers drin sind, angeguckt. Das würde funktionieren, würde aber bedeuten ich bräuchte eine Referenz-Index-Table die ich mir irgendwann beim Laden des Spiels erstelle um zu wissen welche triggerId welchen Index hat. Selbiges bei TipTriggers, die ja in g_cM.tipTriggers sind. Also an sich kein Problem.


    Nur mit den inzwischen immer öfters auftauchenden kaufbaren Triggers - sein es Placeables, HKL-Auflieger-Tanks, Hänger mit Saat-, Fertilizer- oder Fueltriggers, oder was es da alles gibt - müsste ich diese Referenztabelle relativ oft updaten, was wiederum gegen mein Performance-Herz spricht.


    Oder, und das ist gerade eher ein Schnellschuss, ich hänge das updaten jener Referenztabelle an die spielinterne Kauffunktion mit an. Also würde ich bei jedem neu gekauften Objekt kucken ob sie die nonUpdateables aktualisiert hat. Weiß jemand zufällig wie diese Kauffunktion heißt?

  • Beim kaufen wird die load-Funktion aufgerufen, wie beim Spielstart auch. Beim verkaufen und Spiel beenden wird die delete-Funktion aufgerufen.
    Beim resetten spielen die save/load attributes Funktionen eine Rolle. Ich weiß nicht, ob sich da auch was an den Tabellen verändert, wäre aber nicht schlecht das zu überprüfen. Nicht das da irgendwas beim resetten von Fahrzeugen nicht mehr geht.

  • Kannst du nicht die AddTrigger-Methode überschreiben. Ich bin mir nicht wirklich sicher, ob das so funktionieren könnte...


    [lua]


    local g_currentMission.registeredTriggers = {};
    local oldAddTrigger = addTrigger;


    addTrigger = function(triggerID, callbackName, instance)
    oldAddTrigger(triggerID, callbackName, instance);
    table.insert(g_currentMission.registeredTriggers, instance)
    end;
    [/lua]


    Dann hättest du alle Trigger in einem Table und könntest sie mit einer funktion über die triggerID abfragen :


    [lua]
    function getSpecifiedTrigger(triggerID)
    for _,v in pairs(g_currentMission.registeredTriggers) do
    if v.triggerID ~= nil then
    if v.triggerID = triggerID then
    return v;
    end;
    end;
    end;
    end;
    [/lua]


    Wie gesagt... Ich bin mir nicht sicher, wann die überschriebene Methode greift. Im schlimmsten Fall erst nach dem Initialisieren der Standard-Scripte, sodass nur die AddTrigger() - Methode die von Mods aufgerufen wird, die überschriebene Funktion ausführt ?(

  • Uuuh Fiat, an die append-Funktion beim Erstellen des Triggers hatte ich noch gar nicht gedacht. Prima Idee. Zumal ich dann kein table.insert, sondern table[triggerId] = instance benutzen würde. Das hätte den Vorteil dass ich später keine for-Schleife brauche, sondern einfach direkt die triggerId als Index benutzen kann.


    Ein generelle Frage zum Anhängen an Funktionen. Ich kenne zwei Möglichkeiten das umzusetzen:

    • Die von dir benutzte, wo ich die alte Funktion manuell in meiner neuen Funktion aufrufe [oldAddTrigger(...)]
    • Utils.appendedFunction(originalFunction, newFunction), wo meine Funktion wirklich angehängt wird.

    Gibt es bei den beiden denn irgendwelche Unterschiede, sei es Performance, Sicherheit oder einfach Schönheit?

  • Stimmt, hab ich mir im Nachhinein auch gedacht :D


    Ich persönlich nutze meistens meine vorgeschlagene Schreibweise um Methoden zu überschreiben. Bin ich so von anderen Spielen gewöhnt, die dafür keine Funktionalität bereitstellen.


    Außerdem hatte ich damals einige Probleme mit der Utils.appendendFunction() hinsichtlich Funktionen mit Rückgabewerten bzw. speziell der loadFromAttributesAndNodes() und getSaveAttributesAndNodes() Methoden.


    Mich wundert nur sehr, dass GIANTS selbst nicht alle Trigger wegspeichert... :huh:


    Grüße Kai

  • Bezüglich Sicherheit wäre es wohl am Besten die appendedFunction zu benutzen. ich meine nämlich mal irgendwo gelesen zu haben, dass die irgendwelche Sicherheitsmechanismen eingebaut haben soll. Bin mir da aber nicht sicher, kann da auch nix genaueres zu sagen.

  • Entweder ich stell mich blöd an, oder ich stell mich sehr blöd an...


    Als Beispiel der GasStationTrigger:
    [lua]
    g_currentMission.registeredTriggers = {};
    local oldGasStationNew = GasStation.new;
    GasStation.new = function(id, trailer, customMt)
    g_currentMission.registeredTriggers[id] = { isGasStationTrigger = true; };
    oldGasStationNew(id, trailer, customMt);
    end;
    [/lua]


    Was passiert:

    • ich nehme die Funktionsvariablen aus der originalen GasStation:new(), doch diese scheinen nicht zu stimmen. Was ich als id übergeben lasse ist im Endeffekt ne Table, was ich als trailer übergeben lasse ist die id.
    • Ich rufe meinen Teil der Funktion vor der Originalfunktion auf, da diese am Ende return self hat. Das scheint aber egal zu sein, denn unabhängig davon wierum ich's mache bekomme ich den Fehler dass die Tabelle nonUpdateable nicht existiert (ergo die onCreate-Funktion mit g_currentMission:addNonUpdateable(GasStation:new(id))):

      Code
      Error: LUA running function 'GasStation.onCreate'
      D:/code/lsim2013_desktop/build/finalbin/dataS/scripts/BaseMission.lua(684) : attempt to index local 'nonUpdateable' (a nil value)


      Das könnte mit den falschen Variablen zusammenhängen

    Benutze ich Utils.appendedFunction passiert natürlich genau das selbe. Jetzt frage ich mich mich, bin ich bei :new() überhaupt an der richtigen Stelle? Das was Kai als instance benutzt, als effektiv die table des Triggers, existiert so meines Erachtens gar nicht.

  • Wenn du klassenspezifische Methoden überschreibst wird als 1. die Referenz auf das Objekt übergeben ;)


    [lua]
    local oldGasStationNew = GasStation.new;
    GasStation.new = function(self, id, trailer, customMt)
    g_currentMission.registeredTriggers[id] = { isGasStationTrigger = true; };
    return oldGasStationNew(self, id, trailer, customMt);
    end;
    [/lua]


    ;)
    Edit : Fehler überarbeitet :S
    Du, wie auch ich zuerst, hast den Rückkabewert vergessen. Daher die nil-Value ;)

Jetzt mitmachen!

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