Skip to content

Commit

Permalink
Merge Upstream 30.01.2025 (#1774)
Browse files Browse the repository at this point in the history
This pull request merges upstream/master. Resolve possible conflicts
manually and make sure all the changes are applied correctly.

## Changelog
:cl: ParadiseSS13
fix: Теневой захват снова работает как задумано. <!-- The shadow grapple
works as intended again.
(www.github.com/ParadiseSS13/Paradise/pull/28068) -->
fix: Исправлена ошибка, из-за которой мехи тратили время восстановления
рукопашной атаки при клике по полу. <!-- Fixed mechas having melee
attack cooldowns taken up by clicking the floor.
(www.github.com/ParadiseSS13/Paradise/pull/28042) -->
fix: Фазоны теперь действительно наносят ожоговый урон в режиме ожога.
<!-- Phazons finally actually deal burn on the burn mode.
(www.github.com/ParadiseSS13/Paradise/pull/28042) -->
tweak: Офисные стулья больше не накладываются друг на друга странным
образом. <!-- Office Chairs do not overlap awkwardly anymore.
(www.github.com/ParadiseSS13/Paradise/pull/27844) -->
fix: Исправлена проблема с консолями камер, которые не следовали за
движущимися камерами (например, видеокамеры, камеры ERT, жучки). <!--
Fixed camera consoles not following moving cameras (e.g. video cameras,
ERT cams, camera bugs) (www.github.com/ParadiseSS13/Paradise/pull/27851)
-->
fix: Исправлено повторяющееся отображение кнопок способностей при
удалении захваченных ксеноморфных органов. <!-- Fixed stacking ability
buttons when removing hijacked xeno organs
(www.github.com/ParadiseSS13/Paradise/pull/28002) -->
fix: ИИ больше не телепортирует диски и семена из манипулятора ДНК
растений в ядро при их извлечении. <!-- AI don’t teleport disks and
seeds from plant DNA manipulator to the core on eject
(www.github.com/ParadiseSS13/Paradise/pull/28017) -->
tweak: Тюремный хлеб Синдиката теперь имеет те же питательные свойства,
что и обычный, которые слегка ниже их прежних значений. <!-- The
syndicate's prison bread now has the same nutritional values as the
regular one, which is slightly less than what it used to be.
(www.github.com/ParadiseSS13/Paradise/pull/28146) -->
tweak: Убран синдром Туретта. <!-- Removed Tourettes
(www.github.com/ParadiseSS13/Paradise/pull/28153) -->
fix: Дистанционные пульты для дверей снова можно помещать в рюкзак. <!--
door remotes can go in backpack again
(www.github.com/ParadiseSS13/Paradise/pull/28140) -->
fix: Исправлен неправильный спрайт газовой маски службы безопасности для
таяран. <!-- Fixed wrong tajaran security gas mask sprite.
(www.github.com/ParadiseSS13/Paradise/pull/28154) -->
add: Добавлены пользовательские автоматы, которые можно настраивать для
продажи и покупки. Повар и бармен могут приобрести набор для таких
автоматов у своих автоматов, а сами автоматы могут быть построены так
же, как стандартные автоматы, при помощи платы, но без необходимости в
наборах для пополнения. <!-- Custom vendors that you can load and buy
from. The chef and bartender can buy a kit from their vendor, and they
can be built with a vending machine board like any other vender, but
don't require a restocking kit.
(www.github.com/ParadiseSS13/Paradise/pull/28009) -->
tweak: Админ-интерфейсы для редактирования переменных и вызова процедур
теперь используют один общий выборщик значений, который позволяет
выбирать объекты, кликая по ним. <!-- Admin UIs for editing variables
and calling procs now share the same value picker, which can now pick
stuff by clicking on it.
(www.github.com/ParadiseSS13/Paradise/pull/28172) -->
fix: Исправлено принуждение мёртвых ИИ к объявлению о новых прибытиях.
<!-- Fixed dead AIs being forced to announce new arrivals
(www.github.com/ParadiseSS13/Paradise/pull/28170) -->
fix: Байкеры теперь могут правильно тащить предметы, находясь в
движении. <!-- Speedbike riders can properly pull things while riding.
(www.github.com/ParadiseSS13/Paradise/pull/28096) -->
fix: Байкеры могут корректно использовать предметы в руках, сидя на
байке. <!-- Speedbike riders can properly use items in their hands while
buckled to the bike. (www.github.com/ParadiseSS13/Paradise/pull/28096)
-->
fix: Предметы для хранения и ёмкости с реагентами больше не "бьются" об
кухонные машины. <!-- Storage items and reagent containers no longer
bonk on kitchen machinery.
(www.github.com/ParadiseSS13/Paradise/pull/28179) -->
fix: Исправлено отображение давления в отчетах анализа газа без режима
детализации. <!-- Corrects the pressure shown on non-detailed gas scan
reports. (www.github.com/ParadiseSS13/Paradise/pull/28174) -->
fix: Мыши больше не будут есть кабели под настилами. <!-- Mice won't eat
cables through catwalks anymore
(www.github.com/ParadiseSS13/Paradise/pull/28157) -->
tweak: Горящие огнемёты и электрокоагуляторы теперь наносят ожоговый
урон при физических атаках. <!-- Lit flamethrowers and cautery deal burn
damage on physical hits
(www.github.com/ParadiseSS13/Paradise/pull/28141) -->
fix: Функция коагуляции требует горящих огнемётов или зажигалок. <!--
Cauterize needs lit flamethrowers or lighters
(www.github.com/ParadiseSS13/Paradise/pull/28141) -->
/:cl:

## Summary by Sourcery

Update vending machines to allow for custom vending products. Fix
several bugs related to shadow grappling, mecha melee attacks, phazon
damage, kitchen appliance interactions, office chair overlapping, camera
consoles, xeno organ removal, AI item teleportation, door remotes, gas
mask sprites, dead AI announcements, traitor tips, speedbike item usage,
gas scan reports, and reagent dispensing. Add custom vending machines,
improve admin UIs for variable editing and procedure calls, add more
chargers to the brig, add fire alarms to various locations, prevent mice
from eating cables through catwalks, make lit flamethrowers and
cauteries deal burn damage, and require lit flamethrowers or lighters
for cauterization.

New Features:
- Add custom vending machines that can be configured for buying and
selling.

Bug Fixes:
- Fix shadow grappling not working as intended.
- Fix mechas having melee attack cooldowns taken up by clicking the
floor.
- Fix phazons not dealing burn damage on burn mode.
- Fix players attempting to hit kitchen machines when inserting
ingredients.
- Fix camera consoles not following moving cameras.
- Fix stacking ability buttons when removing hijacked xeno organs.
- Fix AI teleporting disks and seeds from the plant DNA manipulator to
the core on eject.
- Fix door remotes not being able to be placed in backpacks.
- Fix incorrect tajaran security gas mask sprite.
- Fix dead AIs being forced to announce new arrivals.
- Fix speedbike riders not being able to pull things while riding.
- Fix speedbike riders not being able to use items in their hands while
buckled.
- Fix storage items and reagent containers bonking on kitchen machinery.
- Fix pressure display in non-detailed gas scan reports.

Enhancements:
- Admin UIs for editing variables and calling procs now use a shared
value picker that allows clicking on objects to select them.
  • Loading branch information
AyIong authored Jan 30, 2025
2 parents 69bc459 + 69c1705 commit 9ab1a9c
Show file tree
Hide file tree
Showing 70 changed files with 706 additions and 408 deletions.
24 changes: 18 additions & 6 deletions _maps/map_files/stations/deltastation.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -30932,6 +30932,7 @@
c_tag = "Internal Affairs Office";
dir = 4
},
/obj/machinery/firealarm/directional/north,
/turf/simulated/floor/plasteel/grimy,
/area/station/legal/lawoffice)
"caH" = (
Expand Down Expand Up @@ -31572,9 +31573,6 @@
/area/station/command/office/captain/bedroom)
"cct" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/structure/sign/poster/official/work_for_a_future{
pixel_x = -32
},
/turf/simulated/floor/plasteel/grimy,
/area/station/legal/lawoffice)
"ccu" = (
Expand Down Expand Up @@ -42944,6 +42942,10 @@
icon_state = "whitebluecorner"
},
/area/station/medical/reception)
"cNX" = (
/obj/machinery/firealarm/directional/west,
/turf/simulated/floor/wood,
/area/station/legal/courtroom)
"cNY" = (
/obj/machinery/power/apc/directional/south,
/obj/structure/cable{
Expand Down Expand Up @@ -57045,6 +57047,12 @@
icon_state = "whiteblue"
},
/area/station/medical/cryo)
"erJ" = (
/obj/machinery/firealarm/directional/north,
/turf/simulated/floor/plasteel{
icon_state = "cult"
},
/area/station/legal/magistrate)
"erP" = (
/obj/machinery/camera{
c_tag = "Secure Lab - Test Chamber";
Expand Down Expand Up @@ -83293,6 +83301,10 @@
/obj/effect/spawner/window/reinforced/grilled,
/turf/simulated/floor/plating,
/area/station/engineering/tech_storage)
"sTy" = (
/obj/machinery/firealarm/directional/east,
/turf/simulated/floor/plasteel/dark,
/area/station/legal/courtroom/gallery)
"sUn" = (
/obj/machinery/economy/vending/cola,
/turf/simulated/floor/plasteel/dark,
Expand Down Expand Up @@ -138361,7 +138373,7 @@ cax
mRD
ocx
sxI
eYE
cNX
ejT
eYE
rgU
Expand Down Expand Up @@ -139897,7 +139909,7 @@ oMV
iRk
xPW
caA
cax
sTy
mlY
qJc
bsL
Expand Down Expand Up @@ -141443,7 +141455,7 @@ fjW
xwN
hTV
hTV
bXW
erJ
vjg
bXW
hTV
Expand Down
24 changes: 23 additions & 1 deletion _maps/map_files/stations/emeraldstation.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -35356,6 +35356,16 @@
icon_state = "freezerfloor"
},
/area/station/medical/cloning)
"haD" = (
/obj/machinery/recharger/wallcharger{
pixel_x = 30;
pixel_y = 1
},
/turf/simulated/floor/plasteel{
dir = 4;
icon_state = "darkredcorners"
},
/area/station/security/brig)
"haF" = (
/obj/structure/table/wood,
/obj/item/stack/tape_roll,
Expand Down Expand Up @@ -36291,6 +36301,18 @@
pixel_x = -3;
pixel_y = 5
},
/obj/machinery/recharger/wallcharger{
pixel_x = 30;
pixel_y = 5
},
/obj/machinery/recharger/wallcharger{
pixel_x = 30;
pixel_y = -13
},
/obj/machinery/recharger/wallcharger{
pixel_x = 30;
pixel_y = -4
},
/turf/simulated/floor/plasteel{
dir = 4;
icon_state = "darkredcorners"
Expand Down Expand Up @@ -173427,7 +173449,7 @@ upq
jDu
pXO
snW
tZY
haD
hjy
jLZ
ihH
Expand Down
2 changes: 0 additions & 2 deletions _maps/map_files220/generic/Admin_Zone.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -4087,7 +4087,6 @@
/obj/item/dnainjector/remoteview,
/obj/item/dnainjector/stuttmut,
/obj/item/dnainjector/telemut,
/obj/item/dnainjector/tourmut,
/turf/simulated/floor/wood/oak,
/area/admin)
"oj" = (
Expand Down Expand Up @@ -6713,7 +6712,6 @@
/obj/item/dnainjector/antiremoteview,
/obj/item/dnainjector/antistutt,
/obj/item/dnainjector/antitele,
/obj/item/dnainjector/antitour,
/turf/simulated/floor/wood/oak,
/area/admin)
"xf" = (
Expand Down
2 changes: 0 additions & 2 deletions _maps/map_files220/generic/centcomm_test.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -985,7 +985,6 @@
/obj/item/dnainjector/remoteview,
/obj/item/dnainjector/stuttmut,
/obj/item/dnainjector/telemut,
/obj/item/dnainjector/tourmut,
/turf/simulated/floor/wood/oak,
/area/admin)
"oj" = (
Expand Down Expand Up @@ -1518,7 +1517,6 @@
/obj/item/dnainjector/antiremoteview,
/obj/item/dnainjector/antistutt,
/obj/item/dnainjector/antitele,
/obj/item/dnainjector/antitour,
/turf/simulated/floor/wood/oak,
/area/admin)
"xh" = (
Expand Down
4 changes: 2 additions & 2 deletions code/__DEFINES/dcs/movable_signals.dm
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@
#define COMSIG_MOVABLE_DRIFT_BLOCK_INPUT "movable_drift_block_input"
#define DRIFT_ALLOW_INPUT (1<<0)

///called when the movable's glide size is updated: (new_glide_size)
#define COMSIG_MOVABLE_UPDATE_GLIDE_SIZE "movable_glide_size"
///called after the movable's glide size is updated: (old_glide_size)
#define COMSIG_MOVABLE_UPDATED_GLIDE_SIZE "movable_glide_size"

///signal sent out by an atom when it is no longer pulling something : (atom/pulling)
#define COMSIG_ATOM_NO_LONGER_PULLING "movable_no_longer_pulling"
3 changes: 3 additions & 0 deletions code/__DEFINES/vv.dm
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,6 @@
#define VV_MARKED_DATUM "Marked Datum"
#define VV_BITFIELD "Bitfield"
#define VV_REGEX "Regex"
#define VV_VISIBLE_ATOM "Visible Atom"
#define VV_INSIDE_VISIBLE_ATOM "Inside a Visible Atom"
#define VV_VISIBLE_TURF "Visible Turf"
1 change: 0 additions & 1 deletion code/_globalvars/genetics.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ GLOBAL_VAR_INIT(fakeblock, 0)
GLOBAL_VAR_INIT(coughblock, 0)
GLOBAL_VAR_INIT(glassesblock, 0)
GLOBAL_VAR_INIT(epilepsyblock, 0)
GLOBAL_VAR_INIT(twitchblock, 0)
GLOBAL_VAR_INIT(nervousblock, 0)
GLOBAL_VAR_INIT(wingdingsblock, 0)
GLOBAL_VAR_INIT(monkeyblock, DNA_SE_LENGTH) // Monkey block will always be the DNA_SE_LENGTH
Expand Down
1 change: 1 addition & 0 deletions code/_globalvars/lists/objects.dm
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(pandemics)
GLOBAL_LIST_EMPTY(all_areas)
GLOBAL_LIST_EMPTY(all_unique_areas) // List of all unique areas. AKA areas with there_can_be_many = FALSE
GLOBAL_LIST_EMPTY(machines)
GLOBAL_LIST_EMPTY(telescreens) /// List of entertainment telescreens connected to the "news" cameranet
GLOBAL_LIST_EMPTY(rcd_list) //list of Rapid Construction Devices.

GLOBAL_LIST_EMPTY(apcs)
Expand Down
28 changes: 13 additions & 15 deletions code/controllers/master.dm
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
/// Did inits finish with no one logged in
var/initializations_finished_with_no_players_logged_in

/// The type of the last subsystem to be fire()'d.
var/last_type_processed
/// The last subsystem to be fire()'d.
var/datum/controller/subsystem/last_processed

/// Cache for the loading screen - cleared after
var/list/ss_in_init_order = list()
Expand Down Expand Up @@ -172,7 +172,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
msg += "\t [varname] = [varval]\n"
log_world(msg)

var/datum/controller/subsystem/BadBoy = Master.last_type_processed
var/datum/controller/subsystem/BadBoy = Master.last_processed
var/FireHim = FALSE
if(istype(BadBoy))
msg = null
Expand Down Expand Up @@ -431,8 +431,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
continue

if(queue_head)
if(RunQueue() <= 0) //error running queue
stack_trace("MC: RunQueue failed. Current error_level is [round(error_level, 0.25)]")
if(!RunQueue())
stack_trace("MC: RunQueue returned early during [last_processed.name] ([last_processed.last_task()]). Current error_level is [round(error_level, 0.25)].")
if(error_level > 1) //skip the first error,
if(!SoftReset(tickersubsystems, runlevel_sorted_subsystems))
error_level++
Expand Down Expand Up @@ -501,7 +501,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
/// RunQueue - Run thru the queue of subsystems to run, running them while balancing out their allocated tick precentage
/// Returns 0 if runtimed, a negitive number for logic errors, and a positive number if the operation completed without errors
/datum/controller/master/proc/RunQueue()
. = 0
var/datum/controller/subsystem/queue_node
var/queue_node_flags
var/queue_node_priority
Expand Down Expand Up @@ -537,9 +536,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
bg_calc = TRUE
else if(bg_calc)
//error state, do sane fallback behavior
if(. == 0)
log_world("MC: Queue logic failure, non-background subsystem queued to run after a background subsystem: [queue_node] queue_prev:[queue_node.queue_prev]")
. = -1
var/message = "MC: Queue logic failure, non-background subsystem queued to run after a background subsystem: [queue_node] queue_prev:[queue_node.queue_prev]"
log_world(message)
stack_trace(message)
current_tick_budget = queue_priority_count //this won't even be right, but is the best we have.
bg_calc = FALSE

Expand All @@ -551,9 +550,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
tick_precentage = tick_remaining * (queue_node_priority / current_tick_budget)
else
//error state
if(. == 0)
log_world("MC: tick_budget sync error. [json_encode(list(current_tick_budget, queue_priority_count, queue_priority_count_bg, bg_calc, queue_node, queue_node_priority))]")
. = -1
var/message = "MC: tick_budget sync error. [json_encode(list(current_tick_budget, queue_priority_count, queue_priority_count_bg, bg_calc, queue_node, queue_node_priority))]"
log_world(message)
stack_trace(message)
tick_precentage = tick_remaining //just because we lost track of priority calculations doesn't mean we can't try to finish off the run, if the error state persists, we don't want to stop ticks from happening

tick_precentage = max(tick_precentage*0.5, tick_precentage-queue_node.tick_overrun)
Expand All @@ -563,7 +562,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
ran = TRUE

queue_node_paused = (queue_node.state == SS_PAUSED || queue_node.state == SS_PAUSING)
last_type_processed = queue_node
last_processed = queue_node

queue_node.state = SS_RUNNING

Expand Down Expand Up @@ -613,8 +612,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new

queue_node = queue_node.queue_next

if(. == 0)
. = 1
return TRUE

//resets the queue, and all subsystems, while filtering out the subsystem lists
// called if any mc's queue procs runtime or exit improperly.
Expand Down
4 changes: 4 additions & 0 deletions code/controllers/subsystem.dm
Original file line number Diff line number Diff line change
Expand Up @@ -353,3 +353,7 @@
out["sleep_count"] = fire_sleep_count
out["custom"] = list() // Override as needed on child
return out

/// Allows a subsystem to report what it was doing in case of a silent crash.
/datum/controller/subsystem/proc/last_task()
return "No task specified."
12 changes: 12 additions & 0 deletions code/controllers/subsystem/SSinput.dm
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ SUBSYSTEM_DEF(input)
/// List of clients whose input to process in loop.
var/list/client/processing = list()

var/last_ckey
var/last_x
var/last_y
var/last_z

/datum/controller/subsystem/input/Initialize()
refresh_client_macro_sets()

Expand All @@ -26,6 +31,10 @@ SUBSYSTEM_DEF(input)
set waitfor = FALSE
var/list/to_cull
for(var/client/C in processing)
last_ckey = C.ckey
last_x = C.mob?.x
last_y = C.mob?.y
last_z = C.mob?.z
if(processing[C] + AUTO_CULL_TIME < world.time)
if(!length(C.input_data.keys_held))
LAZYADD(to_cull, C)
Expand All @@ -42,4 +51,7 @@ SUBSYSTEM_DEF(input)
var/client/user = clients[i]
user.set_macros()

/datum/controller/subsystem/input/last_task()
return "[last_ckey] at [last_x], [last_y], [last_z]"

#undef AUTO_CULL_TIME
8 changes: 4 additions & 4 deletions code/datums/components/drift.dm
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
RegisterSignal(movable_parent, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move))
// We will use glide size to intuit how long to delay our loop's next move for
// This way you can't ride two movements at once while drifting, since that'd be dumb as fuck
RegisterSignal(movable_parent, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, PROC_REF(handle_glidesize_update))
RegisterSignal(movable_parent, COMSIG_MOVABLE_UPDATED_GLIDE_SIZE, PROC_REF(handle_glidesize_update))
// If you stop pulling something mid drift, I want it to retain that momentum
RegisterSignal(movable_parent, COMSIG_ATOM_NO_LONGER_PULLING, PROC_REF(stopped_pulling))

Expand All @@ -99,7 +99,7 @@
var/atom/movable/movable_parent = parent
movable_parent.inertia_moving = FALSE
ignore_next_glide = FALSE
UnregisterSignal(movable_parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, COMSIG_ATOM_NO_LONGER_PULLING))
UnregisterSignal(movable_parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UPDATED_GLIDE_SIZE, COMSIG_ATOM_NO_LONGER_PULLING))

/datum/component/drift/proc/before_move(datum/source)
SIGNAL_HANDLER
Expand Down Expand Up @@ -147,7 +147,7 @@
/// We're going to take the passed in glide size
/// and use it to manually delay our loop for that period
/// to allow the other movement to complete
/datum/component/drift/proc/handle_glidesize_update(datum/source, glide_size)
/datum/component/drift/proc/handle_glidesize_update(datum/source, old_glide_size)
SIGNAL_HANDLER
// If we aren't drifting, or this is us, fuck off
var/atom/movable/movable_parent = parent
Expand All @@ -158,7 +158,7 @@
if(ignore_next_glide)
ignore_next_glide = FALSE
return
var/glide_delay = round(world.icon_size / glide_size, 1) * world.tick_lag
var/glide_delay = round(world.icon_size / movable_parent.glide_size, 1) * world.tick_lag
drifting_loop.pause_for(glide_delay)
delayed = TRUE

Expand Down
1 change: 0 additions & 1 deletion code/datums/components/zombie_regen.dm
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@
zomboid.cure_nearsighted()
zomboid.CureMute()
zomboid.CureDeaf()
zomboid.CureTourettes()
zomboid.CureEpilepsy()
zomboid.CureCoughing()
zomboid.CureNervous()
Expand Down
6 changes: 5 additions & 1 deletion code/game/atoms_movable.dm
Original file line number Diff line number Diff line change
Expand Up @@ -743,8 +743,12 @@

/// This proc is recursive, and calls itself to constantly set the glide size of an atom/movable
/atom/movable/proc/set_glide_size(target = 8)
SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, target)
if(glide_size == target)
return

var/old_value = glide_size
glide_size = target
SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATED_GLIDE_SIZE, old_value)

for(var/mob/buckled_mob as anything in buckled_mobs)
buckled_mob.set_glide_size(target)
Expand Down
Loading

0 comments on commit 9ab1a9c

Please sign in to comment.