|
1 | 1 | /// Returns an angle between 0 and 180, where 0 is the attacker is directly infront of the defender, 180 for directly behind.
|
2 | 2 | /proc/get_relative_attack_angle(mob/living/carbon/human/defender, atom/movable/hitby)
|
3 |
| - var/attack_dir = defender.dir // Default to the defender's dir so that the attack angle is 0 by default |
| 3 | + /// Null is the value that will consider angles to match the defender's dir |
| 4 | + var/attack_angle = null |
| 5 | + |
4 | 6 | var/turf/defender_turf = get_turf(defender)
|
| 7 | + var/turf/attack_turf = get_turf(hitby) |
| 8 | + var/attack_dir = get_dir(defender_turf, attack_turf) |
5 | 9 |
|
6 | 10 | if(isprojectile(hitby))
|
7 | 11 | var/obj/projectile/P = hitby
|
8 | 12 | if(P.starting != defender_turf)
|
9 |
| - attack_dir = REVERSE_DIR(angle2dir(P.Angle)) |
| 13 | + attack_angle = REVERSE_ANGLE(P.Angle) |
10 | 14 |
|
11 | 15 | else if(isitem(hitby))
|
12 | 16 | if(ismob(hitby.loc))
|
13 |
| - attack_dir = get_dir(defender, hitby.loc) |
| 17 | + attack_angle = dir2angle(get_dir(defender, get_turf(hitby.loc))) |
14 | 18 | else
|
15 |
| - attack_dir = get_dir(defender, hitby) |
| 19 | + attack_angle = dir2angle(attack_dir) |
16 | 20 |
|
17 | 21 | else
|
18 |
| - attack_dir = get_dir(defender, hitby) |
| 22 | + attack_angle = dir2angle(attack_dir) |
| 23 | + |
| 24 | + if(attack_angle == null) |
| 25 | + return 0 |
19 | 26 |
|
20 |
| - var/attack_angle = dir2angle(attack_dir) || 0 // If attack_dir == 0, dir2angle returns null |
21 | 27 | var/facing_angle = dir2angle(defender.dir) || 0
|
22 | 28 | var/delta = abs(attack_angle - facing_angle)
|
23 | 29 | if(delta > 180)
|
|
0 commit comments