From 35d80bb68ec4e1fd52fccd5054cd5cdbe1e9e2fe Mon Sep 17 00:00:00 2001 From: Vero <73014819+vero5123@users.noreply.github.com> Date: Tue, 2 Apr 2024 08:27:34 -0700 Subject: [PATCH] Fixes carlarc's OP chocolate (#6003) # About the pull request Fixes #4695, The issue isn't inherently the attack speed, although it is quite fast, many small items also have a relatively fast attack speed. The problem is that when you combine the attack speed with a food item that somehow has a force of 35 you get a very effective weapon capable of destroying many different types of structures fairly easily, same issue with the scalpel. My solution here was to just decrease the amount of force the items have rather than lowering the attack speed. You shouldn't be able to use a scalpel or a box of chocolate to more effectively destroy weeds rather than a machete. I doubt these are the only two items that have this problem, I guess in the future when someone comes across a similar issue just link this pr so they can easily identify the exploit. # Changelog :cl: fix: lowers the scalpel and chunk box's ability to destroy various structures. add: chunk box is now a melee weapon /:cl: --------- Co-authored-by: Vicacrov <49321394+Vicacrov@users.noreply.github.com> Co-authored-by: SabreML <57483089+SabreML@users.noreply.github.com> Co-authored-by: DOOM --- code/game/machinery/bots/bots.dm | 4 ++-- code/game/machinery/deployable.dm | 8 ++++---- code/game/objects/items.dm | 2 ++ .../items/reagent_containers/food/snacks.dm | 16 ++++++++++++---- code/game/objects/items/tools/surgery_tools.dm | 1 + .../objects/structures/barricade/barricade.dm | 2 +- code/game/objects/structures/barricade/misc.dm | 8 ++++---- code/game/objects/structures/displaycase.dm | 2 +- code/game/objects/structures/fence.dm | 4 ++-- code/game/objects/structures/lamarr_cage.dm | 4 ++-- code/game/objects/structures/mineral_doors.dm | 2 +- code/game/objects/structures/mirror.dm | 4 ++-- code/game/objects/structures/window.dm | 2 +- code/game/turfs/walls/wall_types.dm | 4 ++-- code/modules/cm_aliens/XenoStructures.dm | 4 ++-- code/modules/cm_aliens/weeds.dm | 2 +- code/modules/power/lighting.dm | 2 +- code/modules/vehicles/vehicle.dm | 6 +++--- 18 files changed, 44 insertions(+), 33 deletions(-) diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 46050d2705b3..1f82d28dbbf8 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -84,9 +84,9 @@ if(hasvar(W,"force") && hasvar(W,"damtype")) switch(W.damtype) if("fire") - src.health -= W.force * fire_dam_coeff + health -= W.force * W.demolition_mod * fire_dam_coeff if("brute") - src.health -= W.force * brute_dam_coeff + health -= W.force * W.demolition_mod * brute_dam_coeff ..() healthcheck() else diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 687882d9d7ae..7907c9f28985 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -51,11 +51,11 @@ else switch(W.damtype) if("fire") - src.health -= W.force * 0.75 + health -= W.force * W.demolition_mod * 0.75 if("brute") - src.health -= W.force * 0.5 - if (src.health <= 0) - src.explode() + health -= W.force * W.demolition_mod * 0.5 + if (health <= 0) + explode() ..() /obj/structure/machinery/deployable/barrier/ex_act(severity) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index fcd431c33d26..f6aa2600f838 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -22,6 +22,8 @@ var/attack_speed = 11 //+3, Adds up to 10. Added an extra 4 removed from /mob/proc/do_click() ///Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" var/list/attack_verb + /// A multiplier to an object's force when used against a stucture. + var/demolition_mod = 1 health = null diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 112a8e40e85b..79a108d24bf1 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -55,7 +55,13 @@ return FALSE if(package) - to_chat(M, SPAN_WARNING("How do you expect to eat this with the package still on?")) + if(user.a_intent == INTENT_HARM) + return ..() // chunk box gaming + + if(user == M) + to_chat(M, SPAN_WARNING("How do you expect to eat this with the package still on?")) + else + to_chat(M, SPAN_WARNING("[user] made an endearing attempt to force feed you a snack with the packaging still on.")) return FALSE if(istype(M, /mob/living/carbon)) @@ -3289,8 +3295,11 @@ name = "CHUNK box" desc = "A bar of \"The CHUNK\" brand chocolate. \"The densest chocolate permitted to exist according to federal law. We are legally required to ask you not to use this blunt object for anything other than nutrition.\"" icon_state = "chunk" - force = 15 //LEGAL LIMIT OF CHOCOLATE + hitsound = "swing_hit" + force = 15 throwforce = 10 + attack_speed = 10 + demolition_mod = 0.3 bitesize = 2 wrapper = /obj/item/trash/chunk @@ -3304,8 +3313,7 @@ desc = "A 'crate', as the marketing called it, of \"The HUNK\" brand chocolate. An early version of the CHUNK box, the HUNK bar was hit by a class action lawsuit and forced to go into bankruptcy and get bought out by the Company when hundreds of customers had their teeth crack from simply attempting to eat the bar." icon_state = "hunk" w_class = SIZE_MEDIUM - hitsound = "swing_hit" - force = 35 //ILLEGAL LIMIT OF CHOCOLATE + force = 35 throwforce = 50 bitesize = 20 wrapper = /obj/item/trash/chunk/hunk diff --git a/code/game/objects/items/tools/surgery_tools.dm b/code/game/objects/items/tools/surgery_tools.dm index 7d354d8d8c1c..a1792b574eec 100644 --- a/code/game/objects/items/tools/surgery_tools.dm +++ b/code/game/objects/items/tools/surgery_tools.dm @@ -96,6 +96,7 @@ force = 10 sharp = IS_SHARP_ITEM_ACCURATE edge = 1 + demolition_mod = 0.1 w_class = SIZE_TINY throwforce = 5 flags_item = CAN_DIG_SHRAPNEL diff --git a/code/game/objects/structures/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm index 313067ca6a56..edb13ac16e5a 100644 --- a/code/game/objects/structures/barricade/barricade.dm +++ b/code/game/objects/structures/barricade/barricade.dm @@ -333,7 +333,7 @@ take_damage(dam * burn_flame_multiplier) /obj/structure/barricade/proc/hit_barricade(obj/item/item) - take_damage(item.force * 0.5 * brute_multiplier) + take_damage(item.force * item.demolition_mod * 0.5 * brute_multiplier) /obj/structure/barricade/proc/take_damage(damage) for(var/obj/structure/barricade/barricade in get_step(src,dir)) //discourage double-stacking barricades by removing health from opposing barricade diff --git a/code/game/objects/structures/barricade/misc.dm b/code/game/objects/structures/barricade/misc.dm index a0465de8f070..8fcf7cec41ad 100644 --- a/code/game/objects/structures/barricade/misc.dm +++ b/code/game/objects/structures/barricade/misc.dm @@ -50,9 +50,9 @@ /obj/structure/barricade/snow/hit_barricade(obj/item/I) switch(I.damtype) if("fire") - take_damage( I.force * 0.6 ) + take_damage( I.force * I.demolition_mod * 0.6 ) if("brute") - take_damage( I.force * 0.3 ) + take_damage( I.force * I.demolition_mod * 0.3 ) return @@ -106,6 +106,6 @@ /obj/structure/barricade/wooden/hit_barricade(obj/item/I) switch(I.damtype) if("fire") - take_damage( I.force * 1.5 ) + take_damage( I.force * I.demolition_mod * 1.5 ) if("brute") - take_damage( I.force * 0.75 ) + take_damage( I.force * I.demolition_mod * 0.75 ) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 8439a887e57f..bfc9bfa7833e 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -57,7 +57,7 @@ /obj/structure/displaycase/attackby(obj/item/W as obj, mob/user as mob) - src.health -= W.force + src.health -= W.force * W.demolition_mod src.healthcheck() ..() return diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index db24dfdfebdd..60a8682a4930 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -170,9 +170,9 @@ else switch(W.damtype) if("fire") - health -= W.force + health -= W.force * W.demolition_mod if("brute") - health -= W.force * 0.1 + health -= W.force * W.demolition_mod * 0.1 healthcheck(1, 1, user, W) ..() diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index fbae7a387a63..3708b15b25e6 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -53,8 +53,8 @@ /obj/structure/lamarr/attackby(obj/item/W as obj, mob/user as mob) - src.health -= W.force - src.healthcheck() + health -= W.force * W.demolition_mod + healthcheck() ..() return diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 25dc0040e2ac..0fd22361c67b 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -102,7 +102,7 @@ Dismantle() else if(!(W.flags_item & NOBLUDGEON) && W.force) user.animation_attack_on(src) - hardness -= W.force/100 + hardness -= W.force/100 * W.demolition_mod to_chat(user, "You hit the [name] with your [W.name]!") CheckHardness() else diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index a8d76843313a..0ee7453782d9 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -121,10 +121,10 @@ playsound(loc, 'sound/effects/Glasshit.ogg', 25, 1) return if(shattered) - playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 25, 1) + playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 25, 1) user.visible_message(SPAN_WARNING("[user] hits [src] with [I], but it's already broken!"), SPAN_WARNING("You hit [src] with [I], but it's already broken!")) return - if(prob(I.force * 2)) + if(prob(I.force * I.demolition_mod * 2)) user.visible_message(SPAN_WARNING("[user] smashes [src] with [I]!"), SPAN_WARNING("You smash [src] with [I]!")) shatter() else diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 226045caaea6..81d7f24f054e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -286,7 +286,7 @@ to_chat(user, (state ? SPAN_NOTICE("You have pried the window into the frame.") : SPAN_NOTICE("You have pried the window out of the frame."))) else if(!not_damageable) //Impossible to destroy - health -= W.force + health -= W.force * W.demolition_mod if(health <= 7 && !reinf && !static_frame && !not_deconstructable) anchored = FALSE update_nearby_icons() diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm index 259e386825ff..7b26854737cc 100644 --- a/code/game/turfs/walls/wall_types.dm +++ b/code/game/turfs/walls/wall_types.dm @@ -1044,7 +1044,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen) /obj/structure/alien/movable_wall/attackby(obj/item/W, mob/living/user) if(!(W.flags_item & NOBLUDGEON)) user.animation_attack_on(src) - take_damage(W.force*RESIN_MELEE_DAMAGE_MULTIPLIER, user) + take_damage(W.force*RESIN_MELEE_DAMAGE_MULTIPLIER*W.demolition_mod, user) playsound(src, "alien_resin_break", 25) else return attack_hand(user) @@ -1280,7 +1280,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen) if(!(W.flags_item & NOBLUDGEON)) user.animation_attack_on(src) - take_damage(W.force*RESIN_MELEE_DAMAGE_MULTIPLIER, user) + take_damage(W.force*RESIN_MELEE_DAMAGE_MULTIPLIER*W.demolition_mod, user) playsound(src, "alien_resin_break", 25) else return attack_hand(user) diff --git a/code/modules/cm_aliens/XenoStructures.dm b/code/modules/cm_aliens/XenoStructures.dm index c014fbf9c211..635bca03241f 100644 --- a/code/modules/cm_aliens/XenoStructures.dm +++ b/code/modules/cm_aliens/XenoStructures.dm @@ -118,7 +118,7 @@ /obj/effect/alien/resin/attackby(obj/item/W, mob/user) if(!(W.flags_item & NOBLUDGEON)) - var/damage = W.force * RESIN_MELEE_DAMAGE_MULTIPLIER + var/damage = W.force * W.demolition_mod * RESIN_MELEE_DAMAGE_MULTIPLIER health -= damage if(istype(src, /obj/effect/alien/resin/sticky)) playsound(loc, "alien_resin_move", 25) @@ -391,7 +391,7 @@ return // defer to item afterattack if(!(W.flags_item & NOBLUDGEON) && W.force) user.animation_attack_on(src) - health -= W.force*RESIN_MELEE_DAMAGE_MULTIPLIER + health -= W.force * RESIN_MELEE_DAMAGE_MULTIPLIER * W.demolition_mod to_chat(user, "You hit the [name] with your [W.name]!") playsound(loc, "alien_resin_move", 25) healthcheck() diff --git a/code/modules/cm_aliens/weeds.dm b/code/modules/cm_aliens/weeds.dm index d614d87bf9b9..2206bc528e82 100644 --- a/code/modules/cm_aliens/weeds.dm +++ b/code/modules/cm_aliens/weeds.dm @@ -377,7 +377,7 @@ else to_chat(user, SPAN_WARNING("You cut \the [src] away with \the [attacking_item].")) - var/damage = attacking_item.force / 3 + var/damage = (attacking_item.force * attacking_item.demolition_mod) / 3 playsound(loc, "alien_resin_break", 25) if(iswelder(attacking_item)) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 309fa583589c..c95fa6af5045 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -390,7 +390,7 @@ else if(status != LIGHT_BROKEN && status != LIGHT_EMPTY) - if(prob(1+W.force * 5)) + if(prob(1+W.force * W.demolition_mod * 5)) to_chat(user, "You hit the light, and it smashes!") for(var/mob/M as anything in viewers(src)) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 014452426a3c..8632159b4f6d 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -84,10 +84,10 @@ else if(W.force) switch(W.damtype) if("fire") - health -= W.force * fire_dam_coeff + health -= W.force * W.demolition_mod * fire_dam_coeff if("brute") - health -= W.force * brute_dam_coeff - playsound(src.loc, "smash.ogg", 25, 1) + health -= W.force * W.demolition_mod * brute_dam_coeff + playsound(loc, "smash.ogg", 25, 1) user.visible_message(SPAN_DANGER("[user] hits [src] with [W]."),SPAN_DANGER("You hit [src] with [W].")) healthcheck() else