diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index c81ed8e449..064938ff62 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -36108,10 +36108,7 @@
},
/area/bridge)
"bwA" = (
-/obj/machinery/vending/cigarette{
- pixel_y = 2;
- products = list(/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/storage/box/matches = 10, /obj/item/lighter/greyscale = 4, /obj/item/storage/fancy/rollingpapers = 5)
- },
+/obj/machinery/vending/cigarette,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain/private)
"bwB" = (
@@ -37817,9 +37814,7 @@
dir = 8;
pixel_x = 24
},
-/obj/machinery/vending/cigarette{
- pixel_x = 2
- },
+/obj/machinery/vending/cigarette,
/turf/open/floor/plasteel/dark,
/area/bridge)
"bAa" = (
@@ -42595,9 +42590,7 @@
/turf/open/floor/carpet,
/area/crew_quarters/bar)
"bKo" = (
-/obj/machinery/vending/cigarette{
- pixel_y = 1
- },
+/obj/machinery/vending/cigarette,
/turf/open/floor/carpet,
/area/crew_quarters/bar)
"bKp" = (
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index fa55c9deb4..5936c564ce 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -22,7 +22,7 @@ GLOBAL_PROTECT(config_dir)
config = src
InitEntries()
LoadModes()
- if(LoadEntries("config.txt") <= 1)
+ if(fexists("config/config.txt") && LoadEntries("config.txt") <= 1)
log_config("No $include directives found in config.txt! Loading legacy game_options/dbconfig/comms files...")
LoadEntries("game_options.txt")
LoadEntries("dbconfig.txt")
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index 0877ba66c6..08ef5a28b0 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -187,7 +187,7 @@ Versioning
"gun_fired" = 2)
*/
/datum/controller/subsystem/blackbox/proc/record_feedback(key_type, key, increment, data, overwrite)
- if(sealed || !key_type || !istext(key) || !isnum(increment) || !data)
+ if(sealed || !key_type || !istext(key) || !isnum(increment || !data))
return
var/datum/feedback_variable/FV = find_feedback_datum(key, key_type)
switch(key_type)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index b3545813ac..4e46aeca65 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -108,9 +108,10 @@
var/datum/atom_hud/antag/hud_to_transfer = antag_hud//we need this because leave_hud() will clear this list
var/mob/living/old_current = current
+ if(current)
+ current.transfer_observers_to(new_character) //transfer anyone observing the old character to the new one
current = new_character //associate ourself with our new body
- new_character.mind = src //and associate our new body with ourself
- old_current.transfer_observers_to(current) //transfer anyone observing the old character to the new one
+ new_character.mind = src //and associate our new body with ourself
for(var/a in antag_datums) //Makes sure all antag datums effects are applied in the new body
var/datum/antagonist/A = a
A.on_body_transfer(old_current, current)
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index 51a5778383..a7a6d75bd1 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -26,6 +26,7 @@
var/turf/open/atmos_source //Atmos link source
var/turf/open/atmos_destination //Atmos link destination
var/allow_anchored = FALSE
+ var/innate_accuracy_penalty = 0
/obj/effect/portal/anom
name = "wormhole"
@@ -150,7 +151,7 @@
return
if(ismegafauna(M))
message_admins("[M] has used a portal at [ADMIN_COORDJMP(src)] made by [usr].")
- if(do_teleport(M, real_target, 0))
+ if(do_teleport(M, real_target, innate_accuracy_penalty))
if(istype(M, /obj/item/projectile))
var/obj/item/projectile/P = M
P.ignore_source_check = TRUE
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 6e6a9f8233..de833f2bb1 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -212,6 +212,7 @@
return ..()
/obj/structure/closet/proc/tool_interact(obj/item/W, mob/user)//returns TRUE if attackBy call shouldnt be continued (because tool was used/closet was of wrong type), FALSE if otherwise
+ . = TRUE
if(opened)
if(istype(W, cutting_tool))
if(istype(W, /obj/item/weldingtool))
@@ -221,29 +222,29 @@
playsound(loc, cutting_sound, 40, 1)
if(do_after(user, 40*WT.toolspeed, 1, target = src))
if(!opened || !WT.isOn())
- return TRUE
+ return
playsound(loc, cutting_sound, 50, 1)
user.visible_message("[user] slices apart \the [src].",
"You cut \the [src] apart with \the [WT].",
"You hear welding.")
deconstruct(TRUE)
- return TRUE
+ return
else // for example cardboard box is cut with wirecutters
user.visible_message("[user] cut apart \the [src].", \
"You cut \the [src] apart with \the [W].")
deconstruct(TRUE)
- return TRUE
+ return
if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too
- return TRUE
+ return
else if(istype(W, /obj/item/weldingtool) && can_weld_shut)
var/obj/item/weldingtool/WT = W
if(!WT.remove_fuel(0, user))
- return TRUE
+ return
to_chat(user, "You begin [welded ? "unwelding":"welding"] \the [src]...")
playsound(loc, 'sound/items/welder2.ogg', 40, 1)
if(do_after(user, 40*WT.toolspeed, 1, target = src))
if(opened || !WT.isOn())
- return TRUE
+ return
playsound(loc, WT.usesound, 50, 1)
welded = !welded
user.visible_message("[user] [welded ? "welds shut" : "unweldeds"] \the [src].",
@@ -252,7 +253,7 @@
update_icon()
else if(istype(W, /obj/item/wrench) && anchorable)
if(isinspace() && !anchored)
- return TRUE
+ return
anchored = !anchored
playsound(src.loc, W.usesound, 75, 1)
user.visible_message("[user] [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground.", \
@@ -261,7 +262,6 @@
else if(user.a_intent != INTENT_HARM && !(W.flags_1 & NOBLUDGEON_1))
if(W.GetID() || !toggle(user))
togglelock(user)
- return TRUE
else
return FALSE
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
index f714e3f471..a482b36949 100644
--- a/code/modules/mining/equipment/wormhole_jaunter.dm
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -89,15 +89,11 @@
icon_state = "bhole3"
desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
mech_sized = TRUE //save your ripley
+ innate_accuracy_penalty = 6
/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M)
- if(!ismob(M) && !isobj(M)) //No don't teleport lighting and effects!
- return
-
- if(M.anchored && (!ismob(M) || (ismecha(M) && !mech_sized)))
- return
-
- if(do_teleport(M, hard_target, 6))
+ . = ..()
+ if(.)
// KERPLUNK
playsound(M,'sound/weapons/resonator_blast.ogg',50,1)
if(iscarbon(M))
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index a90923e58f..8b48989c3f 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -110,7 +110,7 @@
var/result = (zone == "r_arm" ? owner.put_in_r_hand(holder) : owner.put_in_l_hand(holder))
if(!result)
- to_chat(owner, "Your [src] fails to activate!")
+ to_chat(owner, "Your [name] fails to activate!")
return
// Activate the hand that now holds our item.
diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm
index 4cedfdf3e3..9d8ab3dc95 100644
--- a/code/modules/vehicles/_vehicle.dm
+++ b/code/modules/vehicles/_vehicle.dm
@@ -86,8 +86,8 @@
if(!istype(M))
return FALSE
remove_control_flags(M, ALL)
- occupants -= M
remove_passenger_actions(M)
+ occupants -= M
cleanup_actions_for_mob(M)
after_remove_occupant(M)
return TRUE
diff --git a/code/modules/vehicles/vehicle_actions.dm b/code/modules/vehicles/vehicle_actions.dm
index 865834495f..905be5b3ba 100644
--- a/code/modules/vehicles/vehicle_actions.dm
+++ b/code/modules/vehicles/vehicle_actions.dm
@@ -1,112 +1,112 @@
-//VEHICLE DEFAULT HANDLING
-/obj/vehicle/proc/generate_actions()
- return
-
-/obj/vehicle/proc/generate_action_type(actiontype)
- var/datum/action/vehicle/A = new actiontype
- if(!istype(A))
- return
- A.vehicle_target = src
- return A
-
-/obj/vehicle/proc/initialize_passenger_action_type(actiontype)
- autogrant_actions_passenger += actiontype
- for(var/i in occupants)
- grant_passenger_actions(i) //refresh
-
-/obj/vehicle/proc/initialize_controller_action_type(actiontype, control_flag)
- LAZYINITLIST(autogrant_actions_controller["[control_flag]"])
- autogrant_actions_controller["[control_flag]"] += actiontype
- for(var/i in occupants)
- grant_controller_actions(i) //refresh
-
-/obj/vehicle/proc/grant_action_type_to_mob(actiontype, mob/m)
- if(!occupants[m] || !actiontype)
- return FALSE
- LAZYINITLIST(occupant_actions[m])
- if(occupant_actions[m][actiontype])
- return TRUE
- var/datum/action/action = generate_action_type(actiontype)
- action.Grant(m)
- occupant_actions[m][action.type] = action
- return TRUE
-
-/obj/vehicle/proc/remove_action_type_from_mob(actiontype, mob/m)
- if(!occupants[m] || !actiontype)
- return FALSE
- LAZYINITLIST(occupant_actions[m])
- if(occupant_actions[m][actiontype])
- var/datum/action/action = occupant_actions[m][actiontype]
- action.Remove(m)
- occupant_actions[m] -= actiontype
- return TRUE
-
-/obj/vehicle/proc/grant_passenger_actions(mob/M)
- for(var/v in autogrant_actions_passenger)
- grant_action_type_to_mob(v, M)
-
-/obj/vehicle/proc/remove_passenger_actions(mob/M)
- for(var/v in autogrant_actions_passenger)
- remove_action_type_from_mob(v, M)
-
-/obj/vehicle/proc/grant_controller_actions(mob/M)
- if(!istype(M) || !occupants[M])
- return FALSE
- for(var/i in GLOB.bitflags)
- if(occupants[M] & i)
- grant_controller_actions_by_flag(M, i)
- return TRUE
-
-/obj/vehicle/proc/remove_controller_actions(mob/M)
- if(!istype(M) || !occupants[M])
- return FALSE
- for(var/i in GLOB.bitflags)
- remove_controller_actions_by_flag(M, i)
- return TRUE
-
-/obj/vehicle/proc/grant_controller_actions_by_flag(mob/M, flag)
- if(!istype(M) || !autogrant_actions_controller["[flag]"])
- return FALSE
- for(var/v in autogrant_actions_controller["[flag]"])
- grant_action_type_to_mob(v, M)
- return TRUE
-
-/obj/vehicle/proc/remove_controller_actions_by_flag(mob/M, flag)
- if(!istype(M) || autogrant_actions_controller["[flag]"])
- return FALSE
- for(var/v in autogrant_actions_controller["[flag]"])
- remove_action_type_from_mob(v, M)
- return TRUE
-
-/obj/vehicle/proc/cleanup_actions_for_mob(mob/M)
- if(!istype(M))
- return FALSE
- LAZYINITLIST(occupant_actions[M])
- for(var/path in occupant_actions[M])
- stack_trace("Leftover action type [path] in vehicle type [type] for mob type [M.type] - THIS SHOULD NOT BE HAPPENING!")
- var/datum/action/action = occupant_actions[M]
- action.Remove(M)
- occupant_actions -= M
- return TRUE
-
-//ACTION DATUMS
-
-/datum/action/vehicle
- check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS
- icon_icon = 'icons/mob/actions/actions_vehicle.dmi'
- button_icon_state = "vehicle_eject"
- var/obj/vehicle/vehicle_target
-
-/datum/action/vehicle/sealed
- var/obj/vehicle/sealed/vehicle_entered_target
-
-/datum/action/vehicle/sealed/climb_out
- name = "Climb Out"
- desc = "Climb out of your vehicle!"
-
-/datum/action/vehicle/sealed/climb_out/Trigger()
- if(..() && istype(vehicle_entered_target))
- vehicle_entered_target.mob_try_exit(owner, owner)
-
-/datum/action/vehicle/ridden
- var/obj/vehicle/ridden/vehicle_ridden_target
+//VEHICLE DEFAULT HANDLING
+/obj/vehicle/proc/generate_actions()
+ return
+
+/obj/vehicle/proc/generate_action_type(actiontype)
+ var/datum/action/vehicle/A = new actiontype
+ if(!istype(A))
+ return
+ A.vehicle_target = src
+ return A
+
+/obj/vehicle/proc/initialize_passenger_action_type(actiontype)
+ autogrant_actions_passenger += actiontype
+ for(var/i in occupants)
+ grant_passenger_actions(i) //refresh
+
+/obj/vehicle/proc/initialize_controller_action_type(actiontype, control_flag)
+ LAZYINITLIST(autogrant_actions_controller["[control_flag]"])
+ autogrant_actions_controller["[control_flag]"] += actiontype
+ for(var/i in occupants)
+ grant_controller_actions(i) //refresh
+
+/obj/vehicle/proc/grant_action_type_to_mob(actiontype, mob/m)
+ if(isnull(occupants[m]) || !actiontype)
+ return FALSE
+ LAZYINITLIST(occupant_actions[m])
+ if(occupant_actions[m][actiontype])
+ return TRUE
+ var/datum/action/action = generate_action_type(actiontype)
+ action.Grant(m)
+ occupant_actions[m][action.type] = action
+ return TRUE
+
+/obj/vehicle/proc/remove_action_type_from_mob(actiontype, mob/m)
+ if(isnull(occupants[m]) || !actiontype)
+ return FALSE
+ LAZYINITLIST(occupant_actions[m])
+ if(occupant_actions[m][actiontype])
+ var/datum/action/action = occupant_actions[m][actiontype]
+ action.Remove(m)
+ occupant_actions[m] -= actiontype
+ return TRUE
+
+/obj/vehicle/proc/grant_passenger_actions(mob/M)
+ for(var/v in autogrant_actions_passenger)
+ grant_action_type_to_mob(v, M)
+
+/obj/vehicle/proc/remove_passenger_actions(mob/M)
+ for(var/v in autogrant_actions_passenger)
+ remove_action_type_from_mob(v, M)
+
+/obj/vehicle/proc/grant_controller_actions(mob/M)
+ if(!istype(M) || isnull(occupants[M]))
+ return FALSE
+ for(var/i in GLOB.bitflags)
+ if(occupants[M] & i)
+ grant_controller_actions_by_flag(M, i)
+ return TRUE
+
+/obj/vehicle/proc/remove_controller_actions(mob/M)
+ if(!istype(M) || isnull(occupants[M]))
+ return FALSE
+ for(var/i in GLOB.bitflags)
+ remove_controller_actions_by_flag(M, i)
+ return TRUE
+
+/obj/vehicle/proc/grant_controller_actions_by_flag(mob/M, flag)
+ if(!istype(M))
+ return FALSE
+ for(var/v in autogrant_actions_controller["[flag]"])
+ grant_action_type_to_mob(v, M)
+ return TRUE
+
+/obj/vehicle/proc/remove_controller_actions_by_flag(mob/M, flag)
+ if(!istype(M))
+ return FALSE
+ for(var/v in autogrant_actions_controller["[flag]"])
+ remove_action_type_from_mob(v, M)
+ return TRUE
+
+/obj/vehicle/proc/cleanup_actions_for_mob(mob/M)
+ if(!istype(M))
+ return FALSE
+ for(var/path in occupant_actions[M])
+ stack_trace("Leftover action type [path] in vehicle type [type] for mob type [M.type] - THIS SHOULD NOT BE HAPPENING!")
+ var/datum/action/action = occupant_actions[M][path]
+ action.Remove(M)
+ occupant_actions[M] -= path
+ occupant_actions -= M
+ return TRUE
+
+//ACTION DATUMS
+
+/datum/action/vehicle
+ check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS
+ icon_icon = 'icons/mob/actions/actions_vehicle.dmi'
+ button_icon_state = "vehicle_eject"
+ var/obj/vehicle/vehicle_target
+
+/datum/action/vehicle/sealed
+ var/obj/vehicle/sealed/vehicle_entered_target
+
+/datum/action/vehicle/sealed/climb_out
+ name = "Climb Out"
+ desc = "Climb out of your vehicle!"
+
+/datum/action/vehicle/sealed/climb_out/Trigger()
+ if(..() && istype(vehicle_entered_target))
+ vehicle_entered_target.mob_try_exit(owner, owner)
+
+/datum/action/vehicle/ridden
+ var/obj/vehicle/ridden/vehicle_ridden_target
diff --git a/html/changelogs/AutoChangeLog-pr-4763.yml b/html/changelogs/AutoChangeLog-pr-4763.yml
new file mode 100644
index 0000000000..2fb922ae43
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4763.yml
@@ -0,0 +1,5 @@
+author: "ShizCalev"
+delete-after: True
+changes:
+ - bugfix: "Meta: The UI for the captain's cigarette vendor now works again."
+ - tweak: "Meta: Removed the omnizine filled syndicate cigarettes from the captain's cigarette vendor."
diff --git a/html/changelogs/AutoChangeLog-pr-4770.yml b/html/changelogs/AutoChangeLog-pr-4770.yml
new file mode 100644
index 0000000000..ce6b44da07
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4770.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "You will now no longer hit closets when attempting to anchor them"
diff --git a/html/changelogs/AutoChangeLog-pr-4771.yml b/html/changelogs/AutoChangeLog-pr-4771.yml
new file mode 100644
index 0000000000..e841a67888
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4771.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - spellcheck: "Fixed mechanical arms grammar when failing to activate"