meta data for this page
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
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.