balloonWheels = {}; function balloonWheels.prerequisitesPresent(specializations) return SpecializationUtil.hasSpecialization(Motorized, specializations); end; function balloonWheels:load(xmlFile) self.balloonState = SpecializationUtil.callSpecializationsFunction("balloonState"); self.wheelToBalloonRearLeft = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.balloonWheels.wheelToBalloonRearLeft#index")); self.wheelToBalloonRearRight = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.balloonWheels.wheelToBalloonRearRight#index")); self.wheelToBalloonFrontLeft = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.balloonWheels.wheelToBalloonFrontLeft#index")); self.wheelToBalloonFrontRight = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.balloonWheels.wheelToBalloonFrontRight#index")); self.bwRLX, self.bwRLY, self.bwRLZ = getScale(self.wheelToBalloonRearLeft); self.bwRRX, self.bwRRY, self.bwRRZ = getScale(self.wheelToBalloonRearRight); self.bwFLX, self.bwFLY, self.bwFLZ = getScale(self.wheelToBalloonFrontLeft); self.bwFRX, self.bwFRY, self.bwFRZ = getScale(self.wheelToBalloonFrontRight); self.bwTRLX, self.bwTRLY, self.bwTRLZ = getTranslation(self.wheelToBalloonRearLeft); self.bwTRRX, self.bwTRRY, self.bwTRRZ = getTranslation(self.wheelToBalloonRearRight); self.bwTFLX, self.bwTFLY, self.bwTFLZ = getTranslation(self.wheelToBalloonFrontLeft); self.bwTFRX, self.bwTFRY, self.bwTFRZ = getTranslation(self.wheelToBalloonFrontRight); self.balloonWheelsWidth = getXMLFloat(xmlFile, "vehicle.balloonWheels#wheelWidth"); self.balloonWheelsAxleDiv = getXMLFloat(xmlFile, "vehicle.balloonWheels#axleDiv"); self.isSelectable = true self.balloonWheelsState = false; end; function balloonWheels:delete() end; function balloonWheels:mouseEvent(posX, posY, isDown, isUp, button) end; function balloonWheels:keyEvent(unicode, sym, modifier, isDown) end; function balloonWheels:readStream(streamId, connection) self.balloonWheelsState = streamReadBool(streamId); self:ballonState(self.balloonWheelsState, true); end; function balloonWheels:writeStream(streamId, connection) streamWriteBool(streamId, self.balloonWheelsState); end; function balloonWheels:update(dt) if self:getIsActiveForInput() then if InputBinding.hasEvent(InputBinding.BALLOONWHEELS) then self.balloonWheelsState = not self.balloonWheelsState; self:ballonState(self.balloonWheelsState); end; end; end; function balloonWheels:ballonState(state, noEventSend) if not noEventSend then BalloonWheelsEvent.sendEvent(self, state, noEventSend) end; if state then setScale(self.wheelToBalloonRearLeft, (self.bwRLX / 100) + self.balloonWheelsWidth, self.bwRLY ,self.bwRLZ); setScale(self.wheelToBalloonRearRight, (self.bwRRX / 100) + self.balloonWheelsWidth, self.bwRRY ,self.bwRRZ); setScale(self.wheelToBalloonFrontLeft, (self.bwFLX / 100) + self.balloonWheelsWidth, self.bwFLY ,self.bwFLZ); setScale(self.wheelToBalloonFrontRight, (self.bwFRX / 100) + self.balloonWheelsWidth, self.bwFRY ,self.bwFRZ); setTranslation(self.wheelToBalloonRearLeft, self.bwTRLX + self.balloonWheelsAxleDiv, self.bwTRLY, self.bwTRLZ); setTranslation(self.wheelToBalloonRearRight, self.bwTRRX - self.balloonWheelsAxleDiv, self.bwTRRY, self.bwTRRZ); setTranslation(self.wheelToBalloonFrontLeft, self.bwTFLX + self.balloonWheelsAxleDiv, self.bwTFLY, self.bwTFLZ); setTranslation(self.wheelToBalloonFrontRight, self.bwTFRX - self.balloonWheelsAxleDiv, self.bwTFRY, self.bwTFRZ); elseif not state then setScale(self.wheelToBalloonRearLeft, self.bwRLX, self.bwRLY ,self.bwRLZ); setScale(self.wheelToBalloonRearRight, self.bwRRX, self.bwRRY ,self.bwRRZ); setScale(self.wheelToBalloonFrontLeft, self.bwFLX, self.bwFLY ,self.bwFLZ); setScale(self.wheelToBalloonFrontRight, self.bwFRX, self.bwFRY ,self.bwFRZ); setTranslation(self.wheelToBalloonRearLeft, self.bwTRLX, self.bwTRLY, self.bwTRLZ); setTranslation(self.wheelToBalloonRearRight, self.bwTRRX, self.bwTRRY, self.bwTRRZ); setTranslation(self.wheelToBalloonFrontLeft, self.bwTFLX, self.bwTFLY, self.bwTFLZ); setTranslation(self.wheelToBalloonFrontRight, self.bwTFRX, self.bwTFRY, self.bwTFRZ); end; end; function balloonWheels:draw() if self.balloonWheelsState then g_currentMission:addHelpButtonText(g_i18n:getText("BALLOONOFF"), InputBinding.BALLOONWHEELS); else g_currentMission:addHelpButtonText(g_i18n:getText("BALLOONON"), InputBinding.BALLOONWHEELS); end; end; function balloonWheels:loadFromAttributesAndNodes(xmlFile, key, resetVehicles) local balloonWheelsState = getXMLBool(xmlFile, key.."#balloonWheelsState"); if balloonWheelsState ~= nil then self.balloonWheelsState = balloonWheelsState; end; return BaseMission.VEHICLE_LOAD_OK; end; function balloonWheels:getSaveAttributesAndNodes(nodeIdent) local attributes = "" if self.balloonWheelsState ~= nil then attributes = ' balloonWheelsState="'.. tostring(self.balloonWheelsState) ..'"'; end; return attributes, nil; end; function balloonWheels:onLeave() end; BalloonWheelsEvent = {}; BalloonWheelsEvent_mt = Class(BalloonWheelsEvent, Event); InitEventClass(BalloonWheelsEvent, "BalloonWheelsEvent"); --// diese Funktion wird von new() aufgerufen und erstellt ein leeres Event-Objekt //-- function BalloonWheelsEvent:emptyNew() local self = Event:new(BalloonWheelsEvent_mt); self.className = "BalloonWheelsEvent"; return self; end; --// die Funktion :new() wird von sendEvent() aufgerufen und liefert das befüllte Objekt zurück //-- function BalloonWheelsEvent:new(object, state) local self = BalloonWheelsEvent:emptyNew(); --// das leere Objekt wird erstellt //-- self.object = object; --// object ist in dem Falle dein Fahrzeug //-- self.balloonWheelsState = state; return self; end; --// writeStream sendet die neuen Informationen raus und wurde von broadcastEvent ausgelöst //-- function BalloonWheelsEvent:writeStream(streamId, connection) --// zuerst die ID vom Fahrzeug übergeben damit "der andere" weiss um welches Fahrzeug es geht //-- streamWriteInt32(streamId, networkGetObjectId(self.object)); --// dann die Daten übergeben. streamWriteBool(streamId, self.balloonWheelsState); end; --// readStream liest die neuen Infos wieder ein. //-- function BalloonWheelsEvent:readStream(streamId, connection) --// auch hier erstmal die ID einlesen //-- self.object = networkGetObject(streamReadInt32(streamId)); --// dann die Daten. Wichtig ist, das hier die selbe Reihenfolge wie bei writeStream eingehalten wird!! //-- self.balloonWheelsState = streamReadBool(streamId); --// im Anschluss muss natürlich mit den Daten nochwas angefangen werden //-- self:run(connection); end; --// die funktion run() wird von readStream aufgerufen wenn neue Daten vorliegen //-- function BalloonWheelsEvent:run(connection) --// als erstes werden die erhaltenen Daten an dein eigentliches Script übergeben //-- --// dazu wird wieder die funktion ballonState ausgeführt so wie beim Tastendruck - nur eben beim Mitspieler //-- self.object:ballonState(self.balloonWheelsState, true); --// wenn du die Daten nicht vom Server bekommen hast , dann wurde die funktion lokal aufgerufen //-- --// in dem Falle wird das Statusupdate nochmal an den Server geschickt damit der es verteilt //-- if not connection:getIsServer() then g_server:broadcastEvent(BalloonWheelsEvent:new(self.object, self.balloonWheelsState), nil, connection, self.object); end; end; --// die Funktion :sendEvent() rufst du von deiner Spezi auf. Sie wird die Funktion :new() auslösen --// function BalloonWheelsEvent.sendEvent(object, state, noEventSend) if noEventSend == nil or noEventSend == false then if g_server ~= nil then --// wenn du der Server bist, //-- g_server:broadcastEvent(BalloonWheelsEvent:new(object, state), nil, nil, object); --// schickst du das ergebnis von :new() an alle //-- else --// wenn du client bist, //-- g_client:getServerConnection():sendEvent(BalloonWheelsEvent:new(object, state)); --// schickst du das ergebnis von :new() an den server //-- end; end; end;