From 69337dffba67c1e0042dc72622926db62596c1ba Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Fri, 6 Jan 2023 20:52:40 -0500 Subject: [PATCH] Fixes dual wielding bypassing wizard checks (#72431) Fixes #72428 :cl: ShizCalev fix: Non-magic inclined mobs will no longer fire staffs while duel wielding. /:cl: --- code/game/objects/items/weaponry.dm | 2 +- code/modules/antagonists/cult/cult_items.dm | 4 +++- code/modules/projectiles/gun.dm | 10 +++++----- code/modules/projectiles/guns/ballistic/revolver.dm | 9 ++++++++- code/modules/projectiles/guns/energy/dueling.dm | 4 +++- code/modules/projectiles/guns/magic/staff.dm | 5 +++++ code/modules/projectiles/guns/special/meat_hook.dm | 4 +++- 7 files changed, 28 insertions(+), 10 deletions(-) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 654c1604ef6..20e53df917b 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -903,7 +903,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 var/mob/living/living_target = target living_target.adjustBruteLoss(extra_strength_damage) -/obj/item/proc/can_trigger_gun(mob/living/user) +/obj/item/proc/can_trigger_gun(mob/living/user, akimbo_usage) if(!user.can_use_guns(src)) return FALSE return TRUE diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 1ec684102ed..a4a5e037a3b 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -780,7 +780,9 @@ Striking a noncultist, however, will tear their flesh."} mag_type = /obj/item/ammo_box/magazine/internal/blood fire_sound = 'sound/magic/wand_teleport.ogg' -/obj/item/gun/ballistic/rifle/enchanted/arcane_barrage/blood/can_trigger_gun(mob/living/user) +/obj/item/gun/ballistic/rifle/enchanted/arcane_barrage/blood/can_trigger_gun(mob/living/user, akimbo_usage) + if(akimbo_usage) + return FALSE //no akimbo wielding magic lol. . = ..() if(!IS_CULTIST(user)) to_chat(user, span_cultlarge("\"Did you truly think that you could channel MY blood without my approval? Amusing, but futile.\"")) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 158330e9df6..cad4664481e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -260,13 +260,13 @@ var/loop_counter = 0 if(ishuman(user) && user.combat_mode) var/mob/living/carbon/human/H = user - for(var/obj/item/gun/G in H.held_items) - if(G == src || G.weapon_weight >= WEAPON_MEDIUM) + for(var/obj/item/gun/gun in H.held_items) + if(gun == src || gun.weapon_weight >= WEAPON_MEDIUM) continue - else if(G.can_trigger_gun(user)) + else if(gun.can_trigger_gun(user, akimbo_usage = TRUE)) bonus_spread += dual_wield_spread loop_counter++ - addtimer(CALLBACK(G, TYPE_PROC_REF(/obj/item/gun, process_fire), target, user, TRUE, params, null, bonus_spread), loop_counter) + addtimer(CALLBACK(gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, user, TRUE, params, null, bonus_spread), loop_counter) return process_fire(target, user, TRUE, params, null, bonus_spread) @@ -284,7 +284,7 @@ user.dropItemToGround(src, TRUE) return TRUE -/obj/item/gun/can_trigger_gun(mob/living/user) +/obj/item/gun/can_trigger_gun(mob/living/user, akimbo_usage) . = ..() if(!handle_pins(user)) return FALSE diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index d19abfc84bb..f51ea3452c1 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -182,6 +182,11 @@ A.update_appearance() return +/obj/item/gun/ballistic/revolver/russian/can_trigger_gun(mob/living/user, akimbo_usage) + if(akimbo_usage) + return FALSE + return ..() + /obj/item/gun/ballistic/revolver/russian/attack_self(mob/user) if(!spun) spin() @@ -268,7 +273,9 @@ /obj/item/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course. clumsy_check = FALSE -/obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user) +/obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user, akimbo_usage) + if(akimbo_usage) + return FALSE if(HAS_TRAIT(user, TRAIT_CLUMSY) || is_clown_job(user.mind?.assigned_role)) return ..() if(process_fire(user, user, FALSE, null, BODY_ZONE_HEAD)) diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index d3909ab3145..6d4125a4b42 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -223,7 +223,9 @@ . = ..() duel?.clear_duel() -/obj/item/gun/energy/dueling/can_trigger_gun(mob/living/user) +/obj/item/gun/energy/dueling/can_trigger_gun(mob/living/user, akimbo_usage) + if(akimbo_usage) + return FALSE //not honorable. . = ..() if(!check_valid_duel(user, TRUE)) return FALSE diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index c1a03c6ea20..1e2a3c79b56 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -18,6 +18,11 @@ return FALSE return TRUE +/obj/item/gun/magic/staff/can_trigger_gun(mob/living/user, akimbo_usage) + if(akimbo_usage && !is_wizard_or_friend(user)) + return FALSE + return ..() + /obj/item/gun/magic/staff/check_botched(mob/living/user, atom/target) if(!is_wizard_or_friend(user)) return !on_intruder_use(user, target) diff --git a/code/modules/projectiles/guns/special/meat_hook.dm b/code/modules/projectiles/guns/special/meat_hook.dm index 24ca05a4355..ac9e5361999 100644 --- a/code/modules/projectiles/guns/special/meat_hook.dm +++ b/code/modules/projectiles/guns/special/meat_hook.dm @@ -19,7 +19,9 @@ /obj/item/gun/magic/hook/shoot_with_empty_chamber(mob/living/user) balloon_alert(user, "not ready yet!") -/obj/item/gun/magic/hook/can_trigger_gun(mob/living/user) // This isn't really a gun, so it shouldn't be checking for TRAIT_NOGUNS, a firing pin (pinless), or a trigger guard (guardless) +/obj/item/gun/magic/hook/can_trigger_gun(mob/living/user, akimbo_usage) // This isn't really a gun, so it shouldn't be checking for TRAIT_NOGUNS, a firing pin (pinless), or a trigger guard (guardless) + if(akimbo_usage) + return FALSE //this would be kinda weird while shooting someone down. return TRUE /obj/item/ammo_casing/magic/hook