-- LUA Script - precede every function and global member with lowercase name of script + '_main' local U = require "scriptbank\\utillib" local Q = require "scriptbank\\quatlib" local rad = math.rad local deg = math.deg local loco_list = {} function loco_init( e ) Include( "utillib.lua" ) loco_list[ e ] = nil end -- 0.2 degree up rotate local rotQuat = Q.FromEuler( 0, rad( 0.2 ), 0 ) function loco_main( e ) local de = loco_list[ e ] local Ent = g_Entity[e] if de == nil then loco_list[ e ] = { state = 'init', timer = math.huge, smokeOn = false, quat = Q.FromEuler( rad( Ent.anglex ), rad( Ent.angley ), rad( Ent.anglez ) ) } return end if de.state == 'init' then -- register for dynamic entities if DE_Register == nil then return end -- four dust puff decals for 'smoke' DE_Register( e, 'Dust Puff' ) DE_Register( e, 'Dust Puff' ) DE_Register( e, 'Dust Puff' ) DE_Register( e, 'Dust Puff' ) de.state = 'show' -- wait 5 seconds de.timer = g_Time + 5000 return end if de.state == 'show' then DE_Show( e, 'Dust Puff' ) de.state = 'idle' end local nx, ny, nz = Ent.x, Ent.y, Ent.z if de.state == 'idle' and g_Time > de.timer then if not de.smokeOn then StartParticleEmitter( DE_GetEnts( e, 'Dust Puff' )[ 1 ] ) de.smokeOn = true end -- apply rotation de.quat = Q.Mul( de.quat, rotQuat ) -- get new Euler angles local xa, ya, za = Q.ToEuler( de.quat ) -- move forward by 2 units (train is 'backwards so we use -ve value) local XO, YO, ZO = U.Rotate3D( 0, 0, -2, xa, ya, za ) nx, ny, nz = nx + XO, ny + YO, nz + ZO -- reposition loco CollisionOff( e ) ResetRotation( e, deg( xa ), deg( ya ), deg( za ) ) ResetPosition( e, nx, ny, nz ) CollisionOn( e ) end -- update 'attached' decals DE_Update( e, nx, ny, nz, de.quat ) end