Vehicles/VehicleScripts/VehicleCrawler.lua

Articulated steering allows to implement a steering mechanism that works with two different objects connected with a joint.

  25  VehicleCrawler                      = VehicleCrawler or {};

VehicleCrawler:load(dataTable)

Load the configuration data of the joint and the steering values.

  29  function VehicleCrawler:load(dataTable)
  30      self.updateWheels               = VehicleManager:newFunction("updateWheels");
  31      self.enableCrawlerParticles     = VehicleManager:newFunction("enableCrawlerParticles");
  32  
  33      if dataTable.vehicleCrawler == nil then
  34          printf("Warning: Using vehicle script 'VehicleCrawler', but the data table 'vehicleCrawler' is missing (got a %s value, table expected)", type(dataTable.vehicleCrawler));
  35          return;
  36      end;
  37      self.crawlers       = {};
  38      for k1,crawler in pairs(dataTable.vehicleCrawler) do
  39          self.crawlers[k1]                       = {};
  40          self.crawlers[k1].vehicleCrawlerWheels  = {};
  41          for k,v in ipairs(crawler.wheels) do
  42              table.insert(self.crawlers[k1].vehicleCrawlerWheels, {
  43                  wheel                   = getChild(self.id, v.wheel),
  44                  diameter                = getNoNil(v.diameter, 0.3),
  45                  randomStartPosition     = getNoNil(v.randomStartPosition, false),
  46              });
  47          end;
  48      
  49          if crawler.wheels == nil or type(crawler.wheels) ~= "table" then
  50              print("VehicleCrawler 'wheels' is either nil or has the wrong type (".. type(crawler.wheels)..", table expected)!");
  51              return;
  52          end;
  53          
  54          if crawler.boundsCenter == nil or type(crawler.boundsCenter) ~= "table" then
  55              print("VehicleCrawler 'boundsCenter' is either nil or has the wrong type (".. type(crawler.boundsCenter)..", table expected)!");
  56              return;
  57          end;
  58      
  59          if crawler.boundsSize == nil or type(crawler.boundsSize) ~= "table" then
  60              print("VehicleCrawler 'boundsSize' is either nil or has the wrong type (".. type(crawler.boundsSize)..", table expected)!");
  61              return;
  62          end;
  63      
  64          if crawler.crawlerLength == nil or crawler.crawlerLength == "" then
  65              print("VehicleCrawler 'crawlerLength' is either nil or is an empty string!");
  66              return;
  67          end;
  68      
  69          if crawler.crawler == nil or crawler.crawler == "" then
  70              print("VehicleCrawler 'crawler' is either nil or is an empty string!");
  71              return;
  72          end;
  73      
  74          self.crawlers[k1].crawlerLength     = crawler.crawlerLength;
  75          self.crawlers[k1].crawler           = getChild(self.id, crawler.crawler);
  76          self.crawlers[k1].crawlerBackwards  = getNoNil(crawler.crawlerBackwards, false);
  77          for k,v in pairs(self.crawlers[k1].vehicleCrawlerWheels) do
  78              if v.randomStartPosition then
  79                  setRotation(v.wheel, math.random(-180, 180), 0, 0);
  80              end;
  81          end;
  82      
  83          self.crawlers[k1].propertyBlock                 = Material.newPropertyBlock(self.crawlers[k1].crawler);
  84          self.crawlers[k1].crawlerOffset                 = 0;
  85  
  86          local posPrevX, posPrevY, posPrevZ  = getWorldPosition(self.crawlers[k1].crawler);
  87          self.crawlers[k1].posPrev           = Vector3:new(posPrevX, posPrevY, posPrevZ);
  88          
  89          -- apply bounds
  90          MeshFilter.setMeshBounds(self.crawlers[k1].crawler, crawler.boundsCenter, crawler.boundsSize);
  91  
  92          -- load crawler snow particles
  93          self.crawlers[k1].crawlerSnowParticleSystems            = {};
  94          if crawler.crawlerSnowParticleSystems ~= nil then
  95              for k, v in pairs(crawler.crawlerSnowParticleSystems) do
  96                  local id                = getChild(self.id, v.index);
  97                  if id ~= 0 then
  98                      local particleSystemId  = Utils.loadBundleGameObject(self.bundleId, v.particleSystem or "$vehicles/particles/SnowCrawler");
  99  
 100                      setParent(particleSystemId, id);
 101                      setPosition(particleSystemId, 0,0,0);
 102                      setRotation(particleSystemId, 0,0,0);
 103                      setActive(particleSystemId, false);
 104  
 105                      table.insert(self.crawlers[k1].crawlerSnowParticleSystems, { id = particleSystemId, reverse = v.reverse, amount = getNoNil(v.particleAmount, 100), isActive = false});
 106                  end;
 107              end;
 108          end;
 109  
 110          self.maxCrawlerParticleQuotient     = 3;
 111      end;
 112      self.terrainMask                    = Utils.getLayerMask("Terrain");
 113      self.speedQuotientPrev              = 0;
 114  
 115      self.crawlerParticlesEnabled        = false;
 116  
 117      local sizeXZ, sizeY, offsetXZ       = GameControl.getTerrainSizeAndOffset();
 118      self.terrainOffsetXZ                = offsetXZ;
 119  
 120  end;
 121  

VehicleCrawler:update(dt)

Updates the position of the vatten mask connection part.

 125  function VehicleCrawler:update(dt)
 126      if (not self.isActive or self.crawlers == nil) --[[and math.abs(self.currentSpeed) < 1.5
 127   then
 128          for k1, crawler in pairs(self.crawlers) do
 129              self:enableCrawlerParticles(crawler.crawlerSnowParticleSystems, false);
 130          end;
 131  
 132          return;
 133      end;
 134  
 135      local x, y, z                   = getWorldPosition(self.mainId);
 136      
 137      local terrainLayer              = TerrainEditor.getTerrainLayerIndexAtPosition(x - self.terrainOffsetXZ , z - self.terrainOffsetXZ );
 138      local hit, distance             = Utils.raycastGetDistance(Vector3:new(x, y + 0.2, z), Vector3:new(0, -1, 0), 0.2, self.terrainMask);
 139  
 140      for k1, crawler in pairs(self.crawlers) do
 141          if crawler.crawler ~= nil then
 142              local speed                 = getNoNil(self.hydraulicSpeed, self.currentSpeed / 3.6);
 143  
 144              if crawler.crawlerBackwards then    
 145                  crawler.crawlerOffset   = (crawler.crawlerOffset - (speed * dt));
 146              else 
 147                  crawler.crawlerOffset   = (crawler.crawlerOffset + (speed * dt));
 148              end;
 149               
 150              if crawler.crawlerOffset >= crawler.crawlerLength then
 151                  crawler.crawlerOffset   = 0;
 152              end;
 153              if crawler.crawlerOffset < 0 then 
 154                  crawler.crawlerOffset   = crawler.crawlerLength;
 155              end;
 156  
 157              Material.setPropertyBlockFloat(crawler.propertyBlock, "_CrawlerOffset", crawler.crawlerOffset);
 158              Material.applyPropertyBlock(crawler.crawler, crawler.propertyBlock);
 159  
 160              for k,v in pairs(crawler.vehicleCrawlerWheels) do
 161                  if crawler.crawlerBackwards then
 162                      setRotation(v.wheel, (crawler.crawlerOffset) / v.diameter * 360 / math.pi, 180, 180);
 163                  else 
 164                      setRotation(v.wheel, (crawler.crawlerOffset) / v.diameter * 360 / math.pi, 0, 0);
 165                  end;
 166              end;
 167              
 168              local id;
 169              if crawler.component ~= nil then
 170                  id              = self.components[crawler.component];
 171              else 
 172                  id              = self.mainId;
 173              end;
 174              
 175              if hit and terrainLayer == 0 then
 176                  self:enableCrawlerParticles(crawler.crawlerSnowParticleSystems, true);
 177              else 
 178                  self:enableCrawlerParticles(crawler.crawlerSnowParticleSystems, false);
 179              end;
 180          end;
 181      end;
 182  end; 
 183  
 184  function VehicleCrawler:enableCrawlerParticles(particleSystems, isActive)
 185      local speedQuotient                 = self.currentSpeed;
 186  
 187      if particleSystems ~= nil then
 188          for k, particle in pairs(particleSystems) do
 189              if speedQuotient ~= nil and particle.reverse == nil and isActive and not particle.isActive then
 190                  setActive(particle.id, self.isActive);
 191                  ParticleSystem.play(particle.id);
 192                  particle.isActive           = true;
 193  
 194              elseif speedQuotient > 1 and not particle.reverse and isActive and not particle.isActive then
 195                  setActive(particle.id, self.isActive);
 196                  ParticleSystem.play(particle.id);
 197                  particle.isActive           = true;
 198                
 199              elseif speedQuotient < 1 and particle.reverse and isActive and not particle.isActive then
 200                  setActive(particle.id, self.isActive);
 201                  ParticleSystem.play(particle.id);
 202                  particle.isActive           = true;
 203  
 204              else
 205                  ParticleSystem.stop(particle.id);
 206                  particle.isActive           = false;
 207              end;
 208  
 209              ParticleSystem.setEmissionRateOverTime(particle.id, math.abs(speedQuotient * particle.amount));
 210          end;
 211      end;
 212  end;
 213  

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.