objekt attacher in jeden mod einbauen

  • Hy leute ich wollte mal fragen ob und wie man den objekt attacher einbauen kann.

    Muss man da viel beachten auser die xml und moddesc diese sachen einzufügen?

    moddesc:

    Spoiler anzeigen

    <text name="Lock"> <en>Lock load</en> <de>Last sperren</de> </text>
    <text name="Unlock"> <en>Unlock load</en> <de>Last entsperren</de> </text>
    <specialization name="objectAttacher" className="objectAttacher" filename="objectAttacher.lua"/>
    <specialization name="dynamicMountAttacher" />
    <specialization name="attachable" />
    <specialization name="objectAttacher" />

    xml:

    Spoiler anzeigen

    baleCastPoints allowVehicleAttachment="true" >
    <baleCastPoint frontRight="0>28|0" backLeft="0>28|2" attacherNode="1>" highOffset="2" />
    <baleCastPoint frontRight="0>28|1" backLeft="0>28|3" attacherNode="1>" highOffset="2" />
    </baleCastPoints>
    <dynamicMountAttacherTrigger triggerNode="0>24" rootNode="0>" jointNode="0>" />


    und hier mal die lua:

    Spoiler anzeigen

    --- objectAttacher
    -- Specialization for attaching objects on a trailer
    --
    -- @author Geri-G
    --
    -- edited by PeterJ FS-UK modteam
    -- 16/11/2012
    --

    objectAttacher = {};

    function objectAttacher.prerequisitesPresent(specializations)
    return SpecializationUtil.hasSpecialization(Attachable, specializations) and SpecializationUtil.hasSpecialization(DynamicMountAttacher, specializations);
    end;

    function objectAttacher:load(xmlFile)

    self.setIsBaleAttached = SpecializationUtil.callSpecializationsFunction("setIsBaleAttached");
    self.searchObjects = objectAttacher.searchObjects;
    self.attachobjects = objectAttacher.attachobjects;
    self.detachobjects = objectAttacher.detachobjects;
    self.OrientJoint = objectAttacher.OrientJoint;
    self.isObjectInRange = objectAttacher.isObjectInRange;
    self.place = {};
    local i=0;
    while true do
    local basename = string.format("vehicle.baleCastPoints.baleCastPoint(%d)",i);
    local place = {};
    place.node1 = Utils.indexToObject(self.components, getXMLString(xmlFile,basename.."#frontRight"));

    if place.node1 == nil then
    break;
    end;
    place.node2 = Utils.indexToObject(self.components, getXMLString(xmlFile,basename.."#backLeft"));
    place.attacherNode = Utils.indexToObject(self.components, Utils.getNoNil(getXMLString(xmlFile,basename.."#attacherNode"),"0>"));
    place.highOffset = Utils.getNoNil(getXMLFloat(xmlFile,basename.."#highOffset"),4);
    table.insert(self.place,place);
    i=i+1;
    end;
    self.allowVehicleAttachment = getXMLBool(xmlFile,"vehicle.baleCastPoints#allowVehicleAttachment");
    self.Attachedobjects = {};
    self.objectsAttached = false;
    self.isBaleAttach = false;
    end;

    function objectAttacher:delete()
    end;

    function objectAttacher:readStream(streamId, connection)
    local baleAttach = streamReadBool(streamId);
    self:setIsBaleAttached(baleAttach, true);
    end;

    function objectAttacher:writeStream(streamId, connection)
    streamWriteBool(streamId, self.isBaleAttach);
    end;

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

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

    function objectAttacher:update(dt)
    if self:getIsActiveForInput() then
    if InputBinding.hasEvent(InputBinding.IMPLEMENT_EXTRA3) then
    self:setIsBaleAttached(not self.isBaleAttach);
    end;
    end;
    end;

    function objectAttacher:updateTick(dt)
    end;

    function objectAttacher:draw()
    if self:getIsActive() then

    if not self.isBaleAttach then
    g_currentMission:addHelpButtonText(g_i18n:getText("Unlock"), InputBinding.IMPLEMENT_EXTRA3);
    else
    g_currentMission:addHelpButtonText(g_i18n:getText("Lock"), InputBinding.IMPLEMENT_EXTRA3);
    end;

    end;
    end;

    function objectAttacher:isObjectInRange(place,object)
    local Xmax, Ymax, Zmax = getWorldTranslation(place.node1);
    Xmax, Ymax, Zmax = worldToLocal(place.attacherNode,Xmax, Ymax, Zmax);

    local Xmin, Ymin, Zmin = getWorldTranslation(place.node2);
    Xmin, Ymin, Zmin = worldToLocal(place.attacherNode,Xmin, Ymin, Zmin);

    local Xt, Yt, Zt = getWorldTranslation(object);
    Xt, Yt, Zt = worldToLocal(place.attacherNode,Xt, Yt, Zt);

    if (Xt < math.max(Xmax,Xmin) and Xt > math.min(Xmax,Xmin)) and (Zt < math.max(Zmax,Zmin) and Zt > math.min(Zmax,Zmin)) and (Yt<= ((Ymax+Ymin)/2)+place.highOffset and Yt>= (Ymax+Ymin)/2) then
    return true;
    else
    return false;
    end;
    end;

    function objectAttacher:searchObjects()
    for index,item in pairs(g_currentMission.itemsToSave) do
    if item.item:isa(Bale) then
    if item.item.isAttached == nil then
    for k,v in pairs(self.place) do
    local isInRange = self:isObjectInRange(v,item.item.nodeId);
    local is1stAttached = false;
    if isInRange then
    is1stAttached = self:attachobjects(v,item.item.nodeId,item.item);
    end;
    if is1stAttached then
    self.objectsAttached = true;
    end;
    end;
    end;
    end;
    end;
    if self.allowVehicleAttachment == true then
    for k,v in pairs(g_currentMission.vehicles) do
    if v ~= self and v ~= self.attacherVehicle then
    local is1stAttached = false;
    for index,components in pairs(v.components) do
    for k1,v1 in pairs(self.place) do
    local isInRange = self:isObjectInRange(v1,components.node);
    if isInRange then
    is1stAttached = self:attachobjects(v1,components.node);
    end;
    end;
    end;
    if is1stAttached then
    self.objectsAttached = true;
    end;
    end;
    end;
    end;
    end;

    function objectAttacher:setIsBaleAttached(baleAttach, noEventSend)
    SetBaleAttachEvent.sendEvent(self, baleAttach, noEventSend)
    self.isBaleAttach = baleAttach;

    if baleAttach then
    self:detachobjects();
    else
    self:searchObjects();
    end;
    end;

    function objectAttacher:OrientJoint(Source, Target)
    local xw, yw, zw = getWorldTranslation(Source);
    local x,y,z = worldToLocal(getParent(Target), xw, yw, zw);
    setTranslation(Target, x,y,z);

    local zX, zY, zZ = localDirectionToWorld(Source, 0,0,1);
    local zX, zY, zZ = worldDirectionToLocal(getParent(Target), zX, zY, zZ);
    local yX, yY, yZ = localDirectionToWorld(Source, 0,1,0);
    local yX, yY, yZ = worldDirectionToLocal(getParent(Target), yX, yY, yZ);
    setDirection(Target, zX, zY, zZ, yX, yY, yZ);
    return false;
    end;

    function objectAttacher:attachobjects(place,object,baleT)
    local attachedobject = {};
    attachedobject.object = object;
    if self.isServer then
    attachedobject.AT = createTransformGroup("AT");
    link(place.attacherNode,attachedobject.AT);

    self:OrientJoint(object,attachedobject.AT);

    local constr = JointConstructor:new();
    constr:setActors(place.attacherNode, object);
    constr:setJointTransforms(attachedobject.AT, object);
    for i=1, 3 do
    constr:setTranslationLimit(i-1, true, 0, 0);
    constr:setRotationLimit(i-1,0,0);
    end;
    attachedobject.JointIndex = constr:finalize();

    if baleT ~= nil then
    attachedobject.baleT = baleT;
    baleT.isAttached = true;
    end;
    end;

    table.insert(self.Attachedobjects, attachedobject);
    return true;
    end;

    function objectAttacher:detachobjects()
    if self.isServer then
    for k,v in pairs(self.Attachedobjects) do
    removeJoint(v.JointIndex);
    delete(v.AT);
    v.JointIndex = nil;
    if v.baleT ~= nil then
    v.baleT.isAttached = nil;
    end;
    end;
    end;

    self.Attachedobjects = nil;
    self.Attachedobjects = {};
    self.objectsAttached = false;
    end;

    function objectAttacher:onAttach(attacherVehicle)
    if self.isServer then
    self:setIsBaleAttached(false);
    end;
    end;

    function objectAttacher:onDetach()
    if self.isServer then
    self:setIsBaleAttached(true);
    end;
    end;


    SetBaleAttachEvent = {};
    SetBaleAttachEvent_mt = Class(SetBaleAttachEvent, Event);

    InitEventClass(SetBaleAttachEvent, "SetBaleAttachEvent");

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

    function SetBaleAttachEvent:new(object, baleAttach)
    local self = SetBaleAttachEvent:emptyNew()
    self.object = object;
    self.baleAttach = baleAttach;
    return self;
    end;

    function SetBaleAttachEvent:readStream(streamId, connection)
    local id = streamReadInt32(streamId);
    self.baleAttach = streamReadBool(streamId);
    self.object = networkGetObject(id);
    self:run(connection);
    end;

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

    function SetBaleAttachEvent:run(connection)
    if not connection:getIsServer() then
    g_server:broadcastEvent(self, false, connection, self.object);
    end;
    self.object:setIsBaleAttached(self.baleAttach, true);
    end;

    function SetBaleAttachEvent.sendEvent(vehicle, baleAttach, noEventSend)
    if baleAttach ~= vehicle.isBaleAttach then
    if noEventSend == nil or noEventSend == false then
    if g_server ~= nil then
    g_server:broadcastEvent(SetBaleAttachEvent:new(vehicle, baleAttach), nil, nil, vehicle);
    else
    g_client:getServerConnection():sendEvent(SetBaleAttachEvent:new(vehicle, baleAttach));
    end;
    end;
    end;

    end;

    würde mich freuen wenn mir jemand sagen kann ob ich da was beim einbaue beachten muss so das ich es in jeden model einfügen kann.

  • Crouwler 26. April 2020 um 02:14

    Hat das Thema geschlossen.