From bc2215667febca1032efcdba9d8e43ceb5ad6e41 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Sun, 18 May 2025 22:32:12 -0500 Subject: [PATCH] Re-refactors batons / Refactors attack chain force modifiers (#90809) Melee attack chain now has a list passed along with it, `attack_modifiers`, which you can stick force modifiers to change the resulting attack This is basically a soft implementation of damage packets until a more definitive pr, but one that only applies to item attack chain, and not unarmed attacks. This change was done to facilitate a baton refactor - batons no longer hack together their own attack chain, and are now integrated straight into the real attack chain. This refactor itself was done because batons don't send any attack signals, which has been annoying in the past (for swing combat). :cl: Melbert refactor: Batons have been refactored again. Baton stuns now properly count as an attack, when before it was a nothing. Report any oddities, particularly in regards to harmbatonning vs normal batonning. refactor: The method of adjusting item damage mid-attack has been refactored - some affected items include the Nullblade and knives. Report any strange happenings with damage numbers. refactor: A few objects have been moved to the new interaction chain - records consoles, mawed crucible, alien weeds and space vines, hedges, restaurant portals, and some mobs - to name a few. fix: Spears only deal bonus damage against secure lockers, not all closet types (including crates) /:cl: --- code/__DEFINES/combat.dm | 51 ++- .../signals/signals_mob/signals_mob_main.dm | 2 +- code/__DEFINES/dcs/signals/signals_object.dm | 8 +- code/_onclick/item_attack.dm | 164 +++++----- .../components/alternative_sharpness.dm | 5 +- code/datums/components/focused_attacker.dm | 10 +- code/datums/components/trapdoor.dm | 2 +- code/datums/holocall.dm | 2 +- code/datums/martial/sleeping_carp.dm | 2 +- code/datums/memory/tattoo_kit.dm | 4 +- code/game/machinery/PDApainter.dm | 2 +- code/game/machinery/_machinery.dm | 4 +- code/game/machinery/bank_machine.dm | 2 +- .../machinery/camera/camera_construction.dm | 2 +- code/game/machinery/cell_charger.dm | 2 +- code/game/machinery/civilian_bounties.dm | 2 +- .../game/machinery/computer/communications.dm | 2 +- code/game/machinery/computer/dna_console.dm | 2 +- code/game/machinery/computer/law.dm | 2 +- .../machinery/computer/operating_computer.dm | 2 +- .../orders/order_computer/mining_order.dm | 2 +- .../machinery/computer/prisoner/_prisoner.dm | 2 +- .../machinery/computer/records/medical.dm | 10 +- .../machinery/computer/records/security.dm | 10 +- code/game/machinery/defibrillator_mount.dm | 2 +- code/game/machinery/deployable.dm | 2 +- code/game/machinery/dish_drive.dm | 2 +- .../game/machinery/dna_infuser/dna_infuser.dm | 2 +- .../dna_infuser/organ_sets/goliath_organs.dm | 2 +- code/game/machinery/dna_scanner.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/firealarm.dm | 2 +- code/game/machinery/flasher.dm | 4 +- code/game/machinery/hologram.dm | 2 +- code/game/machinery/hypnochair.dm | 2 +- code/game/machinery/iv_drip.dm | 2 +- code/game/machinery/launch_pad.dm | 4 +- code/game/machinery/mass_driver.dm | 2 +- code/game/machinery/medical_kiosk.dm | 2 +- code/game/machinery/modular_shield.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- code/game/machinery/nebula_shielding.dm | 2 +- .../newscaster/newscaster_machine.dm | 2 +- code/game/machinery/pipe/pipe_dispenser.dm | 2 +- .../machinery/porta_turret/portable_turret.dm | 4 +- .../porta_turret/portable_turret_construct.dm | 2 +- .../porta_turret/portable_turret_cover.dm | 6 +- code/game/machinery/prisonlabor.dm | 2 +- code/game/machinery/quantum_pad.dm | 4 +- code/game/machinery/recharger.dm | 2 +- code/game/machinery/rechargestation.dm | 2 +- code/game/machinery/requests_console.dm | 2 +- code/game/machinery/roulette_machine.dm | 2 +- code/game/machinery/scanner_gate.dm | 2 +- code/game/machinery/shieldgen.dm | 4 +- code/game/machinery/spaceheater.dm | 4 +- code/game/machinery/suit_storage_unit.dm | 2 +- code/game/machinery/syndicatebomb.dm | 4 +- .../telecomms/machine_interactions.dm | 2 +- .../machinery/telecomms/machines/allinone.dm | 2 +- .../telecomms/machines/message_server.dm | 2 +- code/game/machinery/teleporter.dm | 4 +- code/game/objects/effects/decals/cleanable.dm | 2 +- .../objects/effects/decals/cleanable/misc.dm | 2 +- .../fluid_spread/effects_foam.dm | 2 +- code/game/objects/effects/effects.dm | 4 +- code/game/objects/effects/portals.dm | 2 +- .../objects/effects/poster_demotivational.dm | 2 +- .../objects/effects/poster_motivational.dm | 4 +- code/game/objects/effects/posters/poster.dm | 4 +- .../temporary_visuals/miscellaneous.dm | 2 +- code/game/objects/items/airlock_painter.dm | 2 +- code/game/objects/items/cardboard_cutouts.dm | 2 +- code/game/objects/items/chainsaw.dm | 2 +- code/game/objects/items/cigarettes.dm | 4 +- code/game/objects/items/cosmetics.dm | 2 +- code/game/objects/items/courtroom.dm | 2 +- code/game/objects/items/crab17.dm | 2 +- code/game/objects/items/credit_holochip.dm | 2 +- code/game/objects/items/defib.dm | 2 +- .../game/objects/items/devices/aicard_evil.dm | 2 +- .../objects/items/devices/laserpointer.dm | 2 +- .../objects/items/devices/lightreplacer.dm | 2 +- .../items/devices/radio/electropack.dm | 2 +- .../objects/items/devices/radio/headset.dm | 2 +- code/game/objects/items/devices/swapper.dm | 2 +- .../game/objects/items/devices/table_clock.dm | 2 +- .../objects/items/devices/taperecorder.dm | 2 +- .../objects/items/devices/traitordevices.dm | 2 +- code/game/objects/items/dualsaber.dm | 2 +- code/game/objects/items/dyespray.dm | 2 +- code/game/objects/items/extinguisher.dm | 4 +- code/game/objects/items/fireaxe.dm | 2 +- code/game/objects/items/flamethrower.dm | 2 +- code/game/objects/items/food/egg.dm | 4 +- code/game/objects/items/food/misc.dm | 2 +- code/game/objects/items/food/pancakes.dm | 4 +- code/game/objects/items/grenades/festive.dm | 6 +- .../game/objects/items/grenades/ghettobomb.dm | 2 +- code/game/objects/items/grenades/plastic.dm | 2 +- code/game/objects/items/hand_items.dm | 12 +- code/game/objects/items/hot_potato.dm | 2 +- .../objects/items/implants/implantcase.dm | 2 +- code/game/objects/items/implants/implanter.dm | 2 +- .../game/objects/items/implants/implantpad.dm | 2 +- .../items/implants/security/implant_chem.dm | 2 +- code/game/objects/items/inspector.dm | 6 +- .../objects/items/kirby_plants/kirbyplants.dm | 2 +- code/game/objects/items/kitchen.dm | 6 +- code/game/objects/items/knives.dm | 3 +- code/game/objects/items/latexballoon.dm | 2 +- code/game/objects/items/lighter.dm | 2 +- code/game/objects/items/mail.dm | 2 +- code/game/objects/items/melee/baton.dm | 291 ++++++++---------- code/game/objects/items/melee/misc.dm | 6 +- code/game/objects/items/piggy_bank.dm | 2 +- code/game/objects/items/pillow.dm | 5 +- code/game/objects/items/plushes.dm | 4 +- code/game/objects/items/pneumaticCannon.dm | 2 +- code/game/objects/items/powerfist.dm | 2 +- code/game/objects/items/puzzle_pieces.dm | 4 +- code/game/objects/items/rcd/RSF.dm | 2 +- code/game/objects/items/robot/ai_upgrades.dm | 8 +- .../game/objects/items/robot/items/generic.dm | 2 +- .../game/objects/items/robot/items/storage.dm | 6 +- code/game/objects/items/robot/robot_parts.dm | 2 +- .../objects/items/robot/robot_upgrades.dm | 2 +- code/game/objects/items/secret_documents.dm | 2 +- code/game/objects/items/sharpener.dm | 2 +- code/game/objects/items/shields.dm | 4 +- code/game/objects/items/signs.dm | 2 +- code/game/objects/items/spear.dm | 4 +- code/game/objects/items/stacks/medical.dm | 2 +- .../game/objects/items/stacks/sheets/glass.dm | 10 +- .../objects/items/stacks/sheets/leather.dm | 2 +- .../game/objects/items/stacks/sheets/light.dm | 2 +- .../objects/items/stacks/sheets/mineral.dm | 6 +- .../items/stacks/sheets/sheet_types.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/items/stacks/tiles/light.dm | 2 +- .../items/stacks/tiles/tile_mineral.dm | 2 +- code/game/objects/items/stacks/wrap.dm | 5 +- .../items/storage/toolboxes/mechanical.dm | 6 +- code/game/objects/items/tail_pin.dm | 2 +- code/game/objects/items/tanks/tank_types.dm | 2 +- code/game/objects/items/tanks/tanks.dm | 2 +- code/game/objects/items/tanks/watertank.dm | 2 +- code/game/objects/items/tcg/tcg.dm | 4 +- code/game/objects/items/theft_tools.dm | 2 +- code/game/objects/items/tongs.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 4 +- code/game/objects/items/toys.dm | 10 +- code/game/objects/items/v8_engine.dm | 2 +- code/game/objects/items/weaponry.dm | 8 +- code/game/objects/items/wizard_weapons.dm | 2 +- code/game/objects/objs.dm | 55 ++-- code/game/objects/structures/ai_core.dm | 4 +- code/game/objects/structures/aliens.dm | 1 + .../objects/structures/beds_chairs/bed.dm | 4 +- .../objects/structures/beds_chairs/chair.dm | 4 +- code/game/objects/structures/bonfire.dm | 2 +- .../game/objects/structures/cannons/cannon.dm | 2 +- .../cannons/mounted_guns/mounted_gun.dm | 2 +- .../construction_console.dm | 2 +- .../structures/crates_lockers/closets.dm | 18 +- .../crates_lockers/closets/bodybag.dm | 2 +- .../crates_lockers/closets/secure/security.dm | 4 +- .../structures/crates_lockers/crates/bins.dm | 2 +- .../structures/crates_lockers/crates/large.dm | 2 +- .../crates_lockers/crates/syndicrate.dm | 4 +- .../objects/structures/deployable_turret.dm | 8 +- .../game/objects/structures/detectiveboard.dm | 2 +- code/game/objects/structures/displaycase.dm | 8 +- code/game/objects/structures/door_assembly.dm | 2 +- code/game/objects/structures/dresser.dm | 2 +- code/game/objects/structures/electricchair.dm | 2 +- code/game/objects/structures/extinguisher.dm | 2 +- code/game/objects/structures/false_walls.dm | 4 +- code/game/objects/structures/fireaxe.dm | 2 +- code/game/objects/structures/flora.dm | 6 +- code/game/objects/structures/fluff.dm | 2 +- code/game/objects/structures/girders.dm | 6 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/guillotine.dm | 2 +- code/game/objects/structures/guncase.dm | 2 +- code/game/objects/structures/janitor.dm | 8 +- code/game/objects/structures/kitchen_spike.dm | 2 +- code/game/objects/structures/ladders.dm | 4 +- code/game/objects/structures/lattice.dm | 4 +- .../objects/structures/lavaland/geyser.dm | 4 +- .../objects/structures/lavaland/ore_vent.dm | 2 +- code/game/objects/structures/maintenance.dm | 4 +- code/game/objects/structures/mirror.dm | 12 +- code/game/objects/structures/morgue.dm | 2 +- code/game/objects/structures/noticeboard.dm | 2 +- .../game/objects/structures/ore_containers.dm | 2 +- .../objects/structures/plaques/_plaques.dm | 4 +- code/game/objects/structures/railings.dm | 2 +- code/game/objects/structures/reflector.dm | 2 +- code/game/objects/structures/safe.dm | 2 +- code/game/objects/structures/shower.dm | 4 +- code/game/objects/structures/signs/_signs.dm | 4 +- code/game/objects/structures/spawner.dm | 2 +- code/game/objects/structures/stairs.dm | 2 +- .../game/objects/structures/tank_dispenser.dm | 2 +- code/game/objects/structures/tank_holder.dm | 2 +- code/game/objects/structures/toiletbong.dm | 2 +- .../objects/structures/training_machine.dm | 2 +- .../structures/transit_tubes/station.dm | 2 +- .../structures/transit_tubes/transit_tube.dm | 2 +- .../transit_tubes/transit_tube_pod.dm | 2 +- code/game/objects/structures/votingbox.dm | 2 +- .../structures/water_structures/sink.dm | 4 +- .../structures/water_structures/toilet.dm | 2 +- .../structures/water_structures/urinal.dm | 2 +- .../water_structures/water_source.dm | 4 +- .../objects/structures/windoor_assembly.dm | 2 +- code/game/objects/structures/window.dm | 4 +- code/game/turfs/turf.dm | 2 +- .../abductor/equipment/gear/abductor_items.dm | 7 +- .../equipment/gear/abductor_posters.dm | 2 +- .../antagonists/abductor/machinery/console.dm | 2 +- .../abductor/machinery/dispenser.dm | 2 +- .../antagonists/blob/structures/_blob.dm | 2 +- .../changeling/powers/mutations.dm | 4 +- .../antagonists/clown_ops/clown_weapons.dm | 2 +- .../modules/antagonists/heretic/influences.dm | 2 +- .../heretic/items/heretic_blades.dm | 6 +- .../heretic/items/heretic_necks.dm | 2 +- .../heretic/knowledge/blade_lore.dm | 9 +- .../heretic/structures/carving_knife.dm | 7 +- .../heretic/structures/mawed_crucible.dm | 44 +-- .../nightmare/nightmare_equipment.dm | 2 +- .../equipment/nuclear_authentication_disk.dm | 2 +- .../equipment/nuclear_bomb/_nuclear_bomb.dm | 2 +- .../equipment/nuclear_bomb/beer_nuke.dm | 2 +- .../voidwalker/voidwalker_void_eater.dm | 2 +- .../antagonists/wizard/equipment/artefact.dm | 2 +- .../antagonists/wizard/equipment/soulstone.dm | 2 +- .../wizard/equipment/wizard_spellbook.dm | 2 +- code/modules/art/paintings.dm | 6 +- code/modules/art/statues.dm | 2 +- code/modules/assembly/assembly.dm | 2 +- code/modules/assembly/flash.dm | 2 +- code/modules/assembly/holder.dm | 2 +- code/modules/assembly/signaler.dm | 6 +- .../machinery/air_alarm/air_alarm_interact.dm | 2 +- .../atmospherics/machinery/atmosmachinery.dm | 2 +- .../components/electrolyzer/electrolyzer.dm | 2 +- .../machinery/components/fusion/hfr_parts.dm | 4 +- .../gas_recipe_machines/crystallizer.dm | 2 +- .../atmospherics/machinery/components/tank.dm | 2 +- .../atmospherics/machinery/pipes/pipes.dm | 2 +- .../machinery/portable/canister.dm | 2 +- .../portable/portable_atmospherics.dm | 18 +- code/modules/awaymissions/signpost.dm | 2 +- .../modules/awaymissions/super_secret_room.dm | 2 +- code/modules/basketball/basketball.dm | 2 +- code/modules/basketball/hoop.dm | 2 +- code/modules/bitrunning/server/_parent.dm | 2 +- code/modules/capture_the_flag/ctf_game.dm | 6 +- code/modules/cards/cardhand.dm | 2 +- code/modules/cards/deck/deck.dm | 2 +- code/modules/cards/singlecard.dm | 2 +- code/modules/cargo/coupon.dm | 2 +- code/modules/cargo/materials_market.dm | 2 +- code/modules/cargo/orderconsole.dm | 13 +- code/modules/cargo/universal_scanner.dm | 2 +- code/modules/clothing/belts/polymorph_belt.dm | 2 +- code/modules/clothing/clothing.dm | 2 +- code/modules/clothing/gloves/_gloves.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/head/jobs.dm | 2 +- code/modules/clothing/head/tophat.dm | 2 +- code/modules/clothing/masks/muzzle.dm | 2 +- code/modules/clothing/neck/collar_bomb.dm | 2 +- code/modules/clothing/shoes/sneakers.dm | 4 +- .../clothing/spacesuits/_spacesuits.dm | 2 +- code/modules/clothing/spacesuits/softsuit.dm | 2 +- code/modules/clothing/under/_under.dm | 2 +- code/modules/economy/holopay.dm | 4 +- .../events/space_vines/vine_structure.dm | 17 +- code/modules/events/wizard/rpgloot.dm | 2 +- code/modules/experisci/destructive_scanner.dm | 2 +- code/modules/explorer_drone/exodrone.dm | 2 +- code/modules/explorer_drone/loot.dm | 2 +- code/modules/fishing/fish/_fish.dm | 2 +- code/modules/fishing/fish/types/rift.dm | 2 +- code/modules/fishing/fishing_rod.dm | 2 +- .../food_and_drinks/machinery/coffeemaker.dm | 4 +- .../food_and_drinks/machinery/deep_fryer.dm | 2 +- .../food_and_drinks/machinery/gibber.dm | 2 +- .../food_and_drinks/machinery/griddle.dm | 2 +- .../food_and_drinks/machinery/icecream_vat.dm | 4 +- .../machinery/monkeyrecycler.dm | 2 +- .../modules/food_and_drinks/machinery/oven.dm | 2 +- .../food_and_drinks/machinery/processor.dm | 2 +- .../food_and_drinks/machinery/smartfridge.dm | 2 +- .../food_and_drinks/machinery/stove.dm | 2 +- code/modules/food_and_drinks/plate.dm | 4 +- .../food_and_drinks/restaurant/_venue.dm | 24 +- code/modules/holodeck/items.dm | 4 +- .../hydroponics/beekeeping/bee_smoker.dm | 2 +- code/modules/hydroponics/beekeeping/beebox.dm | 2 +- code/modules/hydroponics/biogenerator.dm | 2 +- code/modules/hydroponics/fermenting_barrel.dm | 2 +- code/modules/hydroponics/grown/corn.dm | 2 +- code/modules/hydroponics/grown/hedges.dm | 17 +- code/modules/hydroponics/grown/melon.dm | 6 +- code/modules/hydroponics/grown/mushrooms.dm | 2 +- code/modules/hydroponics/grown/potato.dm | 2 +- code/modules/hydroponics/grown/pumpkin.dm | 2 +- code/modules/hydroponics/grown/root.dm | 6 +- code/modules/hydroponics/grown/towercap.dm | 2 +- code/modules/hydroponics/hydroitemdefines.dm | 2 +- code/modules/hydroponics/hydroponics.dm | 8 +- code/modules/hydroponics/seed_extractor.dm | 2 +- code/modules/hydroponics/seeds.dm | 2 +- code/modules/instruments/items.dm | 6 +- .../job_types/chaplain/chaplain_nullrod.dm | 42 +-- .../chaplain/chaplain_vorpal_scythe.dm | 2 +- code/modules/library/book.dm | 2 +- code/modules/library/bookcase.dm | 2 +- code/modules/library/lib_machines.dm | 6 +- .../library/skill_learning/skill_station.dm | 2 +- .../mapfluff/ruins/lavaland_ruin_code.dm | 2 +- .../lavalandruin_code/elephantgraveyard.dm | 2 +- .../ruins/lavalandruin_code/syndicate_base.dm | 2 +- .../ruins/objects_and_mobs/sin_ruins.dm | 2 +- .../ruins/spaceruin_code/garbagetruck.dm | 2 +- .../mapfluff/ruins/spaceruin_code/meateor.dm | 2 +- .../oldstation/oldstation_rnd.dm | 2 +- code/modules/meteors/meteor_types.dm | 2 +- .../kinetic_crusher/kinetic_crusher.dm | 6 +- .../mining/equipment/marker_beacons.dm | 2 +- code/modules/mining/equipment/resonator.dm | 2 +- code/modules/mining/laborcamp/laborstacker.dm | 2 +- .../lavaland/mining_loot/cursed_katana.dm | 2 +- .../mining_loot/megafauna/blood_drunk.dm | 20 +- .../mining_loot/megafauna/bubblegum.dm | 2 +- .../mining_loot/megafauna/colossus.dm | 2 +- .../lavaland/mining_loot/megafauna/legion.dm | 2 +- .../mining/lavaland/necropolis_chests.dm | 2 +- code/modules/mining/ores_coins.dm | 4 +- code/modules/mining/satchel_ore_box.dm | 2 +- code/modules/mob/living/basic/bots/_bots.dm | 2 +- .../living/basic/bots/repairbot/repairbot.dm | 2 +- code/modules/mob/living/basic/clown/clown.dm | 20 +- code/modules/mob/living/basic/cult/shade.dm | 2 +- .../living/basic/jungle/seedling/seedling.dm | 2 +- .../living/basic/jungle/venus_human_trap.dm | 12 +- .../living/basic/lavaland/goliath/goliath.dm | 2 +- .../basic/lavaland/legion/legion_tumour.dm | 2 +- .../mob/living/basic/minebots/minebot.dm | 2 +- .../modules/mob/living/basic/pets/dog/_dog.dm | 2 +- .../mob/living/basic/pets/dog/corgi.dm | 2 +- .../basic/ruin_defender/living_floor.dm | 2 +- .../modules/mob/living/basic/slime/defense.dm | 2 +- .../basic/space_fauna/eyeball/_eyeball.dm | 2 +- .../mob/living/basic/space_fauna/mushroom.dm | 2 +- .../basic/vermin/mothroach/mothroach.dm | 2 +- code/modules/mob/living/basic/vermin/mouse.dm | 2 +- code/modules/mob/living/brain/MMI.dm | 2 +- code/modules/mob/living/brain/brain_item.dm | 2 +- code/modules/mob/living/brain/posibrain.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 2 +- .../mob/living/silicon/ai/ai_defense.dm | 2 +- .../mob/living/simple_animal/bot/bot.dm | 2 +- .../living/simple_animal/bot/construction.dm | 20 +- .../mob/living/simple_animal/bot/mulebot.dm | 2 +- .../mob/living/simple_animal/bot/secbot.dm | 2 +- .../hostile/megafauna/bubblegum.dm | 2 +- .../hostile/megafauna/hierophant.dm | 2 +- .../mob/living/simple_animal/hostile/ooze.dm | 21 +- code/modules/mod/mod_construction.dm | 4 +- code/modules/mod/mod_link.dm | 2 +- code/modules/mod/modules/_module.dm | 2 +- code/modules/mod/modules/module_pathfinder.dm | 2 +- .../computers/item/disks/virus_disk.dm | 2 +- .../modular_computers/computers/item/pda.dm | 2 +- .../computers/machinery/modular_computer.dm | 4 +- code/modules/pai/card.dm | 2 +- code/modules/paperwork/clipboard.dm | 2 +- code/modules/paperwork/desk_bell.dm | 2 +- code/modules/paperwork/fax.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 2 +- code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/paper.dm | 2 +- code/modules/paperwork/paper_biscuit.dm | 2 +- code/modules/paperwork/paper_cutter.dm | 2 +- code/modules/paperwork/paperbin.dm | 2 +- code/modules/paperwork/paperplane.dm | 2 +- code/modules/paperwork/paperwork.dm | 4 +- code/modules/paperwork/pen.dm | 4 +- code/modules/paperwork/photocopier.dm | 2 +- code/modules/paperwork/ticketmachine.dm | 2 +- code/modules/photography/photos/frame.dm | 2 +- code/modules/photography/photos/photo.dm | 2 +- .../plumbing/plumbers/plumbing_buffer.dm | 2 +- code/modules/plumbing/plumbers/teleporter.dm | 2 +- code/modules/power/cable.dm | 2 +- code/modules/power/floodlight.dm | 2 +- code/modules/power/gravitygenerator.dm | 4 +- code/modules/power/lighting/light.dm | 13 +- .../modules/power/lighting/light_construct.dm | 2 +- code/modules/power/lighting/light_items.dm | 4 +- code/modules/power/pipecleaners.dm | 2 +- code/modules/power/port_gen.dm | 2 +- code/modules/power/power.dm | 2 +- code/modules/power/rtg.dm | 4 +- .../power/singularity/containment_field.dm | 2 +- code/modules/power/singularity/emitter.dm | 2 +- code/modules/power/solar.dm | 4 +- .../supermatter/supermatter_hit_procs.dm | 2 +- code/modules/power/tesla/coil.dm | 4 +- .../projectiles/ammunition/_ammunition.dm | 2 +- .../projectiles/ammunition/ballistic/foam.dm | 2 +- .../projectiles/guns/ballistic/automatic.dm | 2 +- .../projectiles/guns/ballistic/launchers.dm | 2 +- .../projectiles/guns/ballistic/pistol.dm | 2 +- .../projectiles/guns/energy/dueling.dm | 2 +- .../projectiles/guns/energy/laser_gatling.dm | 2 +- .../projectiles/guns/energy/recharge.dm | 2 +- .../guns/special/grenade_launcher.dm | 2 +- .../projectiles/guns/special/hand_of_midas.dm | 2 +- code/modules/projectiles/pins.dm | 2 +- code/modules/reagents/chemistry/items.dm | 2 +- .../reagents/chemistry/machinery/pandemic.dm | 2 +- code/modules/reagents/reagent_containers.dm | 4 +- .../reagents/reagent_containers/blood_pack.dm | 2 +- .../reagents/reagent_containers/cups/_cup.dm | 4 +- .../reagent_containers/cups/glassbottle.dm | 4 +- .../reagents/reagent_containers/misc.dm | 2 +- .../reagents/reagent_containers/spray.dm | 2 +- .../reagents/reagent_containers/syringes.dm | 2 +- code/modules/reagents/reagent_dispenser.dm | 4 +- code/modules/recycling/conveyor.dm | 8 +- code/modules/recycling/disposal/bin.dm | 6 +- .../recycling/disposal/pipe_sorting.dm | 2 +- code/modules/recycling/sortingmachinery.dm | 4 +- code/modules/religion/burdened/psyker.dm | 2 +- code/modules/research/anomaly/anomaly_core.dm | 2 +- .../research/anomaly/anomaly_refinery.dm | 2 +- code/modules/research/experimentor.dm | 2 +- .../research/ordnance/doppler_array.dm | 2 +- code/modules/research/rdconsole.dm | 2 +- code/modules/research/server.dm | 2 +- .../xenobiology/crossbreeding/_weapons.dm | 2 +- .../xenobiology/vatgrowing/petri_dish.dm | 2 +- .../research/xenobiology/xenobio_camera.dm | 2 +- code/modules/shuttle/misc/special.dm | 4 +- .../spell_types/self/spacetime_distortion.dm | 2 +- code/modules/surgery/bodyparts/_bodyparts.dm | 2 +- .../surgery/bodyparts/robot_bodyparts.dm | 4 +- .../surgery/experimental_dissection.dm | 2 +- code/modules/surgery/organs/autosurgeon.dm | 4 +- .../organs/internal/heart/heart_anomalock.dm | 2 +- .../modules/transport/tram/tram_controller.dm | 2 +- code/modules/transport/tram/tram_signals.dm | 6 +- .../modules/transport/tram/tram_structures.dm | 6 +- code/modules/transport/transport_module.dm | 2 +- code/modules/vehicles/cars/clowncar.dm | 12 +- code/modules/vehicles/mecha/combat/durand.dm | 2 +- .../mecha/equipment/tools/other_tools.dm | 3 +- code/modules/vehicles/mecha/mech_bay.dm | 2 +- code/modules/vehicles/mecha/mecha_defense.dm | 14 +- code/modules/vehicles/mecha/mecha_parts.dm | 2 +- code/modules/vehicles/motorized_wheelchair.dm | 2 +- code/modules/vehicles/pimpin_ride.dm | 2 +- code/modules/vehicles/ridden.dm | 2 +- code/modules/vehicles/scooter.dm | 4 +- code/modules/vehicles/sealed.dm | 2 +- code/modules/vehicles/secway.dm | 2 +- code/modules/vending/_vending.dm | 4 +- .../wiremod/components/abstract/module.dm | 2 +- code/modules/wiremod/components/action/mmi.dm | 2 +- .../modules/wiremod/core/component_printer.dm | 4 +- .../wiremod/core/integrated_circuit.dm | 2 +- code/modules/wiremod/core/usb_cable.dm | 2 +- .../wiremod/shell/brain_computer_interface.dm | 4 +- code/modules/wiremod/shell/dispenser.dm | 2 +- code/modules/zombie/items.dm | 2 +- .../code/modules/fluff/flora/ash_flora.dm | 59 ---- 484 files changed, 1088 insertions(+), 1144 deletions(-) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 359e717dcd5..89ff98b5429 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -332,14 +332,6 @@ GLOBAL_LIST_INIT(leg_zones, list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) /// Calculates the new armour value after armour penetration. Can return negative values, and those must be caught. #define PENETRATE_ARMOUR(armour, penetration) (penetration == 100 ? 0 : 100 * (armour - penetration) / (100 - penetration)) -/// Return values used in item/melee/baton/baton_attack. -/// Does a normal item attack. -#define BATON_DO_NORMAL_ATTACK 1 -/// The attack has been stopped. Either because the user was clumsy or the attack was blocked. -#define BATON_ATTACK_DONE 2 -/// The baton attack is still going. baton_effect() is called. -#define BATON_ATTACKING 3 - // Defines for combo attack component /// LMB Attack #define LEFT_ATTACK "Left Attack" @@ -379,3 +371,46 @@ GLOBAL_LIST_INIT(leg_zones, list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) /// Calculates the amount of burn force when applying this much energy to a mob via electrocution from an energy source. #define ELECTROCUTE_DAMAGE(energy) (energy >= 1 KILO JOULES ? clamp(20 + round(energy / JOULES_PER_DAMAGE), 20, 195) + rand(-5,5) : 0) BUBBERSTATION CHANGE END */ + +// Attack chain attack_modifier modifiers +/// Sets the weapon's base force to this. Use carefully (as multiple overrides may collide). Set via [SET_ATTACK_FORCE] +#define FORCE_OVERRIDE "force_override" +/// Flat addition or subtration to the weapon's force. Set via [MODIFY_ATTACK_FORCE] +#define FORCE_MODIFIER "force_modifier" +/// Multiplication of the weapon's force. Applied AFTER [FORCE_MODIFIER]. Set via [MODIFY_ATTACK_FORCE_MULTIPLIER] +#define FORCE_MULTIPLIER "force_multiplier" +/// If set in modifiers, default messages ("You hit the thing with the thing") are silenced +#define SILENCE_DEFAULT_MESSAGES "silence_default_messages" +/// If set in modifiers, default hitsound is silenced +#define SILENCE_HITSOUND "silence_hitsound" + +/// Used in attack chain to set the force of the attack without changing the base force of the item. +#define SET_ATTACK_FORCE(atk_mods, value) \ + if(!islist(atk_mods)) { atk_mods = list() }; \ + atk_mods[FORCE_OVERRIDE] = value; + +/// Used in attack chain to add or remove force from the attack without changing the base force of the item. +#define MODIFY_ATTACK_FORCE(atk_mods, amount) \ + if(!islist(atk_mods)) { atk_mods = list() }; \ + atk_mods[FORCE_MODIFIER] += amount; + +/// Used in attack chain to multiply the force of the attack without changing the base force of the item. +#define MODIFY_ATTACK_FORCE_MULTIPLIER(atk_mods, amount) \ + if(!islist(atk_mods)) { atk_mods = list() }; \ + if(!(FORCE_MULTIPLIER in atk_mods)) { atk_mods[FORCE_MULTIPLIER] = 1 }; \ + atk_mods[FORCE_MULTIPLIER] *= amount; + +/// Used in attack chain to prevent hitsounds on attack (to allow for custom sounds) +#define MUTE_ATTACK_HITSOUND(atk_mods) \ + if(!islist(atk_mods)) { atk_mods = list() }; \ + atk_mods[SILENCE_HITSOUND] = TRUE; + +/// Used in attack chain to prevent default visible messages from being sent (to allow for custom messages) +#define HIDE_ATTACK_MESSAGES(atk_mods) \ + if(!islist(atk_mods)) { atk_mods = list() }; \ + atk_mods[SILENCE_DEFAULT_MESSAGES] = TRUE; + +/// Calculates the final force of some item based on atk_mods +/// Needs to have support for force overrides and multipliers of 0 (hence why we ternaries are used over 'or's) +#define CALCULATE_FORCE(some_item, atk_mods) \ + ((((FORCE_OVERRIDE in atk_mods) ? atk_mods[FORCE_OVERRIDE] : some_item.force) + (atk_mods?[FORCE_MODIFIER] || 0)) * ((FORCE_MULTIPLIER in atk_mods) ? atk_mods[FORCE_MULTIPLIER] : 1)) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 4f0665e0bae..978b02413ca 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -194,7 +194,7 @@ #define COMSIG_TABLE_SLAMMED "table_slammed" ///from base of atom/attack_hand(): (mob/user, modifiers) #define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" -///from base of /obj/item/attack(): (mob/M, mob/user, list/modifiers) +///from base of /obj/item/attack(): (mob/M, mob/user, list/modifiers, list/attack_modifiers) #define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" ///from base of mob/RangedAttack(): (atom/A, modifiers) #define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index a11aa288557..a113f0b88e8 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -133,7 +133,7 @@ #define COMSIG_ITEM_ON_GRIND "on_grind" ///from base of obj/item/on_juice(): () #define COMSIG_ITEM_ON_JUICE "on_juice" -///from /obj/machinery/hydroponics/attackby(obj/item/O, mob/user, list/modifiers) when an object is used as compost: (mob/user) +///from /obj/machinery/hydroponics/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) when an object is used as compost: (mob/user) #define COMSIG_ITEM_ON_COMPOSTED "on_composted" ///Called when an item is dried by a drying rack #define COMSIG_ITEM_DRIED "item_dried" @@ -461,7 +461,7 @@ /// Prevents click from happening. #define COMPONENT_CANCEL_EQUIPMENT_CLICK (1<<0) -///from base of /obj/item/attack(): (mob/living, mob/living, list/modifiers) +///from base of /obj/item/attack(): (mob/living, mob/living, list/modifiers, list/attack_modifiers) #define COMSIG_ITEM_ATTACK "item_attack" ///from base of obj/item/attack_self(): (/mob) #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" @@ -471,12 +471,12 @@ #define COMSIG_ITEM_ATTACK_ATOM "item_attack_atom" ///from base of obj/item/pre_attack(): (atom/target, mob/user, list/modifiers) #define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" -/// From base of [/obj/item/proc/pre_attack_secondary()]: (atom/target, mob/user, list/modifiers) +/// From base of [/obj/item/proc/pre_attack_secondary()]: (atom/target, mob/user, list/modifiers, list/attack_modifiers) #define COMSIG_ITEM_PRE_ATTACK_SECONDARY "item_pre_attack_secondary" #define COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN (1<<0) #define COMPONENT_SECONDARY_CONTINUE_ATTACK_CHAIN (1<<1) #define COMPONENT_SECONDARY_CALL_NORMAL_ATTACK_CHAIN (1<<2) -/// From base of [/obj/item/proc/attack_secondary()]: (atom/target, mob/user, list/modifiers) +/// From base of [/obj/item/proc/attack_secondary()]: (atom/target, mob/user, list/modifiers, list/attack_modifiers) #define COMSIG_ITEM_ATTACK_SECONDARY "item_attack_secondary" ///from base of [obj/item/attack()]: (atom/target, mob/user, proximity_flag, list/modifiers) #define COMSIG_ITEM_AFTERATTACK "item_afterattack" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 57c1af477d5..bfe605247bc 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -1,17 +1,31 @@ /** - * This is the proc that handles the order of an item_attack. + * THIS IS THE ROOT OF ALL EVIL (I mean the root of all item-on-atom interactions) * - * The order of procs called is: - * * [/atom/proc/tool_act] on the target. If it returns ITEM_INTERACT_SUCCESS or ITEM_INTERACT_BLOCKING, the chain will be stopped. - * * [/obj/item/proc/pre_attack] on src. If this returns TRUE, the chain will be stopped. - * * [/atom/proc/attackby] on the target. If it returns TRUE, the chain will be stopped. - * * [/obj/item/proc/afterattack]. The return value does not matter. + * Implementation details + * + * [obj/item/proc/base_item_interaction] handles all non-combat interactions of an item with an atom. + * This calls [atom/proc/tool_act], among others. + * + * [obj/item/proc/pre_attack] is called before an attack is made, before we even check for block. + * Use pre attack to cancel attacks early based on conditions ("You cant attack with this unless you're a pacifist!") + * After pre-attack we go into [atom/proc/attackby] which is where individual atoms handle what happens when being hit + * Objects use [obj/item/proc/attack_atom], mobs use [obj/item/proc/attack]. + * You GENERALLY should never override attack, like ever. (On-attack effects go in afterattack) + * Regardless, we go BACK to the atom to call [atom/proc/attacked_by], which is where the damage is actually applied. + * Finally we call [obj/item/proc/afterattack] after damage is dealt, to handle special item interacts after an attack occurs. + * Use afterattack for stuff like "My stick stuns when it hits people". + * + * Arguments + * * mob/living/user - The mob using src on something + * * atom/target - The atom being clicked on with src + * * list/modifiers - click params such as alt/shift and x/y, etc + * * list/attack_modifiers - attack modifiers such as force, damage type, etc. Only used in attacks */ -/obj/item/proc/melee_attack_chain(mob/user, atom/target, list/modifiers) +/obj/item/proc/melee_attack_chain(mob/user, atom/target, list/modifiers, list/attack_modifiers = list()) //Proxy replaces src cause it returns an atom that will attack the target on our behalf var/obj/item/source_atom = get_proxy_attacker_for(target, user) if(source_atom != src) //if we are someone else then call that attack chain else we can proceed with the usual stuff - return source_atom.melee_attack_chain(user, target, modifiers) + return source_atom.melee_attack_chain(user, target, modifiers, attack_modifiers) var/is_right_clicking = LAZYACCESS(modifiers, RIGHT_CLICK) @@ -25,9 +39,9 @@ var/pre_attack_result if (is_right_clicking) - switch (pre_attack_secondary(target, user, modifiers)) + switch (pre_attack_secondary(target, user, modifiers, attack_modifiers)) if (SECONDARY_ATTACK_CALL_NORMAL) - pre_attack_result = pre_attack(target, user, modifiers) + pre_attack_result = pre_attack(target, user, modifiers, attack_modifiers) if (SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return TRUE if (SECONDARY_ATTACK_CONTINUE_CHAIN) @@ -35,7 +49,7 @@ else CRASH("pre_attack_secondary must return an SECONDARY_ATTACK_* define, please consult code/__DEFINES/combat.dm") else - pre_attack_result = pre_attack(target, user, modifiers) + pre_attack_result = pre_attack(target, user, modifiers, attack_modifiers) if(pre_attack_result) return TRUE @@ -44,9 +58,9 @@ var/attackby_result if (is_right_clicking) - switch (target.attackby_secondary(src, user, modifiers)) + switch (target.attackby_secondary(src, user, modifiers, attack_modifiers)) if (SECONDARY_ATTACK_CALL_NORMAL) - attackby_result = target.attackby(src, user, modifiers) + attackby_result = target.attackby(src, user, modifiers, attack_modifiers) if (SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return TRUE if (SECONDARY_ATTACK_CONTINUE_CHAIN) @@ -54,7 +68,7 @@ else CRASH("attackby_secondary must return an SECONDARY_ATTACK_* define, please consult code/__DEFINES/combat.dm") else - attackby_result = target.attackby(src, user, modifiers) + attackby_result = target.attackby(src, user, modifiers, attack_modifiers) if (attackby_result) // This means the attack failed or was handled for whatever reason @@ -89,11 +103,12 @@ * * atom/target - The atom about to be hit * * mob/living/user - The mob doing the htting * * list/modifiers - click params such as alt/shift etc - * + * * attack_modifiers - attack modifiers such as force, damage type, etc + * See: [/obj/item/proc/melee_attack_chain] */ -/obj/item/proc/pre_attack(atom/target, mob/living/user, list/modifiers) //do stuff before attackby! - if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, target, user, modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) +/obj/item/proc/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) //do stuff before attackby! + if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, target, user, modifiers, attack_modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE return FALSE //return TRUE to avoid calling attackby after this proc does stuff @@ -104,11 +119,12 @@ * * atom/target - The atom about to be hit * * mob/living/user - The mob doing the htting * * list/modifiers - click params such as alt/shift etc + * * list/attack_modifiers - attack modifiers such as force, damage type, etc * * See: [/obj/item/proc/melee_attack_chain] */ -/obj/item/proc/pre_attack_secondary(atom/target, mob/living/user, list/modifiers) - var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK_SECONDARY, target, user, modifiers) +/obj/item/proc/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK_SECONDARY, target, user, modifiers, attack_modifiers) if(signal_result & COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -124,12 +140,13 @@ * Arguments: * * obj/item/attacking_item - The item hitting this atom * * mob/user - The wielder of this item - * * params - click params such as alt/shift etc + * * list/modifiers - click params such as alt/shift etc + * * list/attack_modifiers - attack modifiers such as force, damage type, etc * * See: [/obj/item/proc/melee_attack_chain] */ -/atom/proc/attackby(obj/item/attacking_item, mob/user, list/modifiers) - if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY, attacking_item, user, modifiers) & COMPONENT_NO_AFTERATTACK) +/atom/proc/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) + if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY, attacking_item, user, modifiers, attack_modifiers) & COMPONENT_NO_AFTERATTACK) return TRUE return FALSE @@ -139,12 +156,13 @@ * Arguments: * * obj/item/weapon - The item hitting this atom * * mob/user - The wielder of this item - * * params - click params such as alt/shift etc + * * list/modifiers - click params such as alt/shift etc + * * list/attack_modifiers - attack modifiers such as force, damage type, etc * * See: [/obj/item/proc/melee_attack_chain] */ -/atom/proc/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) - var/signal_result = SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY_SECONDARY, weapon, user, modifiers) +/atom/proc/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) + var/signal_result = SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY_SECONDARY, weapon, user, modifiers, attack_modifiers) if(signal_result & COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -154,12 +172,12 @@ return SECONDARY_ATTACK_CALL_NORMAL -/obj/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(..()) return TRUE if(!(obj_flags & CAN_BE_HIT)) return FALSE - return attacking_item.attack_atom(src, user, modifiers) + return attacking_item.attack_atom(src, user, modifiers, attack_modifiers) /mob/living/item_interaction(mob/living/user, obj/item/tool, list/modifiers) for(var/datum/surgery/operation as anything in surgeries) @@ -172,14 +190,14 @@ return NONE -/mob/living/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/mob/living/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(..()) return TRUE user.changeNext_move(attacking_item.attack_speed) - return attacking_item.attack(src, user, modifiers) + return attacking_item.attack(src, user, modifiers, attack_modifiers) -/mob/living/attackby_secondary(obj/item/weapon, mob/living/user, list/modifiers) - var/result = weapon.attack_secondary(src, user, modifiers) +/mob/living/attackby_secondary(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) + var/result = weapon.attack_secondary(src, user, modifiers, attack_modifiers) // Normal attackby updates click cooldown, so we have to make up for it if (result != SECONDARY_ATTACK_CALL_NORMAL) @@ -196,10 +214,11 @@ * Arguments: * * mob/living/target_mob - The mob being hit by this item * * mob/living/user - The mob hitting with this item - * * params - Click params of this attack + * * modifiers - click modifiers such as alt/shift or x/y + * * attack_modifiers - attack modifiers such as force, damage type, etc */ -/obj/item/proc/attack(mob/living/target_mob, mob/living/user, list/modifiers) - var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, target_mob, user, modifiers) || SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, target_mob, user, modifiers) +/obj/item/proc/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) + var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, target_mob, user, modifiers, attack_modifiers) || SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, target_mob, user, modifiers, attack_modifiers) if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE if(signal_return & COMPONENT_SKIP_ATTACK) @@ -208,37 +227,39 @@ if(item_flags & NOBLUDGEON) return FALSE - if(damtype != STAMINA && force && HAS_TRAIT(user, TRAIT_PACIFISM)) + var/final_force = CALCULATE_FORCE(src, attack_modifiers) + if(damtype != STAMINA && final_force && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm other living beings!")) return FALSE - if(!force && !HAS_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND)) - playsound(src, 'sound/items/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) - else if(hitsound) - playsound(src, hitsound, get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0) + if(!LAZYACCESS(attack_modifiers, SILENCE_HITSOUND)) + if(!final_force && !HAS_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND)) + playsound(src, 'sound/items/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) + else if(hitsound) + playsound(src, hitsound, get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0) target_mob.lastattacker = user.real_name target_mob.lastattackerckey = user.ckey - if(force && target_mob == user && user.client) + if(final_force && target_mob == user && user.client) user.client.give_award(/datum/award/achievement/misc/selfouch, user) if(get(src, /mob/living) == user) // telekinesis. user.do_attack_animation(target_mob) - if(!target_mob.attacked_by(src, user)) + if(!target_mob.attacked_by(src, user, modifiers, attack_modifiers)) return TRUE - SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target_mob, user, modifiers) - SEND_SIGNAL(target_mob, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, modifiers) - afterattack(target_mob, user, modifiers) - - log_combat(user, target_mob, "attacked", src.name, "(COMBAT MODE: [uppertext(user.combat_mode)]) (DAMTYPE: [uppertext(damtype)])") + SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target_mob, user, modifiers, attack_modifiers) + SEND_SIGNAL(target_mob, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, modifiers, attack_modifiers) + afterattack(target_mob, user, modifiers, attack_modifiers) + if(final_force > 0) + log_combat(user, target_mob, "attacked", src.name, "(COMBAT MODE: [uppertext(user.combat_mode)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) return FALSE // unhandled /// The equivalent of [/obj/item/proc/attack] but for alternate attacks, AKA right clicking -/obj/item/proc/attack_secondary(mob/living/victim, mob/living/user, list/modifiers) - var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SECONDARY, victim, user, modifiers) +/obj/item/proc/attack_secondary(mob/living/victim, mob/living/user, list/modifiers, list/attack_modifiers) + var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SECONDARY, victim, user, modifiers, attack_modifiers) if(signal_result & COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -249,8 +270,8 @@ return SECONDARY_ATTACK_CALL_NORMAL /// The equivalent of the standard version of [/obj/item/proc/attack] but for non mob targets. -/obj/item/proc/attack_atom(atom/attacked_atom, mob/living/user, list/modifiers) - var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_ATOM, attacked_atom, user) | SEND_SIGNAL(user, COMSIG_LIVING_ATTACK_ATOM, attacked_atom) +/obj/item/proc/attack_atom(atom/attacked_atom, mob/living/user, list/modifiers, list/attack_modifiers) + var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_ATOM, attacked_atom, user, modifiers, attack_modifiers) | SEND_SIGNAL(user, COMSIG_LIVING_ATTACK_ATOM, attacked_atom, modifiers, attack_modifiers) if(signal_return & COMPONENT_SKIP_ATTACK) return TRUE if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN) @@ -260,30 +281,32 @@ user.changeNext_move(attack_speed) if(get(src, /mob/living) == user) // telekinesis. user.do_attack_animation(attacked_atom) - attacked_atom.attacked_by(src, user) - SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, attacked_atom, user, modifiers) - SEND_SIGNAL(attacked_atom, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, modifiers) - afterattack(attacked_atom, user, modifiers) + attacked_atom.attacked_by(src, user, modifiers, attack_modifiers) + SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, attacked_atom, user, modifiers, attack_modifiers) + SEND_SIGNAL(attacked_atom, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, modifiers, attack_modifiers) + afterattack(attacked_atom, user, modifiers, attack_modifiers) return FALSE // unhandled /// Called from [/obj/item/proc/attack_atom] and [/obj/item/proc/attack] if the attack succeeds -/atom/proc/attacked_by(obj/item/attacking_item, mob/living/user) +/atom/proc/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(!uses_integrity) CRASH("attacked_by() was called on an object that doesn't use integrity!") - if(!attacking_item.force) - return + var/final_force = CALCULATE_FORCE(attacking_item, attack_modifiers) + if(final_force <= 0) + return 0 - var/damage = take_damage(attacking_item.force, attacking_item.damtype, MELEE, 1, get_dir(src, user)) + var/damage = take_damage(final_force, attacking_item.damtype, MELEE, 1, get_dir(src, user)) //only witnesses close by and the victim see a hit message. user.visible_message(span_danger("[user] hits [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), \ span_danger("You hit [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), null, COMBAT_MESSAGE_RANGE) log_combat(user, src, "attacked", attacking_item) + return damage -/area/attacked_by(obj/item/attacking_item, mob/living/user) +/area/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) CRASH("areas are NOT supposed to have attacked_by() called on them!") -/mob/living/attacked_by(obj/item/attacking_item, mob/living/user) +/mob/living/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) var/targeting = check_zone(user.zone_selected) if(user != src) @@ -293,7 +316,8 @@ targeting = get_random_valid_zone(targeting, zone_hit_chance) var/targeting_human_readable = parse_zone_with_bodypart(targeting) - send_item_attack_message(attacking_item, user, targeting_human_readable, targeting) + if(!LAZYACCESS(attack_modifiers, SILENCE_DEFAULT_MESSAGES)) + send_item_attack_message(attacking_item, user, targeting_human_readable, targeting) var/armor_block = min(run_armor_check( def_zone = targeting, @@ -304,9 +328,9 @@ weak_against_armour = attacking_item.weak_against_armour, ), ARMOR_MAX_BLOCK) - var/damage = attacking_item.force + var/final_force = CALCULATE_FORCE(attacking_item, attack_modifiers) if(mob_biotypes & MOB_ROBOTIC) - damage *= attacking_item.get_demolition_modifier(src) + final_force *= attacking_item.get_demolition_modifier(src) var/wounding = attacking_item.wound_bonus if((attacking_item.item_flags & SURGICAL_TOOL) && !user.combat_mode && body_position == LYING_DOWN && (LAZYLEN(surgeries) > 0)) @@ -314,20 +338,20 @@ if(user != src) // This doesn't factor in armor, or most damage modifiers (physiology). Your mileage may vary - if(check_block(attacking_item, damage, "\the [attacking_item]", MELEE_ATTACK, attacking_item.armour_penetration, attacking_item.damtype)) - return FALSE + if(check_block(attacking_item, final_force, "\the [attacking_item]", MELEE_ATTACK, attacking_item.armour_penetration, attacking_item.damtype)) + return 0 SEND_SIGNAL(attacking_item, COMSIG_ITEM_ATTACK_ZONE, src, user, targeting) - if(damage <= 0) - return TRUE + if(final_force <= 0) + return 1 // Pretend like we did 1 damage so afterattack still runs if(ishuman(src) || client) // istype(src) is kinda bad, but it's to avoid spamming the blackbox SSblackbox.record_feedback("nested tally", "item_used_for_combat", 1, list("[attacking_item.force]", "[attacking_item.type]")) SSblackbox.record_feedback("tally", "zone_targeted", 1, targeting_human_readable) var/damage_done = apply_damage( - damage = damage, + damage = final_force, damagetype = attacking_item.damtype, def_zone = targeting, blocked = armor_block, @@ -340,7 +364,7 @@ attack_effects(damage_done, targeting, armor_block, attacking_item, user) - return TRUE + return damage_done /** * Called when we take damage, used to cause effects such as a blood splatter. @@ -436,7 +460,7 @@ * * proximity_flag - is 1 if this afterattack was called on something adjacent, in your square, or on your person. * * click_parameters - is the params string from byond [/atom/proc/Click] code, see that documentation. */ -/obj/item/proc/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/proc/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) PROTECTED_PROC(TRUE) return diff --git a/code/datums/components/alternative_sharpness.dm b/code/datums/components/alternative_sharpness.dm index 4518f708c0b..5709103d1eb 100644 --- a/code/datums/components/alternative_sharpness.dm +++ b/code/datums/components/alternative_sharpness.dm @@ -32,14 +32,14 @@ /datum/component/alternative_sharpness/RegisterWithParent() RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK_SECONDARY, PROC_REF(on_secondary_attack)) -/datum/component/alternative_sharpness/proc/on_secondary_attack(obj/item/source, atom/target, mob/user, list/modifiers) +/datum/component/alternative_sharpness/proc/on_secondary_attack(obj/item/source, atom/target, mob/user, list/modifiers, list/attack_modifiers) SIGNAL_HANDLER if (alt_attacking || (required_trait && !HAS_TRAIT(source, required_trait))) return alt_attacking = TRUE - source.force += force_mod + MODIFY_ATTACK_FORCE(attack_modifiers, force_mod) base_sharpness = source.sharpness source.sharpness = alt_sharpness if (!isnull(verbs_continuous)) @@ -54,7 +54,6 @@ /datum/component/alternative_sharpness/proc/disable_alt_attack() var/obj/item/weapon = parent alt_attacking = FALSE - weapon.force -= force_mod weapon.attack_verb_continuous = base_continuous weapon.attack_verb_simple = base_simple weapon.sharpness = base_sharpness diff --git a/code/datums/components/focused_attacker.dm b/code/datums/components/focused_attacker.dm index 12432414f77..23d88a9f5a6 100644 --- a/code/datums/components/focused_attacker.dm +++ b/code/datums/components/focused_attacker.dm @@ -3,6 +3,8 @@ * Not compatible with any other component or status effect which modifies attack damage */ /datum/component/focused_attacker + /// Current attack bonus + VAR_FINAL/current_gain /// Amount of damage we gain per attack var/gain_per_attack /// Maximum amount by which we can increase our attack power @@ -48,14 +50,14 @@ register_new_target(target) /// Before an item attacks, try increasing its attack power -/datum/component/focused_attacker/proc/pre_item_attack(obj/item/weapon, atom/target, mob/user, list/modifiers) +/datum/component/focused_attacker/proc/pre_item_attack(obj/item/weapon, atom/target, mob/user, list/modifiers, list/attack_modifiers) SIGNAL_HANDLER if (target == last_target) - if (weapon.force - initial(weapon.force) < maximum_gain) - weapon.force += gain_per_attack + current_gain += gain_per_attack + MODIFY_ATTACK_FORCE(attack_modifiers, current_gain) return - weapon.force = initial(weapon.force) + current_gain = 0 register_new_target(target) /// Register a new target diff --git a/code/datums/components/trapdoor.dm b/code/datums/components/trapdoor.dm index 73f24e6578c..87b80ebfdc9 100644 --- a/code/datums/components/trapdoor.dm +++ b/code/datums/components/trapdoor.dm @@ -339,7 +339,7 @@ internals.forceMove(get_turf(src)) internals = null -/obj/item/trapdoor_remote/attackby(obj/item/assembly/trapdoor/assembly, mob/living/user, list/modifiers) +/obj/item/trapdoor_remote/attackby(obj/item/assembly/trapdoor/assembly, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(. || !istype(assembly)) return diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index 6236d708e9e..1f36421c14f 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -232,7 +232,7 @@ QDEL_NULL(record) return ..() -/obj/item/disk/holodisk/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/disk/holodisk/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/disk/holodisk)) var/obj/item/disk/holodisk/holodiskOriginal = item if (holodiskOriginal.record) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 70cf1a6071c..3bc463dbb72 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -271,7 +271,7 @@ icon_state = inhand_icon_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" return ..() -/obj/item/staff/bostaff/attack(mob/target, mob/living/user, list/modifiers) +/obj/item/staff/bostaff/attack(mob/target, mob/living/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50)) to_chat(user, span_warning("You club yourself over the head with [src].")) diff --git a/code/datums/memory/tattoo_kit.dm b/code/datums/memory/tattoo_kit.dm index da23f12634f..6ae053b3163 100644 --- a/code/datums/memory/tattoo_kit.dm +++ b/code/datums/memory/tattoo_kit.dm @@ -17,7 +17,7 @@ . += span_notice("This kit has enough ink for [uses] use\s.") . += span_boldnotice("You can use a toner cartridge to refill this.") -/obj/item/tattoo_kit/attackby(obj/item/toner/ink_cart, mob/living/tattoo_artist, list/modifiers) +/obj/item/tattoo_kit/attackby(obj/item/toner/ink_cart, mob/living/tattoo_artist, list/modifiers, list/attack_modifiers) . = ..() if(!istype(ink_cart)) return @@ -29,7 +29,7 @@ qdel(ink_cart) balloon_alert(tattoo_artist, "added tattoo ink") -/obj/item/tattoo_kit/attack(mob/living/tattoo_holder, mob/living/tattoo_artist, list/modifiers) +/obj/item/tattoo_kit/attack(mob/living/tattoo_holder, mob/living/tattoo_artist, list/modifiers, list/attack_modifiers) . = ..() if(.) return TRUE diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 7c5dca1cd29..c8497112101 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -109,7 +109,7 @@ power_change() return ITEM_INTERACT_SUCCESS -/obj/machinery/pdapainter/attackby(obj/item/O, mob/living/user, list/modifiers) +/obj/machinery/pdapainter/attackby(obj/item/O, mob/living/user, list/modifiers, list/attack_modifiers) if(machine_stat & BROKEN) if(O.tool_behaviour == TOOL_WELDER && !user.combat_mode) if(!O.tool_start_check(user, amount=1)) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index f5afeb98f5f..501535d2590 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -804,13 +804,13 @@ return attack_robot(user) return _try_interact(user) -/obj/machinery/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return update_last_used(user) -/obj/machinery/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index 056e7299ee0..de874b70003 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -43,7 +43,7 @@ synced_bank_account = null return ..() -/obj/machinery/computer/bank_machine/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/computer/bank_machine/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) var/value = 0 if(istype(weapon, /obj/item/stack/spacecash)) var/obj/item/stack/spacecash/inserted_cash = weapon diff --git a/code/game/machinery/camera/camera_construction.dm b/code/game/machinery/camera/camera_construction.dm index 95c08a85409..3b3fec8cd5d 100644 --- a/code/game/machinery/camera/camera_construction.dm +++ b/code/game/machinery/camera/camera_construction.dm @@ -119,7 +119,7 @@ return ITEM_INTERACT_SUCCESS return ..() -/obj/machinery/camera/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/machinery/camera/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(camera_construction_state != CAMERA_STATE_FINISHED || panel_open) if(attacking_item.tool_behaviour == TOOL_ANALYZER) if(!isXRay(TRUE)) //don't reveal it was already upgraded if was done via MALF AI Upgrade Camera Network ability diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index a232bf09204..6d3a59688d0 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -43,7 +43,7 @@ update_appearance() return ITEM_INTERACT_SUCCESS -/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/stock_parts/power_store/cell) && !panel_open) if(machine_stat & BROKEN) to_chat(user, span_warning("[src] is broken!")) diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm index 913223fded7..b463ea45c21 100644 --- a/code/game/machinery/civilian_bounties.dm +++ b/code/game/machinery/civilian_bounties.dm @@ -47,7 +47,7 @@ ///Typecast of an inserted, scanned ID card inside the console, as bounties are held within the ID card. var/obj/item/card/id/inserted_scan_id -/obj/machinery/computer/piratepad_control/civilian/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/machinery/computer/piratepad_control/civilian/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(isidcard(I)) if(id_insert(user, I, inserted_scan_id)) inserted_scan_id = I diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 41ab9745976..7e74246ab3c 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -125,7 +125,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) return ACCESS_CAPTAIN in authorize_access // SKYRAT EDIT END -/obj/machinery/computer/communications/attackby(obj/I, mob/user, list/modifiers) +/obj/machinery/computer/communications/attackby(obj/I, mob/user, list/modifiers, list/attack_modifiers) if(isidcard(I)) attack_hand(user) else diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index b374faa53fa..fe10a55d8bf 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -172,7 +172,7 @@ genetic_damage_pulse() return -/obj/machinery/computer/scan_consolenew/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/computer/scan_consolenew/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) // Store chromosomes in the console if there's room if (istype(item, /obj/item/chromosome)) item.forceMove(src) diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index dd72adf9a83..c854dc746ca 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -11,7 +11,7 @@ log_silicon("\A [name] was created at [loc_name(src)].") message_admins("\A [name] was created at [ADMIN_VERBOSEJMP(src)].") -/obj/machinery/computer/upload/attackby(obj/item/O, mob/user, list/modifiers) +/obj/machinery/computer/upload/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, /obj/item/ai_module)) var/obj/item/ai_module/M = O if(machine_stat & (NOPOWER|BROKEN|MAINT)) diff --git a/code/game/machinery/computer/operating_computer.dm b/code/game/machinery/computer/operating_computer.dm index e1ed92bb8d8..b0f36acbfe0 100644 --- a/code/game/machinery/computer/operating_computer.dm +++ b/code/game/machinery/computer/operating_computer.dm @@ -50,7 +50,7 @@ linked_techweb = tool.buffer return TRUE -/obj/machinery/computer/operating/attackby(obj/item/O, mob/user, list/modifiers) +/obj/machinery/computer/operating/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, /obj/item/disk/surgery)) user.visible_message(span_notice("[user] begins to load \the [O] in \the [src]..."), \ span_notice("You begin to load a surgery protocol from \the [O]..."), \ diff --git a/code/game/machinery/computer/orders/order_computer/mining_order.dm b/code/game/machinery/computer/orders/order_computer/mining_order.dm index 3274475bb3d..2f1acf491f0 100644 --- a/code/game/machinery/computer/orders/order_computer/mining_order.dm +++ b/code/game/machinery/computer/orders/order_computer/mining_order.dm @@ -103,7 +103,7 @@ . = ..() . += span_notice("There's [points] point\s on the card.") -/obj/item/card/mining_point_card/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/card/mining_point_card/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(!isidcard(attacking_item)) return ..() var/obj/item/card/id/attacking_id = attacking_item diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm index 12b08e49190..6ad43ab5b05 100644 --- a/code/game/machinery/computer/prisoner/_prisoner.dm +++ b/code/game/machinery/computer/prisoner/_prisoner.dm @@ -50,7 +50,7 @@ balloon_alert_to_viewers("id ejected") playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 50, FALSE) -/obj/machinery/computer/prisoner/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/computer/prisoner/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/card/id/advanced/prisoner)) id_insert(user, weapon) return TRUE diff --git a/code/game/machinery/computer/records/medical.dm b/code/game/machinery/computer/records/medical.dm index c564c71f310..c38256e6826 100644 --- a/code/game/machinery/computer/records/medical.dm +++ b/code/game/machinery/computer/records/medical.dm @@ -20,11 +20,11 @@ pass_flags = PASSTABLE projectiles_pass_chance = 100 -/obj/machinery/computer/records/medical/attacked_by(obj/item/attacking_item, mob/living/user) - . = ..() - if(!istype(attacking_item, /obj/item/photo)) - return - insert_new_record(user, attacking_item) +/obj/machinery/computer/records/medical/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/photo)) + return NONE + insert_new_record(user, tool) + return ITEM_INTERACT_SUCCESS /obj/machinery/computer/records/medical/ui_interact(mob/user, datum/tgui/ui) . = ..() diff --git a/code/game/machinery/computer/records/security.dm b/code/game/machinery/computer/records/security.dm index 17a46e34576..616367b0f84 100644 --- a/code/game/machinery/computer/records/security.dm +++ b/code/game/machinery/computer/records/security.dm @@ -66,11 +66,11 @@ qdel(target) continue -/obj/machinery/computer/records/security/attacked_by(obj/item/attacking_item, mob/living/user) - . = ..() - if(!istype(attacking_item, /obj/item/photo)) - return - insert_new_record(user, attacking_item) +/obj/machinery/computer/records/security/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/photo)) + return NONE + insert_new_record(user, tool) + return ITEM_INTERACT_SUCCESS /obj/machinery/computer/records/security/ui_interact(mob/user, datum/tgui/ui) . = ..() diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 85d9e7fca1b..0bbfa1f80b9 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -81,7 +81,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) return user.put_in_hands(defib.paddles) -/obj/machinery/defibrillator_mount/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/machinery/defibrillator_mount/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/defibrillator)) if(defib) to_chat(user, span_warning("There's already a defibrillator in [src]!")) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index b16cfc13c5d..34d40fbe189 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -26,7 +26,7 @@ return -/obj/structure/barricade/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/structure/barricade/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_WELDER && !user.combat_mode && bar_material == METAL) if(atom_integrity < max_integrity) if(!I.tool_start_check(user, amount=1)) diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm index b933d459195..1645c178fbd 100644 --- a/code/game/machinery/dish_drive.dm +++ b/code/game/machinery/dish_drive.dm @@ -85,7 +85,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/dish_drive/attackby(obj/item/dish, mob/living/user, list/modifiers) +/obj/machinery/dish_drive/attackby(obj/item/dish, mob/living/user, list/modifiers, list/attack_modifiers) if(is_type_in_list(dish, collectable_items) && !user.combat_mode) if(!user.transferItemToLoc(dish, src)) return diff --git a/code/game/machinery/dna_infuser/dna_infuser.dm b/code/game/machinery/dna_infuser/dna_infuser.dm index 2070e1cb7a4..1e64561c9be 100644 --- a/code/game/machinery/dna_infuser/dna_infuser.dm +++ b/code/game/machinery/dna_infuser/dna_infuser.dm @@ -161,7 +161,7 @@ //we set drop to false to manually call it with an allowlist dump_inventory_contents(list(occupant)) -/obj/machinery/dna_infuser/attackby(obj/item/used, mob/user, list/modifiers) +/obj/machinery/dna_infuser/attackby(obj/item/used, mob/user, list/modifiers, list/attack_modifiers) if(infusing) return if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, used))//sent icon_state is irrelevant... diff --git a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm index 58b629b684c..97e312a158c 100644 --- a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm @@ -128,7 +128,7 @@ . = ..() . += "You can use your tendril hammer arm to deliver a devastating blow against mining fauna, but only once every two seconds." -/obj/item/goliath_infuser_hammer/attack(mob/living/target, mob/living/carbon/human/user, list/modifiers) +/obj/item/goliath_infuser_hammer/attack(mob/living/target, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) . = ..() //If we're on cooldown, we'll do a normal attack. diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 73426e3bdfb..4c8a86b51cc 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -126,7 +126,7 @@ return open_machine() -/obj/machinery/dna_scannernew/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/dna_scannernew/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, item))//sent icon_state is irrelevant... update_appearance()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index cecd76e088c..f5e1be3c53e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1041,7 +1041,7 @@ update_appearance() return TRUE -/obj/machinery/door/airlock/attackby(obj/item/C, mob/user, list/modifiers) +/obj/machinery/door/airlock/attackby(obj/item/C, mob/user, list/modifiers, list/attack_modifiers) if(!HAS_SILICON_ACCESS(user)) if(isElectrified() && (C.obj_flags & CONDUCTS_ELECTRICITY) && shock(user, 75)) return diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 88e37b9d777..517fe1a65ae 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -367,7 +367,7 @@ try_to_crowbar(tool, user, forced_open) return ITEM_INTERACT_SUCCESS -/obj/machinery/door/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/machinery/door/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/access_key)) var/obj/item/access_key/key = weapon return key.attempt_open_door(user, src) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index ae81a56e463..9d6546b5644 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -306,7 +306,7 @@ /obj/machinery/firealarm/attack_robot_secondary(mob/user) return attack_hand_secondary(user) -/obj/machinery/firealarm/attackby(obj/item/tool, mob/living/user, list/modifiers) +/obj/machinery/firealarm/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(tool.tool_behaviour == TOOL_SCREWDRIVER && buildstage == FIRE_ALARM_BUILD_SECURED) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 3cdeb3f94ad..1d98eb41bcd 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -62,7 +62,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) return ..() //Don't want to render prison breaks impossible -/obj/machinery/flasher/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/flasher/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if (attacking_item.tool_behaviour == TOOL_WIRECUTTER) if (bulb) @@ -185,7 +185,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) if(vname == NAMEOF(src, flash_range)) proximity_monitor?.set_range(flash_range) -/obj/machinery/flasher/portable/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/flasher/portable/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if (attacking_item.tool_behaviour == TOOL_WRENCH) attacking_item.play_tool_sound(src, 100) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index aecc6d8fd1e..c070e4920c9 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -258,7 +258,7 @@ Possible to do for anyone motivated enough: if(record_mode) record_stop() -/obj/machinery/holopad/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/holopad/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", item)) return diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm index 617006b8f47..80f0fb2778d 100644 --- a/code/game/machinery/hypnochair.dm +++ b/code/game/machinery/hypnochair.dm @@ -27,7 +27,7 @@ open_machine() update_appearance() -/obj/machinery/hypnochair/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/hypnochair/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, item)) update_appearance() return diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index beb1b966a6e..c891e15cd91 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -179,7 +179,7 @@ user.visible_message(span_warning("[user] attaches [src] to [target]."), span_notice("You attach [src] to [target].")) attach_iv(target, user) -/obj/machinery/iv_drip/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/iv_drip/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(use_internal_storage) return ..() diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 1a48dbff661..e3cef8bcc4e 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -75,7 +75,7 @@ balloon_alert(user, "saved to buffer") return ITEM_INTERACT_SUCCESS -/obj/machinery/launchpad/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/launchpad/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(!stationary) return ..() @@ -312,7 +312,7 @@ closed = TRUE update_indicator() -/obj/machinery/launchpad/briefcase/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/launchpad/briefcase/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/launchpad_remote)) var/obj/item/launchpad_remote/launch = item if(launch.pad == WEAKREF(src)) //do not attempt to link when already linked diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 57727a43068..43dfb9ee79c 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -54,7 +54,7 @@ O.throw_at(target, drive_range * power, power) flick("mass_driver1", src) -/obj/machinery/mass_driver/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/machinery/mass_driver/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(is_wire_tool(item) && panel_open) wires.interact(user) diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index 83e90bc98c5..a7603303f8d 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -117,7 +117,7 @@ active_price = board.custom_cost return -/obj/machinery/medical_kiosk/attackby(obj/item/O, mob/user, list/modifiers) +/obj/machinery/medical_kiosk/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "[base_icon_state]_open", "[base_icon_state]_off", O)) return else if(default_deconstruction_crowbar(O)) diff --git a/code/game/machinery/modular_shield.dm b/code/game/machinery/modular_shield.dm index c79e32086ec..c11bebc5fe9 100644 --- a/code/game/machinery/modular_shield.dm +++ b/code/game/machinery/modular_shield.dm @@ -143,7 +143,7 @@ if(default_deconstruction_crowbar(tool)) return TRUE -/obj/machinery/modular_shield_generator/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/modular_shield_generator/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(is_wire_tool(W) && panel_open) wires.interact(user) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index d36df5e9290..a3f1859fe26 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -115,7 +115,7 @@ return TRUE return default_deconstruction_screwdriver(user, "navbeacon1","navbeacon0",tool) -/obj/machinery/navbeacon/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/navbeacon/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) var/turf/our_turf = loc if(our_turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) return // prevent intraction when T-scanner revealed diff --git a/code/game/machinery/nebula_shielding.dm b/code/game/machinery/nebula_shielding.dm index d1f7104479e..8cf41265df4 100644 --- a/code/game/machinery/nebula_shielding.dm +++ b/code/game/machinery/nebula_shielding.dm @@ -109,7 +109,7 @@ if(isopenturf(turf)) turf.atmos_spawn_air("[GAS_TRITIUM]=1;[TURF_TEMPERATURE(T20C)]") -/obj/machinery/nebula_shielding/radiation/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/nebula_shielding/radiation/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, initial(icon_state) + "_open", initial(icon_state), item)) return diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index 6e52741dc21..402ae4768bc 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -486,7 +486,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) . = ..() update_appearance() -/obj/machinery/newscaster/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/machinery/newscaster/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/paper)) if(!user.temporarilyRemoveItemFromInventory(attacking_item)) return diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 46e73e6fe79..7c8e0b642b4 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -151,7 +151,7 @@ ui = new(user, src, "PipeDispenser", name) ui.open() -/obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter)) to_chat(usr, span_notice("You put [W] back into [src].")) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 41d1ce5a5a3..d5fe7413b78 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -324,7 +324,7 @@ DEFINE_BITFIELD(turret_flags, list( balloon_alert(user, "saved to multitool buffer") return ITEM_INTERACT_SUCCESS -/obj/machinery/porta_turret/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/porta_turret/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(machine_stat & BROKEN) if(I.tool_behaviour == TOOL_CROWBAR) //If the turret is destroyed, you can remove it with a crowbar to @@ -996,7 +996,7 @@ DEFINE_BITFIELD(turret_flags, list( to_chat(user, span_notice("You link \the [multi_tool.buffer] with \the [src].")) return ITEM_INTERACT_SUCCESS -/obj/machinery/turretid/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/turretid/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(machine_stat & BROKEN) return diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index 959752ef263..93b0ada37fa 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -40,7 +40,7 @@ if(PTURRET_START_EXTERNAL_ARMOUR) . += span_notice("The turret's armor needs to be welded in place, the armor looks like it could be pried off.") -/obj/machinery/porta_turret_construct/attackby(obj/item/used, mob/user, list/modifiers) +/obj/machinery/porta_turret_construct/attackby(obj/item/used, mob/user, list/modifiers, list/attack_modifiers) //this is a bit unwieldy but self-explanatory switch(build_step) if(PTURRET_UNSECURED) //first step diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index dd950a00a4a..9ce769c1ddc 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -45,7 +45,7 @@ balloon_alert(user, "saved to multitool buffer") return ITEM_INTERACT_SUCCESS -/obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_WRENCH && !parent_turret.on) if(parent_turret.raised) return @@ -72,8 +72,8 @@ return ..() -/obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user) - parent_turret.attacked_by(I, user) +/obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) + return parent_turret.attacked_by(I, user, modifiers) /obj/machinery/porta_turret_cover/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) parent_turret.attack_alien(user, modifiers) diff --git a/code/game/machinery/prisonlabor.dm b/code/game/machinery/prisonlabor.dm index e226adcbbc5..24373326b0e 100644 --- a/code/game/machinery/prisonlabor.dm +++ b/code/game/machinery/prisonlabor.dm @@ -26,7 +26,7 @@ QDEL_NULL(current_plate) . = ..() -/obj/machinery/plate_press/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/machinery/plate_press/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(!is_operational) to_chat(user, span_warning("[src] has to be on to do this!")) return FALSE diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 48be6b53b5b..397b62e35da 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -71,7 +71,7 @@ balloon_alert(user, "no quantum pad data found!") return NONE -/obj/machinery/quantumpad/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/quantumpad/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "qpad-idle-open", "qpad-idle", weapon)) return @@ -248,5 +248,3 @@ failed.set_output(COMPONENT_SIGNAL) return attached_pad.doteleport(target_pad = attached_pad.linked_pad) - - diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 6f9a60b9d7e..0804fa9a5ff 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -85,7 +85,7 @@ update_appearance() return ..() -/obj/machinery/recharger/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/recharger/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(!is_type_in_typecache(attacking_item, allowed_devices)) return ..() diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index f1690718a81..5cf4dc31525 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -109,7 +109,7 @@ if (!(. & EMP_PROTECT_SELF)) open_machine() -/obj/machinery/recharge_station/attackby(obj/item/P, mob/user, list/modifiers) +/obj/machinery/recharge_station/attackby(obj/item/P, mob/user, list/modifiers, list/attack_modifiers) if(state_open) if(default_deconstruction_screwdriver(user, "borgdecon2", "borgcharger0", P)) return diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index b49131ae341..b2436cd54dc 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -384,7 +384,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) to_chat(user, span_warning("You must open the maintenance panel first!")) return TRUE -/obj/machinery/requests_console/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/requests_console/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) var/obj/item/card/id/ID = attacking_item.GetID() if(ID) message_verified_by = "[ID.registered_name] ([ID.assignment])" diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index 482623e3347..2cc2225c6c1 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -116,7 +116,7 @@ update_appearance() // Not applicable to all objects. ///Handles setting ownership and the betting itself. -/obj/machinery/roulette/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/roulette/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(machine_stat & MAINT && is_wire_tool(W)) wires.interact(user) return diff --git a/code/game/machinery/scanner_gate.dm b/code/game/machinery/scanner_gate.dm index 6131739571c..b5fd3e9eaee 100644 --- a/code/game/machinery/scanner_gate.dm +++ b/code/game/machinery/scanner_gate.dm @@ -151,7 +151,7 @@ return set_scanline("passive") -/obj/machinery/scanner_gate/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/scanner_gate/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) var/obj/item/card/id/card = attacking_item.GetID() if(card) if(locked) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 238205bf535..24057c27a34 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -236,7 +236,7 @@ set_anchored(FALSE) -/obj/machinery/shieldgen/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/shieldgen/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/stack/cable_coil) && (machine_stat & BROKEN) && panel_open) var/obj/item/stack/cable_coil/coil = W if (coil.get_amount() < 1) @@ -460,7 +460,7 @@ return return default_deconstruction_crowbar(tool) -/obj/machinery/power/shieldwallgen/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/power/shieldwallgen/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(W.GetID()) if(allowed(user) && !(obj_flags & EMAGGED)) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index a99d4cfaba4..7ed0bb3b5d6 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -202,7 +202,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/space_heater/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/space_heater/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) @@ -402,7 +402,7 @@ . = TRUE ///Slightly modified to ignore the open_hatch - it's always open, we hacked it. -/obj/machinery/space_heater/improvised_chem_heater/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/space_heater/improvised_chem_heater/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(default_deconstruction_crowbar(item)) return diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index d3e2c90618b..342a0d5120e 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -639,7 +639,7 @@ return TRUE -/obj/machinery/suit_storage_unit/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/suit_storage_unit/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) . = TRUE var/obj/item/card/id/id = null if(istype(weapon, /obj/item/stock_parts/card_reader) && can_install_card_reader(user)) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index f921509f968..ed27105b11a 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -189,7 +189,7 @@ return TRUE -/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(is_wire_tool(I) && open_panel) wires.interact(user) @@ -533,7 +533,7 @@ playsound(loc, 'sound/effects/bamf.ogg', 75, TRUE, 5) -/obj/item/bombcore/chemical/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/bombcore/chemical/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_CROWBAR && beakers.len > 0) I.play_tool_sound(src) for (var/obj/item/B in beakers) diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 4045c742332..f61349208a3 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -15,7 +15,7 @@ FREQ_CTF_BLUE, ) -/obj/machinery/telecomms/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/telecomms/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) var/icon_closed = initial(icon_state) var/icon_open = "[initial(icon_state)]_o" diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index ab849dd6923..bd30c5ba0b5 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -45,6 +45,6 @@ sleep(signal.data["slow"]) // simulate the network lag if necessary signal.broadcast() -/obj/machinery/telecomms/allinone/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/telecomms/allinone/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(attacking_item.tool_behaviour == TOOL_MULTITOOL) return attack_hand(user) diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index fd991540ef3..5a8b137c701 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -34,7 +34,7 @@ to_chat(user, span_warning("It seems that the blackbox is missing...")) return -/obj/machinery/blackbox_recorder/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/machinery/blackbox_recorder/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/blackbox)) if(HAS_TRAIT(attacking_item, TRAIT_NODROP) || !user.transferItemToLoc(attacking_item, src)) to_chat(user, span_warning("[attacking_item] is stuck to your hand!")) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index d55e3922417..06a4220f004 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -52,7 +52,7 @@ if(is_ready()) teleport(AM) -/obj/machinery/teleport/hub/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/teleport/hub/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "tele-o", "tele0", W)) if(power_station?.engaged) power_station.engaged = 0 //hub with panel open is off, so the station must be informed. @@ -179,7 +179,7 @@ balloon_alert(user, "data uploaded from buffer") return ITEM_INTERACT_SUCCESS -/obj/machinery/teleport/station/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/teleport/station/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "controller-o", "controller", W)) update_appearance() return diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 1fdeb997e1d..c267c0092d7 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -81,7 +81,7 @@ if(mergeable_decal) return TRUE -/obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, list/modifiers) +/obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if((istype(W, /obj/item/reagent_containers/cup) && !istype(W, /obj/item/rag)) || istype(W, /obj/item/reagent_containers/cup/glass)) if(src.reagents && W.reagents) . = 1 //so the containers don't splash their content on the src while scooping. diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 4921c4fa4ed..cb99987ba77 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -537,7 +537,7 @@ ignite() log_combat(hit_proj.firer, src, "used [hit_proj] to ignite") -/obj/effect/decal/cleanable/fuel_pool/attackby(obj/item/item, mob/user, list/modifiers) +/obj/effect/decal/cleanable/fuel_pool/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(item.ignition_effect(src, user)) ignite() log_combat(user, src, "used [item] to ignite") diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm index 55d29fdc651..c377b4bc9ce 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm @@ -346,7 +346,7 @@ to_chat(user, span_warning("You hit [src] but bounce off it!")) playsound(src.loc, 'sound/items/weapons/tap.ogg', 100, TRUE) -/obj/structure/foamedmetal/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/foamedmetal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) ///A speed modifier for how fast the wall is build var/platingmodifier = 1 if(HAS_TRAIT(user, TRAIT_QUICK_BUILD)) diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index a6179f240be..c37f0d16338 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -9,8 +9,8 @@ blocks_emissive = EMISSIVE_BLOCK_GENERIC uses_integrity = FALSE -/obj/effect/attackby(obj/item/weapon, mob/user, list/modifiers) - if(SEND_SIGNAL(weapon, COMSIG_ITEM_ATTACK_EFFECT, src, user, modifiers) & COMPONENT_NO_AFTERATTACK) +/obj/effect/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) + if(SEND_SIGNAL(weapon, COMSIG_ITEM_ATTACK_EFFECT, src, user, modifiers, attack_modifiers) & COMPONENT_NO_AFTERATTACK) return TRUE // I'm not sure why these are snowflaked to early return but they are diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index d4c27f09be2..8acf36f6e6f 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -69,7 +69,7 @@ /obj/effect/portal/newtonian_move(inertia_angle, instant = FALSE, start_delay = 0, drift_force = 0, controlled_cap = null) return TRUE -/obj/effect/portal/attackby(obj/item/W, mob/user, list/modifiers) +/obj/effect/portal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(user && Adjacent(user)) teleport(user) return TRUE diff --git a/code/game/objects/effects/poster_demotivational.dm b/code/game/objects/effects/poster_demotivational.dm index 956e954437a..ef946372dfd 100644 --- a/code/game/objects/effects/poster_demotivational.dm +++ b/code/game/objects/effects/poster_demotivational.dm @@ -23,7 +23,7 @@ demoraliser = new(src, 7, TRUE, mood_category) return ..() -/obj/structure/sign/poster/traitor/attackby(obj/item/tool, mob/user, list/modifiers) +/obj/structure/sign/poster/traitor/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) if (tool.tool_behaviour == TOOL_WIRECUTTER) QDEL_NULL(demoraliser) return ..() diff --git a/code/game/objects/effects/poster_motivational.dm b/code/game/objects/effects/poster_motivational.dm index 0b84d77b234..377fa271211 100644 --- a/code/game/objects/effects/poster_motivational.dm +++ b/code/game/objects/effects/poster_motivational.dm @@ -17,7 +17,7 @@ department_grab.quirk_poster_department = quirk_poster_department /// You can use any spraypaint can on a quirk poster to turn it into a contraband poster from the traitor objective -/obj/item/poster/quirk/attackby(obj/item/postertool, mob/user, list/modifiers) +/obj/item/poster/quirk/attackby(obj/item/postertool, mob/user, list/modifiers, list/attack_modifiers) if(!is_special_character(user) || !HAS_TRAIT(user, TRAIT_POSTERBOY) || !istype(postertool, /obj/item/toy/crayon)) return ..() balloon_alert(user, "converting poster...") @@ -50,7 +50,7 @@ mood_buff = new(_host = src, range = 7, _ignore_if_not_on_turf = TRUE, department = quirk_poster_department) return ..() -/obj/structure/sign/poster/quirk/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/sign/poster/quirk/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if (I.tool_behaviour == TOOL_WIRECUTTER) QDEL_NULL(mood_buff) return ..() diff --git a/code/game/objects/effects/posters/poster.dm b/code/game/objects/effects/posters/poster.dm index 3664fa69c4c..e0edb768e88 100644 --- a/code/game/objects/effects/posters/poster.dm +++ b/code/game/objects/effects/posters/poster.dm @@ -53,7 +53,7 @@ name = "[name] - [poster_structure.original_name]" -/obj/item/poster/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/poster/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!istype(I, /obj/item/shard)) return ..() @@ -172,7 +172,7 @@ desc = holi_data.poster_desc icon_state = holi_data.poster_icon -/obj/structure/sign/poster/attackby(obj/item/tool, mob/user, list/modifiers) +/obj/structure/sign/poster/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) if(tool.tool_behaviour == TOOL_WIRECUTTER) tool.play_tool_sound(src, 100) if(ruined) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 0700a2abac8..3dec4218ca2 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -590,7 +590,7 @@ playsound(loc, 'sound/items/weapons/egloves.ogg', vol = 80, vary = TRUE) end() -/obj/effect/constructing_effect/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/effect/constructing_effect/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) attacked(user) /obj/effect/constructing_effect/attack_hand(mob/living/user, list/modifiers) diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 88fe3cc556b..04bce0b64a7 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -134,7 +134,7 @@ . += span_notice("Its ink levels look [ink_level].") -/obj/item/airlock_painter/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/airlock_painter/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/toner)) if(ink) to_chat(user, span_warning("[src] already contains \a [ink]!")) diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index f5b60dc33ff..dbb767e280b 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -79,7 +79,7 @@ pushed_over = FALSE tacticool = AddComponent(/datum/component/tactical) -/obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/toy/crayon)) change_appearance(I, user) return TRUE diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index d98d9229a24..0215cf85f2e 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -87,7 +87,7 @@ myhead.dismember() return BRUTELOSS -/obj/item/chainsaw/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/chainsaw/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) if (target_mob.stat != DEAD) return ..() diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm index 4bdb1a000b4..ca409877246 100644 --- a/code/game/objects/items/cigarettes.dm +++ b/code/game/objects/items/cigarettes.dm @@ -335,7 +335,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM user.visible_message(span_suicide("[user] is huffing [src] as quickly as [user.p_they()] can! It looks like [user.p_theyre()] trying to give [user.p_them()]self cancer.")) return (TOXLOSS|OXYLOSS) -/obj/item/cigarette/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/cigarette/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(lit) return ..() @@ -896,7 +896,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM STOP_PROCESSING(SSobj, src) QDEL_NULL(cig_smoke) -/obj/item/cigarette/pipe/attackby(obj/item/thing, mob/user, list/modifiers) +/obj/item/cigarette/pipe/attackby(obj/item/thing, mob/user, list/modifiers, list/attack_modifiers) if(!istype(thing, /obj/item/food/grown)) return ..() diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index f3085da2f4c..5b3bca0ecd5 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -208,7 +208,7 @@ skinhead.set_hairstyle("Skinhead", update = TRUE) playsound(loc, 'sound/items/tools/welder2.ogg', 20, TRUE) -/obj/item/razor/attack(mob/target_mob, mob/living/user, list/modifiers) +/obj/item/razor/attack(mob/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) if(!ishuman(target_mob)) return ..() var/mob/living/carbon/human/human_target = target_mob diff --git a/code/game/objects/items/courtroom.dm b/code/game/objects/items/courtroom.dm index facca62d760..d605a3b05f1 100644 --- a/code/game/objects/items/courtroom.dm +++ b/code/game/objects/items/courtroom.dm @@ -34,7 +34,7 @@ w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE -/obj/item/gavelblock/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/gavelblock/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/gavelhammer)) playsound(loc, 'sound/items/gavel.ogg', 100, TRUE) user.visible_message(span_warning("[user] strikes [src] with [I].")) diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index 51e64adb3a1..59973a8617a 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -64,7 +64,7 @@ return FALSE return TRUE -/obj/structure/checkoutmachine/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/checkoutmachine/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(!canwalk) balloon_alert(user, "not ready to accept transactions!") return diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm index 7f80341db38..2fc6fc9c9da 100644 --- a/code/game/objects/items/credit_holochip.dm +++ b/code/game/objects/items/credit_holochip.dm @@ -95,7 +95,7 @@ else return 0 -/obj/item/holochip/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/holochip/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) ..() if(istype(I, /obj/item/holochip)) var/obj/item/holochip/H = I diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 59acf80e7b4..2f9c82cea1e 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -437,7 +437,7 @@ forceMove(defib) defib.update_power() -/obj/item/shockpaddles/attack(mob/M, mob/living/user, list/modifiers) +/obj/item/shockpaddles/attack(mob/M, mob/living/user, list/modifiers, list/attack_modifiers) if(busy) return defib?.update_power() diff --git a/code/game/objects/items/devices/aicard_evil.dm b/code/game/objects/items/devices/aicard_evil.dm index c987b254a48..f4c89c31444 100644 --- a/code/game/objects/items/devices/aicard_evil.dm +++ b/code/game/objects/items/devices/aicard_evil.dm @@ -95,7 +95,7 @@ max_capacity = 1000 w_class = WEIGHT_CLASS_NORMAL -/obj/item/computer_disk/syndie_ai_upgrade/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/computer_disk/syndie_ai_upgrade/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) var/mob/living/silicon/ai/AI if(isAI(target)) AI = target diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 073430cb7ae..3fe51527e3a 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -91,7 +91,7 @@ crystal_lens = null return ITEM_INTERACT_SUCCESS -/obj/item/laser_pointer/attackby(obj/item/attack_item, mob/user, list/modifiers) +/obj/item/laser_pointer/attackby(obj/item/attack_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attack_item, /obj/item/stock_parts/micro_laser)) if(diode) balloon_alert(user, "already has a diode!") diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index c9f1cf72f73..dceece6fac9 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -76,7 +76,7 @@ //replace lights & stuff return do_action(interacting_with, user) ? ITEM_INTERACT_SUCCESS : NONE -/obj/item/lightreplacer/attackby(obj/item/insert, mob/user, list/modifiers) +/obj/item/lightreplacer/attackby(obj/item/insert, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(uses >= max_uses) user.balloon_alert(user, "already full!") diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index fd1b8865a9c..3867ace4fc1 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -37,7 +37,7 @@ return return ..() -/obj/item/electropack/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/electropack/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/clothing/head/helmet)) var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit(user) A.icon = 'icons/obj/devices/assemblies.dmi' diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 9da5dc843ac..cb6ca697bbd 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -474,7 +474,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( tool.play_tool_sound(src, 10) return TRUE -/obj/item/radio/headset/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/radio/headset/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/encryptionkey)) if(keyslot && keyslot2) to_chat(user, span_warning("The headset can't hold another key!")) diff --git a/code/game/objects/items/devices/swapper.dm b/code/game/objects/items/devices/swapper.dm index ff5de1d9681..5927ca07151 100644 --- a/code/game/objects/items/devices/swapper.dm +++ b/code/game/objects/items/devices/swapper.dm @@ -27,7 +27,7 @@ icon_state = "swapper[linked_swapper ? "-linked" : null]" return ..() -/obj/item/swapper/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/swapper/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/swapper)) var/obj/item/swapper/other_swapper = I if(other_swapper.linked_swapper) diff --git a/code/game/objects/items/devices/table_clock.dm b/code/game/objects/items/devices/table_clock.dm index b5868dbfb4e..4f1c539f573 100644 --- a/code/game/objects/items/devices/table_clock.dm +++ b/code/game/objects/items/devices/table_clock.dm @@ -33,7 +33,7 @@ . += span_info("The current CST (local) time is: [station_time_timestamp()].") . += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss", NO_TIMEZONE)].") -/obj/item/table_clock/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/table_clock/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(attacking_item.force < 5 || broken) return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index f2ecc7106ce..a34d5a4e3c8 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -84,7 +84,7 @@ else soundloop.start() -/obj/item/taperecorder/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/taperecorder/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!mytape && istype(I, /obj/item/tape)) if(!user.transferItemToLoc(I,src)) return diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 213a3cca4fd..1135708959e 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -441,7 +441,7 @@ effective or pretty fucking useless. return TRUE -/obj/machinery/porta_turret/syndicate/toolbox/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/machinery/porta_turret/syndicate/toolbox/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(!istype(attacking_item, /obj/item/wrench/combat)) return ..() diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 06f682da94e..1b0ffaab204 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -208,7 +208,7 @@ /obj/item/dualsaber/purple possible_colors = list("purple") -/obj/item/dualsaber/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/dualsaber/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(W.tool_behaviour == TOOL_MULTITOOL) if(!hacked) hacked = TRUE diff --git a/code/game/objects/items/dyespray.dm b/code/game/objects/items/dyespray.dm index d22b28ed8e6..86caea178e7 100644 --- a/code/game/objects/items/dyespray.dm +++ b/code/game/objects/items/dyespray.dm @@ -10,7 +10,7 @@ /obj/item/dyespray/attack_self(mob/user) dye(user, user) -/obj/item/dyespray/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/dyespray/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) dye(target, user) return ..() diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index dd1f9b2e3fd..dd067988673 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -187,7 +187,7 @@ else return ..() -/obj/item/extinguisher/attack_atom(obj/O, mob/living/user, list/modifiers) +/obj/item/extinguisher/attack_atom(obj/O, mob/living/user, list/modifiers, list/attack_modifiers) if(AttemptRefill(O, user)) refilling = TRUE return FALSE @@ -322,7 +322,7 @@ user.visible_message(span_notice("[user] empties out \the [src] onto the floor using the release valve."), span_info("You quietly empty out \the [src] using its release valve.")) //firebot assembly -/obj/item/extinguisher/attackby(obj/O, mob/user, list/modifiers) +/obj/item/extinguisher/attackby(obj/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, /obj/item/bodypart/arm/left/robot) || istype(O, /obj/item/bodypart/arm/right/robot)) to_chat(user, span_notice("You add [O] to [src].")) qdel(O) diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index f820b33d8f2..d09bb1f162e 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -64,7 +64,7 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe) user.visible_message(span_suicide("[user] axes [user.p_them()]self from head to toe! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS -/obj/item/fireaxe/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/fireaxe/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(!HAS_TRAIT(src, TRAIT_WIELDED)) //destroys windows and grilles in one hit return if(target.resistance_flags & INDESTRUCTIBLE) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index a7166ef4545..659bdc11667 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -119,7 +119,7 @@ update_appearance() return TRUE -/obj/item/flamethrower/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/flamethrower/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(isigniter(W)) var/obj/item/assembly/igniter/I = W if(I.secured) diff --git a/code/game/objects/items/food/egg.dm b/code/game/objects/items/food/egg.dm index 4b971ce167f..d154ce1ea51 100644 --- a/code/game/objects/items/food/egg.dm +++ b/code/game/objects/items/food/egg.dm @@ -88,7 +88,7 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) new /mob/living/basic/chick(spawn_turf) GLOB.chicks_from_eggs++ -/obj/item/food/egg/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/food/egg/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/toy/crayon)) var/obj/item/toy/crayon/crayon = item var/clr = crayon.crayon_color @@ -282,7 +282,7 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0) . = ..() AddElement(/datum/element/love_food_buff, /datum/status_effect/food/speech/french) -/obj/item/food/omelette/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/food/omelette/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/kitchen/fork)) var/obj/item/kitchen/fork/fork = item if(fork.forkload) diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 751ad21bfa9..c2d7b4c6da8 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -373,7 +373,7 @@ if (can_stick) . += span_notice("If you had a rod you could make butter on a stick.") -/obj/item/food/butter/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/food/butter/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(!istype(item, /obj/item/stack/rods) || !can_stick) return ..() var/obj/item/stack/rods/rods = item diff --git a/code/game/objects/items/food/pancakes.dm b/code/game/objects/items/food/pancakes.dm index cbe782e2863..51e2b2c1b43 100644 --- a/code/game/objects/items/food/pancakes.dm +++ b/code/game/objects/items/food/pancakes.dm @@ -30,7 +30,7 @@ positive_result = TRUE,\ use_large_steam_sprite = TRUE) -/obj/item/food/pancakes/raw/attackby(obj/item/garnish, mob/living/user, list/modifiers) +/obj/item/food/pancakes/raw/attackby(obj/item/garnish, mob/living/user, list/modifiers, list/attack_modifiers) var/newresult if(istype(garnish, /obj/item/food/grown/berries)) newresult = /obj/item/food/pancakes/blueberry @@ -117,7 +117,7 @@ ingredients_listed += "[ING.name], " . += "It contains [contents.len?"[ingredients_listed]":"no ingredient, "]on top of a [initial(name)]." -/obj/item/food/pancakes/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/item/food/pancakes/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/food/pancakes)) var/obj/item/food/pancakes/pancake = item if((contents.len >= PANCAKE_MAX_STACK) || ((pancake.contents.len + contents.len) > PANCAKE_MAX_STACK)) diff --git a/code/game/objects/items/grenades/festive.dm b/code/game/objects/items/grenades/festive.dm index d7b295e4d08..faa8d8da5bf 100644 --- a/code/game/objects/items/grenades/festive.dm +++ b/code/game/objects/items/grenades/festive.dm @@ -14,7 +14,7 @@ /obj/item/sparkler/fire_act(exposed_temperature, exposed_volume) light() -/obj/item/sparkler/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/sparkler/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) var/ignition_msg = item.ignition_effect(src, user) if(ignition_msg) light(user, ignition_msg) @@ -75,7 +75,7 @@ /obj/item/grenade/firecracker/attack_self(mob/user) // You need to light it manually. return -/obj/item/grenade/firecracker/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/grenade/firecracker/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) var/ignition_msg = item.ignition_effect(src, user) if(ignition_msg && !active) visible_message(ignition_msg) @@ -117,5 +117,3 @@ update_mob() explosion(src, devastation_range = -1, heavy_impact_range = -1, light_impact_range = 2) qdel(src) - - diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm index 26f8ecdfab8..b10c6e6e976 100644 --- a/code/game/objects/items/grenades/ghettobomb.dm +++ b/code/game/objects/items/grenades/ghettobomb.dm @@ -217,7 +217,7 @@ else . += span_notice("The wires are just dangling from it, you need some sort of activating assembly.") -/obj/item/sliced_pipe/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/sliced_pipe/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(!wires_are_in) // here we can stuff in additional objects for a cooler effect if(is_type_in_typecache(item, allowed) && contents.len < MAX_STUFFINGS) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 879e2f3353f..0787f538e6b 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -58,7 +58,7 @@ to_chat(user, span_notice("The wire panel can be accessed without a screwdriver.")) return TRUE -/obj/item/grenade/c4/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/grenade/c4/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(is_wire_tool(item)) wires.interact(user) else diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index 47e3fd1a0ee..0e9ea7a28c5 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -282,14 +282,14 @@ playsound(slapped, 'sound/items/weapons/slap.ogg', slap_volume, TRUE, -1) return -/obj/item/hand_item/slapper/pre_attack_secondary(atom/target, mob/living/user, list/modifiers) +/obj/item/hand_item/slapper/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) if(!loc.Adjacent(target) || !istype(target, /obj/structure/table)) return ..() slam_table(target, user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/item/hand_item/slapper/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/hand_item/slapper/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) if(!loc.Adjacent(target) || !istype(target, /obj/structure/table)) return ..() @@ -352,7 +352,7 @@ desc = "Sometimes, you just want to act gentlemanly." inhand_icon_state = "nothing" -/obj/item/hand_item/hand/pre_attack(mob/living/carbon/help_target, mob/living/carbon/helper, list/modifiers) +/obj/item/hand_item/hand/pre_attack(mob/living/carbon/help_target, mob/living/carbon/helper, list/modifiers, list/attack_modifiers) if(!loc.Adjacent(help_target) || !istype(helper) || !istype(help_target)) return ..() @@ -361,7 +361,7 @@ return TRUE -/obj/item/hand_item/hand/pre_attack_secondary(mob/living/carbon/help_target, mob/living/carbon/helper, list/modifiers) +/obj/item/hand_item/hand/pre_attack_secondary(mob/living/carbon/help_target, mob/living/carbon/helper, list/modifiers, list/attack_modifiers) if(!loc.Adjacent(help_target) || !istype(helper) || !istype(help_target)) return ..() @@ -372,7 +372,7 @@ return SECONDARY_ATTACK_CALL_NORMAL -/obj/item/hand_item/hand/attack(mob/living/carbon/target_mob, mob/living/carbon/user, list/modifiers) +/obj/item/hand_item/hand/attack(mob/living/carbon/target_mob, mob/living/carbon/user, list/modifiers, list/attack_modifiers) if(!loc.Adjacent(target_mob) || !istype(user) || !istype(target_mob)) return TRUE @@ -454,7 +454,7 @@ attack_verb_continuous = list("steals") attack_verb_simple = list("steal") -/obj/item/hand_item/stealer/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/hand_item/stealer/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if (!ishuman(target_mob)) return diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index 36d11973608..b39603e4c51 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -98,7 +98,7 @@ if(active) to_chat(user, span_userdanger("You have a really bad feeling about [src]!")) -/obj/item/hot_potato/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/hot_potato/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return . diff --git a/code/game/objects/items/implants/implantcase.dm b/code/game/objects/items/implants/implantcase.dm index e081248f8ad..87fca49be89 100644 --- a/code/game/objects/items/implants/implantcase.dm +++ b/code/game/objects/items/implants/implantcase.dm @@ -35,7 +35,7 @@ icon_state = "implantcase-[imp ? imp.implant_color : 0]" return ..() -/obj/item/implantcase/attackby(obj/item/used_item, mob/living/user, list/modifiers) +/obj/item/implantcase/attackby(obj/item/used_item, mob/living/user, list/modifiers, list/attack_modifiers) if(IS_WRITING_UTENSIL(used_item)) if(!user.can_write(used_item)) return diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm index 60b23563be9..522cf0e3a93 100644 --- a/code/game/objects/items/implants/implanter.dm +++ b/code/game/objects/items/implants/implanter.dm @@ -44,7 +44,7 @@ else to_chat(user, span_warning("[src] fails to implant [target].")) -/obj/item/implanter/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/item/implanter/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(IS_WRITING_UTENSIL(I)) return ..() if(!user.can_write(I)) diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm index 908127367a3..18594c116d5 100644 --- a/code/game/objects/items/implants/implantpad.dm +++ b/code/game/objects/items/implants/implantpad.dm @@ -37,7 +37,7 @@ inserted_case = null update_appearance(UPDATE_ICON) -/obj/item/implantpad/attackby(obj/item/implantcase/attacking_item, mob/user, list/modifiers) +/obj/item/implantpad/attackby(obj/item/implantcase/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(inserted_case || !istype(attacking_item)) return ..() if(!user.transferItemToLoc(attacking_item, src)) diff --git a/code/game/objects/items/implants/security/implant_chem.dm b/code/game/objects/items/implants/security/implant_chem.dm index e20da8ab7b9..178dfcae2a6 100644 --- a/code/game/objects/items/implants/security/implant_chem.dm +++ b/code/game/objects/items/implants/security/implant_chem.dm @@ -95,7 +95,7 @@ desc = "A glass case containing a remote chemical implant." imp_type = /obj/item/implant/chem -/obj/item/implantcase/chem/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/implantcase/chem/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/reagent_containers/syringe) && imp) W.interact_with_atom(imp, user, modifiers) return TRUE diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index 5c314197725..d0feef1471e 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -67,7 +67,7 @@ balloon_alert(user, "[cell_cover_open ? "opened" : "closed"] cell cover") return TRUE -/obj/item/inspector/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/inspector/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(cell_cover_open && istype(I, /obj/item/stock_parts/power_store/cell)) if(cell) to_chat(user, span_warning("[src] already has a cell installed.")) @@ -274,7 +274,7 @@ cycle_print_time(user) return TRUE -/obj/item/inspector/clown/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/inspector/clown/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(cell_cover_open && istype(I, /obj/item/kitchen/fork)) cycle_sound(user) return @@ -353,7 +353,7 @@ check_settings_legality() return TRUE -/obj/item/inspector/clown/bananium/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/inspector/clown/bananium/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(cell_cover_open) check_settings_legality() diff --git a/code/game/objects/items/kirby_plants/kirbyplants.dm b/code/game/objects/items/kirby_plants/kirbyplants.dm index fb109eb1aae..90e74d86496 100644 --- a/code/game/objects/items/kirby_plants/kirbyplants.dm +++ b/code/game/objects/items/kirby_plants/kirbyplants.dm @@ -52,7 +52,7 @@ . = ..() icon_state = dead ? "plant-25" : base_icon_state -/obj/item/kirbyplants/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/item/kirbyplants/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(!dead && trimmable && HAS_TRAIT(user,TRAIT_BONSAI) && isturf(loc) && I.get_sharpness()) to_chat(user,span_notice("You start trimming [src].")) diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 8bf9d69f7ec..88e790a4b6b 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -236,7 +236,7 @@ filled_overlay.color = mix_color_from_reagents(reagents.reagent_list) . += filled_overlay -/obj/item/kitchen/spoon/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/kitchen/spoon/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) if(!target_mob.reagents || reagents.total_volume <= 0) return ..() @@ -270,7 +270,7 @@ reagents.trans_to(target_mob, spoon_sip_size, methods = INGEST) return TRUE -/obj/item/kitchen/spoon/pre_attack(atom/attacked_atom, mob/living/user, list/modifiers) +/obj/item/kitchen/spoon/pre_attack(atom/attacked_atom, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return @@ -290,7 +290,7 @@ attacked_atom.balloon_alert(user, "it's full!") return TRUE -/obj/item/kitchen/spoon/pre_attack_secondary(atom/attacked_atom, mob/living/user, list/modifiers) +/obj/item/kitchen/spoon/pre_attack_secondary(atom/attacked_atom, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 45a245c4066..d0747600cd9 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -88,7 +88,7 @@ /// Bleed stacks applied when an organic mob target is hit var/bleed_stacks_per_hit = 3 -/obj/item/knife/bloodletter/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/knife/bloodletter/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(!isliving(target)) return var/mob/living/M = target @@ -335,4 +335,3 @@ inhand_icon_state = "rootshiv" icon_angle = -45 custom_materials = null - diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index 7dd3493e6b3..e08080504dd 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -101,7 +101,7 @@ return ..() -/obj/item/latexballoon/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/latexballoon/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/tank)) var/obj/item/tank/air_tank = item blow(air_tank, user) diff --git a/code/game/objects/items/lighter.dm b/code/game/objects/items/lighter.dm index f98f6880b7b..066d75a1e54 100644 --- a/code/game/objects/items/lighter.dm +++ b/code/game/objects/items/lighter.dm @@ -192,7 +192,7 @@ ) user.add_mood_event("burnt_thumb", /datum/mood_event/burnt_thumb) -/obj/item/lighter/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/lighter/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) if(lit) use(0.5) if(target_mob.ignite_mob()) diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm index 10403973b81..e53c199912b 100644 --- a/code/game/objects/items/mail.dm +++ b/code/game/objects/items/mail.dm @@ -100,7 +100,7 @@ postmark_image.appearance_flags |= RESET_COLOR|KEEP_APART . += postmark_image -/obj/item/mail/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/mail/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) // Destination tagging if(istype(W, /obj/item/dest_tagger)) var/obj/item/dest_tagger/destination_tag = W diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index bd8d8b8f43b..50268c1199d 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -41,12 +41,15 @@ var/on_stun_sound = 'sound/effects/woodhit.ogg' /// The volume of the above. var/on_stun_volume = 75 - /// Do we animate the "hit" when stunning something? - var/stun_animation = TRUE /// Whether the stun attack is logged. Only relevant for abductor batons, which have different modes. var/log_stun_attack = TRUE /// Boolean on whether people with chunky fingers can use this baton. var/chunky_finger_usable = FALSE + /// Boolean, if TRUE when we harmbaton someone we will also try to stun if the baton is active / not on cooldown. + var/stun_on_harmbaton = FALSE + + /// Text shown when trying to stun someone while the baton is on cooldown. + var/wait_desc = "" /// What term do we use to describe our baton being 'ready', or the phrase to use when var/active is TRUE. var/activated_word = "ready" @@ -96,37 +99,83 @@ readout += "\nIt has a stun armor-piercing capability of [span_warning("[get_stun_penetration_value()]%")]." return readout.Join("\n") -/** - * Ok, think of baton attacks like a melee attack chain: - * - * [/baton_attack()] comes first. It checks if the user is clumsy, if the target parried the attack and handles some messages and sounds. - * * Depending on its return value, it'll either do a normal attack, continue to the next step or stop the attack. - * - * [/finalize_baton_attack()] is then called. It handles logging stuff, sound effects and calls baton_effect(). - * * The proc is also called in other situations such as stunbatons right clicking or throw impact. Basically when baton_attack() - * * checks are either redundant or unnecessary. - * - * [/baton_effect()] is third in the line. It knockdowns targets, along other effects called in additional_effects_cyborg() and - * * additional_effects_non_cyborg(). - * - * Last but not least [/set_batoned()], which gives the target the IWASBATONED trait with REF(user) as source and then removes it - * * after a cooldown has passed. Basically, it stops users from cheesing the cooldowns by dual wielding batons. - * - * TL;DR: [/baton_attack()] -> [/finalize_baton_attack()] -> [/baton_effect()] -> [/set_batoned()] - */ -/obj/item/melee/baton/attack(mob/living/target, mob/living/user, list/modifiers) - add_fingerprint(user) - switch(baton_attack(target, user, modifiers)) - if(BATON_DO_NORMAL_ATTACK) - return ..() - if(BATON_ATTACKING) - finalize_baton_attack(target, user, modifiers) +/// Checks if we can actually USE the baton. Impure +/obj/item/melee/baton/proc/can_baton(mob/living/target, mob/living/user) + PROTECTED_PROC(TRUE) + if(clumsy_check(user, target)) + return FALSE + + if(!chunky_finger_usable && ishuman(user)) + var/mob/living/carbon/human/human_user = user + if(human_user.check_chunky_fingers() && user.is_holding(src) && !HAS_MIND_TRAIT(user, TRAIT_CHUNKYFINGERS_IGNORE_BATON)) + balloon_alert(human_user, "fingers are too big!") + return FALSE + + return TRUE + +// Stun attack +/obj/item/melee/baton/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + . = ..() + if(. || !isliving(target)) + return . + + if(!can_baton(target, user)) + return TRUE + + if(!COOLDOWN_FINISHED(src, cooldown_check)) + if(wait_desc) + balloon_alert(user, wait_desc) + return TRUE + + if(HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user))) //no doublebaton abuse anon! + target.balloon_alert(user, "can't stun yet!") + return TRUE + + if(active) + // when we continue to attack, deal 0 (brute) damage (just stun) + SET_ATTACK_FORCE(attack_modifiers, 0) + MUTE_ATTACK_HITSOUND(attack_modifiers) + HIDE_ATTACK_MESSAGES(attack_modifiers) + return . + +// Harm attack +/obj/item/melee/baton/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + . = ..() + if(. != SECONDARY_ATTACK_CALL_NORMAL || !isliving(target)) + return . + + if(!can_baton(target, user)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + // call attack, NOT pre_attack + // (so we go directly to harming) + return SECONDARY_ATTACK_CONTINUE_CHAIN + +// This is where stun gets applied +/obj/item/melee/baton/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) + if(!active || !COOLDOWN_FINISHED(src, cooldown_check) || HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user))) + return + // worst check in the chain but - right click = harmbaton + if(LAZYACCESS(modifiers, RIGHT_CLICK) && !stun_on_harmbaton) + return + + finalize_baton_attack(target, user, modifiers) + + var/list/desc + if(iscyborg(target)) + desc = get_cyborg_stun_description(target, user) + if(!affect_cyborg) + playsound(src, 'sound/effects/bang.ogg', 10, TRUE) //bonk + else + desc = get_stun_description(target, user) + + if(desc) + target.visible_message(desc["visible"], desc["local"], visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE) /obj/item/melee/baton/apply_fantasy_bonuses(bonus) . = ..() stamina_damage = modify_fantasy_variable("stamina_damage", stamina_damage, bonus * 4) - /obj/item/melee/baton/remove_fantasy_bonuses(bonus) stamina_damage = reset_fantasy_variable("stamina_damage", stamina_damage) return ..() @@ -155,74 +204,19 @@ return CONTEXTUAL_SCREENTIP_SET -/obj/item/melee/baton/proc/baton_attack(mob/living/target, mob/living/user, modifiers) - . = BATON_ATTACKING - - if(clumsy_check(user, target)) - return BATON_ATTACK_DONE - - if(!chunky_finger_usable && ishuman(user)) - var/mob/living/carbon/human/potential_chunky_finger_human = user - if(potential_chunky_finger_human.check_chunky_fingers() && user.is_holding(src) && !HAS_MIND_TRAIT(user, TRAIT_CHUNKYFINGERS_IGNORE_BATON)) - balloon_alert(potential_chunky_finger_human, "fingers are too big!") - return BATON_ATTACK_DONE - - if(!active || LAZYACCESS(modifiers, RIGHT_CLICK)) - return BATON_DO_NORMAL_ATTACK - - if(cooldown_check > world.time) - var/wait_desc = get_wait_description() - if (wait_desc) - to_chat(user, wait_desc) - return BATON_ATTACK_DONE - - if(check_parried(target, user)) - return BATON_ATTACK_DONE - - if(HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user))) //no doublebaton abuse anon! - to_chat(user, span_danger("You fumble and miss [target]!")) - return BATON_ATTACK_DONE - - if(stun_animation) - user.do_attack_animation(target) - - var/list/desc - - if(iscyborg(target)) - if(affect_cyborg) - desc = get_cyborg_stun_description(target, user) - else - desc = get_unga_dunga_cyborg_stun_description(target, user) - playsound(get_turf(src), 'sound/effects/bang.ogg', 10, TRUE) //bonk - . = BATON_ATTACK_DONE - else - desc = get_stun_description(target, user) - - if(desc) - target.visible_message(desc["visible"], desc["local"]) - -/obj/item/melee/baton/proc/check_parried(mob/living/carbon/human/human_target, mob/living/user) - if (human_target.check_block(src, 0, "[user]'s [name]", MELEE_ATTACK)) - playsound(human_target, 'sound/items/weapons/genhit.ogg', 50, TRUE) - return TRUE - return FALSE - -/obj/item/melee/baton/proc/finalize_baton_attack(mob/living/target, mob/living/user, modifiers, in_attack_chain = TRUE) - if(!in_attack_chain && HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user))) - return BATON_ATTACK_DONE - - cooldown_check = world.time + cooldown +/// Wrapper for calling "stun()" and doing relevant vfx/sfx +/obj/item/melee/baton/proc/finalize_baton_attack(mob/living/target, mob/living/user, list/modifiers) + PROTECTED_PROC(TRUE) + COOLDOWN_START(src, cooldown_check, cooldown) if(on_stun_sound) - playsound(get_turf(src), on_stun_sound, on_stun_volume, TRUE, -1) - if(user) - target.lastattacker = user.real_name - target.lastattackerckey = user.ckey - if(log_stun_attack) - log_combat(user, target, "stun attacked", src) + playsound(src, on_stun_sound, on_stun_volume, TRUE, -1) if(baton_effect(target, user, modifiers) && user) set_batoned(target, user, cooldown) + log_combat(user, target, "stunned", src.name) -/obj/item/melee/baton/proc/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) +/// The actual "stun()" of the stun baton +/obj/item/melee/baton/proc/baton_effect(mob/living/target, mob/living/user, list/modifiers, stun_override) + PROTECTED_PROC(TRUE) var/trait_check = HAS_TRAIT(target, TRAIT_BATON_RESISTANCE) if(iscyborg(target)) if(!affect_cyborg) @@ -244,46 +238,37 @@ SEND_SIGNAL(target, COMSIG_MOB_BATONED, user, src) return TRUE -/// Description for trying to stun when still on cooldown. -/obj/item/melee/baton/proc/get_wait_description() - return - /// Default message for stunning a living, non-cyborg mob. /obj/item/melee/baton/proc/get_stun_description(mob/living/target, mob/living/user) + PROTECTED_PROC(TRUE) . = list() - .["visible"] = span_danger("[user] knocks [target] down with [src]!") .["local"] = span_userdanger("[user] knocks you down with [src]!") - return . - /// Default message for stunning a cyborg. /obj/item/melee/baton/proc/get_cyborg_stun_description(mob/living/target, mob/living/user) + PROTECTED_PROC(TRUE) . = list() - - .["visible"] = span_danger("[user] pulses [target]'s sensors with the baton!") - .["local"] = span_danger("You pulse [target]'s sensors with the baton!") - - return . - -/// Default message for trying to stun a cyborg with a baton that can't stun cyborgs. -/obj/item/melee/baton/proc/get_unga_dunga_cyborg_stun_description(mob/living/target, mob/living/user) - . = list() - - .["visible"] = span_danger("[user] tries to knock down [target] with [src], and predictably fails!") //look at this duuuuuude - .["local"] = span_userdanger("[user] tries to... knock you down with [src]?") //look at the top of his head! - - return . + if(affect_cyborg) + .["visible"] = span_danger("[user] pulses [target]'s sensors with the baton!") + .["local"] = span_danger("You pulse [target]'s sensors with the baton!") + else + .["visible"] = span_danger("[user] tries to knock down [target] with [src], and predictably fails!") //look at this duuuuuude + .["local"] = span_userdanger("[user] tries to... knock you down with [src]?") //look at the top of his head! /// Contains any special effects that we apply to living, non-cyborg mobs we stun. Does not include applying a knockdown, dealing stamina damage, etc. /obj/item/melee/baton/proc/additional_effects_non_cyborg(mob/living/target, mob/living/user) + PROTECTED_PROC(TRUE) return /// Contains any special effects that we apply to cyborgs we stun. Does not include flashing the cyborg's screen, hardstunning them, etc. /obj/item/melee/baton/proc/additional_effects_cyborg(mob/living/target, mob/living/user) + PROTECTED_PROC(TRUE) return +/// Used in marking a target as being hit by a baton /obj/item/melee/baton/proc/set_batoned(mob/living/target, mob/living/user, cooldown) + PRIVATE_PROC(TRUE) if(!cooldown) return var/user_ref = REF(user) // avoids harddels. @@ -293,7 +278,7 @@ /obj/item/melee/baton/proc/clumsy_check(mob/living/user, mob/living/intented_target) if(!active || !HAS_TRAIT(user, TRAIT_CLUMSY) || prob(50)) return FALSE - user.visible_message(span_danger("[user] accidentally hits [user.p_them()]self over the head with [src]! What a doofus!"), span_userdanger("You accidentally hit yourself over the head with [src]!")) + user.visible_message(span_danger("[user] accidentally hits [user.p_them()]self over the head with [src]! What a doofus!"), span_userdanger("You accidentally hit yourself over the head with [src]!"), visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE) if(iscyborg(user)) if(affect_cyborg) @@ -301,9 +286,9 @@ user.Paralyze(clumsy_knockdown_time) additional_effects_cyborg(user, user) // user is the target here if(on_stun_sound) - playsound(get_turf(src), on_stun_sound, on_stun_volume, TRUE, -1) + playsound(src, on_stun_sound, on_stun_volume, TRUE, -1) else - playsound(get_turf(src), 'sound/effects/bang.ogg', 10, TRUE) + playsound(src, 'sound/effects/bang.ogg', 10, TRUE) else //straight up always force say for clumsy humans if(ishuman(user)) @@ -313,14 +298,11 @@ user.apply_damage(stamina_damage, STAMINA) additional_effects_non_cyborg(user, user) // user is the target here if(on_stun_sound) - playsound(get_turf(src), on_stun_sound, on_stun_volume, TRUE, -1) - - user.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD, attacking_item = src) + playsound(src, on_stun_sound, on_stun_volume, TRUE, -1) + user.apply_damage(2 * force, BRUTE, BODY_ZONE_HEAD, attacking_item = src) log_combat(user, user, "accidentally stun attacked [user.p_them()]self due to their clumsiness", src) - if(stun_animation) - user.do_attack_animation(user) - return + user.do_attack_animation(user) /// Handles the penetration value of our baton, called during baton_effect() /obj/item/melee/baton/proc/get_stun_penetration_value() @@ -461,6 +443,7 @@ stun_armour_penetration = 40 clumsy_knockdown_time = 24 SECONDS affect_cyborg = TRUE + wait_desc = "still charging!" on_stun_sound = 'sound/items/weapons/contractor_baton/contractorbatonhit.ogg' unfolded_drop_sound = 'sound/items/baton/contractor_baton_unfolded_pickup.ogg' unfolded_pickup_sound = 'sound/items/baton/contractor_baton_unfolded_pickup.ogg' @@ -469,9 +452,6 @@ on_sound = 'sound/items/weapons/contractorbatonextend.ogg' active_force = 16 -/obj/item/melee/baton/telescopic/contractor_baton/get_wait_description() - return span_danger("The baton is still charging!") - /obj/item/melee/baton/telescopic/contractor_baton/additional_effects_non_cyborg(mob/living/target, mob/living/user) . = ..() target.set_jitter_if_lower(40 SECONDS) @@ -504,6 +484,8 @@ on_stun_sound = 'sound/items/weapons/egloves.ogg' on_stun_volume = 50 active = FALSE + stun_on_harmbaton = TRUE + wait_desc = "still charging!" activated_word = "activated" context_living_rmb_active = "Harmful Stun" light_range = 1.5 @@ -553,7 +535,7 @@ /obj/item/melee/baton/security/suicide_act(mob/living/user) if(cell?.charge && active) user.visible_message(span_suicide("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!")) - attack(user, user) + finalize_baton_attack(user, user) return FIRELOSS else user.visible_message(span_suicide("[user] is shoving \the [src] down their throat! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -624,7 +606,7 @@ tool.play_tool_sound(src) return TRUE -/obj/item/melee/baton/security/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/melee/baton/security/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/stock_parts/power_store/cell)) var/obj/item/stock_parts/power_store/cell/active_cell = item if(cell) @@ -727,18 +709,20 @@ SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) deductcharge(cell_hit_cost) -/// Handles prodding targets with turned off stunbatons and right clicking stun'n'bash -/obj/item/melee/baton/security/baton_attack(mob/living/target, mob/living/user, modifiers) +/obj/item/melee/baton/security/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() - if(. != BATON_DO_NORMAL_ATTACK) - return - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - if(active && cooldown_check <= world.time && !check_parried(target, user)) - finalize_baton_attack(target, user, modifiers, in_attack_chain = FALSE) - else if(!user.combat_mode) - target.visible_message(span_warning("[user] prods [target] with [src]. Luckily it was off."), \ - span_warning("[user] prods you with [src]. Luckily it was off.")) - return BATON_ATTACK_DONE + if(. || !isliving(target)) + return . + + if(!active && !user.combat_mode) + target.visible_message( + span_warning("[user] prods [target] with [src]. Luckily it was off."), + span_warning("[user] prods you with [src]. Luckily it was off."), + visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE, + ) + return TRUE + + return . /obj/item/melee/baton/security/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) if(iscyborg(loc)) @@ -778,25 +762,22 @@ if(!trait_check) target.Knockdown(knockdown_time) -/obj/item/melee/baton/security/get_wait_description() - return span_danger("The baton is still charging!") - /obj/item/melee/baton/security/get_stun_description(mob/living/target, mob/living/user) . = list() .["visible"] = span_danger("[user] stuns [target] with [src]!") .["local"] = span_userdanger("[user] stuns you with [src]!") -/obj/item/melee/baton/security/get_unga_dunga_cyborg_stun_description(mob/living/target, mob/living/user) - . = list() - - .["visible"] = span_danger("[user] tries to stun [target] with [src], and predictably fails!") - .["local"] = span_userdanger("[user] tries to... stun you with [src]?") +/obj/item/melee/baton/security/get_cyborg_stun_description(mob/living/target, mob/living/user) + . = ..() + if(!affect_cyborg) + .["visible"] = span_danger("[user] tries to stun [target] with [src], and predictably fails!") + .["local"] = span_userdanger("[user] tries to... stun you with [src]?") /obj/item/melee/baton/security/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(!. && active && prob(throw_stun_chance) && isliving(hit_atom)) - finalize_baton_attack(hit_atom, throwingdatum.get_thrower(), in_attack_chain = FALSE) + finalize_baton_attack(hit_atom, throwingdatum.get_thrower()) /obj/item/melee/baton/security/emp_act(severity) . = ..() @@ -857,7 +838,7 @@ . = ..() sparkler = new (src) -/obj/item/melee/baton/security/cattleprod/attackby(obj/item/item, mob/user, list/modifiers)//handles sticking a crystal onto a stunprod to make an improved cattleprod +/obj/item/melee/baton/security/cattleprod/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)//handles sticking a crystal onto a stunprod to make an improved cattleprod if(!istype(item, /obj/item/stack)) return ..() @@ -889,9 +870,9 @@ var/obj/item/melee/baton/security/cattleprod/brand_new_prod = new our_prod(user.loc) user.put_in_hands(brand_new_prod) -/obj/item/melee/baton/security/cattleprod/baton_effect() +/obj/item/melee/baton/security/cattleprod/can_baton(mob/living/target, mob/living/user) if(!sparkler.activate()) - return BATON_ATTACK_DONE + return FALSE return ..() /obj/item/melee/baton/security/cattleprod/Destroy() @@ -919,15 +900,7 @@ /obj/item/melee/baton/security/boomerang/Initialize(mapload) . = ..() - AddComponent(/datum/component/boomerang, throw_range+2, TRUE) - -/obj/item/melee/baton/security/boomerang/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - if(!active) - return ..() - var/caught = hit_atom.hitby(src, skipcatch = FALSE, hitpush = FALSE, throwingdatum = throwingdatum) - var/mob/thrown_by = throwingdatum.get_thrower() - if(isliving(hit_atom) && !iscyborg(hit_atom) && !caught && prob(throw_stun_chance))//if they are a living creature and they didn't catch it - finalize_baton_attack(hit_atom, thrown_by, in_attack_chain = FALSE) + AddComponent(/datum/component/boomerang, throw_range + 2, TRUE) /obj/item/melee/baton/security/boomerang/loaded //Same as above, comes with a cell. preload_cell_type = /obj/item/stock_parts/power_store/cell/high diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 4d633b3f98b..2709793c038 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -242,7 +242,7 @@ final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword return ..() -/obj/item/melee/beesword/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/melee/beesword/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(iscarbon(target)) var/mob/living/carbon/carbon_target = target carbon_target.reagents.add_reagent(/datum/reagent/toxin, 4) @@ -291,7 +291,7 @@ if(!isspaceturf(turf)) consume_turf(turf) -/obj/item/melee/supermatter_sword/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/melee/supermatter_sword/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return . @@ -385,7 +385,7 @@ attack_verb_simple = list("flog", "whip", "lash", "discipline") hitsound = 'sound/items/weapons/whip.ogg' -/obj/item/melee/curator_whip/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/melee/curator_whip/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(ishuman(target)) var/mob/living/carbon/human/human_target = target human_target.drop_all_held_items() diff --git a/code/game/objects/items/piggy_bank.dm b/code/game/objects/items/piggy_bank.dm index 4dafb9dc9ed..0a14347116e 100644 --- a/code/game/objects/items/piggy_bank.dm +++ b/code/game/objects/items/piggy_bank.dm @@ -124,7 +124,7 @@ if(95 to INFINITY) balloon_alert(user, "brimming with cash") -/obj/item/piggy_bank/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/piggy_bank/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) var/creds_value = item.get_item_credit_value() if(isnull(creds_value)) return ..() diff --git a/code/game/objects/items/pillow.dm b/code/game/objects/items/pillow.dm index dd67b92d243..2ccf7157b83 100644 --- a/code/game/objects/items/pillow.dm +++ b/code/game/objects/items/pillow.dm @@ -48,7 +48,7 @@ . = ..() QDEL_NULL(pillow_trophy) -/obj/item/pillow/attack(mob/living/carbon/target_mob, mob/living/user, list/modifiers) +/obj/item/pillow/attack(mob/living/carbon/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(!iscarbon(target_mob)) return @@ -73,7 +73,7 @@ user.visible_message("[user] starts to smother [victim]", span_notice("You begin smothering [victim]"), vision_distance = COMBAT_MESSAGE_RANGE) INVOKE_ASYNC(src, PROC_REF(smothering), user, victim) -/obj/item/pillow/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/pillow/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(!bricked && istype(attacking_item, /obj/item/stack/sheet/mineral/sandstone)) var/obj/item/stack/sheet/mineral/sandstone/brick = attacking_item balloon_alert(user, "inserting brick...") @@ -222,4 +222,3 @@ desc = "Daww look at that little mime!" icon_state = "pillow_6_t" variation = 6 - diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 5d0ccf5d33c..f1f76cccfef 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -125,7 +125,7 @@ else to_chat(user, span_notice("You try to pet [src], but it has no stuffing. Aww...")) -/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(I.get_sharpness()) if(!grenade) if(!stuffed) @@ -677,7 +677,7 @@ ) AddElement(/datum/element/connect_loc, loc_connections) -/obj/item/toy/plush/goatplushie/attackby(obj/item/cigarette/rollie/fat_dart, mob/user, list/modifiers) +/obj/item/toy/plush/goatplushie/attackby(obj/item/cigarette/rollie/fat_dart, mob/user, list/modifiers, list/attack_modifiers) if(!istype(fat_dart)) return ..() if(splat) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index d345f500e63..e8fe75c74b3 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -108,7 +108,7 @@ balloon_alert(user, "output level set to [pressure_setting_to_text(pressure_setting)]") return TRUE -/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/living/user, list/modifiers) +/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) if(user.combat_mode) return ..() if(istype(W, /obj/item/tank/internals)) diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index cf3e7565c9b..172806476bd 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -72,7 +72,7 @@ update_tank(tank, TANK_REMOVING, user) return TRUE -/obj/item/melee/powerfist/attackby(obj/item/item_to_insert, mob/user, list/modifiers) +/obj/item/melee/powerfist/attackby(obj/item/item_to_insert, mob/user, list/modifiers, list/attack_modifiers) if(!istype(item_to_insert, /obj/item/tank/internals)) return ..() if(tank) diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index fd1eaff87b3..f2ba65c0e85 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -124,7 +124,7 @@ desc = "This door only opens when a keycard is swiped. It looks virtually indestructible." uses_queuelinks = FALSE -/obj/machinery/door/puzzle/keycard/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/door/puzzle/keycard/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!istype(attacking_item, /obj/item/keycard)) return @@ -374,7 +374,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/button, 32) icon_state = "keycardpad0" base_icon_state = "keycardpad" -/obj/machinery/puzzle/keycardpad/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/puzzle/keycardpad/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!istype(attacking_item, /obj/item/keycard) || used) return diff --git a/code/game/objects/items/rcd/RSF.dm b/code/game/objects/items/rcd/RSF.dm index aac183475ce..1dff040fcfd 100644 --- a/code/game/objects/items/rcd/RSF.dm +++ b/code/game/objects/items/rcd/RSF.dm @@ -72,7 +72,7 @@ RSF /obj/item/rsf/cyborg matter = 30 -/obj/item/rsf/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/rsf/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(is_type_in_list(W,matter_by_item))//If the thing we got hit by is in our matter list var/tempMatter = matter_by_item[W.type] + matter if(tempMatter > max_matter) diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index a20a5448d1f..9d7e6c41d58 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -7,7 +7,7 @@ ///The upgrade that will be applied to the AI when installed var/datum/ai_module/to_gift = /datum/ai_module -/obj/item/aiupgrade/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/aiupgrade/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) if(!isAI(target)) return ..() var/mob/living/silicon/ai/AI = target @@ -51,7 +51,7 @@ . = ..() ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT) -/obj/item/malf_upgrade/pre_attack(atom/A, mob/living/user, list/modifiers) +/obj/item/malf_upgrade/pre_attack(atom/A, mob/living/user, list/modifiers, list/attack_modifiers) if(!isAI(A)) return ..() var/mob/living/silicon/ai/AI = A @@ -85,7 +85,3 @@ name = "power transfer upgrade" desc = "A legal upgrade that allows an artificial intelligence to directly provide power to APCs from a distance" to_gift = /datum/ai_module/power_apc - - - - diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm index 8f815f675b9..7d8c2cc9f7f 100644 --- a/code/game/objects/items/robot/items/generic.dm +++ b/code/game/objects/items/robot/items/generic.dm @@ -96,7 +96,7 @@ if(HUG_MODE_CRUSH) to_chat(user, "ERROR: ARM ACTUATORS OVERLOADED.") -/obj/item/borg/cyborghug/attack(mob/living/attacked_mob, mob/living/silicon/robot/user, list/modifiers) +/obj/item/borg/cyborghug/attack(mob/living/attacked_mob, mob/living/silicon/robot/user, list/modifiers, list/attack_modifiers) if(attacked_mob == user) return if(attacked_mob.health < 0) diff --git a/code/game/objects/items/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm index 0a2a3b5042e..dbbd9eb3ee2 100644 --- a/code/game/objects/items/robot/items/storage.dm +++ b/code/game/objects/items/robot/items/storage.dm @@ -61,7 +61,7 @@ stored.forceMove(user.drop_location()) return CLICK_ACTION_SUCCESS -/obj/item/borg/apparatus/pre_attack(atom/atom, mob/living/user, list/modifiers) +/obj/item/borg/apparatus/pre_attack(atom/atom, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(atom.loc, /mob/living/silicon/robot) || istype(atom.loc, /obj/item/robot_model) || HAS_TRAIT(atom, TRAIT_NODROP)) return ..() // Borgs should not be grabbing their own modules @@ -92,7 +92,7 @@ update_appearance() return NONE -/obj/item/borg/apparatus/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/borg/apparatus/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(stored) item.melee_attack_chain(user, stored, modifiers) return @@ -317,7 +317,7 @@ . += "The apparatus currently has [stored] secured." . += span_notice(" Alt-click will drop the currently stored circuit. ") -/obj/item/borg/apparatus/circuit/pre_attack(atom/atom, mob/living/user, list/modifiers) +/obj/item/borg/apparatus/circuit/pre_attack(atom/atom, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(atom, /obj/item/ai_module) && !stored) //If an admin wants a borg to upload laws, who am I to stop them? Otherwise, we can hint that it fails to_chat(user, span_warning("This circuit board doesn't seem to have standard robot apparatus pin holes. You're unable to pick it up.")) return ..() diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 4a22c91abfb..631775bcb04 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -166,7 +166,7 @@ return TRUE //ADD -/obj/item/robot_suit/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/robot_suit/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/stack/sheet/iron)) var/obj/item/stack/sheet/iron/M = W if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index d7c15ac45d4..01cbd0db9a8 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -831,7 +831,7 @@ icon = 'icons/obj/devices/circuitry_n_data.dmi' icon_state = "cyborg_upgrade1" -/obj/item/borg_restart_board/pre_attack(mob/living/silicon/robot/borgo, mob/living/user, list/modifiers) +/obj/item/borg_restart_board/pre_attack(mob/living/silicon/robot/borgo, mob/living/user, list/modifiers, list/attack_modifiers) if(!istype(borgo)) return ..() if(!borgo.opened) diff --git a/code/game/objects/items/secret_documents.dm b/code/game/objects/items/secret_documents.dm index ef6b12444f9..91a2a8934e4 100644 --- a/code/game/objects/items/secret_documents.dm +++ b/code/game/objects/items/secret_documents.dm @@ -66,7 +66,7 @@ var/obj/item/documents/photocopy/C = copy copy_type = C.copy_type -/obj/item/documents/photocopy/attackby(obj/item/O, mob/user, list/modifiers) +/obj/item/documents/photocopy/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, /obj/item/toy/crayon/red) || istype(O, /obj/item/toy/crayon/blue)) if (forgedseal) to_chat(user, span_warning("You have already forged a seal on [src]!")) diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm index 9b3795a620c..daf1bf0ba96 100644 --- a/code/game/objects/items/sharpener.dm +++ b/code/game/objects/items/sharpener.dm @@ -23,7 +23,7 @@ ///If TRUE, the whetstone will only sharpen already sharp items var/requires_sharpness = TRUE -/obj/item/sharpener/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/sharpener/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(uses == 0) to_chat(user, span_warning("The sharpening block is too worn to use again!")) return diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index b43aecff00c..76a47fba68b 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -178,7 +178,7 @@ slapcraft_recipes = slapcraft_recipe_list,\ ) -/obj/item/shield/riot/attackby(obj/item/attackby_item, mob/user, list/modifiers) +/obj/item/shield/riot/attackby(obj/item/attackby_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attackby_item, /obj/item/stack/sheet/mineral/titanium)) if (atom_integrity >= max_integrity) to_chat(user, span_warning("[src] is already in perfect condition.")) @@ -446,7 +446,7 @@ shield_break_leftover = /obj/item/stack/rods/ten armor_type = /datum/armor/item_shield/ballistic -/obj/item/shield/ballistic/attackby(obj/item/attackby_item, mob/user, list/modifiers) +/obj/item/shield/ballistic/attackby(obj/item/attackby_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attackby_item, /obj/item/stack/sheet/mineral/titanium)) if (atom_integrity >= max_integrity) to_chat(user, span_warning("[src] is already in perfect condition.")) diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index c7767a7af31..a725791e238 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -30,7 +30,7 @@ name = "[label] sign" desc = "It reads: [label]" -/obj/item/picket_sign/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/picket_sign/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(IS_WRITING_UTENSIL(W)) retext(user, W) else diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 9fb15854f0e..1b394b2cca6 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -170,7 +170,7 @@ return CLICK_ACTION_SUCCESS -/obj/item/spear/explosive/afterattack(atom/movable/target, mob/user, list/modifiers) +/obj/item/spear/explosive/afterattack(atom/movable/target, mob/user, list/modifiers, list/attack_modifiers) if(!HAS_TRAIT(src, TRAIT_WIELDED) || !istype(target)) return if(target.resistance_flags & INDESTRUCTIBLE) //due to the lich incident of 2021, embedding grenades inside of indestructible structures is forbidden @@ -199,7 +199,7 @@ force_unwielded = 15 force_wielded = 25 -/obj/item/spear/grey_tide/afterattack(atom/movable/target, mob/living/user, list/modifiers) +/obj/item/spear/grey_tide/afterattack(atom/movable/target, mob/living/user, list/modifiers, list/attack_modifiers) user.faction |= "greytide([REF(user)])" if(!isliving(target)) return diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index db6a30c68e2..d8c2bee83a2 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -483,7 +483,7 @@ /obj/item/stack/medical/gauze/twelve amount = 12 -/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness()) if(get_amount() < 2) balloon_alert(user, "not enough gauze!") diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index d67353e13e1..c2547cbbea7 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ . = ..() . += GLOB.glass_recipes -/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(istype(W, /obj/item/lightreplacer)) var/obj/item/lightreplacer/lightreplacer = W @@ -118,7 +118,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ . = ..() . += GLOB.pglass_recipes -/obj/item/stack/sheet/plasmaglass/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/stack/sheet/plasmaglass/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(istype(W, /obj/item/stack/rods)) @@ -174,7 +174,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ fire = 70 acid = 100 -/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) ..() @@ -357,7 +357,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( if(T && is_station_level(T.z)) SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name) -/obj/item/shard/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/shard/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(!iscarbon(user) || !user.is_holding(src)) return @@ -368,7 +368,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( to_chat(user, span_warning("[src] cuts into your hand!")) jab.apply_damage(force * 0.5, BRUTE, user.get_active_hand(), attacking_item = src) -/obj/item/shard/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/shard/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/lightreplacer)) var/obj/item/lightreplacer/lightreplacer = item lightreplacer.attackby(src, user) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 4a2c8a75136..0c5ae9a505c 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -344,7 +344,7 @@ GLOBAL_LIST_INIT(bear_pelt_recipes, list ( \ //Step one - dehairing. -/obj/item/stack/sheet/animalhide/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/stack/sheet/animalhide/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(W.get_sharpness()) playsound(loc, 'sound/items/weapons/slice.ogg', 50, TRUE, -1) user.visible_message(span_notice("[user] starts cutting hair off \the [src]."), span_notice("You start cutting the hair off \the [src]..."), span_hear("You hear the sound of a knife rubbing against flesh.")) diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index 316b35e035c..8597cfc859f 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -18,7 +18,7 @@ . = ..() . += span_warning("\The [src] looks unfinished, add iron to complete it.") -/obj/item/stack/light_w/attackby(obj/item/O, mob/user, list/modifiers) +/obj/item/stack/light_w/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, /obj/item/stack/sheet/iron)) var/obj/item/stack/sheet/iron/M = O if (M.use(1)) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 0099eae1c5f..ca996d9737e 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -78,7 +78,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ icon_state = "sandbag" w_class = WEIGHT_CLASS_TINY -/obj/item/emptysandbag/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/emptysandbag/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/stack/ore/glass)) var/obj/item/stack/ore/glass/G = W to_chat(user, span_notice("You fill the sandbag.")) @@ -311,7 +311,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ . = ..() . += GLOB.titanium_recipes -/obj/item/stack/sheet/mineral/titanium/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/stack/sheet/mineral/titanium/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(istype(W, /obj/item/stack/rods)) var/obj/item/stack/rods/old_rods = W @@ -490,7 +490,7 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ grind_results = list(/datum/reagent/carbon = 20) novariants = TRUE -/obj/item/stack/sheet/mineral/coal/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/stack/sheet/mineral/coal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(W.get_temperature() > 300)//If the temperature of the object is over 300, then ignite var/turf/T = get_turf(src) message_admins("Coal ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]") diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 1b6d55039ac..29950bc6c0e 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -718,7 +718,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ /obj/item/stack/sheet/cardboard/fifty amount = 50 -/obj/item/stack/sheet/cardboard/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/stack/sheet/cardboard/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/stamp/clown) && !istype(loc, /obj/item/storage)) var/atom/droploc = drop_location() if(use(1)) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index f1fe1b25122..4393e70fee4 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -740,7 +740,7 @@ is_zero_amount(delete_if_zero = TRUE) -/obj/item/stack/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/stack/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(can_merge(W, inhand = TRUE)) var/obj/item/stack/S = W if(merge(S)) diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm index bd50960dfdd..0c4bce3310a 100644 --- a/code/game/objects/items/stacks/tiles/light.dm +++ b/code/game/objects/items/stacks/tiles/light.dm @@ -10,7 +10,7 @@ merge_type = /obj/item/stack/tile/light var/state = 0 -/obj/item/stack/tile/light/attackby(obj/item/O, mob/user, list/modifiers) +/obj/item/stack/tile/light/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(O.tool_behaviour == TOOL_CROWBAR) new/obj/item/stack/sheet/iron(user.loc) amount-- diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm index d2a746070fe..4e7c23b51ff 100644 --- a/code/game/objects/items/stacks/tiles/tile_mineral.dm +++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm @@ -2,7 +2,7 @@ /// Determines what stack is gotten out of us when welded. var/mineralType = null -/obj/item/stack/tile/mineral/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/stack/tile/mineral/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(W.tool_behaviour == TOOL_WELDER) if(get_amount() < 4) to_chat(user, span_warning("You need at least four tiles to do this!")) diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 51c416fdd4a..3d8b552c776 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -26,7 +26,7 @@ . = ..() ADD_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT) -/obj/item/stack/wrapping_paper/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/stack/wrapping_paper/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() user.visible_message( span_warning("[user] baps [target_mob] on the head with [src]!"), @@ -235,11 +235,10 @@ . = ..() ADD_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT) -/obj/item/c_tube/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/c_tube/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() user.visible_message( span_warning("[user] baps [target_mob] on the head with [src]!"), span_warning("You bap [target_mob] on the head with [src]!"), ) target_mob.add_mood_event("roll", /datum/mood_event/bapped) - diff --git a/code/game/objects/items/storage/toolboxes/mechanical.dm b/code/game/objects/items/storage/toolboxes/mechanical.dm index a818d620da2..092a8b00b8b 100644 --- a/code/game/objects/items/storage/toolboxes/mechanical.dm +++ b/code/game/objects/items/storage/toolboxes/mechanical.dm @@ -52,13 +52,13 @@ force = initial(force) + power throwforce = initial(throwforce) + power -/obj/item/storage/toolbox/mechanical/old/clean/attack(mob/target, mob/living/user) +/obj/item/storage/toolbox/mechanical/old/clean/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) calc_damage() - ..() + return ..() /obj/item/storage/toolbox/mechanical/old/clean/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) calc_damage() - ..() + return ..() /obj/item/storage/toolbox/mechanical/old/clean/PopulateContents() new /obj/item/screwdriver(src) diff --git a/code/game/objects/items/tail_pin.dm b/code/game/objects/items/tail_pin.dm index 23c13e71820..99998b53635 100644 --- a/code/game/objects/items/tail_pin.dm +++ b/code/game/objects/items/tail_pin.dm @@ -35,7 +35,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/party_game, 32) -/obj/structure/sign/poster/party_game/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/sign/poster/party_game/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!istype(I,/obj/item/tail_pin))//We're using the same trick that tables use for placing objects x and y onto the click location. return diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 57d1425645c..0d8734a799b 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -104,7 +104,7 @@ air_contents.assert_gas(/datum/gas/plasma) air_contents.gases[/datum/gas/plasma][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) -/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/flamethrower)) var/obj/item/flamethrower/F = W if ((!F.status) || (F.ptank)) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 3a613312da8..5a92271c184 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -199,7 +199,7 @@ to_chat(user, span_warning("There isn't enough pressure in [src] to commit suicide with...")) return SHAME -/obj/item/tank/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/tank/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(istype(attacking_item, /obj/item/assembly_holder)) if(tank_assembly) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 93908ce5da0..0b97caa3caa 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -96,7 +96,7 @@ var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) -/obj/item/watertank/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/watertank/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(attacking_item == noz) remove_noz() return TRUE diff --git a/code/game/objects/items/tcg/tcg.dm b/code/game/objects/items/tcg/tcg.dm index 7d2d724c84a..7a50e142065 100644 --- a/code/game/objects/items/tcg/tcg.dm +++ b/code/game/objects/items/tcg/tcg.dm @@ -128,7 +128,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) icon_state = template.icon_state return ..() -/obj/item/tcgcard/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/item/tcgcard/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/tcgcard)) var/obj/item/tcgcard/second_card = item var/obj/item/tcgcard_deck/new_deck = new /obj/item/tcgcard_deck(drop_location()) @@ -253,7 +253,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices) return FALSE return TRUE -/obj/item/tcgcard_deck/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/item/tcgcard_deck/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(istype(item, /obj/item/tcgcard)) if(contents.len >= 30) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 65e534e2a7a..66546a91672 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -176,7 +176,7 @@ /obj/item/nuke_core/supermatter_sliver/can_be_pulled(user, force) // no drag memes return FALSE -/obj/item/nuke_core/supermatter_sliver/attackby(obj/item/W, mob/living/user, list/modifiers) +/obj/item/nuke_core/supermatter_sliver/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/hemostat/supermatter)) var/obj/item/hemostat/supermatter/tongs = W if (tongs.sliver) diff --git a/code/game/objects/items/tongs.dm b/code/game/objects/items/tongs.dm index 18269b47182..3c85cc8c004 100644 --- a/code/game/objects/items/tongs.dm +++ b/code/game/objects/items/tongs.dm @@ -73,7 +73,7 @@ tonged = null update_appearance(UPDATE_ICON) -/obj/item/kitchen/tongs/pre_attack(obj/item/attacked, mob/living/user, list/modifiers) +/obj/item/kitchen/tongs/pre_attack(obj/item/attacked, mob/living/user, list/modifiers, list/attack_modifiers) if (!isnull(tonged) && tonged.force <= 0) // prevents tongs from giving food-weapons extra range attacked.attackby(tonged, user) return TRUE diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 8247220bfd5..ef82159dc41 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -112,7 +112,7 @@ flamethrower_screwdriver(tool, user) return ITEM_INTERACT_SUCCESS -/obj/item/weldingtool/attackby(obj/item/tool, mob/user, list/modifiers) +/obj/item/weldingtool/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) if(istype(tool, /obj/item/stack/rods)) flamethrower_rods(tool, user) else @@ -170,7 +170,7 @@ INVOKE_ASYNC(src, PROC_REF(try_heal_loop), interacting_with, user, TRUE) return ITEM_INTERACT_SUCCESS -/obj/item/weldingtool/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/weldingtool/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(!isOn()) return use(1) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 5fd3378a98d..a980ce95718 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -75,7 +75,7 @@ return ITEM_INTERACT_SUCCESS return ITEM_INTERACT_BLOCKING -/obj/item/toy/waterballoon/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/toy/waterballoon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/reagent_containers/cup)) if(I.reagents) if(I.reagents.total_volume <= 0) @@ -164,7 +164,7 @@ ) -/obj/item/toy/balloon/long/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/item/toy/balloon/long/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(!istype(attacking_item, /obj/item/toy/balloon/long) || !HAS_TRAIT(user, TRAIT_BALLOON_SUTRA)) return ..() @@ -187,7 +187,7 @@ qdel(src) return TRUE -/obj/item/toy/balloon/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/toy/balloon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/ammo_casing/foam_dart) && ismonkey(user)) pop_balloon(monkey_pop = TRUE) else @@ -511,7 +511,7 @@ . = ..() . += "There [bullets == 1 ? "is" : "are"] [bullets] cap\s left." -/obj/item/toy/gun/attackby(obj/item/toy/ammo/gun/A, mob/user, list/modifiers) +/obj/item/toy/gun/attackby(obj/item/toy/ammo/gun/A, mob/user, list/modifiers, list/attack_modifiers) if(istype(A, /obj/item/toy/ammo/gun)) if (src.bullets >= 7) @@ -662,7 +662,7 @@ // Copied from /obj/item/melee/energy/sword/attackby -/obj/item/toy/sword/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/item/toy/sword/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/toy/sword)) var/obj/item/toy/sword/attatched_sword = weapon if(HAS_TRAIT(weapon, TRAIT_NODROP)) diff --git a/code/game/objects/items/v8_engine.dm b/code/game/objects/items/v8_engine.dm index ed9a9b93d98..2d2d5e40593 100644 --- a/code/game/objects/items/v8_engine.dm +++ b/code/game/objects/items/v8_engine.dm @@ -71,7 +71,7 @@ AddComponent(/datum/component/two_handed, force_unwielded = 12, force_wielded = 22, attacksound = active_hitsound) RegisterSignals(src, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_PRE_THROW, COMSIG_ITEM_ATTACK_SELF), PROC_REF(reset_charges)) -/obj/item/house_edge/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/house_edge/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(!ismob(target)) return if(HAS_TRAIT(src, TRAIT_WIELDED)) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index ddfb0d07912..ccfd185f6f0 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -1006,7 +1006,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 thrown_datums.Cut() return ..() -/obj/item/melee/baseball_bat/pre_attack(atom/movable/target, mob/living/user, list/modifiers) +/obj/item/melee/baseball_bat/pre_attack(atom/movable/target, mob/living/user, list/modifiers, list/attack_modifiers) var/turf/target_turf = get_turf(target) if(!target_turf) return ..() @@ -1132,7 +1132,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 )) -/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(is_type_in_typecache(target, splattable)) to_chat(user, span_warning("You easily splat [target].")) if(isliving(target)) @@ -1169,7 +1169,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 name = "\improper ACME Extendo-Hand" desc = "A novelty extendo-hand produced by the ACME corporation. Originally designed to knock out roadrunners." -/obj/item/extendohand/attack(atom/M, mob/living/carbon/human/user, list/modifiers) +/obj/item/extendohand/attack(atom/M, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) var/dist = get_dist(M, user) if(dist < min_reach) to_chat(user, span_warning("[M] is too close to use [src] on.")) @@ -1281,7 +1281,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 return TRUE return FALSE -/obj/item/highfrequencyblade/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/highfrequencyblade/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return . diff --git a/code/game/objects/items/wizard_weapons.dm b/code/game/objects/items/wizard_weapons.dm index ef8c62a3684..7179eedb9d5 100644 --- a/code/game/objects/items/wizard_weapons.dm +++ b/code/game/objects/items/wizard_weapons.dm @@ -57,7 +57,7 @@ step_towards(A,pull) step_towards(A,pull) -/obj/item/singularityhammer/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/singularityhammer/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(!HAS_TRAIT(src, TRAIT_WIELDED)) return if(!charged) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 0c90051a5bf..f51ffd339f9 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -71,40 +71,47 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag) GLOB.objects_by_id_tag -= id_tag . = ..() -/obj/attacked_by(obj/item/attacking_item, mob/living/user) +/obj/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(!attacking_item.force) - return + return 0 var/demo_mod = attacking_item.get_demolition_modifier(src) - var/total_force = (attacking_item.force * demo_mod) + var/total_force = CALCULATE_FORCE(attacking_item, attack_modifiers) * demo_mod var/damage = take_damage(total_force, attacking_item.damtype, MELEE, TRUE, get_dir(src, user), attacking_item.armour_penetration) - // Sanity in case one is null for some reason - var/picked_index = rand(max(length(attacking_item.attack_verb_simple), length(attacking_item.attack_verb_continuous))) + if(!LAZYACCESS(attack_modifiers, SILENCE_DEFAULT_MESSAGES)) + // Sanity in case one is null for some reason + var/picked_index = rand(max(length(attacking_item.attack_verb_simple), length(attacking_item.attack_verb_continuous))) - var/message_verb_continuous = "attacks" - var/message_verb_simple = "attack" - // Sanity in case one is... longer than the other? - if (picked_index && length(attacking_item.attack_verb_continuous) >= picked_index) - message_verb_continuous = attacking_item.attack_verb_continuous[picked_index] - if (picked_index && length(attacking_item.attack_verb_simple) >= picked_index) - message_verb_simple = attacking_item.attack_verb_simple[picked_index] + var/message_verb_continuous = "attacks" + var/message_verb_simple = "attack" + // Sanity in case one is... longer than the other? + if (picked_index && length(attacking_item.attack_verb_continuous) >= picked_index) + message_verb_continuous = attacking_item.attack_verb_continuous[picked_index] + if (picked_index && length(attacking_item.attack_verb_simple) >= picked_index) + message_verb_simple = attacking_item.attack_verb_simple[picked_index] - if(demo_mod > 1 && prob(damage * 5)) - if(HAS_TRAIT(src, TRAIT_INVERTED_DEMOLITION)) - message_verb_simple = "shred" - message_verb_continuous = "shreds" - else - message_verb_simple = "pulverise" - message_verb_continuous = "pulverises" + if(demo_mod > 1 && prob(damage * 5)) + if(HAS_TRAIT(src, TRAIT_INVERTED_DEMOLITION)) + message_verb_simple = "shred" + message_verb_continuous = "shreds" + else + message_verb_simple = "pulverise" + message_verb_continuous = "pulverises" - if(demo_mod < 1) - message_verb_simple = "ineffectively " + message_verb_simple - message_verb_continuous = "ineffectively " + message_verb_continuous + if(demo_mod < 1) + message_verb_simple = "ineffectively " + message_verb_simple + message_verb_continuous = "ineffectively " + message_verb_continuous + + user.visible_message( + span_danger("[user] [message_verb_continuous] [src] with [attacking_item][damage ? "." : ", [no_damage_feedback]!"]"), + span_danger("You [message_verb_simple] [src] with [attacking_item][damage ? "." : ", [no_damage_feedback]!"]"), + null, + COMBAT_MESSAGE_RANGE, + ) - user.visible_message(span_danger("[user] [message_verb_continuous] [src] with [attacking_item][damage ? "." : ", [no_damage_feedback]!"]"), \ - span_danger("You [message_verb_simple] [src] with [attacking_item][damage ? "." : ", [no_damage_feedback]!"]"), null, COMBAT_MESSAGE_RANGE) log_combat(user, src, "attacked", attacking_item) + return damage /obj/assume_air(datum/gas_mixture/giver) if(loc) diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 4e52090f848..8fcfca6f6ea 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -149,7 +149,7 @@ return FALSE return TRUE -/obj/structure/ai_core/latejoin_inactive/attackby(obj/item/tool, mob/user, list/modifiers) +/obj/structure/ai_core/latejoin_inactive/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) if(tool.tool_behaviour == TOOL_MULTITOOL) active = !active to_chat(user, span_notice("You [active? "activate" : "deactivate"] \the [src]'s transmitters.")) @@ -179,7 +179,7 @@ balloon_alert(user, "connected neural network") return ITEM_INTERACT_SUCCESS -/obj/structure/ai_core/attackby(obj/item/tool, mob/living/user, list/modifiers) +/obj/structure/ai_core/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers) if(remote_ai) to_chat(remote_ai, span_danger("CORE TAMPERING DETECTED!")) if(!anchored) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index ca7ae8a01fd..930e1f61994 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -67,6 +67,7 @@ /obj/structure/alien/resin/Initialize(mapload) . = ..() air_update_turf(TRUE, TRUE) + ADD_TRAIT(src, TRAIT_INVERTED_DEMOLITION, INNATE_TRAIT) /obj/structure/alien/resin/Destroy() air_update_turf(TRUE, FALSE) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 3f24c6ed127..68833f91c0d 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -174,7 +174,7 @@ . += mutable_appearance(icon, "brakes_down") . += emissive_appearance(icon, "brakes_down", src, alpha = src.alpha) -/obj/structure/bed/medical/emergency/attackby(obj/item/item, mob/user, list/modifiers) +/obj/structure/bed/medical/emergency/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/emergency_bed/silicon)) var/obj/item/emergency_bed/silicon/silicon_bed = item if(silicon_bed.loaded) @@ -220,7 +220,7 @@ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL // No more excuses, stop getting blood everywhere -/obj/item/emergency_bed/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/item/emergency_bed/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/emergency_bed/silicon)) var/obj/item/emergency_bed/silicon/silicon_bed = item if(silicon_bed.loaded) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 4701be6396e..939552ba14e 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -71,7 +71,7 @@ W.setDir(dir) qdel(src) -/obj/structure/chair/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/chair/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/assembly/shock_kit) && !HAS_TRAIT(src, TRAIT_ELECTRIFIED_BUCKLE)) electrify_self(W, user) return @@ -421,7 +421,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) return TRUE return FALSE -/obj/item/chair/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/chair/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(!ishuman(target)) return diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 9aa73e67943..16a727ef9b1 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -39,7 +39,7 @@ QDEL_NULL(burning_loop) . = ..() -/obj/structure/bonfire/attackby(obj/item/used_item, mob/living/user, list/modifiers) +/obj/structure/bonfire/attackby(obj/item/used_item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(used_item, /obj/item/stack/rods) && !can_buckle && !grill) var/obj/item/stack/rods/rods = used_item var/choice = tgui_alert(user, "What would you like to construct?", "Bonfire", list("Stake","Grill")) diff --git a/code/game/objects/structures/cannons/cannon.dm b/code/game/objects/structures/cannons/cannon.dm index d312b8d6ddd..4e7730cc6da 100644 --- a/code/game/objects/structures/cannons/cannon.dm +++ b/code/game/objects/structures/cannons/cannon.dm @@ -53,7 +53,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/structure/cannon/attackby(obj/item/used_item, mob/user, list/modifiers) +/obj/structure/cannon/attackby(obj/item/used_item, mob/user, list/modifiers, list/attack_modifiers) if(charge_ignited) balloon_alert(user, "it's gonna fire!") return diff --git a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm index e68581bc5f8..e85bccafdca 100644 --- a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm +++ b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm @@ -46,7 +46,7 @@ return ITEM_INTERACT_SUCCESS ///Covers Reloading and lighting of the gun -/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, list/modifiers) +/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, list/modifiers, list/attack_modifiers) var/ignition_message = used_item.ignition_effect(src, user) // Checks if item used can ignite stuff. if(istype(used_item, ammo_type)) if(fully_loaded_gun) diff --git a/code/game/objects/structures/construction_console/construction_console.dm b/code/game/objects/structures/construction_console/construction_console.dm index b9469dcacc6..042511cceb8 100644 --- a/code/game/objects/structures/construction_console/construction_console.dm +++ b/code/game/objects/structures/construction_console/construction_console.dm @@ -64,7 +64,7 @@ eyeobj = new /mob/eye/camera/remote/base_construction(spawn_spot, src) return TRUE -/obj/machinery/computer/camera_advanced/base_construction/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/computer/camera_advanced/base_construction/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) //If we have an internal RCD, we can refill it by slapping the console with some materials if(internal_rcd && (istype(W, /obj/item/rcd_ammo) || istype(W, /obj/item/stack/sheet))) internal_rcd.attackby(W, user, modifiers) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 4f29fdf0ab0..31a3b4c3211 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -646,7 +646,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) req_access = accesses req_one_access = null -/obj/structure/closet/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/closet/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(user in src) return if(src.tool_interact(W,user)) @@ -1257,13 +1257,17 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets) GLOB.roundstart_station_closets += src ///Spears deal bonus damages to lockers -/obj/structure/closet/attacked_by(obj/item/attacking_item, mob/living/user) +/obj/structure/closet/secure_closet/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/spear)) - take_damage(attacking_item.force * 2, attacking_item.damtype, MELEE, 1, get_dir(src, user)) - user.visible_message(span_danger("[user] stabs with precision [src]'s electronics with [attacking_item]!"), - span_danger("You stab with precision [src]'s electronics with [attacking_item]!"), null, COMBAT_MESSAGE_RANGE) - log_combat(user, src, "attacked", attacking_item) - return + HIDE_ATTACK_MESSAGES(attack_modifiers) + MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 2) + user.visible_message( + span_danger("[user] stabs with precision [src]'s electronics with [attacking_item]!"), + span_danger("You stab with precision [src]'s electronics with [attacking_item]!"), + null, + COMBAT_MESSAGE_RANGE, + ) + return ..() /obj/structure/closet/secure_closet/hitby(atom/movable/hit_by, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 2196bc2cbdf..16781a3fb09 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -46,7 +46,7 @@ QDEL_NULL(foldedbag_instance) return ..() -/obj/structure/closet/body_bag/attackby(obj/item/interact_tool, mob/user, list/modifiers) +/obj/structure/closet/body_bag/attackby(obj/item/interact_tool, mob/user, list/modifiers, list/attack_modifiers) if (IS_WRITING_UTENSIL(interact_tool)) if(!user.can_write(interact_tool)) return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index c0970e2ab19..ee82397f117 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -222,7 +222,7 @@ . = ..() . += span_notice("Right-click with a Security-level ID to reset [src]'s registered ID.") -/obj/structure/closet/secure_closet/brig/genpop/attackby(obj/item/card/id/advanced/prisoner/user_id, mob/user, list/modifiers) +/obj/structure/closet/secure_closet/brig/genpop/attackby(obj/item/card/id/advanced/prisoner/user_id, mob/user, list/modifiers, list/attack_modifiers) if(!secure || !istype(user_id)) return ..() @@ -238,7 +238,7 @@ name = initial(name) update_appearance() -/obj/structure/closet/secure_closet/brig/genpop/attackby_secondary(obj/item/card/id/advanced/used_id, mob/user, list/modifiers) +/obj/structure/closet/secure_closet/brig/genpop/attackby_secondary(obj/item/card/id/advanced/used_id, mob/user, list/modifiers, list/attack_modifiers) if(!secure || !istype(used_id)) return ..() diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm index 6161d5814f6..36a907ee0b6 100644 --- a/code/game/objects/structures/crates_lockers/crates/bins.dm +++ b/code/game/objects/structures/crates_lockers/crates/bins.dm @@ -33,7 +33,7 @@ return . += base_icon_state + "_some" -/obj/structure/closet/crate/bin/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/closet/crate/bin/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/storage/bag/trash) && !opened) var/obj/item/storage/bag/trash/T = W to_chat(user, span_notice("You fill the bag.")) diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm index 6b1155daf6d..a527d48727a 100644 --- a/code/game/objects/structures/crates_lockers/crates/large.dm +++ b/code/game/objects/structures/crates_lockers/crates/large.dm @@ -31,7 +31,7 @@ else to_chat(user, span_warning("You need a crowbar to pry this open!")) -/obj/structure/closet/crate/large/attackby(obj/item/W, mob/living/user, list/modifiers) +/obj/structure/closet/crate/large/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) if(W.tool_behaviour == TOOL_CROWBAR) if(manifest) tear_manifest(user) diff --git a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm index edea83ae247..1abbecdd2ad 100644 --- a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm +++ b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm @@ -43,7 +43,7 @@ qdel(src) ///ensures that the syndicrate can only be unlocked by opening it with a syndicrate_key -/obj/structure/closet/crate/secure/syndicrate/attackby(obj/item/item, mob/user, list/modifiers) +/obj/structure/closet/crate/secure/syndicrate/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(!istype(item, /obj/item/syndicrate_key) || created_items) return ..() created_items = TRUE @@ -67,7 +67,7 @@ ) update_appearance() -/obj/structure/closet/crate/secure/syndicrate/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/structure/closet/crate/secure/syndicrate/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/syndicrate_key diff --git a/code/game/objects/structures/deployable_turret.dm b/code/game/objects/structures/deployable_turret.dm index 8cf5c2e0344..870427cb7d6 100644 --- a/code/game/objects/structures/deployable_turret.dm +++ b/code/game/objects/structures/deployable_turret.dm @@ -249,14 +249,14 @@ /obj/item/gun_control/CanItemAutoclick() return TRUE -/obj/item/gun_control/attack_atom(obj/O, mob/living/user, list/modifiers) +/obj/item/gun_control/attack_atom(obj/O, mob/living/user, list/modifiers, list/attack_modifiers) user.changeNext_move(CLICK_CD_MELEE) - O.attacked_by(src, user) + O.attacked_by(src, user, modifiers) -/obj/item/gun_control/attack(mob/living/M, mob/living/user) +/obj/item/gun_control/attack(mob/living/M, mob/living/user, list/modifiers, list/attack_modifiers) M.lastattacker = user.real_name M.lastattackerckey = user.ckey - M.attacked_by(src, user) + M.attacked_by(src, user, modifiers) add_fingerprint(user) /obj/item/gun_control/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) diff --git a/code/game/objects/structures/detectiveboard.dm b/code/game/objects/structures/detectiveboard.dm index 2f9aae546a2..c2f143ced07 100644 --- a/code/game/objects/structures/detectiveboard.dm +++ b/code/game/objects/structures/detectiveboard.dm @@ -40,7 +40,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32) /// Attaching evidences: photo and papers -/obj/structure/detectiveboard/attackby(obj/item/item, mob/user, list/modifiers) +/obj/structure/detectiveboard/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/paper) || istype(item, /obj/item/photo)) if(!cases.len) to_chat(user, "There are no cases!") diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 80ecefe6edd..0b9b9902029 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -125,7 +125,7 @@ . += "[initial(icon_state)]_closed" return -/obj/structure/displaycase/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/structure/displaycase/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(attacking_item.GetID() && !broken) if(allowed(user)) to_chat(user, span_notice("You [open ? "close":"open"] [src].")) @@ -272,7 +272,7 @@ qdel(src) return ITEM_INTERACT_SUCCESS -/obj/structure/displaycase_chassis/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/displaycase_chassis/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/electronics/airlock)) balloon_alert(user, "installing electronics...") if(do_after(user, 3 SECONDS, target = src) && user.transferItemToLoc(attacking_item, src)) @@ -359,7 +359,7 @@ holographic_showpiece = TRUE update_appearance() -/obj/structure/displaycase/trophy/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/displaycase/trophy/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/key/displaycase)) toggle_historian_mode(user) return @@ -609,7 +609,7 @@ return TRUE . = TRUE -/obj/structure/displaycase/forsale/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/displaycase/forsale/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(isidcard(attacking_item)) //Card Registration var/obj/item/card/id/potential_acc = attacking_item diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 3509a4c7125..c8c9cdf058d 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -81,7 +81,7 @@ if(created_name) . += span_notice("There is a small paper placard on the assembly, written on it is '[created_name]'.") -/obj/structure/door_assembly/attackby(obj/item/W, mob/living/user, list/modifiers) +/obj/structure/door_assembly/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) if(IS_WRITING_UTENSIL(W) && !user.combat_mode) var/t = tgui_input_text(user, "Enter the name for the door", "Airlock Renaming", created_name, max_length = MAX_NAME_LEN) if(!t) diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 091cdbd7d9f..11bd9a9080e 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -9,7 +9,7 @@ density = TRUE anchored = TRUE -/obj/structure/dresser/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/dresser/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_WRENCH) to_chat(user, span_notice("You begin to [anchored ? "unwrench" : "wrench"] [src].")) if(I.use_tool(src, user, 20, volume=50)) diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index 2150c5af4ba..d68457f9bae 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -13,7 +13,7 @@ export_to_component = color_atom_overlay(export_to_component) AddComponent(/datum/component/electrified_buckle, (SHOCK_REQUIREMENT_ITEM | SHOCK_REQUIREMENT_LIVE_CABLE | SHOCK_REQUIREMENT_SIGNAL_RECEIVED_TOGGLE), stored_kit, list(export_to_component)) -/obj/structure/chair/e_chair/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/chair/e_chair/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(W.tool_behaviour == TOOL_WRENCH) var/obj/structure/chair/C = new /obj/structure/chair(loc) W.play_tool_sound(src) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index d90fc41c5a5..138dd50a062 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -65,7 +65,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) stored_extinguisher = null update_appearance(UPDATE_ICON) -/obj/structure/extinguisher_cabinet/attackby(obj/item/used_item, mob/living/user, list/modifiers) +/obj/structure/extinguisher_cabinet/attackby(obj/item/used_item, mob/living/user, list/modifiers, list/attack_modifiers) if(used_item.tool_behaviour == TOOL_WRENCH && !stored_extinguisher) user.balloon_alert(user, "deconstructing cabinet...") used_item.play_tool_sound(src) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 2f5a048b4fb..3b061dc3610 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -121,7 +121,7 @@ return ITEM_INTERACT_SUCCESS return -/obj/structure/falsewall/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/falsewall/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(!opening) return ..() to_chat(user, span_warning("You must wait until the door has stopped moving!")) @@ -202,7 +202,7 @@ . = ..() RegisterSignal(src, COMSIG_ATOM_PROPAGATE_RAD_PULSE, PROC_REF(radiate)) -/obj/structure/falsewall/uranium/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/falsewall/uranium/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) radiate() return ..() diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 27e365334c1..d140a2cb6db 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -43,7 +43,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) QDEL_NULL(held_item) return ..() -/obj/structure/fireaxecabinet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/structure/fireaxecabinet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(iscyborg(user) || attacking_item.tool_behaviour == TOOL_MULTITOOL) toggle_lock(user) else if(attacking_item.tool_behaviour == TOOL_WELDER && !user.combat_mode && !broken) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 69171c229e1..4565cd1b09a 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -52,9 +52,7 @@ /// Flags for the flora to determine what kind of sound to play when it gets hit var/flora_flags = NONE -//BUBBER EDIT START - MOVED TO MODULAR -/* -/obj/structure/flora/attackby(obj/item/used_item, mob/living/user, list/modifiers) +/obj/structure/flora/attackby(obj/item/used_item, mob/living/user, list/modifiers, list/attack_modifiers) if(user.combat_mode) return ..() if(flags_1 & HOLOGRAM_1) @@ -95,8 +93,6 @@ if(harvest(user)) after_harvest(user) -*/ -//BUBBER EDIT END /obj/structure/flora/attack_hand(mob/user, list/modifiers) . = ..() diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index ce852fae35e..1ce124dc3c3 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -14,7 +14,7 @@ ///If true, the structure can be deconstructed into a metal sheet with a wrench. var/deconstructible = TRUE -/obj/structure/fluff/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/structure/fluff/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_WRENCH && deconstructible) user.visible_message(span_notice("[user] starts disassembling [src]..."), span_notice("You start disassembling [src]...")) I.play_tool_sound(src) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 8dbb557db31..fc396715219 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -43,7 +43,7 @@ if(GIRDER_TRAM) . += span_notice("[src] is designed for tram usage. Deconstructed with a screwdriver!") -/obj/structure/girder/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/girder/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/construction, SKILL_SPEED_MODIFIER) //SKYRAT EDIT var/platingmodifier = 1 if(HAS_TRAIT(user, TRAIT_QUICK_BUILD)) @@ -456,7 +456,7 @@ smoothing_groups = null canSmoothWith = null -/obj/structure/girder/cult/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/girder/cult/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=1)) @@ -531,7 +531,7 @@ smoothing_groups = null canSmoothWith = null -/obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, list/modifiers) +/obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount = 0, heat_required = HIGH_TEMPERATURE_REQUIRED)) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index f2be71b22b4..d21f7d457ab 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -219,7 +219,7 @@ span_notice("You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor.")) return ITEM_INTERACT_SUCCESS -/obj/structure/grille/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/grille/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) user.changeNext_move(CLICK_CD_MELEE) if(istype(W, /obj/item/stack/rods) && broken && do_after(user, 1 SECONDS, target = src)) if(shock(user, 90)) diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index b67b4d6445d..ca7344d2f24 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -183,7 +183,7 @@ blade_status = GUILLOTINE_BLADE_DROPPED icon_state = "guillotine" -/obj/structure/guillotine/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/guillotine/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if (istype(W, /obj/item/sharpener)) add_fingerprint(user) if (blade_status == GUILLOTINE_BLADE_SHARPENING) diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index 34598abd31f..f1894b1f7aa 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -31,7 +31,7 @@ . += new /mutable_appearance(gun_overlay) . += "[icon_state]_[open ? "open" : "door"]" -/obj/structure/guncase/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/structure/guncase/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(iscyborg(user) || isalien(user)) return if(istype(I, gun_category) && open) diff --git a/code/game/objects/structures/janitor.dm b/code/game/objects/structures/janitor.dm index b8f93821e4f..b0b194d6f1d 100644 --- a/code/game/objects/structures/janitor.dm +++ b/code/game/objects/structures/janitor.dm @@ -28,14 +28,14 @@ return . -/obj/structure/mop_bucket/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/structure/mop_bucket/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/reagent_containers)) update_appearance(UPDATE_OVERLAYS) return FALSE // skip attack animation when refilling cart return ..() -/obj/structure/mop_bucket/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/structure/mop_bucket/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/mop)) if(weapon.reagents.total_volume >= weapon.reagents.maximum_volume) balloon_alert(user, "already soaked!") @@ -182,7 +182,7 @@ return . || NONE -/obj/structure/mop_bucket/janitorialcart/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/mop_bucket/janitorialcart/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/mop)) if(mymop) balloon_alert(user, "already has \a [mymop]!") @@ -248,7 +248,7 @@ update_appearance(UPDATE_OVERLAYS) return ITEM_INTERACT_SUCCESS -/obj/structure/mop_bucket/janitorialcart/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/structure/mop_bucket/janitorialcart/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index aa26f28ad71..58724f3fd70 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -50,7 +50,7 @@ default_unfasten_wrench(user, tool) return TRUE -/obj/structure/kitchenspike_frame/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/kitchenspike_frame/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(!istype(attacking_item, /obj/item/stack/rods)) return ..() diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 2a2fc531d20..95534b28610 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -378,11 +378,11 @@ use(user, going_up = FALSE) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/structure/ladder/attackby(obj/item/item, mob/user, list/modifiers) +/obj/structure/ladder/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) use(user) return TRUE -/obj/structure/ladder/attackby_secondary(obj/item/item, mob/user, list/modifiers) +/obj/structure/ladder/attackby_secondary(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index b29e9f47d21..a98b9ac8f9f 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -62,7 +62,7 @@ /obj/structure/lattice/blob_act(obj/structure/blob/B) return -/obj/structure/lattice/attackby(obj/item/C, mob/user, list/modifiers) +/obj/structure/lattice/attackby(obj/item/C, mob/user, list/modifiers, list/attack_modifiers) if(resistance_flags & INDESTRUCTIBLE) return if(C.tool_behaviour == TOOL_WIRECUTTER) @@ -174,7 +174,7 @@ /obj/structure/lattice/lava/deconstruction_hints(mob/user) return span_notice("The rods look like they could be cut, but the heat treatment will shatter off. There's space for a tile.") -/obj/structure/lattice/lava/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/lattice/lava/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!ismetaltile(attacking_item)) return diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index 52ef0215441..f664ee751c4 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -62,7 +62,7 @@ RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(start_chemming)) return PROCESS_KILL -/obj/structure/geyser/attackby(obj/item/item, mob/user, list/modifiers) +/obj/structure/geyser/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(!istype(item, /obj/item/mining_scanner) && !istype(item, /obj/item/t_scanner/adv_mining_scanner)) playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE) return ..() //this runs the plunger code @@ -143,7 +143,7 @@ ///What layer we set it to var/target_layer = DUCT_LAYER_DEFAULT -/obj/item/plunger/attack_atom(obj/O, mob/living/user, list/modifiers) +/obj/item/plunger/attack_atom(obj/O, mob/living/user, list/modifiers, list/attack_modifiers) if(layer_mode) SEND_SIGNAL(O, COMSIG_MOVABLE_CHANGE_DUCT_LAYER, O, target_layer) return ..() diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 06957908287..ac8417af20b 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -97,7 +97,7 @@ SSore_generation.processed_vents -= src return ..() -/obj/structure/ore_vent/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/ore_vent/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return TRUE diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm index c360534c140..bd3c4ed06e0 100644 --- a/code/game/objects/structures/maintenance.dm +++ b/code/game/objects/structures/maintenance.dm @@ -87,7 +87,7 @@ at the cost of risking a vicious bite.**/ return to_chat(user, span_warning("You find nothing of value...")) -/obj/structure/moisture_trap/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/moisture_trap/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(iscyborg(user) || isalien(user) || !CanReachInside(user)) return ..() add_fingerprint(user) @@ -131,7 +131,7 @@ at the cost of risking a vicious bite.**/ /// Stage of the pants making process var/status = ALTAR_INACTIVE -/obj/structure/destructible/cult/pants_altar/attackby(obj/attacking_item, mob/user, list/modifiers) +/obj/structure/destructible/cult/pants_altar/attackby(obj/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/melee/cultblade/dagger) && IS_CULTIST(user) && status) to_chat(user, span_notice("[src] is creating something, you can't move it!")) return diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 516d990dacb..cc8a561acad 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -276,14 +276,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28) return CONTEXTUAL_SCREENTIP_SET return . -/obj/structure/mirror/attacked_by(obj/item/I, mob/living/user) - if(broken || !istype(user) || !I.force) - return ..() - +/obj/structure/mirror/attacked_by(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() - if(broken) // breaking a mirror truly gets you bad luck! - to_chat(user, span_warning("A chill runs down your spine as [src] shatters...")) - user.AddComponent(/datum/component/omen, incidents_left = 7) + if(broken || !.) // breaking a mirror truly gets you bad luck! + return + to_chat(user, span_warning("A chill runs down your spine as [src] shatters...")) + user.AddComponent(/datum/component/omen, incidents_left = 7) /obj/structure/mirror/bullet_act(obj/projectile/proj) if(broken || !isliving(proj.firer) || !proj.damage) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 03560edc0b7..70d925af3fe 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -559,7 +559,7 @@ GLOBAL_LIST_EMPTY(crematoriums) to_chat(user, span_warning("That's not connected to anything!")) add_fingerprint(user) -/obj/structure/tray/attackby(obj/P, mob/user, list/modifiers) +/obj/structure/tray/attackby(obj/P, mob/user, list/modifiers, list/attack_modifiers) if(!istype(P, /obj/item/riding_offhand)) return ..() diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 7aa278fd65d..c7089e631b7 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -29,7 +29,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32) find_and_hang_on_wall() //attaching papers!! -/obj/structure/noticeboard/attackby(obj/item/O, mob/user, list/modifiers) +/obj/structure/noticeboard/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, /obj/item/paper) || istype(O, /obj/item/photo)) if(!allowed(user)) to_chat(user, span_warning("You are not authorized to add notices!")) diff --git a/code/game/objects/structures/ore_containers.dm b/code/game/objects/structures/ore_containers.dm index 75c7a03cfcf..ba8e59cc78a 100644 --- a/code/game/objects/structures/ore_containers.dm +++ b/code/game/objects/structures/ore_containers.dm @@ -1,7 +1,7 @@ ///structure to contain ores /obj/structure/ore_container -/obj/structure/ore_container/attackby(obj/item/ore, mob/living/carbon/human/user, list/modifiers) +/obj/structure/ore_container/attackby(obj/item/ore, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) if(istype(ore, /obj/item/stack/ore) && !user.combat_mode) ore.forceMove(src) return diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm index c085a86c42c..5baf25200fd 100644 --- a/code/game/objects/structures/plaques/_plaques.dm +++ b/code/game/objects/structures/plaques/_plaques.dm @@ -80,7 +80,7 @@ atom_integrity = max_integrity return TRUE -/obj/structure/plaque/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/plaque/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/pen/fountain)) if(engraved) to_chat(user, span_warning("This plaque has already been engraved.")) @@ -153,7 +153,7 @@ return TRUE -/obj/item/plaque/attackby(obj/item/I, mob/user, list/modifiers) //Same as part of the above, except for the item in hand instead of the structure. +/obj/item/plaque/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) //Same as part of the above, except for the item in hand instead of the structure. if(istype(I, /obj/item/pen/fountain)) if(engraved) to_chat(user, span_warning("This plaque has already been engraved.")) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index a785c0a2b5e..db7570bb216 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -82,7 +82,7 @@ else . += span_notice("The railing is unbolted from the floor and can be deconstructed with wirecutters.") -/obj/structure/railing/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/structure/railing/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) ..() add_fingerprint(user) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index db1eaa8e784..899d3390ddb 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -132,7 +132,7 @@ return ITEM_INTERACT_SUCCESS -/obj/structure/reflector/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/reflector/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(admin) return //Finishing the frame diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index c0578d32566..ec7da473608 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -62,7 +62,7 @@ FLOOR SAFES icon_state = "[initial(icon_state)][open ? null : "_locked"]" return ..() -/obj/structure/safe/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/safe/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(open) . = TRUE //no afterattack if(attacking_item.w_class + space <= maxspace) diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 25a0c154111..83a8ce7fcb7 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -136,7 +136,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) to_chat(user, span_notice("The water temperature seems to be [current_temperature].")) return TRUE -/obj/machinery/shower/attackby(obj/item/tool, mob/user, list/modifiers) +/obj/machinery/shower/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) if(istype(tool, /obj/item/stock_parts/water_recycler)) if(has_water_reclaimer) to_chat(user, span_warning("There is already has a water recycler installed.")) @@ -386,7 +386,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16)) . = ..() AddComponent(/datum/component/simple_rotation) -/obj/structure/showerframe/attackby(obj/item/tool, mob/living/user, list/modifiers) +/obj/structure/showerframe/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(tool, /obj/item/stock_parts/water_recycler)) qdel(tool) var/obj/machinery/shower/shower = new(loc, REVERSE_DIR(dir), TRUE) diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index b128bfbff2a..c3786e81e28 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -84,7 +84,7 @@ atom_integrity = max_integrity return TRUE -/obj/structure/sign/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/sign/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(is_editable && IS_WRITING_UTENSIL(I)) if(!length(GLOB.editable_sign_types)) CRASH("GLOB.editable_sign_types failed to populate") @@ -191,7 +191,7 @@ context[SCREENTIP_CONTEXT_LMB] = "Change design" return CONTEXTUAL_SCREENTIP_SET -/obj/item/sign/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/sign/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(is_editable && IS_WRITING_UTENSIL(I)) if(!length(GLOB.editable_sign_types)) CRASH("GLOB.editable_sign_types failed to populate") diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index 3080e97af44..0a944561508 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -39,7 +39,7 @@ else . += span_notice("It looks like you could probably scan and tag it with a [scanner_descriptor].") -/obj/structure/spawner/attackby(obj/item/item, mob/user, list/modifiers) +/obj/structure/spawner/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return TRUE diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index 3959b205531..cc13ce6a25a 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -238,7 +238,7 @@ /obj/structure/stairs_frame/atom_deconstruct(disassembled = TRUE) new frame_stack(get_turf(src), frame_stack_amount) -/obj/structure/stairs_frame/attackby(obj/item/attacked_by, mob/user, list/modifiers) +/obj/structure/stairs_frame/attackby(obj/item/attacked_by, mob/user, list/modifiers, list/attack_modifiers) if(!isstack(attacked_by)) return ..() if(!anchored) diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 7419c328f2c..aa288c06bf7 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -59,7 +59,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/structure/tank_dispenser/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/structure/tank_dispenser/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) var/full if(istype(I, /obj/item/tank/internals/plasma)) if(plasmatanks < TANK_DISPENSER_CAPACITY) diff --git a/code/game/objects/structures/tank_holder.dm b/code/game/objects/structures/tank_holder.dm index d942f95974f..5a9eb683c5c 100644 --- a/code/game/objects/structures/tank_holder.dm +++ b/code/game/objects/structures/tank_holder.dm @@ -42,7 +42,7 @@ . += "It is empty." . += span_notice("It is held together by some screws.") -/obj/structure/tank_holder/attackby(obj/item/W, mob/living/user, list/modifiers) +/obj/structure/tank_holder/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) if(user.combat_mode) return ..() if(W.tool_behaviour == TOOL_WRENCH) diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm index e132d2b02f0..6d4c8d64ee3 100644 --- a/code/game/objects/structures/toiletbong.dm +++ b/code/game/objects/structures/toiletbong.dm @@ -96,7 +96,7 @@ to_chat(user, span_boldwarning("The [emag_card] falls into the toilet. You fish it back out. Looks like you broke the toilet.")) return TRUE -/obj/structure/toiletbong/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/toiletbong/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/card/emag)) return return ..() diff --git a/code/game/objects/structures/training_machine.dm b/code/game/objects/structures/training_machine.dm index 81095be3c58..f6c12c155f3 100644 --- a/code/game/objects/structures/training_machine.dm +++ b/code/game/objects/structures/training_machine.dm @@ -360,7 +360,7 @@ ///Number of hits made since the Lap button (alt-click) was last pushed var/lap_hits = 0 -/obj/item/training_toolbox/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/training_toolbox/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return . diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 119bb255a09..b938cd82ff2 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -93,7 +93,7 @@ break -/obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(W.tool_behaviour == TOOL_CROWBAR) for(var/obj/structure/transit_tube_pod/P in loc) P.deconstruct(FALSE, user) diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index d4730570480..4991eb9df11 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -32,7 +32,7 @@ if(current_size >= STAGE_FIVE) deconstruct(FALSE) -/obj/structure/transit_tube/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/transit_tube/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(W.tool_behaviour == TOOL_WRENCH) if(tube_construction) for(var/obj/structure/transit_tube_pod/pod in src.loc) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 8fc2efc0a06..fe806662dac 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -27,7 +27,7 @@ icon_state = contents.len ? occupied_icon_state : initial(icon_state) return ..() -/obj/structure/transit_tube_pod/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/transit_tube_pod/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_CROWBAR) if(!moving) I.play_tool_sound(src) diff --git a/code/game/objects/structures/votingbox.dm b/code/game/objects/structures/votingbox.dm index b5227ac896b..f31c8510d31 100644 --- a/code/game/objects/structures/votingbox.dm +++ b/code/game/objects/structures/votingbox.dm @@ -19,7 +19,7 @@ var/list/voted //List of ID's that already voted. COOLDOWN_DECLARE(vote_print_cooldown) -/obj/structure/votebox/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/structure/votebox/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(I,/obj/item/card/id)) if(!owner) register_owner(I,user) diff --git a/code/game/objects/structures/water_structures/sink.dm b/code/game/objects/structures/water_structures/sink.dm index b7a1a66b47f..b40bee8240e 100644 --- a/code/game/objects/structures/water_structures/sink.dm +++ b/code/game/objects/structures/water_structures/sink.dm @@ -105,7 +105,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14)) user.visible_message(span_notice("[user] washes [user.p_their()] [washing_face ? "face" : "hands"] using [src]."), \ span_notice("You wash your [washing_face ? "face" : "hands"] using [src].")) -/obj/structure/sink/attackby(obj/item/O, mob/living/user, list/modifiers) +/obj/structure/sink/attackby(obj/item/O, mob/living/user, list/modifiers, list/attack_modifiers) if(busy) to_chat(user, span_warning("Someone's already washing here!")) return @@ -278,7 +278,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16)) . = ..() AddComponent(/datum/component/simple_rotation) -/obj/structure/sinkframe/attackby(obj/item/tool, mob/living/user, list/modifiers) +/obj/structure/sinkframe/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(tool, /obj/item/stock_parts/water_recycler)) qdel(tool) var/obj/structure/sink/greyscale/new_sink = new(loc, REVERSE_DIR(dir), TRUE) diff --git a/code/game/objects/structures/water_structures/toilet.dm b/code/game/objects/structures/water_structures/toilet.dm index 7c6051e26b4..c2f1ecb848f 100644 --- a/code/game/objects/structures/water_structures/toilet.dm +++ b/code/game/objects/structures/water_structures/toilet.dm @@ -184,7 +184,7 @@ for(var/datum/material/M as anything in custom_materials) new M.sheet_type(loc, FLOOR(custom_materials[M] / SHEET_MATERIAL_AMOUNT, 1)) -/obj/structure/toilet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/structure/toilet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(cover_open && istype(attacking_item, /obj/item/fish)) if(fishes >= 3) diff --git a/code/game/objects/structures/water_structures/urinal.dm b/code/game/objects/structures/water_structures/urinal.dm index 97db0fa2687..23795155db0 100644 --- a/code/game/objects/structures/water_structures/urinal.dm +++ b/code/game/objects/structures/water_structures/urinal.dm @@ -51,7 +51,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) return return ..() -/obj/structure/urinal/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/urinal/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(exposed) if(hidden_item) to_chat(user, span_warning("There is already something in the drain enclosure!")) diff --git a/code/game/objects/structures/water_structures/water_source.dm b/code/game/objects/structures/water_structures/water_source.dm index 678e2509b71..0f2f771612d 100644 --- a/code/game/objects/structures/water_structures/water_source.dm +++ b/code/game/objects/structures/water_structures/water_source.dm @@ -57,7 +57,7 @@ span_notice("You wash your [washing_face ? "face" : "hands"] using [src]."), ) -/obj/structure/water_source/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/structure/water_source/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(busy) to_chat(user, span_warning("Someone's already washing here!")) return @@ -138,7 +138,7 @@ . = ..() icon_state = base_icon_state -/obj/structure/water_source/puddle/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/water_source/puddle/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) icon_state = "[base_icon_state]-splash" . = ..() icon_state = base_icon_state diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 5db6857dc82..62fa00a6457 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -97,7 +97,7 @@ leaving.Bump(src) return COMPONENT_ATOM_BLOCK_EXIT -/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) //I really should have spread this out across more states but thin little windoors are hard to sprite. add_fingerprint(user) switch(state) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 3a1b7e5310f..c7ef0edb806 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -280,7 +280,7 @@ return ITEM_INTERACT_SUCCESS -/obj/structure/window/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/structure/window/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(!can_be_reached(user)) return TRUE //skip the afterattack @@ -513,7 +513,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/unanchored/spawner, 0) return list("delay" = 3 SECONDS, "cost" = 15) return FALSE -/obj/structure/window/reinforced/attackby_secondary(obj/item/tool, mob/user, list/modifiers) +/obj/structure/window/reinforced/attackby_secondary(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) if(resistance_flags & INDESTRUCTIBLE) balloon_alert(user, "too resilient!") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 4d0db93e8a7..9fba7a6bc44 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -395,7 +395,7 @@ GLOBAL_LIST_EMPTY(station_turfs) C.wiringGuiUpdate(user) C.is_empty(user) -/turf/attackby(obj/item/C, mob/user, list/modifiers) +/turf/attackby(obj/item/C, mob/user, list/modifiers, list/attack_modifiers) if(..()) return TRUE if(can_lay_cable() && istype(C, /obj/item/stack/cable_coil)) diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm index 85c2fd96d2b..6c442f4c77e 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm @@ -356,7 +356,6 @@ Return to step 11 of normal process."} affect_cyborg = is_stun_mode log_stun_attack = is_stun_mode // other modes have their own log entries. - stun_animation = is_stun_or_sleep on_stun_sound = is_stun_or_sleep ? 'sound/items/weapons/egloves.ogg' : null to_chat(usr, span_notice("You switch the baton to [txt] mode.")) @@ -378,16 +377,16 @@ Return to step 11 of normal process."} icon_state = "wonderprodProbe" inhand_icon_state = "wonderprodProbe" -/obj/item/melee/baton/abductor/baton_attack(mob/target, mob/living/user, modifiers) +/obj/item/melee/baton/abductor/can_baton(mob/living/target, mob/living/user) if(!AbductorCheck(user)) - return BATON_ATTACK_DONE + return TRUE return ..() /obj/item/melee/baton/abductor/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) switch (mode) if(BATON_STUN) target.visible_message(span_danger("[user] stuns [target] with [src]!"), - span_userdanger("[user] stuns you with [src]!")) + span_userdanger("[user] stuns you with [src]!"), visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE) target.set_jitter_if_lower(40 SECONDS) target.set_confusion_if_lower(10 SECONDS) target.set_stutter_if_lower(16 SECONDS) diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm index 4030d8676ac..96ba94170c8 100644 --- a/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm +++ b/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm @@ -17,7 +17,7 @@ return return ..() -/obj/structure/sign/poster/abductor/attackby(obj/item/tool, mob/user, list/modifiers) +/obj/structure/sign/poster/abductor/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) if(tool.toolspeed >= 0.2) balloon_alert(user, "tool too weak!") return FALSE diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index bc57d99df4e..dd3abe6994a 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -266,7 +266,7 @@ vest = V return TRUE -/obj/machinery/abductor/console/attackby(obj/O, mob/user, list/modifiers) +/obj/machinery/abductor/console/attackby(obj/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, /obj/item/abductor/gizmo) && AddGizmo(O)) to_chat(user, span_notice("You link the tool to the console.")) else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O)) diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm index a97c3a407a4..bd6cc36e5ba 100644 --- a/code/modules/antagonists/abductor/machinery/dispenser.dm +++ b/code/modules/antagonists/abductor/machinery/dispenser.dm @@ -61,7 +61,7 @@ Dispense(gland_id) return TRUE -/obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/organ/heart/gland)) if(!user.transferItemToLoc(W, src)) return diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index de8486760ea..34f9989f80c 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -242,7 +242,7 @@ /obj/structure/blob/hulk_damage() return 15 -/obj/structure/blob/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/blob/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_ANALYZER) user.changeNext_move(CLICK_CD_MELEE) to_chat(user, "The analyzer beeps once, then reports:
") diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index b04def466a7..e639f5f9ae7 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -224,7 +224,7 @@ effectiveness = 80, \ ) -/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(istype(target, /obj/structure/table)) var/obj/smash = target smash.deconstruct(FALSE) @@ -642,7 +642,7 @@ . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) -/obj/item/clothing/head/helmet/changeling_hivehead/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/clothing/head/helmet/changeling_hivehead/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!istype(attacking_item, /obj/item/organ/monster_core/regenerative_core/legion) || !holds_reagents) return diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index f2b5e0603c2..c66df8215ca 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -133,7 +133,7 @@ var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(src, hit_atom) -/obj/item/melee/energy/sword/bananium/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/item/melee/energy/sword/bananium/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(COOLDOWN_FINISHED(src, next_trombone_allowed) && istype(weapon, /obj/item/melee/energy/sword/bananium)) COOLDOWN_START(src, next_trombone_allowed, 5 SECONDS) to_chat(user, span_warning("You slap the two swords together. Sadly, they do not seem to fit!")) diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm index 5aae01c4500..42aafd03aad 100644 --- a/code/modules/antagonists/heretic/influences.dm +++ b/code/modules/antagonists/heretic/influences.dm @@ -206,7 +206,7 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/effect/heretic_influence/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/effect/heretic_influence/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index b59741c259a..cd695587ca3 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -41,7 +41,7 @@ /obj/item/melee/sickly_blade/proc/check_usability(mob/living/user) return IS_HERETIC_OR_MONSTER(user) -/obj/item/melee/sickly_blade/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/melee/sickly_blade/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return . @@ -89,7 +89,7 @@ playsound(src, SFX_SHATTER, 70, TRUE) //copied from the code for smashing a glass sheet onto the ground to turn it into a shard qdel(src) -/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) SEND_SIGNAL(user, COMSIG_HERETIC_BLADE_ATTACK, target, src) /obj/item/melee/sickly_blade/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) @@ -163,7 +163,7 @@ ///If our blade is currently infused with the mansus grasp var/infused = FALSE -/obj/item/melee/sickly_blade/dark/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/melee/sickly_blade/dark/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!infused || target == user || !isliving(target)) return diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index 51cd16632f3..5bf63652ec9 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -157,7 +157,7 @@ // How much damage does this item do to the targets sanity? var/sanity_damage = 20 -/obj/item/clothing/neck/heretic_focus/moon_amulet/attack(mob/living/target, mob/living/user, list/modifiers) +/obj/item/clothing/neck/heretic_focus/moon_amulet/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) var/mob/living/carbon/human/hit = target if(!IS_HERETIC_OR_MONSTER(user)) user.balloon_alert(user, "you feel a presence watching you") diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 2b85a5b7091..759f77a2adc 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -289,15 +289,8 @@ offand_force_decrement += 2 hits_to_crit_on_average = ROUND_UP(100 / (blade.force * 2 - offand_force_decrement)) - // Save the force as our last weapon force - last_weapon_force = blade.force - // Subtract the decrement, but only if the target is living - if(isliving(target)) - blade.force -= offand_force_decrement // Perform the offhand attack - blade.melee_attack_chain(source, target) - // Restore the force. - blade.force = last_weapon_force + blade.melee_attack_chain(source, target, null, list(FORCE_MODIFIER = -offand_force_decrement)) ///Modifies our blade demolition modifier so we can take down doors with it /datum/heretic_knowledge/blade_upgrade/blade/proc/on_blade_equipped(mob/user, obj/item/equipped, slot) diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm index e444e5a639f..5b2f8743691 100644 --- a/code/modules/antagonists/heretic/structures/carving_knife.dm +++ b/code/modules/antagonists/heretic/structures/carving_knife.dm @@ -189,13 +189,14 @@ return return ..() -/obj/structure/trap/eldritch/attacked_by(obj/item/weapon, mob/living/user) - if(istype(weapon, /obj/item/melee/rune_carver) || istype(weapon, /obj/item/nullrod)) +/obj/structure/trap/eldritch/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/melee/rune_carver) || istype(tool, /obj/item/nullrod)) loc.balloon_alert(user, "carving dispelled") playsound(src, 'sound/items/sheath.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE) qdel(src) + return ITEM_INTERACT_SUCCESS - return ..() + return NONE /obj/structure/trap/eldritch/alert name = "alert carving" diff --git a/code/modules/antagonists/heretic/structures/mawed_crucible.dm b/code/modules/antagonists/heretic/structures/mawed_crucible.dm index 67dfc47b7df..63a6b4c33f3 100644 --- a/code/modules/antagonists/heretic/structures/mawed_crucible.dm +++ b/code/modules/antagonists/heretic/structures/mawed_crucible.dm @@ -77,37 +77,37 @@ /obj/structure/destructible/eldritch_crucible/rust_heretic_act() return -/obj/structure/destructible/eldritch_crucible/attacked_by(obj/item/weapon, mob/living/user) - if(!iscarbon(user)) - return ..() - - if(!IS_HERETIC_OR_MONSTER(user)) - bite_the_hand(user) - return TRUE - - if(isbodypart(weapon)) - - var/obj/item/bodypart/consumed = weapon +/obj/structure/destructible/eldritch_crucible/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(isbodypart(tool)) + var/obj/item/bodypart/consumed = tool if(!IS_ORGANIC_LIMB(consumed)) balloon_alert(user, "not organic!") - return - + return ITEM_INTERACT_BLOCKING + if(!IS_HERETIC_OR_MONSTER(user)) + if(user.combat_mode) + return ITEM_INTERACT_SKIP_TO_ATTACK + bite_the_hand(user) + return ITEM_INTERACT_SUCCESS consume_fuel(user, consumed) - return TRUE + return ITEM_INTERACT_SUCCESS - if(isorgan(weapon)) - var/obj/item/organ/consumed = weapon + if(isorgan(tool)) + var/obj/item/organ/consumed = tool if(!IS_ORGANIC_ORGAN(consumed)) balloon_alert(user, "not organic!") - return + return ITEM_INTERACT_BLOCKING if(consumed.organ_flags & ORGAN_VITAL) // Basically, don't eat organs like brains balloon_alert(user, "invalid organ!") - return - + return ITEM_INTERACT_BLOCKING + if(!IS_HERETIC_OR_MONSTER(user)) + if(user.combat_mode) + return ITEM_INTERACT_SKIP_TO_ATTACK + bite_the_hand(user) + return ITEM_INTERACT_SUCCESS consume_fuel(user, consumed) - return TRUE + return ITEM_INTERACT_SUCCESS - return ..() + return NONE /obj/structure/destructible/eldritch_crucible/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(istype(tool, /obj/item/codex_cicatrix) || istype(tool, /obj/item/melee/touch_attack/mansus_fist)) @@ -213,7 +213,7 @@ if(QDELETED(arm)) return - to_chat(user, span_userdanger("[src] grabs your [arm.name]!")) + to_chat(user, span_userdanger("[src] grabs your [arm.plaintext_zone]!")) arm.dismember() consume_fuel(consumed = arm) diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index 7748f3e4226..535e11854bf 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -48,7 +48,7 @@ UnregisterSignal(user, COMSIG_MOB_AFTER_EXIT_JAUNT) remove_crit() -/obj/item/light_eater/attack(mob/living/target, mob/living/user, list/modifiers) +/obj/item/light_eater/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(!has_crit) return diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm index 3c2dcaa0cff..8b33de2e49b 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm @@ -82,7 +82,7 @@ return discover_after -/obj/item/disk/nuclear/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/item/disk/nuclear/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/claymore/highlander) && !fake) var/obj/item/claymore/highlander/claymore = weapon if(claymore.nuke_disk) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm index f04dabe7874..73a29a1380a 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm @@ -108,7 +108,7 @@ GLOBAL_VAR(station_nuke_source) return TRUE -/obj/machinery/nuclearbomb/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/nuclearbomb/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if (istype(weapon, /obj/item/disk/nuclear)) if(!disk_check(weapon)) return TRUE diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm index c09b02ff224..f2cc848a8b3 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm @@ -27,7 +27,7 @@ else . += span_danger("It's empty.") -/obj/machinery/nuclearbomb/beer/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/nuclearbomb/beer/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(weapon.is_refillable()) weapon.interact_with_atom(keg, user) // redirect refillable containers to the keg, allowing them to be filled return TRUE // pretend we handled the attack, too. diff --git a/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm b/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm index 9f050c565d7..44fbc63c850 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm @@ -54,7 +54,7 @@ . += span_notice("Sharpness: [round(force)]/[initial(force)]") . += span_notice("Wall Conversions remaining: [conversions_remaining ? conversions_remaining : "None! You must resharpen your blade!"]") -/obj/item/void_eater/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/void_eater/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) if(!ishuman(target_mob)) return ..() diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 440d52a9275..bee49757a18 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -63,7 +63,7 @@ qdel(src) return PROCESS_KILL -/obj/effect/rend/attackby(obj/item/I, mob/user, list/modifiers) +/obj/effect/rend/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/nullrod)) user.visible_message(span_danger("[user] seals \the [src] with \the [I].")) qdel(src) diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 3a7330e3af7..b76b300446c 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -318,7 +318,7 @@ if(IS_CULTIST(user) || HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED) || user.stat == DEAD) . += extra_desc -/obj/structure/constructshell/attackby(obj/item/O, mob/user, list/modifiers) +/obj/structure/constructshell/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, /obj/item/soulstone)) var/obj/item/soulstone/SS = O if(!IS_CULTIST(user) && !HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED) && !SS.theme == THEME_HOLY) diff --git a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm index c7f553a4c1d..a69492bab16 100644 --- a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm @@ -74,7 +74,7 @@ return ..() -/obj/item/spellbook/attackby(obj/item/O, mob/user, list/modifiers) +/obj/item/spellbook/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) // This can be generalized in the future, but for now it stays if(istype(O, /obj/item/antag_spawner/contract)) var/datum/spellbook_entry/item/contract/contract_entry = locate() in entries diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index 6d12be2c0f7..d6cc060a1c6 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -15,7 +15,7 @@ var/obj/item/canvas/painting = null //Adding canvases -/obj/structure/easel/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/easel/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/canvas)) var/obj/item/canvas/canvas = I user.dropItemToGround(canvas) @@ -135,7 +135,7 @@ ui = new(user, src, "Canvas", name) ui.open() -/obj/item/canvas/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/item/canvas/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(!user.combat_mode) ui_interact(user) else @@ -719,7 +719,7 @@ . = ..() SSpersistent_paintings.painting_frames -= src -/obj/structure/sign/painting/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/sign/painting/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!current_canvas && istype(I, /obj/item/canvas)) frame_canvas(user,I) else if(current_canvas && current_canvas.painting_metadata.title == initial(current_canvas.painting_metadata.title) && istype(I,/obj/item/pen)) diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index e083d1f6523..2a0c1ce4507 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -33,7 +33,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/structure/statue/attackby(obj/item/W, mob/living/user, list/modifiers) +/obj/structure/statue/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED)) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 4f35fda4634..4a8e1b9dbc0 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -118,7 +118,7 @@ return . = ..() -/obj/item/assembly/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/assembly/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(isassembly(attacking_item)) var/obj/item/assembly/new_assembly = attacking_item // Check both our's and their's assembly flags to see if either should not duplicate diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 17a80cfb0fe..5501843d318 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -289,7 +289,7 @@ ..() new /obj/effect/temp_visual/borgflash(get_turf(src)) -/obj/item/assembly/flash/cyborg/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/assembly/flash/cyborg/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) return /obj/item/assembly/flash/cyborg/screwdriver_act(mob/living/user, obj/item/I) return diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 526e9c91b03..5fd30faa3a5 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -134,7 +134,7 @@ for(var/obj/item/assembly/assembly as anything in assemblies) assembly.attack_hand(user, modifiers) // Note override in assembly.dm to prevent side effects here -/obj/item/assembly_holder/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/item/assembly_holder/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(isassembly(weapon)) try_add_assembly(weapon, user) return diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index b326e9197fd..751585d439b 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -120,7 +120,7 @@ update_appearance() -/obj/item/assembly/signaler/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/assembly/signaler/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(issignaler(W)) var/obj/item/assembly/signaler/signaler2 = W if(secured && signaler2.secured) @@ -182,7 +182,7 @@ /obj/item/assembly/signaler/cyborg -/obj/item/assembly/signaler/cyborg/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/assembly/signaler/cyborg/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) return /obj/item/assembly/signaler/cyborg/screwdriver_act(mob/living/user, obj/item/I) return @@ -193,7 +193,7 @@ /obj/item/assembly/signaler/internal/ui_state(mob/user) return GLOB.inventory_state -/obj/item/assembly/signaler/internal/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/assembly/signaler/internal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) return /obj/item/assembly/signaler/internal/screwdriver_act(mob/living/user, obj/item/I) diff --git a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm index 98b5c7ece7e..67d2ba9fdc0 100644 --- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm @@ -100,7 +100,7 @@ if((buildstage == AIR_ALARM_BUILD_COMPLETE)) new /obj/item/stack/cable_coil(loc, 3) -/obj/machinery/airalarm/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/airalarm/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) update_last_used(user) switch(buildstage) if(AIR_ALARM_BUILD_COMPLETE) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 88c7a32541f..cad21032ec8 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -403,7 +403,7 @@ nodes[nodes.Find(reference)] = null update_appearance() -/obj/machinery/atmospherics/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/atmospherics/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/pipe)) //lets you autodrop var/obj/item/pipe/pipe = W if(user.dropItemToGround(pipe)) diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm index d8105c1b344..94cb05e1b8b 100644 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm +++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm @@ -160,7 +160,7 @@ /obj/machinery/electrolyzer/crowbar_act(mob/living/user, obj/item/tool) return default_deconstruction_crowbar(tool) -/obj/machinery/electrolyzer/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/electrolyzer/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(istype(I, /obj/item/stock_parts/power_store/cell)) if(!panel_open) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm index 31908e6375c..73847953743 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm @@ -34,7 +34,7 @@ . = ..() . += span_notice("[src] can be rotated by first opening the panel with a screwdriver and then using a wrench on it.") -/obj/machinery/atmospherics/components/unary/hypertorus/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/atmospherics/components/unary/hypertorus/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!fusion_started) if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_off, I)) return @@ -128,7 +128,7 @@ . = ..() . += span_notice("[src] can be rotated by first opening the panel with a screwdriver and then using a wrench on it.") -/obj/machinery/hypertorus/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/hypertorus/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!fusion_started) if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_off, I)) return diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm index 830509ac10f..4c8e9ecb787 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm @@ -58,7 +58,7 @@ context[SCREENTIP_CONTEXT_RMB] = "Rotate" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/atmospherics/components/binary/crystallizer/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/atmospherics/components/binary/crystallizer/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!on) if(default_deconstruction_screwdriver(user, "[base_icon_state]-open", "[base_icon_state]-off", I)) return diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 44961cd0949..272fff1ddb8 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -543,7 +543,7 @@ if(TANK_PLATING_UNSECURED) icon_state = "plated_frame" -/obj/structure/tank_frame/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/structure/tank_frame/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(construction_state == TANK_FRAME && isstack(item) && add_plating(user, item)) return return ..() diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index bd65168fdfd..8f77d733653 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -89,7 +89,7 @@ return air_temporary.remove(amount) return parent.air.remove(amount) -/obj/machinery/atmospherics/pipe/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/atmospherics/pipe/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/pipe_meter)) var/obj/item/pipe_meter/meter = item user.dropItemToGround(meter) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 947f0fe385a..684e5e1e5c4 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -363,7 +363,7 @@ if(internal_cell) internal_cell.forceMove(drop_location()) -/obj/machinery/portable_atmospherics/canister/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/portable_atmospherics/canister/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/stock_parts/power_store/cell)) var/obj/item/stock_parts/power_store/cell/active_cell = item if(!panel_open) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 9de5e8a0d5f..f9020860edf 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -9,6 +9,7 @@ anchored = FALSE layer = ABOVE_OBJ_LAYER interaction_flags_click = NEED_DEXTERITY + damage_deflection = 11 ///Stores the gas mixture of the portable component. Don't access this directly, use return_air() so you support the temporary processing it provides var/datum/gas_mixture/air_contents @@ -253,7 +254,7 @@ update_appearance() return TRUE -/obj/machinery/portable_atmospherics/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/portable_atmospherics/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/tank)) return replace_tank(user, FALSE, item) return ..() @@ -287,13 +288,20 @@ investigate_log("was connected to [possible_port] by [key_name(user)].", INVESTIGATE_ATMOS) return TRUE +/obj/machinery/portable_atmospherics/atom_break(damage_flag) + . = ..() + damage_deflection = 0 + +/obj/machinery/portable_atmospherics/atom_fix() + . = ..() + damage_deflection = initial(damage_deflection) + /obj/machinery/portable_atmospherics/attacked_by(obj/item/item, mob/user) - if(item.force < 10 && !(machine_stat & BROKEN)) - take_damage(0) + . = ..() + if(!.) return investigate_log("was smacked with \a [item] by [key_name(user)].", INVESTIGATE_ATMOS) - add_fingerprint(user) - return ..() + add_hiddenprint(user) /// Holding tanks can get to zero integrity and be destroyed without other warnings due to pressure change. /// This checks for that case and removes our reference to it. diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index 8470311721a..94c71287eef 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -30,7 +30,7 @@ else to_chat(user, "Nothing happens. You feel that this is a bad sign.") -/obj/structure/signpost/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/signpost/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) return interact(user) /obj/structure/signpost/attack_paw(mob/user, list/modifiers) diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index 4f0262625a9..6d338e5ec26 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -90,7 +90,7 @@ speaking = FALSE times_spoken_to++ -/obj/structure/speaking_tile/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/speaking_tile/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) return interact(user) /obj/structure/speaking_tile/attack_paw(mob/user, list/modifiers) diff --git a/code/modules/basketball/basketball.dm b/code/modules/basketball/basketball.dm index 64f3ea34f67..919d26daeee 100644 --- a/code/modules/basketball/basketball.dm +++ b/code/modules/basketball/basketball.dm @@ -149,7 +149,7 @@ user.balloon_alert_to_viewers("fumbles the ball") -/obj/item/toy/basketball/attack(mob/living/carbon/target, mob/living/user, list/modifiers) +/obj/item/toy/basketball/attack(mob/living/carbon/target, mob/living/user, list/modifiers, list/attack_modifiers) if(!iscarbon(target) || user.combat_mode) return ..() diff --git a/code/modules/basketball/hoop.dm b/code/modules/basketball/hoop.dm index 501942ec863..830bde426f7 100644 --- a/code/modules/basketball/hoop.dm +++ b/code/modules/basketball/hoop.dm @@ -89,7 +89,7 @@ scoreboard.add_overlay(tens_overlay) scoreboard.add_overlay(emissive_tens_overlay) -/obj/structure/hoop/attackby(obj/item/ball, mob/living/baller, list/modifiers) +/obj/structure/hoop/attackby(obj/item/ball, mob/living/baller, list/modifiers, list/attack_modifiers) if(!baller.can_perform_action(src, NEED_HANDS|FORBID_TELEKINESIS_REACH)) return // TK users aren't allowed to dunk diff --git a/code/modules/bitrunning/server/_parent.dm b/code/modules/bitrunning/server/_parent.dm index 70a5deb7441..281b80c2148 100644 --- a/code/modules/bitrunning/server/_parent.dm +++ b/code/modules/bitrunning/server/_parent.dm @@ -123,7 +123,7 @@ return ..() -/obj/machinery/quantum_server/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/quantum_server/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!istype(weapon, /obj/item/bitrunning_debug)) diff --git a/code/modules/capture_the_flag/ctf_game.dm b/code/modules/capture_the_flag/ctf_game.dm index 9dd0b8f31fc..d30ab87f0a6 100644 --- a/code/modules/capture_the_flag/ctf_game.dm +++ b/code/modules/capture_the_flag/ctf_game.dm @@ -171,7 +171,7 @@ player_mob.add_traits(player_traits, CAPTURE_THE_FLAG_TRAIT) return player_mob //used in medisim_game.dm -/obj/machinery/ctf/spawner/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/ctf/spawner/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/ctf_flag)) var/obj/item/ctf_flag/flag = item if(flag.team != team) @@ -268,7 +268,7 @@ user.set_anchored(TRUE) user.status_flags &= ~CANPUSH -/obj/item/ctf_flag/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/ctf_flag/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(!istype(item, /obj/item/ctf_flag)) return ..() @@ -367,7 +367,7 @@ scores += UNLINT("[ctf_team.team_color] - [ctf_team.points]/[ctf_game.points_to_win]\n") balloon_alert_to_viewers(scores) -/obj/machinery/ctf/control_point/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/ctf/control_point/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) capture(user) /obj/machinery/ctf/control_point/attack_hand(mob/user, list/modifiers) diff --git a/code/modules/cards/cardhand.dm b/code/modules/cards/cardhand.dm index cedb421f334..e54d004882d 100644 --- a/code/modules/cards/cardhand.dm +++ b/code/modules/cards/cardhand.dm @@ -91,7 +91,7 @@ return ..() -/obj/item/toy/cards/cardhand/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/item/toy/cards/cardhand/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) attackby(weapon, user, modifiers, flip_card = TRUE) return SECONDARY_ATTACK_CONTINUE_CHAIN diff --git a/code/modules/cards/deck/deck.dm b/code/modules/cards/deck/deck.dm index 55c2a1d31fa..03c92e4ce6f 100644 --- a/code/modules/cards/deck/deck.dm +++ b/code/modules/cards/deck/deck.dm @@ -177,7 +177,7 @@ card.Flip(CARD_FACEDOWN) . = ..() -/obj/item/toy/cards/deck/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/item/toy/cards/deck/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/toy/singlecard) || istype(item, /obj/item/toy/cards/cardhand)) insert(item) var/card_grammar = istype(item, /obj/item/toy/singlecard) ? "card" : "cards" diff --git a/code/modules/cards/singlecard.dm b/code/modules/cards/singlecard.dm index 8693fc5c0f1..92a2d921b31 100644 --- a/code/modules/cards/singlecard.dm +++ b/code/modules/cards/singlecard.dm @@ -219,7 +219,7 @@ return return ..() -/obj/item/toy/singlecard/attackby_secondary(obj/item/item, mob/living/user, list/modifiers) +/obj/item/toy/singlecard/attackby_secondary(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) attackby(item, user, modifiers, flip_card=TRUE) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm index 4dcb9076b54..8c137835f7d 100644 --- a/code/modules/cargo/coupon.dm +++ b/code/modules/cargo/coupon.dm @@ -112,7 +112,7 @@ visible_message(span_warning("[src] burns up in a sinister flash, taking an evil energy with it...")) burn() -/obj/item/coupon/attack_atom(obj/O, mob/living/user, list/modifiers) +/obj/item/coupon/attack_atom(obj/O, mob/living/user, list/modifiers, list/attack_modifiers) if(!istype(O, /obj/machinery/computer/cargo)) return ..() if(discount_pct_off == COUPON_OMEN) diff --git a/code/modules/cargo/materials_market.dm b/code/modules/cargo/materials_market.dm index 26520805b36..4eac999980f 100644 --- a/code/modules/cargo/materials_market.dm +++ b/code/modules/cargo/materials_market.dm @@ -55,7 +55,7 @@ if(default_deconstruction_crowbar(tool)) return ITEM_INTERACT_SUCCESS -/obj/machinery/materials_market/attackby(obj/item/markable_object, mob/user, list/modifiers) +/obj/machinery/materials_market/attackby(obj/item/markable_object, mob/user, list/modifiers, list/attack_modifiers) if(is_type_in_list(markable_object, exportable_material_items)) if(machine_stat & NOPOWER) balloon_alert(user, "no power!") diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 2f62ea76560..c7f6eff740b 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -44,13 +44,12 @@ can_approve_requests = FALSE requestonly = TRUE -/obj/machinery/computer/cargo/attacked_by(obj/item/I, mob/living/user) - if(istype(I,/obj/item/trade_chip)) - var/obj/item/trade_chip/contract = I - contract.try_to_unlock_contract(user) - return TRUE - else - return ..() +/obj/machinery/computer/cargo/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/trade_chip)) + return NONE + var/obj/item/trade_chip/contract = tool + contract.try_to_unlock_contract(user) + return ITEM_INTERACT_SUCCESS /obj/machinery/computer/cargo/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) diff --git a/code/modules/cargo/universal_scanner.dm b/code/modules/cargo/universal_scanner.dm index bf572af5591..01d9f4e7f55 100644 --- a/code/modules/cargo/universal_scanner.dm +++ b/code/modules/cargo/universal_scanner.dm @@ -69,7 +69,7 @@ return ITEM_INTERACT_SUCCESS return NONE -/obj/item/universal_scanner/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/universal_scanner/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(scanning_mode == SCAN_SALES_TAG && isidcard(attacking_item)) var/obj/item/card/id/potential_acc = attacking_item diff --git a/code/modules/clothing/belts/polymorph_belt.dm b/code/modules/clothing/belts/polymorph_belt.dm index cedd161959a..07740888a9a 100644 --- a/code/modules/clothing/belts/polymorph_belt.dm +++ b/code/modules/clothing/belts/polymorph_belt.dm @@ -61,7 +61,7 @@ qdel(tool) return ITEM_INTERACT_SUCCESS -/obj/item/polymorph_belt/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/polymorph_belt/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if (.) return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 7b493d3712c..e492c2504f6 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -103,7 +103,7 @@ else qdel(src) -/obj/item/clothing/attack(mob/living/target, mob/living/user, list/modifiers) +/obj/item/clothing/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) if(user.combat_mode || !ismoth(target) || ispickedupmob(src)) return ..() if((clothing_flags & INEDIBLE_CLOTHING) || (resistance_flags & INDESTRUCTIBLE)) diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 93fa2e6d0f1..f1feb7165ff 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -73,7 +73,7 @@ return FALSE // We don't want to cut dyed gloves. return TRUE -/obj/item/clothing/gloves/attackby(obj/item/tool, mob/user, list/modifiers) +/obj/item/clothing/gloves/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index b1672d083d3..c9c1aa8197d 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -45,7 +45,7 @@ . = ..() AddComponent(/datum/component/seclite_attachable, light_icon_state = "flight") -/obj/item/clothing/head/helmet/sec/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/clothing/head/helmet/sec/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(issignaler(attacking_item)) var/obj/item/assembly/signaler/attached_signaler = attacking_item // There's a flashlight in us. Remove it first, or it'll be lost forever! diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index d442c6ddcc7..0a769fa0ca2 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -312,7 +312,7 @@ return . -/obj/item/clothing/head/fedora/inspector_hat/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/clothing/head/fedora/inspector_hat/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(LAZYLEN(contents) >= max_items) diff --git a/code/modules/clothing/head/tophat.dm b/code/modules/clothing/head/tophat.dm index 36984e0c4fe..1efa8210db7 100644 --- a/code/modules/clothing/head/tophat.dm +++ b/code/modules/clothing/head/tophat.dm @@ -10,7 +10,7 @@ /// Cooldown for how often we can pull rabbits out of here COOLDOWN_DECLARE(rabbit_cooldown) -/obj/item/clothing/head/hats/tophat/attackby(obj/item/hitby_item, mob/user, list/modifiers) +/obj/item/clothing/head/hats/tophat/attackby(obj/item/hitby_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(istype(hitby_item, /obj/item/gun/magic/wand)) abracadabra(hitby_item, user) diff --git a/code/modules/clothing/masks/muzzle.dm b/code/modules/clothing/masks/muzzle.dm index c13d29edf31..b9b2460167c 100644 --- a/code/modules/clothing/masks/muzzle.dm +++ b/code/modules/clothing/masks/muzzle.dm @@ -73,7 +73,7 @@ INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, emote), "scream") to_chat(user, span_userdanger("You feel a massive pain as hundreds of tiny spikes tear free from your face!")) -/obj/item/clothing/mask/muzzle/tape/attack(mob/living/carbon/victim, mob/living/carbon/attacker, list/modifiers) +/obj/item/clothing/mask/muzzle/tape/attack(mob/living/carbon/victim, mob/living/carbon/attacker, list/modifiers, list/attack_modifiers) if(attacker.combat_mode) return ..() if(victim.is_mouth_covered(ITEM_SLOT_HEAD)) diff --git a/code/modules/clothing/neck/collar_bomb.dm b/code/modules/clothing/neck/collar_bomb.dm index dd0d4fcf9d2..10450f53c94 100644 --- a/code/modules/clothing/neck/collar_bomb.dm +++ b/code/modules/clothing/neck/collar_bomb.dm @@ -38,7 +38,7 @@ return . += span_tinynotice("It has a [EXAMINE_HINT("wire")] panel that could be interacted with...") -/obj/item/clothing/neck/collar_bomb/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/clothing/neck/collar_bomb/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(is_wire_tool(item)) wires.interact(user) else diff --git a/code/modules/clothing/shoes/sneakers.dm b/code/modules/clothing/shoes/sneakers.dm index 31f6f7f44b2..9dc902b0143 100644 --- a/code/modules/clothing/shoes/sneakers.dm +++ b/code/modules/clothing/shoes/sneakers.dm @@ -143,13 +143,13 @@ return return ..() -/obj/item/clothing/shoes/sneakers/orange/pre_attack(atom/movable/attacking_movable, mob/living/user, list/modifiers) +/obj/item/clothing/shoes/sneakers/orange/pre_attack(atom/movable/attacking_movable, mob/living/user, list/modifiers, list/attack_modifiers) if(attached_cuffs || attacking_movable.type != /obj/item/restraints/handcuffs) return ..() attacking_movable.forceMove(src) return TRUE -/obj/item/clothing/shoes/sneakers/orange/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/clothing/shoes/sneakers/orange/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(attached_cuffs || attacking_item.type != /obj/item/restraints/handcuffs) // Note: not using istype here because we want to ignore all subtypes return ..() attacking_item.forceMove(src) diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index cb74fc7a726..5cafbeb13fd 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -218,7 +218,7 @@ return ITEM_INTERACT_SUCCESS // object handling for accessing features of the suit -/obj/item/clothing/suit/space/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/clothing/suit/space/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!cell_cover_open || !istype(I, /obj/item/stock_parts/power_store/cell)) return ..() if(cell) diff --git a/code/modules/clothing/spacesuits/softsuit.dm b/code/modules/clothing/spacesuits/softsuit.dm index 13cb9090c95..445af2ea1b6 100644 --- a/code/modules/clothing/spacesuits/softsuit.dm +++ b/code/modules/clothing/spacesuits/softsuit.dm @@ -52,7 +52,7 @@ . = ..() . += span_notice("You can start constructing a critter sized mecha with a [span_bold("cyborg leg")].") -/obj/item/clothing/head/helmet/space/eva/attackby(obj/item/attacked_with, mob/user, list/modifiers) +/obj/item/clothing/head/helmet/space/eva/attackby(obj/item/attacked_with, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index f5726555feb..cf2dc9a0072 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -112,7 +112,7 @@ blood_overlay.color = get_blood_dna_color(GET_ATOM_BLOOD_DNA(src)) . += blood_overlay -/obj/item/clothing/under/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/clothing/under/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(repair_sensors(attacking_item, user)) return TRUE diff --git a/code/modules/economy/holopay.dm b/code/modules/economy/holopay.dm index e9f385c4046..45eb59c8135 100644 --- a/code/modules/economy/holopay.dm +++ b/code/modules/economy/holopay.dm @@ -74,7 +74,7 @@ linked_card = null return ..() -/obj/structure/holopay/attackby(obj/item/held_item, mob/item_holder, list/modifiers) +/obj/structure/holopay/attackby(obj/item/held_item, mob/item_holder, list/modifiers, list/attack_modifiers) var/mob/living/user = item_holder if(!isliving(user)) return ..() @@ -115,7 +115,7 @@ return TRUE return ..() -/obj/structure/holopay/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/structure/holopay/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) /// Can kill it by right-clicking with ID because it seems useful and intuitive, to me, at least if(!isidcard(weapon)) return ..() diff --git a/code/modules/events/space_vines/vine_structure.dm b/code/modules/events/space_vines/vine_structure.dm index 78d0d0e8e35..da56c5359b8 100644 --- a/code/modules/events/space_vines/vine_structure.dm +++ b/code/modules/events/space_vines/vine_structure.dm @@ -30,6 +30,7 @@ /obj/structure/spacevine/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_CHASM_DESTROYED, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_INVERTED_DEMOLITION, INNATE_TRAIT) add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY) var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), @@ -80,16 +81,14 @@ if(!override) qdel(src) -/obj/structure/spacevine/attacked_by(obj/item/item, mob/living/user) - var/damage_dealt = item.force - if(item.get_sharpness()) - damage_dealt *= 4 +/obj/structure/spacevine/attacked_by(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) + LAZYSET(attack_modifiers, SILENCE_DEFAULT_MESSAGES, TRUE) + LAZYSET(attack_modifiers, FORCE_MULTIPLIER, 1) if(item.damtype == BURN) - damage_dealt *= 4 - - for(var/datum/spacevine_mutation/mutation in mutations) - damage_dealt = mutation.on_hit(src, user, item, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further - take_damage(damage_dealt, item.damtype, MELEE, 1) + MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 4) + if(item.get_sharpness()) + MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 4) + return ..() /obj/structure/spacevine/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index 077c644d2b5..43517ec26dd 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -35,7 +35,7 @@ return ..() -/obj/item/upgradescroll/pre_attack(obj/item/target, mob/living/user, list/modifiers) +/obj/item/upgradescroll/pre_attack(obj/item/target, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(. || !istype(target) || !user.combat_mode) return diff --git a/code/modules/experisci/destructive_scanner.dm b/code/modules/experisci/destructive_scanner.dm index 2b07ee91966..4d6ae192db1 100644 --- a/code/modules/experisci/destructive_scanner.dm +++ b/code/modules/experisci/destructive_scanner.dm @@ -104,7 +104,7 @@ . = ..() icon_state = scanning ? "tube_on" : "tube_open" -/obj/machinery/destructive_scanner/attackby(obj/item/object, mob/user, list/modifiers) +/obj/machinery/destructive_scanner/attackby(obj/item/object, mob/user, list/modifiers, list/attack_modifiers) if (!scanning && default_deconstruction_screwdriver(user, "tube_open", "tube_open", object) || default_deconstruction_crowbar(object)) update_icon() return diff --git a/code/modules/explorer_drone/exodrone.dm b/code/modules/explorer_drone/exodrone.dm index 49d7fa70e61..e0b1aec07b2 100644 --- a/code/modules/explorer_drone/exodrone.dm +++ b/code/modules/explorer_drone/exodrone.dm @@ -361,7 +361,7 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) if(fuel_canister) . += span_notice("You can remove the [fuel_canister] with a prying tool.") -/obj/machinery/exodrone_launcher/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/machinery/exodrone_launcher/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/fuel_pellet)) if(fuel_canister) to_chat(user, span_warning("There's already fuel loaded inside [src]!")) diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm index 3de78751d04..7f21b788f3d 100644 --- a/code/modules/explorer_drone/loot.dm +++ b/code/modules/explorer_drone/loot.dm @@ -159,7 +159,7 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) cell = new /obj/item/stock_parts/power_store/cell(src) AddComponent(/datum/component/two_handed) -/obj/item/firelance/attack(mob/living/M, mob/living/user, list/modifiers) +/obj/item/firelance/attack(mob/living/M, mob/living/user, list/modifiers, list/attack_modifiers) if(!user.combat_mode) return . = ..() diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index fe0a60b7879..361520f2d15 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -491,7 +491,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list( icon_state = base_icon_state return ..() -/obj/item/fish/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/item/fish/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(!istype(item, /obj/item/reagent_containers/cup/fish_feed)) return ..() if(!item.reagents.total_volume) diff --git a/code/modules/fishing/fish/types/rift.dm b/code/modules/fishing/fish/types/rift.dm index dc698935bf5..af21edb3f78 100644 --- a/code/modules/fishing/fish/types/rift.dm +++ b/code/modules/fishing/fish/types/rift.dm @@ -747,7 +747,7 @@ . = ..() limb.remove_bodypart_overlay(babbel_overlay) -/obj/item/organ/ears/babbelfish/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/organ/ears/babbelfish/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() var/obj/item/organ/ears/ears = target_mob.get_organ_slot(ORGAN_SLOT_EARS) if(!ears) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 11c56c0e67e..ce71a616831 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -523,7 +523,7 @@ . += line_overlay . += mutable_appearance(icon_file, "hook_overlay") -/obj/item/fishing_rod/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/fishing_rod/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(slot_check(attacking_item,ROD_SLOT_LINE)) use_slot(ROD_SLOT_LINE, user, attacking_item) SStgui.update_uis(src) diff --git a/code/modules/food_and_drinks/machinery/coffeemaker.dm b/code/modules/food_and_drinks/machinery/coffeemaker.dm index 720fbdcaacc..38395113cc9 100644 --- a/code/modules/food_and_drinks/machinery/coffeemaker.dm +++ b/code/modules/food_and_drinks/machinery/coffeemaker.dm @@ -183,7 +183,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/coffeemaker/attackby(obj/item/attack_item, mob/living/user, list/modifiers) +/obj/machinery/coffeemaker/attackby(obj/item/attack_item, mob/living/user, list/modifiers, list/attack_modifiers) //You can only screw open empty grinder if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item)) return FALSE @@ -582,7 +582,7 @@ return FALSE return TRUE -/obj/machinery/coffeemaker/impressa/attackby(obj/item/attack_item, mob/living/user, list/modifiers) +/obj/machinery/coffeemaker/impressa/attackby(obj/item/attack_item, mob/living/user, list/modifiers, list/attack_modifiers) //You can only screw open empty grinder if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item)) return diff --git a/code/modules/food_and_drinks/machinery/deep_fryer.dm b/code/modules/food_and_drinks/machinery/deep_fryer.dm index 2246a847622..a5dac16a411 100644 --- a/code/modules/food_and_drinks/machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/machinery/deep_fryer.dm @@ -97,7 +97,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/deepfryer/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/deepfryer/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) // Dissolving pills into the frier if(istype(weapon, /obj/item/reagent_containers/applicator/pill)) if(!reagents.total_volume) diff --git a/code/modules/food_and_drinks/machinery/gibber.dm b/code/modules/food_and_drinks/machinery/gibber.dm index 5c6e7b6bca7..0e4b028e3fd 100644 --- a/code/modules/food_and_drinks/machinery/gibber.dm +++ b/code/modules/food_and_drinks/machinery/gibber.dm @@ -134,7 +134,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/gibber/attackby(obj/item/P, mob/user, list/modifiers) +/obj/machinery/gibber/attackby(obj/item/P, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P)) return diff --git a/code/modules/food_and_drinks/machinery/griddle.dm b/code/modules/food_and_drinks/machinery/griddle.dm index ed7d17f1ce4..f5ff1c140e8 100644 --- a/code/modules/food_and_drinks/machinery/griddle.dm +++ b/code/modules/food_and_drinks/machinery/griddle.dm @@ -62,7 +62,7 @@ return default_deconstruction_crowbar(I, ignore_panel = TRUE) -/obj/machinery/griddle/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/griddle/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(griddled_objects.len >= max_items) to_chat(user, span_notice("[src] can't fit more items!")) diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm index f9bec4701d4..82b3e9a6224 100644 --- a/code/modules/food_and_drinks/machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm @@ -114,7 +114,7 @@ . = ..() . += "You can use a [EXAMINE_HINT("spoon")] or [EXAMINE_HINT("soup ladle")] to spill reagents." -/obj/machinery/icecream_vat/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/icecream_vat/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return @@ -140,7 +140,7 @@ balloon_alert(user, "beaker inserted") custom_ice_cream_beaker = beaker -/obj/machinery/icecream_vat/attackby_secondary(obj/item/reagent_containers/beaker, mob/user, list/modifiers) +/obj/machinery/icecream_vat/attackby_secondary(obj/item/reagent_containers/beaker, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return diff --git a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm index f8cfb616091..2ea7de7d4fa 100644 --- a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm @@ -47,7 +47,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) power_change() return ITEM_INTERACT_SUCCESS -/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, list/modifiers) +/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) return diff --git a/code/modules/food_and_drinks/machinery/oven.dm b/code/modules/food_and_drinks/machinery/oven.dm index f6f9fc24ef9..7b4ccb76280 100644 --- a/code/modules/food_and_drinks/machinery/oven.dm +++ b/code/modules/food_and_drinks/machinery/oven.dm @@ -102,7 +102,7 @@ update_appearance() use_energy(active_power_usage) -/obj/machinery/oven/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/oven/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(!open || used_tray || !istype(item, /obj/item/plate/oven_tray)) return ..() diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm index 5e0c3675b5f..dbbe35570dc 100644 --- a/code/modules/food_and_drinks/machinery/processor.dm +++ b/code/modules/food_and_drinks/machinery/processor.dm @@ -88,7 +88,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/processor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/machinery/processor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(processing) to_chat(user, span_warning("[src] is in the process of processing!")) return TRUE diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index f2369374021..f038306da24 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -260,7 +260,7 @@ playsound(src, SFX_SHATTER, 50, TRUE) return ..() -/obj/machinery/smartfridge/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/machinery/smartfridge/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(!machine_stat) var/shown_contents_length = visible_items() if(shown_contents_length >= max_n_of_items) diff --git a/code/modules/food_and_drinks/machinery/stove.dm b/code/modules/food_and_drinks/machinery/stove.dm index d6782efaf99..5d2b0f808dd 100644 --- a/code/modules/food_and_drinks/machinery/stove.dm +++ b/code/modules/food_and_drinks/machinery/stove.dm @@ -142,7 +142,7 @@ update_appearance(UPDATE_OVERLAYS) return TRUE -/obj/item/reagent_containers/cup/soup_pot/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/reagent_containers/cup/soup_pot/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return diff --git a/code/modules/food_and_drinks/plate.dm b/code/modules/food_and_drinks/plate.dm index 1fb5632219f..243d4f0ef14 100644 --- a/code/modules/food_and_drinks/plate.dm +++ b/code/modules/food_and_drinks/plate.dm @@ -24,7 +24,7 @@ if(fragile) AddElement(/datum/element/can_shatter) -/obj/item/plate/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/plate/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!IS_EDIBLE(I)) balloon_alert(user, "not food!") return @@ -45,7 +45,7 @@ else return ..() -/obj/item/plate/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/plate/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) if(!iscarbon(target)) return if(!contents.len) diff --git a/code/modules/food_and_drinks/restaurant/_venue.dm b/code/modules/food_and_drinks/restaurant/_venue.dm index 59d82878b46..0a968e3351f 100644 --- a/code/modules/food_and_drinks/restaurant/_venue.dm +++ b/code/modules/food_and_drinks/restaurant/_venue.dm @@ -223,15 +223,14 @@ linked_venue.toggle_open() update_icon() -/obj/machinery/restaurant_portal/attacked_by(obj/item/I, mob/living/user) - if(!istype(I, /obj/item/card/id)) - return ..() +/obj/machinery/restaurant_portal/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + var/obj/item/card/id/used_id = tool.GetID() + if(!istype(used_id)) + return NONE - var/obj/item/card/id/used_id = I - - if(!(linked_venue.req_access in used_id.GetAccess())) - to_chat(user, span_warning("This card lacks the access to change this venues status.")) - return + if(!check_access(used_id)) + balloon_alert(user, "insufficient access!") + return ITEM_INTERACT_BLOCKING var/list/radial_items = list() var/list/radial_results = list() @@ -244,7 +243,7 @@ var/choice = show_radial_menu(user, src, radial_items, null, require_near = TRUE) if(!choice) - return + return ITEM_INTERACT_BLOCKING var/venue_type = radial_results[choice] var/obj/item/circuitboard/machine/restaurant_portal/board = circuit @@ -253,11 +252,7 @@ turned_on_portal = WEAKREF(user) - if(!(chosen_venue.req_access in used_id.GetAccess())) - to_chat(user, span_warning("This card lacks the access to change this venues status.")) - return - - to_chat(user, span_notice("You change the portal's linked venue.")) + balloon_alert(user, "venue changed to [chosen_venue.name]") if(linked_venue && (src in linked_venue.restaurant_portals)) //We're already linked, unlink us. linked_venue.restaurant_portals -= src @@ -267,6 +262,7 @@ linked_venue = chosen_venue linked_venue.restaurant_portals += src + return ITEM_INTERACT_SUCCESS /obj/machinery/restaurant_portal/screwdriver_act(mob/user, obj/item/tool) if (default_deconstruction_screwdriver(user, "[base_icon_state]-open", base_icon_state, tool)) diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 2a192c997bd..741cd472183 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -93,7 +93,7 @@ to_chat(user, span_warning("You are too primitive to use this device!")) return -/obj/machinery/readybutton/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/readybutton/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) to_chat(user, span_warning("The device is a solid button, there's nothing you can do with it!")) /obj/machinery/readybutton/attack_hand(mob/user, list/modifiers) @@ -148,7 +148,7 @@ /obj/machinery/conveyor/holodeck -/obj/machinery/conveyor/holodeck/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/conveyor/holodeck/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!user.transferItemToLoc(I, drop_location())) return ..() diff --git a/code/modules/hydroponics/beekeeping/bee_smoker.dm b/code/modules/hydroponics/beekeeping/bee_smoker.dm index d04c72adfd6..d54cc6d99bc 100644 --- a/code/modules/hydroponics/beekeeping/bee_smoker.dm +++ b/code/modules/hydroponics/beekeeping/bee_smoker.dm @@ -75,7 +75,7 @@ return . -/obj/item/bee_smoker/attackby(obj/item/herb, mob/living/carbon/human/user, list/modifiers) +/obj/item/bee_smoker/attackby(obj/item/herb, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 2949f6ed920..cb073c99b03 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -145,7 +145,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/structure/beebox/attackby(obj/item/item, mob/user, list/modifiers) +/obj/structure/beebox/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/honey_frame)) var/obj/item/honey_frame/frame = item if(honey_frames.len < BEEBOX_MAX_FRAMES) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 42d8b83829e..c1ab15162a4 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -199,7 +199,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/biogenerator/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/machinery/biogenerator/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(user.combat_mode) return ..() diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 7a57c1fc2bd..ab52f9e6c56 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -56,7 +56,7 @@ else . += span_notice("It is currently closed, letting it ferment fruits or draw reagents from its tap.") -/obj/structure/fermenting_barrel/attackby(obj/item/object, mob/user, list/modifiers) +/obj/structure/fermenting_barrel/attackby(obj/item/object, mob/user, list/modifiers, list/attack_modifiers) if(open) if(istype(object, /obj/item/food/grown) && insert_fruit(user, object)) balloon_alert(user, "added fruit") diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 3fc026a60e3..a55ae42e449 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -47,7 +47,7 @@ throw_range = 7 grind_results = list(/datum/reagent/cellulose = 10) //really partially hemicellulose -/obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, list/modifiers) +/obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, list/modifiers, list/attack_modifiers) if(W.get_sharpness()) to_chat(user, span_notice("You use [W] to fashion a pipe out of the corn cob!")) new /obj/item/cigarette/pipe/cobpipe (user.loc) diff --git a/code/modules/hydroponics/grown/hedges.dm b/code/modules/hydroponics/grown/hedges.dm index b86baac13e5..d6bf1f49512 100644 --- a/code/modules/hydroponics/grown/hedges.dm +++ b/code/modules/hydroponics/grown/hedges.dm @@ -46,14 +46,15 @@ opacity = FALSE max_integrity = 80 -/obj/structure/hedge/attacked_by(obj/item/I, mob/living/user) - if(opacity && HAS_TRAIT(user, TRAIT_BONSAI) && I.get_sharpness()) - to_chat(user,span_notice("You start trimming \the [src].")) - if(do_after(user, 3 SECONDS,target=src)) - to_chat(user,span_notice("You finish trimming \the [src].")) - opacity = FALSE - else - return ..() +/obj/structure/hedge/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!opacity || !HAS_TRAIT(user, TRAIT_BONSAI) || !tool.get_sharpness()) + return NONE + balloon_alert(user, "trimming...") + if(!do_after(user, 3 SECONDS, target=src)) + return ITEM_INTERACT_BLOCKING + opacity = FALSE + return ITEM_INTERACT_SUCCESS + /** * useful for mazes and such */ diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 3317b544e57..284f760cc66 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -40,7 +40,7 @@ /obj/item/food/grown/watermelon/make_dryable() return //No drying -/obj/item/food/grown/watermelon/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/food/grown/watermelon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!istype(I, /obj/item/kitchen/spoon)) return ..() @@ -110,7 +110,7 @@ AddComponentFrom(SOURCE_EDIBLE_INNATE, /datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_holyness))) -/obj/item/food/grown/holymelon/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/food/grown/holymelon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!istype(I, /obj/item/kitchen/spoon)) return ..() @@ -183,7 +183,7 @@ /obj/item/food/grown/barrelmelon/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/barrelmelonslice, 5, 20, screentip_verb = "Chop") -/obj/item/food/grown/barrelmelon/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/food/grown/barrelmelon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!istype(I, /obj/item/kitchen/spoon)) return ..() diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 11e5ecd7486..9d0e465d033 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -197,7 +197,7 @@ desc = "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty!" icon_state = "chanterelle" -/obj/item/food/grown/mushroom/chanterelle/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/food/grown/mushroom/chanterelle/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!istype(I, /obj/item/kitchen/spoon)) return ..() if(seed.potency < 95) diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index e91e55a62fd..a9be7fc2c2f 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -37,7 +37,7 @@ icon_state = "potato_wedges" bite_consumption_mod = 100 -/obj/item/food/grown/potato/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/food/grown/potato/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(W.get_sharpness()) to_chat(user, span_notice("You cut the potato into wedges with [W].")) var/obj/item/food/grown/potato/wedges/Wedges = new /obj/item/food/grown/potato/wedges diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm index 59f2ba67a93..256abeced65 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -29,7 +29,7 @@ ///Which type of lantern this gourd produces when carved. var/carved_type = /obj/item/clothing/head/utility/hardhat/pumpkinhead -/obj/item/food/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, list/modifiers) +/obj/item/food/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, list/modifiers, list/attack_modifiers) if(W.get_sharpness()) user.show_message(span_notice("You carve a face into [src]!"), MSG_VISUAL) new carved_type(user.loc) diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 793a15b2239..201fdd1a660 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -25,7 +25,7 @@ juice_typepath = /datum/reagent/consumable/carrotjuice wine_power = 30 -/obj/item/food/grown/carrot/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/food/grown/carrot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!I.get_sharpness()) return ..() @@ -64,7 +64,7 @@ juice_typepath = /datum/reagent/consumable/parsnipjuice wine_power = 35 -/obj/item/food/grown/parsnip/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/food/grown/parsnip/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!I.get_sharpness()) return ..() @@ -110,7 +110,7 @@ tastes = list("sweet dirt" = 1) distill_reagent = /datum/reagent/consumable/rootbeer -/obj/item/food/grown/cahnroot/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/food/grown/cahnroot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!I.get_sharpness()) return ..() diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index cb803de8e07..f0db7a02282 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -78,7 +78,7 @@ return NONE -/obj/item/grown/log/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/grown/log/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(attacking_item.get_sharpness()) var/plank_count = 1 if(seed) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 59752762b5c..49d2400c820 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -189,7 +189,7 @@ playsound(src, SFX_DESECRATION ,50, TRUE, -1) return BRUTELOSS -/obj/item/scythe/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/scythe/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) if(!istype(target, /obj/structure/alien/resin/flower_bud) && !istype(target, /obj/structure/spacevine)) return ..() if(swiping || get_turf(target) == get_turf(user)) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 31144776055..dfa2b36085f 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -225,7 +225,7 @@ QDEL_NULL(our_snail) -/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if (!user.combat_mode) // handle opening the panel if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) @@ -865,7 +865,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, list/modifiers) +/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) //Called when mob user "attacks" it with object O if(IS_EDIBLE(O) || is_reagent_container(O)) // Syringe stuff (and other reagent containers now too) var/obj/item/reagent_containers/reagent_source = O @@ -1085,7 +1085,7 @@ else return ..() -/obj/machinery/hydroponics/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/hydroponics/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if (istype(weapon, /obj/item/reagent_containers/syringe)) to_chat(user, span_warning("You can't get any extract out of this plant.")) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -1209,7 +1209,7 @@ /obj/machinery/hydroponics/soil/update_status_light_overlays() return // Has no lights -/obj/machinery/hydroponics/soil/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/hydroponics/soil/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(weapon.tool_behaviour != TOOL_SHOVEL) //Spades can still uproot plants on left click return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN balloon_alert(user, "clearing up soil...") diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 6c8d4552e9b..d7049b85f96 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -93,7 +93,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/seed_extractor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/machinery/seed_extractor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(!isliving(user) || user.combat_mode) return ..() diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index d0cb9870059..be3b686f5b8 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -475,7 +475,7 @@ /obj/item/seeds/proc/on_chem_reaction(datum/reagents/reagents) return -/obj/item/seeds/attackby(obj/item/O, mob/user, list/modifiers) +/obj/item/seeds/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(IS_WRITING_UTENSIL(O)) var/choice = tgui_input_list(usr, "What would you like to change?", "Seed Alteration", list("Plant Name", "Seed Description", "Product Description")) if(isnull(choice)) diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index afae744e94d..2fe51b434e0 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -118,7 +118,7 @@ . = ..() AddElement(/datum/element/spooky, too_spooky = !single_use, single_use = single_use) -/obj/item/instrument/trumpet/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/instrument/trumpet/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) playsound(src, 'sound/runtime/instruments/trombone/En4.mid', 1000, 1, -1) return ..() @@ -146,7 +146,7 @@ . = ..() AddElement(/datum/element/spooky, too_spooky = !single_use, single_use = single_use) -/obj/item/instrument/saxophone/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/instrument/saxophone/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) playsound(src, 'sound/runtime/instruments/trombone/En4.mid', 1000, 1, -1) return ..() @@ -177,7 +177,7 @@ /obj/item/instrument/trombone/spectral/one_doot single_use = TRUE -/obj/item/instrument/trombone/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/instrument/trombone/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) playsound(src, 'sound/runtime/instruments/trombone/Cn4.mid', 1000, 1, -1) return ..() diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index c3e497bffa5..8cb499e886a 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -77,7 +77,7 @@ means that you'll be forced to move carefully while it's on. Fits in pockets, an user.visible_message(span_suicide("[user] is killing [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to get closer to god!")) return (BRUTELOSS|FIRELOSS) -/obj/item/nullrod/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/nullrod/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) if(!user.mind?.holy_role) return ..() if(!IS_CULTIST(target_mob) || istype(target_mob, /mob/living/carbon/human/cult_ghost)) @@ -193,11 +193,9 @@ means that you'll be forced to move carefully while it's on. Fits in pockets, an force = 15 menu_description = "An odd sharp blade which provides a low chance of blocking incoming melee attacks and deals a random amount of damage, which can range from almost nothing to very high. Can be worn on the back." -/obj/item/nullrod/claymore/multiverse/melee_attack_chain(mob/user, atom/target, list/modifiers) - var/force_mod = rand(-14, 15) - force += force_mod - . = ..() - force -= force_mod +/obj/item/nullrod/claymore/multiverse/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + SET_ATTACK_FORCE(attack_modifiers, rand(max(force - 15, 1), force + 15)) + return ..() /obj/item/nullrod/claymore/saber name = "light energy sword" @@ -820,36 +818,20 @@ means that you'll be forced to move carefully while it's on. Fits in pockets, an alt_simple = string_list(alt_simple) AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple) -/obj/item/nullrod/nullblade/melee_attack_chain(mob/user, atom/target, list/modifiers) - //Track our actual force separately - var/old_force = force - force = 0 - //Potential dice roll for our baseline force - force += roll("1d6") - - //Now we can check for our user's potential 'strength' value. As a baseline, we'll use a default value of 4 for the sake of nonhuman users. +/obj/item/nullrod/nullblade/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + //Check for our user's potential 'strength' value. As a baseline, we'll use a default value of 4 for the sake of nonhuman users. var/strength_value = 4 - - //We can use our human wielder's arm strength to determine their 'strength'. We add unarmed lower and upper, then divide by four. - //This isn't how strength works in dnd but who fucking cares. + // We can use our human wielder's arm strength to determine their 'strength'. We add unarmed lower and upper, then divide by four. + // This isn't how strength works in dnd but who fucking cares. if(ishuman(user)) var/mob/living/carbon/human/human_user = user var/obj/item/bodypart/wielding_bodypart = human_user.get_active_hand() strength_value = round((wielding_bodypart.unarmed_damage_low + wielding_bodypart.unarmed_damage_high) * 0.25, 1) + // Our force becomes 1d6 + strength + some modifier (based on force - base force) to account for whetstones and other things. + SET_ATTACK_FORCE(attack_modifiers, roll("1d6") + strength_value + (force - initial(force))) + return ..() - force += strength_value - - //If our old_force is higher than our initial force, add the difference to this calculation. - //We do this because our force could have been changed by things like whetstones and RPG stats. - force += old_force - initial(force) - - //Record change to our force in case something modifies it down the chain - var/force_diff = force - old_force - . = ..() - //Reapply our old force. - force -= force_diff - -/obj/item/nullrod/nullblade/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/nullrod/nullblade/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(!isliving(target)) return diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm index 10abdef72a1..cc36ec3c312 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm @@ -89,7 +89,7 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and ) AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE) //less good at killing revenants, much better at killing plants -/obj/item/vorpalscythe/attack(mob/living/target, mob/living/user, list/modifiers) +/obj/item/vorpalscythe/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) if(ismonkey(target) && !target.mind) //Don't empower from hitting monkeys. Hit a corgi or something, I don't know. return ..() diff --git a/code/modules/library/book.dm b/code/modules/library/book.dm index fa73afd2eb3..8fc5139ce5d 100644 --- a/code/modules/library/book.dm +++ b/code/modules/library/book.dm @@ -98,7 +98,7 @@ user.visible_message(span_notice("[user] opens a book titled \"[book_data.title]\" and begins reading intently.")) display_content(user) -/obj/item/book/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/item/book/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(IS_WRITING_UTENSIL(attacking_item)) if(!user.can_perform_action(src) || !user.can_write(attacking_item)) return diff --git a/code/modules/library/bookcase.dm b/code/modules/library/bookcase.dm index 0297a929311..3fa3efb70fe 100644 --- a/code/modules/library/bookcase.dm +++ b/code/modules/library/bookcase.dm @@ -118,7 +118,7 @@ I.forceMove(Tsec) update_appearance() -/obj/structure/bookcase/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/bookcase/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(state == BOOKCASE_UNANCHORED) if(attacking_item.tool_behaviour == TOOL_WRENCH) if(attacking_item.use_tool(src, user, 20, volume=50)) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 37ccc48e589..edf77d4873e 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -545,7 +545,7 @@ GLOBAL_VAR_INIT(library_table_modified, 0) set_screen_state(MIN_LIBRARY) return TRUE -/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(!istype(weapon, /obj/item/barcodescanner)) return ..() var/obj/item/barcodescanner/scanner = weapon @@ -711,7 +711,7 @@ GLOBAL_VAR_INIT(library_table_modified, 0) cache = null return ..() -/obj/machinery/libraryscanner/attackby(obj/hitby, mob/user, list/modifiers) +/obj/machinery/libraryscanner/attackby(obj/hitby, mob/user, list/modifiers, list/attack_modifiers) if(istype(hitby, /obj/item/book)) user.transferItemToLoc(hitby, src) if(held_book) @@ -792,7 +792,7 @@ GLOBAL_VAR_INIT(library_table_modified, 0) if(default_deconstruction_crowbar(tool)) return ITEM_INTERACT_SUCCESS -/obj/machinery/bookbinder/attackby(obj/hitby, mob/user, list/modifiers) +/obj/machinery/bookbinder/attackby(obj/hitby, mob/user, list/modifiers, list/attack_modifiers) if(istype(hitby, /obj/item/paper)) prebind_book(user, hitby) return TRUE diff --git a/code/modules/library/skill_learning/skill_station.dm b/code/modules/library/skill_learning/skill_station.dm index f6e3a7674c1..db21181e9b9 100644 --- a/code/modules/library/skill_learning/skill_station.dm +++ b/code/modules/library/skill_learning/skill_station.dm @@ -83,7 +83,7 @@ else toggle_open() -/obj/machinery/skill_station/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/machinery/skill_station/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(I,/obj/item/skillchip)) if(inserted_skillchip) to_chat(user,span_notice("There's already a skillchip inside.")) diff --git a/code/modules/mapfluff/ruins/lavaland_ruin_code.dm b/code/modules/mapfluff/ruins/lavaland_ruin_code.dm index be0fbd85f67..18db493cf84 100644 --- a/code/modules/mapfluff/ruins/lavaland_ruin_code.dm +++ b/code/modules/mapfluff/ruins/lavaland_ruin_code.dm @@ -40,7 +40,7 @@ /// Type of shell to create var/shell_type = /obj/effect/mob_spawn/ghost_role/human/golem -/obj/item/golem_shell/attackby(obj/item/potential_food, mob/user, list/modifiers) +/obj/item/golem_shell/attackby(obj/item/potential_food, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!isstack(potential_food)) balloon_alert(user, "not a mineral!") diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm index cf3b4908b1e..89058e33f5a 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm @@ -105,7 +105,7 @@ reagents.expose(user, TOUCH, 20) //Covers target in 20u of oil. to_chat(user, span_notice("You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water.")) -/obj/structure/sink/oil_well/attackby(obj/item/O, mob/living/user, list/modifiers) +/obj/structure/sink/oil_well/attackby(obj/item/O, mob/living/user, list/modifiers, list/attack_modifiers) flick("puddle-oil-splash",src) if(O.tool_behaviour == TOOL_SHOVEL) //attempt to deconstruct the puddle with a shovel to_chat(user, "You fill in the oil well with soil.") diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm index fec863153d4..3ff54df736c 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm @@ -49,7 +49,7 @@ warning_channel = "Syndicate" include_in_cims = FALSE -/obj/machinery/power/supermatter_crystal/shard/syndicate/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/machinery/power/supermatter_crystal/shard/syndicate/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/scalpel/supermatter)) //You can already yoink the docs as a free objective win, another would be just gross to_chat(user, span_danger("This shard's already in Syndicate custody, taking it again could cause more harm than good.")) return diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm index 9b2d6769a2d..72c4fe3ce4a 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm @@ -37,7 +37,7 @@ custom_materials = list(/datum/material/bone=SMALL_MATERIAL_AMOUNT) hitsound = 'sound/items/weapons/bladeslice.ogg' -/obj/item/knife/envy/afterattack(atom/target, mob/living/carbon/human/user, list/modifiers) +/obj/item/knife/envy/afterattack(atom/target, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) if(!istype(user) || !ishuman(target)) return diff --git a/code/modules/mapfluff/ruins/spaceruin_code/garbagetruck.dm b/code/modules/mapfluff/ruins/spaceruin_code/garbagetruck.dm index a269c07ec10..bfc71e6be1e 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/garbagetruck.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/garbagetruck.dm @@ -18,7 +18,7 @@ . = ..() icon_state = "[base_icon_state][used ? "-used" : ""]" -/obj/item/eyesnatcher/attack(mob/living/carbon/human/target, mob/living/user, list/modifiers) +/obj/item/eyesnatcher/attack(mob/living/carbon/human/target, mob/living/user, list/modifiers, list/attack_modifiers) if(used || !istype(target) || !target.Adjacent(user)) //Works only once, no TK use return ..() diff --git a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm index f46b2f78583..c87d5c20dd0 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm @@ -99,7 +99,7 @@ . = ..() stored_organ = pick_weight(allowed_organs) -/obj/structure/meateor_fluff/flesh_pod/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/meateor_fluff/flesh_pod/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if (attacking_item.get_sharpness() & SHARP_EDGED) cut_open(user) return diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm index d4186d5b28f..1c2173949a7 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm @@ -23,7 +23,7 @@ . += span_notice("Insert [EXAMINE_HINT("Research Notes")] to generate points.") -/obj/machinery/rnd/server/oldstation/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/rnd/server/oldstation/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/research_notes) && stored_research) var/obj/item/research_notes/research_notes = attacking_item stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = research_notes.value)) diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index bd61fd49b88..751da2a08dc 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -118,7 +118,7 @@ check_examine_award(user) -/obj/effect/meteor/attackby(obj/item/I, mob/user, list/modifiers) +/obj/effect/meteor/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_MINING) make_debris() qdel(src) diff --git a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm index 35cfeabe602..4e67861a7ed 100644 --- a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm @@ -100,7 +100,7 @@ for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies) . += span_notice("It has \a [crusher_trophy] attached, which causes [crusher_trophy.effect_desc()].") -/obj/item/kinetic_crusher/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/kinetic_crusher/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/crusher_trophy)) var/obj/item/crusher_trophy/crusher_trophy = attacking_item crusher_trophy.add_to(src, user) @@ -158,7 +158,7 @@ return FALSE return TRUE -/obj/item/kinetic_crusher/pre_attack(atom/A, mob/living/user, list/modifiers) +/obj/item/kinetic_crusher/pre_attack(atom/A, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return TRUE @@ -171,7 +171,7 @@ target.apply_status_effect(/datum/status_effect/crusher_damage) return ..() -/obj/item/kinetic_crusher/afterattack(mob/living/target, mob/living/user, list/modifiers) +/obj/item/kinetic_crusher/afterattack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) if(!isliving(target)) return // Melee effect diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index fc27d151524..b52c2dc21d3 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -134,7 +134,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( /obj/structure/marker_beacon/attack_tk(mob/user) return -/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/stack/marker_beacon)) var/obj/item/stack/marker_beacon/M = I to_chat(user, span_notice("You start picking [src] up...")) diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm index 1918fe5b95a..8c5ffb873a7 100644 --- a/code/modules/mining/equipment/resonator.dm +++ b/code/modules/mining/equipment/resonator.dm @@ -43,7 +43,7 @@ new /obj/effect/temp_visual/resonance(target_turf, user, src, mode, adding_failure) user.changeNext_move(CLICK_CD_MELEE) -/obj/item/resonator/pre_attack(atom/target, mob/user, list/modifiers) +/obj/item/resonator/pre_attack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(check_allowed_items(target, not_inside = TRUE)) create_resonance(target, user) return ..() diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index fc1c6aeed3e..2478b84b7f7 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -213,7 +213,7 @@ return user.examinate(src) -/obj/machinery/mineral/labor_points_checker/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/mineral/labor_points_checker/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(!istype(weapon, /obj/item/card/id/advanced/prisoner)) return ..() var/obj/item/card/id/advanced/prisoner/prisoner_id = weapon diff --git a/code/modules/mining/lavaland/mining_loot/cursed_katana.dm b/code/modules/mining/lavaland/mining_loot/cursed_katana.dm index 3606d6d92af..3fc020fd93a 100644 --- a/code/modules/mining/lavaland/mining_loot/cursed_katana.dm +++ b/code/modules/mining/lavaland/mining_loot/cursed_katana.dm @@ -99,7 +99,7 @@ if(isturf(loc)) qdel(src) -/obj/item/cursed_katana/attack(mob/living/target, mob/user, list/modifiers) +/obj/item/cursed_katana/attack(mob/living/target, mob/user, list/modifiers, list/attack_modifiers) if(target.stat < DEAD && target != user) drew_blood = TRUE if(ismining(target)) diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm b/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm index 99aaa2530f0..7791cdce339 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm @@ -63,23 +63,17 @@ if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly -/obj/item/melee/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user) +/obj/item/melee/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) var/is_open = HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE) if(!is_open || swiping || !target.density || get_turf(target) == get_turf(user)) - if(!is_open) - faction_bonus_force = 0 - var/is_nemesis_faction = FALSE for(var/found_faction in target.faction) - if(found_faction in nemesis_factions) - is_nemesis_faction = TRUE - force += faction_bonus_force - nemesis_effects(user, target) - break + if(!(found_faction in nemesis_factions)) + continue + if(is_open) + MODIFY_ATTACK_FORCE(attack_modifiers, faction_bonus_force) + nemesis_effects(user, target) + break . = ..() - if(is_nemesis_faction) - force -= faction_bonus_force - if(!is_open) - faction_bonus_force = initial(faction_bonus_force) return var/turf/user_turf = get_turf(user) diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/bubblegum.dm b/code/modules/mining/lavaland/mining_loot/megafauna/bubblegum.dm index 72b24d386db..df85934493d 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/bubblegum.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/bubblegum.dm @@ -174,7 +174,7 @@ . = ..() . += soul.ckey ? span_nicegreen("There is a soul inhabiting it.") : span_danger("It's dormant.") -/obj/item/soulscythe/attack(mob/living/attacked, mob/living/user, list/modifiers) +/obj/item/soulscythe/attack(mob/living/attacked, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(attacked.stat != DEAD) give_blood(10) diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm index f5371e4bab3..d21322424cf 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm @@ -123,7 +123,7 @@ return ActivationReaction(user, ACTIVATE_TOUCH) -/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.get_temperature()) ActivationReaction(user, ACTIVATE_HEAT) else diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/legion.dm b/code/modules/mining/lavaland/mining_loot/megafauna/legion.dm index 9b83d73fc1d..5154488df72 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/legion.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/legion.dm @@ -67,7 +67,7 @@ /obj/item/storm_staff/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) return thunder_blast(interacting_with, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING -/obj/item/storm_staff/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/storm_staff/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) thunder_blast(target, user) /obj/item/storm_staff/proc/thunder_blast(atom/target, mob/user) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 5fa47d5d913..8b70c283710 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -16,7 +16,7 @@ /// var to check if it got opened by a key var/spawned_loot = FALSE -/obj/structure/closet/crate/necropolis/tendril/attackby(obj/item/item, mob/user, list/modifiers) +/obj/structure/closet/crate/necropolis/tendril/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(!istype(item, /obj/item/skeleton_key) || spawned_loot) return ..() var/loot = rand(1,21) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 688676cbdb8..bc8ef95ef2f 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -280,7 +280,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/gibtonite/IsSpecialAssembly() return TRUE -/obj/item/gibtonite/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/gibtonite/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/assembly_holder) && !rig) var/obj/item/assembly_holder/holder = I if(!(locate(/obj/item/assembly/igniter) in holder.assemblies)) @@ -472,7 +472,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ . = ..() . += span_info("It's worth [value] credit\s.") -/obj/item/coin/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/coin/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W if(string_attached) diff --git a/code/modules/mining/satchel_ore_box.dm b/code/modules/mining/satchel_ore_box.dm index 19da292ffb9..79bc8618a04 100644 --- a/code/modules/mining/satchel_ore_box.dm +++ b/code/modules/mining/satchel_ore_box.dm @@ -55,7 +55,7 @@ deconstruct(TRUE) return ITEM_INTERACT_SUCCESS -/obj/structure/ore_box/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/structure/ore_box/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/stack/ore) || istype(weapon, /obj/item/boulder)) user.transferItemToLoc(weapon, src) return TRUE diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index 6284fb0ed4f..954f830bfb0 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -422,7 +422,7 @@ GLOBAL_LIST_INIT(command_strings, list( heal_overall_damage(10) user.visible_message(span_notice("[user] repairs [src]!"),span_notice("You repair [src].")) -/mob/living/basic/bot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/mob/living/basic/bot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(attacking_item.GetID()) unlock_with_id(user) return diff --git a/code/modules/mob/living/basic/bots/repairbot/repairbot.dm b/code/modules/mob/living/basic/bots/repairbot/repairbot.dm index 09739aeebcf..932f6df6be1 100644 --- a/code/modules/mob/living/basic/bots/repairbot/repairbot.dm +++ b/code/modules/mob/living/basic/bots/repairbot/repairbot.dm @@ -98,7 +98,7 @@ toolbox_color = new_color update_appearance() -/mob/living/basic/bot/repairbot/attackby(obj/item/potential_stack, mob/living/carbon/human/user, list/modifiers) +/mob/living/basic/bot/repairbot/attackby(obj/item/potential_stack, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) if(!istype(potential_stack, /obj/item/stack)) return ..() attempt_merge(potential_stack, user) diff --git a/code/modules/mob/living/basic/clown/clown.dm b/code/modules/mob/living/basic/clown/clown.dm index 98ebc8f8df7..169e8573005 100644 --- a/code/modules/mob/living/basic/clown/clown.dm +++ b/code/modules/mob/living/basic/clown/clown.dm @@ -414,20 +414,16 @@ AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 30, bonus_tame_chance = 0) AddElement(/datum/element/damage_threshold, 10) //lots of fat to cushion blows. -/mob/living/basic/clown/mutant/glutton/attacked_by(obj/item/item, mob/living/user) - if(!check_edible(item)) - return ..() - eat_atom(item) +/mob/living/basic/clown/mutant/glutton/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!check_edible(tool)) + return NONE + eat_atom(tool) + return ITEM_INTERACT_SUCCESS -/mob/living/basic/clown/mutant/glutton/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) - if(!check_edible(target)) +/mob/living/basic/clown/mutant/glutton/resolve_unarmed_attack(atom/attack_target, list/modifiers) + if(!check_edible(attack_target)) return ..() - eat_atom(target) - -/mob/living/basic/clown/mutant/glutton/UnarmedAttack(atom/victim, proximity_flag, list/modifiers) - if(!check_edible(victim)) - return ..() - eat_atom(victim) + eat_atom(attack_target) ///Returns whether or not the supplied movable atom is edible. /mob/living/basic/clown/mutant/glutton/proc/check_edible(atom/movable/potential_food) diff --git a/code/modules/mob/living/basic/cult/shade.dm b/code/modules/mob/living/basic/cult/shade.dm index 7c5520c71fe..bb56ef2db03 100644 --- a/code/modules/mob/living/basic/cult/shade.dm +++ b/code/modules/mob/living/basic/cult/shade.dm @@ -72,7 +72,7 @@ SSblackbox.record_feedback("tally", "cult_shade_suicided", 1) ..() -/mob/living/basic/shade/attackby(obj/item/item, mob/user, list/modifiers) +/mob/living/basic/shade/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/soulstone)) var/obj/item/soulstone/stone = item stone.capture_shade(src, user) diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling.dm b/code/modules/mob/living/basic/jungle/seedling/seedling.dm index d6d189d2ebc..0d74cf6b171 100644 --- a/code/modules/mob/living/basic/jungle/seedling/seedling.dm +++ b/code/modules/mob/living/basic/jungle/seedling/seedling.dm @@ -138,7 +138,7 @@ combatant_state = state update_appearance() -/mob/living/basic/seedling/attackby(obj/item/can, mob/living/carbon/human/user, list/modifiers) +/mob/living/basic/seedling/attackby(obj/item/can, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) if(istype(can, /obj/item/reagent_containers/cup/watering_can) && isnull(held_can)) can.forceMove(src) return diff --git a/code/modules/mob/living/basic/jungle/venus_human_trap.dm b/code/modules/mob/living/basic/jungle/venus_human_trap.dm index 0a4a557eef1..7f37bb55336 100644 --- a/code/modules/mob/living/basic/jungle/venus_human_trap.dm +++ b/code/modules/mob/living/basic/jungle/venus_human_trap.dm @@ -59,14 +59,14 @@ damage_amount = 0 . = ..() -/obj/structure/alien/resin/flower_bud/attacked_by(obj/item/item, mob/living/user) - var/damage_dealt = item.force +/obj/structure/alien/resin/flower_bud/attacked_by(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) + LAZYSET(attack_modifiers, SILENCE_DEFAULT_MESSAGES, TRUE) + LAZYSET(attack_modifiers, FORCE_MULTIPLIER, 1) if(item.damtype == BURN) - damage_dealt *= 4 + MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 4) if(item.get_sharpness()) - damage_dealt *= 16 // alien resin applies 75% reduction to brute damage so this actually x4 damage - - take_damage(damage_dealt, item.damtype, MELEE, 1) + MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 16) // alien resin applies 75% reduction to brute damage so this actually x4 damage + return ..() /obj/structure/alien/resin/flower_bud/Destroy() QDEL_LIST(vines) diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm index b3a68f1bb54..9e3f271c528 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm @@ -102,7 +102,7 @@ if (tentacles.cooldown_time > 1 SECONDS) tentacles.cooldown_time -= 1 SECONDS -/mob/living/basic/mining/goliath/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/mob/living/basic/mining/goliath/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if (!istype(attacking_item, /obj/item/goliath_saddle)) return ..() if (!tameable) diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm index 0b25c5438ce..6be564ab4ab 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm @@ -60,7 +60,7 @@ . = ..() owner.log_message("has received [src] which will eventually turn them into a Legion.", LOG_VICTIM) -/obj/item/organ/legion_tumour/attack(mob/living/target, mob/living/user, list/modifiers) +/obj/item/organ/legion_tumour/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) if (try_apply(target, user)) qdel(src) return diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm index 32316cafcfc..9223b7dfa58 100644 --- a/code/modules/mob/living/basic/minebots/minebot.dm +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -126,7 +126,7 @@ user.balloon_alert(user, "successfully repaired!") return TRUE -/mob/living/basic/mining_drone/attackby(obj/item/item_used, mob/user, list/modifiers) +/mob/living/basic/mining_drone/attackby(obj/item/item_used, mob/user, list/modifiers, list/attack_modifiers) if(item_used.tool_behaviour == TOOL_CROWBAR || istype(item_used, /obj/item/borg/upgrade/modkit)) item_used.melee_attack_chain(user, stored_gun, modifiers) return diff --git a/code/modules/mob/living/basic/pets/dog/_dog.dm b/code/modules/mob/living/basic/pets/dog/_dog.dm index 24ae2e24f04..f3a106eb15c 100644 --- a/code/modules/mob/living/basic/pets/dog/_dog.dm +++ b/code/modules/mob/living/basic/pets/dog/_dog.dm @@ -104,7 +104,7 @@ attack_verb_continuous = list("attacks", "bashes", "batters", "bludgeons", "whacks") attack_verb_simple = list("attack", "bash", "batter", "bludgeon", "whack") -/obj/item/dog_bone/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/dog_bone/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) if (!isdog(target) || user.combat_mode) return ..() var/mob/living/basic/pet/dog/dog_target = target diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm index 2399c2c0800..b2bd8e47976 100644 --- a/code/modules/mob/living/basic/pets/dog/corgi.dm +++ b/code/modules/mob/living/basic/pets/dog/corgi.dm @@ -112,7 +112,7 @@ armorval += inventory_back.get_armor_rating(type) return armorval * 0.5 -/mob/living/basic/pet/dog/corgi/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/mob/living/basic/pet/dog/corgi/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/razor)) if(shaved) to_chat(user, span_warning("You can't shave this corgi, [p_they()] has already been shaved!")) diff --git a/code/modules/mob/living/basic/ruin_defender/living_floor.dm b/code/modules/mob/living/basic/ruin_defender/living_floor.dm index ac9627b8037..df248b7d24f 100644 --- a/code/modules/mob/living/basic/ruin_defender/living_floor.dm +++ b/code/modules/mob/living/basic/ruin_defender/living_floor.dm @@ -81,7 +81,7 @@ /mob/living/basic/living_floor/med_hud_set_status() return -/mob/living/basic/living_floor/attackby(obj/item/weapon, mob/user, list/modifiers) +/mob/living/basic/living_floor/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(weapon.tool_behaviour != TOOL_CROWBAR) return ..() balloon_alert(user, "prying...") diff --git a/code/modules/mob/living/basic/slime/defense.dm b/code/modules/mob/living/basic/slime/defense.dm index 8f5b0e6d8e5..30e4cb41b4e 100644 --- a/code/modules/mob/living/basic/slime/defense.dm +++ b/code/modules/mob/living/basic/slime/defense.dm @@ -23,7 +23,7 @@ defender_slime.discipline_slime() -/mob/living/basic/slime/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/mob/living/basic/slime/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) //Lets you feed slimes plasma. Checks before the passthrough force check if(istype(attacking_item, /obj/item/stack/sheet/mineral/plasma) && stat == CONSCIOUS) diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm index 66e73b2bbfa..cc05cdbd6d4 100644 --- a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm +++ b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm @@ -77,7 +77,7 @@ qdel(attack_target) return TRUE -/mob/living/basic/eyeball/attackby(obj/item/weapon, mob/living/carbon/human/user, list/modifiers) +/mob/living/basic/eyeball/attackby(obj/item/weapon, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) . = ..() if(!weapon.force && !user.combat_mode) return diff --git a/code/modules/mob/living/basic/space_fauna/mushroom.dm b/code/modules/mob/living/basic/space_fauna/mushroom.dm index 28f8fa46013..16c46674e2f 100644 --- a/code/modules/mob/living/basic/space_fauna/mushroom.dm +++ b/code/modules/mob/living/basic/space_fauna/mushroom.dm @@ -160,7 +160,7 @@ melee_damage_upper += (level_gain * rand(1,5)) maxHealth += (level_gain * rand(1,5)) -/mob/living/basic/mushroom/attackby(obj/item/mush, mob/living/carbon/human/user, list/modifiers) +/mob/living/basic/mushroom/attackby(obj/item/mush, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers) if(istype(mush, /obj/item/food/grown/mushroom)) recover(mush) return diff --git a/code/modules/mob/living/basic/vermin/mothroach/mothroach.dm b/code/modules/mob/living/basic/vermin/mothroach/mothroach.dm index 7d3dd6906c2..75508c3e542 100644 --- a/code/modules/mob/living/basic/vermin/mothroach/mothroach.dm +++ b/code/modules/mob/living/basic/vermin/mothroach/mothroach.dm @@ -79,7 +79,7 @@ else playsound(loc, 'sound/mobs/humanoids/moth/scream_moth.ogg', 50, TRUE) -/mob/living/basic/mothroach/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/mob/living/basic/mothroach/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(src.stat == DEAD) return diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index b0cffa70f21..b027b13ba77 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -364,7 +364,7 @@ qdel(src) return LAZARUS_INJECTOR_USED -/obj/item/food/deadmouse/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/food/deadmouse/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) var/mob/living/living_user = user if(istype(living_user) && attacking_item.get_sharpness() && living_user.combat_mode) if(!isturf(loc)) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index fd3ec152304..00adadd33fd 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -49,7 +49,7 @@ if(brain) . += "mmi_dead" -/obj/item/mmi/attackby(obj/item/O, mob/user, list/modifiers) +/obj/item/mmi/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) user.changeNext_move(CLICK_CD_MELEE) if(istype(O, /obj/item/organ/brain)) //Time to stick a brain in it --NEO var/obj/item/organ/brain/newbrain = O diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index f431d908b7b..35084d1eb78 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -164,7 +164,7 @@ L.mind.transfer_to(brainmob) to_chat(brainmob, span_notice("You feel slightly disoriented. That's normal when you're just a brain.")) -/obj/item/organ/brain/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/organ/brain/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) user.changeNext_move(CLICK_CD_MELEE) if(istype(item, /obj/item/borg/apparatus/organ_storage)) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index 1c844e8e87b..56237da5a55 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -216,7 +216,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) icon_state = "[base_icon_state]" return -/obj/item/mmi/posibrain/attackby(obj/item/O, mob/user, list/modifiers) +/obj/item/mmi/posibrain/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) return /obj/item/mmi/posibrain/add_mmi_overlay() diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index c4d03c08f31..3e8d92d5a80 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -54,7 +54,7 @@ if(atom_integrity < 90) Die() -/obj/item/clothing/mask/facehugger/attackby(obj/item/O, mob/user, list/modifiers) +/obj/item/clothing/mask/facehugger/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) return O.attack_atom(src, user, modifiers) /obj/item/clothing/mask/facehugger/proc/react_to_mob(datum/source, mob/user) diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 47dec505e4f..ba7dd437a54 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -1,5 +1,5 @@ -/mob/living/silicon/ai/attackby(obj/item/W, mob/user, list/modifiers) +/mob/living/silicon/ai/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/ai_module)) var/obj/item/ai_module/MOD = W disconnect_shell() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index e8dd00ad187..d310301b922 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -456,7 +456,7 @@ user.visible_message(span_notice("[user] repairs [src]!"),span_notice("You repair [src].")) return ITEM_INTERACT_SUCCESS -/mob/living/simple_animal/bot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/mob/living/simple_animal/bot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(attacking_item.GetID()) unlock_with_id(user) return diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index ea63aa4e704..e8e2cb948ea 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -10,7 +10,7 @@ var/build_step = ASSEMBLY_FIRST_STEP var/robot_arm = /obj/item/bodypart/arm/right/robot -/obj/item/bot_assembly/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/bot_assembly/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) ..() if(IS_WRITING_UTENSIL(I)) rename_bot() @@ -73,7 +73,7 @@ return ..() -/obj/item/bot_assembly/cleanbot/attackby(obj/item/item_attached, mob/user, list/modifiers) +/obj/item/bot_assembly/cleanbot/attackby(obj/item/item_attached, mob/user, list/modifiers, list/attack_modifiers) ..() if(!istype(item_attached, /obj/item/bodypart/arm/left/robot) && !istype(item_attached, /obj/item/bodypart/arm/right/robot)) return @@ -98,7 +98,7 @@ var/lasercolor = "" var/vest_type = /obj/item/clothing/suit/armor/vest -/obj/item/bot_assembly/ed209/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/bot_assembly/ed209/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) ..() switch(build_step) if(ASSEMBLY_FIRST_STEP, ASSEMBLY_SECOND_STEP) @@ -225,7 +225,7 @@ if(build_step >= ASSEMBLY_SECOND_STEP) . += mutable_appearance(icon, "repairbot_base_arms", appearance_flags = RESET_COLOR|KEEP_APART) -/obj/item/bot_assembly/repairbot/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/bot_assembly/repairbot/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) ..() switch(build_step) if(ASSEMBLY_FIRST_STEP) @@ -269,7 +269,7 @@ if(skin) icon_state = "[base_icon_state]_[skin]" -/obj/item/bot_assembly/medbot/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/bot_assembly/medbot/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) ..() switch(build_step) if(ASSEMBLY_FIRST_STEP) @@ -310,7 +310,7 @@ icon_state = "honkbot_arm" created_name = "Honkbot" -/obj/item/bot_assembly/honkbot/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/bot_assembly/honkbot/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) ..() switch(build_step) if(ASSEMBLY_FIRST_STEP) @@ -347,7 +347,7 @@ var/swordamt = 0 //If you're converting it into a grievousbot, how many swords have you attached var/toyswordamt = 0 //honk -/obj/item/bot_assembly/secbot/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/bot_assembly/secbot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) ..() var/atom/Tsec = drop_location() switch(build_step) @@ -481,7 +481,7 @@ icon_state = "firebot_arm" created_name = "Firebot" -/obj/item/bot_assembly/firebot/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/bot_assembly/firebot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) ..() switch(build_step) if(ASSEMBLY_FIRST_STEP) @@ -511,7 +511,7 @@ icon_state = "hygienebot" created_name = "Hygienebot" -/obj/item/bot_assembly/hygienebot/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/bot_assembly/hygienebot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) . = ..() var/atom/Tsec = drop_location() switch(build_step) @@ -566,7 +566,7 @@ icon_state = "vim_0" created_name = "\improper Vim" -/obj/item/bot_assembly/vim/attackby(obj/item/part, mob/user, list/modifiers) +/obj/item/bot_assembly/vim/attackby(obj/item/part, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 83f39b05867..1bd4a0f51bd 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -178,7 +178,7 @@ diag_hud_set_mulebotcell() return ITEM_INTERACT_SUCCESS -/mob/living/simple_animal/bot/mulebot/attackby(obj/item/I, mob/living/user, list/modifiers) +/mob/living/simple_animal/bot/mulebot/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/stock_parts/power_store/cell) && bot_cover_flags & BOT_COVER_MAINTS_OPEN) if(cell) to_chat(user, span_warning("[src] already has a power cell!")) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 1ad7640a6a8..b07bf8efe32 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -269,7 +269,7 @@ return ..() -/mob/living/simple_animal/bot/secbot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/mob/living/simple_animal/bot/secbot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) ..() if(!(bot_mode_flags & BOT_MODE_ON)) // Bots won't remember if you hit them while they're off. return diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 18483726202..f947909ae40 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -151,7 +151,7 @@ Difficulty: Hard * * mob/user The user of the item * * params, extra parameters */ -/mob/living/simple_animal/hostile/megafauna/bubblegum/attackby(obj/item/W, mob/user, list/modifiers) +/mob/living/simple_animal/hostile/megafauna/bubblegum/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(istype(W, /obj/item/organ/tongue)) user.client?.give_award(/datum/award/achievement/jobs/frenching, user) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 5f19be2e53f..b2e3628d315 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -768,7 +768,7 @@ Difficulty: Hard layer = LOW_OBJ_LAYER anchored = TRUE -/obj/effect/hierophant/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/effect/hierophant/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/hierophant_club)) var/obj/item/hierophant_club/club = attacking_item if(club.beacon == src) diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index 801c3cb2056..3bdefaa75b1 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -43,13 +43,15 @@ grant_actions_by_list(get_innate_actions()) -/mob/living/simple_animal/hostile/ooze/attacked_by(obj/item/I, mob/living/user) - if(!eat_atom(I, TRUE)) - return ..() +/mob/living/simple_animal/hostile/ooze/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(eat_atom(tool, TRUE)) + return ITEM_INTERACT_SUCCESS + return ..() -/mob/living/simple_animal/hostile/ooze/AttackingTarget(atom/attacked_target) - if(!eat_atom(attacked_target)) - return ..() +/mob/living/simple_animal/hostile/ooze/resolve_unarmed_attack(atom/attack_target, list/modifiers) + if(eat_atom(attack_target)) + return ITEM_INTERACT_SUCCESS + return ..() ///Handles nutrition gain/loss of mob and also makes it take damage if it's too low on nutrition, only happens for sentient mobs. /mob/living/simple_animal/hostile/ooze/Life(seconds_per_tick = SSMOBS_DT, times_fired) @@ -88,12 +90,13 @@ ///Tries to transfer the atoms reagents then delete it /mob/living/simple_animal/hostile/ooze/proc/eat_atom(atom/eat_target, silent) if(isnull(eat_target)) - return + return FALSE if(SEND_SIGNAL(eat_target, COMSIG_OOZE_EAT_ATOM, src, edible_food_types) & COMPONENT_ATOM_EATEN) - return + return TRUE if(silent || !isitem(eat_target)) //Don't bother reporting it for everything - return + return FALSE to_chat(src, span_warning("[eat_target] cannot be eaten!")) + return FALSE ///Updates the display that shows the mobs nutrition /mob/living/simple_animal/hostile/ooze/proc/updateNutritionDisplay() diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index f152af190a9..fd41c1c7f30 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -67,7 +67,7 @@ . = ..() . += span_notice("You could probably attach some wires to it...") -/obj/item/mod/construction/lavalandcore/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/item/mod/construction/lavalandcore/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(!istype(weapon, /obj/item/stack/cable_coil)) return ..() if(!weapon.tool_start_check(user, amount=2)) @@ -155,7 +155,7 @@ display_text = "All it's missing is external plating..." . += span_notice(display_text) -/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, list/modifiers) +/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, list/modifiers, list/attack_modifiers) . = ..() switch(step) if(START_STEP) diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm index 5c13972a4ea..15c9a373f72 100644 --- a/code/modules/mod/mod_link.dm +++ b/code/modules/mod/mod_link.dm @@ -210,7 +210,7 @@ return cell.use(0.02 * STANDARD_CELL_RATE * seconds_per_tick, force = TRUE) -/obj/item/clothing/neck/link_scryer/attackby(obj/item/attacked_by, mob/user, list/modifiers) +/obj/item/clothing/neck/link_scryer/attackby(obj/item/attacked_by, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(cell || !istype(attacked_by, /obj/item/stock_parts/power_store/cell)) return diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 121d698ca7d..fb9b7c9d155 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -521,7 +521,7 @@ return FALSE return TRUE -/obj/item/mod/module/anomaly_locked/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/item/mod/module/anomaly_locked/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(item.type in accepted_anomalies) if(core) balloon_alert(user, "core already in!") diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm index 9e79c968e36..9f1cec7e9fa 100644 --- a/code/modules/mod/modules/module_pathfinder.dm +++ b/code/modules/mod/modules/module_pathfinder.dm @@ -43,7 +43,7 @@ else . += span_warning("The implant is missing.") -/obj/item/mod/module/pathfinder/attack(mob/living/target, mob/living/user, list/modifiers) +/obj/item/mod/module/pathfinder/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) if(!ishuman(target) || !implant) return if(!do_after(user, 1.5 SECONDS, target = target)) diff --git a/code/modules/modular_computers/computers/item/disks/virus_disk.dm b/code/modules/modular_computers/computers/item/disks/virus_disk.dm index 39536b0ed4d..585e7d31558 100644 --- a/code/modules/modular_computers/computers/item/disks/virus_disk.dm +++ b/code/modules/modular_computers/computers/item/disks/virus_disk.dm @@ -109,7 +109,7 @@ ///How much progression should be shown in the uplink, set on purchase of the item. var/current_progression = 0 -/obj/item/computer_disk/virus/frame/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/computer_disk/virus/frame/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!istype(attacking_item, /obj/item/stack/telecrystal)) return diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index ea5170fa548..ef3eeb9eaa5 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -102,7 +102,7 @@ return ..() -/obj/item/modular_computer/pda/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/modular_computer/pda/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) if(!inserted_disk || !ismachinery(target)) return ..() diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 763335d6728..b7a0ae0b9e7 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -157,8 +157,8 @@ /obj/machinery/modular_computer/item_interaction(mob/living/user, obj/item/tool, list/modifiers) return (CPU_INTERACTABLE(user) && !user.combat_mode) ? cpu.item_interaction(user, tool, modifiers) : ..() -/obj/machinery/modular_computer/attacked_by(obj/item/attacking_item, mob/living/user) - return CPU_INTERACTABLE(user) ? cpu.attacked_by(attacking_item, user) : ..() +/obj/machinery/modular_computer/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) + return CPU_INTERACTABLE(user) ? cpu.attacked_by(attacking_item, user, modifiers, attack_modifiers) : ..() // Stronger explosions cause serious damage to internal components // Minor explosions are mostly mitigitated by casing. diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index e8895bacf92..eba717bdb1d 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -28,7 +28,7 @@ SSpai.pai_card_list += src ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) -/obj/item/pai_card/attackby(obj/item/used, mob/user, list/modifiers) +/obj/item/pai_card/attackby(obj/item/used, mob/user, list/modifiers, list/attack_modifiers) if(pai && istype(used, /obj/item/encryptionkey)) if(!pai.encrypt_mod) to_chat(user, span_alert("Encryption Key ports not configured.")) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 27dc999d6dd..f17f3244c0a 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -113,7 +113,7 @@ return TRUE . = ..() -/obj/item/clipboard/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/item/clipboard/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/paper)) //Add paper into the clipboard if(!user.transferItemToLoc(weapon, src)) diff --git a/code/modules/paperwork/desk_bell.dm b/code/modules/paperwork/desk_bell.dm index 96e256d9557..0f37a458729 100644 --- a/code/modules/paperwork/desk_bell.dm +++ b/code/modules/paperwork/desk_bell.dm @@ -57,7 +57,7 @@ /obj/structure/desk_bell/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) -/obj/structure/desk_bell/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/structure/desk_bell/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() times_rang += weapon.force ring_bell(user) diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index f81c60c4b77..2064f3bcd99 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -184,7 +184,7 @@ GLOBAL_VAR_INIT(fax_autoprinting, FALSE) fax_name = new_fax_name return ITEM_INTERACT_SUCCESS -/obj/machinery/fax/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/fax/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if (jammed && clear_jam(item, user)) return if (panel_open) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 10013b4699c..467fa9f8663 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -42,7 +42,7 @@ for(var/obj/item/obj in src) obj.forceMove(loc) -/obj/structure/filingcabinet/attackby(obj/item/P, mob/living/user, list/modifiers) +/obj/structure/filingcabinet/attackby(obj/item/P, mob/living/user, list/modifiers, list/attack_modifiers) if(P.tool_behaviour == TOOL_WRENCH && LAZYACCESS(modifiers, RIGHT_CLICK)) to_chat(user, span_notice("You begin to [anchored ? "unwrench" : "wrench"] [src].")) if(P.use_tool(src, user, 20, volume=50)) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 18089ba1155..53db65673de 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -79,7 +79,7 @@ paper_overlay = contents[1].color_atom_overlay(paper_overlay) return paper_overlay -/obj/item/folder/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/item/folder/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(is_type_in_typecache(weapon, folder_insertables)) //Add paper, photo or documents into the folder if(!user.transferItemToLoc(weapon, src)) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index ee78506302e..39a4f105b18 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -414,7 +414,7 @@ user.put_in_hands(new_plane) return new_plane -/obj/item/paper/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/item/paper/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) // Enable picking paper up by clicking on it with the clipboard or folder if(istype(attacking_item, /obj/item/clipboard) || istype(attacking_item, /obj/item/folder) || istype(attacking_item, /obj/item/paper_bin)) attacking_item.attackby(src, user) diff --git a/code/modules/paperwork/paper_biscuit.dm b/code/modules/paperwork/paper_biscuit.dm index 2bd6e9f053c..020ab8fda15 100644 --- a/code/modules/paperwork/paper_biscuit.dm +++ b/code/modules/paperwork/paper_biscuit.dm @@ -73,7 +73,7 @@ return ..() -/obj/item/folder/biscuit/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/item/folder/biscuit/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if (is_type_in_typecache(weapon, folder_insertables) && !crack_check(user)) return diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index bba25ae4e5f..71471f4bf1f 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -110,7 +110,7 @@ blade_secured = !blade_secured return ITEM_INTERACT_SUCCESS -/obj/item/papercutter/attackby(obj/item/inserted_item, mob/user, list/modifiers) +/obj/item/papercutter/attackby(obj/item/inserted_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(inserted_item, /obj/item/paper)) if(is_type_in_list(inserted_item, list( /obj/item/paper/fake_report, diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 57923741cf0..f301ba3a29c 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -118,7 +118,7 @@ add_fingerprint(user) return ..() -/obj/item/paper_bin/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/paper_bin/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(at_overlay_limit()) dump_contents(drop_location(), TRUE) return diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index a98af743b73..6b0f5a3c658 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -91,7 +91,7 @@ user.put_in_hands(released_paper) -/obj/item/paperplane/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/paperplane/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(IS_WRITING_UTENSIL(attacking_item)) to_chat(user, span_warning("You should unfold [src] before changing it!")) return diff --git a/code/modules/paperwork/paperwork.dm b/code/modules/paperwork/paperwork.dm index 5b3cebc645b..552c392ff5a 100644 --- a/code/modules/paperwork/paperwork.dm +++ b/code/modules/paperwork/paperwork.dm @@ -39,7 +39,7 @@ detailed_desc = span_notice("As you sift through the papers, you slowly start to piece together what you're reading.") -/obj/item/paperwork/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/paperwork/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return @@ -234,7 +234,7 @@ else . += span_notice("These appear to just be a photocopy of the original documents.") -/obj/item/paperwork/photocopy/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/paperwork/photocopy/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/stamp/void) && !stamped && !voided) to_chat(user, span_notice("You plant the [attacking_item] firmly onto the front of the documents.")) stamp_overlay = mutable_appearance('icons/obj/service/bureaucracy.dmi', "paper_stamp-void") diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 4c1e4469bee..63fc7a1cf16 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -242,7 +242,7 @@ SEND_SIGNAL(src, COMSIG_PEN_ROTATED, deg, user) return CLICK_ACTION_SUCCESS -/obj/item/pen/attack(mob/living/M, mob/user, list/modifiers) +/obj/item/pen/attack(mob/living/M, mob/user, list/modifiers, list/attack_modifiers) if(force) // If the pen has a force value, call the normal attack procs. Used for e-daggers and captain's pen mostly. return ..() if(!M.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) @@ -266,7 +266,7 @@ * Sleepypens */ -/obj/item/pen/sleepy/attack(mob/living/M, mob/user, list/modifiers) +/obj/item/pen/sleepy/attack(mob/living/M, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!.) return diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 65b34ddb67d..2957d9a969c 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -546,7 +546,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/photocopier/attackby(obj/item/object, mob/user, list/modifiers) +/obj/machinery/photocopier/attackby(obj/item/object, mob/user, list/modifiers, list/attack_modifiers) if(istype(object, /obj/item/paper) || istype(object, /obj/item/photo) || istype(object, /obj/item/documents)) if(istype(object, /obj/item/paper)) var/obj/item/paper/paper = object diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index 1a20ed0f8e2..bf4e88fa17b 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -177,7 +177,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) maptext_x = 4 maptext = MAPTEXT(current_number) //Finally, apply the maptext -/obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) ..() if(istype(I, /obj/item/hand_labeler_refill)) if(!(ticket_number >= max_number)) diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm index 1a6ea18aafe..66db83342e5 100644 --- a/code/modules/photography/photos/frame.dm +++ b/code/modules/photography/photos/frame.dm @@ -147,7 +147,7 @@ return ITEM_INTERACT_SUCCESS -/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/photo)) if(framed) diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm index 82de4fc01a8..7189a64dbcb 100644 --- a/code/modules/photography/photos/photo.dm +++ b/code/modules/photography/photos/photo.dm @@ -78,7 +78,7 @@ /obj/item/photo/attack_self(mob/user) user.examinate(src) -/obj/item/photo/attackby(obj/item/P, mob/user, list/modifiers) +/obj/item/photo/attackby(obj/item/P, mob/user, list/modifiers, list/attack_modifiers) if(IS_WRITING_UTENSIL(P)) if(!user.can_write(P)) return diff --git a/code/modules/plumbing/plumbers/plumbing_buffer.dm b/code/modules/plumbing/plumbers/plumbing_buffer.dm index 303fda0763f..3f7c06ebb3f 100644 --- a/code/modules/plumbing/plumbers/plumbing_buffer.dm +++ b/code/modules/plumbing/plumbers/plumbing_buffer.dm @@ -77,7 +77,7 @@ to_chat(user, span_notice("New activation threshold is now [activation_volume].")) return -/obj/machinery/plumbing/buffer/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/plumbing/buffer/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(item.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, span_notice("You reset the automatic buffer.")) diff --git a/code/modules/plumbing/plumbers/teleporter.dm b/code/modules/plumbing/plumbers/teleporter.dm index 075308b9fe1..0baa3a8b207 100644 --- a/code/modules/plumbing/plumbers/teleporter.dm +++ b/code/modules/plumbing/plumbers/teleporter.dm @@ -98,7 +98,7 @@ senders = list() -/obj/machinery/plumbing/receiver/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/plumbing/receiver/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, icon_state + "_open", initial(icon_state), I)) update_appearance() return diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 9c169d64c3a..453239f84ce 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -207,7 +207,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list( // - Wirecutters : cut it duh ! // - Multitool : get the power currently passing through the cable // -/obj/structure/cable/attackby(obj/item/item, mob/user, list/modifiers) +/obj/structure/cable/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) handlecable(item, user, modifiers) diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index a127a663755..7d43f319475 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -98,7 +98,7 @@ return ITEM_INTERACT_SUCCESS -/obj/structure/floodlight_frame/attackby(obj/item/O, mob/user, list/modifiers) +/obj/structure/floodlight_frame/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, /obj/item/stack/cable_coil) && state == FLOODLIGHT_NEEDS_WIRES) var/obj/item/stack/S = O if(S.use(5)) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 0241d880a55..3792c405c6c 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -83,7 +83,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) main_part = null return ..() -/obj/machinery/gravity_generator/part/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/gravity_generator/part/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(!main_part) return return main_part.attackby(weapon, user) @@ -235,7 +235,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) . += span_notice("The new plating just needs to be bolted into place now.") // Fixing the gravity generator. -/obj/machinery/gravity_generator/main/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/gravity_generator/main/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(machine_stat & BROKEN) switch(broken_state) if(GRAV_NEEDS_SCREWDRIVER) diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 7b5fd6e4418..598f1b3afe7 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -387,7 +387,7 @@ // attack with item - insert light (if right type), otherwise try to break the light -/obj/machinery/light/attackby(obj/item/tool, mob/living/user, list/modifiers) +/obj/machinery/light/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers) // attempt to insert light if(istype(tool, /obj/item/light)) if(status == LIGHT_OK) @@ -469,14 +469,17 @@ real_cell.forceMove(new_light) cell = null -/obj/machinery/light/attacked_by(obj/item/attacking_object, mob/living/user) - ..() +/obj/machinery/light/attacked_by(obj/item/attacking_object, mob/living/user, list/modifiers, list/attack_modifiers) + . = ..() + if(!.) + return if(status != LIGHT_BROKEN && status != LIGHT_EMPTY) return if(!on || !(attacking_object.obj_flags & CONDUCTS_ELECTRICITY)) return - if(prob(12)) - electrocute_mob(user, get_area(src), src, 0.3, TRUE) + if(!prob(12)) + return + electrocute_mob(user, get_area(src), src, 0.3, TRUE) /obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() diff --git a/code/modules/power/lighting/light_construct.dm b/code/modules/power/lighting/light_construct.dm index 06f76ade214..3b4ab157b0e 100644 --- a/code/modules/power/lighting/light_construct.dm +++ b/code/modules/power/lighting/light_construct.dm @@ -75,7 +75,7 @@ cell_reference.forceMove(drop_location()) return cell_reference.attack_tk(user) -/obj/structure/light_construct/attackby(obj/item/tool, mob/user, list/modifiers) +/obj/structure/light_construct/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(istype(tool, /obj/item/stock_parts/power_store/cell)) if(!cell_connectors) diff --git a/code/modules/power/lighting/light_items.dm b/code/modules/power/lighting/light_items.dm index 5f93047cd6c..51acfd7ff57 100644 --- a/code/modules/power/lighting/light_items.dm +++ b/code/modules/power/lighting/light_items.dm @@ -30,7 +30,7 @@ AddElement(/datum/element/update_icon_updates_onmob) AddComponent(/datum/component/golem_food, golem_food_key = /obj/item/light, extra_validation = CALLBACK(src, PROC_REF(is_intact))) -/obj/item/light/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/light/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(istype(attacking_item, /obj/item/lightreplacer)) @@ -127,7 +127,7 @@ ..() shatter(M) -/obj/item/light/attack_atom(obj/O, mob/living/user, list/modifiers) +/obj/item/light/attack_atom(obj/O, mob/living/user, list/modifiers, list/attack_modifiers) ..() shatter(O) diff --git a/code/modules/power/pipecleaners.dm b/code/modules/power/pipecleaners.dm index 6d3d9c780d7..9297140b7b8 100644 --- a/code/modules/power/pipecleaners.dm +++ b/code/modules/power/pipecleaners.dm @@ -151,7 +151,7 @@ By design, d1 is the smallest direction and d2 is the highest investigate_log("was pulled up by [key_name(usr)] in [AREACOORD(src)]", INVESTIGATE_WIRES) deconstruct() -/obj/structure/pipe_cleaner/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/pipe_cleaner/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) handlecable(W, user, modifiers) /obj/structure/pipe_cleaner/singularity_pull(atom/singularity, current_size) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 8d49df1d485..81c3a78996e 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -175,7 +175,7 @@ else disconnect_from_network() -/obj/machinery/power/port_gen/pacman/attackby(obj/item/O, mob/user, list/modifiers) +/obj/machinery/power/port_gen/pacman/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, sheet_path)) var/obj/item/stack/addstack = O var/amount = min((max_sheets - sheets), addstack.amount) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 39286aa0a7e..fba78f4559b 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -324,7 +324,7 @@ // attach a wire to a power machine - leads from the turf you are standing on //almost never called, overwritten by all power machines but terminal and generator -/obj/machinery/power/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/power/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W var/turf/T = user.loc diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 8398ff4dafc..4390ae73854 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -37,7 +37,7 @@ if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads: Power generation at [display_power(power_gen, convert = FALSE)].") -/obj/machinery/power/rtg/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/power/rtg/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I)) return else if(default_deconstruction_crowbar(I)) @@ -142,7 +142,7 @@ power_gen = 750 anchored = TRUE -/obj/machinery/power/rtg/old_station/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/power/rtg/old_station/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I)) to_chat(user,span_warning("You feel it crumbling under your hands!")) return diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 1deecc52344..6be5d155949 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -50,7 +50,7 @@ shock(user) return TRUE -/obj/machinery/field/containment/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/field/containment/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) shock(user) return TRUE diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index d850d6f5e58..f8d53960883 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -335,7 +335,7 @@ locked = !locked to_chat(user, span_notice("You [src.locked ? "lock" : "unlock"] the controls.")) -/obj/machinery/power/emitter/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/power/emitter/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(item.GetID()) togglelock(user) return diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 060425af013..26df900409b 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -312,7 +312,7 @@ return randomise_offset(anchored ? 0 : random_offset) -/obj/item/solar_assembly/attackby(obj/item/item_used, mob/user, list/modifiers) +/obj/item/solar_assembly/attackby(obj/item/item_used, mob/user, list/modifiers, list/attack_modifiers) if(item_used.tool_behaviour == TOOL_WRENCH && isturf(loc)) if(isinspace()) to_chat(user, span_warning("You can't secure [src] here.")) @@ -566,7 +566,7 @@ return TRUE return FALSE -/obj/machinery/power/solar_control/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/machinery/power/solar_control/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_SCREWDRIVER) if(I.use_tool(src, user, 20, volume=50)) if (src.machine_stat & BROKEN) diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm index 186492e6c10..1f929ba0ed2 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -65,7 +65,7 @@ qdel(rip_u) return COMPONENT_CANCEL_ATTACK_CHAIN -/obj/machinery/power/supermatter_crystal/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/power/supermatter_crystal/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/scalpel/supermatter)) var/obj/item/scalpel/supermatter/scalpel = item to_chat(user, span_notice("You carefully begin to scrape \the [src] with \the [scalpel]...")) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index ff550ad13b4..237bbadfc84 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -76,7 +76,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/power/energy_accumulator/tesla_coil/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/power/energy_accumulator/tesla_coil/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "coil_open[anchored]", "coil[anchored]", W)) return @@ -158,7 +158,7 @@ default_unfasten_wrench(user, tool) return ITEM_INTERACT_SUCCESS -/obj/machinery/power/energy_accumulator/grounding_rod/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/power/energy_accumulator/grounding_rod/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "grounding_rod_open[anchored]", "grounding_rod[anchored]", W)) return diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index e0abfe231fb..83377666650 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -129,7 +129,7 @@ if(!loaded_projectile) loaded_projectile = new projectile_type(src, src) -/obj/item/ammo_casing/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/ammo_casing/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/ammo_box)) var/obj/item/ammo_box/box = I if(isturf(loc)) diff --git a/code/modules/projectiles/ammunition/ballistic/foam.dm b/code/modules/projectiles/ammunition/ballistic/foam.dm index 9f1060799f6..2a232d4dba7 100644 --- a/code/modules/projectiles/ammunition/ballistic/foam.dm +++ b/code/modules/projectiles/ammunition/ballistic/foam.dm @@ -43,7 +43,7 @@ [length(type_initial_names) ? ", such as [english_list(type_initial_names, and_text = "or ", final_comma_text = ", ")]" : ""].") -/obj/item/ammo_casing/foam_dart/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/ammo_casing/foam_dart/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if (attacking_item.tool_behaviour != TOOL_SCREWDRIVER || modified) return ..() diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index d0e7bb3fee8..b02a9d21d16 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -311,7 +311,7 @@ return ..() -/obj/item/gun/ballistic/automatic/l6_saw/attackby(obj/item/A, mob/user, list/modifiers) +/obj/item/gun/ballistic/automatic/l6_saw/attackby(obj/item/A, mob/user, list/modifiers, list/attack_modifiers) if(!cover_open && istype(A, accepted_magazine_type)) balloon_alert(user, "open the cover!") return diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 0440c142c66..11b61cba8b2 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -15,7 +15,7 @@ /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted pin = /obj/item/firing_pin -/obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, list/modifiers) +/obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, list/modifiers, list/attack_modifiers) ..() if(istype(A, /obj/item/ammo_box) || isammocasing(A)) chamber_round() diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 1b0f779d85b..a436f582a2f 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -93,7 +93,7 @@ return underbarrel.try_fire_gun(target, user, params) return ..() -/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) var/obj/projectile/energy/fisher/melee/simulated_hit = new simulated_hit.firer = user simulated_hit.on_hit(target) diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index b531d96d221..e579148f03d 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -165,7 +165,7 @@ setting_overlay = mutable_appearance(icon,setting_iconstate()) add_overlay(setting_overlay) -/obj/item/gun/energy/dueling/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/gun/energy/dueling/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/gun/energy/dueling)) var/obj/item/gun/energy/dueling/other_gun = W diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index c63b58f4261..32c17488158 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -53,7 +53,7 @@ else ..() -/obj/item/minigunpack/attackby(obj/item/W, mob/user, list/modifiers) +/obj/item/minigunpack/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(W == gun) //Don't need armed check, because if you have the gun assume its armed. user.dropItemToGround(gun, TRUE) else diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm index 2cdbf1ed6aa..0f4da4e0ef2 100644 --- a/code/modules/projectiles/guns/energy/recharge.dm +++ b/code/modules/projectiles/guns/energy/recharge.dm @@ -156,7 +156,7 @@ While some would argue that this is a really terrible design choice, others argue that it is very funny to be able to shoot at light sources.
\ Caveat emptor.") -/obj/item/gun/energy/recharge/fisher/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/gun/energy/recharge/fisher/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/special/grenade_launcher.dm b/code/modules/projectiles/guns/special/grenade_launcher.dm index 3594f0dd3b0..9a290459389 100644 --- a/code/modules/projectiles/guns/special/grenade_launcher.dm +++ b/code/modules/projectiles/guns/special/grenade_launcher.dm @@ -24,7 +24,7 @@ max_grenades = reset_fantasy_variable("max_syringes", max_grenades) return ..() -/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/grenade/c4)) return diff --git a/code/modules/projectiles/guns/special/hand_of_midas.dm b/code/modules/projectiles/guns/special/hand_of_midas.dm index 3d1c578dfc6..80aa94d31a5 100644 --- a/code/modules/projectiles/guns/special/hand_of_midas.dm +++ b/code/modules/projectiles/guns/special/hand_of_midas.dm @@ -75,7 +75,7 @@ return ITEM_INTERACT_SUCCESS // If we botch a shot, we have to start over again by inserting gold coins into the gun. Can only be done if it has no charges or gold. -/obj/item/gun/magic/midas_hand/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/item/gun/magic/midas_hand/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(charges || gold_timer) balloon_alert(user, "already loaded") diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 66f45970f75..a965defcd3b 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -259,7 +259,7 @@ gun.desc = gun::desc ..() -/obj/item/firing_pin/paywall/attackby(obj/item/M, mob/living/user, list/modifiers) +/obj/item/firing_pin/paywall/attackby(obj/item/M, mob/living/user, list/modifiers, list/attack_modifiers) if(isidcard(M)) var/obj/item/card/id/id = M if(!id.registered_account) diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm index cad406ed8a9..810b13e6d0d 100644 --- a/code/modules/reagents/chemistry/items.dm +++ b/code/modules/reagents/chemistry/items.dm @@ -159,7 +159,7 @@ if(reagent_type) reagents.add_reagent(reagent_type, 15) -/obj/item/burner/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/item/burner/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(is_reagent_container(I)) if(lit) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 568f1ac86d4..54ebe3871ac 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -80,7 +80,7 @@ update_appearance() SStgui.update_uis(src) -/obj/machinery/computer/pandemic/attackby(obj/item/held_item, mob/user, list/modifiers) +/obj/machinery/computer/pandemic/attackby(obj/item/held_item, mob/user, list/modifiers, list/attack_modifiers) //Advanced science! Precision instruments (eg droppers and syringes) are precise enough to modify the loaded sample! if(istype(held_item, /obj/item/reagent_containers/dropper) || istype(held_item, /obj/item/reagent_containers/syringe)) if(!beaker) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 97e7f8b4c78..7f6345b4151 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -83,7 +83,7 @@ . = ..() RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_change)) -/obj/item/reagent_containers/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/reagent_containers/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) if (!user.combat_mode) return return ..() @@ -119,7 +119,7 @@ balloon_alert(user, "transferring [amount_per_transfer_from_this]u") mode_change_message(user) -/obj/item/reagent_containers/pre_attack_secondary(atom/target, mob/living/user, list/modifiers) +/obj/item/reagent_containers/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) if(HAS_TRAIT(target, TRAIT_DO_NOT_SPLASH)) return ..() if(!user.combat_mode) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 8349141e32a..6cd19bf7f28 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -100,7 +100,7 @@ /obj/item/reagent_containers/blood/universal blood_type = BLOOD_TYPE_UNIVERSAL -/obj/item/reagent_containers/blood/attackby(obj/item/tool, mob/user, list/modifiers) +/obj/item/reagent_containers/blood/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) if (IS_WRITING_UTENSIL(tool)) if(!user.can_write(tool)) return diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index d0005ee5a7b..d4672f0b83c 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -177,7 +177,7 @@ return NONE -/obj/item/reagent_containers/cup/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/reagent_containers/cup/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) var/hotness = attacking_item.get_temperature() if(hotness && reagents) reagents.expose_temperature(hotness) @@ -410,7 +410,7 @@ melee = 10 acid = 50 -/obj/item/reagent_containers/cup/bucket/attackby(obj/O, mob/user, list/modifiers) +/obj/item/reagent_containers/cup/bucket/attackby(obj/O, mob/user, list/modifiers, list/attack_modifiers) if(istype(O, /obj/item/mop)) if(reagents.total_volume < 1) user.balloon_alert(user, "empty!") diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index 6c2f8b91f90..2969758475b 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -697,7 +697,7 @@ if(do_after(user, 1 SECONDS, src)) return pop_cork(user, sabrage = FALSE, froth_severity = pick(0, 1)) -/obj/item/reagent_containers/cup/glass/bottle/champagne/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/item/reagent_containers/cup/glass/bottle/champagne/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(spillable) @@ -942,7 +942,7 @@ target.fire_act() new /obj/effect/hotspot(get_turf(target)) -/obj/item/reagent_containers/cup/glass/bottle/molotov/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/reagent_containers/cup/glass/bottle/molotov/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.get_temperature() && !active) active = TRUE log_bomber(user, "has primed a", src, "for detonation") diff --git a/code/modules/reagents/reagent_containers/misc.dm b/code/modules/reagents/reagent_containers/misc.dm index 4f1dafcce11..ee354cc9d35 100644 --- a/code/modules/reagents/reagent_containers/misc.dm +++ b/code/modules/reagents/reagent_containers/misc.dm @@ -73,7 +73,7 @@ to_chat(user, span_notice("You screw the battery case on [src] [open ? "open" : "closed"] .")) update_appearance() -/obj/item/reagent_containers/cup/maunamug/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/reagent_containers/cup/maunamug/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(!istype(I, /obj/item/stock_parts/power_store/cell)) return ..() diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 72a105e2c48..e3f4e36a7a4 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -132,7 +132,7 @@ current_range = spray_range to_chat(user, span_notice("You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""].")) -/obj/item/reagent_containers/spray/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/reagent_containers/spray/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) var/hotness = I.get_temperature() if(hotness && reagents) reagents.expose_temperature(hotness) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index c664bc3f2bc..ae3500a8072 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -34,7 +34,7 @@ CALLBACK(src, PROC_REF(get_dart_var_modifiers))\ ) -/obj/item/reagent_containers/syringe/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/reagent_containers/syringe/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) return /obj/item/reagent_containers/syringe/proc/try_syringe(atom/target, mob/user) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 849ec6059cd..1aeb8fff1ff 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -81,7 +81,7 @@ if(tank_volume && (damage_flag == BULLET || damage_flag == LASER)) boom() -/obj/structure/reagent_dispensers/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/reagent_dispensers/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(attacking_item.is_refillable()) return FALSE //so we can refill them via their afterattack. if(istype(attacking_item, /obj/item/assembly_holder) && accepts_rig) @@ -301,7 +301,7 @@ // if this sucks, feel free to change it, but make sure the damn thing will log. thanks. return ..() -/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(attacking_item.tool_behaviour != TOOL_WELDER) return ..() diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 414c13964bc..49d072c8101 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -285,7 +285,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) GLOB.move_manager.stop_looping(thing, SSconveyors) // attack with item, place item on conveyor -/obj/machinery/conveyor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/machinery/conveyor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(attacking_item.tool_behaviour == TOOL_CROWBAR) user.visible_message(span_notice("[user] struggles to pry up [src] with [attacking_item]."), \ span_notice("You struggle to pry up [src] with [attacking_item].")) @@ -338,7 +338,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) else return ..() -/obj/machinery/conveyor/attackby_secondary(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/machinery/conveyor/attackby_secondary(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(attacking_item.tool_behaviour == TOOL_SCREWDRIVER) attacking_item.play_tool_sound(src) flipped = !flipped @@ -545,7 +545,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/machinery/conveyor_switch/attack_robot_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/conveyor_switch/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/conveyor_switch/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(is_wire_tool(attacking_item)) wires.interact(user) return TRUE @@ -660,7 +660,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) use(1) return ITEM_INTERACT_SUCCESS -/obj/item/stack/conveyor/attackby(obj/item/item_used, mob/user, list/modifiers) +/obj/item/stack/conveyor/attackby(obj/item/item_used, mob/user, list/modifiers, list/attack_modifiers) ..() if(istype(item_used, /obj/item/conveyor_switch_construct)) to_chat(user, span_notice("You link the switch to the conveyor belt assembly.")) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 0da491c8a97..11c1cc83809 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -111,7 +111,7 @@ air_contents.merge(removed) trunk_check() -/obj/machinery/disposal/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/machinery/disposal/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) if(!pressure_charging && !full_pressure && !flush) if(I.tool_behaviour == TOOL_SCREWDRIVER) @@ -378,7 +378,7 @@ var/obj/item/dest_tagger/mounted_tagger // attack by item places it in to disposal -/obj/machinery/disposal/bin/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/disposal/bin/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/storage/bag/trash)) //Not doing component overrides because this is a specific type. var/obj/item/storage/bag/trash/bag = weapon to_chat(user, span_warning("You empty the bag.")) @@ -388,7 +388,7 @@ return ..() // handle machine interaction -/obj/machinery/disposal/bin/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/disposal/bin/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/dest_tagger)) var/obj/item/dest_tagger/new_tagger = weapon if(mounted_tagger) diff --git a/code/modules/recycling/disposal/pipe_sorting.dm b/code/modules/recycling/disposal/pipe_sorting.dm index 0d3ec432b1a..b438e88e4d7 100644 --- a/code/modules/recycling/disposal/pipe_sorting.dm +++ b/code/modules/recycling/disposal/pipe_sorting.dm @@ -55,7 +55,7 @@ else . += "It has no sorting tags set." -/obj/structure/disposalpipe/sorting/mail/attackby(obj/item/I, mob/user, list/modifiers) +/obj/structure/disposalpipe/sorting/mail/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/dest_tagger)) var/obj/item/dest_tagger/O = I diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 55b60d8f5ab..a293d31b07c 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -103,7 +103,7 @@ if(sticker) . += "[base_icon_state]_barcode" -/obj/item/delivery/attackby(obj/item/item, mob/user, list/modifiers) +/obj/item/delivery/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/dest_tagger)) var/obj/item/dest_tagger/dest_tagger = item @@ -352,7 +352,7 @@ if(payments_acc) . += span_notice("Ctrl-click to clear the registered account.") -/obj/item/sales_tagger/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/item/sales_tagger/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(isidcard(item)) var/obj/item/card/id/potential_acc = item diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm index 87d033d543a..e28be0d4e55 100644 --- a/code/modules/religion/burdened/psyker.dm +++ b/code/modules/religion/burdened/psyker.dm @@ -204,7 +204,7 @@ /obj/item/gun/ballistic/revolver/chaplain/attack_self(mob/living/user) pray_refill(user) -/obj/item/gun/ballistic/revolver/chaplain/attackby(obj/item/possibly_ammo, mob/user, list/modifiers) +/obj/item/gun/ballistic/revolver/chaplain/attackby(obj/item/possibly_ammo, mob/user, list/modifiers, list/attack_modifiers) if (isammocasing(possibly_ammo) || istype(possibly_ammo, /obj/item/ammo_box)) user.balloon_alert(user, "no manual reloads!") return diff --git a/code/modules/research/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm index ab24f5ca631..16a9277c26e 100644 --- a/code/modules/research/anomaly/anomaly_core.dm +++ b/code/modules/research/anomaly/anomaly_core.dm @@ -30,7 +30,7 @@ /obj/item/assembly/signaler/anomaly/attack_self() return -/obj/item/assembly/signaler/anomaly/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/assembly/signaler/anomaly/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(I.tool_behaviour == TOOL_ANALYZER) to_chat(user, span_notice("Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code].")) return ..() diff --git a/code/modules/research/anomaly/anomaly_refinery.dm b/code/modules/research/anomaly/anomaly_refinery.dm index 55ea8324012..7ec62a618d9 100644 --- a/code/modules/research/anomaly/anomaly_refinery.dm +++ b/code/modules/research/anomaly/anomaly_refinery.dm @@ -73,7 +73,7 @@ var/radius = clamp(round(MIN_RADIUS_REQUIRED + radius_increase_per_core * already_made, 1), MIN_RADIUS_REQUIRED, MAX_RADIUS_REQUIRED) return radius -/obj/machinery/research/anomaly_refinery/attackby(obj/item/tool, mob/living/user, list/modifiers) +/obj/machinery/research/anomaly_refinery/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers) if(active) to_chat(user, span_warning("You can't insert [tool] into [src] while [p_theyre()] currently active.")) return diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 3540a30b2d4..b73ae51bdd7 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -115,7 +115,7 @@ if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads: Malfunction probability reduced by [malfunction_probability_coeff]%.
Cooldown interval between experiments at [resetTime*0.1] seconds.") -/obj/machinery/rnd/experimentor/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/machinery/rnd/experimentor/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(user.combat_mode) return ..() if(!is_insertion_ready(user)) diff --git a/code/modules/research/ordnance/doppler_array.dm b/code/modules/research/ordnance/doppler_array.dm index 50aabe04b2b..1f1d4600938 100644 --- a/code/modules/research/ordnance/doppler_array.dm +++ b/code/modules/research/ordnance/doppler_array.dm @@ -48,7 +48,7 @@ . = ..() . += span_notice("It is currently facing [dir2text(dir)]") -/obj/machinery/doppler_array/attackby(obj/item/item, mob/user, list/modifiers) +/obj/machinery/doppler_array/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) if(istype(item, /obj/item/computer_disk)) var/obj/item/computer_disk/disk = item eject_disk(user) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index b153cff87ac..9a481d6f362 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -66,7 +66,7 @@ Nothing else in the console has ID requirements. d_disk = null return ..() -/obj/machinery/computer/rdconsole/attackby(obj/item/D, mob/user, list/modifiers) +/obj/machinery/computer/rdconsole/attackby(obj/item/D, mob/user, list/modifiers, list/attack_modifiers) //Loading a disk into it. if(istype(D, /obj/item/disk)) if(istype(D, /obj/item/disk/tech_disk)) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 14fc5466a7d..5048163ea92 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -165,7 +165,7 @@ return ITEM_INTERACT_BLOCKING return ..() -/obj/machinery/rnd/server/master/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/machinery/rnd/server/master/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/computer_disk/hdd_theft)) switch(deconstruction_state) if(HDD_PANEL_CLOSED) diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index c2cf8b339d3..c34e07ca4f1 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -27,7 +27,7 @@ Slimecrossing Weapons throwforce = 15 damtype = BRUTE -/obj/item/knife/rainbowknife/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/knife/rainbowknife/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(isliving(target)) damtype = pick(BRUTE, BURN, TOX, OXY) switch(damtype) diff --git a/code/modules/research/xenobiology/vatgrowing/petri_dish.dm b/code/modules/research/xenobiology/vatgrowing/petri_dish.dm index 68600e24652..08e88b1e481 100644 --- a/code/modules/research/xenobiology/vatgrowing/petri_dish.dm +++ b/code/modules/research/xenobiology/vatgrowing/petri_dish.dm @@ -26,7 +26,7 @@ var/datum/micro_organism/MO = i . += MO.get_details() -/obj/item/petri_dish/pre_attack(atom/A, mob/living/user, list/modifiers) +/obj/item/petri_dish/pre_attack(atom/A, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(!sample || !istype(A, /obj/structure/sink)) return FALSE diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 2b235068b5a..7e865b7743a 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -118,7 +118,7 @@ user.hud_used.show_hud(user.hud_used.hud_version) return ..() -/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/used_item, mob/user, list/modifiers) +/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/used_item, mob/user, list/modifiers, list/attack_modifiers) if(istype(used_item, /obj/item/food/monkeycube)) monkeys++ to_chat(user, span_notice("You feed [used_item] to [src]. It now has [monkeys] monkey cubes stored.")) diff --git a/code/modules/shuttle/misc/special.dm b/code/modules/shuttle/misc/special.dm index a1c609bbca6..a7f97136382 100644 --- a/code/modules/shuttle/misc/special.dm +++ b/code/modules/shuttle/misc/special.dm @@ -62,7 +62,7 @@ active = FALSE update_appearance() -/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) return /obj/machinery/power/emitter/energycannon/magical/ex_act(severity) @@ -259,7 +259,7 @@ /obj/machinery/scanner_gate/luxury_shuttle/auto_scan(atom/movable/AM) return -/obj/machinery/scanner_gate/luxury_shuttle/attackby(obj/item/W, mob/user, list/modifiers) +/obj/machinery/scanner_gate/luxury_shuttle/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) return /obj/machinery/scanner_gate/luxury_shuttle/emag_act(mob/user, obj/item/card/emag/emag_card) diff --git a/code/modules/spells/spell_types/self/spacetime_distortion.dm b/code/modules/spells/spell_types/self/spacetime_distortion.dm index ca2988381a0..b2d43a99ee6 100644 --- a/code/modules/spells/spell_types/self/spacetime_distortion.dm +++ b/code/modules/spells/spell_types/self/spacetime_distortion.dm @@ -149,7 +149,7 @@ if(!busy) walk_link(AM) -/obj/effect/cross_action/spacetime_dist/attackby(obj/item/W, mob/user, list/modifiers) +/obj/effect/cross_action/spacetime_dist/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(user.temporarilyRemoveItemFromInventory(W)) walk_link(W) else diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 8178f95cfde..d92fa18cf49 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -426,7 +426,7 @@ return return ..() -/obj/item/bodypart/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/item/bodypart/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) SHOULD_CALL_PARENT(TRUE) if(weapon.get_sharpness()) diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 285ae12da98..bca64d47739 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -294,7 +294,7 @@ TRAIT_RESISTHIGHPRESSURE, ), AUGMENTATION_TRAIT) -/obj/item/bodypart/chest/robot/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/item/bodypart/chest/robot/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/stock_parts/power_store/cell)) if(cell) to_chat(user, span_warning("You have already inserted a cell!")) @@ -438,7 +438,7 @@ . += "It has two eye sockets occupied by flashes." . += span_notice("You can remove the seated flash[single_flash ? "":"es"] with a crowbar.") -/obj/item/bodypart/head/robot/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/item/bodypart/head/robot/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/assembly/flash/handheld)) var/obj/item/assembly/flash/handheld/flash = weapon if(flash1 && flash2) diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm index 8d1ac88011c..fc60b26f4d5 100644 --- a/code/modules/surgery/experimental_dissection.dm +++ b/code/modules/surgery/experimental_dissection.dm @@ -117,7 +117,7 @@ . = ..() . += span_notice("It is worth [value] research points.") -/obj/item/research_notes/attackby(obj/item/attacking_item, mob/living/user, list/modifiers) +/obj/item/research_notes/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(attacking_item, /obj/item/research_notes)) var/obj/item/research_notes/notes = attacking_item value = value + notes.value diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 22ed3802def..2a578a89475 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -118,11 +118,11 @@ /obj/item/autosurgeon/attack_self(mob/user)//when the object it used... use_autosurgeon(user, user) -/obj/item/autosurgeon/attack(mob/living/target, mob/living/user, list/modifiers) +/obj/item/autosurgeon/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers) add_fingerprint(user) use_autosurgeon(target, user, 8 SECONDS) -/obj/item/autosurgeon/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/item/autosurgeon/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(isorgan(attacking_item)) load_organ(attacking_item, user) else diff --git a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm index 4b6304eabf8..eccb6b9f55a 100644 --- a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm +++ b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm @@ -51,7 +51,7 @@ tesla_zap(source = organ_owner, zap_range = 20, power = 2.5e5, cutoff = 1e3) qdel(src) -/obj/item/organ/heart/cybernetic/anomalock/attack(mob/living/target_mob, mob/living/user, list/modifiers) +/obj/item/organ/heart/cybernetic/anomalock/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers) if(target_mob != user || !istype(target_mob) || !core) return ..() diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm index f3bd07d07d5..236590697a6 100644 --- a/code/modules/transport/tram/tram_controller.dm +++ b/code/modules/transport/tram/tram_controller.dm @@ -845,7 +845,7 @@ . += span_notice("The cabinet can be opened with a [EXAMINE_HINT("Left-click.")]") -/obj/machinery/transport/tram_controller/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/machinery/transport/tram_controller/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(user.combat_mode || cover_open) return ..() diff --git a/code/modules/transport/tram/tram_signals.dm b/code/modules/transport/tram/tram_signals.dm index c20be7edf59..52b3f45186c 100644 --- a/code/modules/transport/tram/tram_signals.dm +++ b/code/modules/transport/tram/tram_signals.dm @@ -118,7 +118,7 @@ SStransport.crossing_signals -= src . = ..() -/obj/machinery/transport/crossing_signal/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/machinery/transport/crossing_signal/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(!user.combat_mode) if(default_deconstruction_screwdriver(user, icon_state, icon_state, weapon)) return @@ -180,7 +180,7 @@ find_uplink() return CLICK_ACTION_SUCCESS -/obj/machinery/transport/crossing_signal/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/transport/crossing_signal/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(weapon.tool_behaviour == TOOL_WRENCH && panel_open) @@ -519,7 +519,7 @@ . += span_notice("The red [EXAMINE_HINT("local fault")] light is on.") . += span_notice("The status display reads: Repair required.") -/obj/machinery/transport/guideway_sensor/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/machinery/transport/guideway_sensor/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if (!user.combat_mode) if(default_deconstruction_screwdriver(user, icon_state, icon_state, weapon)) return diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm index bff8b795898..a9ba78d9898 100644 --- a/code/modules/transport/tram/tram_structures.dm +++ b/code/modules/transport/tram/tram_structures.dm @@ -163,7 +163,7 @@ update_appearance() return ITEM_INTERACT_SUCCESS -/obj/structure/tram/attackby_secondary(obj/item/tool, mob/user, list/modifiers) +/obj/structure/tram/attackby_secondary(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) switch(state) if(TRAM_SCREWED_TO_FRAME) if(tool.tool_behaviour == TOOL_SCREWDRIVER) @@ -218,7 +218,7 @@ for(var/i in 1 to mineral_amount) new mineral(loc) -/obj/structure/tram/attackby(obj/item/item, mob/user, list/modifiers) +/obj/structure/tram/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(istype(item, /obj/item/wallframe/tram)) @@ -353,7 +353,7 @@ /// The last time a radiation pulse was performed var/last_event = 0 -/obj/structure/tram/alt/uranium/attackby(obj/item/W, mob/user, list/modifiers) +/obj/structure/tram/alt/uranium/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) radiate() return ..() diff --git a/code/modules/transport/transport_module.dm b/code/modules/transport/transport_module.dm index 6ff6ba76ab7..1a3c76e3f5b 100644 --- a/code/modules/transport/transport_module.dm +++ b/code/modules/transport/transport_module.dm @@ -745,7 +745,7 @@ return open_lift_radial(user) -/obj/structure/transport/linear/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/structure/transport/linear/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(!radial_travel) return ..() diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index a0828bf8a55..b8ddc586594 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -103,14 +103,14 @@ foam.set_up(4, holder = src, location = loc, carry = foamreagent) foam.start() -/obj/vehicle/sealed/car/clowncar/attacked_by(obj/item/I, mob/living/user) - . = ..() - if(!istype(I, /obj/item/food/grown/banana)) +/obj/vehicle/sealed/car/clowncar/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/food/grown/banana)) return - var/obj/item/food/grown/banana/banana = I - atom_integrity += min(banana.seed.potency, max_integrity-atom_integrity) - to_chat(user, span_danger("You use the [banana] to repair [src]!")) + var/obj/item/food/grown/banana/banana = tool + repair_damage(banana.seed.potency) + to_chat(user, span_danger("You use [banana] to repair [src]!")) qdel(banana) + return ITEM_INTERACT_SUCCESS /obj/vehicle/sealed/car/clowncar/Bump(atom/bumped) . = ..() diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index fa8ec712e28..48d4127083b 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -124,7 +124,7 @@ Expects a turf. Returns true if the attack should be blocked, false if not.*/ else . = ..() -/obj/vehicle/sealed/mecha/durand/attackby(obj/item/W as obj, mob/user as mob, list/modifiers) +/obj/vehicle/sealed/mecha/durand/attackby(obj/item/W as obj, mob/user as mob, list/modifiers, list/attack_modifiers) if(defense_check(user.loc)) log_message("Attack absorbed by defense field. Attacker - [user], with [W]", LOG_MECHA, color="orange") shield.attackby(W, user, modifiers) diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 10f997022a1..c7b94cdeac2 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -347,7 +347,7 @@ log_message("Deactivated.", LOG_MECHA) return TRUE -/obj/item/mecha_parts/mecha_equipment/generator/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/item/mecha_parts/mecha_equipment/generator/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(!istype(weapon, fuel)) return FALSE @@ -551,4 +551,3 @@ mech.chassis_camera = new /obj/machinery/camera/exosuit(mech) mech.chassis_camera.update_c_tag(mech) mech.diag_hud_set_camera() - diff --git a/code/modules/vehicles/mecha/mech_bay.dm b/code/modules/vehicles/mecha/mech_bay.dm index 954d8145e68..922b2af7366 100644 --- a/code/modules/vehicles/mecha/mech_bay.dm +++ b/code/modules/vehicles/mecha/mech_bay.dm @@ -76,7 +76,7 @@ recharge_console.update_appearance() -/obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user, list/modifiers) +/obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(default_deconstruction_screwdriver(user, "recharge_port-o", "recharge_port", I)) return diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 653342e429c..71af41eebf8 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -210,14 +210,14 @@ cookedalive.adjust_fire_stacks(1) cookedalive.ignite_mob() -/obj/vehicle/sealed/mecha/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/vehicle/sealed/mecha/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if(istype(weapon, /obj/item/mecha_parts)) var/obj/item/mecha_parts/parts = weapon parts.try_attach_part(user, src, TRUE) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN return ..() -/obj/vehicle/sealed/mecha/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/vehicle/sealed/mecha/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if(user.combat_mode) return ..() if(istype(weapon, /obj/item/mmi)) @@ -319,11 +319,12 @@ balloon_alert(user, "already installed!") return -/obj/vehicle/sealed/mecha/attacked_by(obj/item/attacking_item, mob/living/user) - if(!attacking_item.force) - return +/obj/vehicle/sealed/mecha/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) + var/final_force = CALCULATE_FORCE(attacking_item, attack_modifiers) * attacking_item.get_demolition_modifier(src) + if(!final_force) + return 0 - var/damage_taken = take_damage(attacking_item.force * attacking_item.get_demolition_modifier(src), attacking_item.damtype, MELEE, 1, get_dir(src, user)) + var/damage_taken = take_damage(final_force, attacking_item.damtype, MELEE, 1, get_dir(src, user)) try_damage_component(damage_taken, user.zone_selected) var/hit_verb = length(attacking_item.attack_verb_simple) ? "[pick(attacking_item.attack_verb_simple)]" : "hit" @@ -336,6 +337,7 @@ log_combat(user, src, "attacked", attacking_item) log_message("Attacked by [user]. Item - [attacking_item], Damage - [damage_taken]", LOG_MECHA) + return damage_taken /obj/vehicle/sealed/mecha/attack_generic(mob/user, damage_amount, damage_type, damage_flag, effects, armor_penetration) . = ..() diff --git a/code/modules/vehicles/mecha/mecha_parts.dm b/code/modules/vehicles/mecha/mecha_parts.dm index ae2c1f5e84f..51bb1b4b92d 100644 --- a/code/modules/vehicles/mecha/mecha_parts.dm +++ b/code/modules/vehicles/mecha/mecha_parts.dm @@ -251,7 +251,7 @@ name = "\improper Phazon chassis" construct_type = /datum/component/construction/unordered/mecha_chassis/phazon -/obj/item/mecha_parts/chassis/phazon/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/mecha_parts/chassis/phazon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) . = ..() if(istype(I, /obj/item/assembly/signaler/anomaly) && !istype(I, /obj/item/assembly/signaler/anomaly/ectoplasm)) to_chat(user, "The anomaly core socket only accepts ectoplasm anomaly cores!") diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm index 227b4d726b8..29efdc39504 100644 --- a/code/modules/vehicles/motorized_wheelchair.dm +++ b/code/modules/vehicles/motorized_wheelchair.dm @@ -97,7 +97,7 @@ user.put_in_hands(power_cell) power_cell = null -/obj/vehicle/ridden/wheelchair/motorized/attackby(obj/item/attacking_item, mob/user, list/modifiers) +/obj/vehicle/ridden/wheelchair/motorized/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) if(!panel_open) return ..() diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index 0bd2360a2c9..16ff261b1c3 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -34,7 +34,7 @@ if (installed_upgrade) . += "It has been upgraded with [installed_upgrade], which can be removed with a screwdriver." -/obj/vehicle/ridden/janicart/attackby(obj/item/I, mob/user, list/modifiers) +/obj/vehicle/ridden/janicart/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/storage/bag/trash)) if(trash_bag) to_chat(user, span_warning("[src] already has a trashbag hooked!")) diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index 7771133727d..1bcf91301b1 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -29,7 +29,7 @@ add_occupant(M) return ..() -/obj/vehicle/ridden/attackby(obj/item/I, mob/user, list/modifiers) +/obj/vehicle/ridden/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!key_type || is_key(inserted_key) || !is_key(I)) return ..() if(!user.transferItemToLoc(I, src)) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 2413a8c55a0..187b64835a7 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -241,7 +241,7 @@ icon_state = "scooter_frame" w_class = WEIGHT_CLASS_NORMAL -/obj/item/scooter_frame/attackby(obj/item/I, mob/user, list/modifiers) +/obj/item/scooter_frame/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!istype(I, /obj/item/stack/sheet/iron)) return ..() if(!I.tool_start_check(user, amount=5)) @@ -264,7 +264,7 @@ /obj/vehicle/ridden/scooter/skateboard/wrench_act(mob/living/user, obj/item/I) return -/obj/vehicle/ridden/scooter/skateboard/improvised/attackby(obj/item/I, mob/user, list/modifiers) +/obj/vehicle/ridden/scooter/skateboard/improvised/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(!istype(I, /obj/item/stack/rods)) return ..() if(!I.tool_start_check(user, amount=2)) diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 82426a999c7..b1af55c67e9 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -108,7 +108,7 @@ /obj/vehicle/sealed/proc/exit_location(M) return drop_location() -/obj/vehicle/sealed/attackby(obj/item/I, mob/user, list/modifiers) +/obj/vehicle/sealed/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) if(key_type && !is_key(inserted_key) && is_key(I)) if(user.transferItemToLoc(I, src)) to_chat(user, span_notice("You insert [I] into [src].")) diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 685e8e48aaf..7520f0e2e17 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -61,7 +61,7 @@ else user.balloon_alert_to_viewers("stopped welding [src]", "interrupted the repair!") -/obj/vehicle/ridden/secway/attackby(obj/item/W, mob/living/user, list/modifiers) +/obj/vehicle/ridden/secway/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers) if(!istype(W, /obj/item/food/grown/banana)) return ..() // ignore the occupants because they're presumably too distracted to notice the guy stuffing fruit into their vehicle's exhaust. do segways have exhausts? they do now! diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 9bc279a9bd1..418175f9a9f 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -713,7 +713,7 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) to_chat(user, span_warning("You must first secure [src].")) return TRUE -/obj/machinery/vending/attackby(obj/item/attack_item, mob/living/user, list/modifiers) +/obj/machinery/vending/attackby(obj/item/attack_item, mob/living/user, list/modifiers, list/attack_modifiers) if(panel_open && is_wire_tool(attack_item)) wires.interact(user) return @@ -1800,7 +1800,7 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) vend_ready = TRUE return TRUE -/obj/machinery/vending/custom/attackby(obj/item/attack_item, mob/user, list/modifiers) +/obj/machinery/vending/custom/attackby(obj/item/attack_item, mob/user, list/modifiers, list/attack_modifiers) if(!linked_account && isliving(user)) var/mob/living/living_user = user var/obj/item/card/id/card_used = living_user.get_idcard(TRUE) diff --git a/code/modules/wiremod/components/abstract/module.dm b/code/modules/wiremod/components/abstract/module.dm index 1579025e60a..af9adddcc75 100644 --- a/code/modules/wiremod/components/abstract/module.dm +++ b/code/modules/wiremod/components/abstract/module.dm @@ -229,7 +229,7 @@ . = list() .["global_port_types"] = GLOB.wiremod_basic_types -/obj/item/circuit_component/module/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/item/circuit_component/module/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) if(istype(I, /obj/item/circuit_component)) internal_circuit.attackby(I, user, modifiers) return diff --git a/code/modules/wiremod/components/action/mmi.dm b/code/modules/wiremod/components/action/mmi.dm index aaf924f8d71..3a8cc85b00b 100644 --- a/code/modules/wiremod/components/action/mmi.dm +++ b/code/modules/wiremod/components/action/mmi.dm @@ -155,7 +155,7 @@ return TRUE -/obj/item/circuit_component/mmi/proc/handle_mmi_attack(mob/living/source, atom/target, list/modifiers) +/obj/item/circuit_component/mmi/proc/handle_mmi_attack(mob/living/source, atom/target, list/modifiers, list/attack_modifiers) SIGNAL_HANDLER if(modifiers[RIGHT_CLICK]) clicked_atom.set_output(target) diff --git a/code/modules/wiremod/core/component_printer.dm b/code/modules/wiremod/core/component_printer.dm index 5efa7255f09..f7835a6c1fe 100644 --- a/code/modules/wiremod/core/component_printer.dm +++ b/code/modules/wiremod/core/component_printer.dm @@ -205,7 +205,7 @@ return data -/obj/machinery/component_printer/attackby(obj/item/weapon, mob/living/user, list/modifiers) +/obj/machinery/component_printer/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) if (user.combat_mode) return ..() @@ -431,7 +431,7 @@ created_atom.pixel_x = created_atom.base_pixel_x + rand(-5, 5) created_atom.pixel_y = created_atom.base_pixel_y + rand(-5, 5) -/obj/machinery/module_duplicator/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/module_duplicator/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) var/list/data = list() if(istype(weapon, /obj/item/circuit_component/module)) diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm index 7fe0b0029d9..bbd1303dd05 100644 --- a/code/modules/wiremod/core/integrated_circuit.dm +++ b/code/modules/wiremod/core/integrated_circuit.dm @@ -147,7 +147,7 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) SEND_SIGNAL(src, COMSIG_CIRCUIT_SET_LOCKED, new_value) locked = new_value -/obj/item/integrated_circuit/attackby(obj/item/I, mob/living/user, list/modifiers) +/obj/item/integrated_circuit/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if(istype(I, /obj/item/circuit_component)) add_component_manually(I, user) diff --git a/code/modules/wiremod/core/usb_cable.dm b/code/modules/wiremod/core/usb_cable.dm index 791ecab3735..9c07a5e9e48 100644 --- a/code/modules/wiremod/core/usb_cable.dm +++ b/code/modules/wiremod/core/usb_cable.dm @@ -38,7 +38,7 @@ if (!isnull(attached_circuit)) . += span_notice("It is attached to [attached_circuit.shell || attached_circuit].") -/obj/item/usb_cable/pre_attack(atom/target, mob/living/user, list/modifiers) +/obj/item/usb_cable/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) . = ..() if (.) return diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index 00928610221..72d6ca75180 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -357,7 +357,7 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/bci_implanter/attackby(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/bci_implanter/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) var/obj/item/organ/cyberimp/bci/new_bci = weapon if (istype(new_bci)) if (!(locate(/obj/item/integrated_circuit) in new_bci)) @@ -379,7 +379,7 @@ return ..() -/obj/machinery/bci_implanter/attackby_secondary(obj/item/weapon, mob/user, list/modifiers) +/obj/machinery/bci_implanter/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers) if (!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, weapon)) update_appearance() return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/wiremod/shell/dispenser.dm b/code/modules/wiremod/shell/dispenser.dm index 57ae4acd56e..d31a5cb04c0 100644 --- a/code/modules/wiremod/shell/dispenser.dm +++ b/code/modules/wiremod/shell/dispenser.dm @@ -60,7 +60,7 @@ new /obj/item/circuit_component/dispenser_bot() ), SHELL_CAPACITY_LARGE) -/obj/structure/dispenser_bot/attackby(obj/item/item, mob/living/user, list/modifiers) +/obj/structure/dispenser_bot/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers) if(user.combat_mode) return ..() if(istype(item, /obj/item/wrench) || istype(item, /obj/item/multitool) || istype(item, /obj/item/integrated_circuit)) diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 78f58204e36..74ecdf5213f 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -11,7 +11,7 @@ bare_wound_bonus = 15 sharpness = SHARP_EDGED -/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/user, list/modifiers) +/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers) if(ishuman(target)) try_to_zombie_infect(target, user, user.zone_selected) else if(isliving(target)) diff --git a/modular_zubbers/code/modules/fluff/flora/ash_flora.dm b/modular_zubbers/code/modules/fluff/flora/ash_flora.dm index 7e1c71f4a32..4c7c88d72c7 100644 --- a/modular_zubbers/code/modules/fluff/flora/ash_flora.dm +++ b/modular_zubbers/code/modules/fluff/flora/ash_flora.dm @@ -1,65 +1,6 @@ /obj/structure/flora/ash/cacti can_uproot = TRUE -/obj/structure/flora/attackby(obj/item/used_item, mob/living/user, params) - if(user.combat_mode) - return ..() - if(flags_1 & HOLOGRAM_1) - to_chat(user, "Your [used_item] goes right through \the [src]!") - return ..() - if(can_uproot && used_item.tool_behaviour == TOOL_SHOVEL) - if(uprooted) - if(locate(/obj/structure/flora) in (loc.contents - src)) - to_chat(user, span_warning("There's already a plant here!")) - return - - user.visible_message( - span_notice("[user] starts to replant [src]..."), - span_notice("You start to replant [src]...") - ) - used_item.play_tool_sound(src, 50) - if(!do_after(user, harvest_time, src) || locate(/obj/structure/flora) in (loc.contents - src)) - return - - user.visible_message( - span_notice("[user] replants [src]."), - span_notice("You replant [src].") - ) - replant() - else - user.visible_message( - span_notice("[user] starts to uproot [src]..."), - span_notice("You start to uproot [src]...") - ) - used_item.play_tool_sound(src, 50) - if(!do_after(user, harvest_time, src)) - return - - user.visible_message( - span_notice("[user] uproots [src]."), - span_notice("You uproot [src].") - ) - uproot() - - used_item.play_tool_sound(src, 50) - return - - if(!can_harvest(user, used_item)) - return ..() - - user.visible_message( - span_notice("[user] starts to [harvest_verb] [src]..."), - span_notice("You start to [harvest_verb] [src] with [used_item]...") - ) - play_attack_sound(used_item.force) - if(!do_after(user, harvest_time * used_item.toolspeed, src)) - return - visible_message(span_notice("[user] [harvest_verb][harvest_verb_suffix] [src]."), ignored_mobs = list(user)) - play_attack_sound(used_item.force) - - if(harvest(user)) - after_harvest(user) - /obj/structure/flora/ash/cacti/uproot(mob/living/user) . = ..() qdel(GetComponent(/datum/component/caltrop))