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 | |
3 | MowerAreaEvent = {}; |
4 | MowerAreaEvent_mt = Class(MowerAreaEvent, Event); |
5 | |
6 | InitStaticEventClass(MowerAreaEvent, "MowerAreaEvent", EventIds.EVENT_MOWER_AREA); |
7 | |
8 | function MowerAreaEvent:emptyNew() |
9 | local self = Event:new(MowerAreaEvent_mt); |
10 | return self; |
11 | end; |
12 | |
13 | function 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; |
24 | end; |
25 | |
26 | function 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 |
60 | end; |
61 | |
62 | function 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 |
92 | end; |
93 | |
94 | function MowerAreaEvent:run(connection) |
95 | print("Error: Do not run MowerAreaEvent locally"); |
96 | end; |
97 | |
98 | function 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; |
172 | end;
|
Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de