Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.99 KB | None | 0 0
  1. proc/InConeByDir(atom/ref, facing_dir, atom/target, fov = 90)
  2. var/dx = target.x - ref.x
  3. var/dy = target.y - ref.y
  4. if(!dx && !dy)
  5. return TRUE
  6.  
  7. //This can be done more efficiently with a couple of quick lists, but:
  8. var/cx = (facing_dir & EAST) ? 1 : ((facing_dir & WEST) ? -1 : 0)
  9. var/cy = (facing_dir & NORTH) ? 1 : ((facing_dir & SOUTH) ? -1 : 0)
  10. if(!cx && !cy)
  11. return TRUE
  12.  
  13. //use dot product to compare angles
  14. return (dx * cx + dy * cy) >= cos(fov / 2) * sqrt((dx * dx + dy * dy) * (cx * cx + cy * cy))
  15.  
  16. /mob/proc/UpdateFOV()
  17. for(var/mob/M in ohearers(world.view + 1, src))
  18. if(M.loc != loc && InConeByDir(src, turn(dir, 180), M, fov))
  19. if(client)
  20. client.images += M.hider
  21. else
  22. if(client)
  23. client.images -= M.hider
  24.  
  25.  
  26. /mob/proc/UpdateOtherFOV()
  27. for(var/mob/M in ohearers(world.view, src))
  28. if(loc != M.loc && InConeByDir(M, turn(M.dir, 180), src, M.fov))
  29. if(M.client)
  30. M.client.images |= hider
  31. else
  32. if(M.client)
  33. M.client.images -= hider
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement