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 = {} --[[ local ea = player:EyeAngles() for k,v in pairs(positions) do print("Position that was at ", positions[k]) positions[k].z = positions[k].z * math.sin(ea.pitch+90) print("Is now at",positions[k]) end ]] table.insert(positionset,positionpoints) local hitents = {} for k,v in ipairs(times) do timer.Simple(v,function() local weaponpos = positions[k] + player:GetPos() + Vector(0,0,64) table.insert(positionpoints,weaponpos) if #positionpoints > 1 then local tr = util.TraceLine({ start = positionpoints[#positionpoints-1], endpos = positionpoints[#positionpoints], }) if tr.Hit then onhit(tr) end end end) end timer.Simple(times[#times],function() print("Inserted swing, drawn positions are now:") PrintTable(positionset) 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 ) 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