-- 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 rnd = math.random math.randomseed(os.time()) rnd(); rnd(); rnd() local stealth_ship_list = {} function stealth_ship_init( e ) Include( "utillib.lua" ) Include( "quatlib.lua" ) stealth_ship_list[ e ] = nil end local rotyQ = Q.FromEuler( 0, rad(90), 0 ) local rotxQ = Q.FromEuler( rad(90), 0, 0 ) local rollQ = Q.FromEuler( 0, 0, rad(0.7)) local ptchQ = Q.FromEuler( rad(0.3), 0, 0) local yawQ = Q.FromEuler( 0, rad(0.3), 0) local plasmaBubbles = { {pos = { xo = -60.3, yo = 61.8, zo = 127.6, angQ = Q.FromEuler( rad( 58.5), rad(-21.1), rad( -78.0) ) } }, {pos = { xo = 60.3, yo = 61.8, zo = 127.6, angQ = Q.FromEuler( rad(119.9), rad( -4.3), rad( -91.9) ) } }, {pos = { xo = -44.7, yo = 20.8, zo = 123.9, angQ = Q.FromEuler( rad( 63.4), rad( -2.7), rad( -36.5) ) } }, {pos = { xo = 44.7, yo = 20.8, zo = 123.9, angQ = Q.FromEuler( rad(129.9), rad(-44.7), rad(-171.9) ) } }, {pos = { xo = -32.1, yo = 143.1, zo = 39.3, angQ = Q.FromEuler( rad( 90.2), rad( -3.7), rad( 25.3) ) } }, {pos = { xo = 32.1, yo = 143.1, zo = 39.3, angQ = Q.FromEuler( rad( 90.3), rad( -6.5), rad( -25.5) ) } }, {pos = { xo = -58.3, yo = 109.3, zo = 39.5, angQ = Q.FromEuler( rad( 90.4), rad( 16.1), rad( 74.5) ) } }, {pos = { xo = 58.3, yo = 109.3, zo = 39.5, angQ = Q.FromEuler( rad( 90.5), rad(-11.4), rad( -76.0) ) } }, {pos = { xo = -66.3, yo = 136.8, zo = -99.5, angQ = Q.FromEuler( rad( 86.0), rad( 12.8), rad( 34.8) ) } }, {pos = { xo = 66.3, yo = 136.8, zo = -99.5, angQ = Q.FromEuler( rad(104.2), rad( 70.5), rad( 158.9) ) } }, {pos = { xo = -73.0, yo = 86.7, zo = -98.8, angQ = Q.FromEuler( rad( 85.4), rad( 31.0), rad( 108.1) ) } }, {pos = { xo = 73.0, yo = 86.7, zo = -98.8, angQ = Q.FromEuler( rad( 97.5), rad( 42.2), rad( 74.8) ) } }, {pos = { xo = -58.2, yo = 131.0, zo = -141.6, angQ = Q.FromEuler( rad( 66.1), rad( 13.2), rad( 27.6) ) } }, {pos = { xo = 58.2, yo = 131.0, zo = -141.6, angQ = Q.FromEuler( rad(139.8), rad( 57.3), rad(-168.1) ) } }, {pos = { xo = -61.4, yo = 88.0, zo = -141.3, angQ = Q.FromEuler( rad( 42.1), rad( 46.8), rad( 70.9) ) } }, {pos = { xo = 61.4, yo = 88.0, zo = -141.3, angQ = Q.FromEuler( rad(127.4), rad( 38.0), rad( 96.2) ) } } } function stealth_ship_main( e ) local de = stealth_ship_list[ e ] if de == nil then local Ent = g_Entity[e] stealth_ship_list[ e ] = { state = 'init', timer = math.huge, x = Ent.x, y = Ent.y, z = Ent.z, quat = Q.FromEuler( 0, 0, 0 ), rquat = nil, rotSpd = nil} return end if de.state == 'init' then -- register for dynamic entities if DE_Register == nil then return end for _, v in pairs( plasmaBubbles ) do local pos = v.pos DE_Register( e, 'Toxic', pos ) --DE_Register( e, 'Plasma', pos ) --local npos1 = { xo = pos.xo, yo = pos.yo, zo = pos.zo, angQ = Q.Mul( pos.angQ, rotyQ ) } --DE_Register( e, 'Plasma', npos1 ) --local npos2 = { xo = pos.xo, yo = pos.yo, zo = pos.zo, angQ = Q.Mul( pos.angQ, rotxQ ) } --DE_Register( e, 'Plasma', npos2 ) end local entList = DE_GetEnts( e, 'Toxic' ) --local entList = DE_GetEnts( e, 'Plasma' ) for _, v in pairs( entList ) do Scale( v, 200 ) end if de.rquat == nil then local rot = rad( rnd() * 2 ) if rnd( 1, 2 ) == 2 then rot = -rot end de.rotSpd = Q.FromEuler( 0, 0, rot ) de.rquat = Q.FromEuler( 0, 0, rad( 1 )) end de.state = 'show' return end if de.state == 'show' then DE_Show( e, 'Toxic' ) --DE_Show( e, 'Plasma' ) de.state = 'idle' end if de.state == 'idle' then --de.quat = Q.Mul( de.quat, rollQ ) de.quat = Q.Mul( de.quat, yawQ ) -- get new Euler angles local xa, ya, za = Q.ToEuler( de.quat ) -- reposition stealth_ship CollisionOff( e ) ResetRotation( e, deg( xa ), deg( ya ), deg( za ) ) ResetPosition( e, de.x, de.y, de.z ) CollisionOn( e ) -- update 'attached' decals DE_Update( e, de.x, de.y, de.z, de.quat, de.rquat ) de.rquat = Q.Mul( de.rquat, de.rotSpd ) end end