mal wieder MP-Events, Globale Variable übertragen

  • Moin..


    Konkret hab ich mal wieder ein Problem...


    Ich hab ne LUA in der Map (Theoretisch nur, bislang)


    Die LUA gehört zu nem Trigger, den es nur ein einziges mal in der Map gibt. Es sollte also nicht so kompliziert sein. Konkret hab ich eine Globale Variable, deren Zustand (Integer, 1,2,3,4 oder 0 ) ich in bestimmten Situationen im MP den restlichen Mitspielern mitteilen möchte.


    Ich hab schon versucht die MP-Events im Allgemeinen zu verstehen, aber so ganz ergibt das für mich keinen Sinn. Letztenendes denke ich dass es in meinem Fall ein vereinfachtes Event doch auch tun würde, weil es diese Globale Variable genau ein einziges mal bei jedem Spieler gibt.
    Ich bräuchte also theoretisch keine ID's der einzelnen Objekte etc..



    Oder kann mir einer genauer die Funktionsweiße und Möglichkeiten erklären von:
    g_server:broadcastEvent(meinEvent:new(vehicle, actualState), nil, nil, vehicle)
    und
    g_client:getServerConnection():sendEvent(meinEvent:new(vehicle, actualState));
    ?
    Kann ich theoretisch damit allein Werte übertragen ohne den restlichen Event:new Kram etc ? Im Grunde ist das ja die Übertragung, und der Rest dient eher dazu herauszufinden um welches Objekt es sich handelt ? Oder steh ich komplett aufm Schlauch?


    Sagt mir bitte ob ich komplett daneben liege... :D



    LG

  • Also die Funktionen wie writeStream, readStrem, run etc braucht man schon in der event-Klasse. Sonst funktioniert das nicht.



    Ich hab mich auch schon an sowas probiert und bin zu folgendem Schluss gekommen:
    g_server:broadcastEvent(meinEvent:new(vehicle, actualState), nil, nil, vehicle) verschickt das Event an alle Clients. Voraussetzung ist, dass vorher mit isServer o.Ä. abgefragt wird, ob der Verarbeiter der Server ist.
    g_client:getServerConnection():sendEvent(meinEvent:new(vehicle, actualState)); wird aufgerufen, wenn der Verarbeiter ein Client ist (auch die if-Abfrage davor). Da wird dann über die Verbindung zum Server das Event übertragen, der kann das dann broadcasten.


    Wie gesagt, so hab ich das verstanden. Falls ich das falsch verstanden habe, ich lerne gerne dazu.

  • Zum ersten, hmmm, das klingt logisch..


    Zum zweiten, joa da hast du vermutlich Recht so hab ich das auch verstanden. Aber welche Parameter da nun für was genau stehen weißt du auch nicht oder?
    Gerade beim broadcastEvent diese beiden nil z.b. :D


    Ansonsten, wenn man das writeStream etc. braucht dann braucht man ja auch eine Object ID. Hat man nur ein Objekt dafür in der Map, könnte man die nicht theoretisch selbst festlegen?



    Wäre das also so in etwa möglich? Oder Denkfehler..?


    [lua]-- Das Script (gekürzt):
    meinScript.objectID = 123456789


    function meinScript:setNewState(state, noEventSend)
    meinEvent.sendEvent(self.objectID, state, noEventSend);
    g_meineGlobaleVariable = state;
    end;


    -- Das Event (komplett):


    function meinEvent:readStream(streamId, connection)
    local id = streamReadInt32(streamId);
    self.state = streamReadInt32(streamId);
    self.objectID = networkGetObject(id);
    self:run(connection)
    end;
    function meinEvent:run(connection)
    meinScript:setNewState(self.state, true)
    if not connection:getIsServer() then
    g_server:broadcastEvent(self.objectID, self.state, nil, connection, self.object);
    end;
    end;
    function meinEvent:writeStream(streamId, connection)
    streamWriteInt32(streamId, networkGetObjectId(self.objectID));
    streamWriteInt32(streamId, self.state);
    end;


    function meinEvent.sendEvent(objectID, state, noEventSend)
    if noEventSend == nil or noEventSend == false then
    if g_server ~= nil then
    g_server:broadcastEvent(self.objectID, state, nil, nil, vehicle);
    else
    g_client:getServerConnection():sendEvent(self.objectID, state);
    end;
    end;
    end;


    [/lua]



    Danke für eure Hilfe.. :)



    LG

  • Nee, wofür die einzelnen Werte stehen weiß ich auch nicht. Ist in der Scripting Reference scheinbar auch nicht erklärt, oder ich habs einfach nur überlesen.


    Denkfehler. Das Spiel vergibt beim Start alle IDs automatisch. Da kannst du für dein Trigger also keine feste ID vergeben. Und die ID mit übergeben ist ja auch kein Problem.

  • Ich vermute mal, dass meinScript.objectID die Id des 3D Objekts ist.
    Mit "object" ist im Normalfall der Table des Objekts gemeint, für das du eine Variable verschickst. Damit man am anderen Ende der Leitung auch weis, in welches Fahrzeug, Trigger und co. die Variable nun rein soll, wird der Table mitverschickt. Wobei nicht der Table selbst verschickt wird. Die Funktion networkGetObjectId gibt zu einigen Tables (Die vorher irgendwie registriert werden müssen) eine Nummer raus, die dann verschickt wird. Am anderen Ende der Leitung kann man sich dann mit networkGetObject aus der Nummer wieder den Table abholen, an dem die Variable aktualisiert werden soll.
    Das alles brauchst du aber garnicht, da deine Variable global ist.

Jetzt mitmachen!

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