ART = ART or {} --- Finds the direction a player is moveing. -- @param player The player to find the move direction of -- @return The string "forward", "backward", "right", or "left" function ART.playermovedir(player) local vel = player:GetVelocity():GetNormalized() vel.z = 0 local swings = { {player:GetForward(),"forward"}, {-player:GetForward(),"backward"}, {player:GetRight(),"right"}, {-player:GetRight(),"left"} } table.sort(swings,function(a,b) return vel:Dot(a[1]) > vel:Dot(b[1]) end) return swings[1][2] end local positionset = {} --- The arc swing of a weapon. -- Finds anything that a weapon should hit in it's swing, and calls a function on it. -- @param player The player that's swinging the weapon -- @param tiems A table of times that the trace calculations should be done at, this table needs to be the same length as the positions table -- @param positions The position offsets from the player that swung that should be the start/end points of the arc -- @param onhit A function to call on any entities that were hit in the swing of the weapon. function ART.swingarc(player,times,positions,onhit) local positionpoints = {} table.insert(positionset,positionpoints) for k,v in ipairs(times) do timer.Simple(v,function() ART.TraceWeapon = true ART.TraceStart = CurTime() print("positions[k]",positions[k],"playerpos",player:GetPos(),"add",Vector(0,0,64)) local weaponpos = positions[k] + player:GetPos() + Vector(0,0,64) table.insert(positionpoints,weaponpos) if #positionpoints > 1 then --print("Trace from ", positionpoints[#positionpoints-1], " to ", positionpoints[#positionpoints]) local tr = util.TraceLine({ start = positionpoints[#positionpoints-1], endpos = positionpoints[#positionpoints], }) onhit(tr) end end) end timer.Simple(times[#times],function() print("Inserted swing, drawn positions are now:") PrintTable(positionset) ART.TraceWeapon = false end) end hook.Add( "HUDPaint", "weaponswings", function() cam.Start3D() -- Start the 3D function so we can draw onto the screen. for k,v in pairs(positionset) do for i = 1,#v-1 do render.DrawLine( v[i], v[i+1], Color(255,0,0,255), false ) render.DrawLine( v[i], v[i]+Vector(0,0,20),Color(0,255,0,255),false) end end --render.SetMaterial( material ) -- Tell render what material we want, in this case the flash from the gravgun --render.DrawSprite( pos, 16, 16, white ) -- Draw the sprite in the middle of the map, at 16x16 in it's original colour with full alpha. cam.End3D() end ) return wcommon