Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge upstream 25.11.24 #805

Merged
merged 23 commits into from
Nov 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
6d38405
carpenter hammer fits on belt slot (#88109)
carlarctg Nov 24, 2024
3f26a0a
Automatic changelog for PR #88109 [ci skip]
tgstation-ci[bot] Nov 24, 2024
d04d513
Replace `caller` args in pathfinding code with `requester` (#88084)
Absolucy Nov 24, 2024
466db3f
Fixes a runtime in cranial fissure remove code (#88081)
SmArtKar Nov 24, 2024
ef980ea
Automatic changelog for PR #88081 [ci skip]
tgstation-ci[bot] Nov 24, 2024
7b76476
Change some status effects adjustments to use `SECONDS` (#88098)
timothymtorres Nov 24, 2024
cb4591a
Automatic changelog for PR #88098 [ci skip]
tgstation-ci[bot] Nov 24, 2024
85ecad4
Adds a disease that makes you reject gravity. (#87666)
ArcaneMusic Nov 24, 2024
bc843e0
Automatic changelog for PR #87666 [ci skip]
tgstation-ci[bot] Nov 24, 2024
0136605
Automatic changelog compile [ci skip]
tgstation-ci[bot] Nov 25, 2024
a2d463c
Guncode Agony 4.4: Armor as an argument (#88143)
SmArtKar Nov 25, 2024
40d42eb
Automatic changelog for PR #88143 [ci skip]
tgstation-ci[bot] Nov 25, 2024
f720e55
Fixes ghosts being able to make analyzing sounds (#88177)
Hardly3D Nov 25, 2024
b965535
Automatic changelog for PR #88177 [ci skip]
tgstation-ci[bot] Nov 25, 2024
60cbc47
Adds a fuel examine to lighters (#88170)
OrionTheFox Nov 25, 2024
f3a73a3
Automatic changelog for PR #88170 [ci skip]
tgstation-ci[bot] Nov 25, 2024
e4cff96
[NO GBP] Fixes a non-player facing runtime I accidentally left in org…
SmArtKar Nov 25, 2024
8df3ffa
Automatic changelog for PR #88164 [ci skip]
tgstation-ci[bot] Nov 25, 2024
20b9208
fixes raptors breaking their troughs, removes troublesome raptors and…
Ben10Omintrix Nov 25, 2024
f290bd0
Automatic changelog for PR #88153 [ci skip]
tgstation-ci[bot] Nov 25, 2024
4ca8e13
[NO GBP] Ensures that if your brain is removed you die (#88194)
SmArtKar Nov 25, 2024
2bdedeb
Automatic changelog for PR #88194 [ci skip]
tgstation-ci[bot] Nov 25, 2024
f5e99c9
Merge branch 'upstream-master' into merge-upstream
larentoun Nov 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions code/__DEFINES/basic_mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -60,16 +60,10 @@ GLOBAL_LIST_EMPTY(customized_pets)
#define BB_RAPTOR_PLAYFUL "raptor_playful"
///this mob will flee combat when it feels threatened
#define BB_RAPTOR_COWARD "raptor_coward"
///this mob will go out seeking trouble against its kind
#define BB_RAPTOR_TROUBLE_MAKER "raptor_trouble_maker"
///cooldown till we go out cause trouble again
#define BB_RAPTOR_TROUBLE_COOLDOWN "raptor_trouble_maker_cooldown"
///our raptor baby target we will take care of
#define BB_RAPTOR_BABY "raptor_baby"
///the raptor we will heal up
#define BB_INJURED_RAPTOR "injured_raptor"
///the raptor we will bully
#define BB_RAPTOR_VICTIM "raptor_victim"
///the cooldown for next time we eat
#define BB_RAPTOR_EAT_COOLDOWN "raptor_eat_cooldown"
///our trough target
Expand Down
4 changes: 2 additions & 2 deletions code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@
#define COMSIG_ATOM_EMP_ACT "atom_emp_act"
///from base of atom/fire_act(): (exposed_temperature, exposed_volume)
#define COMSIG_ATOM_FIRE_ACT "atom_fire_act"
///from base of atom/bullet_act(): (/obj/projectile, def_zone)
///from base of atom/bullet_act(): (/obj/proj, def_zone, piercing_hit, blocked)
#define COMSIG_ATOM_PRE_BULLET_ACT "pre_atom_bullet_act"
/// All this does is prevent default bullet on_hit from being called, [BULLET_ACT_HIT] being return is implied
#define COMPONENT_BULLET_ACTED (1<<0)
/// Forces bullet act to return [BULLET_ACT_BLOCK], takes priority over above
#define COMPONENT_BULLET_BLOCKED (1<<1)
/// Forces bullet act to return [BULLET_ACT_FORCE_PIERCE], takes priority over above
#define COMPONENT_BULLET_PIERCED (1<<2)
///from base of atom/bullet_act(): (/obj/projectile, def_zone)
///from base of atom/bullet_act(): (/obj/proj, def_zone, piercing_hit, blocked)
#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act"
///from base of atom/CheckParts(): (list/parts_list, datum/crafting_recipe/R)
#define COMSIG_ATOM_CHECKPARTS "atom_checkparts"
Expand Down
14 changes: 7 additions & 7 deletions code/__HELPERS/paths/jps.dm
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@

/datum/pathfind/jps
/// The movable we are pathing
var/atom/movable/caller
var/atom/movable/requester
/// The turf we're trying to path to (note that this won't track a moving target)
var/turf/end
/// The open list/stack we pop nodes out from (TODO: make this a normal list and macro-ize the heap operations to reduce proc overhead)
Expand All @@ -72,9 +72,9 @@
///Defines how we handle diagonal moves. See __DEFINES/path.dm
var/diagonal_handling = DIAGONAL_REMOVE_CLUNKY

/datum/pathfind/jps/proc/setup(atom/movable/caller, list/access, max_distance, simulated_only, avoid, list/datum/callback/on_finish, atom/goal, mintargetdist, skip_first, diagonal_handling)
src.caller = caller
src.pass_info = new(caller, access)
/datum/pathfind/jps/proc/setup(atom/movable/requester, list/access, max_distance, simulated_only, avoid, list/datum/callback/on_finish, atom/goal, mintargetdist, skip_first, diagonal_handling)
src.requester = requester
src.pass_info = new(requester, access)
src.max_distance = max_distance
src.simulated_only = simulated_only
src.avoid = avoid
Expand All @@ -88,12 +88,12 @@

/datum/pathfind/jps/Destroy(force)
. = ..()
caller = null
requester = null
end = null
open = null

/datum/pathfind/jps/start()
start = start || get_turf(caller)
start = start || get_turf(requester)
. = ..()
if(!.)
return .
Expand All @@ -115,7 +115,7 @@
. = ..()
if(!.)
return .
if(QDELETED(caller))
if(QDELETED(requester))
return FALSE

while(!open.is_empty() && !path)
Expand Down
26 changes: 13 additions & 13 deletions code/__HELPERS/paths/path.dm
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* It will yield until a path is returned, using magic
*
* Arguments:
* * caller: The movable atom that's trying to find the path
* * requester: The movable atom that's trying to find the path
* * end: What we're trying to path to. It doesn't matter if this is a turf or some other atom, we're gonna just path to the turf it's on anyway
* * max_distance: The maximum number of steps we can take in a given path to search (default: 30, 0 = infinite)
* * mintargetdistance: Minimum distance to the target before path returns, could be used to get near a target, but not right to it - for an AI mob with a gun, for example.
Expand All @@ -14,16 +14,16 @@
* * skip_first: Whether or not to delete the first item in the path. This would be done because the first item is the starting tile, which can break movement for some creatures.
* * diagonal_handling: defines how we handle diagonal moves. see __DEFINES/path.dm
*/
/proc/get_path_to(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, access=list(), simulated_only = TRUE, turf/exclude, skip_first=TRUE, diagonal_handling=DIAGONAL_REMOVE_CLUNKY)
/proc/get_path_to(atom/movable/requester, atom/end, max_distance = 30, mintargetdist, access=list(), simulated_only = TRUE, turf/exclude, skip_first=TRUE, diagonal_handling=DIAGONAL_REMOVE_CLUNKY)
var/list/hand_around = list()
// We're guaranteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list
var/datum/callback/await = list(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around))
if(!SSpathfinder.pathfind(caller, end, max_distance, mintargetdist, access, simulated_only, exclude, skip_first, diagonal_handling, await))
if(!SSpathfinder.pathfind(requester, end, max_distance, mintargetdist, access, simulated_only, exclude, skip_first, diagonal_handling, await))
return list()

UNTIL(length(hand_around))
var/list/return_val = hand_around[1]
if(!islist(return_val) || (QDELETED(caller) || QDELETED(end))) // It's trash, just hand back empty to make it easy
if(!islist(return_val) || (QDELETED(requester) || QDELETED(end))) // It's trash, just hand back empty to make it easy
return list()
return return_val

Expand All @@ -37,7 +37,7 @@
* It will yield until a path is returned, using magic
*
* Arguments:
* * caller: The movable atom that's trying to find the path
* * requester: The movable atom that's trying to find the path
* * end: What we're trying to path to. It doesn't matter if this is a turf or some other atom, we're gonna just path to the turf it's on anyway
* * max_distance: The maximum number of steps we can take in a given path to search (default: 30, 0 = infinite)
* * mintargetdistance: Minimum distance to the target before path returns, could be used to get near a target, but not right to it - for an AI mob with a gun, for example.
Expand All @@ -47,29 +47,29 @@
* * exclude: If we want to avoid a specific turf, like if we're a mulebot who already got blocked by some turf
* * skip_first: Whether or not to delete the first item in the path. This would be done because the first item is the starting tile, which can break movement for some creatures.
*/
/proc/get_swarm_path_to(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, age = MAP_REUSE_INSTANT, access = list(), simulated_only = TRUE, turf/exclude, skip_first=TRUE)
/proc/get_swarm_path_to(atom/movable/requester, atom/end, max_distance = 30, mintargetdist, age = MAP_REUSE_INSTANT, access = list(), simulated_only = TRUE, turf/exclude, skip_first=TRUE)
var/list/hand_around = list()
// We're guaranteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list
var/datum/callback/await = list(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around))
if(!SSpathfinder.swarmed_pathfind(caller, end, max_distance, mintargetdist, age, access, simulated_only, exclude, skip_first, await))
if(!SSpathfinder.swarmed_pathfind(requester, end, max_distance, mintargetdist, age, access, simulated_only, exclude, skip_first, await))
return list()

UNTIL(length(hand_around))
var/list/return_val = hand_around[1]
if(!islist(return_val) || (QDELETED(caller) || QDELETED(end))) // It's trash, just hand back empty to make it easy
if(!islist(return_val) || (QDELETED(requester) || QDELETED(end))) // It's trash, just hand back empty to make it easy
return list()
return return_val

/proc/get_sssp(atom/movable/caller, max_distance = 30, access = list(), simulated_only = TRUE, turf/exclude)
/proc/get_sssp(atom/movable/requester, max_distance = 30, access = list(), simulated_only = TRUE, turf/exclude)
var/list/hand_around = list()
// We're guaranteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list
var/datum/callback/await = list(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around))
if(!SSpathfinder.build_map(caller, get_turf(caller), max_distance, access, simulated_only, exclude, await))
if(!SSpathfinder.build_map(requester, get_turf(requester), max_distance, access, simulated_only, exclude, await))
return null

UNTIL(length(hand_around))
var/datum/path_map/return_val = hand_around[1]
if(!istype(return_val, /datum/path_map) || (QDELETED(caller))) // It's trash, just hand back null to make it easy
if(!istype(return_val, /datum/path_map) || (QDELETED(requester))) // It's trash, just hand back null to make it easy
return null
return return_val

Expand Down Expand Up @@ -202,7 +202,7 @@
return modified_path

/**
* For seeing if we can actually move between 2 given turfs while accounting for our access and the caller's pass_flags
* For seeing if we can actually move between 2 given turfs while accounting for our access and the requester's pass_flags
*
* Assumes destinantion turf is non-dense - check and shortcircuit in code invoking this proc to avoid overhead.
* Makes some other assumptions, such as assuming that unless declared, non dense objects will not block movement.
Expand Down Expand Up @@ -311,7 +311,7 @@
/// Let's avoid this
var/camera_type

/// Weakref to the caller used to generate this info
/// Weakref to the requester used to generate this info
/// Should not use this almost ever, it's for context and to allow for proc chains that
/// Require a movable
var/datum/weakref/caller_ref = null
Expand Down
4 changes: 2 additions & 2 deletions code/__HELPERS/paths/sssp.dm
Original file line number Diff line number Diff line change
Expand Up @@ -201,8 +201,8 @@
/// Our current position in the working queue
var/working_index

/datum/pathfind/sssp/proc/setup(atom/movable/caller, list/access, turf/center, max_distance, simulated_only, turf/avoid, list/datum/callback/on_finish)
src.pass_info = new(caller, access)
/datum/pathfind/sssp/proc/setup(atom/movable/requester, list/access, turf/center, max_distance, simulated_only, turf/avoid, list/datum/callback/on_finish)
src.pass_info = new(requester, access)
src.start = center
src.max_distance = max_distance
src.simulated_only = simulated_only
Expand Down
22 changes: 11 additions & 11 deletions code/controllers/subsystem/pathfinder.dm
Original file line number Diff line number Diff line change
Expand Up @@ -61,31 +61,31 @@ SUBSYSTEM_DEF(pathfinder)
currentmaps.len--

/// Initiates a pathfind. Returns true if we're good, FALSE if something's failed
/datum/controller/subsystem/pathfinder/proc/pathfind(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, access = list(), simulated_only = TRUE, turf/exclude, skip_first = TRUE, diagonal_handling = DIAGONAL_REMOVE_CLUNKY, list/datum/callback/on_finish)
/datum/controller/subsystem/pathfinder/proc/pathfind(atom/movable/requester, atom/end, max_distance = 30, mintargetdist, access = list(), simulated_only = TRUE, turf/exclude, skip_first = TRUE, diagonal_handling = DIAGONAL_REMOVE_CLUNKY, list/datum/callback/on_finish)
var/datum/pathfind/jps/path = new()
path.setup(caller, access, max_distance, simulated_only, exclude, on_finish, end, mintargetdist, skip_first, diagonal_handling)
path.setup(requester, access, max_distance, simulated_only, exclude, on_finish, end, mintargetdist, skip_first, diagonal_handling)
if(path.start())
active_pathing += path
return TRUE
return FALSE

/// Initiates a swarmed pathfind. Returns TRUE if we're good, FALSE if something's failed
/// If a valid pathmap exists for the TARGET turf we'll use that, otherwise we have to build a new one
/datum/controller/subsystem/pathfinder/proc/swarmed_pathfind(atom/movable/caller, atom/end, max_distance = 30, mintargetdist = 0, age = MAP_REUSE_INSTANT, access = list(), simulated_only = TRUE, turf/exclude, skip_first = TRUE, list/datum/callback/on_finish)
/datum/controller/subsystem/pathfinder/proc/swarmed_pathfind(atom/movable/requester, atom/end, max_distance = 30, mintargetdist = 0, age = MAP_REUSE_INSTANT, access = list(), simulated_only = TRUE, turf/exclude, skip_first = TRUE, list/datum/callback/on_finish)
var/turf/target = get_turf(end)
var/datum/can_pass_info/pass_info = new(caller, access)
var/datum/can_pass_info/pass_info = new(requester, access)
// If there's a map we can use already, use it
var/datum/path_map/valid_map = get_valid_map(pass_info, target, simulated_only, exclude, age, include_building = TRUE)
if(valid_map && valid_map.expand(max_distance))
path_map_passalong(on_finish, get_turf(caller), mintargetdist, skip_first, valid_map)
path_map_passalong(on_finish, get_turf(requester), mintargetdist, skip_first, valid_map)
return TRUE

// Otherwise we're gonna make a new one, and turn it into a path for the callbacks passed into us
var/list/datum/callback/pass_in = list()
pass_in += CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(path_map_passalong), on_finish, get_turf(caller), mintargetdist, skip_first)
pass_in += CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(path_map_passalong), on_finish, get_turf(requester), mintargetdist, skip_first)
// And to allow subsequent calls to reuse the same map, we'll put a placeholder in the cache, and fill it up when the pathing finishes
var/datum/path_map/empty = new()
empty.pass_info = new(caller, access)
empty.pass_info = new(requester, access)
empty.start = target
empty.pass_space = simulated_only
empty.avoid = exclude
Expand Down Expand Up @@ -133,9 +133,9 @@ SUBSYSTEM_DEF(pathfinder)
source_to_maps[target] -= same_target

/// Initiates a SSSP run. Returns true if we're good, FALSE if something's failed
/datum/controller/subsystem/pathfinder/proc/build_map(atom/movable/caller, turf/source, max_distance = 30, access = list(), simulated_only = TRUE, turf/exclude, list/datum/callback/on_finish)
/datum/controller/subsystem/pathfinder/proc/build_map(atom/movable/requester, turf/source, max_distance = 30, access = list(), simulated_only = TRUE, turf/exclude, list/datum/callback/on_finish)
var/datum/pathfind/sssp/path = new()
path.setup(caller, access, source, max_distance, simulated_only, exclude, on_finish)
path.setup(requester, access, source, max_distance, simulated_only, exclude, on_finish)
if(path.start())
active_pathing += path
return TRUE
Expand All @@ -160,7 +160,7 @@ SUBSYSTEM_DEF(pathfinder)
/// Optionally takes a max age to accept (defaults to 0 seconds) and a minimum acceptable range
/// If include_building is true and we can only find a building path, we'll use that instead. tho we will wait for it to finish first
/datum/controller/subsystem/pathfinder/proc/get_valid_map(datum/can_pass_info/pass_info, turf/target, simulated_only = TRUE, turf/exclude, age = MAP_REUSE_INSTANT, min_range = -INFINITY, include_building = FALSE)
// Walk all the maps that match our caller's turf OR our target's
// Walk all the maps that match our requester's turf OR our target's
// Then hold onto em. If their cache time is short we can reuse/expand them, if not we'll have to make a new one
var/oldest_time = world.time - age
/// Backup return value used if no finished pathmaps are found
Expand Down Expand Up @@ -189,7 +189,7 @@ SUBSYSTEM_DEF(pathfinder)
/// Takes a set of pathfind info, returns all valid pathmaps that would work
/// Takes an optional minimum range arg
/datum/controller/subsystem/pathfinder/proc/get_valid_maps(datum/can_pass_info/pass_info, turf/target, simulated_only = TRUE, turf/exclude, age = MAP_REUSE_INSTANT, min_range = -INFINITY, include_building = FALSE)
// Walk all the maps that match our caller's turf OR our target's
// Walk all the maps that match our requester's turf OR our target's
// Then hold onto em. If their cache time is short we can reuse/expand them, if not we'll have to make a new one
var/list/valid_maps = list()
var/oldest_time = world.time - age
Expand Down
2 changes: 1 addition & 1 deletion code/datums/diseases/chronic_illness.dm
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
affected_mob.visible_message(span_warning("[affected_mob] collapses!"))
if(prob(30))
to_chat(affected_mob, span_danger("Your vision blurs as you faint!"))
affected_mob.AdjustSleeping(10)
affected_mob.AdjustSleeping(1 SECONDS)
if(SPT_PROB(0.5, seconds_per_tick))
to_chat(affected_mob, span_danger("[pick("You feel as though your atoms are accelerating in place.", "You feel like you're being torn apart!")]"))
affected_mob.emote("scream")
Expand Down
2 changes: 1 addition & 1 deletion code/datums/diseases/tuberculosis.dm
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
if(SPT_PROB(5, seconds_per_tick))
need_mob_update += affected_mob.adjustStaminaLoss(100, updating_stamina = FALSE)
affected_mob.visible_message(span_warning("[affected_mob] faints!"), span_userdanger("You surrender yourself and feel at peace..."))
affected_mob.AdjustSleeping(100)
affected_mob.AdjustSleeping(10 SECONDS)
if(SPT_PROB(1, seconds_per_tick))
to_chat(affected_mob, span_userdanger("You feel your mind relax and your thoughts drift!"))
affected_mob.adjust_confusion_up_to(8 SECONDS, 100 SECONDS)
Expand Down
43 changes: 43 additions & 0 deletions code/datums/diseases/weightlessness.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/datum/disease/weightlessness
name = "Localized Weightloss Malfunction"
max_stages = 4
spread_text = "On Contact"
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Liquid dark matter"
cures = list(/datum/reagent/liquid_dark_matter)
agent = "Sub-quantum DNA Repulsion"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
spreading_modifier = 0.5
cure_chance = 4
desc = "This disease results in a low level rewrite of the patient's bio-electric signature, causing them to reject the phenomena of \"weight\". Injestion of liquid dark matter tends to stabilize the field."
severity = DISEASE_SEVERITY_MEDIUM
infectable_biotypes = MOB_ORGANIC


/datum/disease/weightlessness/stage_act(seconds_per_tick, times_fired)
. = ..()
if(!.)
return

switch(stage)
if(1)
if(SPT_PROB(1, seconds_per_tick))
to_chat(affected_mob, span_danger("You almost lose your balance for a second."))
if(2)
if(SPT_PROB(3, seconds_per_tick) && !HAS_TRAIT_FROM(affected_mob, TRAIT_MOVE_FLOATING, NO_GRAVITY_TRAIT))
to_chat(affected_mob, span_danger("You feel yourself lift off the ground."))
affected_mob.reagents.add_reagent(/datum/reagent/gravitum, 1)

if(4)
if(SPT_PROB(3, seconds_per_tick) && !affected_mob.has_quirk(/datum/quirk/spacer_born))
to_chat(affected_mob, span_danger("You feel sick as the world starts moving around you."))
affected_mob.adjust_confusion(3 SECONDS)
if(SPT_PROB(8, seconds_per_tick) && !HAS_TRAIT_FROM(affected_mob, TRAIT_MOVE_FLOATING, NO_GRAVITY_TRAIT))
to_chat(affected_mob, span_danger("You suddenly lift off the ground."))
affected_mob.reagents.add_reagent(/datum/reagent/gravitum, 5)

/datum/disease/weightlessness/cure(add_resistance)
. = ..()
affected_mob.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 95, purge_ratio = 0.4)
to_chat(affected_mob, span_danger("You fall to the floor as your body stops rejecting gravity."))
10 changes: 4 additions & 6 deletions code/datums/wounds/cranial_fissure.dm
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,10 @@

/datum/wound/cranial_fissure/remove_wound(ignore_limb, replaced)
REMOVE_TRAIT(limb, TRAIT_IMMUNE_TO_CRANIAL_FISSURE, type)
REMOVE_TRAIT(victim, TRAIT_HAS_CRANIAL_FISSURE, type)

victim.remove_filter(CRANIAL_FISSURE_FILTER_DISPLACEMENT)

UnregisterSignal(victim, COMSIG_MOB_SLIPPED)

if (!isnull(victim))
REMOVE_TRAIT(victim, TRAIT_HAS_CRANIAL_FISSURE, type)
victim.remove_filter(CRANIAL_FISSURE_FILTER_DISPLACEMENT)
UnregisterSignal(victim, COMSIG_MOB_SLIPPED)
return ..()

/datum/wound/cranial_fissure/proc/on_owner_slipped(mob/source)
Expand Down
Loading
Loading