LUADOC - Farming Simulator 17

Printable Version

Script v1.4.4.0

Engine v7.0.0.2

Foundation Reference

Ropes

Description
Specialization for vehicles with animated ropes
Functions

prerequisitesPresent

Description
Checks if all prerequisite specializations are loaded
Definition
prerequisitesPresent(table specializations)
Arguments
tablespecializationsspecializations
Return Values
booleanhasPrerequisitetrue if all prerequisite specializations are loaded
Code
17function Ropes.prerequisitesPresent(specializations)
18 return true;
19end;

load

Description
Called on loading
Definition
load(table savegame)
Arguments
tablesavegamesavegame
Code
24function Ropes:load(savegame)
25 self.ropes = {};
26 local i=0;
27 while true do
28 local key = string.format("vehicle.ropes.rope(%d)", i);
29 if not hasXMLProperty(self.xmlFile, key) then
30 break;
31 end
32 local entry = {};
33 entry.baseNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key .. "#baseNode"));
34 entry.targetNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key .. "#targetNode"));
35 entry.baseParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#baseParameters", 4));
36 entry.targetParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#targetParameters", 4));
37 setShaderParameter(entry.baseNode, "cv0", entry.baseParameters[1],entry.baseParameters[2],entry.baseParameters[3],entry.baseParameters[4], false);
38 setShaderParameter(entry.baseNode, "cv1", 0,0,0,0, false);
39 local x,y,z = localToLocal(entry.targetNode, entry.baseNode, entry.targetParameters[1], entry.targetParameters[2], entry.targetParameters[3]);
40 setShaderParameter(entry.baseNode, "cv3", x,y,z,0, false);
41
42 -- <baseParameterAdjuster index="0>10|0|0|0|0|0|0" rotationAxis="1" rotationRange="-120 120" minTargetParameters="10 0 0 0" maxTargetParameters="-10 0 0 0" />
43 entry.baseParameterAdjusters = {};
44 local j=0;
45 while true do
46 local key = string.format("%s.baseParameterAdjuster(%d)", key, j);
47 if not hasXMLProperty(self.xmlFile, key) then
48 break;
49 end
50 local adjuster = { };
51 adjuster.node = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key .. "#index"));
52
53 adjuster.rotationAxis = getXMLInt(self.xmlFile, key .. "#rotationAxis");
54 adjuster.rotationRange = Utils.getRadiansFromString(getXMLString(self.xmlFile, key .. "#rotationRange"), 2);
55
56 adjuster.translationAxis = getXMLInt(self.xmlFile, key .. "#translationAxis");
57 adjuster.translationRange = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#translationRange"), 2);
58
59 adjuster.minTargetParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#minTargetParameters"), 4);
60 adjuster.maxTargetParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#maxTargetParameters"), 4);
61
62 table.insert(entry.baseParameterAdjusters, adjuster);
63 j=j+1;
64 end
65
66 entry.targetParameterAdjusters = {};
67 local j=0;
68 while true do
69 local key = string.format("%s.targetParameterAdjuster(%d)", key, j);
70 if not hasXMLProperty(self.xmlFile, key) then
71 break;
72 end
73 local adjuster = { };
74 adjuster.node = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key .. "#index"));
75
76 adjuster.rotationAxis = getXMLInt(self.xmlFile, key .. "#rotationAxis");
77 adjuster.rotationRange = Utils.getRadiansFromString(getXMLString(self.xmlFile, key .. "#rotationRange"), 2);
78
79 adjuster.translationAxis = getXMLInt(self.xmlFile, key .. "#translationAxis");
80 adjuster.translationRange = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#translationRange"), 2);
81
82 adjuster.minTargetParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#minTargetParameters"), 4);
83 adjuster.maxTargetParameters = Utils.getVectorNFromString(getXMLString(self.xmlFile, key .. "#maxTargetParameters"), 4);
84
85 table.insert(entry.targetParameterAdjusters, adjuster);
86 j=j+1;
87 end
88
89 table.insert(self.ropes, entry);
90 i=i+1;
91 end
92
93 self.isActiveRopeTimeOffset = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ropes#isActiveDirtyTimeOffset"), 2) * 1000;
94 self.isActiveRopeTime = g_currentMission.time + self.isActiveRopeTimeOffset;
95end;

update

Description
Called on update
Definition
update(float dt)
Arguments
floatdttime since last call in ms
Code
115function Ropes:update(dt)
116 if self.isClient and self:getIsActive() then
117 self.isActiveRopeTime = g_currentMission.time + self.isActiveRopeTimeOffset;
118 end
119 if self.isActiveRopeTime >= g_currentMission.time then
120 for _,rope in pairs(self.ropes) do
121 --
122 local parameters = {0, 0, 0};
123 if #rope.baseParameterAdjusters > 0 then
124 for _,adjuster in pairs(rope.baseParameterAdjusters) do
125
126 if adjuster.rotationAxis ~= nil then
127 local rotations = { getRotation(adjuster.node) };
128 local rot = rotations[adjuster.rotationAxis];
129 local alpha = math.max(0, math.min(1, (rot - adjuster.rotationRange[1]) / (adjuster.rotationRange[2] - adjuster.rotationRange[1]) ));
130 local x,y,z = Utils.vector3ArrayLerp(adjuster.minTargetParameters, adjuster.maxTargetParameters, alpha);
131 parameters[1] = parameters[1] + x;
132 parameters[2] = parameters[2] + y;
133 parameters[3] = parameters[3] + z;
134 elseif adjuster.translationAxis ~= nil then
135 local translations = { getRotation(adjuster.node) };
136 local trans = translations[adjuster.translationAxis];
137 local alpha = math.max(0, math.min(1, (trans - adjuster.translationRange[1]) / (adjuster.translationRange[2] - adjuster.translationRange[1]) ));
138 local x,y,z = Utils.vector3ArrayLerp(adjuster.minTargetParameters, adjuster.maxTargetParameters, alpha);
139 parameters[1] = parameters[1] + x;
140 parameters[2] = parameters[2] + y;
141 parameters[3] = parameters[3] + z;
142 end
143
144 end
145 end
146 setShaderParameter(rope.baseNode, "cv0", rope.baseParameters[1]+parameters[1], rope.baseParameters[2]+parameters[2], rope.baseParameters[3]+parameters[3], 0, false);
147
148 --
149 local x,y,z = localToLocal(rope.targetNode, rope.baseNode, 0,0,0);
150 setShaderParameter(rope.baseNode, "cv2", x,y,z,0, false);
151
152 --
153 local parameters = {0, 0, 0};
154 if #rope.targetParameterAdjusters > 0 then
155 for _,adjuster in pairs(rope.targetParameterAdjusters) do
156
157 if adjuster.rotationAxis ~= nil then
158 local rotations = { getRotation(adjuster.node) };
159 local rot = rotations[adjuster.rotationAxis];
160 local alpha = math.max(0, math.min(1, (rot - adjuster.rotationRange[1]) / (adjuster.rotationRange[2] - adjuster.rotationRange[1]) ));
161 local x,y,z = Utils.vector3ArrayLerp(adjuster.minTargetParameters, adjuster.maxTargetParameters, alpha);
162 parameters[1] = parameters[1] + x;
163 parameters[2] = parameters[2] + y;
164 parameters[3] = parameters[3] + z;
165 elseif adjuster.translationAxis ~= nil then
166 local translations = { getRotation(adjuster.node) };
167 local trans = translations[adjuster.translationAxis];
168 local alpha = math.max(0, math.min(1, (trans - adjuster.translationRange[1]) / (adjuster.translationRange[2] - adjuster.translationRange[1]) ));
169 local x,y,z = Utils.vector3ArrayLerp(adjuster.minTargetParameters, adjuster.maxTargetParameters, alpha);
170 parameters[1] = parameters[1] + x;
171 parameters[2] = parameters[2] + y;
172 parameters[3] = parameters[3] + z;
173 end
174
175 end
176 end
177 local x,y,z = localToLocal(rope.targetNode, rope.baseNode, rope.targetParameters[1]+parameters[1], rope.targetParameters[2]+parameters[2], rope.targetParameters[3]+parameters[3]);
178 setShaderParameter(rope.baseNode, "cv3", x,y,z,0, false);
179 end
180 end
181end;