Problem mit Kraftstoffverbrauch

  • Hi,


    ich bastel an einem Script bei dem auf Tastendruck der Spritverbrauch erhöht werden soll.
    Soweit funktioniert das auch aber es gibt ein kleines Problem.


    Ich hole mir mit der load Funktion, den Verbrauch aus der fahrzeug.xml:
    [lua]self.orgFuelUsage = getXMLFloat(xmlFile, "vehicle.fuelUsage");[/lua]


    Im event wird das Ganze dann gesetzt:
    [lua]
    local kmhMath = math.max(1, (self.lastSpeed*self.speedDisplayScale*3600)/3);
    local fuelUsed = 0.10*kmhMath;
    self.fuelUsage = self.fuelUsage + fuelUsed;
    [/lua]
    Soweit funktioniert das auch problemlos aber...
    Der Verbrauch ist im Stand genauso hoch wie bei Vollgas :S
    Ich suche jetzt nach einer Möglichkeit, den Verbrauch Drehzahl oder Geschwindigkeitsabhängig zu machen.


    Hab es so versucht:
    [lua]
    if self.motor.lastMotorRpm > 1100 then
    local kmhMath = math.max(1, (self.lastSpeed*self.speedDisplayScale*3600)/3);
    local fuelUsed = 0.10*kmhMath;
    self.fuelUsage = self.fuelUsage + fuelUsed;
    end;
    [/lua]
    Aber leider passiert da nichts, Verbrauch bleibt auf Standard :(
    Ich habe bewusst einen hohen Verbrauchsfaktor gewählt, damit man die Veränderung auch sieht.


    Hat jemand ne Idee, wie ich das abfragen kann?
    Super wäre, wenn der Verbrauch dynamisch wäre.
    Also langsame Fahrt -> wenig Verbrauch, volle fahrt -> viel Verbrauch.


    MfG
    Webby

  • Die Funktion "fuelConsumState" wird nur per Tastendruck aufgerufen. Wenn in diesem Moment die Drehzahl über 1100 ist wird er erhöht, wenn nicht dann nicht. Du könntest das Zeug in update() mit rein bringen, dann sollte es klappen..

  • Werde ich direkt mal versuchen, danke :thumbsup:
    Überings, viel Glück beim Contest! ;)


    Edit:
    Hmm funktioniert leider nicht :(

    Zitat

    C:/Users/Chris/Documents/My Games/FarmingSimulator2015/mods//ScriptTestMod/deutzAgroStar661.i3d (78.25 ms)
    Error: Running LUA method 'update'.
    D:/code/lsim2015/build/finalbin/dataS/scripts/vehicles/VehicleMotor.lua(93) : attempt to perform arithmetic on local 'torque' (a nil value)


    Direkt nach betreten des Fahrzeugs.


    So sieht das Script aktuell aus:
    [expander]
    [lua]
    fuelConsum = {};


    function fuelConsum.prerequisitesPresent(specializations)
    return SpecializationUtil.hasSpecialization(Motorized, specializations);
    end;


    function fuelConsum:load(xmlFile)
    self.fuelConsumState = SpecializationUtil.callSpecializationsFunction("fuelConsumState");
    self.orgFuelUsage = getXMLFloat(xmlFile, "vehicle.fuelUsage");
    self.isSelectable = true;
    self.fuelConsumState = false;
    end;


    function fuelConsum:delete()
    end;


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


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


    function fuelConsum:readStream(streamId, connection)
    self.fuelConsumState = streamReadBool(streamId);
    self:fuelConsumState(self.fuelConsumState, true);
    end;


    function fuelConsum:writeStream(streamId, connection)
    streamWriteBool(streamId, self.fuelConsumState);
    end;


    function fuelConsum:update(dt)
    if self:getIsActiveForInput() then
    if InputBinding.hasEvent(InputBinding.FUELCONSUM) then
    self.fuelConsumState = not self.fuelConsumState;
    self:fuelConsumState(self.fuelConsumState);
    end;
    end;

    if self.fuelConsumState then


    if self.motor.lastMotorRpm > 1100 then
    local kmhMath = math.max(1, (self.lastSpeed*self.speedDisplayScale*3600)/3);
    local fuelUsed = 0.10*kmhMath; -- 0.0002
    -- self.fuelUsage = self.fuelUsage + fuelUsed;
    self.fuelUsage = self.orgFuelUsage + fuelUsed;
    end;


    elseif not self.fuelConsumState then
    self.fuelUsage = self.orgFuelUsage / (60*60*1000);
    end;

    end;


    function fuelConsum:fuelConsumState(fuelConsumState, noEventSend)
    if not noEventSend then
    fuelConsumEvent.sendEvent(self, fuelConsumState, noEventSend)
    end;
    end;


    function fuelConsum:draw()
    if self.fuelConsumState then
    g_currentMission:addHelpButtonText(g_i18n:getText("FUELCOFF"), InputBinding.FUELCONSUM);
    else
    g_currentMission:addHelpButtonText(g_i18n:getText("FUELCON"), InputBinding.FUELCONSUM);
    end;
    end;


    function fuelConsum:loadFromAttributesAndNodes(xmlFile, key, resetVehicles)
    local fuelConsumState = getXMLBool(xmlFile, key.."#fuelConsumState");
    if fuelConsumState ~= nil then
    self.fuelConsumState = fuelConsumState;
    end;
    return BaseMission.VEHICLE_LOAD_OK;
    end;


    function fuelConsum:getSaveAttributesAndNodes(nodeIdent)
    local attributes = ""
    if self.fuelConsumState ~= nil then
    attributes = ' fuelConsumState="'.. tostring(self.fuelConsumState) ..'"';
    end;
    return attributes, nil;
    end;


    function fuelConsum:onLeave()
    end;


    --
    -- iNet Stuff
    --


    fuelConsumEvent = {};
    fuelConsumEvent_mt = Class(fuelConsumEvent, Event);


    InitEventClass(fuelConsumEvent, "fuelConsumEvent");


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


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


    function fuelConsumEvent:writeStream(streamId, connection)
    streamWriteInt32(streamId, networkGetObjectId(self.object));
    streamWriteBool(streamId, self.fuelConsumState);
    end;


    function fuelConsumEvent:readStream(streamId, connection)
    self.object = networkGetObject(streamReadInt32(streamId));
    self.fuelConsumState = streamReadBool(streamId);
    self:run(connection);
    end;


    function fuelConsumEvent:run(connection)
    self.object:fuelConsumState(self.fuelConsumState, true);
    if not connection:getIsServer() then
    g_server:broadcastEvent(fuelConsumEvent:new(self.object, self.fuelConsumState), nil, connection, self.object);
    end;
    end;


    function fuelConsumEvent.sendEvent(object, state, noEventSend)
    if noEventSend == nil or noEventSend == false then
    if g_server ~= nil then
    g_server:broadcastEvent(fuelConsumEvent:new(object, fuelConsumState), nil, nil, object);
    else
    g_client:getServerConnection():sendEvent(fuelConsumEvent:new(object, fuelConsumState));
    end;
    end;
    end;
    [/lua]
    [/expander]

  • Hi,


    dichti
    Also durch die Scripts von Blacky steige ich mal gar nicht durch...


    Der Logeintrag oben war überings Falsch.
    Beim Einschalten des Verbrauchs ist noch alles gut, schalte ich es wieder ab, ist der Tank sofort komplett leer und es kommt diese Meldung in der Log:

    Zitat

    C:/Users/Chris/Documents/My Games/FarmingSimulator2015/mods//ScriptTestMod/deutzAgroStar661.i3d (82.00 ms)
    Error: Running LUA method 'update'.
    C:/Users/Chris/Documents/My Games/FarmingSimulator2015/mods//ScriptTestMod/Scripts/fuelConsum.lua:51: attempt to call method 'fuelConsumState' (a boolean value)


    Versteh ich nur nicht, fuelConsumState ist ein boolscher Wert und das muss er ja auch sein 8|


    MfG
    Webby

  • method ist aber nicht nur ein boolscher Wert, sondern auch deine function.
    Siehe dazu Zeile 8 in deinem letzten gepostetem Script ;)


    [lua] self.fuelConsumState = SpecializationUtil.callSpecializationsFunction("fuelConsumState");
    self.orgFuelUsage = getXMLFloat(xmlFile, "vehicle.fuelUsage");
    self.isSelectable = true;
    self.fuelConsumState = false;
    [/lua]


    Es ist beides. Aber wohl dann doch eher ein boolscher Wert, da dieser zuletzt belegt wird.


    Also, machst du einfach mal deine function neu, z.B in self.fuelConsumSwitch()


    Dann ist das schonmal weg.


    Dann musst du auch in der function deine Variable ändern, bzw aktualisieren, sonst funzt das mit dem Event nicht. Denn du sendest zwar deine Variable, aber sagst dem Empfänger ja nicht was er damit tun soll.


    [lua] if InputBinding.hasEvent(InputBinding.FUELCONSUM) then
    self:fuelConsumSwitch(not self.fuelConsumState);
    end;
    [/lua]


    [lua]function fuelConsum:fuelConsumSwitch(fuelConsumState, noEventSend)
    if not noEventSend then
    fuelConsumEvent.sendEvent(self, fuelConsumState, noEventSend)
    end;

    self.fuelConsumState = fuelConsumState;


    end[/lua]


    Übergibst deine Function also den "not" Wert, in der Function wird er dann aktualisiert, somit alles wie vorher. Nur das jetzt dein MP Event auch funzt, denn wenn dort nur ein true/false ankommt, kann der empfänger nix damit anfangen. Jetzt hingegen schon, denn true/false belegt dann den Wert der Variable, bzw die Variable erhält dann das true/false.


    Icvh hab jetzt die function schonmal umbenannt, das muss du dann bei dir noch anpassen, überall, also im load und auch im event.

Jetzt mitmachen!

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