Beiträge von JakobT

    Ich bin bei mir auf ein Problem gestoßen, bei dem ich nicht weiß ob's am Aufbau oder am script liegt: Ich habe mehrere buyableObjects, sie sind nicht in einer einzelnen TG, sondern verteilt. Das sollte ja eigentlich kein Problem darstellen, da eh onCreate benutzt wird.


    Kaufe ich jetzt eines dieser Objekte, verschwinden die buyIcons aller anderen Objekte. Die Kauftrigger sind allerdings noch da, so dass ich die Objekte auch erfolgreich kaufen kann.


    Björn (oder jmd anderes), ne Idee?


    Ja, es gibt (gab) bei der v0.3 noch einen script-Fehler, wo ich das Original-Overlay nicht richtig (sprich: komplett) gelöscht hatte. Das ist in v0.4 gefixt:


    fillTypeOverlays v0.4



    Dieses Script fügt overlays (hud icons) für insgesamt 28 bzw. 43 fill types zum Spiel hinzu. Es gibt zwei Sets:


    Das 'Giants'-Set
    Die Overlays sind standardisiert, so dass sie Giants' Standard-Overlay-Stil entsprechen.



    Das 'colored minimalistic'-Set
    Die Overlays sind colorisiert und minimalistisch gehalten.


    Das Script installiert die Overlays für alle existierenden fillTypes automatisch. Der User kann in einer XML-Datei angeben, welches der beiden Sets er benutzen möchte.


    Konstruktive Kritik willkommen.

    Ich denke nicht dass escapen hier helfen würde. Ein ">" ist m.W. ja keine RegEx.


    modelleicher: Für mich sieht es stark danach aus als wäre entweder die .xml-Datei nicht UTF-8 (ohne BOM), oder der Speicherfunktion ist das egal.
    Wenn ersteres: versuch wirklich nochmal die Datei auf UTF-8 ohne BOM zu forcieren. Wenn letzteres: es sieht zwar sehr unschön aus, aber an sich wäre es auch egal. Du müsstest nur beim Laden sicherstellen dass die encoded entities wieder decoded werden. Könntest dir also ne kleine Dekodier-Tabelle erstellen und dann per RegEx oder gsub oder beidem wieder in ">" usw. dekodieren.


    Btw, ich denke Giants hat eine UTF-8 Encode-Funktion beim Vehicle speichern drin, damit es mit den Mod-Dateinamen zu keinen Problemen kommt.

    Mal ne halbwegs blöde Frage was die Positionierung der Pipe angeht. Bei BM-Modding's Fortuna (mit dieser "anderen" dynamic plane) muss man (zumindest beim Häcksler) relativ nah ranfahren damit der Trailer das Zeug aus der Pipe aufnehmen kann. Effektiv bedeutet das, dass die Pipe eher von oben runter als semi-seitwärts abwerfen muss. Wird das bei deinem Shader gleich/ähnlich verlaufen?

    Freut mich dass du an dem Projekt weiterarbeitest. Ein Paar Fragen:

    • Was passiert wenn man einen der 8 Punkte auf's "Maximum" befüllt? Wird dann der Rest aufgefüllt - und wenn ja gleichmäßig oder einer nach dem anderen? Oder ist dann einfach Schluss? Ich konnte nicht genau erkennen ob das im Video gezeigt wurde.
    • Muss der Silotrigger auch angepasst werden (ich sehe im Video eine debugLine - ich nehme aber erstmal an sie ist wirklich nur zum Debuggen)?
    • Wie verhält es sich wenn es mehrere "Inputs" gibt - also z.B. zwei Drescher die in einen Hänger abtanken?
    • Könnte der Shader auch auf Nicht-Trailer angewandt werden, also z.B. Schaufeln? Oder würde das mit dem Shoveltrigger eher nicht funktionieren?
    • Der SMK hat im Video eine capacity von 43709. Ist das das variableCapacity Script von maurus oder etwas Eigenes?

    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.

    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?

    • Callstacks en masse -> fixen / Mod löschen
    • Alle Mods bis auf die aktiv benutzten rausnehmen
    • Debug-Channel 2 war aktiviert? (sieht nämlich nicht so aus)
    • Wurde etwas am Aufbau der BGA geändert (tipTriggers, movingPlanes, fillLevel/capacity) ?
    • Hat er beim 2. Durchlauf abgekippt?

    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?

    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.

    Courseplay teilt ein Fahrsilo in drei Bereich ein.


    Und je nach Lust und Laune (ein System dahinter habe ich noch nicht gefunden) fängt Courseplay in einem der Bereiche an.


    "Lust und Laune" ... die berühmte LUA-Variable ;)


    Natürlich passiert das nicht nach math.random, sondern basierend darauf welche der drei Sektionen am leersten ist. Es kommt aber auch darauf an, wie rum das Silo im GE eingebaut worden ist, d.h. welches movingPlanes "vorne", und welche "hinten" sind.



    kretschi1987:
    Nur den Abfahrer mit CP fahren lassen, dann Debug-Channels 1 und 2 aktivieren, (während der gesamten Fahrt zum und durch's Silo), dann die Log posten.

    Hallo zusammen,


    ich würde gerne einen Raycast ausführen, der sich nur auf TipTrigger beschränkt. Dazu denke ich würde sich das Collision Mask Attribut anbieten. Ist es korrekt dass nur dann das Callback läuft, wenn die transformId eines Trigger getroffen würde?


    Hat da jemand Einblick was genau, d.h. in welchem Format ich das eingeben müsste. Ist die Collision Mask identisch mit der in der i3D gesetzten (also z.B. 800000? Oder würde ich mit 800000 nur trailers, sprayers, und sowingMachines finden?


    Bei GDN steht Default: 0xFFFFFFFF, was ja Hexformat ist. Die 800000 ist ja auch schon Hex-Format, müsste ich es dann als 0x00800000 eintragen? Oder wollen sie dann doch den Dezimalwert (8388608)?


    Also auf gut deutsch: wie muss mein Raycast call aussehen wenn ich ihn auf TipTrigger beschränken möchte?


    Danke im Voraus,

    Danke für die Rückmeldung, aber das ist nicht wirklich, bzw. nur über Umwege das was ich suche. Ich würde gerne wissen ob eine lower/raise-Animation momentan läuft, nicht ob sie fertig ist. Klar könnte ich mir auch nen Timer einbauen und dann kucken was isLowered() ausgibt, aber das ist mir dafür ehrlich gesagt zu umständlich.


    Edit: Ein Problem was mir bei isLowered() noch aufgefallen ist: es ist true sobald das Gerät nicht ganz oben ist. Sobald es sich auch nur anfängt zu senken gilt es als ... "is lowered".

    Hallo,


    für foldingParts kann man ja relativ einfach herausfinden, ob die Animation gerade läuft:
    AnimatedVehicle:getIsAnimationPlaying(name) (animatedVehicle.lua, 394).


    Ich versuche momentan eine bool zu bekommen ob ein bestimmter attacherJoint bzw. das attachedImplement momentan gehoben/gesenkt wird - wie allerdings bekomme ich den Name jener Animation heraus?


    Es gibt ja noch die Attachable:onSetLowered(lowered) (attachable.lua, 382), die auf eine self.lowerAnimation verweist. Diese habe ich in meinem Attachable (zum Testen die Amazone EDX 6000) jedoch nicht gefunden ( = nil), dafür allerdings die lowerAnimationSpeed. self.lowerAnimation müsste m.E. der Name der lowering/raising-Animation sein.


    Ich hab self.loweringDone probiert, was aber immer false war.


    Hat da jemand vlt. ne Lösung oder nen Workaround? Danke im Voraus.



    [Edit] Der lowerAnimation-Absatz ist nach weiterem Überlegen wohl ein Denkfehler. Ich will ja nicht etwas am Attachable senken/heben, sondern den attacherJoint vom Traktor. Vielleicht sollte ich eher folgenden weg gehen:


    self:setAIImplementsMoveDown() [AITractor.lua, 794] --> benutzt Vehicle:setJointMoveDown() [Vehicle.lua, 2840] --> benutzt implement.object:onSetLowered(moveDown) [Attachable.lua, 382] --> was wiederum auch nur die self:playAnimation(self.lowerAnimation, self.lowerAnimationSpeed, nil, true); benutzt. Quasi ein Teufelskreis.

    Deine Methode hatte ich ja in meinem letzten Post quasi auch kurz angedeutet, nur dass ich beim Probieren damals k und nicht v gesetzt hatte. Vielleicht (oder eher wahrscheinlich) hatte ich mich auch irgendwo vertan, verschrieben, was auch immer, auf jeden Fall funktionierte es nicht.


    Nun aber nochmal probiert, diesmal eben mit dem auch von dir benutzten v, und siehe da ... läuft. Auch wenn ich nicht verstehe warum das geht. Ich hab mir mal die workTable, bzw. mein Äquivalent dazu ausgeben lassen - die ist indexbasiert, wobei v der Content der Table ist... wieder mal so ne Sache wo ich lerne LUA zu hassen. Und/oder Giants dafür dass sie Tables als Keys benutzen.


    Jedenfalls geh ich jetzt durch die Methode von ca. 40 Abfragen auf um die 6 runter, was mich dann doch erfreut. Also danke nochmals.

    Gut, aus irgendnem Grund hatte ich sogar inpairs vergessen - danke dafür. Nun komm ich also, aber nicht ganz so wie ich will.


    Wenn ich jetzt den jeweiligen Key hab (sagen wir ich hol ihn mir in der load()) kann ich trotzdem nicht distinkt auf eine der Tables zugreifen. Von meinem Bsp. im ersten Post: ich könnte nicht testClass["table: 0A23AD78"] aufrufen um dann wirklich auf jene (erste) Table zu kommen. Warum, weiß ich nicht (naja, wird irgendwas von wegen string vs. table sein), ich weiß nur dass er nil auswirft.


    Selbst wenn ich die Table als Variable vorher abspeicher und sie dann direkt als Key benutze läuft das nicht.
    [lua]x = die table aus der for-Schleife
    g_currentMission.tipTriggers[x] = ... wird nil sein[/lua]
    Ich denk mal da hat die Variable zwar den selben inhalt, aber irgendnen anderen Hashwert.


    Das alles hat zur Folge dass ich wieder nur über for/inpairs in der update() (oder woauchimmer ich's brauche) reinkomme. Sowas von unperformant

    Hallo,


    da der Titel dann doch etwas konfus klingt muss ich wahrscheinlich genau erläutern.
    In Key-Value-Tables kann der Key ja ne eigene Table sein. Wenn ich jenen Key nicht kenne, wie kann ich darauf zugreifen? Ein Beispiel:


    Ich weiß die Class sieht so aus:
    [lua]testClass = {
    ["table: 0A23AD78"] = { ... };
    ["table: 0A23AD79"] = { ... };
    ["table: 0D13A618"] = { ... };
    }
    [/lua]
    Es werden zweieinhalb Sachen passieren die ich so nicht erwartet hätte:

    • table.getn(testClass) wird 0 sein, dazu gleich mehr.
    • for i=1, #testClass do wird nicht einmal durchlaufen, eben weil getn 0 (null) ist.
    • Selbst ein arbiträr getestetes testClass[1] bringt nil.


    Meine Theorie ist folgende: die tables in testClass sind nur die keys, nicht die values, evtl. hat testClass nichtmal values (wobei man eigentlich erwarten sollte das wäre der Inhalt der tables). Nicht existierende values (nil) heißen in lua normalerweise dass der Wert in testClass nicht existiert, bzw. zumindest nicht aufgerufen werden kann. Und wenn alle values nil sind, wird getn daher 0 auswerfen.


    Ich weiß, das ist dreimal um die Ecke gedacht, aber anders kann ich mir es nicht erklären.


    Wer es selbst mal ausprobieren möchte kann sich gerne die g_currentMission.tipTriggers printen lassen und dann getn, for usw. ausprobieren.


    Bin für jegliche Aufklärung dankbar,
    --Jakob