eigener Ballentrigger, onEnter wird nie aktiv?

  • Moin..


    Die Trigger und ich.. Stehen eindeutig auf Kriegsfuß.
    Brauche mal wieder eure Unterstützung...


    Im Grunde hab ich ne kleine LUA, die einem Trigger auf der Map zugeordnet ist. Letztlich soll diese, sobald ein Ballen in den Trigger geschoben wird, diesen löschen und mir dafür den Silofüllstand für Chaff erhöhen.


    Als Grundlage hab ich mir den BarnMoverTrigger geschnappt, und den Teil der die Ballen löscht geklaut.. Weiter nicht schwer.. ? Doch...


    [lua]


    baleToChaff = {};

    local baleToChaff_mt = Class(baleToChaff);


    function baleToChaff.onCreate(id)
    g_currentMission:addUpdateable(baleToChaff:new(id));
    print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA baleToChaff: baleToChaff onCreate aufgerufen")
    end;



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

    instance.baleDeleteTrigger = id;
    addTrigger(instance.baleDeleteTrigger, "baleDeleteTrigger", instance);

    print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA baleToChaff: new block aufgerufen")


    self.isFull = false;
    return instance;
    end;

    function baleToChaff:delete()
    removeTrigger(self.baleDeleteTrigger);
    end;
    function baleToChaff:update(dt)
    end;
    function baleToChaff:updateTick(dt)
    end;


    function baleToChaff:draw()
    end;


    function baleToChaff:baleDeleteTrigger(triggerId, otherId, onEnter, onLeave, onStay)
    if onEnter then
    print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA baleToChaff: onEnter aktiv")
    -- this happens, if a compound child of a deleted compound is entering
    if otherId ~= 0 then
    print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA baleToChaff: otherId ~= 0 ")
    local object = g_currentMission:getNodeObject(otherId);
    if object ~= nil then
    local isStrawbale = getUserAttribute(otherId, "isStrawbale");
    local isHaybale = getUserAttribute(otherId, "isHaybale");
    local isRoundbae = getUserAttribute(otherId, "isRoundbale");
    if isStrawbale == true or isHaybale == true or isRoundbale == true then
    if g_currentMission:getIsServer() then
    print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA baleToChaff: getIsServer ist true")

    local fillamount = 200
    g_currentMission:setSiloAmount(Fillable.FILLTYPE_CHAFF, fillamount)
    object:delete();
    end;
    elseif not object:isa(Vehicle) then -- do not delete vehicles, but everything else
    if g_currentMission:getIsServer() then
    object:delete();
    end;
    else
    if g_currentMission.nodeToVehicle[otherId] == nil then
    -- there is nothing that could end up here, since physics objects are an object, thus this could only introduce bugs
    --delete(otherId);
    end;
    end;
    end;
    end;
    end;
    end;


    g_onCreateUtil.addOnCreateFunction("baleToChaffOnCreate", baleToChaff.onCreate);[/lua]


    So sieht mein Code derzeit aus, etwas schlampig, soll aber ja auch erstmal nur funktionieren.
    Allerdings komme ich nichtmal bis zum onEnter in Zeile 42 bzw. darüber hinaus. Aufgerufen wird onCreate, auch baleToChaff:new wird aufgerufen.
    Aber wenn ich ne Balle reinschiebe in den Trigger passiert einfach garnix.. Kein Error in der Log, aber auch kein Print dass onEnter aufgerufen wurde. Nix.. Die Balle bleibt auch wo sie ist.


    Der Trigger ist auf jeden Fall ein Trigger, in der i3d ist der Haken drin. Collision hat er auch, collisionMask ist "1001000" wie beim Ballentrigger im Förderband.


    Hab das ganze nun schon zig mal probiert, gefühle tausende male durchgelesen und auf Fehler überprüft, aber mit jedem mal mehr sieht man nur noch weniger.. Drum könnt ihr mir hoffentlich nen Tipp geben, oder seht grade gleich den Fehler.. :)


    Danke schonmal...



    LG

  • Also was mir jetzt auf den ersten Blick aufgefallen ist, dass in Zeile 49 statt "Roundbale" "Roundbae" was wahrscheinlich nichts mit deinem Problem zu tun hat, später aber zu einem Fehler führen könnte ;)


    Und daher dein script auf dem des Originals beruht, vermute ich, dass der Fehler etwas mit der Ausrichtung des Triggers zu tun hat. Im Original wird schließlich die Ausrichtung sehr ausführlich behandelt:
    [lua]
    instance.dirLength = 0.008;
    instance.dirX, instance.dirY, instance.dirZ = localDirectionToWorld(instance.triggerId, 0, 0, 1);
    instance.dirX = instance.dirX*instance.dirLength;
    instance.dirY = instance.dirY*instance.dirLength;
    instance.dirZ = instance.dirZ*instance.dirLength;
    instance.targetVelocity = 2;
    [/lua]
    Da du diesen Punkt komplett außer Acht gelassen hast, vermute ich den Fehler dort. Sicher bin ich mir bei meinen bescheidenen Kenntnissen keinesfalls, aber eine Überlegung ist es wert ;)

  • ich hab mir damals den trigger von Headys bga angeschaut, und was rausgenommen(nutze es aber nur privat).


    ich habe das mit dem instance so:


    [lua]instance:load(id);
    instance:register(true); -- add update routine,
    table.insert(modClassEventListener, instance);[/lua]


    und das addTrigger hab ich in einem load drinnen.


    [lua]function strohtrigger:load(id)
    self.triggerId = id;
    addTrigger(id, "strohCallback", self);
    end;[/lua]


    und das ballenlöschen hab ich so gemacht:


    [lua]if onEnter then
    if otherId ~= 0 then
    local object = g_currentMission:getNodeObject(otherId);


    if object ~= nil then
    if object:isa(Bale) then


    if g_currentMission:getIsServer() then
    playSample(self.sound, 1, 1, 0);
    local strohrechnen = 0;
    local strohc = 0;
    local stroh = Utils.getNoNil(g_currentMission:getSiloAmount(Fillable.FILLTYPE_CHAFF),0);
    strohrechnen = strohrechnen + 1000;
    strohc = stroh + strohrechnen;
    object:delete();
    g_currentMission:setSiloAmount(Fillable.FILLTYPE_CHAFF, strohc);
    strohrechnen = 0;
    stroh = 0;
    strohc = 0;
    end;
    --elseif not object:isa(Vehicle) then -- do not delete vehicles, but everything else
    --if g_currentMission:getIsServer() then
    --object:delete();
    --end;
    end;
    end;


    end;
    end; [/lua]


    ich weiß nicht wieviel falsch bzw richtig ist.
    aber er funktioniert ohne Fehler in der Log

  • Moin..


    Vielen Dank für eure Antworten erstmal.. :)


    B4U3R, der Schreibfehler ist schon ausschlaggebend, weil ich mit Rundballen teste.. Aber nicht das einzige Problem.
    Was das mit dem ausrichten betrifft, der Abschnitt im Original Script sorgt für die Bewegung aufm Förderband ;)


    John Deere 6930, mist, wohl eher nicht... :D


    bazillus, vielen Dank, genau das war der Fehler.. *freu*


    schlüter55v, auch dir Danke für deine Antwort.



    Kann damit als gelöst betrachtet werden... :thumbup:



    LG

  • hallo alle,


    /edit


    ich habs geschafft, dass mein Trigger nun aufgerufen wird.


    aber er macht noch einen Fehler in der log:


    Lua: Error running function: zolltrigger.onCreate


    hier mal die lua:


    [lua]print("loading zolltrigger");


    modClassEventListener = {};
    modClassEventListener.ModOrdner = g_currentModDirectory;


    function modClassEventListener:loadMap(name)

    end;


    function modClassEventListener:deleteMap()


    end;


    function modClassEventListener:mouseEvent(posX, posY, isDown, isUp, button)


    end;


    function modClassEventListener:keyEvent(unicode, sym, modifier, isDown)



    end;


    function onCreate(self, id)
    print("created zolltrigger, id: ", id);
    local instance = zolltrigger:new(g_server ~= nil, g_client ~= nil);
    local index = g_currentMission:addOnCreateLoadedObject(instance);
    instance:load(id);
    instance:register(true); -- add update routine,
    table.insert(modClassEventListener, instance);
    end;


    zolltrigger = {};
    zolltrigger.ModOrdner = g_currentModDirectory;


    local zolltrigger_mt = Class(zolltrigger, Object);


    function zolltrigger:new(isServer, isClient)


    local self = Object:new(isServer, isClient, zolltrigger_mt);
    self.className = "zolltrigger";


    local sounda = Utils.getFilename("kling.wav", zolltrigger.ModOrdner);

    self.sound = createSample("sound");
    loadSample(self.sound, tostring(sounda), false);
    return self;
    end;


    function zolltrigger:load(id)
    self.triggerId = id;
    addTrigger(id, "strohCallback", self);
    end;


    function zolltrigger:delete()
    removeTrigger(self.triggerId);
    delete(self.sound);
    end;


    function zolltrigger:strohCallback(triggerId, otherId, onEnter, onLeave, onStay, otherShapeId)

    if onEnter then
    if otherId ~= 0 then
    local object = g_currentMission:getNodeObject(otherId);


    if object ~= nil then
    if object:isa(Vehicle) then


    if g_currentMission:getIsServer() then
    g_currentMission.missionStats.expensesTotal = g_currentMission.missionStats.expensesTotal + 30;
    g_currentMission.missionStats.expensesSession = g_currentMission.missionStats.expensesSession + 30;
    g_currentMission.missionStats.money = g_currentMission.missionStats.money - 30;
    end;
    --elseif not object:isa(Vehicle) then -- do not delete vehicles, but everything else
    --if g_currentMission:getIsServer() then
    --object:delete();
    --end;
    end;
    end;


    end;
    end;

    end;


    function modClassEventListener:update(dt)


    end;


    function modClassEventListener:draw()


    end;


    addModEventListener(modClassEventListener);[/lua]


    was verursacht diesen Fehler?


    Mit freundlichen Grüßen


    schlüter55v

  • sry dass ich diesen Thread nochmal erwecke, aber das Thema passt.


    Ich hab mir eine biodiesel Fabrik gescriptet, die auch schon Diesel erstellt.
    nur wird der Trigger in dem ich tanken will agr nicht erst aufgerufen.
    Ich hab mein script an das von Modeleicher angelehnt.


    so sieht es bis jetzt aus:


    [lua]rapsraf = {};

    local rapsraf_mt = Class(rapsraf);


    function rapsraf.onCreate(id)
    g_currentMission:addUpdateable(rapsraf:new(id));
    print("rapsraf: rapsraf onCreate aufgerufen")
    end;



    function rapsraf:new(id, customMt)
    local instance = {};
    if customMt ~= nil then
    setmetatable(instance, customMt);
    else
    setmetatable(instance, rapsraf_mt);
    end;
    self.dotanken = false;

    instance.rapsraf = id;
    addTrigger(instance.rapsraf, "tanktrigger", instance);

    print("rapsraf: new block aufgerufen")


    self.isFull = false;
    self.diesellager = g_currentMission:getSiloAmount(Fillable.FILLTYPE_DIESEL);
    return instance;
    end;

    function rapsraf:delete()
    removeTrigger(self.tanktrigger);
    end;
    function rapsraf:update(dt)
    end;
    function rapsraf:updateTick(dt)


    end;


    function rapsraf:draw()
    end;


    function rapsraf:tanktrigger(triggerId, otherId, onEnter, onLeave, onStay)
    if onStay then
    print("rapsraf: onStay aktiv")
    -- this happens, if a compound child of a deleted compound is entered
    if otherId ~= 0 then
    local vehicle = g_currentMission.nodeToVehicle[otherId];
    if vehicle ~= nil then
    if g_currentMission:getIsServer() then
    if vehicle.fuelFillLevel < vehicle.fuelCapacity and self.diesellager > 0.2 then
    if InputBinding.hasEvent(InputBinding.tanken) then
    self.dotanken = not self.dotanken;
    end;
    if self.dotanken then
    vehicle.fuelFillLevel = vehicle.fuelFillLevel + 0.1;
    local diesel2 = _currentMission:getSiloAmount(Fillable.FILLTYPE_DIESEL);
    diesel2 = diesel2 - 0.1;
    g_currentMission:setSiloAmount(Fillable.FILLTYPE_DIESEL, diesel2);
    end;
    end;
    end;
    end;
    end;
    end;
    end;



    g_onCreateUtil.addOnCreateFunction("rapsrafOnCreate", rapsraf.onCreate);[/lua]


    stimmt das mit dem Trigger bis jetzt so? (den rest muss ich nochn bissl umbauen)


    welche userAttributes muss ich dem Trigger in der Map geben?


    hier sind meine momentanen:


    XML
    <UserAttribute nodeId="7010">
    <Attribute name="onCreate" type="scriptCallback" value="rapsraf.onCreate"/>
    </UserAttribute>


    Mit freundlichen Grüßen


    schlüter55v


    PS: das mit dem Zoll hab ich hingekriegt.

Jetzt mitmachen!

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