diff --git a/code/__defines/materials.dm b/code/__defines/materials.dm
index e714c46dad7..6b4db86ad64 100644
--- a/code/__defines/materials.dm
+++ b/code/__defines/materials.dm
@@ -20,6 +20,7 @@
#define MAT_SIFLOG "alien log"
#define MAT_HARDWOOD "hardwood"
#define MAT_HARDLOG "hardwood log"
+#define MAT_WOODEN_STICK "wooden stick"
#define MAT_STEELHULL "steel hull"
#define MAT_PLASTEEL "plasteel"
#define MAT_PLASTEELHULL "plasteel hull"
@@ -69,6 +70,7 @@
#define MAT_FANCYBLACK "fancyblack"
#define MAT_FOAM "foam"
#define MAT_FLOKIUM "flockium"
+#define MAT_SMOLEBRICKS "smolebricks"
// cloth materials
#define MAT_WOOL "wool"
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 3055f34022b..5c6e94874e9 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -1,32 +1,22 @@
/* Note from Carnie:
The way datum/mind stuff works has been changed a lot.
Minds now represent IC characters rather than following a client around constantly.
-
Guidelines for using minds properly:
-
- Never mind.transfer_to(ghost). The var/current and var/original of a mind must always be of type mob/living!
ghost.mind is however used as a reference to the ghost's corpse
-
- When creating a new mob for an existing IC character (e.g. cloning a dead guy or borging a brain of a human)
the existing mind of the old mob should be transfered to the new mob like so:
-
mind.transfer_to(new_mob)
-
- You must not assign key= or ckey= after transfer_to() since the transfer_to transfers the client for you.
By setting key or ckey explicitly after transfering the mind with transfer_to you will cause bugs like DCing
the player.
-
- IMPORTANT NOTE 2, if you want a player to become a ghost, use mob.ghostize() It does all the hard work for you.
-
- When creating a new mob which will be a new IC character (e.g. putting a shade in a construct or randomly selecting
a ghost to become a xeno during an event). Simply assign the key or ckey like you've always done.
-
new_mob.key = key
-
The Login proc will handle making a new mob for that mobtype (including setting up stuff like mind.name). Simple!
However if you want that mind to have any special properties like being a traitor etc you will have to do that
yourself.
-
*/
/datum/mind
@@ -82,7 +72,7 @@
purchase_log = list()
..()
-/datum/mind/proc/transfer_to(mob/living/new_character)
+/datum/mind/proc/transfer_to(mob/living/new_character, force = FALSE)
if(!istype(new_character))
to_world_log("## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn")
if(current) //remove ourself from our old body's mind variable
@@ -100,7 +90,7 @@
if(changeling)
new_character.make_changeling()
- if(active)
+ if(active || force)
new_character.key = key //now transfer the key to link the client to our new body
if(new_character.client)
diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm
index d12a28bad70..590bf3cab7d 100644
--- a/code/game/objects/items/devices/translator.dm
+++ b/code/game/objects/items/devices/translator.dm
@@ -73,7 +73,7 @@
if(!L.say_understands(null, langset))
new_message = langset.scramble(new_message)
- to_chat(L, span_filter_say(span_italics(span_bold("[src]") + "translates, ") + " \"[new_message]\""))
+ to_chat(L, span_filter_say(span_italics(span_bold("[src]") + " translates, ") + " \"[new_message]\""))
/obj/item/universal_translator/proc/user_understands(mob/M, mob/living/L, list/message_pieces)
for(var/datum/multilingual_say_piece/S in message_pieces)
diff --git a/code/modules/materials/sheets/organic/wood.dm b/code/modules/materials/sheets/organic/wood.dm
index eec4e1dc628..8139643b17c 100644
--- a/code/modules/materials/sheets/organic/wood.dm
+++ b/code/modules/materials/sheets/organic/wood.dm
@@ -66,9 +66,9 @@
return ..()
/obj/item/stack/material/stick
- name = "wooden stick"
+ name = MAT_WOODEN_STICK
icon_state = "sheet-stick"
- default_type = "wooden stick"
+ default_type = MAT_WOODEN_STICK
strict_color_stacking = TRUE
apply_colour = 1
drop_sound = 'sound/items/drop/wooden.ogg'
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index c09ed9b34df..6d84f5d3934 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -374,6 +374,9 @@
/mob/verb/abandon_mob()
set name = "Return to Menu"
set category = "OOC.Game"
+ if(istype(src, /mob/new_player))
+ to_chat(src, span_boldnotice("You are already in the lobby!"))
+ return
if(stat != DEAD || !ticker)
to_chat(src, span_boldnotice("You must be dead to use this!"))
@@ -443,6 +446,7 @@
if(!client)
log_game("[key] AM failed due to disconnect.")
qdel(M)
+ M.key = null
return
M.has_respawned = TRUE //When we returned to main menu, send respawn message
diff --git a/code/modules/mob/new_player/lobby_browser.dm b/code/modules/mob/new_player/lobby_browser.dm
index a7349886b01..c95eab8cd3a 100644
--- a/code/modules/mob/new_player/lobby_browser.dm
+++ b/code/modules/mob/new_player/lobby_browser.dm
@@ -129,9 +129,10 @@
observer.name = observer.real_name
if(!client.holder && !CONFIG_GET(flag/antag_hud_allowed)) // For new ghosts we remove the verb from even showing up if it's not allowed.
remove_verb(observer, /mob/observer/dead/verb/toggle_antagHUD) // Poor guys, don't know what they are missing!
- observer.key = key
+
+ mind.transfer_to(observer, TRUE)
+
observer.set_respawn_timer(time_till_respawn()) // Will keep their existing time if any, or return 0 and pass 0 into set_respawn_timer which will use the defaults
- observer.client.init_verbs()
qdel(src)
return TRUE
diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm
index 7823dbbcde5..90e866fc414 100644
--- a/code/modules/mob/new_player/login.dm
+++ b/code/modules/mob/new_player/login.dm
@@ -26,8 +26,7 @@
created_for = ckey
- if(!QDELETED(src))
- addtimer(CALLBACK(src, PROC_REF(do_after_login)), 4 SECONDS, TIMER_DELETE_ME)
+ addtimer(CALLBACK(src, PROC_REF(do_after_login)), 4 SECONDS, TIMER_DELETE_ME)
/mob/new_player/proc/do_after_login()
PRIVATE_PROC(TRUE)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 3039fe68a07..c6b94d19fba 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -311,6 +311,7 @@
user.visible_message(span_filter_notice("[user] starts pulling \the [tool] from [target]'s [affected]."), \
span_filter_notice("You start pulling \the [tool] from [target]'s [affected]."))
user.balloon_alert_visible("starts pulling \the [tool] from [target]'s [affected]", "pulling \the [tool] from \the [affected]")
+ return
target.op_stage.current_organ = organ_to_remove
diff --git a/code/modules/vore/smoleworld/smoleworld_vr.dm b/code/modules/vore/smoleworld/smoleworld_vr.dm
index a7e9e74c976..ecda48f3969 100644
--- a/code/modules/vore/smoleworld/smoleworld_vr.dm
+++ b/code/modules/vore/smoleworld/smoleworld_vr.dm
@@ -66,7 +66,7 @@
recipes += new/datum/stack_recipe("smole museum", /obj/structure/smolebuilding/museum, 2, time = 10)
/datum/material/smolebricks
- name = "smolebricks"
+ name = MAT_SMOLEBRICKS
stack_type = /obj/item/stack/material/smolebricks
icon_base = "solid"
icon_reinf = "reinf_over"
@@ -77,13 +77,13 @@
//the actual materials
/obj/item/stack/material/smolebricks
- name = "smolebricks"
+ name = MAT_SMOLEBRICKS
desc = "A collection of tiny colored bricks ready to be built into whatever you want."
icon = 'icons/vore/smoleworld_vr.dmi'
icon_state = "smolematerial"
drop_sound = 'sound/items/drop/smolematerial.ogg'
pickup_sound = 'sound/items/pickup/pillbottle.ogg'
- default_type = "smolebricks"
+ default_type = MAT_SMOLEBRICKS
w_class = ITEMSIZE_SMALL
//smolebrick case to make for easy bricks.