Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- proc/InConeByDir(atom/ref, facing_dir, atom/target, fov = 90)
- var/dx = target.x - ref.x
- var/dy = target.y - ref.y
- if(!dx && !dy)
- return TRUE
- //This can be done more efficiently with a couple of quick lists, but:
- var/cx = (facing_dir & EAST) ? 1 : ((facing_dir & WEST) ? -1 : 0)
- var/cy = (facing_dir & NORTH) ? 1 : ((facing_dir & SOUTH) ? -1 : 0)
- if(!cx && !cy)
- return TRUE
- //use dot product to compare angles
- return (dx * cx + dy * cy) >= cos(fov / 2) * sqrt((dx * dx + dy * dy) * (cx * cx + cy * cy))
- /mob/proc/UpdateFOV()
- for(var/mob/M in ohearers(world.view + 1, src))
- if(M.loc != loc && InConeByDir(src, turn(dir, 180), M, fov))
- if(client)
- client.images += M.hider
- else
- if(client)
- client.images -= M.hider
- /mob/proc/UpdateOtherFOV()
- for(var/mob/M in ohearers(world.view, src))
- if(loc != M.loc && InConeByDir(M, turn(M.dir, 180), src, M.fov))
- if(M.client)
- M.client.images |= hider
- else
- if(M.client)
- M.client.images -= hider
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement