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;

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.