diff --git a/code/datums/ai/generic/find_and_set.dm b/code/datums/ai/generic/find_and_set.dm index dd25a730629..f715682b9a0 100644 --- a/code/datums/ai/generic/find_and_set.dm +++ b/code/datums/ai/generic/find_and_set.dm @@ -62,7 +62,10 @@ /datum/ai_behavior/find_and_set/in_hands/given_list /datum/ai_behavior/find_and_set/in_hands/given_list/search_tactic(datum/ai_controller/controller, locate_paths) - var/list/found = typecache_filter_list(controller.pawn, locate_paths) + // VOIDCREW EDIT START - our typecache filter guard rejects a bare atom (voidcrew/edits/__HELPERS/_lists.dm) + var/atom/pawn = controller.pawn + var/list/found = typecache_filter_list(pawn.contents, locate_paths) + // VOIDCREW EDIT END if(length(found)) return pick(found) diff --git a/code/datums/quirks/negative_quirks/indebted.dm b/code/datums/quirks/negative_quirks/indebted.dm index eac2cdf5192..45596864a2b 100644 --- a/code/datums/quirks/negative_quirks/indebted.dm +++ b/code/datums/quirks/negative_quirks/indebted.dm @@ -12,6 +12,10 @@ if(!human_holder.account_id) return var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[human_holder.account_id]"] + // VOIDCREW EDIT START - ship spawns can carry an account_id that isn't registered yet + if(!account) + return + // VOIDCREW EDIT END var/debt = PAYCHECK_CREW * rand(275, 325) account.account_debt += debt RegisterSignal(account, COMSIG_BANK_ACCOUNT_DEBT_PAID, PROC_REF(on_debt_paid)) diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 64c7c71797c..908457dccec 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -700,7 +700,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/remove_and_refresh(atom/movable/gone) SIGNAL_HANDLER - for(var/mob/user as anything in is_using) + for(var/mob/user in is_using) // VOIDCREW EDIT: typed loop skips nulls a hard-deleted viewer leaves behind if(user.client) var/client/cuser = user.client cuser.screen -= gone diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index 72c9c742781..bc95afc4de8 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -23,6 +23,10 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/process_atmos() var/environment_temperature = 0 var/datum/gas_mixture/pipe_air = return_air() + // VOIDCREW EDIT START - no pipenet yet (or anymore), nothing to exchange + if(!pipe_air) + return + // VOIDCREW EDIT END var/turf/local_turf = loc if(istype(local_turf)) diff --git a/code/modules/hallucination/fake_chat.dm b/code/modules/hallucination/fake_chat.dm index 42d16bf3c89..57f3f6937c3 100644 --- a/code/modules/hallucination/fake_chat.dm +++ b/code/modules/hallucination/fake_chat.dm @@ -56,7 +56,7 @@ var/is_radio = force_radio || isnull(speaker) if(is_radio) for(var/datum/mind/crew_mind in shuffle(get_crewmember_minds())) - if(crew_mind == hallucinator.mind) + if(crew_mind == hallucinator.mind || isnull(crew_mind.current)) // VOIDCREW EDIT: a mind with no body has no languages to fake continue var/list/shared_languages = get_hallucinating_spoken_languages(crew_mind.current) & understood_languages if(!length(shared_languages)) diff --git a/code/modules/mob/living/basic/pets/cat/cat_ai.dm b/code/modules/mob/living/basic/pets/cat/cat_ai.dm index 049b894b5d6..37bccac7dd1 100644 --- a/code/modules/mob/living/basic/pets/cat/cat_ai.dm +++ b/code/modules/mob/living/basic/pets/cat/cat_ai.dm @@ -165,7 +165,7 @@ /datum/ai_planning_subtree/find_and_hunt_target/hunt_mice/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/mob/living/living_pawn = controller.pawn - var/list/items_we_carry = typecache_filter_list(living_pawn, controller.blackboard[BB_HUNTABLE_PREY]) + var/list/items_we_carry = typecache_filter_list(living_pawn.contents, controller.blackboard[BB_HUNTABLE_PREY]) // VOIDCREW EDIT: our typecache filter guard rejects a bare atom (voidcrew/edits/__HELPERS/_lists.dm) if(length(items_we_carry)) return return ..() diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm index 4c4ad4075d8..17143ce6a1c 100644 --- a/code/modules/reagents/chem_splash.dm +++ b/code/modules/reagents/chem_splash.dm @@ -111,4 +111,8 @@ for(var/atom/thing as anything in (dview(spread_range, epicenter) & reactable)) var/distance = max(1, get_dist(thing, epicenter)) var/fraction = 0.5 / (2 ** distance) //50/25/12/6... for a 200u splash, 25/12/6/3... for a 100u, 12/6/3/1 for a 50u + // VOIDCREW EDIT START - nothing to expose; expose() stack traces on a zero volume modifier + if(fraction <= 0) + continue + // VOIDCREW EDIT END source.expose(thing, TOUCH, fraction) diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 98d32916c58..7e3fc7b117e 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -506,6 +506,10 @@ addtimer(CALLBACK(src, PROC_REF(animate_eyelids), owner), blink_delay + duration) /obj/item/organ/eyes/proc/animate_eyelids(mob/living/carbon/human/parent) + // VOIDCREW EDIT START - eyes without eyelids (golem crystals) were animating null + if(!eyelid_left || !eyelid_right) + return + // VOIDCREW EDIT END var/sync_blinking = synchronized_blinking && (parent.get_organ_loss(ORGAN_SLOT_BRAIN) < BRAIN_DAMAGE_ASYNC_BLINKING) // Randomize order for unsynched animations if (sync_blinking || prob(50)) diff --git a/voidcrew/modules/lobby_terminal/_lobby_terminal.dm b/voidcrew/modules/lobby_terminal/_lobby_terminal.dm index a673fc86f7a..28d1f89c433 100644 --- a/voidcrew/modules/lobby_terminal/_lobby_terminal.dm +++ b/voidcrew/modules/lobby_terminal/_lobby_terminal.dm @@ -144,7 +144,8 @@ GLOBAL_LIST_EMPTY(lobby_join_locks) /// Skin side of hiding: control off, status bar back, keyboard back on the map (movement keys). /datum/lobby_terminal/proc/hide_control() - if(!owner) + // A logging-out client is still referenced here but winset() on it fails with "bad client". + if(!owner || !(owner in GLOB.clients) || owner.mob?.client != owner) return winset(owner, control_id, "is-visible=false") winset(owner, "mapwindow.status_bar", "is-visible=true") diff --git a/voidcrew/modules/player_outposts/outpost_checkpoint_machinery.dm b/voidcrew/modules/player_outposts/outpost_checkpoint_machinery.dm index ed39edcee8d..1fb7d86e403 100644 --- a/voidcrew/modules/player_outposts/outpost_checkpoint_machinery.dm +++ b/voidcrew/modules/player_outposts/outpost_checkpoint_machinery.dm @@ -100,6 +100,11 @@ if(item in list(builder.internal_rcd, builder.internal_rtd, builder.internal_rpd, builder.internal_rld, builder.internal_painter)) return TRUE return (item in machine.component_parts) || item == machine.circuit || istype(item, /obj/item/radio) + // A construction console's built-in RCD keeps its own access electronics. + if(istype(item.loc, /obj/item/construction/rcd) && ismachinery(item.loc.loc)) + var/obj/item/construction/rcd/tool = item.loc + if(item == tool.airlock_electronics) + return checkpoint_is_machine_fitting(tool) return istype(item, /obj/item/encryptionkey) && istype(item.loc, /obj/item/radio) && ismachinery(item.loc.loc) /// Top off as each machine is placed; the hidden copy may have drawn power while it waited. diff --git a/voidcrew/modules/ship_combat/laser_effect.dm b/voidcrew/modules/ship_combat/laser_effect.dm index d40dbc76edb..2ecfad22ad9 100644 --- a/voidcrew/modules/ship_combat/laser_effect.dm +++ b/voidcrew/modules/ship_combat/laser_effect.dm @@ -385,23 +385,7 @@ var/obj/O = AM O.take_damage(damage, BURN, LASER) - // Damage walls/turfs based on power level - // At low power (below 150%), minimal wall damage - // At high power (150%+), significant wall damage that scales with power - if(impact_loc.density) - var/wall_damage = 0 - if(power_level >= 1.5) - // High power mode: walls take significant damage - // At 150% power: 1.5x base damage - // At 200% power: 3x base damage (scales quadratically for dramatic effect) - var/power_bonus = (power_level - 1) * 2 // 0.5 at 150%, 1.0 at 200% - wall_damage = damage * (1 + power_bonus) - else - // Low power: only 10% damage to walls - wall_damage = damage * 0.1 - - if(wall_damage > 0) - impact_loc.take_damage(wall_damage, BURN, LASER) + // Walls have no integrity, so ship lasers leave them alone. // Small fire effect new /obj/effect/hotspot(impact_loc) diff --git a/voidcrew/modules/shuttle/survey/survey_computer.dm b/voidcrew/modules/shuttle/survey/survey_computer.dm index 91ad8ef8144..46f5eba7c29 100644 --- a/voidcrew/modules/shuttle/survey/survey_computer.dm +++ b/voidcrew/modules/shuttle/survey/survey_computer.dm @@ -537,8 +537,6 @@ if (survey_in_progress) return "in-progress" - if(!data.get_related_celestial_list(object.type)) - log_runtime("Not found [object.type]") if(is_object_surveyed(object)) return "complete" return "unsurveyed" diff --git a/voidcrew/modules/slime_extract_piles/slime_extract_piles.dm b/voidcrew/modules/slime_extract_piles/slime_extract_piles.dm index e33d88c51ed..cd4b9b84c84 100644 --- a/voidcrew/modules/slime_extract_piles/slime_extract_piles.dm +++ b/voidcrew/modules/slime_extract_piles/slime_extract_piles.dm @@ -9,7 +9,7 @@ RegisterSignal(src, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(queue_extract_piling)) queue_extract_piling() -/obj/item/slime_extract/Moved() +/obj/item/slime_extract/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() if(loc != extract_pile_excluded_turf) extract_pile_excluded_turf = null