Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-15-10-2025

This commit is contained in:
Roxy
2025-10-15 19:34:41 -04:00
656 changed files with 24772 additions and 15866 deletions
+3 -29
View File
@@ -107,6 +107,7 @@
module = new module(src)
install(module)
START_PROCESSING(SSobj, src)
AddElement(/datum/element/drag_pickup)
/obj/item/mod/control/Destroy()
STOP_PROCESSING(SSobj, src)
@@ -213,14 +214,14 @@
return
clean_up()
/obj/item/mod/control/allow_attack_hand_drop(mob/user)
/obj/item/mod/control/can_mob_unequip(mob/user)
if(user != wearer)
return ..()
if(active)
balloon_alert(wearer, "unit active!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
return
return FALSE
for(var/obj/item/part as anything in get_parts())
if(part.loc != src)
@@ -230,33 +231,6 @@
return ..()
/obj/item/mod/control/mouse_drop_dragged(atom/over_object, mob/user)
if(user != wearer || !istype(over_object, /atom/movable/screen/inventory/hand))
return
if(active)
balloon_alert(wearer, "unit active!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
return
for(var/obj/item/part as anything in get_parts())
if(part.loc != src)
balloon_alert(wearer, "parts extended!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
return
// SKYRAT EDIT ADDITION START - Can't remove your MODsuit from your back when it's still active (as it can cause runtimes and even the MODsuit control unit to delete itself)
if(active)
if(!wearer.incapacitated)
balloon_alert(wearer, "deactivate first!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
return
// SKYRAT EDIT ADDITION END
if(!wearer.incapacitated)
var/atom/movable/screen/inventory/hand/ui_hand = over_object
if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index))
add_fingerprint(user)
/obj/item/mod/control/wrench_act(mob/living/user, obj/item/wrench)
if(seconds_electrified && get_charge() && shock(user))
return ITEM_INTERACT_BLOCKING
+18 -9
View File
@@ -466,6 +466,7 @@
/obj/item/mod/core/plasma/lavaland/Destroy()
QDEL_NULL(particle_effect)
QDEL_NULL(mob_spawner)
return ..()
/obj/item/mod/core/plasma/lavaland/install(obj/item/mod/control/mod_unit)
@@ -480,17 +481,22 @@
SIGNAL_HANDLER
if(mod.active)
particle_effect = new(mod.wearer, /particles/pollen, PARTICLE_ATTACH_MOB)
mob_spawner = mod.wearer.AddComponent(/datum/component/spawner, spawn_types=list(spawned_mob_type), spawn_time=5 SECONDS, max_spawned=3, faction=mod.wearer.faction)
mob_spawner = mod.wearer.AddComponent(/datum/component/spawner, \
spawn_types = list(spawned_mob_type), \
spawn_time = 5 SECONDS, \
max_spawned = 3, \
faction = mod.wearer.faction, \
)
RegisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED, PROC_REF(new_mob))
RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(spread_flowers))
return
else
QDEL_NULL(particle_effect)
UnregisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED)
UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
for(var/datum/mob in mob_spawner.spawned_things)
qdel(mob)
qdel(mob_spawner)
QDEL_NULL(particle_effect)
UnregisterSignal(mob_spawner, COMSIG_SPAWNER_SPAWNED)
UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED)
for(var/datum/mob in mob_spawner.spawned_things)
qdel(mob)
QDEL_NULL(mob_spawner)
/obj/item/mod/core/plasma/lavaland/proc/new_mob(spawner, mob/living/basic/butterfly/lavaland/temporary/spawned)
SIGNAL_HANDLER
@@ -499,6 +505,9 @@
/obj/item/mod/core/plasma/lavaland/proc/spread_flowers(atom/source, atom/oldloc, dir, forced)
SIGNAL_HANDLER
if (!isturf(oldloc))
return
var/static/list/possible_flower_types = list(
/obj/structure/flora/bush/lavendergrass/style_random,
/obj/structure/flora/bush/flowers_yw/style_random,
@@ -506,7 +515,7 @@
/obj/structure/flora/bush/flowers_pp/style_random,
)
var/chosen_type = pick(possible_flower_types)
var/flower_boots = new chosen_type(get_turf(mod.wearer))
var/flower_boots = new chosen_type(oldloc)
animate(flower_boots, alpha = 0, 1 SECONDS)
QDEL_IN(flower_boots, 1 SECONDS)
@@ -26,17 +26,36 @@
head_cover.flash_protect = initial(head_cover.flash_protect)
/obj/item/mod/module/welding/syndicate
name = "MODsuit flash-protected optical suite"
complexity = 0
removable = FALSE
incompatible_modules = list(/obj/item/mod/module/welding, /obj/item/mod/module/welding/syndicate, /obj/item/mod/module/stealth/wraith)
overlay_state_inactive = "module_armorbooster_on"
overlay_state_inactive = "module_armorbooster_off"
use_mod_colors = TRUE
mask_worn_overlay = TRUE
/obj/item/mod/module/welding/syndicate/generate_worn_overlay(obj/item/source, mutable_appearance/standing)
overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]"
if(!mod.wearer || !mod.wearer.combat_mode)
overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]"
else
overlay_state_inactive = "module_armorbooster_on-[mod.skin]"
return ..()
/obj/item/mod/module/welding/syndicate/on_part_activation()
. = ..()
RegisterSignal(mod.wearer, COMSIG_COMBAT_MODE_TOGGLED, PROC_REF(on_combat_mode_toggle))
/obj/item/mod/module/welding/syndicate/on_part_deactivation(deleting = FALSE)
. = ..()
UnregisterSignal(mod.wearer, COMSIG_COMBAT_MODE_TOGGLED)
/// Changes which overlay state we're using depending on combat mode status.
/obj/item/mod/module/welding/syndicate/proc/on_combat_mode_toggle(mob/living/carbon/human/toggler)
SIGNAL_HANDLER
playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
update_clothing_slots()
///T-Ray Scan - Scans the terrain for undertile objects.
/obj/item/mod/module/t_ray
name = "MOD t-ray scan module"
@@ -266,7 +285,7 @@
return ITEM_INTERACT_BLOCKING
/obj/item/tether_anchor/attack_hand_secondary(mob/user, list/modifiers)
if (!can_interact(user) || !user.CanReach(src) || !isturf(loc))
if (!can_interact(user) || !IsReachableBy(user) || !isturf(loc))
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
if(HAS_TRAIT_FROM(user, TRAIT_TETHER_ATTACHED, REF(src)))
@@ -289,10 +308,10 @@
reset_pixel_pos = FALSE
/obj/item/tether_anchor/mouse_drop_receive(atom/target, mob/user, params)
if (!can_interact(user) || !user.CanReach(src) || !isturf(loc))
if (!can_interact(user) || !IsReachableBy(user) || !isturf(loc))
return
if (!isliving(target) || !target.CanReach(src))
if (!isliving(target) || !IsReachableBy(target))
return
if(HAS_TRAIT_FROM(target, TRAIT_TETHER_ATTACHED, REF(src)))
+1 -1
View File
@@ -290,7 +290,7 @@
/obj/item/mod/module/orebag/proc/on_obj_entered(atom/new_loc, atom/movable/arrived, atom/old_loc)
SIGNAL_HANDLER
if(istype(arrived, /obj/item/stack/ore) && !dropping_ores)
if(istype(arrived, /obj/item/stack/ore) && !dropping_ores && old_loc != mod.wearer)
INVOKE_ASYNC(src, PROC_REF(move_ore), arrived)
playsound(mod.wearer, SFX_RUSTLE, 50, TRUE)
+8 -8
View File
@@ -401,15 +401,15 @@
timetokill += seconds_per_tick
/obj/structure/chrono_field/bullet_act(obj/projectile/projectile)
if(istype(projectile, /obj/projectile/energy/chrono_beam))
var/obj/projectile/energy/chrono_beam/beam = projectile
var/obj/item/mod/module/tem/linked_tem = beam.tem_weakref.resolve()
if(linked_tem && istype(linked_tem))
linked_tem.field_connect(src)
return BULLET_ACT_HIT
/obj/structure/chrono_field/projectile_hit(obj/projectile/hitting_projectile, def_zone, piercing_hit, blocked)
if(!istype(hitting_projectile, /obj/projectile/energy/chrono_beam))
return ..()
return ..()
var/obj/projectile/energy/chrono_beam/beam = hitting_projectile
var/obj/item/mod/module/tem/linked_tem = beam.tem_weakref.resolve()
if(linked_tem && istype(linked_tem))
linked_tem.field_connect(src)
return BULLET_ACT_HIT
/obj/structure/chrono_field/assume_air()
return FALSE
+2 -2
View File
@@ -92,9 +92,9 @@
required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK)
/obj/item/mod/module/night/on_activation(mob/activator)
mod.wearer.add_traits(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src))
ADD_TRAIT(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src))
mod.wearer.update_sight()
/obj/item/mod/module/night/on_deactivation(mob/activator, display_message = TRUE, deleting = FALSE)
mod.wearer.remove_traits(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src))
REMOVE_TRAIT(mod.wearer, TRAIT_TRUE_NIGHT_VISION, REF(src))
mod.wearer.update_sight()