From df83faf5faa26482a1cf28e3b88100f09f105ff9 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:00:55 +0300 Subject: [PATCH 01/22] [MIRROR] Ghost orbit popup double feature: Blackout drunkeness and Nar'Sie runes [MDB IGNORE] (#24439) (#156) * Ghost orbit popup double feature: Blackout drunkeness and Nar'Sie runes (#78982) ## About The Pull Request This adds two new notify_ghosts popups, for Blackout Drunkeness and Nar'Sie Rune Inscription. ## Why It's Good For The Game Nar'Sie rune inscription already has a big announcement, but no orbit prompt. It's an important enough event to warrant having one. The blackout drunkenness period is something that deserves to have an audience. ## Changelog :cl: Rhials qol: Ghosts will now be prompted to orbit when someone loses control due to being blackout drunk. qol: Ghosts will now be prompted to orbit when a cultist begins inscribing a Nar'Sie rune. /:cl: * Ghost orbit popup double feature: Blackout drunkeness and Nar'Sie runes --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com> --- code/datums/brain_damage/split_personality.dm | 1 + code/datums/components/cult_ritual_item.dm | 2 ++ 2 files changed, 3 insertions(+) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index f2120505f72..05b4343a01c 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -253,6 +253,7 @@ /datum/brain_trauma/severe/split_personality/blackout/on_gain() . = ..() RegisterSignal(owner, COMSIG_ATOM_SPLASHED, PROC_REF(on_splashed)) + notify_ghosts("[owner] is blacking out!", source = owner, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Bro I'm not even drunk right now") /datum/brain_trauma/severe/split_personality/blackout/on_lose() . = ..() diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index 65cdcb83fed..6d098ecc44e 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -372,6 +372,8 @@ for(var/shielded_turf in spiral_range_turfs(1, cultist, 1)) LAZYADD(shields, new /obj/structure/emergency_shield/cult/narsie(shielded_turf)) + notify_ghosts("[cultist] has begun scribing a Nar'Sie rune!", source = cultist, action = NOTIFY_ORBIT, header = "Maranax Infirmux!") + return TRUE /* From 572e7c799b25535c8c24f79fc5283145374c0eff Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:01:24 +0300 Subject: [PATCH 02/22] Automatic changelog for PR #156 [ci skip] --- html/changelogs/AutoChangeLog-pr-156.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-156.yml diff --git a/html/changelogs/AutoChangeLog-pr-156.yml b/html/changelogs/AutoChangeLog-pr-156.yml new file mode 100644 index 00000000000..4d289ac24a3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-156.yml @@ -0,0 +1,5 @@ +author: "Rhials" +delete-after: True +changes: + - qol: "Ghosts will now be prompted to orbit when someone loses control due to being blackout drunk." + - qol: "Ghosts will now be prompted to orbit when a cultist begins inscribing a Nar'Sie rune." \ No newline at end of file From 56279d2b31e7a60f202ff675ff9734d913e89527 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:01:36 +0300 Subject: [PATCH 03/22] [MIRROR] [NO GBP] Fix airtank gib not dropping parts or items [MDB IGNORE] (#24441) (#157) * [NO GBP] Fix airtank gib not dropping parts or items (#79088) ## About The Pull Request - Fixes #79086 I missed a `PROC_REF` when I refactored gib code. ## Why It's Good For The Game Keeps the same consistency as before. ## Changelog :cl: fix: Airtank suicides will now drop items and organs again. /:cl: * [NO GBP] Fix airtank gib not dropping parts or items --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Tim --- code/modules/mob/living/carbon/death.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index bbf82ccefc5..78b8554361b 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -19,7 +19,7 @@ BT.on_death() /mob/living/carbon/proc/inflate_gib() // Plays an animation that makes mobs appear to inflate before finally gibbing - addtimer(CALLBACK(src, PROC_REF(gib), null, null, TRUE, TRUE), 25) + addtimer(CALLBACK(src, PROC_REF(gib), DROP_BRAIN|DROP_ORGANS|DROP_ITEMS), 25) var/matrix/M = matrix() M.Scale(1.8, 1.2) animate(src, time = 40, transform = M, easing = SINE_EASING) From 461575ff591a14c8276eee6704822226c6b5c5f1 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:01:54 +0300 Subject: [PATCH 04/22] [MIRROR] fixes oxyloss not knocking people out at 50 [MDB IGNORE] (#24442) (#158) * fixes oxyloss not knocking people out at 50 (#79036) ## About The Pull Request be it far from me to explain why the args not getting put in directly broke this, but reinserting them into the check_passout stuff from #78657 fixes it. should close #79034 but I have no clue if other similar changes to how args were being handled might not have problems elsewhere. ## Why It's Good For The Game atmospheric simulator, breathing mechanics good, also chems and i guess bleeding and whatnot ## Changelog :cl: fix: automatic breathers rejoice. oxyloss now knocks people out again. /:cl: * fixes oxyloss not knocking people out at 50 --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Higgin --- code/modules/mob/living/carbon/carbon_defense.dm | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index a51e9c3430e..874d0854440 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -778,15 +778,14 @@ check_passout() /** -* Check to see if we should be passed out from oyxloss +* Check to see if we should be passed out from oxyloss */ /mob/living/carbon/proc/check_passout() - if(!isnum(oxyloss)) - return - if(oxyloss <= 50) - if(getOxyLoss() > 50) + var/mob_oxyloss = getOxyLoss() + if(mob_oxyloss >= 50) + if(!HAS_TRAIT_FROM(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT)) ADD_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) - else if(getOxyLoss() <= 50) + else if(mob_oxyloss < 50) REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) /mob/living/carbon/get_organic_health() From ecec05ac96c8b865c5276d35b7290711d54c36cb Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:02:06 +0300 Subject: [PATCH 05/22] Automatic changelog for PR #157 [ci skip] --- html/changelogs/AutoChangeLog-pr-157.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-157.yml diff --git a/html/changelogs/AutoChangeLog-pr-157.yml b/html/changelogs/AutoChangeLog-pr-157.yml new file mode 100644 index 00000000000..e3d8436a4d9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-157.yml @@ -0,0 +1,4 @@ +author: "timothymtorres" +delete-after: True +changes: + - bugfix: "Airtank suicides will now drop items and organs again." \ No newline at end of file From 7592d667c42dbec7cdc57e904a3c5b24674ac301 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:02:20 +0300 Subject: [PATCH 06/22] Automatic changelog for PR #158 [ci skip] --- html/changelogs/AutoChangeLog-pr-158.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-158.yml diff --git a/html/changelogs/AutoChangeLog-pr-158.yml b/html/changelogs/AutoChangeLog-pr-158.yml new file mode 100644 index 00000000000..6aeb2e94b21 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-158.yml @@ -0,0 +1,4 @@ +author: "Higgin" +delete-after: True +changes: + - bugfix: "automatic breathers rejoice. oxyloss now knocks people out again." \ No newline at end of file From be4d40f376e5cbaf943f905e0627f85a7a027684 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:02:36 +0300 Subject: [PATCH 07/22] [MIRROR] Medical beds show correct overlay [NO GBP] [MDB IGNORE] (#24437) (#159) * Medical beds show correct overlay [NO GBP] (#79057) ## About The Pull Request Update the overlay if the brakes are on at mapload ## Changelog :cl: LT3 fix: Maploaded medical beds now have correct brake lights /:cl: * Medical beds show correct overlay [NO GBP] --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com> --- code/game/objects/structures/beds_chairs/bed.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index edcec5add3a..4b82aeb5e8e 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -90,6 +90,8 @@ /obj/structure/bed/medical/Initialize(mapload) . = ..() AddElement(/datum/element/noisy_movement) + if(anchored) + update_appearance() /obj/structure/bed/medical/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() From 211cf7f0521b66d49110715f067f3ff42a0cafbf Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:03:04 +0300 Subject: [PATCH 08/22] Automatic changelog for PR #159 [ci skip] --- html/changelogs/AutoChangeLog-pr-159.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-159.yml diff --git a/html/changelogs/AutoChangeLog-pr-159.yml b/html/changelogs/AutoChangeLog-pr-159.yml new file mode 100644 index 00000000000..b7785f49a8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-159.yml @@ -0,0 +1,4 @@ +author: "LT3" +delete-after: True +changes: + - bugfix: "Maploaded medical beds now have correct brake lights" \ No newline at end of file From e7dabbfd732a63a318e70411482bde21f63f2447 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:04:19 +0300 Subject: [PATCH 09/22] [MIRROR] Fixes a bug where your mother would delete your species after calling you a disappointment, rendering you a broken husk of a mob [MDB IGNORE] (#24445) (#160) * Fixes a bug where your mother would delete your species after calling you a disappointment, rendering you a broken husk of a mob (#79098) ## About The Pull Request Yep. So I was investigating why a player was weirdly unable to equip things, or do a lot of stuff. And encountered in the runtime logs that _their species datum was deleted_. How? Well...the answer is...your mother. --- So the hallucination of 'your mother' uses the hallucinator's species datum to create itself here: https://github.com/tgstation/tgstation/blob/07096ffcad0f06ac9276c38275fa4e09e7dece41/code/modules/hallucination/mother.dm#L80 Which then calls set_species, but it passes _your actual species datum in as an arg_ https://github.com/tgstation/tgstation/blob/07096ffcad0f06ac9276c38275fa4e09e7dece41/code/__HELPERS/dynamic_human_icon_gen.dm#L12 which leads to the mob _having your species datum_ https://github.com/tgstation/tgstation/blob/07096ffcad0f06ac9276c38275fa4e09e7dece41/code/datums/dna.dm#L512 Then when mother goes away and deletes herself, so does your species datum. Leaving the hallucinator extremely broken, bugged, and humiliated. @ MrMelbert maybe letting people `set_species()` using an instantiated species datum was a mistake...lol. ## Why It's Good For The Game Nerfs your mother. She is too powerful! ## Changelog :cl: fix: Fixes a bug where your mother would delete your species after calling you a disappointment, rendering you a broken husk of a mob /:cl: * Fixes a bug where your mother would delete your species after calling you a disappointment, rendering you a broken husk of a mob --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/__HELPERS/dynamic_human_icon_gen.dm | 3 +++ code/modules/hallucination/mother.dm | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm index 31957a27600..eb6d53517df 100644 --- a/code/__HELPERS/dynamic_human_icon_gen.dm +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -5,6 +5,9 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) /proc/get_dynamic_human_appearance(outfit_path, species_path = /datum/species/human, mob_spawn_path, r_hand, l_hand, bloody_slots = NONE, animated = TRUE) if(!species_path) return FALSE + if(!ispath(species_path)) + stack_trace("Attempted to call get_dynamic_human_appearance() with an instantiated species_path. Pass the species datum typepath instead.") + return FALSE var/arg_string = "[outfit_path]_[species_path]_[mob_spawn_path]_[l_hand]_[r_hand]_[bloody_slots]" if(GLOB.dynamic_human_appearances[arg_string]) //if already exists in our cache, just return that return GLOB.dynamic_human_appearances[arg_string] diff --git a/code/modules/hallucination/mother.dm b/code/modules/hallucination/mother.dm index 4e2a389260c..70c4f13d173 100644 --- a/code/modules/hallucination/mother.dm +++ b/code/modules/hallucination/mother.dm @@ -77,5 +77,5 @@ /obj/effect/client_image_holder/hallucination/your_mother/Initialize(mapload, list/mobs_which_see_us, datum/hallucination/parent) . = ..() var/mob/living/carbon/hallucinator = parent.hallucinator - image_icon = getFlatIcon(get_dynamic_human_appearance(/datum/outfit/yourmother, hallucinator.dna.species)) + image_icon = getFlatIcon(get_dynamic_human_appearance(/datum/outfit/yourmother, hallucinator.dna.species.type)) regenerate_image() From 93d2c64affe66c5766b83ca4b10aaf3b3b6fab38 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:04:45 +0300 Subject: [PATCH 10/22] Automatic changelog for PR #160 [ci skip] --- html/changelogs/AutoChangeLog-pr-160.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-160.yml diff --git a/html/changelogs/AutoChangeLog-pr-160.yml b/html/changelogs/AutoChangeLog-pr-160.yml new file mode 100644 index 00000000000..a72c1e514a8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-160.yml @@ -0,0 +1,4 @@ +author: "vinylspiders" +delete-after: True +changes: + - bugfix: "Fixes a bug where your mother would delete your species after calling you a disappointment, rendering you a broken husk of a mob" \ No newline at end of file From 33e0d14e7822f8018ed2d1260532fc6df7834108 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:25:41 +0300 Subject: [PATCH 11/22] [MIRROR] Rebalances advanced regenerative mesh recipe [MDB IGNORE] (#24443) (#161) * Rebalances advanced regenerative mesh recipe (#78961) ## About The Pull Request Modifies the amount of cellulose fibers needed to create an advanced regenerative mesh from 20u to 10u. ## Why It's Good For The Game Currently, medicated sutures require 10u of cellulose fiber to create. This means they can be created directly from a (medium complexity) botany crossbreed, as the 5% cellulose fiber gene from tower caps can produce 10u cellulose fibers with the densified chemicals trait. This change allows botanists to create a similar crossbreed which produces advanced regenerative meshes. Lavaland plants, mutations and crosspollination are still needed to complete this, so it's a similarly tough project to the existing suture plant. ## Changelog :cl: balance: reduces cellulose fibers required for advanced regenerative mesh creation from 20u to 10u /:cl: * Rebalances advanced regenerative mesh recipe --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Yttriums <49888953+Yttriums@users.noreply.github.com> --- code/modules/reagents/chemistry/recipes/medicine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index e3f1fd1acef..d62f9cdd48e 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -364,7 +364,7 @@ new /obj/item/stack/medical/suture/medicated(location) /datum/chemical_reaction/medicine/medmesh - required_reagents = list(/datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10) + required_reagents = list(/datum/reagent/cellulose = 10, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10) reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN /datum/chemical_reaction/medicine/medmesh/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) From df452604d92537b5676148d9cf602c84bd65c4b0 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:27:05 +0300 Subject: [PATCH 12/22] [MIRROR] Fixes ai shell deployment not unregistering a death signal properly [MDB IGNORE] (#24444) (#162) * Fixes ai shell deployment not unregistering a death signal properly (#78816) it was screaming runtimes each time an ai disconnected or reconnected to an ai shell because it never unregistered the death disconnect signal properly. ``` [2023-10-01 14:56:38.191] RUNTIME: runtime error: living_death overridden. Use override = TRUE to suppress this warning. - Target: Calaban Default Shell-980 (/mob/living/silicon/robot/shell) Proc: disconnect_shell (code/datums/signals.dm:39) - proc name: stack trace (/proc/_stack_trace) - source file: code/__HELPERS/stack_trace.dm,4 - usr: Calaban (/mob/living/silicon/ai) - src: null - usr.loc: the floor (150,25,4) (/turf/open/floor/circuit) - call stack: - stack trace("living_death overridden. Use o...", "code/datums/signals.dm", 39) - Calaban (/mob/living/silicon/ai): RegisterSignal(Calaban Default Shell-980 (/mob/living/silicon/robot/shell), "living_death", "disconnect_shell", 0) - Calaban (/mob/living/silicon/ai): Deploy to Shell(Calaban Default Shell-980 (/mob/living/silicon/robot/shell)) - Reconnect to shell (/datum/action/innate/deploy_last_shell): Trigger(null) - Reconnect to shell (/atom/movable/screen/movable/action_button): Click(null, "mapwindow.map", "icon-x=12;icon-y=17;left=1;but...") - Reconnect to shell (/atom/movable/screen/movable/action_button): Click(null, "mapwindow.map", "icon-x=12;icon-y=17;left=1;but...") - /datum/callback/verb_callback (/datum/callback/verb_callback): Invoke() - world: push usr(Calaban (/mob/living/silicon/ai), /datum/callback/verb_callback (/datum/callback/verb_callback)) - /datum/callback/verb_callback (/datum/callback/verb_callback): InvokeAsync() - Input (/datum/controller/subsystem/verb_manager/input): run verb queue() - Input (/datum/controller/subsystem/verb_manager/input): fire(0) - Input (/datum/controller/subsystem/verb_manager/input): fire(0) - Input (/datum/controller/subsystem/verb_manager/input): fire(0) - Input (/datum/controller/subsystem/verb_manager/input): ignite(0) - Master (/datum/controller/master): RunQueue() - Master (/datum/controller/master): Loop(2) - Master (/datum/controller/master): StartProcessing(0) ``` shouldn't be player facing i think but who knows maybe we've missed something here on an empty shell death. ai eye resets to the shell's position? no clue lmao it was just fucking annoying * Fixes ai shell deployment not unregistering a death signal properly --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Sealed101 --- code/modules/mob/living/silicon/ai/ai.dm | 1 - code/modules/mob/living/silicon/robot/robot.dm | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index c157603ea83..ab291da5a32 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -1113,7 +1113,6 @@ if(deployed_shell) //Forcibly call back AI in event of things such as damage, EMP or power loss. to_chat(src, span_danger("Your remote connection has been reset!")) deployed_shell.undeploy() - UnregisterSignal(deployed_shell, COMSIG_LIVING_DEATH) diag_hud_set_deployed() /mob/living/silicon/ai/resist() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 373f5e59a4f..3d26ea466af 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -920,15 +920,16 @@ /datum/action/innate/undeployment/Trigger(trigger_flags) if(!..()) return FALSE - var/mob/living/silicon/robot/R = owner + var/mob/living/silicon/robot/shell_to_disconnect = owner - R.undeploy() + shell_to_disconnect.undeploy() return TRUE /mob/living/silicon/robot/proc/undeploy() if(!deployed || !mind || !mainframe) return + mainframe.UnregisterSignal(src, COMSIG_LIVING_DEATH) mainframe.redeploy_action.Grant(mainframe) mainframe.redeploy_action.last_used_shell = src mind.transfer_to(mainframe) From 0279cfa4f79e1e2edba6f5ce5129667bb362d2fa Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:27:53 +0300 Subject: [PATCH 13/22] [MIRROR] [NO GBP]Fix tesla coil zaps. [MDB IGNORE] (#24447) (#163) * [NO GBP]Fix tesla coil zaps. (#79061) ## About The Pull Request Fixes tesla coil zap cutoff being scaled high when it didn't need to. Tesla coil zaps didn't scale with the old power scaling before it got removed, so the tesla coil zaps got nerfed due to the scaling changes of zap effects. This PR does not fix the fact that tesla coil zaps will deal less damage though. An easy clean fix doesn't seem possible, and adding a damage multiplier is cringe. For fixing tesla coil zap damage, the only reasonable solution seems to be to unscale almost every other zapper (the vast majority of them don't seem to be able to power the grid, so it doesn't matter), and then scaling zap damage scaling back up. I haven't setup my development environment yet, so I'll fix that in another PR. ## Why It's Good For The Game So the tesla coil doesn't need unreasonably high requirements to zap properly. ## Changelog :cl: fix: Fixed tesla coil zaps cutting off too early. /:cl: * [NO GBP]Fix tesla coil zaps. --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com> --- code/modules/power/tesla/coil.dm | 2 +- code/modules/power/tesla/energy_ball.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 3cf040b76ef..48facb18f02 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -116,7 +116,7 @@ power = min(surplus(), power) //Take the smaller of the two add_load(power) playsound(src.loc, 'sound/magic/lightningshock.ogg', zap_sound_volume, TRUE, zap_sound_range) - tesla_zap(src, 10, power, zap_flags) + tesla_zap(src, 10, power, 1e3, zap_flags) zap_buckle_check(power) /obj/machinery/power/energy_accumulator/grounding_rod diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 7ee8c0085c9..9298e46512e 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -199,13 +199,13 @@ C.investigate_log("has been dusted by an energy ball.", INVESTIGATE_DEATHS) C.dust() -/proc/tesla_zap(atom/source, zap_range = 3, power, zap_flags = ZAP_DEFAULT_FLAGS, list/shocked_targets = list()) +/proc/tesla_zap(atom/source, zap_range = 3, power, cutoff = 4e5, zap_flags = ZAP_DEFAULT_FLAGS, list/shocked_targets = list()) if(QDELETED(source)) return if(!(zap_flags & ZAP_ALLOW_DUPLICATES)) LAZYSET(shocked_targets, source, TRUE) //I don't want no null refs in my list yeah? . = source.dir - if(power < 4e5) + if(power < cutoff) return /* From c9a410958bc682daa83a835b0e2fce24f5724a14 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:28:10 +0300 Subject: [PATCH 14/22] [MIRROR] [NO GBP] Fix husks fire decay to be slower and allow pyre rite to sacrifice husks [MDB IGNORE] (#24446) (#164) * [NO GBP] Fix husks fire decay to be slower and allow pyre rite to sacrifice husks (#79095) ## About The Pull Request - Fixes #78881 Husks were having their firestacks decay too rapidly to allow chaplains to perform their burning sacrifice rite. The decay rate is lowered and you can now sacrifice husked bodies (caused only by burns) for the pyre rite sacrifice. ## Why It's Good For The Game Pyre sacrifice now is functional. ## Changelog :cl: fix: Fix husks fire decay rate to be slower. Pyre chaplains can now use husked bodies (only caused by burns) to complete their burning sacrifice rite. /:cl: * [NO GBP] Fix husks fire decay to be slower and allow pyre rite to sacrifice husks --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Tim --- code/datums/status_effects/debuffs/fire_stacks.dm | 6 ++---- code/modules/religion/pyre_rites.dm | 12 ++++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 6f31faaefaa..8f52165cdbb 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -147,10 +147,8 @@ if(!on_fire) return TRUE - if(HAS_TRAIT(owner, TRAIT_HUSK)) - adjust_stacks(-2 * seconds_between_ticks) - else - adjust_stacks(owner.fire_stack_decay_rate * seconds_between_ticks) + var/decay_multiplier = HAS_TRAIT(owner, TRAIT_HUSK) ? 2 : 1 // husks decay twice as fast + adjust_stacks(owner.fire_stack_decay_rate * decay_multiplier * seconds_between_ticks) if(stacks <= 0) qdel(src) diff --git a/code/modules/religion/pyre_rites.dm b/code/modules/religion/pyre_rites.dm index d974ef756f2..c36783e6b12 100644 --- a/code/modules/religion/pyre_rites.dm +++ b/code/modules/religion/pyre_rites.dm @@ -43,7 +43,7 @@ /datum/religion_rites/burning_sacrifice name = "Burning Offering" - desc = "Sacrifice a buckled burning corpse for favor, the more burn damage the corpse has the more favor you will receive." + desc = "Sacrifice a buckled burning or husked corpse for favor, the more burn damage the corpse has the more favor you will receive." ritual_length = 15 SECONDS ritual_invocations = list("Burning body ...", "... cleansed by the flame ...", @@ -71,8 +71,8 @@ if(chosen_sacrifice.stat != DEAD) to_chat(user, span_warning("You can only sacrifice dead bodies, this one is still alive!")) return FALSE - if(!chosen_sacrifice.on_fire) - to_chat(user, span_warning("This corpse needs to be on fire to be sacrificed!")) + if(!chosen_sacrifice.on_fire && !HAS_TRAIT_FROM(chosen_sacrifice, TRAIT_HUSK, BURN)) + to_chat(user, span_warning("This corpse needs to be on fire or husked to be sacrificed!")) return FALSE return ..() @@ -82,8 +82,8 @@ to_chat(user, span_warning("The right sacrifice is no longer on the altar!")) chosen_sacrifice = null return FALSE - if(!chosen_sacrifice.on_fire) - to_chat(user, span_warning("The sacrifice is no longer on fire, it needs to burn until the end of the rite!")) + if(!chosen_sacrifice.on_fire && !HAS_TRAIT_FROM(chosen_sacrifice, TRAIT_HUSK, BURN)) + to_chat(user, span_warning("The sacrifice has to be on fire or husked to finish the end of the rite!")) chosen_sacrifice = null return FALSE if(chosen_sacrifice.stat != DEAD) @@ -92,7 +92,7 @@ return FALSE var/favor_gained = 100 + round(chosen_sacrifice.getFireLoss()) GLOB.religious_sect.adjust_favor(favor_gained, user) - to_chat(user, span_notice("[GLOB.deity] absorbs the burning corpse and any trace of fire with it. [GLOB.deity] rewards you with [favor_gained] favor.")) + to_chat(user, span_notice("[GLOB.deity] absorbs the charred corpse and any trace of fire with it. [GLOB.deity] rewards you with [favor_gained] favor.")) chosen_sacrifice.dust(force = TRUE) playsound(get_turf(religious_tool), 'sound/effects/supermatter.ogg', 50, TRUE) chosen_sacrifice = null From b5eea069adf69d894fcbe6167bd53a2bd8b0e7d9 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:28:43 +0300 Subject: [PATCH 15/22] [MODULAR] [NO GBP] Improves the UX of synth wounds + fixes RCDs on collapsed superstructures (#24416) (#165) improves synth wound ux Co-authored-by: nikothedude <59709059+nikothedude@users.noreply.github.com> --- .../wounds/synth/blunt/robotic_blunt_T3.dm | 17 ++++++++-- .../wounds/synth/blunt/secures_internals.dm | 32 +++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/modular_skyrat/modules/medical/code/wounds/synth/blunt/robotic_blunt_T3.dm b/modular_skyrat/modules/medical/code/wounds/synth/blunt/robotic_blunt_T3.dm index aa85498108a..14f6f30a2af 100644 --- a/modular_skyrat/modules/medical/code/wounds/synth/blunt/robotic_blunt_T3.dm +++ b/modular_skyrat/modules/medical/code/wounds/synth/blunt/robotic_blunt_T3.dm @@ -242,7 +242,8 @@ var/has_enough_matter = (treating_rcd.get_matter(user) > ROBOTIC_T3_BLUNT_WOUND_RCD_COST) var/silo_has_enough_materials = (treating_rcd.get_silo_iron() > ROBOTIC_T3_BLUNT_WOUND_RCD_SILO_COST) - if (!silo_has_enough_materials && has_enough_matter) + if (!silo_has_enough_materials && !has_enough_matter) // neither the silo, nor the rcd, has enough + user?.balloon_alert(user, "not enough matter!") return TRUE var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") @@ -291,7 +292,8 @@ set_superstructure_status(TRUE) var/use_amount = (silo_has_enough_materials ? ROBOTIC_T3_BLUNT_WOUND_RCD_SILO_COST : ROBOTIC_T3_BLUNT_WOUND_RCD_COST) - treating_rcd.useResource(use_amount, user) + if (!treating_rcd.useResource(use_amount, user)) + return TRUE if (user) var/misused_text = (misused ? ", though it replaced a bit more than it should've..." : "!") @@ -383,3 +385,14 @@ /datum/wound/blunt/robotic/secures_internals/critical/proc/set_superstructure_status(remedied) superstructure_remedied = remedied ready_to_secure_internals = remedied + +/datum/wound/blunt/robotic/secures_internals/critical/get_wound_step_info() + . = ..() + + if (!superstructure_remedied) + . = "The superstructure must be reformed." + if (!limb_malleable()) + . += " The limb must be heated to thermal overload, then manually molded with a firm grasp" + else + . += " The limb has been sufficiently heated, and can be manually molded with a firm grasp/repeated application of a low-force object" + . += " - OR an RCD may be used with little risk." diff --git a/modular_skyrat/modules/medical/code/wounds/synth/blunt/secures_internals.dm b/modular_skyrat/modules/medical/code/wounds/synth/blunt/secures_internals.dm index 9dd515813ef..e9e9ce3cb68 100644 --- a/modular_skyrat/modules/medical/code/wounds/synth/blunt/secures_internals.dm +++ b/modular_skyrat/modules/medical/code/wounds/synth/blunt/secures_internals.dm @@ -160,7 +160,9 @@ var/their_or_other = (user == victim ? "[user.p_their()]" : "[victim]'s") var/your_or_other = (user == victim ? "your" : "[victim]'s") - var/self_message = span_warning("You start prying open [your_or_other] [limb.plaintext_zone] with [crowbarring_item]...") + var/limb_can_shock_pre_sleep = (victim.stat != DEAD && limb.biological_state & BIO_WIRED) + var/shock_or_not = (limb_can_shock_pre_sleep ? ", risking electrocution" : "") + var/self_message = span_warning("You start prying open [your_or_other] [limb.plaintext_zone] with [crowbarring_item][shock_or_not]...") user?.visible_message(span_bolddanger("[user] starts prying open [their_or_other] [limb.plaintext_zone] with [crowbarring_item]!"), self_message, ignored_mobs = list(victim)) @@ -175,7 +177,7 @@ if (!crowbarring_item.use_tool(target = victim, user = user, delay = (7 SECONDS * delay_mult), volume = 50, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) return TRUE - var/limb_can_shock = (victim.stat != DEAD && limb.biological_state & BIO_WIRED) + var/limb_can_shock = (victim.stat != DEAD && limb.biological_state & BIO_WIRED) // re-define the previous shock variable because we slept var/stunned = FALSE var/message @@ -386,3 +388,29 @@ span_notice("You finish re-soldering [your_or_other] [limb.plaintext_zone]!")) remove_wound() return TRUE + +/// Returns a string with our current treatment step for use in health analyzers. +/datum/wound/blunt/robotic/secures_internals/proc/get_wound_step_info() + var/string + + if (ready_to_resolder) + string = "Apply a welder/cautery to the limb to finalize repairs." + else if (ready_to_secure_internals) + string = "Use a screwdriver/wrench to secure the internals of the limb. This step is best performed by a qualified technician. \ + In absence of one, bone gel or a crowbar may be used." + + return string + +/datum/wound/blunt/robotic/secures_internals/get_scanner_description(mob/user) + . = ..() + + var/wound_step = get_wound_step_info() + if (wound_step) + . += "\n\nCurrent step: [span_notice(wound_step)]" + +/datum/wound/blunt/robotic/secures_internals/get_simple_scanner_description(mob/user) + . = ..() + + var/wound_step = get_wound_step_info() + if (wound_step) + . += "\n\nCurrent step: [span_notice(wound_step)]" From 8d88467861e6fe5d9cdec06b7b8dfbf766ab9444 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:29:23 +0300 Subject: [PATCH 16/22] [DONATOR] Holocigar Ckey Add (#24335) (#166) * Donator item edit -MaSvedish - Holocigar * Update donator_personal.dm Adds people to MaSvedish's donator item * Added another guy --------- Co-authored-by: MaSvedish <104115259+MaSvedish@users.noreply.github.com> Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> --- .../loadouts/loadout_items/donator/personal/donator_personal.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm b/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm index d900accaaee..85ae5aa11c2 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm @@ -667,7 +667,7 @@ /datum/loadout_item/pocket_items/masvedishcigar name = "Holocigar" item_path = /obj/item/clothing/mask/holocigarette/masvedishcigar - ckeywhitelist = list("masvedish", "lutowski", "lawful", "anyacers", "apolloafk", "avianaviator", "notdhu") + ckeywhitelist = list("masvedish", "lutowski", "lawful", "anyacers", "apolloafk", "avianaviator", "notdhu", "plejek") /datum/loadout_item/suit/lt3_armor name = "Silver Jacket Mk II" From 35f6e85aa4464fc7810583d276516b50974eb86b Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:29:38 +0300 Subject: [PATCH 17/22] [MIRROR] A comprehensive refactor / cleanup of `bullet_hit` and `on_hit` to cut out a single bad species / mob proc [MDB IGNORE] (#24430) (#167) * A comprehensive refactor / cleanup of `bullet_hit` and `on_hit` to cut out a single bad species / mob proc (#79024) ## About The Pull Request - Refactored `bullet_act`. Adds `should_call_parent` and refactors associated children to support that. - Fixes silicons sparking off when hit by disabler fire. - Desnowflakes firing range target integrity and cleans up its bullet-hole code a bit. - Cleans up changeling tentacle code a fair bit and fixes it not taking off throw mode if you fail to catch something. - The Sleeping Carp deflection is now signalized - Nightmare projectile dodging is now signalized and sourced from the Nightmare's brain rather than species - Refactored how cardboard cutouts get knocked over to be less snowflaked / use integrity - Also adds projectile `on_hit` `should_call_parent` and cleans up a bit of that, particularly their arguments. - On hit arguments were passed wrong this entire time, it's a good thing nothing relied on that. ## Why It's Good For The Game This is cringe. https://github.com/tgstation/tgstation/blob/1863eb2cd82e7cee4fdfff37b42d3fd0c7edd797/code/modules/mob/living/carbon/human/_species.dm#L1430-L1442 Bullets should overall act more consistent across mob types and objects. ## Changelog :cl: Melbert fix: Silicons don't spark when shot by disablers fix: Changelings who fail to catch something with a tencacle will have throw mode disabled automatically fix: Fixes occasions where you can reflect with Sleeping Carp when you shouldn't be able to fix: Fixes some projectiles causing like 20x less eye blur than they should be refactor: Refactored bullet-mob interactions refactor: Nightmare "shadow dodge" projectile ability is now sourced from their brain /:cl: * A comprehensive refactor / cleanup of `bullet_hit` and `on_hit` to cut out a single bad species / mob proc * Modular changes --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com> --- .../signals_atom/signals_atom_x_act.dm | 8 ++ code/datums/components/singularity.dm | 5 +- code/datums/martial/_martial.dm | 4 - code/datums/martial/sleeping_carp.dm | 27 ++-- code/game/atom_defense.dm | 2 + code/game/atoms.dm | 32 +++-- code/game/objects/effects/phased_mob.dm | 3 +- code/game/objects/items/cardboard_cutouts.dm | 41 +++--- code/game/objects/items/crayons.dm | 3 +- code/game/objects/items/melee/misc.dm | 16 ++- code/game/objects/items/shooting_range.dm | 107 ++++++++------- code/game/objects/obj_defense.dm | 27 +++- code/game/objects/structures/holosign.dm | 18 +-- .../changeling/powers/mutations.dm | 124 +++++++++++------- .../antagonists/heretic/magic/star_blast.dm | 2 +- .../antagonists/nightmare/nightmare_organs.dm | 15 +++ .../nightmare/nightmare_species.dm | 10 -- code/modules/awaymissions/cordon.dm | 3 +- .../modules/capture_the_flag/ctf_equipment.dm | 4 +- code/modules/hydroponics/hydroponics.dm | 6 +- code/modules/hydroponics/seeds.dm | 2 +- .../ruins/lavalandruin_code/biodome_winter.dm | 2 +- .../mining/equipment/kinetic_crusher.dm | 2 +- .../modules/mining/lavaland/megafauna_loot.dm | 2 +- .../mega_arachnid/mega_arachnid_abilities.dm | 2 +- .../jungle/seedling/seedling_projectiles.dm | 2 +- .../basic/lavaland/basilisk/basilisk.dm | 3 + .../basic/lavaland/goldgrub/goldgrub.dm | 15 ++- .../lavaland/watcher/watcher_projectiles.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 2 +- .../mob/living/carbon/human/_species.dm | 14 -- .../mob/living/carbon/human/human_defense.dm | 90 ++++++------- code/modules/mob/living/living_defense.dm | 52 +++++--- .../mob/living/silicon/ai/ai_defense.dm | 4 - .../mob/living/silicon/robot/robot_defense.dm | 12 +- .../mob/living/silicon/silicon_defense.dm | 31 ++--- .../living/simple_animal/bot/SuperBeepsky.dm | 16 ++- .../mob/living/simple_animal/bot/bot.dm | 14 +- .../mob/living/simple_animal/bot/secbot.dm | 5 +- .../simple_animal/hostile/jungle/leaper.dm | 2 +- .../hostile/megafauna/colossus.dm | 3 +- .../hostile/megafauna/demonic_frost_miner.dm | 4 +- .../simple_animal/hostile/megafauna/legion.dm | 1 - .../hostile/mining_mobs/elites/herald.dm | 5 +- .../mob/living/simple_animal/slime/slime.dm | 9 -- .../mod/modules/modules_engineering.dm | 2 +- code/modules/mod/modules/modules_medical.dm | 2 +- code/modules/mod/modules/modules_ninja.dm | 2 +- code/modules/mod/modules/modules_timeline.dm | 8 +- code/modules/pai/defense.dm | 8 +- code/modules/paperwork/paperplane.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 2 +- .../cascade_delam_objects.dm | 19 ++- .../supermatter/supermatter_hit_procs.dm | 15 ++- .../projectiles/ammunition/energy/special.dm | 6 +- .../projectiles/guns/energy/beam_rifle.dm | 7 +- .../projectiles/guns/energy/dueling.dm | 2 +- .../guns/energy/kinetic_accelerator.dm | 3 +- .../projectiles/guns/special/hand_of_midas.dm | 2 +- .../projectiles/guns/special/meat_hook.dm | 2 +- code/modules/projectiles/projectile.dm | 37 ++++-- code/modules/projectiles/projectile/beams.dm | 13 +- .../projectile/bullets/_incendiary.dm | 4 +- .../projectile/bullets/cannonball.dm | 8 +- .../projectile/bullets/dart_syringe.dm | 2 +- .../projectile/bullets/dnainjector.dm | 2 +- .../projectiles/projectile/bullets/grenade.dm | 2 +- .../projectile/bullets/revolver.dm | 6 +- .../projectiles/projectile/bullets/shotgun.dm | 2 +- .../projectiles/projectile/bullets/sniper.dm | 6 +- .../projectiles/projectile/bullets/special.dm | 4 +- .../projectiles/projectile/energy/ebow.dm | 2 +- .../projectile/energy/net_snare.dm | 6 +- .../projectiles/projectile/energy/stun.dm | 2 +- .../projectiles/projectile/energy/tesla.dm | 4 +- code/modules/projectiles/projectile/magic.dm | 38 +++--- .../projectiles/projectile/special/floral.dm | 102 +++++++------- .../projectiles/projectile/special/gravity.dm | 6 +- .../projectiles/projectile/special/ion.dm | 2 +- .../projectiles/projectile/special/meteor.dm | 2 +- .../projectile/special/mindflayer.dm | 2 +- .../projectile/special/neurotoxin.dm | 2 +- .../projectiles/projectile/special/plasma.dm | 2 +- .../projectiles/projectile/special/rocket.dm | 4 +- .../projectile/special/temperature.dm | 2 +- .../projectile/special/wormhole.dm | 6 +- code/modules/religion/burdened/psyker.dm | 2 +- .../xenobiology/crossbreeding/_weapons.dm | 2 +- .../conjure_item/lighting_packet.dm | 2 +- code/modules/vehicles/atv.dm | 7 +- code/modules/vehicles/mecha/mecha_defense.dm | 14 +- .../mob/living/simple_animal/friendly/dogs.dm | 15 ++- .../mothership_astrum/mob.dm | 10 +- .../modules/black_mesa/code/mobs/bullsquid.dm | 2 +- .../modules/cellguns/code/medigun_cells.dm | 28 ++-- .../code/mobs/clockwork_marauder.dm | 12 +- .../reagents/chemistry/reagents/drinks.dm | 8 +- .../modules/gunsgalore/code/ammo/ammo.dm | 2 +- .../modules/medical/code/smartdarts.dm | 2 +- .../modules/microfusion/code/projectiles.dm | 2 +- .../carwo_defense_systems/ammo/grenade.dm | 2 +- .../carwo_defense_systems/ammo/rifle.dm | 4 +- .../modular_weapons/code/pepperball_gun.dm | 2 +- .../modules/mold/code/mold_structures.dm | 8 +- .../novaya_ert/code/surplus_weapons.dm | 2 +- .../modules/shotgunrebalance/code/shotgun.dm | 2 +- .../code/xeno_types/rouny.dm | 4 +- .../code/xeno_types/sentinel.dm | 2 +- 108 files changed, 697 insertions(+), 540 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm index 7a02dbddabb..d5cc72b7640 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm @@ -15,6 +15,14 @@ ///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) +#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) #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" diff --git a/code/datums/components/singularity.dm b/code/datums/components/singularity.dm index 75fd4fd0abc..41b11a219c0 100644 --- a/code/datums/components/singularity.dm +++ b/code/datums/components/singularity.dm @@ -101,7 +101,7 @@ ) AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections) - RegisterSignal(parent, COMSIG_ATOM_BULLET_ACT, PROC_REF(consume_bullets)) + RegisterSignal(parent, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(consume_bullets)) if (notify_admins) admin_investigate_setup() @@ -127,7 +127,7 @@ COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_BSA_BEAM, - COMSIG_ATOM_BULLET_ACT, + COMSIG_ATOM_PRE_BULLET_ACT, COMSIG_ATOM_BUMPED, COMSIG_MOVABLE_PRE_MOVE, COMSIG_ATOM_ATTACKBY, @@ -180,6 +180,7 @@ SIGNAL_HANDLER qdel(projectile) + return COMPONENT_BULLET_BLOCKED /// Calls singularity_act on the thing passed, usually destroying the object /datum/component/singularity/proc/default_singularity_act(atom/thing) diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm index a3c62f5ed3f..c91ae511788 100644 --- a/code/datums/martial/_martial.dm +++ b/code/datums/martial/_martial.dm @@ -101,7 +101,3 @@ if(help_verb) remove_verb(holder_living, help_verb) return - -///Gets called when a projectile hits the owner. Returning anything other than BULLET_ACT_HIT will stop the projectile from hitting the mob. -/datum/martial_art/proc/on_projectile_hit(mob/living/attacker, obj/projectile/P, def_zone) - return BULLET_ACT_HIT diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index cfbb37e08a9..1bc6659dfba 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -15,11 +15,13 @@ return target.add_traits(list(TRAIT_NOGUNS, TRAIT_HARDLY_WOUNDED, TRAIT_NODISMEMBER), SLEEPING_CARP_TRAIT) RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(target, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(hit_by_projectile)) target.faction |= FACTION_CARP //:D /datum/martial_art/the_sleeping_carp/on_remove(mob/living/target) target.remove_traits(list(TRAIT_NOGUNS, TRAIT_HARDLY_WOUNDED, TRAIT_NODISMEMBER), SLEEPING_CARP_TRAIT) UnregisterSignal(target, COMSIG_ATOM_ATTACKBY) + UnregisterSignal(target, COMSIG_ATOM_PRE_BULLET_ACT) target.faction -= FACTION_CARP //:( . = ..() @@ -113,6 +115,8 @@ return ..() /datum/martial_art/the_sleeping_carp/proc/can_deflect(mob/living/carp_user) + if(!can_use(carp_user) || !carp_user.throw_mode) + return FALSE if(carp_user.incapacitated(IGNORE_GRAB)) //NO STUN return FALSE if(!(carp_user.mobility_flags & MOBILITY_USE)) //NO UNABLE TO USE @@ -124,17 +128,20 @@ return FALSE return TRUE -/datum/martial_art/the_sleeping_carp/on_projectile_hit(mob/living/carp_user, obj/projectile/P, def_zone) - . = ..() +/datum/martial_art/the_sleeping_carp/proc/hit_by_projectile(mob/living/carp_user, obj/projectile/hitting_projectile, def_zone) + SIGNAL_HANDLER + if(!can_deflect(carp_user)) - return BULLET_ACT_HIT - if(carp_user.throw_mode) - carp_user.visible_message(span_danger("[carp_user] effortlessly swats the projectile aside! They can block bullets with their bare hands!"), span_userdanger("You deflect the projectile!")) - playsound(get_turf(carp_user), pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) - P.firer = carp_user - P.set_angle(rand(0, 360))//SHING - return BULLET_ACT_FORCE_PIERCE - return BULLET_ACT_HIT + return NONE + + carp_user.visible_message( + span_danger("[carp_user] effortlessly swats [hitting_projectile] aside! [carp_user.p_They()] can block bullets with [carp_user.p_their()] bare hands!"), + span_userdanger("You deflect [hitting_projectile]!"), + ) + playsound(carp_user, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) + hitting_projectile.firer = carp_user + hitting_projectile.set_angle(rand(0, 360))//SHING + return COMPONENT_BULLET_PIERCED ///Signal from getting attacked with an item, for a special interaction with touch spells /datum/martial_art/the_sleeping_carp/proc/on_attackby(mob/living/carp_user, obj/item/attack_weapon, mob/attacker, params) diff --git a/code/game/atom_defense.dm b/code/game/atom_defense.dm index 90533d05f62..889aaba1101 100644 --- a/code/game/atom_defense.dm +++ b/code/game/atom_defense.dm @@ -151,4 +151,6 @@ /// A cut-out proc for [/atom/proc/bullet_act] so living mobs can have their own armor behavior checks without causing issues with needing their own on_hit call /atom/proc/check_projectile_armor(def_zone, obj/projectile/impacting_projectile, is_silent) + if(uses_integrity) + return clamp(PENETRATE_ARMOUR(get_armor_rating(impacting_projectile.armor_flag), impacting_projectile.armour_penetration), 0, 100) return 0 diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 9f3281bb348..31af4ca24e6 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -586,19 +586,33 @@ /** * React to a hit by a projectile object * - * Default behaviour is to send the [COMSIG_ATOM_BULLET_ACT] and then call [on_hit][/obj/projectile/proc/on_hit] on the projectile. - * * @params - * hitting_projectile - projectile - * def_zone - zone hit - * piercing_hit - is this hit piercing or normal? + * * hitting_projectile - projectile + * * def_zone - zone hit + * * piercing_hit - is this hit piercing or normal? */ /atom/proc/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + SHOULD_CALL_PARENT(TRUE) + + var/sigreturn = SEND_SIGNAL(src, COMSIG_ATOM_PRE_BULLET_ACT, hitting_projectile, def_zone) + if(sigreturn & COMPONENT_BULLET_PIERCED) + return BULLET_ACT_FORCE_PIERCE + if(sigreturn & COMPONENT_BULLET_BLOCKED) + return BULLET_ACT_BLOCK + if(sigreturn & COMPONENT_BULLET_ACTED) + return BULLET_ACT_HIT + SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, hitting_projectile, def_zone) - // This armor check only matters for the visuals and messages in on_hit(), it's not actually used to reduce damage since - // only living mobs use armor to reduce damage, but on_hit() is going to need the value no matter what is shot. - var/visual_armor_check = check_projectile_armor(def_zone, hitting_projectile) - . = hitting_projectile.on_hit(src, visual_armor_check, def_zone, piercing_hit) + if(QDELETED(hitting_projectile)) // Signal deleted it? + return BULLET_ACT_BLOCK + + return hitting_projectile.on_hit( + target = src, + // This armor check only matters for the visuals and messages in on_hit(), it's not actually used to reduce damage since + // only living mobs use armor to reduce damage, but on_hit() is going to need the value no matter what is shot. + blocked = check_projectile_armor(def_zone, hitting_projectile), + pierce_hit = piercing_hit, + ) ///Return true if we're inside the passed in atom /atom/proc/in_contents_of(container)//can take class or object instance as argument diff --git a/code/game/objects/effects/phased_mob.dm b/code/game/objects/effects/phased_mob.dm index 273a4c772a5..1456fa350bf 100644 --- a/code/game/objects/effects/phased_mob.dm +++ b/code/game/objects/effects/phased_mob.dm @@ -61,7 +61,8 @@ /obj/effect/dummy/phased_mob/ex_act() return FALSE -/obj/effect/dummy/phased_mob/bullet_act(blah) +/obj/effect/dummy/phased_mob/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + SHOULD_CALL_PARENT(FALSE) return BULLET_ACT_FORCE_PIERCE /obj/effect/dummy/phased_mob/relaymove(mob/living/user, direction) diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index 65cfcfced21..d86f386950c 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -6,6 +6,7 @@ icon_state = "cutout_basic" w_class = WEIGHT_CLASS_BULKY resistance_flags = FLAMMABLE + obj_flags = CAN_BE_HIT item_flags = NO_PIXEL_RANDOM_DROP /// If the cutout is pushed over and has to be righted var/pushed_over = FALSE @@ -35,7 +36,7 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/cardboard_cutout/attack_hand(mob/living/user, list/modifiers) - if(!user.combat_mode || pushed_over) + if(!user.combat_mode || pushed_over || !isturf(loc)) return ..() user.visible_message(span_warning("[user] pushes over [src]!"), span_danger("You push over [src]!")) playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) @@ -60,32 +61,20 @@ /obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/toy/crayon)) change_appearance(I, user) - return - // Why yes, this does closely resemble mob and object attack code. - if(I.item_flags & NOBLUDGEON) - return - if(!I.force) - playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) - else if(I.hitsound) - playsound(loc, I.hitsound, get_clamped_volume(), TRUE, -1) - - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src) - - if(I.force) - user.visible_message(span_danger("[user] hits [src] with [I]!"), \ - span_danger("You hit [src] with [I]!")) - if(prob(I.force)) - push_over() - -/obj/item/cardboard_cutout/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE) - if(istype(P, /obj/projectile/bullet)) - P.on_hit(src, 0, piercing_hit) - visible_message(span_danger("[src] is hit by [P]!")) - playsound(src, 'sound/weapons/slice.ogg', 50, TRUE) - if(prob(P.damage)) + return TRUE + + return ..() + +/obj/item/cardboard_cutout/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) + . = ..() + var/damage_sustained = . || 0 + if((damage_flag == BULLET || damage_flag == MELEE) && (damage_type == BRUTE) && prob(damage_sustained)) push_over() - return BULLET_ACT_HIT + +/obj/item/cardboard_cutout/deconstruct(disassembled) + if(!(flags_1 & (HOLOGRAM_1|NODECONSTRUCT_1))) + new /obj/item/stack/sheet/cardboard(loc, 1) + return ..() /proc/get_cardboard_cutout_instance(datum/cardboard_cutout/cardboard_cutout) ASSERT(ispath(cardboard_cutout), "[cardboard_cutout] is not a path of /datum/cardboard_cutout") diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index bfe1457aa52..7f7f733ad86 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -815,7 +815,8 @@ carbon_target.set_eye_blur_if_lower(6 SECONDS) carbon_target.adjust_temp_blindness(2 SECONDS) if(carbon_target.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS. Warning: don't add a stun here. It's a roundstart item with some quirks. - carbon_target.apply_effects(eyeblur = 5, jitter = 10) + carbon_target.adjust_jitter(1 SECONDS) + carbon_target.adjust_eye_blur(0.5 SECONDS) flash_color(carbon_target, flash_color=paint_color, flash_time=40) if(ishuman(carbon_target) && actually_paints) var/mob/living/carbon/human/human_target = carbon_target diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index cd196ed48cf..77f002c3f1e 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -235,6 +235,7 @@ shard.countdown = null START_PROCESSING(SSobj, src) visible_message(span_warning("[src] appears, balanced ever so perfectly on its hilt. This isn't ominous at all.")) + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(eat_bullets)) /obj/item/melee/supermatter_sword/process() if(balanced || throwing || ismob(src.loc) || isnull(src.loc)) @@ -283,11 +284,16 @@ consume_everything() return TRUE -/obj/item/melee/supermatter_sword/bullet_act(obj/projectile/projectile) - visible_message(span_danger("[projectile] smacks into [src] and rapidly flashes to ash."),\ - span_hear("You hear a loud crack as you are washed with a wave of heat.")) - consume_everything(projectile) - return BULLET_ACT_HIT +/obj/item/melee/supermatter_sword/proc/eat_bullets(datum/source, obj/projectile/hitting_projectile) + SIGNAL_HANDLER + + visible_message( + span_danger("[hitting_projectile] smacks into [source] and rapidly flashes to ash."), + null, + span_hear("You hear a loud crack as you are washed with a wave of heat."), + ) + consume_everything(hitting_projectile) + return COMPONENT_BULLET_BLOCKED /obj/item/melee/supermatter_sword/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] touches [src]'s blade. It looks like [user.p_theyre()] tired of waiting for the radiation to kill [user.p_them()]!")) diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 66df7997f66..ff08886e7d3 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -4,28 +4,75 @@ icon = 'icons/obj/structures.dmi' icon_state = "target_h" density = FALSE - var/hp = 1800 + max_integrity = 1800 + item_flags = CAN_BE_HIT /// Lazylist to keep track of bullet-hole overlays. var/list/bullethole_overlays -/obj/item/target/welder_act(mob/living/user, obj/item/I) - ..() - if(I.use_tool(src, user, 0, volume=40)) - for (var/bullethole in bullethole_overlays) - cut_overlay(bullethole) - bullethole_overlays = null - to_chat(user, span_notice("You slice off [src]'s uneven chunks of aluminium and scorch marks.")) +/obj/item/target/welder_act(mob/living/user, obj/item/tool) + if(tool.use_tool(src, user, 0 SECONDS, volume = 40)) + LAZYNULL(bullethole_overlays) + balloon_alert(user, "target repaired") + update_appearance(UPDATE_OVERLAYS) return TRUE +/obj/item/target/update_overlays() + . = ..() + . |= bullethole_overlays + +/obj/item/target/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + if(prob(25)) + return ..() // RNG change to just not leave a mark, like walls + if(length(overlays) > 35) + return ..() // Too many bullets, we're done here + + // Projectiles which do not deal damage will not leave dent / scorch mark graphics. + // However we snowflake some projectiles to leave them anyway, because they're appropriate. + var/static/list/always_leave_marks + if(isnull(always_leave_marks)) + always_leave_marks = typecacheof(list( + /obj/projectile/beam/practice, + /obj/projectile/beam/laser/carbine/practice, + )) + + var/is_invalid_damage = hitting_projectile.damage_type != BRUTE && hitting_projectile.damage_type != BURN + var/is_safe = !hitting_projectile.is_hostile_projectile() + var/is_generic_projectile = !is_type_in_typecache(hitting_projectile, always_leave_marks) + if(is_generic_projectile && (is_invalid_damage || is_safe)) + return ..() // Don't bother unless it's real shit + + var/p_x = hitting_projectile.p_x + pick(0, 0, 0, 0, 0, -1, 1) // really ugly way of coding "sometimes offset p_x!" + var/p_y = hitting_projectile.p_y + pick(0, 0, 0, 0, 0, -1, 1) + var/icon/our_icon = icon(icon, icon_state) + if(!our_icon.GetPixel(p_x, p_y) || hitting_projectile.original != src) + return BULLET_ACT_FORCE_PIERCE // We, "missed", I guess? + + . = ..() + if(. != BULLET_ACT_HIT) + return + + var/image/bullet_hole = image('icons/effects/effects.dmi', "dent", OBJ_LAYER + 0.5) + bullet_hole.pixel_x = p_x - 1 //offset correction + bullet_hole.pixel_y = p_y - 1 + if(hitting_projectile.damage_type != BRUTE) + bullet_hole.setDir(pick(GLOB.cardinals))// random scorch design + if(hitting_projectile.damage < 20 && is_generic_projectile) + bullet_hole.icon_state = "light_scorch" + else + bullet_hole.icon_state = "scorch" + + LAZYADD(bullethole_overlays, bullet_hole) + update_appearance(UPDATE_OVERLAYS) + /obj/item/target/syndicate icon_state = "target_s" desc = "A shooting target that looks like syndicate scum." - hp = 2600 + max_integrity = 2600 /obj/item/target/alien icon_state = "target_q" desc = "A shooting target that looks like a xenomorphic alien." - hp = 2350 + max_integrity = 2350 /obj/item/target/alien/anchored anchored = TRUE @@ -33,44 +80,8 @@ /obj/item/target/clown icon_state = "target_c" desc = "A shooting target that looks like a useless clown." - hp = 2000 - -#define DECALTYPE_SCORCH 1 -#define DECALTYPE_BULLET 2 + max_integrity = 2000 /obj/item/target/clown/bullet_act(obj/projectile/P) . = ..() - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE) - -/obj/item/target/bullet_act(obj/projectile/P) - if(istype(P, /obj/projectile/bullet)) // If it's a foam dart, don't bother with any of this other shit - return P.on_hit(src, 0) - var/p_x = P.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset P.p_x!" - var/p_y = P.p_y + pick(0,0,0,0,0,-1,1) - var/decaltype = DECALTYPE_SCORCH - if(istype(P, /obj/projectile/bullet)) - decaltype = DECALTYPE_BULLET - var/icon/C = icon(icon,icon_state) - if(C.GetPixel(p_x, p_y) && P.original == src && overlays.len <= 35) // if the located pixel isn't blank (null) - hp -= P.damage - if(hp <= 0) - visible_message(span_danger("[src] breaks into tiny pieces and collapses!")) - qdel(src) - var/image/bullet_hole = image('icons/effects/effects.dmi', "scorch", OBJ_LAYER + 0.5) - bullet_hole.pixel_x = p_x - 1 //offset correction - bullet_hole.pixel_y = p_y - 1 - if(decaltype == DECALTYPE_SCORCH) - bullet_hole.setDir(pick(NORTH,SOUTH,EAST,WEST))// random scorch design - if(P.damage >= 20 || istype(P, /obj/projectile/beam/practice)) - bullet_hole.setDir(pick(NORTH,SOUTH,EAST,WEST)) - else - bullet_hole.icon_state = "light_scorch" - else - bullet_hole.icon_state = "dent" - LAZYADD(bullethole_overlays, bullet_hole) - add_overlay(bullet_hole) - return BULLET_ACT_HIT - return BULLET_ACT_FORCE_PIERCE - -#undef DECALTYPE_SCORCH -#undef DECALTYPE_BULLET + playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index a06b7fdaea7..7f135fe839c 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -23,14 +23,29 @@ return TRUE -/obj/bullet_act(obj/projectile/P) +/obj/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) . = ..() - playsound(src, P.hitsound, 50, TRUE) - var/damage + if(. != BULLET_ACT_HIT) + return . + + playsound(src, hitting_projectile.hitsound, 50, TRUE) + var/damage_sustained = 0 if(!QDELETED(src)) //Bullet on_hit effect might have already destroyed this object - damage = take_damage(P.damage * P.demolition_mod, P.damage_type, P.armor_flag, 0, REVERSE_DIR(P.dir), P.armour_penetration) - if(P.suppressed != SUPPRESSED_VERY) - visible_message(span_danger("[src] is hit by \a [P][damage ? "" : ", without leaving a mark"]!"), null, null, COMBAT_MESSAGE_RANGE) + damage_sustained = take_damage( + hitting_projectile.damage * hitting_projectile.demolition_mod, + hitting_projectile.damage_type, + hitting_projectile.armor_flag, + FALSE, + REVERSE_DIR(hitting_projectile.dir), + hitting_projectile.armour_penetration, + ) + if(hitting_projectile.suppressed != SUPPRESSED_VERY) + visible_message( + span_danger("[src] is hit by \a [hitting_projectile][damage_sustained ? "" : ", without leaving a mark"]!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) + + return damage_sustained > 0 ? BULLET_ACT_HIT : BULLET_ACT_BLOCK /obj/attack_hulk(mob/living/carbon/human/user) ..() diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index b3d51ceffa1..fdef93e77d6 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -139,14 +139,13 @@ density = TRUE max_integrity = 10 allow_walk = FALSE + armor_type = /datum/armor/structure_holosign/cyborg_barrier // Gets a special armor subtype which is extra good at defense. -/obj/structure/holosign/barrier/cyborg/bullet_act(obj/projectile/P) - take_damage((P.damage / 5) , BRUTE, MELEE, 1) //Doesn't really matter what damage flag it is. - if(istype(P, /obj/projectile/energy/electrode)) - take_damage(10, BRUTE, MELEE, 1) //Tasers aren't harmful. - if(istype(P, /obj/projectile/beam/disabler)) - take_damage(5, BRUTE, MELEE, 1) //Disablers aren't harmful. - return BULLET_ACT_HIT +/datum/armor/structure_holosign/cyborg_barrier + bullet = 80 + laser = 80 + energy = 80 + melee = 20 /obj/structure/holosign/barrier/medical name = "\improper PENLITE holobarrier" @@ -200,12 +199,9 @@ name = "Charged Energy Field" desc = "A powerful energy field that blocks movement. Energy arcs off it." max_integrity = 20 + armor_type = /datum/armor/structure_holosign //Yeah no this doesn't get projectile resistance. var/shockcd = 0 -/obj/structure/holosign/barrier/cyborg/hacked/bullet_act(obj/projectile/P) - take_damage(P.damage, BRUTE, MELEE, 1) //Yeah no this doesn't get projectile resistance. - return BULLET_ACT_HIT - /obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown() shockcd = FALSE diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 54027b7d8a2..9c5b6a10ec9 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -373,53 +373,87 @@ playsound(get_turf(H),I.hitsound,75,TRUE) return -/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE) - var/mob/living/carbon/human/H = firer +/obj/projectile/tentacle/on_hit(atom/movable/target, blocked = 0, pierce_hit) + if(!isliving(firer) || !ismovable(target)) + return ..() + if(blocked >= 100) return BULLET_ACT_BLOCK - if(isitem(target)) - var/obj/item/I = target - if(!I.anchored) - to_chat(firer, span_notice("You pull [I] towards yourself.")) - H.throw_mode_on(THROW_MODE_TOGGLE) - I.throw_at(H, 10, 2) - . = BULLET_ACT_HIT - - else if(isliving(target)) - var/mob/living/L = target - if(!L.anchored && !L.throwing)//avoid double hits - if(iscarbon(L)) - var/mob/living/carbon/C = L - var/firer_combat_mode = TRUE - var/mob/living/living_shooter = firer - if(istype(living_shooter)) - firer_combat_mode = living_shooter.combat_mode - if(fire_modifiers && fire_modifiers["right"]) - var/obj/item/I = C.get_active_held_item() - if(I) - if(C.dropItemToGround(I)) - C.visible_message(span_danger("[I] is yanked off [C]'s hand by [src]!"),span_userdanger("A tentacle pulls [I] away from you!")) - on_hit(I) //grab the item as if you had hit it directly with the tentacle - return BULLET_ACT_HIT - else - to_chat(firer, span_warning("You can't seem to pry [I] off [C]'s hands!")) - return BULLET_ACT_BLOCK - else - to_chat(firer, span_danger("[C] has nothing in hand to disarm!")) - return BULLET_ACT_HIT - if(firer_combat_mode) - C.visible_message(span_danger("[L] is thrown towards [H] by a tentacle!"),span_userdanger("A tentacle grabs you and throws you towards [H]!")) - C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C)) - return BULLET_ACT_HIT - else - C.visible_message(span_danger("[L] is grabbed by [H]'s tentacle!"),span_userdanger("A tentacle grabs you and pulls you towards [H]!")) - C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE) - return BULLET_ACT_HIT - - else - L.visible_message(span_danger("[L] is pulled by [H]'s tentacle!"),span_userdanger("A tentacle grabs you and pulls you towards [H]!")) - L.throw_at(get_step_towards(H,L), 8, 2) - . = BULLET_ACT_HIT + + var/mob/living/ling = firer + if(isitem(target) && iscarbon(ling)) + var/obj/item/catching = target + if(catching.anchored) + return BULLET_ACT_BLOCK + + var/mob/living/carbon/carbon_ling = ling + to_chat(carbon_ling, span_notice("You pull [catching] towards yourself.")) + carbon_ling.throw_mode_on(THROW_MODE_TOGGLE) + catching.throw_at( + target = carbon_ling, + range = 10, + speed = 2, + thrower = carbon_ling, + diagonals_first = TRUE, + callback = CALLBACK(src, PROC_REF(reset_throw), carbon_ling), + gentle = TRUE, + ) + return BULLET_ACT_HIT + + . = ..() + if(. != BULLET_ACT_HIT) + return . + var/mob/living/victim = target + if(!isliving(victim) || target.anchored || victim.throwing) + return BULLET_ACT_BLOCK + + if(!iscarbon(victim) || !ishuman(ling) || !ling.combat_mode) + victim.visible_message( + span_danger("[victim] is grabbed by [ling]'s [src]]!"), + span_userdanger("\A [src] grabs you and pulls you towards [ling]!"), + ) + victim.throw_at( + target = get_step_towards(ling, victim), + range = 8, + speed = 2, + thrower = ling, + diagonals_first = TRUE, + gentle = TRUE, + ) + return BULLET_ACT_HIT + + if(LAZYACCESS(fire_modifiers, RIGHT_CLICK)) + var/obj/item/stealing = victim.get_active_held_item() + if(!isnull(stealing)) + if(victim.dropItemToGround(stealing)) + victim.visible_message( + span_danger("[stealing] is yanked off [victim]'s hand by [src]!"), + span_userdanger("\A [src] pulls [stealing] away from you!"), + ) + return on_hit(stealing) //grab the item as if you had hit it directly with the tentacle + + to_chat(ling, span_warning("You can't seem to pry [stealing] off [victim]'s hands!")) + return BULLET_ACT_BLOCK + + to_chat(ling, span_danger("[victim] has nothing in hand to disarm!")) + return BULLET_ACT_HIT + + if(ling.combat_mode) + victim.visible_message( + span_danger("[victim] is thrown towards [ling] by \a [src]!"), + span_userdanger("\A [src] grabs you and throws you towards [ling]!"), + ) + victim.throw_at( + target = get_step_towards(ling, victim), + range = 8, + speed = 2, + thrower = ling, + diagonals_first = TRUE, + callback = CALLBACK(src, PROC_REF(tentacle_grab), ling, victim), + gentle = TRUE, + ) + + return BULLET_ACT_HIT /obj/projectile/tentacle/Destroy() qdel(chain) diff --git a/code/modules/antagonists/heretic/magic/star_blast.dm b/code/modules/antagonists/heretic/magic/star_blast.dm index 297e24455e2..212e90535d6 100644 --- a/code/modules/antagonists/heretic/magic/star_blast.dm +++ b/code/modules/antagonists/heretic/magic/star_blast.dm @@ -37,7 +37,7 @@ . = ..() AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) -/obj/projectile/magic/star_ball/on_hit(atom/target, blocked = FALSE, pierce_hit) +/obj/projectile/magic/star_ball/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/mob/living/cast_on = firer for(var/mob/living/nearby_mob in range(star_mark_range, target)) diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm index cf1142ee2fa..1e07ddc6941 100644 --- a/code/modules/antagonists/nightmare/nightmare_organs.dm +++ b/code/modules/antagonists/nightmare/nightmare_organs.dm @@ -27,10 +27,25 @@ terrorize_spell = new(src) terrorize_spell.Grant(brain_owner) + RegisterSignal(brain_owner, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(dodge_bullets)) + /obj/item/organ/internal/brain/shadow/nightmare/on_remove(mob/living/carbon/brain_owner) . = ..() QDEL_NULL(our_jaunt) QDEL_NULL(terrorize_spell) + UnregisterSignal(brain_owner, COMSIG_ATOM_PRE_BULLET_ACT) + +/obj/item/organ/internal/brain/shadow/nightmare/proc/dodge_bullets(mob/living/carbon/human/source, obj/projectile/hitting_projectile, def_zone) + SIGNAL_HANDLER + var/turf/dodge_turf = source.loc + if(!istype(dodge_turf) || dodge_turf.get_lumcount() >= SHADOW_SPECIES_LIGHT_THRESHOLD) + return NONE + source.visible_message( + span_danger("[source] dances in the shadows, evading [hitting_projectile]!"), + span_danger("You evade [hitting_projectile] with the cover of darkness!"), + ) + playsound(source, SFX_BULLET_MISS, 75, TRUE) + return COMPONENT_BULLET_PIERCED /obj/item/organ/internal/heart/nightmare name = "heart of darkness" diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm index 88331353657..2db4ca2bb2c 100644 --- a/code/modules/antagonists/nightmare/nightmare_species.dm +++ b/code/modules/antagonists/nightmare/nightmare_species.dm @@ -42,15 +42,5 @@ C.fully_replace_character_name(null, pick(GLOB.nightmare_names)) C.set_safe_hunger_level() -/datum/species/shadow/nightmare/bullet_act(obj/projectile/P, mob/living/carbon/human/H) - var/turf/T = H.loc - if(istype(T)) - var/light_amount = T.get_lumcount() - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - H.visible_message(span_danger("[H] dances in the shadows, evading [P]!")) - playsound(T, SFX_BULLET_MISS, 75, TRUE) - return BULLET_ACT_FORCE_PIERCE - return ..() - /datum/species/shadow/nightmare/check_roundstart_eligible() return FALSE diff --git a/code/modules/awaymissions/cordon.dm b/code/modules/awaymissions/cordon.dm index 5db4dd997d3..285d0d49e10 100644 --- a/code/modules/awaymissions/cordon.dm +++ b/code/modules/awaymissions/cordon.dm @@ -40,7 +40,8 @@ return /turf/cordon/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) - return BULLET_ACT_HIT + SHOULD_CALL_PARENT(FALSE) // Fuck you + return BULLET_ACT_BLOCK /turf/cordon/Adjacent(atom/neighbor, atom/target, atom/movable/mover) return FALSE diff --git a/code/modules/capture_the_flag/ctf_equipment.dm b/code/modules/capture_the_flag/ctf_equipment.dm index e822ae2dbb1..798bfa49be9 100644 --- a/code/modules/capture_the_flag/ctf_equipment.dm +++ b/code/modules/capture_the_flag/ctf_equipment.dm @@ -10,7 +10,7 @@ return PROJECTILE_PIERCE_NONE /// hey uhhh don't hit anyone behind them . = ..() -/obj/projectile/beam/ctf/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/ctf/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(is_ctf_target(target) && blocked == FALSE) if(iscarbon(target)) @@ -176,7 +176,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser light_color = LIGHT_COLOR_PURPLE -/obj/projectile/beam/instakill/on_hit(atom/target) +/obj/projectile/beam/instakill/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/target_mob = target diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index de8458cb3a9..95f118a0c91 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -281,11 +281,11 @@ /obj/machinery/hydroponics/bullet_act(obj/projectile/Proj) //Works with the Somatoray to modify plant variables. if(!myseed) return ..() - if(istype(Proj , /obj/projectile/energy/floramut)) + if(istype(Proj , /obj/projectile/energy/flora/mut)) mutate() - else if(istype(Proj , /obj/projectile/energy/florayield)) + else if(istype(Proj , /obj/projectile/energy/flora/yield)) return myseed.bullet_act(Proj) - else if(istype(Proj , /obj/projectile/energy/florarevolution)) + else if(istype(Proj , /obj/projectile/energy/flora/evolution)) if(myseed) if(LAZYLEN(myseed.mutatelist)) myseed.set_instability(myseed.instability/2) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 36653ebafb9..3a399c87216 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -170,7 +170,7 @@ /obj/item/seeds/bullet_act(obj/projectile/Proj) //Works with the Somatoray to modify plant variables. - if(istype(Proj, /obj/projectile/energy/florayield)) + if(istype(Proj, /obj/projectile/energy/flora/yield)) var/rating = 1 if(istype(loc, /obj/machinery/hydroponics)) var/obj/machinery/hydroponics/H = loc diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm index adb5afaf5c8..770d787f8ad 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm @@ -18,7 +18,7 @@ . = ..() . += span_notice("Throw this at objects or creatures to freeze them, it will boomerang back so be cautious!") -/obj/item/freeze_cube/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, quickstart = TRUE) +/obj/item/freeze_cube/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, gentle, quickstart = TRUE) . = ..() if(!.) return diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 4ceddb09854..f5676221f7a 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -201,7 +201,7 @@ hammer_synced = null return ..() -/obj/projectile/destabilizer/on_hit(atom/target, blocked = FALSE) +/obj/projectile/destabilizer/on_hit(atom/target, blocked = 0, pierce_hit) if(isliving(target)) var/mob/living/L = target var/had_effect = (L.has_status_effect(/datum/status_effect/crusher_mark)) //used as a boolean diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 64414f10501..bdcf089e606 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -608,7 +608,7 @@ light_power = 1 light_color = LIGHT_COLOR_BLOOD_MAGIC -/obj/projectile/soulscythe/on_hit(atom/target, blocked = FALSE) +/obj/projectile/soulscythe/on_hit(atom/target, blocked = 0, pierce_hit) if(ishostile(target)) damage *= 2 return ..() diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm index e8c4d1723e7..6e8ff992891 100644 --- a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm @@ -17,7 +17,7 @@ icon_state = "tentacle_end" damage = 0 -/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE) +/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(!iscarbon(target) || blocked >= 100) return diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling_projectiles.dm b/code/modules/mob/living/basic/jungle/seedling/seedling_projectiles.dm index 726b8105933..37a3ec1c0ac 100644 --- a/code/modules/mob/living/basic/jungle/seedling/seedling_projectiles.dm +++ b/code/modules/mob/living/basic/jungle/seedling/seedling_projectiles.dm @@ -11,7 +11,7 @@ hitsound_wall = 'sound/weapons/effects/searwall.ogg' nondirectional_sprite = TRUE -/obj/projectile/seedling/on_hit(atom/target) +/obj/projectile/seedling/on_hit(atom/target, blocked = 0, pierce_hit) if(!isliving(target)) return ..() diff --git a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm index 45bfd74d23b..d4fef239bf8 100644 --- a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm +++ b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm @@ -43,6 +43,9 @@ /mob/living/basic/mining/basilisk/bullet_act(obj/projectile/bullet, def_zone, piercing_hit) . = ..() + if(. != BULLET_ACT_HIT) + return + if (istype(bullet, /obj/projectile/temp)) var/obj/projectile/temp/heat_bullet = bullet if (heat_bullet.temperature < 0) diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm index 58b0e1bbbdb..fe1cc001101 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm @@ -65,6 +65,8 @@ if(can_lay_eggs) make_egg_layer() + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(block_bullets)) + /mob/living/basic/mining/goldgrub/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) . = ..() if(!.) @@ -76,12 +78,14 @@ if(istype(attack_target, /obj/item/stack/ore)) consume_ore(attack_target) -/mob/living/basic/mining/goldgrub/bullet_act(obj/projectile/bullet) - if(stat == DEAD) - return BULLET_ACT_FORCE_PIERCE +/mob/living/basic/mining/goldgrub/proc/block_bullets(datum/source, obj/projectile/hitting_projectile) + SIGNAL_HANDLER + + if(stat != CONSCIOUS) + return COMPONENT_BULLET_PIERCED - visible_message(span_danger("The [bullet.name] is repelled by [src]'s girth!")) - return BULLET_ACT_BLOCK + visible_message(span_danger("[hitting_projectile] is repelled by [source]'s girth!")) + return COMPONENT_BULLET_BLOCKED /mob/living/basic/mining/goldgrub/proc/barf_contents(gibbed) playsound(src, 'sound/effects/splat.ogg', 50, TRUE) @@ -188,4 +192,3 @@ current_growth = 0,\ location_allowlist = typecacheof(list(/turf)),\ ) - diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm index 2680e9aa914..40afd58c1da 100644 --- a/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm @@ -7,7 +7,7 @@ armor_flag = ENERGY temperature = -50 -/obj/projectile/temp/watcher/on_hit(mob/living/target, blocked = 0) +/obj/projectile/temp/watcher/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if (!isliving(target)) return diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 13b64776807..b68c7d6415a 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -106,7 +106,7 @@ if(CanHug(AM) && Adjacent(AM)) return Leap(AM) -/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, quickstart = TRUE) +/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, gentle, quickstart = TRUE) . = ..() if(!.) return diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 6bd93d364d3..62d60a03fde 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1454,20 +1454,6 @@ GLOBAL_LIST_EMPTY(features_by_species) SEND_SIGNAL(H, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) return TRUE -/datum/species/proc/on_hit(obj/projectile/P, mob/living/carbon/human/H) - // called when hit by a projectile - switch(P.type) - if(/obj/projectile/energy/floramut) // overwritten by plants/pods - H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) - if(/obj/projectile/energy/florayield) - H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) - if(/obj/projectile/energy/florarevolution) - H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) - -/datum/species/proc/bullet_act(obj/projectile/P, mob/living/carbon/human/H) - // called before a projectile hit - return 0 - ////////////////////////// // ENVIRONMENT HANDLERS // ////////////////////////// diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index db55cd58d48..2b58f9a8206 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -44,59 +44,47 @@ covering_part += C return covering_part -/mob/living/carbon/human/on_hit(obj/projectile/P) - if(dna?.species) - dna.species.on_hit(P, src) - - /mob/living/carbon/human/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE) - if(dna?.species) - var/spec_return = dna.species.bullet_act(P, src) - if(spec_return) - return spec_return - //MARTIAL ART STUFF - if(mind) - if(mind.martial_art && mind.martial_art.can_use(src)) //Some martial arts users can deflect projectiles! - var/martial_art_result = mind.martial_art.on_projectile_hit(src, P, def_zone) - if(!(martial_art_result == BULLET_ACT_HIT)) - return martial_art_result - - if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself - if(P.reflectable & REFLECT_NORMAL) - if(check_reflect(def_zone)) // Checks if you've passed a reflection% check - visible_message(span_danger("The [P.name] gets reflected by [src]!"), \ - span_userdanger("The [P.name] gets reflected by [src]!")) - // Finds and plays the block_sound of item which reflected - for(var/obj/item/I in held_items) - if(I.IsReflect(def_zone)) - playsound(src, I.block_sound, BLOCK_SOUND_VOLUME, TRUE) - // Find a turf near or on the original location to bounce to - if(!isturf(loc)) //Open canopy mech (ripley) check. if we're inside something and still got hit - P.force_hit = TRUE //The thing we're in passed the bullet to us. Pass it back, and tell it to take the damage. - loc.bullet_act(P, def_zone, piercing_hit) - return BULLET_ACT_HIT - if(P.starting) - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(src) - - // redirect the projectile - P.original = locate(new_x, new_y, P.z) - P.starting = curloc - P.firer = src - P.yo = new_y - curloc.y - P.xo = new_x - curloc.x - var/new_angle_s = P.Angle + rand(120,240) - while(new_angle_s > 180) // Translate to regular projectile degrees - new_angle_s -= 360 - P.set_angle(new_angle_s) - - return BULLET_ACT_FORCE_PIERCE // complete projectile permutation - - if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration, P.damage_type)) - P.on_hit(src, 100, def_zone, piercing_hit) - return BULLET_ACT_HIT + if(P.firer == src && P.original == src) //can't block or reflect when shooting yourself + return ..() + + if(P.reflectable & REFLECT_NORMAL) + if(check_reflect(def_zone)) // Checks if you've passed a reflection% check + visible_message( + span_danger("The [P.name] gets reflected by [src]!"), + span_userdanger("The [P.name] gets reflected by [src]!"), + ) + // Finds and plays the block_sound of item which reflected + for(var/obj/item/I in held_items) + if(I.IsReflect(def_zone)) + playsound(src, I.block_sound, BLOCK_SOUND_VOLUME, TRUE) + // Find a turf near or on the original location to bounce to + if(!isturf(loc)) //Open canopy mech (ripley) check. if we're inside something and still got hit + P.force_hit = TRUE //The thing we're in passed the bullet to us. Pass it back, and tell it to take the damage. + loc.bullet_act(P, def_zone, piercing_hit) + return BULLET_ACT_HIT + if(P.starting) + var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/curloc = get_turf(src) + + // redirect the projectile + P.original = locate(new_x, new_y, P.z) + P.starting = curloc + P.firer = src + P.yo = new_y - curloc.y + P.xo = new_x - curloc.x + var/new_angle_s = P.Angle + rand(120,240) + while(new_angle_s > 180) // Translate to regular projectile degrees + new_angle_s -= 360 + P.set_angle(new_angle_s) + + return BULLET_ACT_FORCE_PIERCE // complete projectile permutation + + if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration, P.damage_type)) + P.on_hit(src, 100, def_zone, piercing_hit) + return BULLET_ACT_HIT return ..() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 4f56c1403bc..15704d88b7a 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -93,22 +93,44 @@ /mob/living/proc/is_ears_covered() return null -/mob/living/proc/on_hit(obj/projectile/P) - return BULLET_ACT_HIT - -/mob/living/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE) +/mob/living/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) . = ..() - if(P.is_hostile_projectile() && (. != BULLET_ACT_BLOCK)) - var/attack_direction = get_dir(P.starting, src) - // we need a second, silent armor check to actually know how much to reduce damage taken, as opposed to - // on [/atom/proc/bullet_act] where it's just to pass it to the projectile's on_hit(). - var/armor_check = check_projectile_armor(def_zone, P, is_silent = TRUE) - armor_check = min(ARMOR_MAX_BLOCK, armor_check) //cap damage reduction at 90% - apply_damage(P.damage, P.damage_type, def_zone, armor_check, wound_bonus=P.wound_bonus, bare_wound_bonus=P.bare_wound_bonus, sharpness = P.sharpness, attack_direction = attack_direction) - apply_effects(P.stun, P.knockdown, P.unconscious, P.slur, P.stutter, P.eyeblur, P.drowsy, armor_check, P.stamina, P.jitter, P.paralyze, P.immobilize) - if(P.dismemberment) - check_projectile_dismemberment(P, def_zone) - return . ? BULLET_ACT_HIT : BULLET_ACT_BLOCK + if(. != BULLET_ACT_HIT) + return . + if(!hitting_projectile.is_hostile_projectile()) + return BULLET_ACT_HIT + + // we need a second, silent armor check to actually know how much to reduce damage taken, as opposed to + // on [/atom/proc/bullet_act] where it's just to pass it to the projectile's on_hit(). + var/armor_check = check_projectile_armor(def_zone, hitting_projectile, is_silent = TRUE) + + apply_damage( + damage = hitting_projectile.damage, + damagetype = hitting_projectile.damage_type, + def_zone = def_zone, + blocked = min(ARMOR_MAX_BLOCK, armor_check), //cap damage reduction at 90% + wound_bonus = hitting_projectile.wound_bonus, + bare_wound_bonus = hitting_projectile.bare_wound_bonus, + sharpness = hitting_projectile.sharpness, + attack_direction = get_dir(hitting_projectile.starting, src), + ) + apply_effects( + stun = hitting_projectile.stun, + knockdown = hitting_projectile.knockdown, + unconscious = hitting_projectile.unconscious, + slur = (mob_biotypes & MOB_ROBOTIC) ? 0 SECONDS : hitting_projectile.slur, // Don't want your cyborgs to slur from being ebow'd + stutter = (mob_biotypes & MOB_ROBOTIC) ? 0 SECONDS : hitting_projectile.stutter, // Don't want your cyborgs to stutter from being tazed + eyeblur = hitting_projectile.eyeblur, + drowsy = hitting_projectile.drowsy, + blocked = armor_check, + stamina = hitting_projectile.stamina, + jitter = (mob_biotypes & MOB_ROBOTIC) ? 0 SECONDS : hitting_projectile.jitter, // Cyborgs can jitter but not from being shot + paralyze = hitting_projectile.paralyze, + immobilize = hitting_projectile.immobilize, + ) + if(hitting_projectile.dismemberment) + check_projectile_dismemberment(hitting_projectile, def_zone) + return BULLET_ACT_HIT /mob/living/check_projectile_armor(def_zone, obj/projectile/impacting_projectile, is_silent) return run_armor_check(def_zone, impacting_projectile.armor_flag, "","",impacting_projectile.armour_penetration, "", is_silent, impacting_projectile.weak_against_armour) diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 7445815c9d7..ad9a965242e 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -54,10 +54,6 @@ return TRUE -/mob/living/silicon/ai/bullet_act(obj/projectile/Proj) - . = ..(Proj) - updatehealth() - /mob/living/silicon/ai/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, length = 25) return // no eyes, no flashing diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index f49fda57449..b9d3304ef8d 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -433,11 +433,15 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real return TRUE -/mob/living/silicon/robot/bullet_act(obj/projectile/Proj, def_zone) +/mob/living/silicon/robot/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) . = ..() - updatehealth() - if(prob(75) && Proj.damage > 0) - spark_system.start() + if(prob(25) || . != BULLET_ACT_HIT) + return + if(hitting_projectile.damage_type != BRUTE && hitting_projectile.damage_type != BURN) + return + if(!hitting_projectile.is_hostile_projectile() || hitting_projectile.damage <= 0) + return + spark_system.start() /mob/living/silicon/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) . = ..() diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 847e6867521..86fb4e74910 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -115,21 +115,22 @@ M.visible_message(span_boldwarning("[M] is thrown off of [src]!")) flash_act(affect_silicon = 1) -/mob/living/silicon/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE) - SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, Proj, def_zone) - if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - adjustBruteLoss(Proj.damage) - if(prob(Proj.damage*1.5)) - for(var/mob/living/M in buckled_mobs) - M.visible_message(span_boldwarning("[M] is knocked off of [src]!")) - unbuckle_mob(M) - M.Paralyze(40) - if(Proj.stun || Proj.knockdown || Proj.paralyze) - for(var/mob/living/M in buckled_mobs) - unbuckle_mob(M) - M.visible_message(span_boldwarning("[M] is knocked off of [src] by the [Proj]!")) - Proj.on_hit(src, 0, piercing_hit) - return BULLET_ACT_HIT +/mob/living/silicon/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + . = ..() + if(. != BULLET_ACT_HIT) + return . + + var/prob_of_knocking_dudes_off = 0 + if(hitting_projectile.damage_type == BRUTE || hitting_projectile.damage_type == BURN) + prob_of_knocking_dudes_off = hitting_projectile.damage * 1.5 + if(hitting_projectile.stun || hitting_projectile.knockdown || hitting_projectile.paralyze) + prob_of_knocking_dudes_off = 100 + + if(prob(prob_of_knocking_dudes_off)) + for(var/mob/living/buckled in buckled_mobs) + buckled.visible_message(span_boldwarning("[buckled] is knocked off of [src] by [hitting_projectile]!")) + unbuckle_mob(buckled) + buckled.Paralyze(4 SECONDS) /mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash/static, length = 25) if(affect_silicon) diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index 828be3deebc..f2a2f9fbb65 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -12,6 +12,9 @@ var/block_chance = 50 +/mob/living/simple_animal/bot/secbot/grievous/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(block_bullets)) /mob/living/simple_animal/bot/secbot/grievous/toy //A toy version of general beepsky! name = "Genewul Bweepskee" @@ -21,10 +24,15 @@ baton_type = /obj/item/toy/sword weapon_force = 0 -/mob/living/simple_animal/bot/secbot/grievous/bullet_act(obj/projectile/P) - visible_message(span_warning("[src] deflects [P] with its energy swords!")) - playsound(src, 'sound/weapons/blade1.ogg', 50, TRUE) - return BULLET_ACT_BLOCK +/mob/living/simple_animal/bot/secbot/grievous/proc/block_bullets(datum/source, obj/projectile/hitting_projectile) + SIGNAL_HANDLER + + if(stat != CONSCIOUS) + return NONE + + visible_message(span_warning("[source] deflects [hitting_projectile] with its energy swords!")) + playsound(source, 'sound/weapons/blade1.ogg', 50, TRUE) + return COMPONENT_BULLET_BLOCKED /mob/living/simple_animal/bot/secbot/grievous/on_entered(datum/source, atom/movable/AM) . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 0ae9b56d5b4..c369058a2a3 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -502,11 +502,15 @@ return do_sparks(5, TRUE, src) -/mob/living/simple_animal/bot/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE) - if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - if(prob(75) && Proj.damage > 0) - do_sparks(5, TRUE, src) - return ..() +/mob/living/simple_animal/bot/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + . = ..() + if(prob(25) || . != BULLET_ACT_HIT) + return + if(hitting_projectile.damage_type != BRUTE && hitting_projectile.damage_type != BURN) + return + if(!hitting_projectile.is_hostile_projectile() || hitting_projectile.damage <= 0) + return + do_sparks(5, TRUE, src) /mob/living/simple_animal/bot/emp_act(severity) . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 04b62db59d3..5b994b1fc0c 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -262,11 +262,14 @@ return TRUE /mob/living/simple_animal/bot/secbot/bullet_act(obj/projectile/Proj) + . = ..() + if(. != BULLET_ACT_HIT) + return + if(istype(Proj, /obj/projectile/beam) || istype(Proj, /obj/projectile/bullet)) if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) if(Proj.is_hostile_projectile() && Proj.damage < src.health && ishuman(Proj.firer)) retaliate(Proj.firer) - return ..() /mob/living/simple_animal/bot/secbot/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) if(!(bot_mode_flags & BOT_MODE_ON)) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index aa11bcbd43e..3330b682a01 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -40,7 +40,7 @@ nondirectional_sprite = TRUE impact_effect_type = /obj/effect/temp_visual/leaper_projectile_impact -/obj/projectile/leaper/on_hit(atom/target, blocked = FALSE) +/obj/projectile/leaper/on_hit(atom/target, blocked = 0, pierce_hit) ..() if (!isliving(target)) return diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 5c63ca4e884..bbaa5356138 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -180,7 +180,6 @@ damage = 25 armour_penetration = 100 speed = 2 - eyeblur = 0 damage_type = BRUTE pass_flags = PASSTABLE plane = GAME_PLANE @@ -191,7 +190,7 @@ direct_target = TRUE return ..(target, direct_target, ignore_loc, cross_failed) -/obj/projectile/colossus/on_hit(atom/target, blocked = FALSE) +/obj/projectile/colossus/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/mob/living/dust_mob = target diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 8a307cec2bd..a013a48e944 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -200,7 +200,7 @@ Difficulty: Extremely Hard homing_turn_speed = 3 damage_type = BURN -/obj/projectile/colossus/frost_orb/on_hit(atom/target, blocked = FALSE) +/obj/projectile/colossus/frost_orb/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isturf(target) || isobj(target)) EX_ACT(target, EXPLODE_HEAVY) @@ -226,7 +226,7 @@ Difficulty: Extremely Hard range = 150 damage_type = BRUTE -/obj/projectile/colossus/ice_blast/on_hit(atom/target, blocked = FALSE) +/obj/projectile/colossus/ice_blast/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isturf(target) || isobj(target)) EX_ACT(target, EXPLODE_HEAVY) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 56c753c9c8b..eda344ad1da 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -324,7 +324,6 @@ hitsound = 'sound/magic/magic_missile.ogg' damage = 19 range = 6 - eyeblur = 0 light_color = COLOR_SOFT_RED impact_effect_type = /obj/effect/temp_visual/kinetic_blast tracer_type = /obj/effect/projectile/tracer/legion diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index aa61c128e3f..9517bce4f92 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -227,11 +227,10 @@ damage = 20 armour_penetration = 60 speed = 2 - eyeblur = 0 damage_type = BRUTE pass_flags = PASSTABLE -/obj/projectile/herald/on_hit(atom/target, blocked = FALSE) +/obj/projectile/herald/on_hit(atom/target, blocked = 0, pierce_hit) if(ismob(target) && ismob(firer)) var/mob/living/mob_target = target if(mob_target.faction_check_atom(firer)) @@ -247,7 +246,7 @@ damage = 0 color = rgb(255,255,102) -/obj/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE) +/obj/projectile/herald/teleshot/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(!QDELETED(firer)) firer.forceMove(get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 837457390f8..cdae01abd8c 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -298,15 +298,6 @@ amount = -abs(amount) return ..() //Heals them -/mob/living/simple_animal/slime/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE) - attacked += 10 - if((Proj.damage_type == BURN)) - adjustBruteLoss(-abs(Proj.damage)) //fire projectiles heals slimes. - Proj.on_hit(src, 0, piercing_hit) - else - . = ..(Proj) - . = . || BULLET_ACT_BLOCK - /mob/living/simple_animal/slime/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 9c1f5e65d78..9095bbd2c24 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -126,7 +126,7 @@ line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi', emissive = FALSE) return ..() -/obj/projectile/tether/on_hit(atom/target) +/obj/projectile/tether/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(firer) firer.throw_at(target, 10, 1, firer, FALSE, FALSE, null, MOVE_FORCE_NORMAL, TRUE) diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index ca662d01ef2..c1a1cbce403 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -186,7 +186,7 @@ organ = null return ..() -/obj/projectile/organ/on_hit(atom/target) +/obj/projectile/organ/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(!ishuman(target)) organ.forceMove(drop_location()) diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index 31db6017609..42722607199 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -374,7 +374,7 @@ line = firer.Beam(src, "net_beam", 'icons/obj/clothing/modsuit/mod_modules.dmi') return ..() -/obj/projectile/energy_net/on_hit(mob/living/target) +/obj/projectile/energy_net/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(!istype(target)) return diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index f2440ba3833..7adf7b13cd9 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -297,11 +297,14 @@ ///Reference to the tem... given by the tem! weakref because back in the day we didn't know about harddels- or maybe we didn't care. var/datum/weakref/tem_weakref -/obj/projectile/energy/chrono_beam/on_hit(atom/target) +/obj/projectile/energy/chrono_beam/on_hit(atom/target, blocked = 0, pierce_hit) var/obj/item/mod/module/tem/tem = tem_weakref.resolve() if(target && tem && isliving(target)) var/obj/structure/chrono_field/field = new(target.loc, target, tem) tem.field_connect(field) + return BULLET_ACT_HIT + + return ..() /obj/structure/chrono_field name = "eradication field" @@ -403,9 +406,10 @@ var/obj/item/mod/module/tem/linked_tem = beam.tem_weakref.resolve() if(linked_tem && istype(linked_tem)) linked_tem.field_connect(src) - else return BULLET_ACT_HIT + return ..() + /obj/structure/chrono_field/assume_air() return FALSE diff --git a/code/modules/pai/defense.dm b/code/modules/pai/defense.dm index 75c437c2546..61fadf820bf 100644 --- a/code/modules/pai/defense.dm +++ b/code/modules/pai/defense.dm @@ -56,11 +56,11 @@ if(user.put_in_hands(card)) user.visible_message(span_notice("[user] promptly scoops up [user.p_their()] pAI's card.")) -/mob/living/silicon/pai/bullet_act(obj/projectile/Proj) - if(Proj.stun) +/mob/living/silicon/pai/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + . = ..() + if(. == BULLET_ACT_HIT && (hitting_projectile.stun || hitting_projectile.paralyze)) fold_in(force = TRUE) - src.visible_message(span_warning("The electrically-charged projectile disrupts [src]'s holomatrix, forcing [src] to fold in!")) - . = ..(Proj) + visible_message(span_warning("The electrically-charged projectile disrupts [src]'s holomatrix, forcing [p_them()] to fold in!")) /mob/living/silicon/pai/ignite_mob(silent) return FALSE diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 9f7432a1475..f664b79825e 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -99,7 +99,7 @@ return ..() -/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, quickstart = TRUE) +/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, gentle, quickstart = TRUE) . = ..(target, range, speed, thrower, FALSE, diagonals_first, callback, quickstart = quickstart) /obj/item/paperplane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 8598b3cccf2..3f02447ddbc 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -203,7 +203,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) RegisterSignal(src, COMSIG_ATOM_BSA_BEAM, PROC_REF(force_delam)) RegisterSignal(src, COMSIG_ATOM_TIMESTOP_FREEZE, PROC_REF(time_frozen)) RegisterSignal(src, COMSIG_ATOM_TIMESTOP_UNFREEZE, PROC_REF(time_unfrozen)) - + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(eat_bullets)) var/static/list/loc_connections = list( COMSIG_TURF_INDUSTRIAL_LIFT_ENTER = PROC_REF(tram_contents_consume), ) diff --git a/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm b/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm index 34a7d6f420a..d19d17452e2 100644 --- a/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm +++ b/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm @@ -36,6 +36,9 @@ if(our_turf) our_turf.opacity = FALSE + // Ideally this'd be part of the SM component, but the SM itself snowflakes bullets (emitters are bullets). + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(eat_bullets)) + /obj/crystal_mass/process() if(!COOLDOWN_FINISHED(src, sm_wall_cooldown)) @@ -70,9 +73,18 @@ new /obj/crystal_mass(next_turf, get_dir(next_turf, src)) -/obj/crystal_mass/bullet_act(obj/projectile/projectile) - visible_message(span_notice("[src] is unscathed!")) - return BULLET_ACT_HIT +/obj/crystal_mass/proc/eat_bullets(datum/source, obj/projectile/hitting_projectile) + SIGNAL_HANDLER + + visible_message( + span_warning("[hitting_projectile] flies into [src] with a loud crack, before rapidly flashing into ash."), + null, + span_hear("You hear a loud crack as you are washed with a wave of heat."), + ) + + playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE) + qdel(hitting_projectile) + return COMPONENT_BULLET_BLOCKED /obj/crystal_mass/singularity_act() return @@ -166,4 +178,3 @@ span_hear("You hear a loud crack as a small distortion passes through you.")) qdel(consumed_object) - diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm index 452b37e0541..9d5b0d1067b 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -5,16 +5,20 @@ for(var/atom/thing_to_consume as anything in tram_contents) Bumped(thing_to_consume) -/obj/machinery/power/supermatter_crystal/bullet_act(obj/projectile/projectile) +/obj/machinery/power/supermatter_crystal/proc/eat_bullets(datum/source, obj/projectile/projectile) + SIGNAL_HANDLER + var/turf/local_turf = loc + if(!istype(local_turf)) + return NONE + var/kiss_power = 0 switch(projectile.type) if(/obj/projectile/kiss) kiss_power = 60 if(/obj/projectile/kiss/death) kiss_power = 20000 - if(!istype(local_turf)) - return FALSE + if(!istype(projectile.firer, /obj/machinery/power/emitter)) investigate_log("has been hit by [projectile] fired by [key_name(projectile.firer)]", INVESTIGATE_ENGINE) if(projectile.armor_flag != BULLET || kiss_power) @@ -29,7 +33,10 @@ var/damage_to_be = damage + external_damage_immediate * clamp((emergency_point - damage) / emergency_point, 0, 1) if(damage_to_be > danger_point) visible_message(span_notice("[src] compresses under stress, resisting further impacts!")) - return BULLET_ACT_HIT + + playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE) + qdel(projectile) + return COMPONENT_BULLET_BLOCKED /obj/machinery/power/supermatter_crystal/singularity_act() var/gain = 100 diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index f2fc274ee8a..b4c29137a9f 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -20,15 +20,15 @@ harmful = FALSE /obj/item/ammo_casing/energy/flora/yield - projectile_type = /obj/projectile/energy/florayield + projectile_type = /obj/projectile/energy/flora/yield select_name = "yield" /obj/item/ammo_casing/energy/flora/mut - projectile_type = /obj/projectile/energy/floramut + projectile_type = /obj/projectile/energy/flora/mut select_name = "mutation" /obj/item/ammo_casing/energy/flora/revolution - projectile_type = /obj/projectile/energy/florarevolution + projectile_type = /obj/projectile/energy/flora/evolution select_name = "revolution" e_cost = LASER_SHOTS(4, STANDARD_CELL_CHARGE) diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index a451b14de9a..1c5b025baea 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -520,8 +520,8 @@ if(!QDELETED(target)) handle_impact(target) -/obj/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE, piercing_hit = FALSE) - handle_hit(target, piercing_hit) +/obj/projectile/beam/beam_rifle/on_hit(atom/target, blocked = 0, pierce_hit) + handle_hit(target, pierce_hit) return ..() /obj/projectile/beam/beam_rifle/is_hostile_projectile() @@ -567,7 +567,8 @@ /obj/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit_pierce(atom/target) return PROJECTILE_DELETE_WITHOUT_HITTING -/obj/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() +/obj/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit(atom/target, blocked = 0, pierce_hit) + SHOULD_CALL_PARENT(FALSE) // This is some snowflake stuff so whatever qdel(src) return BULLET_ACT_BLOCK diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index 7b3929d7574..932117abb5b 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -327,7 +327,7 @@ if(DUEL_SETTING_C) color = "blue" -/obj/projectile/energy/duel/on_hit(atom/target, blocked) +/obj/projectile/energy/duel/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/turf/T = get_turf(target) var/obj/effect/temp_visual/dueling_chaff/C = locate() in T diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 444b18ad274..c643092f8b8 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -209,7 +209,7 @@ strike_thing() ..() -/obj/projectile/kinetic/on_hit(atom/target) +/obj/projectile/kinetic/on_hit(atom/target, blocked = 0, pierce_hit) strike_thing(target) . = ..() @@ -616,4 +616,3 @@ var/new_color = input(user,"","Choose Color",bolt_color) as color|null bolt_color = new_color || bolt_color - diff --git a/code/modules/projectiles/guns/special/hand_of_midas.dm b/code/modules/projectiles/guns/special/hand_of_midas.dm index 9907352e3f5..69d3430cf9e 100644 --- a/code/modules/projectiles/guns/special/hand_of_midas.dm +++ b/code/modules/projectiles/guns/special/hand_of_midas.dm @@ -111,7 +111,7 @@ ..() // Gives human targets Midas Blight. -/obj/projectile/magic/midas_round/on_hit(atom/target) +/obj/projectile/magic/midas_round/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(ishuman(target)) var/mob/living/carbon/human/my_guy = target diff --git a/code/modules/projectiles/guns/special/meat_hook.dm b/code/modules/projectiles/guns/special/meat_hook.dm index 8adabdfce84..7438b22a5a9 100644 --- a/code/modules/projectiles/guns/special/meat_hook.dm +++ b/code/modules/projectiles/guns/special/meat_hook.dm @@ -51,7 +51,7 @@ ..() //TODO: root the firer until the chain returns -/obj/projectile/hook/on_hit(atom/target) +/obj/projectile/hook/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(ismovable(target)) var/atom/movable/A = target diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 7eb152d3e4a..5b84194f49e 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -158,13 +158,15 @@ var/decayedRange //stores original range var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever var/reflectable = NONE // Can it be reflected or not? + // Status effects applied on hit - var/stun = 0 - var/knockdown = 0 - var/paralyze = 0 - var/immobilize = 0 - var/unconscious = 0 - var/eyeblur = 0 + var/stun = 0 SECONDS + var/knockdown = 0 SECONDS + var/paralyze = 0 SECONDS + var/immobilize = 0 SECONDS + var/unconscious = 0 SECONDS + /// Seconds of blurry eyes applied on projectile hit + var/eyeblur = 0 SECONDS /// Drowsiness applied on projectile hit var/drowsy = 0 SECONDS /// Jittering applied on projectile hit @@ -245,12 +247,22 @@ /** * Called when the projectile hits something * - * @params - * target - thing hit - * blocked - percentage of hit blocked - * pierce_hit - are we piercing through or regular hitting + * By default parent call will always return [BULLET_ACT_HIT] (unless qdeleted) + * so it is save to assume a successful hit in children (though not necessarily successfully damaged - it could've been blocked) + * + * Arguments + * * target - thing hit + * * blocked - percentage of hit blocked (0 to 100) + * * pierce_hit - boolean, are we piercing through or regular hitting + * + * Returns + * * Returns [BULLET_ACT_HIT] if we hit something. Default return value. + * * Returns [BULLET_ACT_BLOCK] if we were hit but sustained no effects (blocked it). Note, Being "blocked" =/= "blocked is 100". + * * Returns [BULLET_ACT_FORCE_PIERCE] to have the projectile keep going instead of "hitting", as if we were not hit at all. */ -/obj/projectile/proc/on_hit(atom/target, blocked = FALSE, pierce_hit) +/obj/projectile/proc/on_hit(atom/target, blocked = 0, pierce_hit) + SHOULD_CALL_PARENT(TRUE) + // i know that this is probably more with wands and gun mods in mind, but it's a bit silly that the projectile on_hit signal doesn't ping the projectile itself. // maybe we care what the projectile thinks! See about combining these via args some time when it's not 5AM var/hit_limb_zone @@ -262,7 +274,7 @@ SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, hit_limb_zone) if(QDELETED(src)) // in case one of the above signals deleted the projectile for whatever reason - return + return BULLET_ACT_BLOCK var/turf/target_turf = get_turf(target) var/hitx @@ -349,7 +361,6 @@ span_userdanger("You're hit by \a [src][organ_hit_text]!"), null, COMBAT_MESSAGE_RANGE) if(living_target.is_blind()) to_chat(living_target, span_userdanger("You feel something hit you[organ_hit_text]!")) - living_target.on_hit(src) var/reagent_note if(reagents?.reagent_list) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index a7a5f83329a..0d16501d7eb 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -7,7 +7,7 @@ hitsound = 'sound/weapons/sear.ogg' hitsound_wall = 'sound/weapons/effects/searwall.ogg' armor_flag = LASER - eyeblur = 2 + eyeblur = 4 SECONDS impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_system = MOVABLE_LIGHT light_range = 1 @@ -57,7 +57,7 @@ muzzle_type = /obj/effect/projectile/muzzle/heavy_laser impact_type = /obj/effect/projectile/impact/heavy_laser -/obj/projectile/beam/laser/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/laser/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target @@ -116,7 +116,6 @@ damage_type = STAMINA armor_flag = ENERGY hitsound = 'sound/weapons/sear_disabler.ogg' - eyeblur = 0 impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE tracer_type = /obj/effect/projectile/tracer/disabler @@ -146,7 +145,7 @@ impact_type = /obj/effect/projectile/impact/pulse wound_bonus = 10 -/obj/projectile/beam/pulse/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/pulse/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if (!QDELETED(target) && (isturf(target) || isstructure(target))) if(isobj(target)) @@ -163,7 +162,7 @@ projectile_piercing = ALL var/pierce_hits = 2 -/obj/projectile/beam/pulse/heavy/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/pulse/heavy/on_hit(atom/target, blocked = 0, pierce_hit) if(pierce_hits <= 0) projectile_piercing = NONE pierce_hits -= 1 @@ -207,7 +206,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE -/obj/projectile/beam/lasertag/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/lasertag/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(ishuman(target)) var/mob/living/carbon/human/M = target @@ -249,7 +248,7 @@ light_color = LIGHT_COLOR_BLUE var/shrink_time = 90 -/obj/projectile/beam/shrink/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/shrink/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isopenturf(target) || isindestructiblewall(target))//shrunk floors wouldnt do anything except look weird, i-walls shouldn't be bypassable return diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm index 6808f7c48fd..85c2dce80c5 100644 --- a/code/modules/projectiles/projectile/bullets/_incendiary.dm +++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm @@ -5,7 +5,7 @@ /// If TRUE, leaves a trail of hotspots as it flies, very very chaotic var/leaves_fire_trail = TRUE -/obj/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/incendiary/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target @@ -41,7 +41,7 @@ wound_falloff_tile = -4 fire_stacks = 3 -/obj/projectile/bullet/incendiary/fire/on_hit(atom/target, blocked) +/obj/projectile/bullet/incendiary/fire/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/turf/location = get_turf(target) if(isopenturf(location)) diff --git a/code/modules/projectiles/projectile/bullets/cannonball.dm b/code/modules/projectiles/projectile/bullets/cannonball.dm index 11ffa603cbf..2f57a3dcc99 100644 --- a/code/modules/projectiles/projectile/bullets/cannonball.dm +++ b/code/modules/projectiles/projectile/bullets/cannonball.dm @@ -22,7 +22,7 @@ /// How much our object damage decreases on hit, similar to normal damage. var/object_damage_decrease_on_hit = 0 -/obj/projectile/bullet/cannonball/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/cannonball/on_hit(atom/target, blocked = 0, pierce_hit) damage -= damage_decrease_on_hit if(object_damage_decreases) object_damage -= min(damage, object_damage_decrease_on_hit) @@ -46,7 +46,7 @@ projectile_piercing = NONE damage = 40 //set to 30 before first mob impact, but they're gonna be gibbed by the explosion -/obj/projectile/bullet/cannonball/explosive/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/cannonball/explosive/on_hit(atom/target, blocked = 0, pierce_hit) explosion(target, devastation_range = 2, heavy_impact_range = 3, light_impact_range = 4, explosion_cause = src) . = ..() @@ -56,7 +56,7 @@ projectile_piercing = NONE damage = 15 //very low -/obj/projectile/bullet/cannonball/emp/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/cannonball/emp/on_hit(atom/target, blocked = 0, pierce_hit) empulse(src, 4, 10) . = ..() @@ -65,7 +65,7 @@ icon_state = "biggest_one" damage = 70 //low pierce -/obj/projectile/bullet/cannonball/biggest_one/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/cannonball/biggest_one/on_hit(atom/target, blocked = 0, pierce_hit) if(projectile_piercing == NONE) explosion(target, devastation_range = GLOB.MAX_EX_DEVESTATION_RANGE, heavy_impact_range = GLOB.MAX_EX_HEAVY_RANGE, light_impact_range = GLOB.MAX_EX_LIGHT_RANGE, flash_range = GLOB.MAX_EX_FLASH_RANGE, explosion_cause = src) . = ..() diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index 1f853127858..405552a8909 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -10,7 +10,7 @@ . = ..() create_reagents(50, NO_REACT) -/obj/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/dart/on_hit(atom/target, blocked = 0, pierce_hit) if(iscarbon(target)) var/mob/living/carbon/M = target if(blocked != 100) // not completely blocked diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm index 139f20c339c..fdb051e7f80 100644 --- a/code/modules/projectiles/projectile/bullets/dnainjector.dm +++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm @@ -7,7 +7,7 @@ embedding = null shrapnel_type = null -/obj/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0, pierce_hit) if(iscarbon(target)) var/mob/living/carbon/M = target if(blocked != 100) diff --git a/code/modules/projectiles/projectile/bullets/grenade.dm b/code/modules/projectiles/projectile/bullets/grenade.dm index b1d7278228f..a99a7b57ff3 100644 --- a/code/modules/projectiles/projectile/bullets/grenade.dm +++ b/code/modules/projectiles/projectile/bullets/grenade.dm @@ -8,7 +8,7 @@ embedding = null shrapnel_type = null -/obj/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0, pierce_hit) ..() explosion(target, devastation_range = -1, light_impact_range = 2, flame_range = 3, flash_range = 1, adminlog = FALSE, explosion_cause = src) return BULLET_ACT_HIT diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index b5411c937be..417f61534bc 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -65,7 +65,7 @@ damage = 10 ricochets_max = 0 -/obj/projectile/bullet/c38/trac/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/c38/trac/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/mob/living/carbon/M = target if(!istype(M)) @@ -83,7 +83,7 @@ damage = 20 ricochets_max = 0 -/obj/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target @@ -96,7 +96,7 @@ var/temperature = 100 ricochets_max = 0 -/obj/projectile/bullet/c38/iceblox/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/c38/iceblox/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/mob/living/M = target diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 639939e150f..13b6a6f9665 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -63,7 +63,7 @@ damage = 15 paralyze = 10 -/obj/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = 0, pierce_hit) ..() explosion(target, devastation_range = -1, light_impact_range = 1, explosion_cause = src) return BULLET_ACT_HIT diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index bc4f69eb946..4425b20eeed 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -14,7 +14,7 @@ ///Determines how much additional damage the round does to mechs. var/mecha_damage = 10 -/obj/projectile/bullet/p50/on_hit(atom/target, blocked = 0) +/obj/projectile/bullet/p50/on_hit(atom/target, blocked = 0, pierce_hit) if(isobj(target) && (blocked != 100)) var/obj/thing_to_break = target var/damage_to_deal = object_damage @@ -41,7 +41,7 @@ mecha_damage = 100 var/emp_radius = 2 -/obj/projectile/bullet/p50/disruptor/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/p50/disruptor/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if((blocked != 100) && isliving(target)) var/mob/living/living_guy = target @@ -60,7 +60,7 @@ object_damage = 30 mecha_damage = 0 -/obj/projectile/bullet/p50/incendiary/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/p50/incendiary/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/poor_burning_dork = target diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index c424f2cd6be..f595c3e1165 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -16,7 +16,7 @@ . = ..() SpinAnimation() -/obj/projectile/bullet/honker/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/honker/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/mob/M = target if(istype(M)) @@ -30,7 +30,7 @@ /obj/projectile/bullet/mime damage = 40 -/obj/projectile/bullet/mime/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/mime/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(!isliving(target)) return diff --git a/code/modules/projectiles/projectile/energy/ebow.dm b/code/modules/projectiles/projectile/energy/ebow.dm index 73faaffc22f..e1da23495f4 100644 --- a/code/modules/projectiles/projectile/energy/ebow.dm +++ b/code/modules/projectiles/projectile/energy/ebow.dm @@ -4,7 +4,7 @@ damage = 15 damage_type = TOX stamina = 60 - eyeblur = 10 + eyeblur = 20 SECONDS knockdown = 10 slur = 10 SECONDS diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index 440ab9438e2..c60c0c35d17 100644 --- a/code/modules/projectiles/projectile/energy/net_snare.dm +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -10,7 +10,7 @@ . = ..() SpinAnimation() -/obj/projectile/energy/net/on_hit(atom/target, blocked = FALSE) +/obj/projectile/energy/net/on_hit(atom/target, blocked = 0, pierce_hit) if(isliving(target)) var/turf/Tloc = get_turf(target) if(!locate(/obj/effect/nettingportal) in Tloc) @@ -64,7 +64,7 @@ hitsound = 'sound/weapons/taserhit.ogg' range = 4 -/obj/projectile/energy/trap/on_hit(atom/target, blocked = FALSE) +/obj/projectile/energy/trap/on_hit(atom/target, blocked = 0, pierce_hit) if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc)) else if(iscarbon(target)) @@ -82,7 +82,7 @@ hitsound = 'sound/weapons/taserhit.ogg' range = 10 -/obj/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE) +/obj/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = 0, pierce_hit) if(!ismob(target) || blocked >= 100) do_sparks(1, TRUE, src) qdel(src) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 9dadbd385be..67cbd4352ee 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -12,7 +12,7 @@ muzzle_type = /obj/effect/projectile/muzzle/stun impact_type = /obj/effect/projectile/impact/stun -/obj/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) +/obj/projectile/energy/electrode/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks! do_sparks(1, TRUE, src) diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm index 687bd1b8e73..65b9ba0162e 100644 --- a/code/modules/projectiles/projectile/energy/tesla.dm +++ b/code/modules/projectiles/projectile/energy/tesla.dm @@ -7,7 +7,7 @@ var/zap_range = 3 var/power = 4e6 -/obj/projectile/energy/tesla/on_hit(atom/target) +/obj/projectile/energy/tesla/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() tesla_zap(src, zap_range, power, zap_flags) qdel(src) @@ -32,7 +32,7 @@ speed = 1.5 var/shock_damage = 5 -/obj/projectile/energy/tesla_cannon/on_hit(atom/target) +/obj/projectile/energy/tesla_cannon/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/mob/living/victim = target diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index c8da91b9dde..7b2d546b668 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -31,7 +31,7 @@ name = "bolt of death" icon_state = "pulse1_bl" -/obj/projectile/magic/death/on_hit(atom/target) +/obj/projectile/magic/death/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) @@ -57,7 +57,7 @@ name = "bolt of resurrection" icon_state = "ion" -/obj/projectile/magic/resurrection/on_hit(atom/target) +/obj/projectile/magic/resurrection/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) @@ -85,7 +85,7 @@ var/inner_tele_radius = 0 var/outer_tele_radius = 6 -/obj/projectile/magic/teleport/on_hit(mob/target) +/obj/projectile/magic/teleport/on_hit(mob/target, blocked = 0, pierce_hit) . = ..() var/teleammount = 0 var/teleloc = target @@ -104,7 +104,7 @@ name = "bolt of safety" icon_state = "bluespace" -/obj/projectile/magic/safety/on_hit(atom/target) +/obj/projectile/magic/safety/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isturf(target)) return BULLET_ACT_HIT @@ -123,7 +123,7 @@ icon_state = "energy" var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond) -/obj/projectile/magic/door/on_hit(atom/target) +/obj/projectile/magic/door/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(istype(target, /obj/machinery/door)) OpenDoor(target) @@ -153,7 +153,7 @@ /// If set, this projectile will only pass certain changeflags to wabbajack var/set_wabbajack_changeflags -/obj/projectile/magic/change/on_hit(atom/target) +/obj/projectile/magic/change/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) @@ -171,7 +171,7 @@ icon_state = "red_1" damage_type = BURN -/obj/projectile/magic/animate/on_hit(atom/target, blocked = FALSE) +/obj/projectile/magic/animate/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() target.animate_atom_living(firer) @@ -251,7 +251,7 @@ target.forceMove(src) return PROJECTILE_PIERCE_PHASE -/obj/projectile/magic/locker/on_hit(target) +/obj/projectile/magic/locker/on_hit(atom/target, blocked = 0, pierce_hit) if(created) return ..() if(LAZYLEN(contents)) @@ -313,7 +313,7 @@ name = "bolt of flying" icon_state = "flight" -/obj/projectile/magic/flying/on_hit(mob/living/target) +/obj/projectile/magic/flying/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/atom/throw_target = get_edge_target_turf(target, angle2dir(Angle)) @@ -323,7 +323,7 @@ name = "bolt of bounty" icon_state = "bounty" -/obj/projectile/magic/bounty/on_hit(mob/living/target) +/obj/projectile/magic/bounty/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) target.apply_status_effect(/datum/status_effect/bounty, firer) @@ -332,16 +332,16 @@ name = "bolt of antimagic" icon_state = "antimagic" -/obj/projectile/magic/antimagic/on_hit(mob/living/target) +/obj/projectile/magic/antimagic/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() - if(isliving(target)) + if(istype(target)) target.apply_status_effect(/datum/status_effect/song/antimagic) /obj/projectile/magic/fetch name = "bolt of fetching" icon_state = "fetch" -/obj/projectile/magic/fetch/on_hit(mob/living/target) +/obj/projectile/magic/fetch/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/atom/throw_target = get_edge_target_turf(target, get_dir(target, firer)) @@ -351,7 +351,7 @@ name = "bolt of babel" icon_state = "babel" -/obj/projectile/magic/babel/on_hit(mob/living/carbon/target) +/obj/projectile/magic/babel/on_hit(mob/living/carbon/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) if(curse_of_babel(target)) @@ -361,7 +361,7 @@ name = "bolt of necropotence" icon_state = "necropotence" -/obj/projectile/magic/necropotence/on_hit(mob/living/target) +/obj/projectile/magic/necropotence/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(!isliving(target)) return @@ -378,7 +378,7 @@ name = "bolt of possession" icon_state = "wipe" -/obj/projectile/magic/wipe/on_hit(mob/living/carbon/target) +/obj/projectile/magic/wipe/on_hit(mob/living/carbon/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) for(var/x in target.get_traumas())//checks to see if the victim is already going through possession @@ -494,7 +494,7 @@ chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]") return ..() -/obj/projectile/magic/aoe/lightning/on_hit(target) +/obj/projectile/magic/aoe/lightning/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() tesla_zap(src, zap_range, zap_power, zap_flags) @@ -522,7 +522,7 @@ /// Flash radius of the fireball var/exp_flash = 3 -/obj/projectile/magic/fireball/on_hit(atom/target, blocked = FALSE, pierce_hit) +/obj/projectile/magic/fireball/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/mob/living/mob_target = target @@ -577,7 +577,7 @@ speed = 1 pixel_speed_multiplier = 1/7 -/obj/projectile/magic/aoe/juggernaut/on_hit(atom/target, blocked) +/obj/projectile/magic/aoe/juggernaut/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/turf/target_turf = get_turf(src) playsound(target_turf, 'sound/weapons/resonator_blast.ogg', 100, FALSE) diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm index 0fef1ef7443..608679bf6da 100644 --- a/code/modules/projectiles/projectile/special/floral.dm +++ b/code/modules/projectiles/projectile/special/floral.dm @@ -1,59 +1,67 @@ -/obj/projectile/energy/floramut - name = "alpha somatoray" - icon_state = "energy" +/obj/projectile/energy/flora damage = 0 damage_type = TOX armor_flag = ENERGY -/obj/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE) +/obj/projectile/energy/flora/on_hit(atom/target, blocked, pierce_hit) + if(!isliving(target)) + return ..() + + var/mob/living/hit_plant = target + if(!(hit_plant.mob_biotypes & MOB_PLANT)) + hit_plant.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) + return BULLET_ACT_BLOCK + . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.mob_biotypes & MOB_PLANT) - if(prob(15)) - L.adjustToxLoss(rand(3, 6)) - L.Paralyze(100) - L.visible_message(span_warning("[L] writhes in pain as [L.p_their()] vacuoles boil."), span_userdanger("You writhe in pain as your vacuoles boil!"), span_hear("You hear the crunching of leaves.")) - if(iscarbon(L) && L.has_dna()) - var/mob/living/carbon/C = L - if(prob(80)) - C.easy_random_mutate(NEGATIVE + MINOR_NEGATIVE) - else - C.easy_random_mutate(POSITIVE) - C.random_mutate_unique_identity() - C.random_mutate_unique_features() - C.domutcheck() - else - L.adjustFireLoss(rand(5, 15)) - L.show_message(span_userdanger("The radiation beam singes you!")) - -/obj/projectile/energy/florayield + if(. == BULLET_ACT_HIT && blocked < 100) + on_hit_plant_effect(target) + + return . + +/// Called when we hit a mob with plant biotype +/obj/projectile/energy/flora/proc/on_hit_plant_effect(mob/living/hit_plant) + return + +/obj/projectile/energy/flora/mut + name = "alpha somatoray" + icon_state = "energy" + +/obj/projectile/energy/flora/mut/on_hit_plant_effect(mob/living/hit_plant) + if(prob(85)) + hit_plant.adjustFireLoss(rand(5, 15)) + hit_plant.show_message(span_userdanger("The radiation beam singes you!")) + return + + hit_plant.adjustToxLoss(rand(3, 6)) + hit_plant.Paralyze(10 SECONDS) + hit_plant.visible_message( + span_warning("[hit_plant] writhes in pain as [hit_plant.p_their()] vacuoles boil."), + span_userdanger("You writhe in pain as your vacuoles boil!"), + span_hear("You hear the crunching of leaves."), + ) + if(iscarbon(hit_plant) && hit_plant.has_dna()) + var/mob/living/carbon/carbon_plant = hit_plant + if(prob(80)) + carbon_plant.easy_random_mutate(NEGATIVE + MINOR_NEGATIVE) + else + carbon_plant.easy_random_mutate(POSITIVE) + carbon_plant.random_mutate_unique_identity() + carbon_plant.random_mutate_unique_features() + carbon_plant.domutcheck() + +/obj/projectile/energy/flora/yield name = "beta somatoray" icon_state = "energy2" - damage = 0 - damage_type = TOX - armor_flag = ENERGY -/obj/projectile/energy/florayield/on_hit(atom/target, blocked = FALSE) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.mob_biotypes & MOB_PLANT) - L.set_nutrition(min(L.nutrition + 30, NUTRITION_LEVEL_FULL)) +/obj/projectile/energy/flora/yield/on_hit_plant_effect(mob/living/hit_plant) + hit_plant.set_nutrition(min(hit_plant.nutrition + 30, NUTRITION_LEVEL_FULL)) -/obj/projectile/energy/florarevolution +/obj/projectile/energy/flora/evolution name = "gamma somatoray" icon_state = "energy3" - damage = 0 - damage_type = TOX - armor_flag = ENERGY -/obj/projectile/energy/florarevolution/on_hit(atom/target, blocked = FALSE) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.mob_biotypes & MOB_PLANT) - L.show_message(span_notice("The radiation beam leaves you feeling disoriented!")) - L.set_dizzy_if_lower(30 SECONDS) - L.emote("flip") - L.emote("spin") +/obj/projectile/energy/flora/evolution/on_hit_plant_effect(mob/living/hit_plant) + hit_plant.show_message(span_notice("The radiation beam leaves you feeling disoriented!")) + hit_plant.set_dizzy_if_lower(30 SECONDS) + hit_plant.emote("flip") + hit_plant.emote("spin") diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm index 2a0df1b510b..1a23b653a05 100644 --- a/code/modules/projectiles/projectile/special/gravity.dm +++ b/code/modules/projectiles/projectile/special/gravity.dm @@ -16,7 +16,7 @@ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun?.power, 15) -/obj/projectile/gravityrepulse/on_hit() +/obj/projectile/gravityrepulse/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() T = get_turf(src) for(var/atom/movable/A in range(T, power)) @@ -50,7 +50,7 @@ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun?.power, 15) -/obj/projectile/gravityattract/on_hit() +/obj/projectile/gravityattract/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() T = get_turf(src) for(var/atom/movable/A in range(T, power)) @@ -83,7 +83,7 @@ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun?.power, 15) -/obj/projectile/gravitychaos/on_hit() +/obj/projectile/gravitychaos/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() T = get_turf(src) for(var/atom/movable/A in range(T, power)) diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm index 6dc0246d35b..9d25f1504cd 100644 --- a/code/modules/projectiles/projectile/special/ion.dm +++ b/code/modules/projectiles/projectile/special/ion.dm @@ -7,7 +7,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/ion var/emp_radius = 1 -/obj/projectile/ion/on_hit(atom/target, blocked = FALSE) +/obj/projectile/ion/on_hit(atom/target, blocked = 0, pierce_hit) ..() empulse(target, emp_radius, emp_radius) return BULLET_ACT_HIT diff --git a/code/modules/projectiles/projectile/special/meteor.dm b/code/modules/projectiles/projectile/special/meteor.dm index a0020a573d3..7cecbecc6aa 100644 --- a/code/modules/projectiles/projectile/special/meteor.dm +++ b/code/modules/projectiles/projectile/special/meteor.dm @@ -9,7 +9,7 @@ damage_type = BRUTE armor_flag = BULLET -/obj/projectile/meteor/on_hit(atom/target, blocked = FALSE) +/obj/projectile/meteor/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(. == BULLET_ACT_HIT && isliving(target)) explosion(target, devastation_range = -1, light_impact_range = 2, flame_range = 0, flash_range = 1, adminlog = FALSE) diff --git a/code/modules/projectiles/projectile/special/mindflayer.dm b/code/modules/projectiles/projectile/special/mindflayer.dm index 54889bbced1..9f15e9389d5 100644 --- a/code/modules/projectiles/projectile/special/mindflayer.dm +++ b/code/modules/projectiles/projectile/special/mindflayer.dm @@ -1,7 +1,7 @@ /obj/projectile/beam/mindflayer name = "flayer ray" -/obj/projectile/beam/mindflayer/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/mindflayer/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(ishuman(target)) var/mob/living/carbon/human/human_hit = target diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm index 24d24f68d30..077b3a275e9 100644 --- a/code/modules/projectiles/projectile/special/neurotoxin.dm +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -7,7 +7,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/neurotoxin armour_penetration = 50 -/obj/projectile/neurotoxin/on_hit(atom/target, blocked = FALSE) +/obj/projectile/neurotoxin/on_hit(atom/target, blocked = 0, pierce_hit) if(isalien(target)) damage = 0 return ..() diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm index cf8778fe4de..5564ba14dab 100644 --- a/code/modules/projectiles/projectile/special/plasma.dm +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -11,7 +11,7 @@ muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter impact_type = /obj/effect/projectile/impact/plasma_cutter -/obj/projectile/plasma/on_hit(atom/target) +/obj/projectile/plasma/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(ismineralturf(target)) var/turf/closed/mineral/M = target diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 08a2c18c2f7..22082d3809f 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -5,7 +5,7 @@ embedding = null shrapnel_type = null -/obj/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/gyro/on_hit(atom/target, blocked = 0, pierce_hit) ..() explosion(target, devastation_range = -1, light_impact_range = 2, explosion_cause = src) return BULLET_ACT_HIT @@ -25,7 +25,7 @@ /// Whether the rocket is capable of instantly killing a living target var/random_crits_enabled = TRUE // Worst thing Valve ever added -/obj/projectile/bullet/rocket/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/rocket/on_hit(atom/target, blocked = 0, pierce_hit) var/random_crit_gib = FALSE if(isliving(target) && prob(1) && random_crits_enabled) var/mob/living/gibbed_dude = target diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm index 7eae3edfa20..10c652b77b5 100644 --- a/code/modules/projectiles/projectile/special/temperature.dm +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -9,7 +9,7 @@ /obj/projectile/temp/is_hostile_projectile() return temperature != 0 // our damage is done by cooling or heating (casting to boolean here) -/obj/projectile/temp/on_hit(atom/target, blocked = 0) +/obj/projectile/temp/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/hit_mob = target diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm index 26873daac87..90eadd0bb09 100644 --- a/code/modules/projectiles/projectile/special/wormhole.dm +++ b/code/modules/projectiles/projectile/special/wormhole.dm @@ -22,9 +22,11 @@ gun = casing.gun -/obj/projectile/beam/wormhole/on_hit(atom/target) +/obj/projectile/beam/wormhole/on_hit(atom/target, blocked = 0, pierce_hit) var/obj/item/gun/energy/wormhole_projector/projector = gun.resolve() if(!projector) qdel(src) - return + return BULLET_ACT_BLOCK + + . = ..() projector.create_portal(src, get_turf(src)) diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm index d4c752751b8..e6105195798 100644 --- a/code/modules/religion/burdened/psyker.dm +++ b/code/modules/religion/burdened/psyker.dm @@ -254,7 +254,7 @@ wound_bonus = -10 embedding = null -/obj/projectile/bullet/c38/holy/on_hit(atom/target, blocked, pierce_hit) +/obj/projectile/bullet/c38/holy/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/roll_them_bones = rand(1,38) if(roll_them_bones == 1 && isliving(target)) diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 61f4e7a72e0..a7e54fa2c70 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -128,7 +128,7 @@ Slimecrossing Weapons icon_state = "pulse0_bl" hitsound = 'sound/effects/splat.ogg' -/obj/projectile/magic/bloodchill/on_hit(mob/living/target) +/obj/projectile/magic/bloodchill/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) target.apply_status_effect(/datum/status_effect/bloodchill) diff --git a/code/modules/spells/spell_types/conjure_item/lighting_packet.dm b/code/modules/spells/spell_types/conjure_item/lighting_packet.dm index cffddf7e0ce..2df0c85f470 100644 --- a/code/modules/spells/spell_types/conjure_item/lighting_packet.dm +++ b/code/modules/spells/spell_types/conjure_item/lighting_packet.dm @@ -33,7 +33,7 @@ hit_living.electrocute_act(80, src, flags = SHOCK_ILLUSION | SHOCK_NOGLOVES) qdel(src) -/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, quickstart = TRUE) +/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, gentle, quickstart = TRUE) . = ..() if(ishuman(thrower)) var/mob/living/carbon/human/human_thrower = thrower diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index c4fd2bcaceb..b72449de091 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -117,12 +117,11 @@ smoke.start() /obj/vehicle/ridden/atv/bullet_act(obj/projectile/P) - if(prob(50) || !buckled_mobs) + if(prob(50) || !LAZYLEN(buckled_mobs)) return ..() - for(var/m in buckled_mobs) - var/mob/buckled_mob = m + for(var/mob/buckled_mob as anything in buckled_mobs) buckled_mob.bullet_act(P) - return TRUE + return BULLET_ACT_HIT /obj/vehicle/ridden/atv/atom_destruction() explosion(src, devastation_range = -1, light_impact_range = 2, flame_range = 3, flash_range = 4) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 37fe73f4a2d..a72354d0c01 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -114,10 +114,19 @@ return ..() /obj/vehicle/sealed/mecha/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) //wrapper - if(!enclosed && LAZYLEN(occupants) && !(mecha_flags & SILICON_PILOT) && (hitting_projectile.def_zone == BODY_ZONE_HEAD || hitting_projectile.def_zone == BODY_ZONE_CHEST)) //allows bullets to hit the pilot of open-canopy mechs + . = ..() + if(. != BULLET_ACT_HIT) + return . + + //allows bullets to hit the pilot of open-canopy mechs + if(!enclosed \ + && LAZYLEN(occupants) \ + && !(mecha_flags & SILICON_PILOT) \ + && (def_zone == BODY_ZONE_HEAD || def_zone == BODY_ZONE_CHEST)) for(var/mob/living/hitmob as anything in occupants) hitmob.bullet_act(hitting_projectile, def_zone, piercing_hit) //If the sides are open, the occupant can be hit return BULLET_ACT_HIT + log_message("Hit by projectile. Type: [hitting_projectile]([hitting_projectile.damage_type]).", LOG_MECHA, color="red") // yes we *have* to run the armor calc proc here I love tg projectile code too try_damage_component(run_atom_armor( @@ -126,8 +135,7 @@ damage_flag = hitting_projectile.armor_flag, attack_dir = REVERSE_DIR(hitting_projectile.dir), armour_penetration = hitting_projectile.armour_penetration, - ), hitting_projectile.def_zone) - return ..() + ), def_zone) /obj/vehicle/sealed/mecha/ex_act(severity, target) log_message("Affected by explosion of severity: [severity].", LOG_MECHA, color="red") diff --git a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/friendly/dogs.dm b/modular_skyrat/master_files/code/modules/mob/living/simple_animal/friendly/dogs.dm index 06394cff6a5..f78a481cbd4 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/friendly/dogs.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/simple_animal/friendly/dogs.dm @@ -157,18 +157,21 @@ harass_target(thrown_by) -/mob/living/basic/pet/dog/corgi/borgi/bullet_act(obj/projectile/proj) +/mob/living/basic/pet/dog/corgi/borgi/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) . = ..() - if(!istype(proj, /obj/projectile/beam) && !istype(proj, /obj/projectile/bullet)) + if(. != BULLET_ACT_HIT) return - var/mob/living/carbon/human/target = proj.firer - if(proj.damage >= 10) - if(proj.damage_type != BRUTE && proj.damage_type != BURN) + if(!istype(hitting_projectile, /obj/projectile/beam) && !istype(hitting_projectile, /obj/projectile/bullet)) + return + + var/mob/living/carbon/human/target = hitting_projectile.firer + if(hitting_projectile.damage >= 10) + if(hitting_projectile.damage_type != BRUTE && hitting_projectile.damage_type != BURN) return - adjustBruteLoss(proj.damage) + adjustBruteLoss(hitting_projectile.damage) if(!isliving(target) || health <= 0) return diff --git a/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm b/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm index 6efc58b3e75..408f68c734d 100644 --- a/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm +++ b/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm @@ -121,8 +121,14 @@ attack_verb_continuous = "attacks" attack_verb_simple = "attack" -/mob/living/simple_animal/hostile/megafauna/hierophant/astrum/bullet_act(obj/projectile/bullet) - apply_damage(bullet.damage, bullet.damage_type) // no damage reduction +/mob/living/simple_animal/hostile/megafauna/hierophant/astrum/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + if(. != BULLET_ACT_HIT) + return + + if(!hitting_projectile.is_hostile_projectile()) + return + + apply_damage(hitting_projectile.damage, hitting_projectile.damage_type) // no damage reduction /mob/living/simple_animal/hostile/megafauna/hierophant/astrum/death(gibbed) spawn_gibs() diff --git a/modular_skyrat/modules/black_mesa/code/mobs/bullsquid.dm b/modular_skyrat/modules/black_mesa/code/mobs/bullsquid.dm index 992ac35c43a..debcf75040f 100644 --- a/modular_skyrat/modules/black_mesa/code/mobs/bullsquid.dm +++ b/modular_skyrat/modules/black_mesa/code/mobs/bullsquid.dm @@ -45,6 +45,6 @@ hitsound = 'modular_skyrat/modules/black_mesa/sound/mobs/bullsquid/splat1.ogg' hitsound_wall = 'modular_skyrat/modules/black_mesa/sound/mobs/bullsquid/splat1.ogg' -/obj/projectile/bullsquid/on_hit(atom/target, blocked, pierce_hit) +/obj/projectile/bullsquid/on_hit(atom/target, blocked = 0, pierce_hit) new /obj/effect/decal/cleanable/greenglow(target.loc) return ..() diff --git a/modular_skyrat/modules/cellguns/code/medigun_cells.dm b/modular_skyrat/modules/cellguns/code/medigun_cells.dm index c02118d226e..c95d890b343 100644 --- a/modular_skyrat/modules/cellguns/code/medigun_cells.dm +++ b/modular_skyrat/modules/cellguns/code/medigun_cells.dm @@ -20,7 +20,7 @@ name = "oxygen heal shot" var/amount_healed = 10 -/obj/projectile/energy/medical/oxygen/on_hit(mob/living/target) +/obj/projectile/energy/medical/oxygen/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(!IsLivingHuman(target)) return FALSE @@ -145,7 +145,7 @@ var/max_clone = 2/3 var/base_disgust = 3 -/obj/projectile/energy/medical/brute/on_hit(mob/living/target) +/obj/projectile/energy/medical/brute/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() healBrute(target, amount_healed, max_clone, base_disgust) @@ -162,7 +162,7 @@ var/max_clone = 2/3 var/base_disgust = 3 -/obj/projectile/energy/medical/burn/on_hit(mob/living/target) +/obj/projectile/energy/medical/burn/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() healBurn(target, amount_healed, max_clone, base_disgust) @@ -177,7 +177,7 @@ icon_state = "green_laser" var/amount_healed = 5 -/obj/projectile/energy/medical/toxin/on_hit(mob/living/target) +/obj/projectile/energy/medical/toxin/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() healTox(target, amount_healed) @@ -191,7 +191,7 @@ var/amount_healed = 7.5 var/base_disgust = 3 -/obj/projectile/energy/medical/safe/brute/on_hit(mob/living/target) +/obj/projectile/energy/medical/safe/brute/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() safeBrute(target, amount_healed, base_disgust) @@ -204,7 +204,7 @@ var/amount_healed = 7.5 var/base_disgust = 3 -/obj/projectile/energy/medical/safe/burn/on_hit(mob/living/target) +/obj/projectile/energy/medical/safe/burn/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() safeBurn(target, amount_healed, base_disgust) @@ -328,7 +328,7 @@ name = "powerful toxin heal shot" amount_healed = 10 -/obj/projectile/energy/medical/upgraded/toxin3/on_hit(mob/living/target) +/obj/projectile/energy/medical/upgraded/toxin3/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() healTox(target, 10) @@ -367,7 +367,7 @@ /obj/projectile/energy/medical/utility/clotting name = "clotting agent shot" -/obj/projectile/energy/medical/utility/clotting/on_hit(mob/living/target) +/obj/projectile/energy/medical/utility/clotting/on_hit(mob/living/target, blocked = 0, pierce_hit) if(!IsLivingHuman(target)) return FALSE @@ -386,7 +386,7 @@ /obj/projectile/energy/medical/utility/temperature name = "temperature adjustment shot" -/obj/projectile/energy/medical/utility/temperature/on_hit(mob/living/target) +/obj/projectile/energy/medical/utility/temperature/on_hit(mob/living/target, blocked = 0, pierce_hit) if(!IsLivingHuman(target)) return FALSE @@ -408,7 +408,7 @@ /obj/projectile/energy/medical/utility/gown name = "hardlight surgical gown field" -/obj/projectile/energy/medical/utility/gown/on_hit(mob/living/target) +/obj/projectile/energy/medical/utility/gown/on_hit(mob/living/target, blocked = 0, pierce_hit) if(!istype(target, /mob/living/carbon/human)) //Dead check isn't fully needed, since it'd be reasonable for this to work on corpses. return @@ -435,7 +435,7 @@ embedding = list("embed_chance" = 100, ignore_throwspeed_threshold = TRUE, "pain_mult" = 0, "jostle_pain_mult" = 0, "fall_chance" = 0) damage = 0 -/obj/projectile/energy/medical/utility/salve/on_hit(mob/living/target) +/obj/projectile/energy/medical/utility/salve/on_hit(mob/living/target, blocked = 0, pierce_hit) if(!IsLivingHuman(target)) //No using this on the dead or synths. return FALSE . = ..() @@ -449,7 +449,7 @@ /obj/projectile/energy/medical/utility/bed name = "hardlight bed field" -/obj/projectile/energy/medical/utility/bed/on_hit(mob/living/target) +/obj/projectile/energy/medical/utility/bed/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(!istype(target, /mob/living/carbon/human)) //Only checks if they are human, it would make sense for this to work on the dead. @@ -476,7 +476,7 @@ /obj/projectile/energy/medical/utility/body_teleporter name = "bluespace transportation field" -/obj/projectile/energy/medical/utility/body_teleporter/on_hit(mob/living/target) +/obj/projectile/energy/medical/utility/body_teleporter/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(!ishuman(target) || (target.stat != DEAD && !HAS_TRAIT(target, TRAIT_DEATHCOMA))) @@ -611,7 +611,7 @@ grace_period = TRUE access_teleporting = TRUE -/obj/projectile/energy/medical/utility/relocation/on_hit(mob/living/target) +/obj/projectile/energy/medical/utility/relocation/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(!ishuman(target)) diff --git a/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm b/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm index 77d35257bab..7094e11fcef 100644 --- a/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm +++ b/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm @@ -53,6 +53,7 @@ GLOBAL_LIST_EMPTY(clockwork_marauders) communicate.Grant(src) GLOB.clockwork_marauders += src + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(block_bullets)) /mob/living/basic/clockwork_marauder/Destroy() @@ -80,13 +81,14 @@ GLOBAL_LIST_EMPTY(clockwork_marauders) return ..() -/mob/living/basic/clockwork_marauder/bullet_act(obj/projectile/proj) - //Block Ranged Attacks +/mob/living/basic/clockwork_marauder/proc/block_bullets(datum/source, obj/projectile/hitting_projectile) + SIGNAL_HANDLER + if(shield_health) damage_shield() - to_chat(src, span_warning("Your shield blocks the attack.")) - return BULLET_ACT_BLOCK - return ..() + visible_message(span_warning("[src]'s shield blocks the attack!")) + return COMPONENT_BULLET_BLOCKED + return NONE /// Damage the marauder's shield by one tick diff --git a/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/drinks.dm b/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/drinks.dm index 65b27fc0081..14d158734fb 100644 --- a/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/drinks.dm +++ b/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/drinks.dm @@ -51,9 +51,13 @@ return TRUE . = ..() -/obj/item/reagent_containers/cup/soda_cans/skyrat/bullet_act(obj/projectile/P) +/obj/item/reagent_containers/cup/soda_cans/skyrat/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) . = ..() - if(P.damage > 0 && P.damage_type == BRUTE && !QDELETED(src)) + + if(. != BULLET_ACT_HIT) + return + + if(hitting_projectile.damage > 0 && hitting_projectile.damage_type == BRUTE && !QDELETED(src)) var/obj/item/trash/can/skyrat/crushed_can = new /obj/item/trash/can/skyrat(src.loc) crushed_can.icon_state = icon_state var/atom/throw_target = get_edge_target_turf(crushed_can, pick(GLOB.alldirs)) diff --git a/modular_skyrat/modules/gunsgalore/code/ammo/ammo.dm b/modular_skyrat/modules/gunsgalore/code/ammo/ammo.dm index 419d60ec514..688938de1b0 100644 --- a/modular_skyrat/modules/gunsgalore/code/ammo/ammo.dm +++ b/modular_skyrat/modules/gunsgalore/code/ammo/ammo.dm @@ -131,7 +131,7 @@ var/heavy_emp_radius = -1 var/light_emp_radius = 0 -/obj/projectile/bullet/a762x39/emp/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/a762x39/emp/on_hit(atom/target, blocked = 0, pierce_hit) ..() empulse(target, heavy_emp_radius, light_emp_radius) return BULLET_ACT_HIT diff --git a/modular_skyrat/modules/medical/code/smartdarts.dm b/modular_skyrat/modules/medical/code/smartdarts.dm index ed649300e93..326f8382f41 100644 --- a/modular_skyrat/modules/medical/code/smartdarts.dm +++ b/modular_skyrat/modules/medical/code/smartdarts.dm @@ -92,7 +92,7 @@ /datum/reagent/medicine/morphine, ) -/obj/projectile/bullet/dart/syringe/dart/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/dart/syringe/dart/on_hit(atom/target, blocked = 0, pierce_hit) if(!iscarbon(target)) ..(target, blocked) reagents.flags &= ~(NO_REACT) diff --git a/modular_skyrat/modules/microfusion/code/projectiles.dm b/modular_skyrat/modules/microfusion/code/projectiles.dm index f14bb7c3888..53f19941f8d 100644 --- a/modular_skyrat/modules/microfusion/code/projectiles.dm +++ b/modular_skyrat/modules/microfusion/code/projectiles.dm @@ -40,7 +40,7 @@ color = LIGHT_COLOR_FIRE light_color = LIGHT_COLOR_FIRE -/obj/projectile/beam/laser/microfusion/superheated/on_hit(atom/target, blocked) +/obj/projectile/beam/laser/microfusion/superheated/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/mob/living/living = target diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/grenade.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/grenade.dm index 37c9fc0f835..fa3e2e80460 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/grenade.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/grenade.dm @@ -52,7 +52,7 @@ sharpness = NONE -/obj/projectile/bullet/c980grenade/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/c980grenade/on_hit(atom/target, blocked = 0, pierce_hit) ..() fuse_activation(target) return BULLET_ACT_HIT diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/rifle.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/rifle.dm index a012b594c29..4cb969f7b65 100644 --- a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/rifle.dm +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/carwo_defense_systems/ammo/rifle.dm @@ -129,7 +129,7 @@ projectile_piercing = PASSMOB -/obj/projectile/bullet/c40sol/pierce/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/c40sol/pierce/on_hit(atom/target, blocked = 0, pierce_hit) if(isliving(target)) var/mob/living/poor_sap = target @@ -177,7 +177,7 @@ var/firestacks_to_give = 1 -/obj/projectile/bullet/c40sol/incendiary/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/c40sol/incendiary/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) diff --git a/modular_skyrat/modules/modular_weapons/code/pepperball_gun.dm b/modular_skyrat/modules/modular_weapons/code/pepperball_gun.dm index aa24209512a..6b28643245d 100644 --- a/modular_skyrat/modules/modular_weapons/code/pepperball_gun.dm +++ b/modular_skyrat/modules/modular_weapons/code/pepperball_gun.dm @@ -48,7 +48,7 @@ var/contained_reagent = /datum/reagent/consumable/condensedcapsaicin var/reagent_volume = 5 -/obj/projectile/bullet/pepperball/on_hit(atom/target, blocked, pierce_hit) +/obj/projectile/bullet/pepperball/on_hit(atom/target, blocked = 0, pierce_hit) if(isliving(target)) var/mob/living/M = target if(M.can_inject()) diff --git a/modular_skyrat/modules/mold/code/mold_structures.dm b/modular_skyrat/modules/mold/code/mold_structures.dm index 30aa9f4e40c..e2e3a8c468e 100644 --- a/modular_skyrat/modules/mold/code/mold_structures.dm +++ b/modular_skyrat/modules/mold/code/mold_structures.dm @@ -272,11 +272,11 @@ discharge() . = ..() -/obj/structure/mold/structure/bulb/bullet_act(obj/projectile/hit_projectile) - if(istype(hit_projectile, /obj/projectile/energy/nuclear_particle)) - return ..() - discharge() +/obj/structure/mold/structure/bulb/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) . = ..() + if(istype(hitting_projectile, /obj/projectile/energy/nuclear_particle) || . != BULLET_ACT_HIT) + return + discharge() /obj/structure/mold/structure/bulb/Destroy() if(mold_controller) diff --git a/modular_skyrat/modules/novaya_ert/code/surplus_weapons.dm b/modular_skyrat/modules/novaya_ert/code/surplus_weapons.dm index aa9fda10f89..e1cc649d5f4 100644 --- a/modular_skyrat/modules/novaya_ert/code/surplus_weapons.dm +++ b/modular_skyrat/modules/novaya_ert/code/surplus_weapons.dm @@ -58,7 +58,7 @@ pass_flags = PASSTABLE | PASSGRILLE // His ass does NOT pass through glass! weak_against_armour = TRUE -/obj/projectile/beam/laser/plasma_glob/on_hit(atom/target, blocked) +/obj/projectile/beam/laser/plasma_glob/on_hit(atom/target, blocked = 0, pierce_hit) if(istype(target, /obj/structure/blob) || HAS_TRAIT(target, TRAIT_BLOB_ALLY)) damage = damage * 0.75 return ..() diff --git a/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm b/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm index 09e98b4bf08..e55e697861b 100644 --- a/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm +++ b/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm @@ -292,7 +292,7 @@ weak_against_armour = TRUE var/temperature = 30 -/obj/projectile/bullet/pellet/shotgun_buckshot/iceblox/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/pellet/shotgun_buckshot/iceblox/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/mob/living/UnluckyBastard = target diff --git a/modular_skyrat/modules/xenos_skyrat_redo/code/xeno_types/rouny.dm b/modular_skyrat/modules/xenos_skyrat_redo/code/xeno_types/rouny.dm index a8e749e3edc..5a7cb614fb5 100644 --- a/modular_skyrat/modules/xenos_skyrat_redo/code/xeno_types/rouny.dm +++ b/modular_skyrat/modules/xenos_skyrat_redo/code/xeno_types/rouny.dm @@ -82,12 +82,12 @@ addtimer(CALLBACK(owner, TYPE_PROC_REF(/datum, remove_filter), RUNNER_BLUR_EFFECT), 0.5 SECONDS) return BULLET_ACT_FORCE_PIERCE -/mob/living/carbon/alien/adult/skyrat/runner/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE) +/mob/living/carbon/alien/adult/skyrat/runner/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) if(evade_ability) var/evade_result = evade_ability.on_projectile_hit() if(!(evade_result == BULLET_ACT_HIT)) return evade_result - . = ..() + return ..() #undef EVASION_VENTCRAWL_INABILTY_CD_PERCENTAGE #undef RUNNER_BLUR_EFFECT diff --git a/modular_skyrat/modules/xenos_skyrat_redo/code/xeno_types/sentinel.dm b/modular_skyrat/modules/xenos_skyrat_redo/code/xeno_types/sentinel.dm index 759ee204f26..c517401954b 100644 --- a/modular_skyrat/modules/xenos_skyrat_redo/code/xeno_types/sentinel.dm +++ b/modular_skyrat/modules/xenos_skyrat_redo/code/xeno_types/sentinel.dm @@ -112,7 +112,7 @@ damage_type = STAMINA armor_flag = BIO -/obj/projectile/neurotoxin/on_hit(atom/target, blocked = FALSE) +/obj/projectile/neurotoxin/on_hit(atom/target, blocked = 0, pierce_hit) if(isalien(target)) damage = 0 return ..() From 59652c91f09f232f3e990f1358e8fc605ec9963c Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:29:54 +0300 Subject: [PATCH 18/22] [MIRROR] Adds a smidge of information for species hard-dels [MDB IGNORE] (#24452) (#168) * Adds a smidge of information for species hard-dels (#79064) ## About The Pull Request Species hard deletes are a little difficult to track down without the ref tracker due to having no owner so I figure this might help... just a tiny bit. Maybe. This will let us know if the species hard-deleting was applied to a human or not. `properly_gained` is set to `TRUE` in `on_species_gain`. If it is false, it might be a shadow species kept in DNA or some other weird place or something. * Adds a smidge of information for species hard-dels --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- code/modules/mob/living/carbon/human/_species.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 62d60a03fde..2ba24884ded 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -2402,3 +2402,9 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/check_head_flags(check_flags = NONE) var/obj/item/bodypart/head/fake_head = bodypart_overrides[BODY_ZONE_HEAD] return (initial(fake_head.head_flags) & check_flags) + +/datum/species/dump_harddel_info() + if(harddel_deets_dumped) + return + harddel_deets_dumped = TRUE + return "Gained / Owned: [properly_gained ? "Yes" : "No"]" From 3ce838a61f7ba2ad9d93cdfafe02ed6a467c3657 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:30:13 +0300 Subject: [PATCH 19/22] arrows can be converted (#24449) (#169) * arrows can be converted * Update modular_skyrat/modules/reagent_forging/code/forge_weapons.dm --------- Co-authored-by: jjpark-kb <55967837+jjpark-kb@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../reagent_forging/code/forge_weapons.dm | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/modular_skyrat/modules/reagent_forging/code/forge_weapons.dm b/modular_skyrat/modules/reagent_forging/code/forge_weapons.dm index 1b056d2e160..cdc6a96ef00 100644 --- a/modular_skyrat/modules/reagent_forging/code/forge_weapons.dm +++ b/modular_skyrat/modules/reagent_forging/code/forge_weapons.dm @@ -239,22 +239,29 @@ . = ..() AddComponent(/datum/component/reagent_weapon) -/obj/item/ammo_casing/arrow/forged - desc = "An arrow made of wood, typically fired from a bow. It can be reinforced with sinew." - projectile_type = /obj/projectile/bullet/arrow/forged - -/obj/item/ammo_casing/arrow/forged/attackby(obj/item/attacking_item, mob/user, params) +/obj/item/ammo_casing/arrow/attackby(obj/item/attacking_item, mob/user, params) + var/spawned_item if(istype(attacking_item, /obj/item/stack/sheet/sinew)) - var/obj/item/stack/stack_item = attacking_item - if(!stack_item.use(1)) - return - new /obj/item/ammo_casing/arrow/ash(get_turf(src)) - qdel(src) + spawned_item = /obj/item/ammo_casing/arrow/ash + + if(istype(attacking_item, /obj/item/stack/sheet/bone)) + spawned_item = /obj/item/ammo_casing/arrow/bone + + if(istype(attacking_item, /obj/item/stack/tile/bronze)) + spawned_item = /obj/item/ammo_casing/arrow/bronze + + if(!spawned_item) + return ..() + + var/obj/item/stack/stack_item = attacking_item + if(!stack_item.use(1)) return - return ..() -/obj/projectile/bullet/arrow/forged - projectile_type = /obj/item/ammo_casing/arrow/forged + var/obj/item/ammo_casing/arrow/converted_arrow = new spawned_item(get_turf(src)) + transfer_fingerprints_to(converted_arrow) + remove_item_from_storage(user) + user.put_in_hands(converted_arrow) + qdel(src) #define INCREASE_BLOCK_CHANGE 2 From 8ec222d86c7841bd88b061082362d2490696586c Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:30:32 +0300 Subject: [PATCH 20/22] add stone to antfarm and remove smelted sheets (#24453) (#170) Co-authored-by: jjpark-kb <55967837+jjpark-kb@users.noreply.github.com> --- .../modules/ashwalkers/code/buildings/antfarm.dm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modular_skyrat/modules/ashwalkers/code/buildings/antfarm.dm b/modular_skyrat/modules/ashwalkers/code/buildings/antfarm.dm index 49065d0f5b7..5e3a8fbd64c 100644 --- a/modular_skyrat/modules/ashwalkers/code/buildings/antfarm.dm +++ b/modular_skyrat/modules/ashwalkers/code/buildings/antfarm.dm @@ -12,14 +12,15 @@ /// the list of ore-y stuff that ants can drag up from deep within their nest var/list/ore_list = list( /obj/item/stack/ore/iron = 20, - /obj/item/stack/ore/glass = 20, - /obj/item/stack/sheet/mineral/plasma = 14, - /obj/item/stack/sheet/mineral/silver = 8, + /obj/item/stack/ore/glass/basalt = 20, + /obj/item/stack/ore/plasma = 14, + /obj/item/stack/ore/silver = 8, /obj/item/xenoarch/strange_rock = 8, + /obj/item/stack/stone = 8, /obj/item/stack/sheet/mineral/coal = 8, - /obj/item/stack/sheet/mineral/titanium = 8, - /obj/item/stack/sheet/mineral/uranium = 3, - /obj/item/stack/sheet/mineral/gold = 3, + /obj/item/stack/ore/titanium = 8, + /obj/item/stack/ore/uranium = 3, + /obj/item/stack/ore/gold = 3, ) // The cooldown between each worm "breeding" COOLDOWN_DECLARE(ant_timer) From 9945c8a3db096046dbb3bd86c092b8af5555c00d Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 14:07:07 +0300 Subject: [PATCH 21/22] [MIRROR] new syndicate item - bee smoker [MDB IGNORE] (#172) * new syndicate item - bee smoker (#78988) --------- Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com> --- code/__DEFINES/ai/monsters.dm | 2 + .../run_away_from_target.dm | 2 +- .../targetting_datums/dont_target_friends.dm | 36 ++--- code/datums/ai/dog/dog_controller.dm | 4 +- .../pet_commands/pet_commands_basic.dm | 4 +- code/datums/looping_sounds/item_sounds.dm | 4 + .../hydroponics/beekeeping/bee_smoker.dm | 117 +++++++++++++++ .../mob/living/basic/farm_animals/bee/_bee.dm | 11 ++ .../basic/farm_animals/bee/bee_ai_behavior.dm | 142 +++++++++++++++++- .../basic/farm_animals/bee/bee_ai_subtree.dm | 2 + .../mob/living/basic/heretic/star_gazer.dm | 2 +- .../basic/jungle/seedling/seedling_ai.dm | 4 +- .../basic/lavaland/goldgrub/goldgrub_ai.dm | 2 +- .../basic/lavaland/mook/mook_abilities.dm | 2 + .../mob/living/basic/lavaland/mook/mook_ai.dm | 2 +- .../mob/living/basic/minebots/minebot_ai.dm | 2 +- .../space_fauna/carp/carp_controllers.dm | 10 +- .../mob/living/basic/vermin/cockroach.dm | 2 +- code/modules/mob/living/basic/vermin/frog.dm | 2 +- code/modules/mob/living/basic/vermin/mouse.dm | 4 +- code/modules/uplink/uplink_items/job.dm | 7 + .../equipment/hydroponics_lefthand.dmi | Bin 1175 -> 1298 bytes .../equipment/hydroponics_righthand.dmi | Bin 1188 -> 1306 bytes icons/obj/service/hydroponics/equipment.dmi | Bin 34322 -> 34781 bytes sound/weapons/beesmoke.ogg | Bin 0 -> 200682 bytes tgstation.dme | 1 + 26 files changed, 318 insertions(+), 46 deletions(-) create mode 100644 code/modules/hydroponics/beekeeping/bee_smoker.dm create mode 100644 sound/weapons/beesmoke.ogg diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm index 2867ba4a6fc..72d756c0554 100644 --- a/code/__DEFINES/ai/monsters.dm +++ b/code/__DEFINES/ai/monsters.dm @@ -45,6 +45,8 @@ #define BB_CURRENT_HOME "BB_current_home" ///the hydro we will pollinate #define BB_TARGET_HYDRO "BB_target_hydro" +///key to swarm around +#define BB_SWARM_TARGET "BB_swarm_target" // bear keys ///the hive with honey that we will steal from diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm index 551cb12f3b1..07d2a17cc8d 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm @@ -55,7 +55,7 @@ var/list/airlocks = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock) for(var/i in 1 to run_distance) var/turf/test_destination = get_ranged_target_turf_direct(source, target, range = i, offset = angle) - if(test_destination.is_blocked_turf(exclude_mobs = !source.density, source_atom = source, ignore_atoms = airlocks)) + if(test_destination.is_blocked_turf(source_atom = source, ignore_atoms = airlocks)) break return_turf = test_destination return return_turf diff --git a/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm b/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm index f1bd411fd29..e2081bf308e 100644 --- a/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm +++ b/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm @@ -1,43 +1,25 @@ /// Don't target an atom in our friends list (or turfs), anything else is fair game -/datum/targetting_datum/not_friends +/datum/targetting_datum/basic/not_friends /// Stop regarding someone as a valid target once they pass this stat level, setting it to DEAD means you will happily attack corpses var/attack_until_past_stat = HARD_CRIT /// If we can try to closed turfs or not var/attack_closed_turf = FALSE ///Returns true or false depending on if the target can be attacked by the mob -/datum/targetting_datum/not_friends/can_attack(mob/living/living_mob, atom/target, vision_range) - if (!target) - return FALSE - if (attack_closed_turf) - if (isopenturf(target)) - return FALSE - else - if (isturf(target)) - return FALSE - - if (ismob(target)) - var/mob/mob_target = target - if (mob_target.status_flags & GODMODE) - return FALSE - if (mob_target.stat > attack_until_past_stat) - return FALSE +/datum/targetting_datum/basic/not_friends/can_attack(mob/living/living_mob, atom/target, vision_range) + if(attack_closed_turf && isclosedturf(target)) + return TRUE - if (living_mob.see_invisible < target.invisibility) - return FALSE - if (isturf(target.loc) && living_mob.z != target.z) // z check will always fail if target is in a mech - return FALSE - if (!living_mob.ai_controller) // How did you get here? + if(target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST]) return FALSE - if (!(target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST])) - // We don't have any friends, anything's fair game - // OR This is not our friend, fire at will - return TRUE + return ..() +///friends dont care about factions +/datum/targetting_datum/basic/not_friends/faction_check(mob/living/living_mob, mob/living/the_target) return FALSE -/datum/targetting_datum/not_friends/attack_closed_turfs +/datum/targetting_datum/basic/not_friends/attack_closed_turfs attack_closed_turf = TRUE /// Subtype that allows us to target items while deftly avoiding attacking our allies. Be careful when it comes to targetting items as an AI could get trapped targetting something it can't destroy. diff --git a/code/datums/ai/dog/dog_controller.dm b/code/datums/ai/dog/dog_controller.dm index 1ac19d01022..a95e3d57b6b 100644 --- a/code/datums/ai/dog/dog_controller.dm +++ b/code/datums/ai/dog/dog_controller.dm @@ -2,7 +2,7 @@ blackboard = list( BB_DOG_HARASS_HARM = TRUE, BB_VISION_RANGE = AI_DOG_VISION_RANGE, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_dog @@ -19,7 +19,7 @@ blackboard = list( BB_DOG_HARASS_HARM = TRUE, BB_VISION_RANGE = AI_DOG_VISION_RANGE, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, // Find nearby mobs with tongs in hand. BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/holding_object(/obj/item/kitchen/tongs), BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/pet/dog), diff --git a/code/datums/components/pet_commands/pet_commands_basic.dm b/code/datums/components/pet_commands/pet_commands_basic.dm index ff29b8f37d2..ea9612c4ada 100644 --- a/code/datums/components/pet_commands/pet_commands_basic.dm +++ b/code/datums/components/pet_commands/pet_commands_basic.dm @@ -41,13 +41,15 @@ radial_icon = 'icons/testing/turf_analysis.dmi' radial_icon_state = "red_arrow" speech_commands = list("heel", "follow") + ///the behavior we use to follow + var/follow_behavior = /datum/ai_behavior/pet_follow_friend /datum/pet_command/follow/set_command_active(mob/living/parent, mob/living/commander) . = ..() set_command_target(parent, commander) /datum/pet_command/follow/execute_action(datum/ai_controller/controller) - controller.queue_behavior(/datum/ai_behavior/pet_follow_friend, BB_CURRENT_PET_TARGET) + controller.queue_behavior(follow_behavior, BB_CURRENT_PET_TARGET) return SUBTREE_RETURN_FINISH_PLANNING /** diff --git a/code/datums/looping_sounds/item_sounds.dm b/code/datums/looping_sounds/item_sounds.dm index d38dd6737a3..f8ed5d89b20 100644 --- a/code/datums/looping_sounds/item_sounds.dm +++ b/code/datums/looping_sounds/item_sounds.dm @@ -40,3 +40,7 @@ end_volume = 35 volume = 40 ignore_walls = FALSE + +/datum/looping_sound/beesmoke + mid_sounds = list('sound/weapons/beesmoke.ogg' = 1) + volume = 5 diff --git a/code/modules/hydroponics/beekeeping/bee_smoker.dm b/code/modules/hydroponics/beekeeping/bee_smoker.dm new file mode 100644 index 00000000000..fc296339a9f --- /dev/null +++ b/code/modules/hydroponics/beekeeping/bee_smoker.dm @@ -0,0 +1,117 @@ +/// multiplier to decide how much fuel we add to a smoker +#define WEED_WINE_MULTIPLIER 0.2 + +/obj/item/bee_smoker + name = "bee smoker" + desc = "A device which can be used to hypnotize bees!" + icon = 'icons/obj/service/hydroponics/equipment.dmi' + icon_state = "bee_smoker" + inhand_icon_state = "bee_smoker" + lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' + item_flags = NOBLUDGEON + /// current level of fuel we have + var/current_herb_fuel = 50 + /// maximum amount of fuel we can hold + var/max_herb_fuel = 50 + /// are we currently activated? + var/activated = FALSE + /// sound to play when releasing smoke + var/datum/looping_sound/beesmoke/beesmoke_loop + ///how much fuel it costs to use this item + var/single_use_cost = 5 + +/obj/item/bee_smoker/Initialize(mapload) + . = ..() + beesmoke_loop = new(src) + +/obj/item/bee_smoker/attack_self(mob/user) + . = ..() + if(.) + return TRUE + if(!activated && current_herb_fuel <= 0) + user.balloon_alert(user, "no fuel!") + return TRUE + alter_state() + user.balloon_alert(user, "[activated ? "activated" : "deactivated"]") + return TRUE + +/obj/item/bee_smoker/afterattack(atom/attacked_atom, mob/living/user, proximity) + . = ..() + + if(!proximity) + return + + . |= AFTERATTACK_PROCESSED_ITEM + + if(!activated) + user.balloon_alert(user, "not activated!") + return + + if(current_herb_fuel < single_use_cost) + user.balloon_alert(user, "not enough fuel!") + return + + current_herb_fuel -= single_use_cost + playsound(src, 'sound/effects/spray2.ogg', 100, TRUE) + var/turf/target_turf = get_turf(attacked_atom) + new /obj/effect/temp_visual/mook_dust(target_turf) + + for(var/mob/living/basic/bee/friend in target_turf) + if(friend.flags_1 & HOLOGRAM_1) + continue + friend.befriend(user) + + if(!istype(attacked_atom, /obj/structure/beebox)) + return + + var/obj/structure/beebox/hive = attacked_atom + for(var/mob/living/bee as anything in hive.bees) + if(bee.flags_1 & HOLOGRAM_1) + continue + bee.befriend(user) + +/obj/item/bee_smoker/attackby(obj/item/herb, mob/living/carbon/human/user, list/modifiers) + . = ..() + if(.) + return + if(!istype(herb, /obj/item/food/grown/cannabis)) + return + var/obj/item/food/grown/cannabis/weed = herb + if(isnull(weed.wine_power)) + return TRUE + if(current_herb_fuel == max_herb_fuel) + user.balloon_alert(user, "already at maximum fuel!") + return TRUE + var/fuel_worth = weed.wine_power * WEED_WINE_MULTIPLIER + current_herb_fuel = (current_herb_fuel + fuel_worth > max_herb_fuel) ? max_herb_fuel : current_herb_fuel + fuel_worth + user.balloon_alert(user, "fuel added") + qdel(weed) + return TRUE + +/obj/item/bee_smoker/process(seconds_per_tick) + current_herb_fuel-- + if(current_herb_fuel <= 0) + alter_state() + +/obj/item/bee_smoker/proc/alter_state() + activated = !activated + playsound(src, 'sound/items/welderdeactivate.ogg', 50, TRUE) + + if(!activated) + beesmoke_loop.stop() + QDEL_NULL(particles) + STOP_PROCESSING(SSobj, src) + return + + beesmoke_loop.start() + START_PROCESSING(SSobj, src) + particles = new /particles/smoke/bee_smoke + +/particles/smoke/bee_smoke + lifespan = 0.4 SECONDS + position = list(-12, 7, 0) + velocity = list(0, 0.15, 0) + fade = 2 + +#undef WEED_WINE_MULTIPLIER diff --git a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm index 655d08aa864..692a7f108d1 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm @@ -54,6 +54,16 @@ var/icon_base = "bee" ///the bee is a queen? var/is_queen = FALSE + ///commands we follow + var/list/pet_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/beehive/enter, + /datum/pet_command/beehive/exit, + /datum/pet_command/follow/bee, + /datum/pet_command/point_targetting/attack/swirl, + /datum/pet_command/scatter, + ) /mob/living/basic/bee/Initialize(mapload) . = ..() @@ -62,6 +72,7 @@ AddElement(/datum/element/simple_flying) AddComponent(/datum/component/clickbox, x_offset = -2, y_offset = -2) AddComponent(/datum/component/swarming) + AddComponent(/datum/component/obeys_commands, pet_commands) AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) diff --git a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm index 3c8b018cc93..67e98a5f3d3 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm @@ -102,9 +102,149 @@ return FALSE var/atom/bee_hive = bee_ai.blackboard[BB_CURRENT_HOME] - if(bee_hive && get_dist(target, bee_hive) > AGGRO_DISTANCE_FROM_HIVE) + if(bee_hive && get_dist(target, bee_hive) > AGGRO_DISTANCE_FROM_HIVE && can_see(owner, bee_hive, 9)) return FALSE return !(mob_target.bee_friendly()) + +///pet commands +/datum/pet_command/follow/bee + ///the behavior we use to follow + follow_behavior = /datum/ai_behavior/pet_follow_friend/bee + +/datum/ai_behavior/pet_follow_friend/bee + required_distance = 0 + +///swirl around the owner in menacing fashion +/datum/pet_command/point_targetting/attack/swirl + command_name = "Swirl" + command_desc = "Your pets will swirl around you and attack whoever you point at!" + speech_commands = list("swirl", "spiral", "swarm") + pointed_reaction = null + refuse_reaction = null + command_feedback = null + ///the owner we will swarm around + var/key_to_swarm = BB_SWARM_TARGET + +/datum/pet_command/point_targetting/attack/swirl/try_activate_command(mob/living/commander) + var/mob/living/living_pawn = weak_parent.resolve() + if(isnull(living_pawn)) + return + var/datum/ai_controller/basic_controller/controller = living_pawn.ai_controller + if(isnull(controller)) + return + controller.clear_blackboard_key(BB_CURRENT_PET_TARGET) + controller.set_blackboard_key(key_to_swarm, commander) + return ..() + +/datum/pet_command/point_targetting/attack/swirl/execute_action(datum/ai_controller/controller) + if(controller.blackboard_key_exists(BB_CURRENT_PET_TARGET)) + return ..() + controller.queue_behavior(/datum/ai_behavior/swirl_around_target, BB_SWARM_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/swirl_around_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM + required_distance = 0 + ///chance to swirl + var/swirl_chance = 60 + +/datum/ai_behavior/swirl_around_target/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/swirl_around_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + var/mob/living/living_pawn = controller.pawn + + if(QDELETED(target)) + finish_action(controller, TRUE) + + if(get_dist(target, living_pawn) > 1) + set_movement_target(controller, target) + return + + if(!SPT_PROB(swirl_chance, seconds_per_tick)) + return + + var/list/possible_turfs = list() + + for(var/turf/possible_turf in oview(2, target)) + if(possible_turf.is_blocked_turf(source_atom = living_pawn)) + continue + possible_turfs += possible_turf + + if(!length(possible_turfs)) + return + + if(isnull(controller.movement_target_source) || controller.movement_target_source == type) + set_movement_target(controller, pick(possible_turfs)) + + +/datum/pet_command/beehive + radial_icon = 'icons/obj/service/hydroponics/equipment.dmi' + radial_icon_state = "beebox" + +/datum/pet_command/beehive/try_activate_command(mob/living/commander) + var/mob/living/living_pawn = weak_parent.resolve() + if(isnull(living_pawn)) + return + var/datum/ai_controller/basic_controller/controller = living_pawn.ai_controller + if(isnull(controller)) + return + var/obj/hive = controller.blackboard[BB_CURRENT_HOME] + if(isnull(hive)) + return + if(!check_beehive_conditions(living_pawn, hive)) + return + return ..() + +/datum/pet_command/beehive/proc/check_beehive_conditions(obj/structure/hive) + return + +/datum/pet_command/beehive/execute_action(datum/ai_controller/controller) + controller.queue_behavior(/datum/ai_behavior/enter_exit_hive, BB_CURRENT_HOME) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/beehive/enter + command_name = "Enter beehive" + command_desc = "Your bees will enter their beehive." + speech_commands = list("enter", "home", "in") + +/datum/pet_command/beehive/enter/check_beehive_conditions(mob/living/living_pawn, obj/structure/hive) + if(living_pawn in hive) //already in hive + return FALSE + return can_see(living_pawn, hive, 9) + +/datum/pet_command/beehive/exit + command_name = "Exit beehive" + command_desc = "Your bees will exit their beehive." + speech_commands = list("exit", "leave", "out") + +/datum/pet_command/beehive/exit/check_beehive_conditions(mob/living/living_pawn, obj/structure/hive) + return (living_pawn in hive) + +/datum/pet_command/scatter + command_name = "Scatter" + command_desc = "Command your pets to scatter all around you!" + speech_commands = list("disperse", "spread", "scatter") + +/datum/pet_command/scatter/set_command_active(mob/living/parent, mob/living/commander) + . = ..() + set_command_target(parent, commander) + +/datum/pet_command/scatter/execute_action(datum/ai_controller/controller) + controller.queue_behavior(/datum/ai_behavior/run_away_from_target/scatter, BB_CURRENT_PET_TARGET) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/run_away_from_target/scatter + run_distance = 4 + #undef AGGRO_DISTANCE_FROM_HIVE diff --git a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm index e2d6ac04f7e..6379f239ba0 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm @@ -1,6 +1,7 @@ /datum/ai_controller/basic_controller/bee blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bee, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -8,6 +9,7 @@ idle_behavior = /datum/idle_behavior/idle_random_walk planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/find_valid_home, /datum/ai_planning_subtree/enter_exit_home, /datum/ai_planning_subtree/find_and_hunt_target/pollinate, diff --git a/code/modules/mob/living/basic/heretic/star_gazer.dm b/code/modules/mob/living/basic/heretic/star_gazer.dm index bef9924efe0..c55a3dafe9d 100644 --- a/code/modules/mob/living/basic/heretic/star_gazer.dm +++ b/code/modules/mob/living/basic/heretic/star_gazer.dm @@ -79,7 +79,7 @@ /datum/ai_controller/basic_controller/star_gazer blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/star_gazer(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends/attack_closed_turfs(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends/attack_closed_turfs, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm index 4d67a71d4d4..e3f9fe083a6 100644 --- a/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm +++ b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm @@ -1,7 +1,7 @@ /datum/ai_controller/basic_controller/seedling blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, BB_WEEDLEVEL_THRESHOLD = 3, BB_WATERLEVEL_THRESHOLD = 90, ) @@ -142,7 +142,7 @@ /datum/ai_controller/basic_controller/seedling/meanie blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm index fe1c4150315..7e7a72ec412 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm @@ -1,7 +1,7 @@ /datum/ai_controller/basic_controller/goldgrub blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/iron, /obj/item/stack/ore/glass), BB_STORM_APPROACHING = FALSE, ) diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm index cfc359bd54f..6ca9c59c926 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm @@ -135,6 +135,8 @@ icon_state = "mook_leap_cloud" layer = BELOW_MOB_LAYER plane = GAME_PLANE + pixel_x = -16 + pixel_y = -16 base_pixel_y = -16 base_pixel_x = -16 duration = 1 SECONDS diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm b/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm index 6a04742d471..0fc2873531e 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm @@ -267,7 +267,7 @@ GLOBAL_LIST_INIT(mook_commands, list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/mook, BB_MAXIMUM_DISTANCE_TO_VILLAGE = 10, BB_STORM_APPROACHING = FALSE, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) idle_behavior = /datum/idle_behavior/walk_near_target/mook_village planning_subtrees = list( diff --git a/code/modules/mob/living/basic/minebots/minebot_ai.dm b/code/modules/mob/living/basic/minebots/minebot_ai.dm index 33e9821dbc4..f4a2adda9e1 100644 --- a/code/modules/mob/living/basic/minebots/minebot_ai.dm +++ b/code/modules/mob/living/basic/minebots/minebot_ai.dm @@ -1,7 +1,7 @@ /datum/ai_controller/basic_controller/minebot blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite), BB_AUTOMATED_MINING = FALSE, ) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm index 9d967c5a8b0..5bf664d1687 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm @@ -9,8 +9,9 @@ */ /datum/ai_controller/basic_controller/carp blackboard = list( + BB_BASIC_MOB_STOP_FLEEING = TRUE, BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends ) ai_movement = /datum/ai_movement/basic_avoidance @@ -35,9 +36,9 @@ */ /datum/ai_controller/basic_controller/carp/pet blackboard = list( - BB_ALWAYS_IGNORE_FACTION = TRUE, + BB_BASIC_MOB_STOP_FLEEING = TRUE, BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends ) ai_traits = STOP_MOVING_WHEN_PULLED planning_subtrees = list( @@ -79,8 +80,9 @@ */ /datum/ai_controller/basic_controller/carp/passive blackboard = list( + BB_BASIC_MOB_STOP_FLEEING = TRUE, BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) ai_traits = STOP_MOVING_WHEN_PULLED planning_subtrees = list( diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm index 5c69ad90447..639a9720dbc 100644 --- a/code/modules/mob/living/basic/vermin/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -61,7 +61,7 @@ /datum/ai_controller/basic_controller/cockroach blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) ai_traits = STOP_MOVING_WHEN_PULLED diff --git a/code/modules/mob/living/basic/vermin/frog.dm b/code/modules/mob/living/basic/vermin/frog.dm index 64dbafb45f8..7ff5260ccb7 100644 --- a/code/modules/mob/living/basic/vermin/frog.dm +++ b/code/modules/mob/living/basic/vermin/frog.dm @@ -78,7 +78,7 @@ /datum/ai_controller/basic_controller/frog blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 6043cceb4b1..2929085fb93 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -411,8 +411,8 @@ /// AI controller for rats, slightly more complex than mice becuase they attack people /datum/ai_controller/basic_controller/mouse/rat blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, BB_BASIC_MOB_CURRENT_TARGET = null, // heathen BB_CURRENT_HUNTING_TARGET = null, // cheese BB_LOW_PRIORITY_HUNTING_TARGET = null, // cable diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index dca19777471..9fe0dbe0a92 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -336,3 +336,10 @@ item = /obj/item/seeds/seedling/evil cost = 8 restricted_roles = list(JOB_BOTANIST) + +/datum/uplink_item/role_restricted/bee_smoker + name = "Bee Smoker" + desc = "A device that runs on cannabis, turning it into a gas that can hypnotize bees to follow our commands." + item = /obj/item/bee_smoker + cost = 4 + restricted_roles = list(JOB_BOTANIST) diff --git a/icons/mob/inhands/equipment/hydroponics_lefthand.dmi b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi index 031909dbf824095d48cdbc15019dfd0f8dd96d0e..5f771404f2636af6ef5bf3a1c792a1978336a486 100644 GIT binary patch delta 1131 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 Iu0jG}f~OV|ng9R* diff --git a/icons/obj/service/hydroponics/equipment.dmi b/icons/obj/service/hydroponics/equipment.dmi index afcc4de523512aeae292e8856fde17c3785f5cc1..ed339a8a4209d93e2844c64cc15e10f00955d9f4 100644 GIT binary patch delta 14107 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 u{e9RvLT()4Fw&C(#R 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 Ki-ILA?0*5h0=y*v diff --git a/sound/weapons/beesmoke.ogg b/sound/weapons/beesmoke.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5e29f37a224e3127b0ad5a4370ca5ae95a2a00da GIT binary patch literal 200682 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

k;`^X$T!(-oHbVqd#0r`?m7lj%RB%TE8Rn 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

i-^FT?339M9WN4Q<&d7xJUQ@+hl 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ã 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index bdb23a0f0d3..3e7776beaa0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4035,6 +4035,7 @@ #include "code\modules\hydroponics\seed_extractor.dm" #include "code\modules\hydroponics\seeds.dm" #include "code\modules\hydroponics\unique_plant_genes.dm" +#include "code\modules\hydroponics\beekeeping\bee_smoker.dm" #include "code\modules\hydroponics\beekeeping\beebox.dm" #include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm" #include "code\modules\hydroponics\beekeeping\honey_frame.dm" From f64cf6ca48d81a5c1c14eef95c9b927bc9ee302e Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+AnArgonianLizardThatStealsPRs@users.noreply.github.com> Date: Fri, 20 Oct 2023 14:23:19 +0300 Subject: [PATCH 22/22] [MIRROR] Makes supermatter charged singularity damage the eyes of viewers [MDB IGNORE] (#24451) (#171) * Makes supermatter charged singularity damage the eyes of viewers (#79044) Mostly made this for the component for admin abuse but let's put it on supermatter singulo as well. Screaming as your eyes fail you while your station is being consumed seems like it would be !!fun!! :cl: ninjanomnom balance: It damages your eyes to look at the supermatter singularity /:cl: * Makes supermatter charged singularity damage the eyes of viewers * Modular compiler errors --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Emmett Gaines Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> --- code/datums/components/vision_hurting.dm | 26 +++++++++++++++++++ code/modules/power/singularity/singularity.dm | 5 ++++ .../mothership_astrum/mob.dm | 1 + .../modules/cellguns/code/medigun_cells.dm | 5 +++- tgstation.dme | 1 + 5 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 code/datums/components/vision_hurting.dm diff --git a/code/datums/components/vision_hurting.dm b/code/datums/components/vision_hurting.dm new file mode 100644 index 00000000000..acf2d186bb4 --- /dev/null +++ b/code/datums/components/vision_hurting.dm @@ -0,0 +1,26 @@ +/// A component that damages eyes that look at the owner +/datum/component/vision_hurting + var/damage_per_second + var/message + +/datum/component/vision_hurting/Initialize(damage_per_second=1, message="Your eyes burn as you look at") + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + src.damage_per_second = damage_per_second + src.message = message + + START_PROCESSING(SSdcs, src) + +/datum/component/vision_hurting/process(seconds_per_tick) + for(var/mob/living/carbon/viewer in viewers(parent)) + if(viewer.is_blind() || viewer.get_eye_protection() >= damage_per_second) + continue + var/obj/item/organ/internal/eyes/burning_orbs = locate() in viewer.organs + if(!burning_orbs) + continue + burning_orbs.apply_organ_damage(damage_per_second * seconds_per_tick) + if(SPT_PROB(50, seconds_per_tick)) + to_chat(viewer, span_userdanger("[message] [parent]!")) + if(SPT_PROB(20, seconds_per_tick)) + viewer.emote("scream") diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 0a797a2d7d6..44d318d3467 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -267,6 +267,11 @@ new_consume_range = 5 dissipate = FALSE + if(temp_allowed_size == STAGE_SIX) + AddComponent(/datum/component/vision_hurting) + else + qdel(GetComponent(/datum/component/vision_hurting)) + var/datum/component/singularity/resolved_singularity = singularity_component.resolve() if (!isnull(resolved_singularity)) resolved_singularity.consume_range = new_consume_range diff --git a/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm b/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm index 408f68c734d..e2fd442e1de 100644 --- a/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm +++ b/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm @@ -122,6 +122,7 @@ attack_verb_simple = "attack" /mob/living/simple_animal/hostile/megafauna/hierophant/astrum/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + . = ..() if(. != BULLET_ACT_HIT) return diff --git a/modular_skyrat/modules/cellguns/code/medigun_cells.dm b/modular_skyrat/modules/cellguns/code/medigun_cells.dm index c95d890b343..f0e9f877515 100644 --- a/modular_skyrat/modules/cellguns/code/medigun_cells.dm +++ b/modular_skyrat/modules/cellguns/code/medigun_cells.dm @@ -368,6 +368,7 @@ name = "clotting agent shot" /obj/projectile/energy/medical/utility/clotting/on_hit(mob/living/target, blocked = 0, pierce_hit) + . = ..() if(!IsLivingHuman(target)) return FALSE @@ -387,6 +388,7 @@ name = "temperature adjustment shot" /obj/projectile/energy/medical/utility/temperature/on_hit(mob/living/target, blocked = 0, pierce_hit) + . = ..() if(!IsLivingHuman(target)) return FALSE @@ -409,6 +411,7 @@ name = "hardlight surgical gown field" /obj/projectile/energy/medical/utility/gown/on_hit(mob/living/target, blocked = 0, pierce_hit) + . = ..() if(!istype(target, /mob/living/carbon/human)) //Dead check isn't fully needed, since it'd be reasonable for this to work on corpses. return @@ -438,7 +441,7 @@ /obj/projectile/energy/medical/utility/salve/on_hit(mob/living/target, blocked = 0, pierce_hit) if(!IsLivingHuman(target)) //No using this on the dead or synths. return FALSE - . = ..() + return ..() //Hardlight Rollerbed Medicell /obj/item/ammo_casing/energy/medical/utility/bed diff --git a/tgstation.dme b/tgstation.dme index 3e7776beaa0..b1e502fdeca 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1242,6 +1242,7 @@ #include "code\datums\components\uplink.dm" #include "code\datums\components\usb_port.dm" #include "code\datums\components\vacuum.dm" +#include "code\datums\components\vision_hurting.dm" #include "code\datums\components\wall_mounted.dm" #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\weatherannouncer.dm"