diff --git a/code/controllers/subsystem/techtree.dm b/code/controllers/subsystem/techtree.dm
index 04ac2591bc..5f22373228 100644
--- a/code/controllers/subsystem/techtree.dm
+++ b/code/controllers/subsystem/techtree.dm
@@ -34,17 +34,6 @@ SUBSYSTEM_DEF(techtree)
var/datum/space_level/zpos = SSmapping.add_new_zlevel(tree.name, list(ZTRAIT_TECHTREE))
tree.zlevel = zpos
- var/zlevel = zpos.z_value
- var/turf/z_min = locate(1, 1, zlevel)
- var/turf/z_max = locate(world.maxx, world.maxy, zlevel)
-
-
-
- for(var/t in block(z_min, z_max))
- var/turf/Tu = t
- Tu.ChangeTurf(/turf/closed/void, list(/turf/closed/void))
- new /area/techtree(Tu)
-
for(var/tier in tree.tree_tiers)
tree.unlocked_techs += tier
tree.all_techs += tier
diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm
index b29c69e8af..6a4b479929 100644
--- a/code/game/objects/structures/fence.dm
+++ b/code/game/objects/structures/fence.dm
@@ -3,6 +3,7 @@
desc = "A large metal mesh strewn between two poles. Intended as a cheap way to separate areas, while allowing one to see through it."
icon = 'icons/obj/structures/props/fence.dmi'
icon_state = "fence0"
+ throwpass = TRUE
density = TRUE
anchored = TRUE
layer = WINDOW_LAYER
diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm
index 18f06e79a6..230590fdf9 100644
--- a/code/modules/admin/banjob.dm
+++ b/code/modules/admin/banjob.dm
@@ -146,6 +146,12 @@ WARNING!*/
else
jobs += "
Emergency Response Team | "
+ //Freed Mobs
+ if(jobban_isbanned(M, "Freed Mob", P) || isbanned_dept)
+ jobs += "Freed Mob | "
+ else
+ jobs += "Freed Mob | "
+
//Survivor
if(jobban_isbanned(M, "Survivor", P) || isbanned_dept)
jobs += "Survivor | "
diff --git a/code/modules/cm_tech/techtree.dm b/code/modules/cm_tech/techtree.dm
index 6c39d8ab9c..a027789185 100644
--- a/code/modules/cm_tech/techtree.dm
+++ b/code/modules/cm_tech/techtree.dm
@@ -58,16 +58,24 @@
if(longest_tier < tier_length)
longest_tier = tier_length
- // Clear out the area
- for(var/t in block(locate(1, 1, zlevel.z_value), locate(longest_tier * 2 + 1, length(all_techs) * 3 + 1, zlevel.z_value)))
+ // Clear out and create the area
+ // (The `+ 2` on both of these is 1 for a buffer tile, and 1 for the outer `/turf/closed/void`.)
+ var/area_max_x = longest_tier * 2 + 2
+ var/area_max_y = length(all_techs) * 3 + 2
+ for(var/t in block(locate(1, 1, zlevel.z_value), locate(area_max_x, area_max_y, zlevel.z_value)))
var/turf/pos = t
for(var/A in pos)
qdel(A)
- pos.ChangeTurf(/turf/open/blank)
- pos.color = "#000000"
-
+ if(pos.x == area_max_x || pos.y == area_max_y)
+ // The turfs around the edge are closed.
+ pos.ChangeTurf(/turf/closed/void)
+ else
+ pos.ChangeTurf(/turf/open/blank)
+ pos.color = "#000000"
+ new /area/techtree(pos)
+ // Create the tech nodes
var/y_offset = 1
for(var/tier in all_techs)
var/tier_length = length(all_techs[tier])
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 44a3592329..409c88388f 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -1034,6 +1034,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, SPAN_WARNING("The game hasn't started yet!"))
return
+ if(jobban_isbanned(src, "Freed Mob"))
+ to_chat(src, SPAN_WARNING("You are banned from being able to join as a freed mob."))
+ return
+
var/list/mobs_by_role = list() // the list the mobs are assigned to first, for sorting purposes
for(var/mob/freed_mob as anything in GLOB.freed_mob_list)
var/role_name = freed_mob.get_role_name()
@@ -1059,6 +1063,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!istype(freed_mob) || !(freed_mob in GLOB.freed_mob_list))
return
+ if(jobban_isbanned(src, "Freed Mob"))
+ to_chat(src, SPAN_WARNING("You are banned from being able to join as a freed mob."))
+ return
+
if(QDELETED(freed_mob) || freed_mob.client)
GLOB.freed_mob_list -= freed_mob
to_chat(src, SPAN_WARNING("Something went wrong."))
diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml
index a8046763ac..f171a09f14 100644
--- a/html/changelogs/archive/2024-07.yml
+++ b/html/changelogs/archive/2024-07.yml
@@ -9,3 +9,8 @@
Doubleumc:
- bugfix: sounds & motion detectors should be more reliable
- rscdel: Removed automatic end of round vote and reboot
+2024-07-25:
+ Doubleumc:
+ - code_imp: Made the Tech Tree subsystem initialise faster.
+ Zonespace27:
+ - admin: Added freed mob bans to the jobban panel.