Reworked the Hostile mob friends list to use weakrefs (#30253)

This commit is contained in:
DeityLink
2021-08-18 21:30:15 +02:00
committed by GitHub
parent 9717e2ca3a
commit a6ddb23930
9 changed files with 51 additions and 31 deletions

View File

@@ -448,7 +448,7 @@
var/mob/living/simple_animal/hostile/humanoid/H = NM
H.items_to_drop = list()
NM.faction = "lazarus \ref[user]"
NM.friends += user
NM.friends += makeweakref(user)
MC.contained_mob = NM
MC.name = "lazarus capsule - [NM.name]"
..()

View File

@@ -212,7 +212,7 @@ proc/move_mining_shuttle()
has_slime=1
to_chat(user, "You mold the slime extract around the tip of \the [src].")
return TRUE
/obj/item/weapon/pickaxe/hammer
name = "sledgehammer"
//icon_state = "sledgehammer" Waiting on sprite
@@ -823,7 +823,7 @@ proc/move_mining_shuttle()
M.revive(refreshbutcher = refreshes_drops)
if(istype(target, /mob/living/simple_animal/hostile))
var/mob/living/simple_animal/hostile/H = M
H.friends += user
H.friends += makeweakref(user)
log_attack("[key_name(user)] has revived hostile mob [H] with a lazarus injector.")
H.attack_log += "\[[time_stamp()]\] Revived by <b>[key_name(user)]</b> with a lazarus injector."
@@ -965,16 +965,12 @@ proc/move_mining_shuttle()
update_icon()
/obj/item/device/mobcapsule/proc/take_contents(mob/user)
for(var/mob/living/simple_animal/AM in src.loc)
if(istype(AM))
var/mob/living/simple_animal/M = AM
var/mob/living/simple_animal/hostile/H = M
if(!istype(H))
continue
for(var/things in H.friends)
if(capsuleowner in H.friends)
if(insert(AM, user) == -1) //Limit reached
break
for(var/mob/living/simple_animal/hostile/AM in loc)
for(var/datum/weakref/things in AM.friends)
var/mob/M = things.get()
if(capsuleowner == M)
if(insert(AM, user) == -1) //Limit reached
break
/**********************Mining Scanner**********************/

View File

@@ -151,8 +151,12 @@
user.drop_item(F, force_drop = 1)
if(prob(25))
if(!friends.Find(user))
friends.Add(user)
var/already_friend = FALSE
for(var/datum/weakref/ref in friends)
if (ref.get() == user)
already_friend = TRUE
if (!already_friend)
friends += makeweakref(user)
to_chat(user, "<span class='info'>You have gained \the [src]'s trust.</span>")
var/image/heart = image('icons/mob/animal.dmi',src,"heart-ani2")
heart.plane = ABOVE_HUMAN_PLANE

View File

@@ -27,8 +27,9 @@
D.get_spooked(new_target)
/mob/living/simple_animal/hostile/deer/proc/is_spooked(var/mob/living/target)
if(friends.Find(target))
return 0
for(var/datum/weakref/ref in friends)
if (ref.get() == target)
return 0
if(ishuman(target))
/*
Making it so that there is some tactics to hunting deer
@@ -104,8 +105,12 @@
icon_state = "deer_flower"
if(prob(25))
if(!friends.Find(user))
friends.Add(user)
var/already_friend = FALSE
for(var/datum/weakref/ref in friends)
if (ref.get() == user)
already_friend = TRUE
if (!already_friend)
friends += makeweakref(user)
to_chat(user, "<span class='info'>You have gained \the [src]'s trust.</span>")
name_mob(user)
qdel(A)

View File

@@ -206,8 +206,10 @@
if((istype(L,/mob/living/simple_animal/corgi/Ian) || istype(L,/mob/living/carbon/human/dummy)) && (faction == "adminbus mob"))
return 0
//WE DON'T ATTACK OUR FRIENDS (used by lazarus injectors, and rabid slimes)
if(friends.Find(L))
return 0
for(var/datum/weakref/ref in friends)
if (ref.get() == L)
return 0
return 1
if(isobj(the_target))
//if(the_target.type in wanted_objects)
@@ -346,7 +348,15 @@
var/mob/living/simple_animal/hostile/H = from
if(istype(H))
src.friends |= H.friends
for (var/datum/weakref/ref in H.friends)
var/not_a_friend_yet = TRUE
var/mob/M = ref.get()
for (var/datum/weakref/reff in H.friends)
if (M == reff.get())
not_a_friend_yet = FALSE
break
if (not_a_friend_yet)
friends += makeweakref(M)
/mob/living/simple_animal/hostile/proc/OpenFire(var/atom/ttarget)
set waitfor = 0

View File

@@ -13,7 +13,7 @@
key = mind.key // Force the ghost in here
if(Owner)
faction = "necro"
friends.Add(Owner)
friends += makeweakref(Owner)
creator = Owner
if(client)
to_chat(src, "<big><span class='warning'>You have been risen from the dead by your new master, [Owner]. Do his bidding so long as he lives, for when he falls so do you.</span></big>")

View File

@@ -58,7 +58,7 @@
faction_original = faction
faction = ""
friends_temp = friends.Copy()
friends.Cut()
friends = list()
treacherous = TRUE
/mob/living/simple_animal/hostile/pitbull/proc/Calmdown()

View File

@@ -52,7 +52,7 @@
rabid.icon_dead = "[src.colour] baby slime dead"
rabid.colour = "[src.colour]"
for(var/mob/M in friends)
rabid.friends += M
rabid.friends += makeweakref(M)
qdel(src)
/mob/living/simple_animal/hostile/slime/Life()
@@ -79,8 +79,10 @@
calmed_type = text2path("/mob/living/carbon/slime/" + path_end)
var/mob/living/carbon/slime/calmed = new calmed_type(loc)
for(var/mob/M in friends)
calmed.Friends += M
for(var/datum/weakref/ref in friends)
var/mob/M = ref.get()
if (istype(M))
calmed.Friends = M
qdel(src)
@@ -91,7 +93,9 @@
calmed_type = text2path("/mob/living/carbon/slime/adult/" + path_end)
var/mob/living/carbon/slime/calmed = new calmed_type(loc)
for(var/mob/M in friends)
calmed.Friends += M
for(var/datum/weakref/ref in friends)
var/mob/M = ref.get()
if (istype(M))
calmed.Friends = M
qdel(src)

View File

@@ -93,8 +93,9 @@ var/global/gourmonger_saturation = 0
return 0
if((istype(L,/mob/living/carbon/human/dummy)) && (faction == "adminbus mob"))
return 0
if(friends.Find(L))
return 0
for(var/datum/weakref/ref in friends)
if (ref.get() == L)
return 0
if(!L.stat && !hangry) //So we attack corpses but not living creatures unless we're starving
return 0
if(sniffTarget) //Why are we running across the station if there's food right in front of us?