diff --git a/code/TriDimension/Structures.dm b/code/TriDimension/Structures.dm
index e9f0f9e82fd..9224facba26 100644
--- a/code/TriDimension/Structures.dm
+++ b/code/TriDimension/Structures.dm
@@ -97,7 +97,7 @@
src.d_state = 1
if(target)
- var/obj/item/stack/rods/R = new /obj/item/stack/rods(target.loc)
+ var/obj/item/stack/rods/R = PoolOrNew(/obj/item/stack/rods, target.loc)
R.amount = 2
qdel(Target)
diff --git a/code/__HELPERS/datum_pool.dm b/code/__HELPERS/datum_pool.dm
index 16594ed0483..79970faf7b6 100644
--- a/code/__HELPERS/datum_pool.dm
+++ b/code/__HELPERS/datum_pool.dm
@@ -23,24 +23,20 @@ var/global/list/GlobalPool = list()
//Either way it gets passed to new
/proc/PoolOrNew(var/get_type,var/second_arg)
- if(!get_type)
- return
-
var/datum/D
D = GetFromPool(get_type,second_arg)
if(!D)
- if(ispath(get_type))
- if(islist(second_arg))
- return new get_type (arglist(second_arg))
- else
- return new get_type (second_arg)
+ // So the GC knows we're pooling this type.
+ if(!GlobalPool[get_type])
+ GlobalPool[get_type] = list(new get_type)
+ if(islist(second_arg))
+ return new get_type (arglist(second_arg))
+ else
+ return new get_type (second_arg)
return D
/proc/GetFromPool(var/get_type,var/second_arg)
- if(!get_type)
- return 0
-
if(isnull(GlobalPool[get_type]))
return 0
@@ -75,9 +71,10 @@ var/global/list/GlobalPool = list()
D.Destroy()
D.ResetVars()
+ D.disposed = 1 //Set to stop processing while pooled
/proc/IsPooled(var/datum/D)
- if(isnull(GlobalPool[D.type]) || length(GlobalPool[D.type]) == 0)
+ if(isnull(GlobalPool[D.type]))
return 0
return 1
@@ -86,10 +83,13 @@ var/global/list/GlobalPool = list()
New(arglist(args))
else
New(args)
+ disposed = null
/atom/movable/Prepare(args)
- if(islist(args))
+ var/list/args_list = args
+ if(istype(args_list) && args_list.len)
loc = args[1]
+ else
loc = args
..()
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index e6df495a10b..125345c518a 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -868,8 +868,8 @@
var/turf/Tsec = get_turf(src)
new /obj/item/device/assembly/prox_sensor(Tsec)
- new /obj/item/stack/rods(Tsec)
- new /obj/item/stack/rods(Tsec)
+ PoolOrNew(/obj/item/stack/rods, Tsec)
+ PoolOrNew(/obj/item/stack/rods, Tsec)
new /obj/item/stack/cable_coil/cut(Tsec)
if (cell)
cell.loc = Tsec
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index c9dfe8c5f08..e49fb262836 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -264,7 +264,7 @@ for reference:
var/turf/Tsec = get_turf(src)
/* var/obj/item/stack/rods/ =*/
- new /obj/item/stack/rods(Tsec)
+ PoolOrNew(/obj/item/stack/rods, Tsec)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index bbe3da7541f..e02be363f4e 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -164,7 +164,7 @@
switch (Proj.damage_type)
if(BRUTE)
new /obj/item/stack/sheet/metal(src.loc, 2)
- new /obj/item/stack/rods(src.loc, 3)
+ PoolOrNew(/obj/item/stack/rods, list(src.loc, 3))
if(BURN)
new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes!
qdel(src)
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index d90709d9c3f..f57ffaf84cd 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -82,7 +82,7 @@
if(ptank)
ptank.loc = T
ptank = null
- new /obj/item/stack/rods(T)
+ PoolOrNew(/obj/item/stack/rods, T)
qdel(src)
return
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 480709c34ad..edf09f6ea85 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -144,11 +144,11 @@
var/obj/structure/window/W = A
new /obj/item/weapon/shard( W.loc )
- if(W.reinf) new /obj/item/stack/rods( W.loc)
+ if(W.reinf) PoolOrNew(/obj/item/stack/rods, W.loc)
if (W.dir == SOUTHWEST)
new /obj/item/weapon/shard( W.loc )
- if(W.reinf) new /obj/item/stack/rods( W.loc)
+ if(W.reinf) PoolOrNew(/obj/item/stack/rods, W.loc)
qdel(A)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 54536dd4001..28036840c8e 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -103,7 +103,7 @@
if(iswirecutter(W))
if(!shock(user, 100))
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
- new /obj/item/stack/rods(loc, 2)
+ PoolOrNew(/obj/item/stack/rods, list(get_turf(src), destroyed ? 1 : 2))
qdel(src)
else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored))
if(!shock(user, 90))
@@ -173,11 +173,11 @@
density = 0
destroyed = 1
update_icon()
- new /obj/item/stack/rods(loc)
+ PoolOrNew(/obj/item/stack/rods, get_turf(src))
else
if(health <= -6)
- new /obj/item/stack/rods(loc)
+ PoolOrNew(/obj/item/stack/rods, get_turf(src))
qdel(src)
return
return
@@ -221,6 +221,16 @@
spawn(1) healthcheck()
return 1
+// Used in mapping to avoid
+/obj/structure/grille/broken
+ destroyed = 1
+ icon_state = "grille-b"
+ density = 0
+ New()
+ ..()
+ health -= rand(initial(health)*0.8, initial(health)*0.9) //Largely under broken threshold, this is used to adjust the health, NOT to break it
+ healthcheck() //Send this to healthcheck just in case we want to do something else with it
+
/obj/structure/grille/cult
name = "cult grille"
desc = "A matrice built out of an unknown material, with some sort of force field blocking air around it"
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 0aaeb83c980..36135a775e7 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -78,7 +78,7 @@ obj/structure/windoor_assembly/Destroy()
user << "\blue You dissasembled the windoor assembly!"
new /obj/item/stack/sheet/glass/reinforced(get_turf(src), 5)
if(secure)
- new /obj/item/stack/rods(get_turf(src), 4)
+ PoolOrNew(/obj/item/stack/rods, list(get_turf(src), 4))
qdel(src)
else
user << "\blue You need more welding fuel to dissassemble the windoor assembly."
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index c6afa5e2c11..36d5bcc657f 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -88,11 +88,11 @@
index = 0
while(index < 2)
new shardtype(loc)
- if(reinf) new /obj/item/stack/rods(loc)
+ if(reinf) PoolOrNew(/obj/item/stack/rods, loc)
index++
else
new shardtype(loc)
- if(reinf) new /obj/item/stack/rods(loc)
+ if(reinf) PoolOrNew(/obj/item/stack/rods, loc)
qdel(src)
return
diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm
index e0ba3b7f4d9..b036df007ac 100644
--- a/code/game/turfs/simulated/floor_types.dm
+++ b/code/game/turfs/simulated/floor_types.dm
@@ -64,7 +64,7 @@
user << "\blue Removing rods..."
playsound(src, 'sound/items/Ratchet.ogg', 80, 1)
if(do_after(user, 30))
- new /obj/item/stack/rods(src, 2)
+ PoolOrNew(/obj/item/stack/rods, list(loc, 2))
ChangeTurf(/turf/simulated/floor)
var/turf/simulated/floor/F = src
F.make_plating()
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 102a51b2b44..0ddf0c34e7f 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -98,7 +98,7 @@
playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
src.d_state = 1
src.icon_state = "r_wall-1"
- new /obj/item/stack/rods( src )
+ PoolOrNew(/obj/item/stack/rods, src)
user << "You cut the outer grille."
return
@@ -206,7 +206,7 @@
if( d_state == 5 && user.loc == T && user.get_active_hand() == WT )
src.d_state = 6
src.icon_state = "r_wall-6"
- new /obj/item/stack/rods( src )
+ PoolOrNew(/obj/item/stack/rods, src)
user << "The support rods drop out as you cut them loose from the frame."
else
user << "You need more welding fuel to complete this task."
@@ -223,7 +223,7 @@
if( d_state == 5 && user.loc == T && user.get_active_hand() == W )
src.d_state = 6
src.icon_state = "r_wall-6"
- new /obj/item/stack/rods( src )
+ PoolOrNew(/obj/item/stack/rods, src)
user << "The support rods drop out as you cut them loose from the frame."
return
diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm
index e729e3eb58c..08c5ac1c4bd 100644
--- a/code/modules/mob/living/bot/floorbot.dm
+++ b/code/modules/mob/living/bot/floorbot.dm
@@ -217,7 +217,7 @@
if(building == 1)
I = new /obj/item/stack/tile/plasteel(src)
else
- I = new /obj/item/stack/rods(src)
+ I = PoolOrNew(/obj/item/stack/rods, src)
A.attackby(I, src)
target = null
repairing = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index 15b6ddc0c62..a2e9e21f75c 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -183,16 +183,16 @@
step_to(O, get_turf(pick(view(7, src))))
//rods
- O = new /obj/item/stack/rods(src.loc)
+ O = PoolOrNew(/obj/item/stack/rods, src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(75))
- O = new /obj/item/stack/rods(src.loc)
+ O = PoolOrNew(/obj/item/stack/rods, src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(50))
- O = new /obj/item/stack/rods(src.loc)
+ O = PoolOrNew(/obj/item/stack/rods, src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(25))
- O = new /obj/item/stack/rods(src.loc)
+ O = PoolOrNew(/obj/item/stack/rods, src.loc)
step_to(O, get_turf(pick(view(7, src))))
//plasteel
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 164f486b337..e733ad8df44 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -201,8 +201,8 @@
src.visible_message("\red [src] blows apart!", 1)
var/turf/Tsec = get_turf(src)
- new /obj/item/stack/rods(Tsec)
- new /obj/item/stack/rods(Tsec)
+ PoolOrNew(/obj/item/stack/rods, Tsec)
+ PoolOrNew(/obj/item/stack/rods, Tsec)
new /obj/item/stack/cable_coil/cut(Tsec)
if(cell)