Mein Script MP fähig machen

  • Hi,


    ich habe bei meinem BalloonWheels Script im MP ein Problem festgestellt.
    Wenn jemand auf dem Schlepper sitzt(egal ob Host oder Client) und die Räder verbreitert, ist dies nur für den sichtbar, der drauf sitzt.
    Ergo vermute ich, das das Script nicht MP fähig ist.


    Ich habe mir also mal ein anderes Script her genommen und versucht zu verstehen wie das funktioniert.


    Es soll eigentlich nur der boolsche Wert für balloonWheelsState (true / false) an die anderen Mitspieler übergeben werden. Denke ich :whistling:


    Mein Script sieht dabei so aus:
    [lua]
    -- Network Stuff
    balloonWheelsEvent = {};
    balloonWheels_mt = Class(balloonWheelsEvent, Event);


    InitEventClass(balloonWheels, "balloonWheelsEvent");


    function balloonWheelsEvent:emptyNew()
    local self = Event:new(balloonWheels_mt);
    return self;
    end;


    function balloonWheelsEvent:new(vehicle, state)
    local self = balloonWheelsEvent:emptyNew()
    self.vehicle = vehicle;
    self.balloonWheelsState = state;
    return self;
    end;


    function balloonWheelsEvent:readStream(streamId, connection)
    local id = streamReadInt32(streamId);
    self.balloonWheelsState = streamReadInt8(streamId);
    self:run(connection);
    end;


    function balloonWheelsEvent:writeStream(streamId, connection)
    streamWriteInt32(streamId, networkGetObjectId(self.vehicle));
    streamWriteInt8(streamId, self.balloonWheelsState);
    end;


    function balloonWheelsEvent:run(connection)
    self.vehicle:balloonWheelsState(self.state, true);
    end;


    function balloonWheelsEvent.sendEvent(vehicle, state, noEventSend)

    if noEventSend == nil or noEventSend == false then
    if g_server ~= nil then
    g_server:broadcastEvent(balloonWheelsEvent:new(vehicle, state), nil, nil, vehicle);
    else
    g_client:getServerConnection():sendEvent(balloonWheelsEvent:new(vehicle,state));
    end;
    end;
    end;
    [/lua]


    Wenn ich jetzt ein MP Spiel starte, wir alles ohne Fehler geladen aber die Mitspieler können nicht auf den Schlepper wechseln und die Log bei denen wirft Fehler ohne Ende..

    Zitat


    C:/Users/pc/Documents/My Games/FarmingSimulator2013/mods/DeutzFahr_Agrotron7250_TTV_CE/Scripts/balloonWheels.lua(54) : attempt to call method 'balloonWheelsState' (a boolean value)
    Lua: Unknown entity id: 37829 method name: delete


    In Zeile 54 steht das hier:
    [lua]
    function balloonWheels:readStream(streamId, connection)
    self:balloonWheelsState(streamReadBool(streamId), true);
    end;
    [/lua]


    Hat da zufällig jemand einen Tipp was da nicht stimmt.


    lg
    Webby

  • Hi,


    ich habe read/writeStream bereis im Script drin.
    [lua]
    function balloonWheels:readStream(streamId, connection)
    self:balloonWheelsState(streamReadBool(streamId), true);
    end;


    function balloonWheels:writeStream(streamId, connection)
    streamWriteBool(streamId, self.balloonWheelsState);
    end;


    function balloonWheels:balloonWheelsState(state, noEventSend)
    ballooneWheelsState.sendEvent(self, state, noEventSend);
    self.balloonWheelsState = state;
    end;
    [/lua]


    So wie ich das hier jetzt sehe brauche ich also nur diesen Bereich hier?
    [lua]
    if noEventSend == nil or noEventSend == false then
    if g_server ~= nil then
    g_server:broadcastEvent(Setblends2Event:new(self, visibility), nil, nil, self);
    else
    g_client:getServerConnection():sendEvent(Setblends2Event:new(self, visibility));
    end;
    end;
    [/lua]


    Hmm aber sowas in der Art habe ich ja auch drin. 8|


    lg
    Webby

  • Dein erstes Zitat im letzten Post Zeile 10



    ballooneWheelsState.sendEvent(self, state, noEventSend);



    Stimmt nicht.. Muss so:


    balloonWheelsEvent.sendEvent(self, state, noEventSend);

    Du willst damit ja das sendEvent innerhalb des Events aufrufen, also musst du auch den Namen des Events verwenden..



    LG


  • Zunächst einmal, möchte ich dich bitten, das komplette Script anzunängen. Sofern du jeweils unterschiedliche Dateien für das Script und Event verwendest, hänge beide Dateien an.


    Der 1. grobe Fehler, der mir gerade aufgefallen ist, versteckt sich in Zeile 21 und 27 deines Events. Du möchtest einen Boolean übergeben, arbeitest aber mit streamWriteInt8 und streamReadInt8. Nutze auch hier streamWriteBool bzw. streamReadBool ;)


    MfG

  • Hi,


    sorry das ich mich jetzt erst melde, hatte etwas Stress hier -.-


    Also ich habe die Änderungen wie vorgeschlagen gemacht aber es gibt für die Clients immer noch LUA Errors.
    Deswegen jetzt hier mal das Script soweit wie ich es habe.


    lg
    Webby

  • Hm, da ist leider noch ein bisschen mehr im Unargen


    Zunächsteinmal, ein großes Problem. In der Zeile 31. deklarierst du eine Variable mit einer neuen Funktion
    [lua]self.balloonWheelsState = balloonWheels.balloonWheelsState;[/lua]
    Dies ist prinziepiell richtig. Allerdings sollte man Funktionen, bzw. generell Variablen, mit einem guten Namen versehen. Dh., dass man sofort erkennt, was die Variable/Funktion zu bedeuten hat - in deinem Fall würde sich folgendes anbieten :
    [lua]self.setballoonWheelsState = balloonWheels.setballoonWheelsState;[/lua]


    Dann geht es weiter mit der Zeile 50.
    [lua]self.balloonWheelsState = false;[/lua]
    Fällt dir etwas auf? Genau! Diese Variable existiert in deinem Script bereits und ist eigentlich für die Funktion zuständig. Du widerum überschreibst die Variable mit einem neuern Wert. Ergo, die Funktion ist futsch. Da wir die Funktion oben umbenannt haben, ist das aber kein Problem ;)


    --- Ich muss hier vorerst abbrechen , das wichtigeste ist aber gesagt--- :S


    Ansonsten musst du darauf achten, dass immer wenn sich die variable self.balloonWheelState ändern soll, die Funktion mit dem richtigen Wert aufrufst, da nur dann das Event an die Mitspieler gesendet wird. Dies ist zum Beispiel Bei Tastendrücken der Fall.

  • Hi,


    ich habe die Zeile 31 geändert.


    Zu dem:

    Zitat

    Ansonsten musst du darauf achten, dass immer wenn sich die variable self.balloonWheelState ändern soll, die Funktion mit dem richtigen Wert aufrufst, da nur dann das Event an die Mitspieler gesendet wird. Dies ist zum Beispiel Bei Tastendrücken der Fall.


    Wenn ich eine Taste drücke ändere ich den Wert, aber was muss ich denn dann an die anderen Spieler weitergeben?
    balloonWheelsState oder setballoonWheelsState oder bin ich jetzt voll daneben?


    Das ist aber auch kompliziert... :wacko:


    lg
    Webby

  • Auf Tastendruck führst du eine Funktion aus, die irgendwelche Werte verändert. Und gleichzeitig musst du die Mitspieler Bescheid geben, dass sie auch die Funktion ausführen sollen. In der setBaloonWheelsState sendest du also das Event an deine Mitspieler und veränderst den Wert bei dir.

  • Ich weis zwar nicht ob das hier richtig ist, aber ich hab so ein ähnliches problem:
    hier der ausschnitt:


    [lua]function AnimazioniParti:toggle(id,state,nes)
    toggleAnimEvent.sendEvent(self,id,state,nes);
    self.PartiAnimate[id].toMax = state;
    self.PartiAnimate[id].move = true;
    end;


    function AnimazioniParti:readStream(streamId, connection)
    for nr,part in ipairs(self.PartiAnimate) do
    local state = streamReadBool(streamId);
    self:toggle(nr,state,true);
    end;
    end;


    function AnimazioniParti:writeStream(streamId, connection)
    for nr,part in ipairs(self.PartiAnimate) do
    streamWriteBool(streamId,part.toMax);
    end;
    end;


    toggleAnimEvent = {};
    toggleAnimEvent_mt = Class(toggleAnimEvent, Event);
    InitEventClass(toggleAnimEvent, "toggleAnimEvent");


    function toggleAnimEvent:emptyNew()
    local self = Event:new(toggleAnimEvent_mt);
    self.className="toggleAnimEvent";
    return self;
    end;


    function toggleAnimEvent:new(object, id, state)
    local self = toggleAnimEvent:emptyNew()
    self.object = object;
    self.id = id;
    self.state = state;
    return self;
    end;


    function toggleAnimEvent:readStream(streamId, connection)
    self.object = networkGetObject(streamReadInt32(streamId));
    self.id = streamReadInt8(streamId);
    self.state = streamReadBool(streamId);
    self:run(connection);
    end;


    function toggleAnimEvent:writeStream(streamId, connection)
    streamWriteInt32(streamId, networkGetObjectId(self.object));
    streamWriteInt8(streamId, self.id);
    streamWriteBool(streamId, self.state);
    end;


    function toggleAnimEvent:run(connection)
    if self.object ~= nil then
    self.object:toggle(self.id,self.state, true);
    if not connection:getIsServer() then
    g_server:broadcastEvent(toggleAnimEvent:new(self.object, self.id, self.state), nil, connection, self.object);
    end;
    end;
    end;


    function toggleAnimEvent.sendEvent(vehicle, id, state, nes, noEventSend)
    if nes == nil or nes == false then
    if g_server ~= nil then
    g_server:broadcastEvent(toggleAnimEvent:new(vehicle, id, state), nil, nil, vehicle);
    else
    g_client:getServerConnection():sendEvent(toggleAnimEvent:new(vehicle, id, state));
    end;
    end;
    end;
    [/lua]
    im alten ls ging das, aber jetzt wird ein error angezeigt und das game hängt sich auf, sobald das script im mp mit einem Mitspieler synchronisieren soll.wenn ich bei jmd anderen spiele und es nur mit dem host synchronisieren muss geht es allerdings.
    woran kenn das liegen??
    Danke,
    Flo

Jetzt mitmachen!

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