meta data for this page
Vehicles/VehicleScripts/NetworkEvents/SnowSystemEvents.lua
This file contains all event that are relevant for the snow system, in particular those parts used in SnowBlade, SnowCannon, SnowDisplacement and SnowGroomer.
Note that all of these events are server→client only, i.e. only the server is authorized to trigger changes in the snow system for each client.
27 28 EventGroomTriangle = EventGroomTriangle or ExtensionOf(BaseEvent); 29 30 InitVanillaEvent(EventGroomTriangle, "EventGroomTriangle"); 31 32 function Utils.getMapBounds() 33 local sizeXZ, sizeY, offsetXZ = GameControl.getTerrainSizeAndOffset(); 34 local minXZ, maxXZ = offsetXZ, offsetXZ+sizeXZ; 35 local minY, maxY = 0, sizeY + 15; 36 37 return minXZ, maxXZ, minY, maxY; 38 end; 39 40 function EventGroomTriangle:sendData(quality, smoothRadius, angle, pos1, pos2, pos3) 41 assert(g_isServer, "Server->Client only event"); 42 43 local minXZ, maxXZ, minY, maxY = Utils.getMapBounds(); 44 45 streamBeginWriteBitwise(); 46 Utils.streamWriteFloatN(quality, 8, 0, 1); 47 Utils.streamWriteFloatN(smoothRadius, 8, 0, 2); 48 Utils.streamWriteFloatN(angle, 8, 0, 360); 49 Vector3.writeToStreamN(pos1, 16, minXZ, maxXZ, minY, maxY); 50 Vector3.writeToStreamN(pos2, 16, minXZ, maxXZ, minY, maxY); 51 Vector3.writeToStreamN(pos3, 16, minXZ, maxXZ, minY, maxY); 52 streamEndWriteBitwise(); 53 end; 54 55 function EventGroomTriangle:receiveData(connection) 56 assert(g_isClient, "Server->Client only event"); 57 58 local minXZ, maxXZ, minY, maxY = Utils.getMapBounds(); 59 60 streamBeginReadBitwise(); 61 local quality = Utils.streamReadFloatN(8, 0, 1); 62 local smoothRadius = Utils.streamReadFloatN(8, 0, 2); 63 local angle = Utils.streamReadFloatN(8, 0, 360); 64 local pos1 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 65 local pos2 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 66 local pos3 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 67 streamEndReadBitwise(); 68 69 SnowSystem.groomTriangleByPosition(pos1, pos2, pos3, angle, smoothRadius, quality); 70 end; 71 72 EventPlowSnow = EventPlowSnow or ExtensionOf(BaseEvent); 73 74 InitVanillaEvent(EventPlowSnow, "EventPlowSnow"); 75 76 function EventPlowSnow:sendData(entity, lossValue, pos1, pos2, pos3, pos4, pos5, pos6, driveDirection, isGoingForward, isGoingBackward) 77 assert(g_isServer, "Server->Client only event"); 78 streamWriteEntityId(entity); 79 80 local minXZ, maxXZ, minY, maxY = Utils.getMapBounds(); 81 82 streamBeginWriteBitwise(); 83 Utils.streamWriteFloatN(lossValue,8, 0, 100); 84 Vector3.writeToStreamN(pos1, 16, minXZ, maxXZ, minY, maxY); 85 Vector3.writeToStreamN(pos2, 16, minXZ, maxXZ, minY, maxY); 86 Vector3.writeToStreamN(pos3, 16, minXZ, maxXZ, minY, maxY); 87 Vector3.writeToStreamN(pos4, 16, minXZ, maxXZ, minY, maxY); 88 Vector3.writeToStreamN(pos5, 16, minXZ, maxXZ, minY, maxY); 89 Vector3.writeToStreamN(pos6, 16, minXZ, maxXZ, minY, maxY); 90 streamWriteBit(isGoingForward); 91 streamWriteBit(isGoingBackward); 92 streamEndWriteBitwise(); 93 94 Vector3.writeToStream(driveDirection); 95 end; 96 97 function EventPlowSnow:receiveData(connection) 98 assert(g_isClient, "Server->Client only event"); 99 100 local entity = streamReadEntityId(); 101 local minXZ, maxXZ, minY, maxY = Utils.getMapBounds(); 102 103 streamBeginReadBitwise(); 104 local lossValue = Utils.streamReadFloatN(8, 0, 100); 105 local v1 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 106 local v2 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 107 local v3 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 108 local v4 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 109 local v5 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 110 local v6 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 111 local isGoingForward = streamReadBit(); 112 local isGoingBackward = streamReadBit(); 113 streamEndReadBitwise(); 114 115 local driveDirection = Vector3.readFromStream(); 116 117 if entity ~= nil and entity.plowSnowByPosition ~= nil then 118 entity:plowSnowByPosition(lossValue, v1, v2, v3, v4, v5, v6, driveDirection, isGoingForward, isGoingBackward); 119 end; 120 end; 121 122 123 124 EventDisplaceSnow = EventDisplaceSnow or ExtensionOf(BaseEvent); 125 126 InitVanillaEvent(EventDisplaceSnow, "EventDisplaceSnow"); 127 128 function EventDisplaceSnow:sendData(pos1, pos2, pos3, pos4) 129 assert(g_isServer, "Server->Client only event"); 130 131 local minXZ, maxXZ, minY, maxY = Utils.getMapBounds(); 132 133 streamBeginWriteBitwise(); 134 Vector3.writeToStreamN(pos1, 16, minXZ, maxXZ, minY, maxY); 135 Vector3.writeToStreamN(pos2, 16, minXZ, maxXZ, minY, maxY); 136 Vector3.writeToStreamN(pos3, 16, minXZ, maxXZ, minY, maxY); 137 Vector3.writeToStreamN(pos4, 16, minXZ, maxXZ, minY, maxY); 138 streamEndWriteBitwise(); 139 end; 140 141 function EventDisplaceSnow:receiveData(connection) 142 assert(g_isClient, "Server->Client only event"); 143 144 local minXZ, maxXZ, minY, maxY = Utils.getMapBounds(); 145 146 streamBeginReadBitwise(); 147 local v1 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 148 local v2 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 149 local v3 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 150 local v4 = Vector3.readFromStreamN(16, minXZ, maxXZ, minY, maxY); 151 streamEndReadBitwise(); 152 153 SnowSystem.displaceSnowUnderVehicle(v1, v2, v3, v4); 154 end; 155 156 EventAddSlopeUsage = EventAddSlopeUsage or ExtensionOf(BaseEvent); 157 158 InitVanillaEvent(EventAddSlopeUsage, "EventAddSlopeUsage"); 159 160 function EventAddSlopeUsage:sendData(slope, usage) 161 assert(g_isServer, "Server->Client only event"); 162 163 streamWriteUInt16(slope); 164 streamWriteFloat(usage); 165 end; 166 167 function EventAddSlopeUsage:receiveData(connection) 168 assert(g_isClient, "Server->Client only event"); 169 170 local slope = streamReadUInt16(); 171 local usage = streamReadFloat(); 172 173 SnowSystem.addSlopeUsage(slope, usage); 174 end; 175 176 177 EventGroomSlope = EventGroomSlope or ExtensionOf(BaseEvent); 178 179 InitVanillaEvent(EventGroomSlope, "EventGroomSlope"); 180 181 function EventGroomSlope:sendData(slope) 182 assert(g_isServer, "Server->Client only event"); 183 184 streamWriteUInt16(slope); 185 end; 186 187 function EventGroomSlope:receiveData(connection) 188 assert(g_isClient, "Server->Client only event"); 189 190 local slope = streamReadUInt16(); 191 192 SnowSystem.prepareSlope(slope); 193 end; 194 195 196 EventAddSnowCircular = EventAddSnowCircular or ExtensionOf(BaseEvent); 197 198 InitVanillaEvent(EventAddSnowCircular, "EventAddSnowCircular"); 199 200 function EventAddSnowCircular:sendData(x, deltaHeight, z, spreadRadius) 201 assert(g_isServer, "Server->Client only event"); 202 203 local minXZ, maxXZ, minY, maxY = Utils.getMapBounds(); 204 streamBeginWriteBitwise(); 205 Utils.streamWriteFloatN(x, 16, minXZ, maxXZ); 206 Utils.streamWriteFloatN(deltaHeight, 16, 0, 4); 207 Utils.streamWriteFloatN(z, 16, minXZ, maxXZ); 208 Utils.streamWriteFloatN(spreadRadius, 16, 0, 100); 209 streamEndWriteBitwise(); 210 end; 211 212 function EventAddSnowCircular:receiveData(connection) 213 assert(g_isClient, "Server->Client only event"); 214 215 local minXZ, maxXZ, minY, maxY = Utils.getMapBounds(); 216 streamBeginWriteBitwise(); 217 local x = Utils.streamReadFloatN(16, minXZ, maxXZ); 218 local deltaHeight = Utils.streamReadFloatN(16, 0, 4); 219 local z = Utils.streamReadFloatN(16, minXZ, maxXZ); 220 local spreadRadius = Utils.streamReadFloatN(16, 0, 100); 221 streamEndWriteBitwise(); 222 223 SnowSystem.addSnowCircular(x, deltaHeight, z, spreadRadius); 224 end; 225 226 227 EventSetHeightCircular = EventSetHeightCircular or ExtensionOf(BaseEvent); 228 229 InitVanillaEvent(EventSetHeightCircular, "EventSetHeightCircular"); 230 231 -- note: This is the only SnowSystem event that is not server authoritative 232 -- for the simple reason that the player moving system itself is not server authoritative either 233 function EventSetHeightCircular:sendData(x, y, z, minHeight, mode) 234 local minXZ, maxXZ, minY, maxY = Utils.getMapBounds(); 235 streamBeginWriteBitwise(); 236 Utils.streamWriteFloatN(x, 16, minXZ, maxXZ); 237 Utils.streamWriteFloatN(y, 16, minY, maxY); 238 Utils.streamWriteFloatN(z, 16, minXZ, maxXZ); 239 Utils.streamWriteFloatN(minHeight, 16, 0, 4); 240 streamWriteUIntN(mode, 8); 241 streamEndWriteBitwise(); 242 end; 243 244 function EventSetHeightCircular:receiveData(connection) 245 local minXZ, maxXZ, minY, maxY = Utils.getMapBounds(); 246 streamBeginReadBitwise(); 247 local x = Utils.streamReadFloatN(16, minXZ, maxXZ); 248 local y = Utils.streamReadFloatN(16, minY, maxY); 249 local z = Utils.streamReadFloatN(16, minXZ, maxXZ); 250 local minHeight = Utils.streamReadFloatN(16, 0, 4); 251 local mode = streamReadUIntN(8); 252 streamEndReadBitwise(); 253 254 SnowSystem.setHeightCircular(x, y, z, minHeight, mode); 255 256 self:broadcastEvent(connection, x,y,z, minHeight, mode); 257 end;
Copyright
All contents of this page may be used for modding use for Winter Resort Simulator - Season 2 only. Any use exceeding this regulation is not permitted.
Copyright (C) HR Innoways, 2021. All Rights Reserved.