Stundenzähler nach Spielstunden

  • Hallo liebe Community,


    wollte mal fragen ob zufällig einer weiß wie man den Stundenzähler (OperatingTime) nach den Stunden im Spiel laufen lassen kann und nicht nach den realen Stunden? Habe mir das so vorgestellt, dass man die Zeit im Spiel z.B. 5x oder 15x schneller hat als die reale Zeit und der Stundenzähler mit diesen Stunden arbeitet und nicht mit den realen. Würde es realistischer finden.



    Würde mich freuen wenn mir da einer weiterhelfen könnte.


    Hier mal die ESLimiter LUA: [expander][lua]--
    -- ESLimiter
    -- Specialization for ESLimiter
    --
    -- SFM-Modding
    -- @author Manuel Leithner
    -- @date: 13/11/12
    -- @version: v3.1
    -- @history: v1.0 - initial implementation
    -- v2.0 - convert to LS2011 and some bugfixes
    -- v2.1 - Network-Fixes
    -- v2.2 - Bugfixes and new huds
    -- v3.0 - LS13 & integration of OperatingHours
    -- v3.1 - self-installing modification for standard-vehicles and mod-vehicles & manualIgnition compatible (by gotchTOM)
    --
    -- free for noncommerical-usage
    --
    ESLimiter = {};
    local esl_directory = g_currentModDirectory;
    function ESLimiter.prerequisitesPresent(specializations)
    return SpecializationUtil.hasSpecialization(Motorized, specializations);
    end;
    function ESLimiter:load(xmlFile)
    self.setNewLimit = SpecializationUtil.callSpecializationsFunction("setNewLimit");
    self.addOperatingTime = SpecializationUtil.callSpecializationsFunction("addOperatingTime");


    self.ESLimiter = {};
    self.ESLimiter.maxRPM = {};
    self.ESLimiter.orgMaxRPM = {};
    self.ESLimiter.percentage = {};


    for k,_ in pairs(self.motor.maxRpm) do
    local percentage = string.format("%d",(self.motor.maxRpm[k] * 100 / self.motor.maxRpm[3]));
    self.ESLimiter.percentage[k+1] = tonumber(percentage);
    self.ESLimiter.maxRPM[k+1] = self.motor.maxRpm[3];
    self.ESLimiter.orgMaxRPM[k+1] = self.motor.maxRpm[k];
    end;
    -- set limits for reverse
    self.ESLimiter.maxRPM[1] = self.ESLimiter.maxRPM[2];
    self.ESLimiter.percentage[1] = self.ESLimiter.percentage[2];
    self.ESLimiter.default = self.motor.maxRpm[3];


    self.isLimiterActive = false;
    self.ESLimiter.isButtonPressed = false;


    self.ESLimiter.xPos = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.ESLimiter#posX"), 0.5029);
    self.ESLimiter.yPos = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.ESLimiter#posY"), 0.01238);
    self.ESLimiter.yOffset = 0.014;


    self.ESLimiter.hudBarWidth = 0.205;
    self.ESLimiter.overlay = Overlay:new("hudESLOverlay", Utils.getFilename("ESLimiter_hud.png", esl_directory), self.ESLimiter.xPos, self.ESLimiter.yPos, 0.2371, 0.039525);
    self.ESLimiter.overlayBg = Overlay:new("hudESLBackground", Utils.getFilename("ESLimiter_bg.png", esl_directory), self.ESLimiter.xPos, self.ESLimiter.yPos, 0.2371, 0.039525);
    self.ESLimiter.overlayBar = Overlay:new("hudESLbar", Utils.getFilename("ESLimiter_bar.png", esl_directory), self.ESLimiter.xPos + 0.123, self.ESLimiter.yPos + 0.01, 0.21, 0.02190);


    self.ESLimiter.operatingTime = 0;
    self.lastLevelUpdate = 0;
    self.lastLevel = 0;
    end;
    function ESLimiter:delete()
    end;
    function ESLimiter:readStream(streamId, connection)
    for level,_ in pairs(self.ESLimiter.percentage) do
    local percentage = streamReadInt16(streamId)/10;
    self:setNewLimit(level, percentage, true);
    end;


    self:addOperatingTime(streamReadFloat32(streamId), true);
    end;
    function ESLimiter:writeStream(streamId, connection)
    for _,percentage in pairs(self.ESLimiter.percentage) do
    streamWriteInt16(streamId, percentage*10);
    end;


    streamWriteFloat32(streamId, self.ESLimiter.operatingTime);
    end;
    function ESLimiter:mouseEvent(posX, posY, isDown, isUp, button)
    end;
    function ESLimiter:keyEvent(unicode, sym, modifier, isDown)
    end;
    function ESLimiter:update(dt)
    if self.isMotorStarted then
    self:addOperatingTime(dt);
    end;


    if self:getIsActive() then
    local level = 0;
    if self.movingDirection < 0 then
    level = 1;
    else
    if self.motor.speedLevel > 0 then
    level = self.motor.speedLevel + 1;
    end;
    end;


    if self.isHired then
    if self.attachedCutters ~= nil then
    level = 2;
    for cutter,implement in pairs(self.attachedCutters) do
    if Cutter.getUseLowSpeedLimit(cutter) then
    level = 1;
    break;
    end;
    end;
    else
    level = 1;
    end;
    level = level + 1;
    end;


    if self.lastLevel == level then
    self.lastLevelUpdate = self.lastLevelUpdate + dt;
    else
    self.lastLevelUpdate = 0;
    end;
    self.lastLevel = level;


    if level ~= 0 and self.isClient and self:getIsActiveForInput(false) and not self:hasInputConflictWithSelection() then
    local percentage = self.ESLimiter.percentage;
    if InputBinding.isPressed(InputBinding.ESLimiter_PLUS) and percentage[level] < 100 then
    percentage[level] = percentage[level] + 0.25;
    self:setNewLimit(level, percentage[level], true);
    self.ESLimiter.isButtonPressed = true;
    elseif InputBinding.isPressed(InputBinding.ESLimiter_MINUS) and percentage[level] > 10 then
    percentage[level] = percentage[level] - 0.25;
    self:setNewLimit(level, percentage[level], true);
    self.ESLimiter.isButtonPressed = true;
    else
    if self.ESLimiter.isButtonPressed then
    -- only send event to other players if key was released -> performance issue
    self:setNewLimit(level, percentage[level]);
    self.ESLimiter.isButtonPressed = false;
    end;
    end;
    end;


    if level ~= 0 then
    local newRpm = tonumber(string.format("%d",(self.ESLimiter.percentage[level] * self.ESLimiter.maxRPM[level] / 100)));
    if self.movingDirection >= 0 then
    self.motor.maxRpm[level - 1] = newRpm;
    else
    -- backward
    self.motor.maxRpm[3] = newRpm;
    end;
    else
    -- reset to default value if no level is set
    self.motor.maxRpm[3] = self.ESLimiter.default;
    end;
    end;
    end;
    function ESLimiter:draw()
    local text = Steerable.ESL_DEACTIVATED;
    local currentLevel = self.motor.speedLevel;
    local currentLevelText = 0;
    local percentage = 0;


    if self.movingDirection < 0 then
    currentLevel = 1;
    currentLevelText = "R";
    else
    if self.isHired then
    if self.attachedCutters ~= nil then
    currentLevel = 2;
    for cutter,implement in pairs(self.attachedCutters) do
    if Cutter.getUseLowSpeedLimit(cutter) then
    currentLevel = 1;
    break;
    end;
    end;
    else
    currentLevel = 1;
    end;
    end;


    if currentLevel ~= 0 then
    currentLevel = currentLevel + 1;
    currentLevelText = currentLevel - 1;
    end;
    end;


    if currentLevel ~= 0 and (self.lastLevelUpdate > 500 or self.movingDirection > 0) then
    percentage = tonumber(string.format("%d", self.ESLimiter.percentage[currentLevel]));
    if percentage < 100 then
    percentage = " " .. percentage;
    end;
    text = Steerable.ESL_LEVEL .. currentLevelText .. ":" .. percentage .. "% ";
    g_currentMission:addExtraPrintText(string.format(Steerable.ESL_CONTROLS, self.typeDesc) .. " " .. InputBinding.getKeyNamesOfDigitalAction(InputBinding.ESLimiter_PLUS) .. "/" .. InputBinding.getKeyNamesOfDigitalAction(InputBinding.ESLimiter_MINUS));
    end;


    self.ESLimiter.overlayBg:render();


    self.ESLimiter.overlayBar.width = self.ESLimiter.hudBarWidth * math.min(1, percentage/190);
    setOverlayUVs(self.ESLimiter.overlayBar.overlayId, 0, 0.05, 0, 1, math.min(1, percentage/190), 0.05, math.min(1, percentage/190), 1);
    self.ESLimiter.overlayBar:render();


    self.ESLimiter.overlay:render();
    setTextBold(true);
    setTextAlignment(RenderText.ALIGN_LEFT);
    setTextColor(0, 0, 0, 1);
    renderText(self.ESLimiter.xPos + 0.139, self.ESLimiter.yPos + 0.008, 0.02, text);
    setTextColor(1, 1, 1, 1);
    renderText(self.ESLimiter.xPos + 0.139, self.ESLimiter.yPos + 0.010, 0.02, text);


    local operatingHours = math.floor((self.ESLimiter.operatingTime / 1000 / 60 / 60)*10) / 10;
    local hours = math.floor(operatingHours);
    local minutes = tostring(math.floor((operatingHours - hours)*10));
    setTextAlignment(RenderText.ALIGN_RIGHT);
    setTextBold(true);
    setTextColor(0, 0, 0, 1);
    renderText(self.ESLimiter.xPos+0.062, self.ESLimiter.yPos + 0.008, 0.02, tostring(hours) .. ",");
    setTextColor(1,1,1,1);
    renderText(self.ESLimiter.xPos+0.062, self.ESLimiter.yPos + 0.010, 0.02, tostring(hours) .. ",");
    setTextColor(0, 0, 0, 1);
    renderText(self.ESLimiter.xPos+0.071, self.ESLimiter.yPos + 0.008, 0.02, minutes);
    setTextColor(0.95,0,0,1);
    renderText(self.ESLimiter.xPos+0.071, self.ESLimiter.yPos + 0.010, 0.02, minutes);
    setTextColor(0, 0, 0, 1);
    renderText(self.ESLimiter.xPos+0.08, self.ESLimiter.yPos + 0.008, 0.02, "h");
    setTextColor(1,1,1,1);
    renderText(self.ESLimiter.xPos+0.08, self.ESLimiter.yPos + 0.010, 0.02, "h");
    setTextAlignment(RenderText.ALIGN_LEFT);
    end;
    function ESLimiter:setNewLimit(level, percentage, noEventSend)
    ESLimiterEvent.sendEvent(self, level, percentage, noEventSend);
    self.ESLimiter.percentage[level] = percentage;
    end;
    function ESLimiter:loadFromAttributesAndNodes(xmlFile, key, resetVehicles)
    local valueStr = getXMLString(xmlFile, key.."#limiterValues");
    if valueStr ~= nil then
    local found = string.find(valueStr, ";");
    local index = 1;
    while found ~= nil do
    local value = string.sub(valueStr, 0, found-1);
    valueStr = string.sub(valueStr, found+1);
    found = string.find(valueStr, ";");
    self:setNewLimit(index, tonumber(value), true);
    if found == nil then
    value = tonumber(valueStr);
    self:setNewLimit(index+1, tonumber(value), true);
    end;
    index = index + 1;
    end;
    end;


    local operatingTime = Utils.getNoNil(getXMLFloat(xmlFile, key .. "#operatingTime"), self.ESLimiter.operatingTime) * 1000;
    self:addOperatingTime(operatingTime);
    return BaseMission.VEHICLE_LOAD_OK;
    end;
    function ESLimiter:getSaveAttributesAndNodes(nodeIdent)
    local values = "";
    for k,v in pairs(self.ESLimiter.percentage) do
    if k ~= 1 then
    values = values .. ";";
    end;
    values = values .. string.format("%d", v);
    end;


    local attributes = 'limiterValues="'.. values .. '" operatingTime="' .. tostring((self.ESLimiter.operatingTime / 1000)) ..'"';
    return attributes, nil;
    end;
    function ESLimiter:addOperatingTime(addTime)


    local time = math.max(Utils.getNoNil(addTime, 0), 0);
    self.ESLimiter.operatingTime = self.ESLimiter.operatingTime + time;


    if self.ESLimiter.operatingTime > (99999.9 * 1000 * 60 * 60) then
    self.ESLimiter.operatingTime = 0;
    end;
    end;


    --
    -- ESLimiterEvent
    -- Networkevent for ESLimiter
    --
    -- SFM-Modding
    -- @author Manuel Leithner
    -- @date: 14/12/11
    -- @version: v1.0
    -- @history: v1.0 - initial implementation
    --
    ESLimiterEvent = {};
    ESLimiterEvent_mt = Class(ESLimiterEvent, Event);
    InitEventClass(ESLimiterEvent, "ESLimiterEvent");
    function ESLimiterEvent:emptyNew()
    local self = Event:new(ESLimiterEvent_mt);
    return self;
    end;
    function ESLimiterEvent:new(vehicle, level, percentage)
    local self = ESLimiterEvent:emptyNew()
    self.vehicle = vehicle;
    self.level = level;
    self.percentage = percentage;
    return self;
    end;
    function ESLimiterEvent:readStream(streamId, connection)
    local id = streamReadInt32(streamId);
    self.level = streamReadInt8(streamId);
    self.percentage = streamReadInt16(streamId)/10;
    self.vehicle = networkGetObject(id);
    self:run(connection);
    end;
    function ESLimiterEvent:writeStream(streamId, connection)
    streamWriteInt32(streamId, networkGetObjectId(self.vehicle));
    streamWriteInt8(streamId, self.level);
    streamWriteInt16(streamId, self.percentage*10);
    end;
    function ESLimiterEvent:run(connection)
    self.vehicle:setNewLimit(self.level, self.percentage, true);
    end;
    function ESLimiterEvent.sendEvent(vehicle, level, percentage, noEventSend)


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


    und die Register LUA: [expander][lua]SpecializationUtil.registerSpecialization("esLimiter", "ESLimiter", g_currentModDirectory.."ESLimiter.lua")
    ESLimiter_Register = {};
    function ESLimiter_Register:loadMap(name)
    if self.firstRun == nil then
    self.firstRun = false;


    print("--- loading ESLimiter - specialization for ESLimiter + OperatingHours by Manuel Leithner (SFM-Modding)");


    for k, v in pairs(VehicleTypeUtil.vehicleTypes) do
    if v ~= nil then
    local allowInsertion = true;
    for i = 1, table.maxn(v.specializations) do
    local vs = v.specializations[i];
    if vs ~= nil and vs == SpecializationUtil.getSpecialization("steerable") then
    local v_name_string = v.name
    local point_location = string.find(v_name_string, ".", nil, true)
    if point_location ~= nil then
    local _name = string.sub(v_name_string, 1, point_location-1);
    if rawget(SpecializationUtil.specializations, string.format("%s.ESLimiter", _name)) ~= nil then
    allowInsertion = false;
    -- print(tostring(v.name)..": Specialization ESLimiter is present! ESLimiter was not inserted!");
    end;
    if rawget(SpecializationUtil.specializations, string.format("%s.operatingHours", _name)) ~= nil then
    allowInsertion = false;
    -- print(tostring(v.name)..": Specialization operatingHours is present! ESLimiter was not inserted!");
    end;
    if rawget(SpecializationUtil.specializations, string.format("%s.OperatingHours", _name)) ~= nil then
    allowInsertion = false;
    -- print(tostring(v.name)..": Specialization OperatingHours is present! ESLimiter was not inserted!");
    end;
    end;
    if allowInsertion then
    -- print("adding ESLimiter to:"..tostring(v.name));
    table.insert(v.specializations, SpecializationUtil.getSpecialization("esLimiter"));
    end;


    vs.ESL_DEACTIVATED = g_i18n:getText("ESLimiter_deactivated");
    vs.ESL_LEVEL = g_i18n:getText("ESLimiter_level");
    vs.ESL_CONTROLS = g_i18n:getText("ESLimiter_controls");
    end;
    end;
    end;
    end;
    end;
    end;
    function ESLimiter_Register:deleteMap()


    end;
    function ESLimiter_Register:keyEvent(unicode, sym, modifier, isDown)
    end;
    function ESLimiter_Register:mouseEvent(posX, posY, isDown, isUp, button)
    end;
    function ESLimiter_Register:update(dt)


    end;
    function ESLimiter_Register:draw()


    end;
    addModEventListener(ESLimiter_Register);[/lua][/expander]


    mfg

Jetzt mitmachen!

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