MapSoundTrigger (WIP) -> Ich hör nix :(

  • Hi,


    nachdem ich das erste Script jetzt so einigermaßen verstanden habe, wollte ich mich mal an etwas anderes ran wagen.
    Die Idee zu dem MapSoundTrigger kam mir, als ich eine Map von MH angespielt habe, auf der eine Katze auf einem Stein saß.


    Ich dachte mir, wie cool es wäre, wenn der Flohtransporter miaut, wenn man vorbei fährt/geht.


    Also hab ich mein Maya angeworfen, hab einen Würfel gebaut und diesem dann mit diesen UserAttributen ausgestattet:

    Code
    <UserAttribute nodeId="1">
    <Attribute name="soundFile" type="string" value="Sounds/sound.wav"/>
    <Attribute name="onCreate" type="scriptCallback" value="MapSoundTrigger.onCreateMSTrigger"/>
    </UserAttribute>


    Dann hab ich mir einige Scripts angeguckt, die auf Trigger zugreifen.
    Dabei ist folgendes raus gekommen:


    [lua]
    MSTrigger = {}


    function mapSoundTrigger:load(id)
    self.id = id;
    self.soundFile = getUserAttribute(id, "soundFile");
    self.triggerId = id;
    addTrigger(self.triggerId, "TriggerCallback", self);

    mapSoundFile = Utils.getUserAttribute(id, "soundFile");
    self.mapSoundId = createSample("MSTrigger");
    loadSample(self.mapSoundId, mapSoundFile, false);
    self.mapSoundPlaying = false;
    self.playedSound = false;
    end;


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


    function mapSoundTrigger:TriggerCallback(triggerId, otherId, onEnter, onLeave, onStay, otherShapeId)
    if onEnter then
    if self.playedSound == false then
    playSample(self.mapSoundId,1,1,0);
    self.playedSound = true;
    end;
    else
    self.playedSound = false;
    end;
    end;
    [/lua]


    Hab den Trigger testweise in eine Map verbaut, den richtigen Pfad zur Sounddatei eingegeben und aus dem Script eine ZIP (mit allem drum und dran) gemacht.
    Nach Spielstart bleibt die Log sauber aber ich höre keinen Ton weder beim fahren noch beim gehen.


    Also wende ich mich wieder mal optimistisch an euch :love:
    Wäre nett, wenn da mal jemand drüber fliegen könnte...


    cu
    Webby

  • Ok, hier noch mal aktuell:
    [lua]
    local mapSoundTrigger_mt = Class(mapSoundTrigger);

    function mapSoundTrigger:onCreate(id)
    g_currentMission:addUpdateable(mapSoundTrigger:new(id));
    end;


    function mapSoundTrigger:new(nodeId)
    local self = {};
    setmetatable(self, mapSoundTrigger_mt);
    self.triggerId = nodeId;
    addTrigger(nodeId, "triggerCallback", self);
    self.isEnabled = true;
    return self;
    end;
    [/lua]


    Wobei ich nicht weiß was mit 'setmetatable' gemeint ist.
    Schade das es nirgends mal eine Auflistung gibt, wo drin steht, was man alles braucht an Funktionen wenn man einen Trigger abfragen will :(


    Es geht überings noch nicht!

  • XML
    local self = {};
    setmetatable(self, mapSoundTrigger_mt);
    self.triggerId = nodeId;
    addTrigger(nodeId, "triggerCallback", self);
    self.isEnabled = true;
    return self;

    Da aus dem self überall instance machen. Du erzeugst ja eine neue Instanz für jeden Trigger und self hat ja schon eine andere Bedeutung. Wird auch wohl nicht umsonst sein, dass Giants in ihren Scripten auch instance verwendet und nicht self.

  • Ich bin mir nicht sicher, ob ich das richtig gemacht habe aber es tut sich leider nix.
    Hier mal das Script, wie es jetzt habe (Damit der Thread nicht zu lang wird, packe ich es mal in den Expander :) ):
    [expander]
    [lua]
    mapSoundTrigger = {}


    local mapSoundTrigger_mt = Class(mapSoundTrigger);


    print("MapSoundTrigger v1.0 by Webby loaded!");


    function mapSoundTrigger:onCreate(id)
    g_currentMission:addNonUpdateable(mapSoundTrigger:new(id));
    end;


    function mapSoundTrigger:new(nodeId)
    local instance = {};
    setmetatable(instance, mapSoundTrigger_mt);
    instance.triggerId = nodeId;
    addTrigger(nodeId, "triggerCallback", instance);
    instance.isEnabled = true;
    return instance;
    end;

    function mapSoundTrigger:load(id)
    self.id = id;
    self.soundFile = getUserAttribute(id, "soundFile");
    self.triggerId = id;
    addTrigger(self.triggerId, "TriggerCallback", self);

    mapSoundFile = Utils.getUserAttribute(id, "soundFile");
    self.mapSoundId = createSample("MSTrigger");
    loadSample(self.mapSoundId, mapSoundFile, false);
    self.mapSoundPlaying = false;
    self.playedSound = false;
    end;


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


    function mapSoundTrigger:mouseEvent(posX, posY, isDown, isUp, button)
    end;


    function mapSoundTrigger:keyEvent(unicode, sym, modifier, isDown)
    end;


    function mapSoundTrigger:TriggerCallback(triggerId, otherId, onEnter, onLeave, onStay, otherShapeId)
    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
    if self.playedSound == false then
    playSample(self.mapSoundId,1,1,0);
    self.playedSound = true;
    end;
    else
    self.playedSound = false;
    end;
    end;
    end;


    function mapSoundTrigger:update(dt)
    end;


    function mapSoundTrigger:draw()
    end;
    [/lua]
    [/expander]


    Ich hoffe es weiß jemand Rat, ich brauche das Script für ein Mapprojekt wirklich dringend :whistling:


    LG
    Webby

  • Ersetze mal die TriggerCallback Funktion durch diese:
    [lua]function mapSoundTrigger:TriggerCallback(triggerId, otherId, onEnter, onLeave, onStay)
    if onEnter then
    playSample(self.mapSoundId,1,1,0);
    end;
    end;[/lua]



    Die Abfrage von self.isEnabled kann nie true werden, weil die Variable nicht definiert ist. Die brauchst du auch nicht, deswegen hab ich die auch raus genommen. Ob es nun ein Fahrzeug oder nur der Spieler ist, der den Trigger betritt ist ja auch egal. Die Überprüfung ist also auch raus. Da müsste man nur nachher mal im MP testen, ob der Sound dan für alle hörbar ist, wenn einer den Trigger betritt. Wenn dem so ist kann man die Überprüfung ja immer noch mit reinnehmen. Dein playedSound brauchst du gar nicht, das playSample spielt den Sound sowieso nur einmal ab (zumindest wenn ich mit meiner Annahme, dass die Funktion nur einmal beim betreten und einmal beim verlassen aufgerufen wird, richtig liege).

  • Ok ich versuchs mal, danke^^


    Geplant ist eigentlich, das der Sound nur einmal abgespielt wird, also bei betreten.
    Natürlich soll der Sound wieder zu hören sein, wenn man dann nochmal durchfährt.


    EDIT:
    Hmm ne, geht nicht.
    So langsam gehen mir die Ideen aus... stimmt denn der onCreate aufruf im Trigger?
    Ich hab folgendes drin stehen:
    MapSoundTrigger.onCreatemapSoundTrigger

  • So mit folgendem Code sollte zumindest der Trigger schonmal geladen werden. Über die Funktion mit dem Sound sprechen wir später, wenn der Trigger vernünftig läuft.


    Ich würde sagen du baust folgenden Code mal in das Script ein und löscht den Rest, der mit dem Sound zu tun hat. Dann testest du mal.
    onCreate = MapSoundsTrigger.onCreate
    Nun brauchst du in deinem Modordner eine Zip oder einen Ordner der MapSoundsTrigger genannt wurde. In diesem Ordner muss das Script rein ;)



    [lua]
    function onCreate(self, id)
    local instance = MapSoundsTrigger:new(g_server ~= nil, g_client ~= nil);
    local index = g_currentMission:addOnCreateLoadedObject(instance);
    instance:load(id);
    instance:register(true);
    print("MapSoundsTrigger by Webby successfully loaded!") -- Wenn dieser Text in deiner Log zu finden ist, dann wird dein Trigger korekt geladen.
    end;


    MapSoundsTrigger = {}; --Klassen am Besten mit einem Großbuchstaben beginnen


    local MapSoundsTrigger_mt = Class(MapSoundsTrigger, Object);


    function MapSoundsTrigger:new(isServer, isClient)
    local self = Object:new(isServer, isClient, MapSoundsTrigger_mt);
    self.className = "MapSoundsTrigger_mt";
    return self;
    end;
    [/lua]

  • Also der Lua Fehler ist soweit weg.
    Wenn ich die Testmap lade, steht in der Log:

    Code
    Error: Can't load resource: oadSample
    Error: Can't load sample oadSample.
    MapSoundTrigger by Webby successfully loaded!


    Was zum Geier ist ein oadSample?
    Hab das nirgends im Script oder im Trigger drin stehen ?(


    Hier mal das aktuelle Scirpt:
    [expander]
    [lua]
    function onCreate(self, id)
    local instance = MapSoundTrigger:new(g_server ~= nil, g_client ~= nil);
    local index = g_currentMission:addOnCreateLoadedObject(instance);
    instance:load(id);
    instance:register(true);
    print("MapSoundTrigger by Webby successfully loaded!") -- Wenn dieser Text in deiner Log zu finden ist, dann wird dein Trigger korekt geladen.
    end;


    MapSoundTrigger = {}; --Klassen am Besten mit einem Großbuchstaben beginnen


    local MapSoundTrigger_mt = Class(MapSoundTrigger, Object);


    function MapSoundTrigger:new(isServer, isClient)
    local self = Object:new(isServer, isClient, MapSoundTrigger_mt);
    self.className = "MapSoundTrigger_mt";
    return self;
    end;


    function MapSoundTrigger:load(id)
    self.id = id;
    self.soundFile = getUserAttribute(id, "soundFile");
    self.triggerId = id;
    addTrigger(self.triggerId, "TriggerCallback", self);

    self.mapSoundFile = getUserAttribute(id, "soundFile");
    self.mapSoundId = createSample("MSTrigger");
    loadSample(self.mapSoundId, mapSoundFile, false);
    self.mapSoundPlaying = false;
    self.playedSound = false;
    end;


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


    function MapSoundTrigger:mouseEvent(posX, posY, isDown, isUp, button)
    end;


    function MapSoundTrigger:keyEvent(unicode, sym, modifier, isDown)
    end;


    function MapSoundTrigger:TriggerCallback(triggerId, otherId, onEnter, onLeave, onStay)
    if onEnter then
    playSample(self.mapSoundId,1,1,0);
    end;
    end;


    function MapSoundTrigger:update(dt)
    end;


    function MapSoundTrigger:draw()
    end;
    [/lua]
    [/expander]

Jetzt mitmachen!

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