diff --git a/code/game/gamemodes/events/biomass.dm b/code/game/gamemodes/events/biomass.dm
index 36a22c86dc0..dd0fb3dd982 100644
--- a/code/game/gamemodes/events/biomass.dm
+++ b/code/game/gamemodes/events/biomass.dm
@@ -202,10 +202,11 @@
var/area/Hallway = locate(type)
for(var/turf/simulated/floor/Floor in Hallway.contents)
- if(Floor.contents.len <= 0)
+ if(!is_blocked_turf(Floor))
Floors += Floor
if(Floors.len) // pick a floor to spawn at
var/turf/simulated/floor/Floor = pick(Floors)
new/obj/effect/biomass_controller(Floor) // spawn a controller at floor
- message_admins("Event: Biomass spawned at [Floor.loc] ([Floor.x].[Floor.y].[Floor.z])")
+ log_admin("Event: Biomass spawned at [Floor.loc] ([Floor.x],[Floor.y],[Floor.z]).")
+ message_admins("Event: Biomass spawned at [Floor.loc] [formatJumpTo(Floor)]")
diff --git a/code/game/gamemodes/events/spacevines.dm b/code/game/gamemodes/events/spacevines.dm
index 7c5ce0d8d88..d7513dba4a8 100644
--- a/code/game/gamemodes/events/spacevines.dm
+++ b/code/game/gamemodes/events/spacevines.dm
@@ -1,6 +1,5 @@
//Carn: Spacevines random event.
/proc/spacevine_infestation()
-
//writepanic("[__FILE__].[__LINE__] (no type)([usr ? usr.ckey : ""]) \\/proc/spacevine_infestation() called tick#: [world.time]")
spawn() //to stop the secrets panel hanging
@@ -8,10 +7,11 @@
for(var/areapath in typesof(/area/hallway))
var/area/A = locate(areapath)
for(var/turf/simulated/floor/F in A.contents)
- if(!F.contents.len)
+ if(!is_blocked_turf(F))
turfs += F
if(turfs.len) //Pick a turf to spawn at if we can
var/turf/simulated/floor/T = pick(turfs)
new/obj/effect/plant_controller(T) //spawn a controller at turf
- message_admins("Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])")
+ log_admin("Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z]).")
+ message_admins("Event: Spacevines spawned at [T.loc] [formatJumpTo(T)]")
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 48a38105195..46b84d5ee29 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -60,6 +60,7 @@
desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere."
icon = 'icons/obj/weapons.dmi'
icon_state = "eshield0" // eshield1 for expanded
+ inhand_states = list("left_hand" = 'icons/mob/in-hand/left/shields.dmi', "right_hand" = 'icons/mob/in-hand/right/shields.dmi')
flags = FPRINT
siemens_coefficient = 1
force = 3.0
@@ -71,9 +72,36 @@
attack_verb = list("shoved", "bashed")
var/active = 0
- suicide_act(mob/user)
- viewers(user) << "[user] is putting the [src.name] to their head and activating it! It looks like \he's trying to commit suicide!"
- return (BRUTELOSS)
+/obj/item/weapon/shield/energy/suicide_act(mob/user)
+ viewers(user) << "[user] is putting the [src.name] to their head and activating it! It looks like \he's trying to commit suicide!"
+ return (BRUTELOSS)
+
+/obj/item/weapon/shield/energy/IsShield()
+ if(active)
+ return 1
+ else
+ return 0
+
+/obj/item/weapon/shield/energy/attack_self(mob/living/user as mob)
+ if ((M_CLUMSY in user.mutations) && prob(50))
+ user << "You beat yourself in the head with [src]."
+ user.take_organ_damage(5)
+ active = !active
+ if (active)
+ force = 10
+ w_class = 4
+ playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
+ user << "[src] is now active."
+ else
+ force = 3
+ w_class = 1
+ playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
+ user << "[src] can now be concealed."
+ icon_state = "eshield[active]"
+ item_state = "eshield[active]"
+ user.regenerate_icons()
+ add_fingerprint(user)
+ return
/obj/item/weapon/cloaking_device
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index 01a1df19105..f96a21f97fe 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -207,31 +207,3 @@
return
-/*
- * Energy Shield
- */
-/obj/item/weapon/shield/energy/IsShield()
- if(active)
- return 1
- else
- return 0
-
-/obj/item/weapon/shield/energy/attack_self(mob/living/user as mob)
- if ((M_CLUMSY in user.mutations) && prob(50))
- user << "You beat yourself in the head with [src]."
- user.take_organ_damage(5)
- active = !active
- if (active)
- force = 10
- icon_state = "eshield[active]"
- w_class = 4
- playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
- user << "[src] is now active."
- else
- force = 3
- icon_state = "eshield[active]"
- w_class = 1
- playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
- user << "[src] can now be concealed."
- add_fingerprint(user)
- return
\ No newline at end of file
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index e800e72727f..36ee9095232 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -2795,16 +2795,17 @@
A.update_lightsource()
A.busjuke.dir = EAST
message_admins("[key_name_admin(usr)] has spawned an Adminbus. Who gave him the keys?")
+ log_admin("[key_name_admin(usr)] has spawned an Adminbus.")
if("spawnselfdummy")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","TD")
message_admins("[key_name_admin(usr)] spawned himself as a Test Dummy.")
+ log_admin("[key_name_admin(usr)] spawned himself as a Test Dummy.")
var/turf/T = get_turf(usr)
var/mob/living/carbon/human/dummy/D = new /mob/living/carbon/human/dummy(T)
usr.client.cmd_assume_direct_control(D)
D.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(D), slot_w_uniform)
D.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(D), slot_shoes)
- D.equip_to_slot_or_del(new /obj/item/weapon/card/id/admin(D), slot_wear_id)
D.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(D), slot_ears)
D.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(D), slot_back)
D.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(D.back), slot_in_backpack)
@@ -2817,6 +2818,9 @@
newname = "Admin"
D.name = newname
D.real_name = newname
+ var/obj/item/weapon/card/id/admin/admin_id = new(D)
+ admin_id.registered_name = newname
+ D.equip_to_slot_or_del(admin_id, slot_wear_id)
//False flags and bait below. May cause mild hilarity or extreme pain. Now in one button
if("fakealerts")
feedback_inc("admin_secrets_fun_used",1)
diff --git a/code/modules/hydroponics/vines.dm b/code/modules/hydroponics/vines.dm
index 71050f8e9a3..cc1fcb421eb 100644
--- a/code/modules/hydroponics/vines.dm
+++ b/code/modules/hydroponics/vines.dm
@@ -130,14 +130,14 @@
if(prob(seed ? seed.potency : 25))
- if(!locked_atoms.len)
+ if(!locked_atoms || !locked_atoms.len)
var/mob/living/carbon/V = locate() in src.loc
if(V && V.stat != DEAD) // If mob exists and is not dead or captured.
lock_atom(V)
V << "The vines [pick("wind", "tangle", "tighten")] around you!"
// FEED ME, SEYMOUR.
- if(seed && locked_atoms.len)
+ if(seed && locked_atoms && locked_atoms.len)
var/mob/V = locked_atoms[1]
if(V.stat != DEAD) //Don't bother with a dead mob.
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 5a5482f3234..da9097375c6 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -482,7 +482,6 @@ var/global/list/damage_icon_parts = list()
update_mutations(0)
update_mutantrace(0)
update_inv_w_uniform(0)
- update_inv_wear_id(0)
update_inv_gloves(0)
update_inv_glasses(0)
update_inv_ears(0)
@@ -493,6 +492,7 @@ var/global/list/damage_icon_parts = list()
update_inv_belt(0)
update_inv_back(0)
update_inv_wear_suit(0)
+ update_inv_wear_id(0)
update_inv_r_hand(0)
update_inv_l_hand(0)
update_inv_handcuffed(0)
@@ -580,8 +580,9 @@ var/global/list/damage_icon_parts = list()
wear_id.screen_loc = ui_id //TODO
if(w_uniform && w_uniform:displays_id)
var/obj/Overlays/O = obj_overlays[ID_LAYER]
- O.icon = 'icons/mob/mob.dmi'
- O.icon_state = "id"
+ var/obj/item/weapon/card/ID_worn = wear_id
+ O.icon = 'icons/mob/ids.dmi'
+ O.icon_state = ID_worn.icon_state
O.overlays.len = 0
if(wear_id.dynamic_overlay)
if(wear_id.dynamic_overlay["[ID_LAYER]"])
diff --git a/code/modules/overlays/mobs.dm b/code/modules/overlays/mobs.dm
index 13ce274f435..5dc7ff6ec32 100644
--- a/code/modules/overlays/mobs.dm
+++ b/code/modules/overlays/mobs.dm
@@ -14,31 +14,31 @@
/obj/Overlays/uniform_layer
layer = FLOAT_LAYER - 20
-/obj/Overlays/id_layer
+/obj/Overlays/shoes_layer
layer = FLOAT_LAYER - 19
-/obj/Overlays/shoes_layer
+/obj/Overlays/gloves_layer
layer = FLOAT_LAYER - 18
-/obj/Overlays/gloves_layer
+/obj/Overlays/ears_layer
layer = FLOAT_LAYER - 17
-/obj/Overlays/ears_layer
+/obj/Overlays/suit_layer
layer = FLOAT_LAYER - 16
-/obj/Overlays/suit_layer
+/obj/Overlays/glasses_layer
layer = FLOAT_LAYER - 15
-/obj/Overlays/glasses_layer
+/obj/Overlays/belt_layer
layer = FLOAT_LAYER - 14
-/obj/Overlays/belt_layer
+/obj/Overlays/suit_store_layer
layer = FLOAT_LAYER - 13
-/obj/Overlays/suit_store_layer
+/obj/Overlays/back_layer
layer = FLOAT_LAYER - 12
-/obj/Overlays/back_layer
+/obj/Overlays/id_layer
layer = FLOAT_LAYER - 11
/obj/Overlays/hair_layer
diff --git a/code/setup.dm b/code/setup.dm
index 977536f3e61..ba7f242b363 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -1070,15 +1070,15 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
#define MUTATIONS_LAYER 3
#define DAMAGE_LAYER 4
#define UNIFORM_LAYER 5
-#define ID_LAYER 6
-#define SHOES_LAYER 7
-#define GLOVES_LAYER 8
-#define EARS_LAYER 9
-#define SUIT_LAYER 10
-#define GLASSES_LAYER 11
-#define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt?
-#define SUIT_STORE_LAYER 13
-#define BACK_LAYER 14
+#define SHOES_LAYER 6
+#define GLOVES_LAYER 7
+#define EARS_LAYER 8
+#define SUIT_LAYER 9
+#define GLASSES_LAYER 10
+#define BELT_LAYER 11 //Possible make this an overlay of somethign required to wear a belt?
+#define SUIT_STORE_LAYER 12
+#define BACK_LAYER 13
+#define ID_LAYER 14
#define HAIR_LAYER 15 //TODO: make part of head layer?
#define GLASSES_OVER_HAIR_LAYER 16
#define FACEMASK_LAYER 17
diff --git a/html/changelogs/DeityLink_6582.yml b/html/changelogs/DeityLink_6582.yml
new file mode 100644
index 00000000000..14f85dbc85d
--- /dev/null
+++ b/html/changelogs/DeityLink_6582.yml
@@ -0,0 +1,8 @@
+author: Deity Link
+delete-after: true
+changes:
+ - imageadd: Added on-mob sprites for every kinds of IDs.
+ - imageadd: Added on-mob sprites for every kinds of headsets.
+ - tweak: Moved the ID layer above suits and backpacks, so it's less likely to be hidden when it shouldn't.
+ - bugfix: Fixed energy shield sprite not updating when the shield is activated.
+ - bugfix: Fixed spacevine and biomass events being borked and not properly triggering. Welcome back spacevines random events.
diff --git a/icons/mob/ears.dmi b/icons/mob/ears.dmi
index c6eb50c9d7b..bcd592b0755 100644
Binary files a/icons/mob/ears.dmi and b/icons/mob/ears.dmi differ
diff --git a/icons/mob/ids.dmi b/icons/mob/ids.dmi
new file mode 100644
index 00000000000..ee926d6278d
Binary files /dev/null and b/icons/mob/ids.dmi differ
diff --git a/icons/mob/in-hand/left/shields.dmi b/icons/mob/in-hand/left/shields.dmi
index cbbd3fd26fd..78da34e30c9 100644
Binary files a/icons/mob/in-hand/left/shields.dmi and b/icons/mob/in-hand/left/shields.dmi differ
diff --git a/icons/mob/in-hand/right/shields.dmi b/icons/mob/in-hand/right/shields.dmi
index c43c2301c67..bb08fd04767 100644
Binary files a/icons/mob/in-hand/right/shields.dmi and b/icons/mob/in-hand/right/shields.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index c2b31ac2f62..509d5b81e0d 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ