Beiträge von Michi77

    Das Problem liegt wohl wirklich an der Engine und somit auf der Seite von Giants.


    Wenn man jedoch irgendwie an den aktuellen Rendermodus dran käme, könnte man das Problem umgehen, indem man halt alles spiegelt/rotiert.
    Da das aber wohl nicht möglich ist, muss ich mir was anderes überlegen..

    Bin nun selber etwas weiter gekommen..


    Ich habe jetzt herausgefunden wie ich die Anzeige der Kameras drehen und spiegeln kann.


    [lua]setOverlayRotation(camOverlay.overlayId, math.rad(180) , 0, 0);
    setOverlayUVs(camOverlay.overlayId, 1, 0, 1, 1, 0, 0, 0, 1);[/lua]


    Dadurch wird die Kamera bei Direct3D richtig angezeigt.
    Jedoch hab ich nun noch das Problem, dass ich herausfinden muss, ob derzeit D3D oder OpenGL aktiviert ist.


    Wird das eventuell in irgendeiner globalen Variable oder so abgespeichert?



    PS: Sorry 4 Doppelpost..

    Moin,


    hab mal eine etwas speziellere Frage..
    Ich versuche mit Hilfe der RafftnixGUI.lua eine zusätzliche Kamera als Overlay anzeigen zu lassen. Das ganze funktioniert soweit auch ganz gut.
    Wenn man als Rederer jedoch Direct3D und nicht OpenGL nutzt, wird die Kamera um 180° gedreht angezeigt.
    [lua]camOverlay = self.gui:createRenderOverlay(self.gui.baseElement, 0.831, 0.185+0.166, 0.166, 0.166, cam, 512, 512, getScreenAspectRatio());[/lua]


    Bin da langsam am verzweifeln.. :S Wie kann man das beheben, dass die Kamera auch mit D3D richtig angezeigt wird?

    Moin,
    schau mal in der XML vom Drescher beim Attacher Joint fürs Schneidwerk. Beispiel:

    XML
    <attacherJoint jointType="cutter" index="0>9|0|0" jointPositionOffset="0 0 -1.493" rotationNode="0>9|0" minRot="-21 0 0" maxRot="10 0 0" maxTransLimit="0 0 0" maxRotLimit="0 0 -20" moveTime="2.5" ptoOutputNode="0>9|1|2|3" ptoFilename="$data/vehicles/shared/powerTakeoff.i3d">
    <bottomArm rotationNode="0>9|1" referenceNode="0>9|1|0" />
    </attacherJoint>



    Da musst du die Werte bei maxRotLimit="" ändern. Im Notfall einfach "0 0 0" eintragen.

    Tach Leute,


    ich habe da mal wieder ein kleine Problem. Es geht um eine Animation die per .lua gelöst ist. Beispielsweise hier ein Auszug aus der Combine.lua:


    [lua]
    904 if self.isThreshing and self.rotorFan ~= nil then
    905 rotate(self.rotorFan, dt*0.005, 0, 0);
    906 end;[/lua]
    Jetzt meine Frage: Wie kann ich die Animation ändern? Damit scheint es nämlich nicht zu funktionieren:


    [lua]
    self.rotorFan = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.rotorFan#index"));
    [/lua]
    und:
    [lua]
    if self.isThreshing and self.rotorFan ~= nil then
    rotate(self.rotorFan, dt*0.01, 0, 0);
    end;
    [/lua]
    Bei "0.01" kann ich jeden Wert eingeben, es wird immer die Animation aus der Combine.lua abgespielt, da es sich immer gleich schnell dreht. Auch die Animation mit einem "Backup" der self.rotorFan Variable zu lösen und die originale Variable auf, beispielsweise eine leere Transformgroup zuzuweisen um die Standard Funktion zu umgehen, funktioniert auch nicht. Leider enthält das rotate() keine Variable die man ansteuern könnte um diese dann zu verändern. Gibt es also irgendeine Möglichkeit das ganze zu lösen ohne die xml bzw i3d zu bearbeiten? Zwar könnte man das dann recht einfach lösen, indem man eine komplett neue Variable erstellt und diese dann animiert, jedoch möchte ich das gerne vermeiden und nur per .lua lösen.

    So,


    ich habe da wieder getestet mit deinen Änderungen, spricht:


    [lua]
    self.vehicle:setManualUnloading(self.manualUnloading, true);
    [/lua]
    und


    [lua]
    if manualUnloading == nil then
    [/lua]


    Dann kann der Client nicht abladen, Host schon.


    Wenn ich aber wieder statt


    [lua]if manualUnloading == nil then[/lua]


    dass einfüge:


    [lua]if manualUnload == nil then[/lua]


    klappt es bei beiden ohne logfehler. Leider ist mir aber trotzdem eine Kleinigkeit aufgefallen, die beim Client nicht stimmt. Und zwar wird dort der Hilfetext (F1) "falsch herum" angezeigt. Sprich wenn der Client abladet steht im Hilfetext abladen starten. Beim Host ist es aber richt.


    Hier mal der Hilfetext:


    [lua]function manualPipe:draw()
    if self.pipeOpen and self.manualUnloading then
    g_currentMission:addHelpButtonText(g_i18n:getText("Stopdumpinggrain"), InputBinding.ACTIVATE_UNLOADING);
    elseif self.pipeOpen then
    g_currentMission:addHelpButtonText(g_i18n:getText("Startdumpinggrain"), InputBinding.ACTIVATE_UNLOADING);
    end;
    end;[/lua]


    hier mal die :load function:
    [lua]function manualPipe:load(xmlFile)


    self.manualUnloading = false;
    self.pipeRaycastDistance = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.pipe#raycastDistance"));
    self.pipeRaycastDistance = 0.1;


    [/lua]


    Ich weiß nicht ob die damit was zu tun hat. Aber wieso ist beim Client dann nur der Hilfetext falsch herum? Bei Host und Client wird standardmäßig nicht abgeladen und mit einem Tastendruck auf abladen umgeschaltet.

    Also, schon einmal Danke für die ganze Hilfe hier, da bin ich euch echt dankbar :)


    Mitlerweile funktioniert es schon teilweise im MP. Leider wird ständig abgeladen und "self.manualUnloading" wird scheinbar sehr schnell ständig ein- und wieder ausgeschaltet, zumindest laut Hilfetext. Dies betrifft Client und Host. Im SP klapp alles perfekt. Die Log bleibt übrigens bei beiden fehlerfrei.


    Aktuelles Setup:


    [expander]
    [lua]
    function manualPipe:readStream(streamId, connection)
    local manualUnloading = streamReadBool(streamId)
    self:setManualUnloading(manualUnloading, true);
    end;


    function manualPipe:writeStream(streamId, connection)
    streamWriteBool(streamId, self.manualUnloading);
    end;


    function manualPipe:setManualUnloading(manualUnloading, noEventSend)
    if manualUnload == nil then
    self.manualUnloading = not self.manualUnloading
    else
    self.manualUnloading = manualUnload
    end;

    if self.manualUnloading then
    self.pipeRaycastDistance = 6;
    else
    self.pipeRaycastDistance = 0.1;
    end;
    manualPipeEvent.sendEvent(self, self.manualUnloading, noEventSend);
    end;
    [/lua]
    in der update-function:
    [lua]
    if self.isEntered then
    if self.pipeOpen and self.getIsPipeUnloadingAllowed then
    if self:getIsActive() and self:getIsActiveForInput(false) and not self:hasInputConflictWithSelection() and InputBinding.hasEvent(InputBinding.ACTIVATE_UNLOADING) then
    self:setManualUnloading();
    end;
    end;
    end;
    [/lua]


    und das Event: (eigentlich das selbe was FIAT80-90DT gepostet hat)
    [lua]
    manualPipeEvent = {};
    manualPipeEvent_mt = Class(manualPipeEvent, Event);


    InitEventClass(manualPipeEvent, "manualPipeEvent");


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


    function manualPipeEvent:new(vehicle, manualUnloading, streamId) --Parameter vergessen! Wir brauchen eine Variable für self.manualUnloading!
    local self = manualPipeEvent:emptyNew()
    self.vehicle = vehicle;
    self.manualUnloading = manualUnloading; -- Gleiche Namenskonventionen für eine bessere Übersichtlichkeit.
    return self;
    end;


    function manualPipeEvent:readStream(streamId, connection)
    local id = streamReadInt32(streamId);
    self.vehicle = networkGetObject(id);
    self.manualUnloading = streamReadBool(streamId);
    self:run(connection);
    end;


    function manualPipeEvent:writeStream(streamId, connection)
    streamWriteInt32(streamId, networkGetObjectId(self.vehicle));
    streamWriteBool(streamId, self.manualUnloading);
    end;


    function manualPipeEvent:run(connection)
    self.vehicle:setManualUnloading(self.manualUnloading);
    if not connection:getIsServer() then
    g_server:broadcastEvent(manualPipeEvent:new(self.vehicle, self.manualUnloading), nil, connection, self.vehicle);
    end;
    end;


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


    Ich habe da auch selber noch bischen rumprobiert, aber leider immer mit ähnlichem Ergebnis.

    Okay..


    Bei der unload Funktion habe ich aber ein Problem:


    [lua]
    function manualPipe:setManualUnloading(unload, noEventSend)
    self.manualUnloading = unload;
    manualPipeEvent.sendEvent(self, unload, noEventSend);
    end;
    [/lua]


    und das hier bei dem Tastendruck:
    [lua]
    if self.manualUnloading then
    self:setManualUnloading(false);
    else
    self:setManualUnloading(true);
    end;
    [/lua]


    Naja, dann kann ich sogar im SP zwar abladen aktivieren, aber nicht mehr deaktivieren. Ich glaub da steht ich grade auf der Leitung..

    Ach, doch etwas vergessen:


    [lua]function manualPipe:readStream(streamId, connection)
    local unload = streamReadBool(streamId)
    self:setManualUnloading(unload, true);
    local state = streamReadInt8(streamId);
    self:setPipeRaycastDistance(state, true);
    end;


    function manualPipe:writeStream(streamId, connection)
    streamWriteInt8(streamId, self.pipeRaycastDistance);
    streamWriteBool(streamId, self.manualUnloading);
    end;[/lua]



    So hab ich es derzeit drinnen.

    Hallöchen,


    Bei einem selbst (um-)geschriebenem Script habe ich nun versucht es MP-fähig zu bekommen.
    Das Script soll eigentlich die "pipeRaycastDistance" bei Knopfdruck verschieben, um ein manuelles Abladen zu schaffen.
    Im SP klappt alles wunderbar. Der Host im MP hat auch keine Probleme. Der Client hat ohne ein "Event" das Problem, dass man zwar die Taste drücken kann, dann aber nichts weiter passiert. Also habe ich mich erstmals mit den Events ausernander gesetzt


    Ich liste hier mal die wichtigsten Einträge auf.
    In der update function habe ich
    [lua] if self:getIsActive() and self:getIsActiveForInput(false) and not self:hasInputConflictWithSelection() and InputBinding.hasEvent(InputBinding.ACTIVATE_UNLOADING) then
    self:setManualUnloading()
    end;[/lua]


    und:


    [lua] if not self.isAIThreshing then
    if self.pipeOpen then
    if self.grainTankFillLevel > 0 then
    local trailer, trailerDistance = self:findTrailerToUnload(self.currentGrainTankFruitType);
    if trailer == nil then
    self:setPipeRaycastDistance()
    else
    self:setPipeRaycastDistance()
    end;
    end;
    end;
    end;[/lua]


    dann gibts noch die hier:
    [lua]function manualPipe:setManualUnloading(unload, noEventSend)
    self.manualUnloading = not self.manualUnloading;
    unload = self.manualUnloading;
    manualPipeEvent.sendEvent(self, unload, noEventSend);
    end;
    [/lua]


    [lua]function manualPipe:setPipeRaycastDistance(state, noEventSend)
    if self.manualUnloading then
    self.pipeRaycastDistance = 6;
    else
    self.pipeRaycastDistance = 0.1;
    end;
    state = self.pipeRaycastDistance;
    manualPipeEvent.sendEvent(self, state, noEventSend);
    end;[/lua]



    Dann kommt noch das Event:
    [lua]


    manualPipeEvent = {};
    manualPipeEvent_mt = Class(manualPipeEvent, Event);


    InitEventClass(manualPipeEvent, "manualPipeEvent");


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


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


    function manualPipeEvent:readStream(streamId, connection)
    local id = streamReadInt32(streamId);
    self.vehicle = networkGetObject(id);
    self.state = streamReadInt8(streamId);
    self.unload = streamReadBool(streamId);
    self:run(connection);
    end;


    function manualPipeEvent:writeStream(streamId, connection)
    streamWriteInt32(streamId, networkGetObjectId(self.vehicle));
    streamWriteInt8(streamId, self.state);
    streamWriteBool(streamId, self.unload);
    end;


    function manualPipeEvent:run(connection)
    self.vehicle:setPipeRaycastDistance(self.state, true);
    self.vehicle:setManualUnloading(self.unload, true);
    if not connection:getIsServer() then
    g_server:broadcastEvent(manualPipeEvent:new(self.vehicle, self.state, self.unload), nil, connection, self.vehicle);
    end;
    end;


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


    Naja kommt leider bei Host und Client im MP das hier in der Log:


    Code
    Error: Failed to create new object with class id 5751 in initial object array
    Error: LUA running function 'packetReceived'
    C:/Users/Michi/Documents/My Games/FarmingSimulator2013/mods/ClaasLexion550/manualPipe.lua(275) : attempt to index field 'vehicle' (a nil value)


    Zeile 275 ist übrigens
    self.vehicle:setPipeRaycastDistance(self.state, true);
    aus der :run function des Events.
    Im SP ist weiterhin alles sauber.


    Ich bin mitlerweile ratlos, vielleicht weiß einer von euch weiter..

    Danke für die positiven kommis : :)


    Link vom Drescher wird leider nicht so einfach sein. Da das ein 540er glaub von den ungarn oder polen war und der erst mal generall überholt werden musste. Das ganze Modell war in einem Stück gemodet und musste erst mal auseinander geschnitten werden. Skin musste geändert werden. Log-Fehler mussten auch noch beseitigt werden, da der anscheinend vom 09er konvertiert wurde.(aber schlecht :P ) Naja und dann halt noch das Animieren vom Korntank und Leiter. Eigentlich würd ich den auch gerne zum Download stellen, nur hab ich keine Ahnung wo ich den/die Urmodder finden kann, wegen Genehmigung und so..