Trigger+Collisionmask

  • Moin Zusammen!


    Und auch Moin modelleicher. Deine luas funktionieren super. Danke schon mal. Ich habe die rotationDoor.lua eingebaut und das Tor öffnet sich auch wie gewünscht. Ich würde jedoch gerne die Geschwindigkeit ändern, mit der es auf und zu geht und habe schon versucht die Speedeinträge aus der translationDoor.lua zu übernehmen. Das funktioniert leider nicht.


    Weiß da jemand Rat?


    Gruß Mourice

  • Moin..


    Die Geschwindigkeit zu ändern ist in der LUA nicht vorgesehen, ist noch die erste Version die ich gemacht hatte bei der translationDoors hab ichs dann schon anders gemacht.
    Du kannst aber in der LUA nach dt*0.001 suchen und die 0.001 ändern, insgesamt sollte es 8 dieser Einträge geben und du musst die Zahl bei allen 8 ändern. Wird die Zahl größer öffnen sich die Tore schneller, wird die Zahl kleiner dann langsamer. Wenn du die Zahl aber zu groß machst kommt die LUA durcheinander weil noch kein Limit eingebaut ist wie später bei der translationDoors LUA. Müsste man also ebenso nachtragen.. Dann kann man auch gleich speed als Optionales userAttribut einbauen.. :D


    [lua]
    -- http://www.schwabenmodding.bplaced.net
    -- Version 2:
    -- .. Im Singleplayer ist es nun möglich die Tore per Tastendruck offen zu halten bis erneutem Tastendruck. Im MP nimmt alles seinen gewohnten Gang wie bisher
    -- Version 2.1 Optionales Speed Attribut hinzugefügt


    rotationDoors = {};



    local rotationDoors_mt = Class(rotationDoors);

    function rotationDoors.onCreate(id)
    g_currentMission:addUpdateable(rotationDoors:new(id));
    print("rotationDoors: rotationDoors onCreate aufgerufen. OnCreate Id: "..id.." .")
    end;

    function rotationDoors:new(id, customMt)
    local instance = {};
    if customMt ~= nil then
    setmetatable(instance, customMt);
    else
    setmetatable(instance, rotationDoors_mt);
    end;

    instance.triggerId = id;
    addTrigger(id, "triggerCallback", instance);
    instance.rotationDoors = {};
    local lar = {};
    lar.Rdoor = getChildAt(id, 1);
    lar.Ldoor = getChildAt(id, 0);
    local marr = getUserAttribute(id, "maxRotRight");
    local marl = getUserAttribute(id, "maxRotLeft");
    local mirr = getUserAttribute(id, "minRotRight");
    local mirl = getUserAttribute(id, "minRotLeft");
    lar.maxRotR = Utils.degToRad(marr);
    lar.maxRotL = Utils.degToRad(marl);
    lar.minRotR = Utils.degToRad(mirr);
    lar.minRotL = Utils.degToRad(mirl);
    lar.rotL = 0;
    lar.rotR = 0;
    lar.isOpen = false;
    lar.stayOpen = false;
    lar.speed = Utils.getNoNil(getUserAttribute(id, "speed"), 1) / 1000;
    self.count = 0;
    if lar.Rdoor ~= nil and lar.Ldoor ~= nil then
    table.insert(instance.rotationDoors, lar);
    else
    print("rotationDoors: Error, no doors Specified.")
    end;

    return instance;
    end;

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

    function rotationDoors:update(dt)
    for i=1, table.getn(self.rotationDoors) do
    if self.count > 0 then
    self.rotationDoors[i].isOpen = true;
    if g_currentMission.missionDynamicInfo.isMultiplayer == false then
    if InputBinding.hasEvent(InputBinding.TOGGLE_DOOR) then
    self.rotationDoors[i].stayOpen = not self.rotationDoors[i].stayOpen;
    end;
    end;
    else
    if self.rotationDoors[i].stayOpen == false then
    self.rotationDoors[i].isOpen = false;
    else
    self.rotationDoors[i].isOpen = true;
    end;
    end;

    if self.rotationDoors[i].isOpen == true then
    if self.rotationDoors[i].maxRotL > self.rotationDoors[i].minRotL then
    if self.rotationDoors[i].rotL < self.rotationDoors[i].maxRotL then
    self.rotationDoors[i].rotL = math.min(self.rotationDoors[i].rotL + dt*self.rotationDoors[i].speed, self.rotationDoors[i].maxRotL);
    end;
    elseif self.rotationDoors[i].maxRotL < self.rotationDoors[i].minRotL then
    if self.rotationDoors[i].rotL > self.rotationDoors[i].maxRotL then
    self.rotationDoors[i].rotL = math.max(self.rotationDoors[i].rotL - dt*self.rotationDoors[i].speed, self.rotationDoors[i].maxRotL);
    end;
    end;
    if self.rotationDoors[i].maxRotR > self.rotationDoors[i].minRotR then
    if self.rotationDoors[i].rotR < self.rotationDoors[i].maxRotR then
    self.rotationDoors[i].rotR = math.min(self.rotationDoors[i].rotR + dt*self.rotationDoors[i].speed, self.rotationDoors[i].maxRotR);
    end;
    elseif self.rotationDoors[i].maxRotR < self.rotationDoors[i].minRotR then
    if self.rotationDoors[i].rotR > self.rotationDoors[i].maxRotR then
    self.rotationDoors[i].rotR = math.max(self.rotationDoors[i].rotR - dt*self.rotationDoors[i].speed, self.rotationDoors[i].maxRotR);
    end;
    end;
    else
    if self.rotationDoors[i].maxRotL > self.rotationDoors[i].minRotL then
    if self.rotationDoors[i].rotL > self.rotationDoors[i].minRotL then
    self.rotationDoors[i].rotL = math.max(self.rotationDoors[i].rotL - dt*self.rotationDoors[i].speed, self.rotationDoors[i].minRotL);
    end;
    elseif self.rotationDoors[i].maxRotL < self.rotationDoors[i].minRotL then
    if self.rotationDoors[i].rotL < self.rotationDoors[i].minRotL then
    self.rotationDoors[i].rotL = math.min(self.rotationDoors[i].rotL - dt*self.rotationDoors[i].speed, self.rotationDoors[i].minRotL);
    end;
    end;
    if self.rotationDoors[i].maxRotR > self.rotationDoors[i].minRotR then
    if self.rotationDoors[i].rotR > self.rotationDoors[i].minRotR then
    self.rotationDoors[i].rotR = math.max(self.rotationDoors[i].rotR - dt*self.rotationDoors[i].speed, self.rotationDoors[i].minRotR);
    end;
    elseif self.rotationDoors[i].maxRotR < self.rotationDoors[i].minRotR then
    if self.rotationDoors[i].rotR < self.rotationDoors[i].minRotR then
    self.rotationDoors[i].rotR = math.min(self.rotationDoors[i].rotR - dt*self.rotationDoors[i].speed, self.rotationDoors[i].minRotR);
    end;
    end;
    end;
    end;
    for i=1, table.getn(self.rotationDoors) do
    setRotation(self.rotationDoors[i].Ldoor, 0, self.rotationDoors[i].rotL, 0);
    setRotation(self.rotationDoors[i].Rdoor, 0, self.rotationDoors[i].rotR, 0);
    end;


    end;

    function rotationDoors:triggerCallback(triggerId, otherId, onEnter, onLeave, onStay)
    if onEnter then
    self.count = self.count + 1;
    elseif onLeave then
    self.count = self.count - 1;
    end;
    end;

    g_onCreateUtil.addOnCreateFunction("rotationDoorsOnCreate", rotationDoors.onCreate);




    [/lua]


    Müsste dann so aussehen.. Eintrag bei UserAttributes wäre float "speed"



    LG

  • Moin,


    danke für die lua!! Nur leider habe ich jetzt das Problem, dass der rechte Torflügel beim auslösen des Triggers durchdreht (immer im Kreis) bis man wieder aus dem Trigger raus ist. Danach bleibt er stehen wo er gerade steht.


    Könntest du da noch mal gucken?


    Danke


    mfg Mourice

  • du kannst auch den mapdoortrigger aus ls11 benutzen trage einfach modDesc descVersion eine 9 ein ^^ (steht gleich ganz oben )
    also so ▼▼▼▼▼


    <?xml version="1.0" encoding="utf-8" standalone="no" ?>
    <modDesc descVersion="9">
    <author>John Deere 6930</author>
    <version>2.0</version>
    <title>
    <en>MapDoorTrigger</en>
    <de>MapDoorTrigger</de>


    dann läuft der wieder aber du kannst damit keinen neuen spielstand anfangen wenn der im mod ordner ist also vorher raus damit spiel starten fix speichern mapdoortrigger wieder in den mods ordner und spiel starten dann funktionieren alle türen und tore aus ls11 die den mapdoortigger brauchen auch in ls13 :thumbsup:

  • Mahlzeit

    danke für die lua!! Nur leider habe ich jetzt das Problem, dass der rechte Torflügel beim auslösen des Triggers durchdreht (immer im Kreis) bis man wieder aus dem Trigger raus ist. Danach bleibt er stehen wo er gerade steht.

    Genau das Gleiche habe ich mit der neueren lua auch. Die scheint ein Problem mit negativen Werten zu haben. Wenn das Tor von 0 auf -90 Grad aufgehen soll dann versucht das Script scheinbar von 270 wieder auf 0 zu kommen. Allerdings bleibt das Tor stehen wenn man den Trigger betritt und dreht beim verlassen dann seine Runden.


    Würde mich sehr freuen wenn man das noch beheben könnte denn bei der Ersten geht es ja anständig.

  • Moin Zusammen!


    ich möchte an einer Engstelle im Cow NavMesh ein Tor, bzw. zwei Tore haben, die auf die Kühe reagieren. Gibt es Trigger für Kühe, bzw. kann man die RotationDoorTrigger für Kühe erweitern???


    Mir würde es auch helfen, wenn die Kühe einfach am Tor stehen blieben, bis man es selber aufmacht. Aber die laufen bisher überall durch oder drüber.


    Hast du da noch mal nen Tipp modelleicher? Wäre echt Top, wenn das funktionierte.... Danke.


    Gruß Mourice

  • Das ist ne gute Idee. Danke. Aber leider findet sich nirgends eine Collision Mask zu den Milkrobottüren (auch kein Trigger zu sehen) und ich glaube aufhalten lassen die Kühe sich auch nicht. Sieht aus als würden sie überall drüberlaufen wo das NavMesh lang geht...


    Muss ich mir was anderes überlegen, vielleicht ne Kuhbrücke bauen, mal sehen...


    Wenn noch wer Ideen hat, immer her damit. Danke schon mal.


    Gruß Mourice

  • Hallo,
    ich würde gerne bei einem Schranken mit trigger folgendes einbauen:


    jedesmal wenn ein traktor oder anderes fahrzeug den schranken öffnet, dass dann geld abgebucht wird (wie eine maut).
    ist das schwierig?
    kann man das original-script vom bga-schranken erweitern oder braucht man ganz ein eigenes?


    lg sven

  • na gut für jemanden der scripten kann, ist es sicher ganz einfach...


    ich hab mir das script von Matzep in meine Map eingebaut und der Schranken öffnet sich und bucht durch eine kleine erweiterung sogar geld ab.
    Aber leider das fünffache des eingestellten wertes, da ich es scheinbar an die falsche stelle im Script eingetragen habe.


    Und ich würde mir das ganze richtungsabhängig wünschen (in eine Richtung mit Maut in die andere richtung ohne Maut, lässt sich das auch noch machen?

  • Da das TriggerCallback pro Fahrzeug mehrmals aufgerufen wird dank mehrerer Componenten, und dann pro Component auch noch mehrmals dank der Eigenheit der Giant Engine, wird das mit dem Geld abziehen am einfachsten klappen wenn du ein kleines Delay einbaust, sodass wenn einmal abgezogen wird 10 Sekunden lang nichts abgezogen wird auch wenn der Callback aufgerufen wird, sodass man genug Zeit hat durch zu fahren auch mit Anhänger, aber auch kurz genug ist dass ein hinterher fahrender nicht auch noch durch kommt. Das zumindest wenn der Eintrag im TriggerCallback steht.


    Andernfalls kann man es ja auch mit dem öffnen der Schranken verknüpfen, pro Schrankenöffnung einmal Geld abziehen.. Je nach dem wie das Script aufgebaut ist.



    Richtungsabhängig mit einem Trigger müsste in der Theorie auch funktionieren.. So denke ich, vielleicht mag es ja jemand ausprobieren.. :D


    [lua]


    -- load teil
    self.positions = {};

    -- trigger callback teil
    if onEnter then
    local x,y,z = getWorldTranslation(otherId);
    _,_,pos = worldToLocal(triggerId,x,y,z)
    if self.positions[tostring(otherId)] == nil then
    self.positions[tostring(otherId)] = pos
    end;
    elseif onLeave then
    local x,y,z = getWorldTranslation(otherId);
    _,_,pos = worldToLocal(triggerId,x,y,z)
    if self.positions[tostring(otherId)] ~= nil and > pos then
    -- positive Richtung hier Aktion für die positive Richtung platzieren
    self.positions[tostring(otherId)] = nil;
    elseif self.positions[tostring(otherId)] ~= nil and < pos then
    -- negative Richtung hier Aktion für die negative Richtung platzieren
    self.positions[tostring(otherId)] = nil;
    end;
    end;
    [/lua]



    In dem Fall ist die Richtung eben in Z Achse des Triggers.. Müsste aber so doch funktionieren, oder was sagen die Profis?




    LG

  • Danke


    ich habe jetzt die richtige stelle im script gefunden und auch die höhe der maut lässt sich beim trigger in der map mit einer variable einstellen.


    das mit dem richtungsabhängig werde ich eventuell ein anderes mal probieren.


    danke

Jetzt mitmachen!

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