diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 24a271f52ca..5409370dc51 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -49,7 +49,7 @@ Retaliate() if(enemies.len && DT_PROB(5, delta_time)) - clear_enemies() + enemies.Cut() LoseTarget() src.visible_message(span_notice("[src] calms down.")) if(stat != CONSCIOUS) diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index 2da33569988..30a9f2d02ad 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -53,10 +53,19 @@ living_mobs += HM // if no tasty mice to chase, lets chase any living mob enemies in our vision range - if(length(mice) == 0) - //Filter living mobs (in range mobs) by those we consider enemies (retaliate behaviour) - return living_mobs & enemies - return mice + if(length(mice)) + return mice + + var/list/actual_enemies = list() + for(var/datum/weakref/enemy as anything in enemies) + var/mob/flesh_and_blood = enemy.resolve() + if(!flesh_and_blood) + enemies -= enemy + continue + actual_enemies += flesh_and_blood + + //Filter living mobs (in range mobs) by those we consider enemies (retaliate behaviour) + return living_mobs & actual_enemies /mob/living/simple_animal/hostile/retaliate/snake/AttackingTarget() if(istype(target, /mob/living/simple_animal/mouse)) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 49be1bab8f3..237360468f8 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -1,4 +1,5 @@ /mob/living/simple_animal/hostile/retaliate + ///A list of weakrefs pointing at things that we consider targets var/list/enemies = list() /mob/living/simple_animal/hostile/retaliate/Found(atom/A) @@ -7,7 +8,7 @@ if(!L.stat) return L else - remove_enemy(L) + enemies -= WEAKREF(L) else if(ismecha(A)) var/obj/vehicle/sealed/mecha/M = A if(LAZYLEN(M.occupants)) @@ -17,7 +18,15 @@ if(!enemies.len) return list() var/list/see = ..() - see &= enemies // Remove all entries that aren't in enemies + var/list/actual_enemies = list() + for(var/datum/weakref/enemy as anything in enemies) + var/mob/flesh_and_blood = enemy.resolve() + if(!flesh_and_blood) + enemies -= enemy + continue + actual_enemies += flesh_and_blood + + see &= actual_enemies // Remove all entries that aren't in enemies return see /mob/living/simple_animal/hostile/retaliate/proc/Retaliate() @@ -29,37 +38,22 @@ if(isliving(A)) var/mob/living/M = A if(faction_check_mob(M) && attack_same || !faction_check_mob(M)) - add_enemy(M) + enemies |= WEAKREF(M) else if(ismecha(A)) var/obj/vehicle/sealed/mecha/M = A if(LAZYLEN(M.occupants)) - add_enemy(M) + enemies |= WEAKREF(M) add_enemies(M.occupants) for(var/mob/living/simple_animal/hostile/retaliate/H in around) if(faction_check_mob(H) && !attack_same && !H.attack_same) - H.add_enemies(enemies) + H.enemies |= enemies /mob/living/simple_animal/hostile/retaliate/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = ..() if(. > 0 && stat == CONSCIOUS) Retaliate() -/mob/living/simple_animal/hostile/retaliate/proc/add_enemy(new_enemy) - RegisterSignal(new_enemy, COMSIG_PARENT_QDELETING, .proc/remove_enemy, override = TRUE) - enemies |= new_enemy - /mob/living/simple_animal/hostile/retaliate/proc/add_enemies(new_enemies) for(var/new_enemy in new_enemies) - RegisterSignal(new_enemy, COMSIG_PARENT_QDELETING, .proc/remove_enemy, override = TRUE) - enemies |= new_enemy - -/mob/living/simple_animal/hostile/retaliate/proc/clear_enemies() - for(var/enemy in enemies) - UnregisterSignal(enemy, COMSIG_PARENT_QDELETING) - enemies.Cut() - -/mob/living/simple_animal/hostile/retaliate/proc/remove_enemy(datum/enemy_to_remove) - SIGNAL_HANDLER - UnregisterSignal(enemy_to_remove, COMSIG_PARENT_QDELETING) - enemies -= enemy_to_remove + enemies |= WEAKREF(new_enemy)