PK
kQB Scripts/PK
M=E Scripts/BaleAttacher.lua--
-- baleAttacher
-- Class Balle-AttachAble Tippers
--
-- @author Geri-G
-- @date 13/07/10
--
-- Copyright (C) Geri-G
-- Edited by Bayn with invaluable help from Face. Thanks again to him.
BaleAttacher = {};
function BaleAttacher.prerequisitesPresent(specializations)
return SpecializationUtil.hasSpecialization(Attachable, specializations);
end;
function BaleAttacher:load(xmlFile)
self.searchBales = BaleAttacher.searchBales;
self.attachobjects = BaleAttacher.attachobjects;
self.detachobjects = BaleAttacher.detachobjects;
self.OrientJoint = BaleAttacher.OrientJoint;
self.setWorkState= SpecializationUtil.callSpecializationsFunction("setWorkState");
self.isBaleInRange = BaleAttacher.isBaleInRange;
self.place = {};
self.place.node1 = Utils.indexToObject(self.components, getXMLString(xmlFile,"vehicle.Baletrailer#castPoint1"));
self.place.node2 = Utils.indexToObject(self.components, getXMLString(xmlFile,"vehicle.Baletrailer#castPoint2"));
self.place.attacherNode = Utils.indexToObject(self.components, Utils.getNoNil(getXMLString(xmlFile,"vehicle.Baletrailer#attacherNode"),"0>"));
self.place.highOffset = Utils.getNoNil(getXMLFloat(xmlFile,"vehicle.Baletrailer#highOffset"),4);
self.Attachedobjects = {};
self.attacherMod = 0;
self.attacherModOld = 0;
self.allowAttachment = true;
self.balesAttached = false;
self.attachBales = false;
end;
function BaleAttacher:readStream(streamId, connection)
self:setWorkState(streamReadBool(streamId), true);
end;
function BaleAttacher:writeStream(streamId, connection)
streamWriteBool(streamId, self.balesAttached);
end;
function BaleAttacher:update(dt)
if self:getIsActiveForInput() then
if InputBinding.hasEvent(InputBinding.IMPLEMENT_EXTRA2) then
self:setWorkState(not self.attachBales);
end;
end;
end;
function BaleAttacher:updateTick(dt)
end;
function BaleAttacher:draw()
if self.balesAttached then
g_currentMission:addHelpButtonText(string.format(g_i18n:getText("DETACH_BALES"), self.typeDesc), InputBinding.IMPLEMENT_EXTRA2);
else
g_currentMission:addHelpButtonText(string.format(g_i18n:getText("ATTACH_BALES"), self.typeDesc), InputBinding.IMPLEMENT_EXTRA2);
end;
end;
function BaleAttacher:isBaleInRange(node1,node2,Yoffset,Bale)
local Xmax, Ymax, Zmax = getWorldTranslation(node1);
Xmax, Ymax, Zmax = worldToLocal(self.place.attacherNode,Xmax, Ymax, Zmax);
local Xmin, Ymin, Zmin = getWorldTranslation(node2);
Xmin, Ymin, Zmin = worldToLocal(self.place.attacherNode,Xmin, Ymin, Zmin);
local Xt, Yt, Zt = getWorldTranslation(Bale);
Xt, Yt, Zt = worldToLocal(self.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)+Yoffset and Yt>= (Ymax+Ymin)/2) then
return true;
else
return false;
end;
end;
function BaleAttacher:searchBales()
for index,item in pairs(g_currentMission.itemsToSave) do
if item.item:isa(Bale) then
if item.item.isAttached == nil then--and (getUserAttribute(item.item.nodeId, "isHaybale") == true or getUserAttribute(item.item.nodeId, "isStrawbale") == true or getUserAttribute(item.item.nodeId, "isRoundbale") == true) then
local isInRange = self:isBaleInRange(self.place.node1,self.place.node2,self.place.highOffset,item.item.nodeId);
local is1stAttached = false;
if isInRange then
is1stAttached = self:attachobjects(item.item.nodeId,item.item);
end;
if is1stAttached then
self.balesAttached = true;
end;
end;
end;
end;
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
local isInRange = self:isBaleInRange(self.place.node1,self.place.node2,self.place.highOffset,components.node);
if isInRange then
is1stAttached = self:attachobjects(components.node);
end;
end;
if is1stAttached then
self.balesAttached = true;
end;
end;
end;
end;
function BaleAttacher:setWorkState(isCoupling,noEventSend)
WorkStateEvent.sendEvent(self, isCoupling, noEventSend);
if isCoupling then
self:detachobjects();
self.attachBales = true;
else
self:searchBales();
self.attachBales = false;
end;
end;
function BaleAttacher:OrientJoint(Source, Target)
local xw, yw, zw = getWorldTranslation(Source);
local x,y,z = worldToLocal(getParent(Target), xw, yw, zw);
setTranslation(Target, x,y,z);
--JointRotation Anpassung an das Objekt
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 BaleAttacher:attachobjects(object,baleT)
local attachedobject = {};
attachedobject.object = object;
if self.isServer then
attachedobject.AT = createTransformGroup("AT");
link(self.place.attacherNode,attachedobject.AT);
attachedobject.objectMass = getMass(object);
setMass(object,attachedobject.objectMass*0.3);
self:OrientJoint(object,attachedobject.AT);
local constr = JointConstructor:new();
constr:setActors(self.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 BaleAttacher:detachobjects()
if self.isServer then
for k,v in pairs(self.Attachedobjects) do
removeJoint(v.JointIndex);
delete(v.AT);
v.JointIndex = nil;
setMass(v.object,v.objectMass);
if v.baleT ~= nil then
v.baleT.isAttached = nil;
end;
end;
end;
self.Attachedobjects = nil;
self.Attachedobjects = {};
self.balesAttached = false;
end;
function BaleAttacher:onAttach(attacherVehicle)
if self.isServer then
self:setWorkState(false);
end;
end;
function BaleAttacher:onDetach()
if self.isServer then
self:setWorkState(true);
end;
end;
function BaleAttacher:onActivate()
--if self.isServer then
--self:setWorkState(false);
--end;
end;
function BaleAttacher:onDeactivate()
--if self.isServer then
--self:setWorkState(true);
--end;
end;
function BaleAttacher:loadFromAttributesAndNodes(xmlFile, key, resetVehicles)
if not resetVehicles then
end;
return BaseMission.VEHICLE_LOAD_OK;
end;
function BaleAttacher:getSaveAttributesAndNodes(nodeIdent)
-- local attributes = ' side="'..tostring(self.currentSide)..'"';
local attributes = nil;
local node = nil;
return attributes, node;
end;
function BaleAttacher:delete()
end;
function BaleAttacher:mouseEvent(posX, posY, isDown, isUp, button)
end;
function BaleAttacher:keyEvent(unicode, sym, modifier, isDown)
end;
PK
d1A*ر( ( Scripts/toggleAnimatedParts.lua_=[[ toggleAnimParts.lua
--------------------------------------------------------------------------------------------------------------------
Author: Sven777b (ICQ#95176001)
Konzept & Betatests : Desperados93
Version 1.0 - 12.04.2010
Version 1.3 - 19.04.2010
Version 1.4 - 30.07.2011
frei verwendbar - keine erlaubnis ntig | free for use - no permission needed.
Modifikationen erst nach Rcksprache! | modifications only with my permission.
Hinweis: das Kopieren von Sourcecode ist strafbar nach UrhG 2.1
--------------------------------------------------------------------------------------------------------------------
Fahrzeug XML:
=================================================================
id : frei vergebener Name - ist gleichzeitig Bezeichner fr l10n Text und InputBinding
showHelp : true/false - Hilfetext anzeigen oder nicht
rotMin/rotMax : rotation auf 3 Achsen
transMin/transMax : bewegung auf 3 Achsen
scaleMin/scaleMax : skalierung auf 3 Achsen - alles kombinierbar
moveTime : Laufzeit in Sekunden in der die Bewegung abgeschlossen wird.
autoReturn : true/false - wenn true, dann kehrt die Animation zurck sobald der Knopf losgelassen wird.
permRotAxis : 1-3 - rotiert das Objekt permanent um die angegebene Achse. moveTime definiert dabei die Zeit fr eine 360 Umdrehung.
listenTo : bergeht das InputBinding und reagiert stattdessen auf die angegebene Variable. So kann man eine Bewegung zum Beispiel ans Licht koppeln
=================================================================
moddesc:
Abschnitt :
Abschnitt :
(fr jedes InputBinding sollte ein passender Text in l10n angelegt werden welcher auch als Hilfetext dient)
Dachfensterroofwindow
(die InputBindings mssen ebenfalls definiert werden)
]]
toggleAnimatedParts = {};
function toggleAnimatedParts.prerequisitesPresent(specializations)
return true;
end;
function toggleAnimatedParts:load(xmlFile)
self.toggle = SpecializationUtil.callSpecializationsFunction("toggle");
self.animParts = {};
local c = 0;
while true do
local baseString = string.format("vehicle.animParts.animPart(%d)#",c);
local index = getXMLString(xmlFile,baseString.."index");
local id = getXMLString(xmlFile,baseString.."id");
local listenTo = getXMLString(xmlFile,baseString.."listenTo");
if index == nil or id == nil or (InputBinding[id] == nil and listenTo == nil) then
break;
end;
local part = {};
part.index = Utils.indexToObject(self.components, index);
part.id = id;
part.listenTo = listenTo;
local rotMin = getXMLString(xmlFile,baseString.."rotMin");
local rotMax = getXMLString(xmlFile,baseString.."rotMax");
if rotMin ~= nil and rotMax ~= nil then
local x,y,z = Utils.getVectorFromString(rotMin);
part.rotMin = {math.rad(Utils.getNoNil(x,0)),math.rad(Utils.getNoNil(y,0)),math.rad(Utils.getNoNil(z,0))};
local x,y,z = Utils.getVectorFromString(rotMax);
part.rotMax = {math.rad(Utils.getNoNil(x,0)),math.rad(Utils.getNoNil(y,0)),math.rad(Utils.getNoNil(z,0))};
end;
local transMin = getXMLString(xmlFile,baseString.."transMin");
local transMax = getXMLString(xmlFile,baseString.."transMax");
if transMin ~= nil and transMax ~= nil then
local x,y,z = Utils.getVectorFromString(transMin);
part.transMin = {Utils.getNoNil(x,0),Utils.getNoNil(y,0),Utils.getNoNil(z,0)};
local x,y,z = Utils.getVectorFromString(transMax);
part.transMax = {Utils.getNoNil(x,0),Utils.getNoNil(y,0),Utils.getNoNil(z,0)};
end;
local scaleMin = getXMLString(xmlFile,baseString.."scaleMin");
local scaleMax = getXMLString(xmlFile,baseString.."scaleMax");
if scaleMin ~= nil and scaleMax ~= nil then
local x,y,z = Utils.getVectorFromString(scaleMin);
part.scaleMin = {Utils.getNoNil(x,1),Utils.getNoNil(y,1),Utils.getNoNil(z,1)};
local x,y,z = Utils.getVectorFromString(scaleMax);
part.scaleMax = {Utils.getNoNil(x,1),Utils.getNoNil(y,1),Utils.getNoNil(z,1)};
end;
local permRotAxis = getXMLInt(xmlFile,baseString.."permRotAxis");
if permRotAxis ~= nil then
if permRotAxis >= 1 and permRotAxis <= 3 then
part.permRotAxis = permRotAxis;
end;
end;
part.moveTime = Utils.getNoNil(getXMLFloat(xmlFile,baseString.."moveTime"),1)*1000;
part.helpText = Utils.getNoNil(getXMLBool(xmlFile, baseString.."showHelp"),false);
part.autoReturn = Utils.getNoNil(getXMLBool(xmlFile, baseString.."autoReturn"),false);
part.toMax = false;
part.move = false;
table.insert(self.animParts,part);
c=c+1;
end;
end;
function toggleAnimatedParts:delete()
end;
function toggleAnimatedParts:mouseEvent(posX, posY, isDown, isUp, button)
end;
function toggleAnimatedParts:keyEvent(unicode, sym, modifier, isDown)
end;
function toggleAnimatedParts:update(dt)
if self:getIsActiveForInput() then
for nr,part in ipairs(self.animParts) do
if not part.autoReturn then
if InputBinding.hasEvent(InputBinding[part.id]) then
self:toggle(nr,not part.toMax);
end;
else
if InputBinding.isPressed(InputBinding[part.id]) then
if not part.toMax then
self:toggle(nr,true);
end;
else
if part.toMax then
self:toggle(nr,false);
end;
end;
end;
end;
end;
if self:getIsActive() then
for _,part in ipairs(self.animParts) do
if part.listenTo ~= nil then
if self[part.listenTo] then
part.toMax = true;
part.move = true;
else
part.toMax = false;
end;
end;
if part.move then
part.move = false;
if part.rotMin ~= nil then
local curRot = {getRotation(part.index)};
local newRot = Utils.getMovedLimitedValues(curRot, part.rotMax, part.rotMin, 3, part.moveTime, dt, not part.toMax);
setRotation(part.index, unpack(newRot));
for i=1,3 do
if math.abs(newRot[i]-curRot[i]) > 0.001 then
part.move = true;
end;
end;
end;
if part.transMin ~= nil then
local curTrans = {getTranslation(part.index)};
local newTrans = Utils.getMovedLimitedValues(curTrans, part.transMax, part.transMin, 3, part.moveTime, dt, not part.toMax);
setTranslation(part.index, unpack(newTrans));
for i=1,3 do
if math.abs(newTrans[i]-curTrans[i]) > 0.001 then
part.move = true;
end;
end;
end;
if part.scaleMin ~= nil then
local curScale = {getScale(part.index)};
local newScale = Utils.getMovedLimitedValues(curScale, part.scaleMax, part.scaleMin, 3, part.moveTime, dt, not part.toMax);
setScale(part.index, unpack(newScale));
for i=1,3 do
if math.abs(newScale[i]-curScale[i]) > 0.001 then
part.move = true;
end;
end;
end;
if part.permRotAxis ~= nil then
local spd = ((2*math.pi) / part.moveTime) * dt;
local newRot = {0,0,0};
newRot[part.permRotAxis] = spd;
rotate(part.index, unpack(newRot));
part.move = part.toMax;
end;
end;
end;
end;
end;
function toggleAnimatedParts:updateTick(dt)
end;
function toggleAnimatedParts:draw()
if self:getIsActiveForInput() then
for _,part in ipairs(self.animParts) do
if part.helpText then
g_currentMission:addHelpButtonText(g_i18n:getText(part.id), InputBinding[part.id]);
end;
end;
end;
end;
function toggleAnimatedParts:toggle(id,state,nes)
toggleAnimEvent.sendEvent(self,id,state,nes);
self.animParts[id].toMax = state;
self.animParts[id].move = true;
end;
function toggleAnimatedParts:readStream(streamId, connection)
for nr,part in ipairs(self.animParts) do
local state = streamReadBool(streamId);
self:toggle(nr,state,true);
end;
end;
function toggleAnimatedParts:writeStream(streamId, connection)
for nr,part in ipairs(self.animParts) do
streamWriteBool(streamId,part.toMax);
end;
end;
toggleAnimEvent = {};
toggleAnimEvent_mt = Class(toggleAnimEvent, Event);
InitEventClass(toggleAnimEvent, "toggleAnimEvent");
function toggleAnimEvent:emptyNew()
local self = Event:new(toggleAnimEvent_mt);
self.className="toggleAnimEvent";
return self;
end;
function toggleAnimEvent:new(object, id, state)
local self = toggleAnimEvent:emptyNew()
self.object = object;
self.id = id;
self.state = state;
return self;
end;
function toggleAnimEvent:readStream(streamId, connection)
self.object = networkGetObject(streamReadInt32(streamId));
self.id = streamReadInt8(streamId);
self.state = streamReadBool(streamId);
self:run(connection);
end;
function toggleAnimEvent:writeStream(streamId, connection)
streamWriteInt32(streamId, networkGetObjectId(self.object));
streamWriteInt8(streamId, self.id);
streamWriteBool(streamId, self.state);
end;
function toggleAnimEvent:run(connection)
self.object:toggle(self.id,self.state, true);
if not connection:getIsServer() then
g_server:broadcastEvent(toggleAnimEvent:new(self.object, self.id, self.state), nil, connection, self.object);
end;
end;
function toggleAnimEvent.sendEvent(vehicle, id, state, nes)
if nes == nil or nes == false then
if g_server ~= nil then
g_server:broadcastEvent(toggleAnimEvent:new(vehicle, id, state), nil, nil, vehicle);
else
g_client:getServerConnection():sendEvent(toggleAnimEvent:new(vehicle, id, state));
end;
end;
end;
PK
=+)6 Scripts/WorkStateEvent.luaWorkStateEvent = {};
WorkStateEvent_mt = Class(WorkStateEvent, Event);
InitEventClass(WorkStateEvent, "WorkStateEvent");
function WorkStateEvent:emptyNew()
local self = Event:new(WorkStateEvent_mt);
self.className="WorkStateEvent";
return self;
end;
function WorkStateEvent:new(vehicle, isCoupled)
local self = WorkStateEvent:emptyNew()
self.vehicle = vehicle;
self.isCoupled = isCoupled;
return self;
end;
function WorkStateEvent:readStream(streamId, connection)
local id = streamReadInt32(streamId);
self.isCoupled = streamReadBool(streamId);
self.vehicle = networkGetObject(id);
self:run(connection);
end;
function WorkStateEvent:writeStream(streamId, connection)
streamWriteInt32(streamId, networkGetObjectId(self.vehicle));
streamWriteBool(streamId, self.isCoupled);
end;
function WorkStateEvent:run(connection)
self.vehicle:setWorkState(self.isCoupled, true);
if not connection:getIsServer() then
g_server:broadcastEvent(WorkStateEvent:new(self.vehicle, self.isCoupled), nil, connection, self.vehicle);
end;
end;
function WorkStateEvent.sendEvent(vehicle, isCoupled, noEventSend)
if noEventSend == nil or noEventSend == false then
if g_server ~= nil then
g_server:broadcastEvent(WorkStateEvent:new(vehicle, isCoupled), nil, nil, vehicle);
else
g_client:getServerConnection():sendEvent(WorkStateEvent:new(vehicle, isCoupled));
end;
end;
end;PK
&|dE tex/PK
BFRBDط<8
8
tex/ao.ddsDDS |
DXT1 @ A@@@@ A APTTT AUUU ATUUU A A@@@@ A ATTTT A A@@@@ A ATTTT A A@@@@ A ATTTT A A@@@@ A ATTTT A A@@@@ A ATTTT A A@@@@ A ATTTT A A@@@@Aq ^lkAUUUX A ATTTT A A@@@@A xA
/%%RxxAe1- A ATTTT A A@@@@AŮ{xxA /A qAjbbb'A=55Aů
A ATTTT A A@@@@Aţ@k\|A$)-%AʼnRxhR!7A9 A ATTTT A A@@@@A@@@/~zxpìa-=AŊ BŊRhx GGXXXXAE A ATTTT A A@@@@AD@ l%%%%)Jb=_AŪR+--BAhxxx Oώ/--A A ATTTT A A@@@@A# \AŖxX9zxxxiRa_/IJex^^!篪(k5Amk
--A AB A ATTTT A A@@@@APX\
뒔~VW5%%ZxR\\^! 1Q1-Tk%%AJA# A ATTTT A A@@@@AZX\X0~9Q-UaWUE)Q19-
Z~xQR%-
A A' Ac `AŢ WAUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU`Aa `A AAAG `AUUUAUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AŢ Ab bA A ^AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU DAUUUpA ^AB A xAUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AŢ AŁ `A ABAUUU%AŢ WAUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AŢ A A AAB `AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AŢ Ab bA AŢ xAUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU AUUU $AUUU A WGAUUUAA A ATTTT A A@@@@A(hh
cx|֎saUUB^\!֨ QE)e1
---ֵx 0_~TRWӜ>7AŊ (AH``WW# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU"/%5ABJ```$)+-A"Aŵ555\\^# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UUq/%%5AFBbbbb$!*?F||~#U # UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UUD UUAzxpp¬$!|\\AŃ9 AFxxx$ UU# UU# UU# UU# UU# UU# UU# UU# UUb/555AbJ@@̜!
A#Aŵ%%%VV# UU# UU# UU# UU# UU# UU# UU# UUh*755^^\\B{$!(A"AŅ``D UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU/%%% 9``cD!*=Apxx# UU# UU# UU# UU# UU# UU# UU# UU# UU# UU#U # UU# UU# UUD UUF_GU i~^˺(AF A _Ai UAF A ATTTT A A@@@@A(BxXa/{}Mka^ QQ!>!---- UUUUx u 9~^xh1Ah
A5-F| k55BÂ?AK
A&```\^WU %B [bŬ!7776Aŋ f|||| E::::AppppE)\\||AA Afxxxx% %5555RA!-
#ATTTTPA%%%% 5555#\\\\#J':5555BATTTTAť```` J%%%%AB````e)5555Axxxx *f~*ȆU I_ ɹU fL^zʹ͜_u+AAe
A ATTTT A A@@@@ŬAUUAXIJ- Zpcb_ !Q!> ----
`
,kh`
c /A9A!`bbz 5UAG A
AA AŅ```x ?AœbbΜ!A4 f E::::AppppcE)\\\\AJ Aņxxxx% %5555ZA!XXXX#ATTTTPA%%%% 5555A\\\\#JE)BATTTTA```` ````AdJ````䋆15555Axxxx
+UUUlz蠀_~Us^As A
A ATTTT A A@@@@A'@@@q ??z xx~_$)ܽ,cU낆1^\QE)}9-
j`xzZ+--Q``@ZW~|xes/AeR-fxxx\ zzz'A^\|x A A9
AA %`xx\ ڋAV^|x!AZ f E::::AppppcE)\\\\AJ Aņxxxx% %5555ZA!XXXX#ATTTTPA%%%% 5555A\\\\#JE)BATTTTA```` ````AdJ````䋆15555Axxxx %/FB^AŤ9Ao - A ATTTT A A@@@@AZhxq=5$)zW(BֵU%Z}몀0W^^X E) ժRa:ߟA{vG)