-- 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 hurtAmount = 5 local spikeVars = { baseAng = -90, framestart = 1, frameend = 80, spikelen = 60 } local spikes ={} function spikes_init_name( e, name ) Include( "utillib.lua" ) Include( "quatlib.lua" ) spikes[ e ] = { name = name, state = 'init' } end local minFrame = math.huge local maxFrame = 0 local controlEnt = nil function spikes_main( e ) local spike = spikes[ e ] if spike == nil then return end local frame = GetAnimationFrame( e ) --PromptLocal( e, spike.name .. ", " .. frame ) if spike.name == 'rotatespikes' then if spike.state == 'init' then SetAnimationSpeed( e, 0.3 + math.random() ) spike.obj = g_Entity[ e ].obj local x, y, z, xA, yA, zA = GetObjectPosAng( spike.obj ) spike.pos = { x = x, y = y, z = z } local baseRotQ = Q.FromEuler( 0, rad( spikeVars.baseAng ), 0 ) spike.quat = Q.Mul( Q.FromEuler( rad( xA ), rad( yA ), rad( zA ) ), baseRotQ ) spike.state = 'ready' elseif spike.state == 'ready' and U.PlayerCloserThanPos( spike.pos.x, spike.pos.y, spike.pos.z, 200 ) then local angle = ( frame - spikeVars.framestart ) * ( -360 / ( spikeVars.frameend - spikeVars.framestart ) ) local quat = Q.Mul( spike.quat, Q.FromEuler( 0, rad( angle ), 0 ) ) local xa, ya, za = Q.ToEuler( quat ) local xo, yo, zo = U.Rotate3D( 0, 20, spikeVars.spikelen, xa, ya, za ) if U.PlayerCloserThanPos( spike.pos.x + xo, spike.pos.y + yo, spike.pos.z + zo, 40 ) then HurtPlayer( e, hurtAmount ) end xo, yo, zo = U.Rotate3D( 0, 60, spikeVars.spikelen, xa, ya, za ) if U.PlayerCloserThanPos( spike.pos.x + xo, spike.pos.y + yo, spike.pos.z + zo, 40 ) then HurtPlayer( e, hurtAmount ) end end elseif spike.name == 'spikefloor' then if spike.state == 'init' then SetAnimationSpeed( e, 1.0 ) spike.obj = g_Entity[ e ].obj spike.rate = 800 + math.random() * 1600 spike.timer = g_Time + spike.rate spike.state = 'ready' StopAnimation( e ) SetAnimationFrame( e, 25 ) CollisionOff( e ) elseif spike.state == 'ready' then if g_Time > spike.timer then SetAnimationFrames( 25, 46 ) PlayAnimation( e ) spike.state = 'strike' end elseif spike.state == 'strike' then if frame == 46 then spike.timer = g_Time + spike.rate SetAnimationFrame( e, 25 ) spike.state = 'ready' elseif frame > 27 and frame < 44 and U.PlayerCloserThan( e, 80 ) then HurtPlayer( e, hurtAmount ) end end --if frame > maxFrame then -- maxFrame = frame --elseif -- frame < minFrame then -- minFrame = frame --end --PromptLocal( e, minFrame .. ", " .. maxFrame ) end end