Sprache Deutsch Language English

Script Dokumentation LS 2015 - MowerAreaEvent (Patch 1.3)

Script Dokumentation Übersicht

scripts/vehicles/specializations/MowerAreaEvent.lua

Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de
1-- Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved.
2
3MowerAreaEvent = {};
4MowerAreaEvent_mt = Class(MowerAreaEvent, Event);
5
6InitStaticEventClass(MowerAreaEvent, "MowerAreaEvent", EventIds.EVENT_MOWER_AREA);
7
8function MowerAreaEvent:emptyNew()
9 local self = Event:new(MowerAreaEvent_mt);
10 return self;
11end;
12
13function MowerAreaEvent:new(areas, numAreas, dropAreas, numDropAreas, numDropAreasUsed)
14 local self = MowerAreaEvent:emptyNew()
15 self.areas = areas;
16 self.numAreas = numAreas;
17 self.dropAreas = dropAreas;
18 self.numDropAreas = numDropAreas;
19 self.numDropAreasUsed = numDropAreasUsed;
20 assert(numAreas <= 7 and numAreas >= 0);
21 assert(numDropAreasUsed <= 7 and numDropAreasUsed >= 0);
22 assert(numAreas > 0 or numDropAreasUsed > 0);
23 return self;
24end;
25
26function MowerAreaEvent:readStream(streamId, connection)
27 local numAreas = streamReadUIntN(streamId, 3);
28 local numDropAreas = streamReadUIntN(streamId, 3);
29
30 local params = g_currentMission.areaCompressionParams;
31 local paramsRelative = g_currentMission.areaRelativeCompressionParams;
32 for i=1, numAreas do
33 local x = Utils.readCompressedWorldPosition(streamId, params);
34 local z = Utils.readCompressedWorldPosition(streamId, params);
35 local x1 = x + Utils.readCompressedWorldPosition(streamId, paramsRelative);
36 local z1 = z + Utils.readCompressedWorldPosition(streamId, paramsRelative);
37 local x2 = x + Utils.readCompressedWorldPosition(streamId, paramsRelative);
38 local z2 = z + Utils.readCompressedWorldPosition(streamId, paramsRelative);
39 if streamReadBool(streamId) then
40 Utils.updateMeadowArea(x, z, x1, z1, x2, z2, true);
41 else
42 Utils.updateMeadowArea(x, z, x1, z1, x2, z2, false);
43 end
44 end
45 for i=1, numDropAreas do
46 local dx = Utils.readCompressedWorldPosition(streamId, params);
47 local dz = Utils.readCompressedWorldPosition(streamId, params);
48 local dx1 = dx + Utils.readCompressedWorldPosition(streamId, paramsRelative);
49 local dz1 = dz + Utils.readCompressedWorldPosition(streamId, paramsRelative);
50 local dx2 = dx + Utils.readCompressedWorldPosition(streamId, paramsRelative);
51 local dz2 = dz + Utils.readCompressedWorldPosition(streamId, paramsRelative);
52 local v = streamReadUIntN(streamId, g_currentMission.numWindrowChannels);
53
54 -- switch all dry grass to grass, and then destroy everything that is not grass
55 Utils.switchFruitTypeArea(FruitUtil.FRUITTYPE_GRASS, FruitUtil.FRUITTYPE_DRYGRASS, dx, dz, dx1, dz1, dx2, dz2);
56 Utils.destroyOtherFruit(FruitUtil.FRUITTYPE_GRASS, dx, dz, dx1, dz1, dx2, dz2);
57
58 Utils.updateFruitWindrowArea(FruitUtil.FRUITTYPE_GRASS, dx, dz, dx1, dz1, dx2, dz2, v, true, false);
59 end
60end;
61
62function MowerAreaEvent:writeStream(streamId, connection)
63 streamWriteUIntN(streamId, self.numAreas, 3);
64 streamWriteUIntN(streamId, self.numDropAreasUsed, 3);
65
66 local params = g_currentMission.areaCompressionParams;
67 local paramsRelative = g_currentMission.areaRelativeCompressionParams;
68 for i=1, self.numAreas do
69 local area = self.areas[i];
70 Utils.writeCompressedWorldPosition(streamId, area.x, params);
71 Utils.writeCompressedWorldPosition(streamId, area.z, params);
72 Utils.writeCompressedWorldPosition(streamId, area.x1 - area.x, paramsRelative);
73 Utils.writeCompressedWorldPosition(streamId, area.z1 - area.z, paramsRelative);
74 Utils.writeCompressedWorldPosition(streamId, area.x2 - area.x, paramsRelative);
75 Utils.writeCompressedWorldPosition(streamId, area.z2 - area.z, paramsRelative);
76 streamWriteBool(streamId, (area.dropArea == nil and area.dropWindrow))
77 end
78 if self.numDropAreasUsed > 0 then
79 for i=1, self.numDropAreas do
80 local area = self.dropAreas[i];
81 if area.value >= 1 then
82 Utils.writeCompressedWorldPosition(streamId, area.x, params);
83 Utils.writeCompressedWorldPosition(streamId, area.z, params);
84 Utils.writeCompressedWorldPosition(streamId, area.x1 - area.x, paramsRelative);
85 Utils.writeCompressedWorldPosition(streamId, area.z1 - area.z, paramsRelative);
86 Utils.writeCompressedWorldPosition(streamId, area.x2 - area.x, paramsRelative);
87 Utils.writeCompressedWorldPosition(streamId, area.z2 - area.z, paramsRelative);
88 streamWriteUIntN(streamId, area.value, g_currentMission.numWindrowChannels);
89 end
90 end
91 end
92end;
93
94function MowerAreaEvent:run(connection)
95 print("Error: Do not run MowerAreaEvent locally");
96end;
97
98function MowerAreaEvent.runLocally(areas, numAreas, dropAreas, numDropAreas)
99
100 local params = g_currentMission.areaCompressionParams;
101 local paramsRelative = g_currentMission.areaRelativeCompressionParams;
102
103 local pickedUpWindrow = 0;
104 local numAreasUsed = 0;
105 local numDropAreasUsed = 0;
106 for i=1, numAreas do
107 local area = areas[i];
108
109 local x = Utils.simWriteCompressedWorldPosition(area.x, params);
110 local z = Utils.simWriteCompressedWorldPosition(area.z, params);
111 local x1 = x + Utils.simWriteCompressedWorldPosition(area.x1 - area.x, paramsRelative);
112 local z1 = z + Utils.simWriteCompressedWorldPosition(area.z1 - area.z, paramsRelative);
113 local x2 = x + Utils.simWriteCompressedWorldPosition(area.x2 - area.x, paramsRelative);
114 local z2 = z + Utils.simWriteCompressedWorldPosition(area.z2 - area.z, paramsRelative);
115
116 local areaChanged = 0;
117 if area.dropArea ~= nil then
118 areaChanged = Utils.updateMeadowArea(x, z, x1, z1, x2, z2, false);
119 dropAreas[area.dropArea].valueAccum = dropAreas[area.dropArea].valueAccum + areaChanged;
120 else
121 areaChanged = Utils.updateMeadowArea(x, z, x1, z1, x2, z2, area.dropWindrow);
122 if not area.dropWindrow then
123 pickedUpWindrow = pickedUpWindrow + areaChanged;
124 end
125 end
126
127 if areaChanged > 0 then
128 numAreasUsed = numAreasUsed + 1;
129 if numAreasUsed ~= i then
130 -- swap the areas so that we have all used areas at the beginning
131 areas[numAreasUsed], areas[i] = areas[i], areas[numAreasUsed];
132 end
133 end
134 end
135
136 for i=1, numDropAreas do
137 local area = dropAreas[i];
138
139 local dx = Utils.simWriteCompressedWorldPosition(area.x, params);
140 local dz = Utils.simWriteCompressedWorldPosition(area.z, params);
141 local dx1 = dx + Utils.simWriteCompressedWorldPosition(area.x1 - area.x, paramsRelative);
142 local dz1 = dz + Utils.simWriteCompressedWorldPosition(area.z1 - area.z, paramsRelative);
143 local dx2 = dx + Utils.simWriteCompressedWorldPosition(area.x2 - area.x, paramsRelative);
144 local dz2 = dz + Utils.simWriteCompressedWorldPosition(area.z2 - area.z, paramsRelative);
145
146 local old, total = Utils.getFruitWindrowArea(FruitUtil.FRUITTYPE_GRASS, dx, dz, dx1, dz1, dx2, dz2);
147 old = old + Utils.getFruitWindrowArea(FruitUtil.FRUITTYPE_DRYGRASS, dx, dz, dx1, dz1, dx2, dz2)
148
149 local value = (area.valueAccum+old) / total;
150 -- round to the lower value, so the error we make is always positive as we place not enough windrows
151 value = math.floor(value+0.001);
152
153 if value >= 1 then
154 value = math.min(value, g_currentMission.maxWindrowValue);
155
156 -- calculate the error we make by the rounding and clamping, so we can add it the next time
157 area.valueAccum = math.min(math.max(area.valueAccum+old - value*total, 0), 2*g_currentMission.maxWindrowValue);
158 area.value = value;
159
160 -- switch all dry grass to grass, and then destroy everything that is not grass
161 Utils.switchFruitTypeArea(FruitUtil.FRUITTYPE_GRASS, FruitUtil.FRUITTYPE_DRYGRASS, dx, dz, dx1, dz1, dx2, dz2);
162 Utils.destroyOtherFruit(FruitUtil.FRUITTYPE_GRASS, dx, dz, dx1, dz1, dx2, dz2);
163
164 Utils.updateFruitWindrowArea(FruitUtil.FRUITTYPE_GRASS, dx, dz, dx1, dz1, dx2, dz2, value, true, false);
165
166 numDropAreasUsed = numDropAreasUsed+1
167 else
168 area.value = 0;
169 end
170 end
171 return numAreasUsed, numDropAreasUsed, pickedUpWindrow;
172end;
Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de
Script Dokumentation Übersicht