-- 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 swordVars = { baseAng = -90, framestart = 1, frameend = 78, spikelen = 45 } local spikes ={} function spikes_init_name( e, name ) Include( "utillib.lua" ) Include( "quatlib.lua" ) spikes[ e ] = { name = name, state = 'init' } end local function gotPlayer( x, y, z, dist ) ppx, ppy, ppz = GetCameraPositionX(0) , GetCameraPositionY(0) , GetCameraPositionZ(0) return U.CloserThan( ppx, ppy, ppz, x, y, z, dist ) 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 gotPlayer( spike.pos.x + xo, spike.pos.y + yo, spike.pos.z + zo, 30 ) then HurtPlayer( e, hurtAmount ) end xo, yo, zo = U.Rotate3D( 0, 60, spikeVars.spikelen, xa, ya, za ) if gotPlayer( spike.pos.x + xo, spike.pos.y + yo, spike.pos.z + zo, 30 ) then HurtPlayer( e, hurtAmount ) end end elseif spike.name == 'rotatingswordtrap' then if spike.state == 'init' then 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( swordVars.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 - swordVars.framestart ) * ( -360 / ( swordVars.frameend - swordVars.framestart ) ) local rotquat1 = Q.FromEuler( 0, rad( angle ), 0 ) local quat = Q.Mul( spike.quat, rotquat1 ) local xa, ya, za = Q.ToEuler( quat ) local xo, yo, zo = U.Rotate3D( 0, 55, swordVars.spikelen, xa, ya, za ) local x, y, z = spike.pos.x, spike.pos.y, spike.pos.z if gotPlayer( x + xo, y + yo, z + zo, 30 ) then HurtPlayer( e, hurtAmount ) end local rotquat2 = Q.FromEuler( 0, rad( angle -180 ), 0 ) quat = Q.Mul( spike.quat, rotquat2 ) xa, ya, za = Q.ToEuler( quat ) xo, yo, zo = U.Rotate3D( 0, 20, swordVars.spikelen, xa, ya, za ) if gotPlayer( x + xo, y + yo, z + zo, 30 ) then HurtPlayer( e, hurtAmount ) end end --if frame > maxFrame then -- maxFrame = frame --elseif -- frame < minFrame then -- minFrame = frame --end --PromptLocal( e, minFrame .. ", " .. maxFrame .. ", " .. frame ) elseif spike.name == 'rotatespikes2_ani' then if spike.state == 'init' then SetAnimationSpeed( e, 0.5 + math.random() / 2 ) spike.obj = g_Entity[ e ].obj local x, y, z, xA, yA, zA = GetObjectPosAng( spike.obj ) xA, yA, zA = rad( xA ), rad( yA ), rad( zA ) spike.quat = Q.FromEuler( xA, yA, zA ) local xo, yo, zo = U.Rotate3D( 0, 100, 0, xA, yA, zA ) spike.pos = { x = x + xo, y = y + yo, z = z + zo } CollisionOff( e ) spike.state = 'ready' elseif spike.state == 'ready' and U.PlayerCloserThanPos( spike.pos.x, spike.pos.y, spike.pos.z, 200 ) then local angle = 0 if frame < 50 then angle = ( 50 - frame ) * 180 / 50 else angle = ( frame - 50 ) * 180 / 50 end -- PromptLocal( e, frame .. ", " .. angle ) local quat = Q.Mul( spike.quat, Q.FromEuler( rad( angle ), 0, 0 ) ) local xa, ya, za = Q.ToEuler( quat ) local xo, yo, zo = U.Rotate3D( -30, 0, 80, xa, ya, za ) local x, y, z = spike.pos.x, spike.pos.y, spike.pos.z if gotPlayer( x + xo, y + yo, z + zo, 30 ) then HurtPlayer( e, hurtAmount * 2 ) end xo, yo, zo = U.Rotate3D( 30, 0 ,80, xa, ya, za ) if gotPlayer( x + xo, y + yo, z + zo, 30 ) then HurtPlayer( e, hurtAmount * 2 ) end --ShowDecal1( x + xo, y + yo, z + zo ) 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 end end