-- LUA Script - precede every function and global member with lowercase name of script + '_main' local U = require "scriptbank\\utillib" local P = require "scriptbank\\physlib" local rad = math.rad local deg = math.deg local atan = math.atan2 local sqrt = math.sqrt local modf = math.modf local darts = {} local thrust = 2 local controlEnt = nil local function getDart() for k, v in pairs( darts ) do if v.state == 'idle' then return k end end end function throw_dart_init( e ) Include( "utillib.lua" ) Include( "physlib.lua" ) Hide( e ) CollisionOff( e ) darts[ e ] = nil end local mouseClicked = false local timer = 0 local reload = 300 local pxp, pyp, pzp, paX, paY, paZ local width = 4 local numbers = { 20, 1, 18, 4, 13, 6, 10, 15, 2, 17, 3, 19, 7, 16, 8, 11, 14, 9, 12, 5 } function throw_dart_main( e ) if controlEnt == nil then controlEnt = e end local dart = darts[ e ] if dart == nil then darts[ e ] = { obj = g_Entity[ e ].obj, state = 'idle', vec = { x = 0, y = 0, z = 0 } } return elseif dart.state == 'push1' then SetObjectDamping( dart.obj, 0.01, 0 ) PushObject( dart.obj, 0, 0, 0 ) dart.state = 'push2' elseif dart.state == 'push2' then PushObject( dart.obj, dart.vec.x, dart.vec.y, dart.vec.z ) dart.state = 'done' -- register object to collision detection AddObjectCollisionCheck( dart.obj ) dart.timer = g_Time + 10000 elseif dart.state == 'done' then local numCols = GetObjectNumCollisions( dart.obj ) if numCols > 0 then for i = 1, numCols do local objB, x, y, z, f = GetObjectCollisionDetails( dart.obj, i ) if objB ~= nil then if f > 0.001 then local ent = P.ObjectToEntity( objB ) if ent ~= nil and GetEntityName( ent ) == 'Dart Board' then PlaySound( ent, 0 ) dart.depth = modf( f * 100 ) / 4 local bx, by, bz, bxa, bya, bza = GetObjectPosAng( objB ) local xo, yo, zo = U.Rotate3D( 0, -dart.depth, 0, rad( bxa ), rad( bya ), rad( bza ) ) dart.hitx = x + xo dart.hity = y + yo dart.hitz = z + zo dart.state = 'hit' yo = dart.hity - by xo = dart.hitx - bx dart.r = sqrt( xo*xo + yo*yo ) dart.ang = deg( atan( xo, yo ) ) if dart.ang < -9 then dart.ang = 360 + dart.ang end local val = 0 for i=-9, 351, 18 do if dart.ang > i then val = val + 1 else break end end dart.score = "" if dart.r < 11.7 then if dart.r < 10.7 then if dart.r < 7.7 then if dart.r < 6.5 then if dart.r < 1.9 then if dart.r < 1 then dart.score = "Bullseye!" else dart.score = "25" end else dart.score = "Single " .. numbers[ val ] end else dart.score = "Treble " .. numbers[ val ] end else dart.score = "Single " .. numbers[ val ] end else dart.score = "Double " .. numbers[ val ] end else dart.score = "No score!" end break end end end end RemoveObjectCollisionCheck( dart.obj ) end if g_Time > dart.timer then dart.state = 'idle' CollisionOff( e ) RemoveObjectCollisionCheck( dart.obj ) end elseif dart.state == 'hit' then CollisionOff( e ) SetPosition( e, dart.hitx, dart.hity, dart.hitz ) SetRotation( e, dart.ax, dart.ay, dart.az ) PromptLocal( e, dart.score ) end if controlEnt ~= e then return end pxp, pyp, pzp = g_PlayerPosX, g_PlayerPosY + 28, g_PlayerPosZ if GetGamePlayerStatePlayerDucking() == 1 then pyp = pyp - 18 end if g_MouseClick == 1 then if not mouseClicked then mouseClicked = true local Ent = getDart() if Ent ~= nil then dart = darts[ Ent ] paX, paY, paZ = g_PlayerAngX, g_PlayerAngY, g_PlayerAngZ local vX, vY, vZ = U.Rotate3D ( 0, 0, 1, rad( paX ), rad( paY ), rad( paZ ) ) CollisionOff( Ent ) SetPosition( Ent, pxp + vX * 50, pyp + vY * 50 - 5, pzp + vZ * 50) SetRotation( Ent, paX, paY, paZ ) dart.ax, dart.ay, dart.az = paX, paY, paZ CollisionOn( Ent ) Show( Ent ) dart.state = 'push1' dart.vec.x = vX * thrust dart.vec.y = vY * thrust dart.vec.z = vZ * thrust end end elseif g_MouseClick == 2 then if not mouseClicked then mouseClicked = true for k, v in pairs( darts ) do v.state = 'idle' Hide( k ) end end else mouseClicked = false end end