Beiträge von Face

    wenn das ne feste animation ist, dann mach das mit der Animations-Spezi, die ist bereits gesynched.


    wenn das zB was unwichtiges is wie ne haspel, dann schau dir mal das Script vom Kärcher an wie das da gelöst ist mit dem "TastenDruck"


    ich übertrage da nur ein event wenn ich die taste drücke und einmal wenn ich sie loslasse... alles was dazwischen ist muss nicht übertragen werden, sondern eben nur das initiale event

    So ich hoffe ich kann damit bissl helfen:



    [lua]


    -- Prinzipiell sollte man Spezis immer mit einem Großbuchstaben beginnen: MyScript in dem fall aber das is heir erstmal egal.


    myScript = {};


    function myScript.prerequisitesPresent(specializations)
    return true;
    end;


    function myScript:load(xmlFile)


    self.setRotateDirection= SpecializationUtil.callSpecializationsFunction("setRotateDirection"); -- setRotation wäre hier irreführend weils die funktion von Giants schon gibt, nimm lieder die hier. Mit dem aufruf registrierst du die funktion.


    local rotationPartNodeRotation1= Utils.indexToObject(self.rootNode, getXMLString(xmlFile, "vehicle.Rotation1#index"));
    if rotationPartNodeRotation1 ~= nil then
    self.Rotation1 = {};
    self.Rotation1.node = rotationPartNodeRotation1;


    local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.Rotation1#minRot"));
    self.Rotation1.minRot = {};
    self.Rotation1.minRot[1] = Utils.degToRad(Utils.getNoNil(x, 0));
    self.Rotation1.minRot[2] = Utils.degToRad(Utils.getNoNil(y, 0));
    self.Rotation1.minRot[3] = Utils.degToRad(Utils.getNoNil(z, 0));


    x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.Rotation1#maxRot"));
    self.Rotation1.maxRot = {};
    self.Rotation1.maxRot[1] = Utils.degToRad(Utils.getNoNil(x, 0));
    self.Rotation1.maxRot[2] = Utils.degToRad(Utils.getNoNil(y, 0));
    self.Rotation1.maxRot[3] = Utils.degToRad(Utils.getNoNil(z, 0));


    self.Rotation1.rotTime = Utils.getNoNil(getXMLString(xmlFile, "vehicle.Rotation1#rotTime"), 2)*1000;
    end;


    self.currentRotationDir= false; -- die aktuelle richtung der drehung als Boolean(wahrheitswert)
    end;


    function myScript:delete()
    end;


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


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


    function myScript:readStream(streamId, connection) -- wird Aufgerufen wenn ich selber ein Spiel join
    self:setRotateDirection(streamReadBool(streamId), true); -- ich rufe also vom server die aktuelle richtung ab. True ist hier wichtig, weil ich will ja nur an meinem rechner den wert haben, und nich an alle anderen Mitspiele das Event schicken (weil die haben den aktuellen wert ja schon :-)) Das true hier also nie vergessen
    end;


    function myScript:writeStream(streamId, connection) -- wird am Server aufgerufen wenn ein Spieler joint
    streamWriteBool(streamId, self.currentRotationDir); -- Wenn einspieler joint möchte ich ihm die aktuelle rotationsrichtung übertragen
    end;


    function myScript:update(dt)

    if InputBinding.isPressed(InputBinding.TASTE) then
    self:setRotateDirection(not self.currentRotationDir); -- tastenevents sollte man als funktion auslagern, um MP-sachen zu vereinfachen. Beim tastendruck wird eben die funktion aufgerufen nur eben mit dem genau anderen wert :D
    end;

    end;



    function myScript:updateTick(dt) -- ist wie Update nur verzögert um performance zu sparen. Prinzipiell sollte alles hier rein, bis auf sachen für die die verzögerung nicht reihct(z.b. tastendruck etz)

    if self.Rotation1 ~= nil then
    local x, y, z = getRotation(self.Rotation1.node);
    local rot = {x,y,z};
    local newRot = Utils.getMovedLimitedValues(rot, self.Rotation1.maxRot, self.Rotation1.minRot, 3, self.Rotation1.rotTime, dt, not self.currentRotationDir); -- hier habe ich nur drehen druch currentRotationDir ersetzt
    setRotation(self.Rotation1.node, unpack(newRot));
    end;
    end;


    function myScript:setRotateDirection(newDirection, noEventSend) -- noEventSend bedeutet , dass wenn die variable den wert true hat kein event an andere mitspieler gesendet werden soll
    RotationEvent.sendEvent(self, newDirection, noEventSend); -- wir versuchen das event zu senden. Als parameter übergeben wir die neue rotationDirection, die wir beim tastendruck setzen
    self.currentRotationDir = newDirection; -- wir setzen nun lokal die neue Richtung
    end;


    function myScript:draw()
    end;[/lua]



    Das Event


    [lua]RotationEvent = {};
    RotationEvent_mt = Class(RotationEvent, Event);


    InitEventClass(RotationEvent, "RotationEvent");


    function RotationEvent:emptyNew() -- hoier wir ein leeres Event objekt erzeugt
    local self = Event:new(RotationEvent_mt );
    self.className="RotationEvent";
    return self;
    end;


    function RotationEvent:new(vehicle, direction) -- Der konsturktor des Events (erzeugt eben ein neues Event). Wir wollen das vehicle (aufrufer) und die neue richtung speichern bzw. übertragen
    self.vehicle = vehicle;
    self.direction = direction;
    return self;
    end;


    function RotationEvent:readStream(streamId, connection) -- wird aufgerufen wenn mich ein Event erreicht
    local id = streamReadInt32(streamId); -- hier lesen wir die übertragene ID des vehicles aus
    self.direction = streamReadBool(streamId); -- hier lesen wir die neue direction aus (es handelt sich hierbei um einen Bool (true/false)
    self.vehicle = networkGetObject(id); -- wir wandeln nunn die ID des vehicles in das passende Objekt um
    self:run(connection); -- das event wurde komplett empfangen und kann nun "ausgeführt" werden
    end;


    function RotationEvent:writeStream(streamId, connection) -- Wird aufgrufen wenn ich ein event verschicke (merke: reihenfolge der Daten muss mit der bei readStream übereinstimmen (z.B. hier: erst die Vehicle-Id und dann die rotation senden, und bei Readstream dann eben erst die vehicleId lesen und dann die rotation)
    streamWriteInt32(streamId, networkGetObjectId(self.vehicle)); -- wir übertragen das Vehicle in form seiner ID
    streamWriteBool(streamId, self.direction ); -- wir übertragen die neue direction
    end;


    function RotationEvent:run(connection) -- wir führen das empfangene event aus
    self.vehicle:setRotateDirection(self.direction, true); -- wir rufen die funktion setRotateDirection auf, damit auch hier bei uns die drehrichtung geändert wird. Das true ist hier wichtig, dann wir haben ein event erhalten, d.h. wir brauchen es nicht mehr versenden, weil es alle anderen mitpsieler schon erreicht hat! Das true also hier nie vergessen!!!!!!
    if not connection:getIsServer() then -- wenn der Empfänger des Events der Server ist, dann soll er das Event an alle anderen Clients schicken
    g_server:broadcastEvent(RotationEvent:new(self.vehicle, self.direction), nil, connection, self.object);
    end;
    end;


    function RotationEvent.sendEvent(vehicle, direction, noEventSend) -- hilfsfunktion, die Events anstößte (wirde von setRotateDirection in der Spezi aufgerufen)
    if noEventSend == nil or noEventSend == false then
    if g_server ~= nil then -- wenn wir der Server sind dann schicken wir das event an alle clients
    g_server:broadcastEvent(RotationEvent:new(vehicle, direction), nil, nil, vehicle);
    else -- wenn wir ein Client sind dann schicken wir das event zum server
    g_client:getServerConnection():sendEvent(RotationEvent:new(vehicle, directiont));
    end;
    end;
    end;
    [/lua]

    Ehrlich gesagt, sind die leute doch selber schuld?


    Es heißt nun mal PRIVAT-Mod.... und sobald ich den auch nur an eine Person weitergebe, dann ist es eben kein Privatmod mehr sondern ein Public-mod... und dann kann ich ihn auch gleich überall zum Download anbieten.


    Prinzipiell verstehe ich eh nicht dieses ganze Verstecken und nicht freigeben.... davon hat nun mal wirklich keiner etwas.. und es führt nur zu Problemen. Weil meiner Meinung nach ist das nur ein reiner ****anz-Vergleich. Es gibt nämlich 2 Möglichkeiten:


    1. Entweder ich stelle den Mod frei für alle zur Verfügung
    2.Oder ich behalte den Mod eben für mich, aber dann darf ich ihn auch nicht auf Screenshots zeigen!


    doch leider wird dies immer wieder von den Usern gemacht, um eben anderen zu zeigen, dass man etwas hat, was andere eben nicht habe.... der bereits angesprochene Vergleich!.



    Sinnfrei... eifnach nur Sinnfrei.

    Self ist eine Variable die die Referenz auf das jeweilige Objekt (also auf sich selber) beinhaltet, um somit auf die Properties (Attribute) und Methoden (Function) zuzugreifen. Man kann hier zwar auch jede KLassenfunktion (wie heady scon sagte) mit


    Klassenname.funktionsname() aufrufen, jedoch muss man dort immer die Objektinstanz übergeben. also z.b wäre


    self:funktionsname()
    das gleiche wie
    Klassenname:funktionsname(self);


    Einweitere Vorteil der Benutzung von self tritt auf, wenn man von Klassen erbt. Hier sollte man zwingend self nutzen (man sollte es auch generell nutzen :-)), da es sonst zu problemen kommen kann.


    Bei Fahrzeugen kannst du dir also vorstellen, dass SELF dein Fahrzeug ist (bzw. eine Instanz/objekt davon), um es einfach auszudrücken.


    Dieses self konstrukt gibt es uach in anderen sprahcen: Java (this), C'#(this), VB.net (Me).

    Hi


    echt schöner kipper. Nur die reifen passt in der Farbe definitiv nicht dazu :D
    Evtl bissl dunkler machen dann passt das schon eher.
    Was auch noch cool wäre, wenn du die nromale 80er bordwand nochmal oben draufbaust . so fahren die bei uns ziemlich oft rum



    mfg Face


    ps: ich hoffe da kommt in naher zukunft auch nochn passender LKW-Drehschemel hänger dazu mit der Hängerzug komplett ist :d