From 525c68d617f95c49f83ae17523ae735af92c9ea9 Mon Sep 17 00:00:00 2001 From: warriorstar-orion Date: Mon, 2 Dec 2024 18:36:36 -0500 Subject: [PATCH] Attack chain, initial setup. (pull *immediately* for *any* TM issues) (#26834) * refactor: Attack chain, initial setup. * migrate curtain to make dreamchecker happy * update thurible * don't call attacked_by separately for legacy attack chain * remove duplicate proc * condense similar code, put allowances for legacy code in new procs * update docs, include diagram source * add comment on how to update diagram * fix admonition * mindflayer updates * remove commented out code * clarify all steps * after_attack should be overridable * whoops * retrofit recent changes * duh, can't restrict this yet because of tool_acts * i hate ore bags with the fire of a thousand suns * return correct value for object attack logic * Various cleanups. We don't want to attempt to pull stuff out of `/obj/item/attackby`, because those pieces are part of the related objects' migrations, not `/obj/item` itself. Attempting to do this causes knockon effects where things expected to call e.g. `/obj/item/storage/attackby` in the call chain were not ferried over to the new item interaction code, because the related objects hadn't actually been migrated over yet. I've used refactoring /obj/vehicle as the example for migrating `attackby` methods instead. * simplify some argument names * fuck it * make it do the thing * Rename CI module call * Prove that CI works * improve test output * aaand fix it again * fix curtain tool interactions * fix compile error * fix compile error * Better docs, introduce migration plan tool. --- .github/workflows/ci.yml | 10 +- .github/workflows/devdocs.yml | 2 +- code/__DEFINES/dcs/atom_signals.dm | 11 - code/__DEFINES/dcs/attack_chain_signals.dm | 67 ++ code/__DEFINES/dcs/item_signals.dm | 21 +- code/__DEFINES/dcs/mob_signals.dm | 2 +- code/_onclick/click.dm | 13 +- code/_onclick/click_override.dm | 2 +- code/_onclick/cyborg.dm | 8 +- code/_onclick/hud/screen_objects.dm | 6 +- code/_onclick/item_attack.dm | 262 +++-- code/_onclick/item_attack_legacy.dm | 115 +++ code/_onclick/telekinesis.dm | 12 +- code/datums/components/defibrillator.dm | 4 +- code/datums/components/ducttape.dm | 4 +- code/datums/components/label.dm | 6 +- code/datums/components/material_container.dm | 4 +- code/datums/components/paintable.dm | 4 +- code/datums/components/radioactive.dm | 4 +- code/datums/components/scope.dm | 2 +- code/datums/components/shelved.dm | 14 +- code/datums/components/spooky.dm | 2 +- code/datums/components/squeak.dm | 6 +- code/datums/components/sticky.dm | 4 +- code/datums/components/surgery_initiator.dm | 6 +- code/datums/components/two_handed.dm | 12 +- code/datums/ores.dm | 8 +- code/datums/outfits/outfit_debug.dm | 8 +- .../alien_spells/build_resin_structure.dm | 2 +- .../alien_spells/corrosive_acid_spit.dm | 4 +- code/datums/spells/banana_touch.dm | 4 +- code/datums/spells/mime.dm | 2 +- code/datums/spells/mime_malaise.dm | 2 +- code/datums/spells/spacetime_dist.dm | 2 +- code/game/atom/atom_tool_acts.dm | 166 ++++ code/game/atoms.dm | 20 +- code/game/atoms_movable.dm | 4 +- code/game/dna/dna_modifier.dm | 4 +- code/game/gamemodes/cult/blood_magic.dm | 24 +- code/game/gamemodes/cult/cult_actions.dm | 2 +- code/game/gamemodes/cult/cult_items.dm | 29 +- code/game/gamemodes/cult/cult_structures.dm | 4 +- code/game/gamemodes/cult/ritual.dm | 40 +- code/game/gamemodes/cult/runes.dm | 4 +- .../miniantags/abduction/abduction_gear.dm | 18 +- .../miniantags/abduction/machinery/console.dm | 2 +- .../abduction/machinery/dispenser.dm | 2 +- .../abduction/machinery/experiment.dm | 2 +- .../demons/shadow_demon/shadow_demon.dm | 2 +- .../demons/slaughter_demon/slaughter.dm | 4 +- .../gamemodes/miniantags/guardian/guardian.dm | 2 +- .../guardian/types/explosive_guardian.dm | 2 +- .../miniantags/guardian/types/protector.dm | 2 +- code/game/gamemodes/miniantags/morph/morph.dm | 2 +- .../miniantags/pulsedemon/pulsedemon.dm | 4 +- .../gamemodes/miniantags/revenant/revenant.dm | 2 +- .../miniantags/revenant/revenant_abilities.dm | 6 +- .../gamemodes/nuclear/nuclear_challenge.dm | 2 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 2 +- code/game/gamemodes/nuclear/pinpointer.dm | 4 +- code/game/gamemodes/wizard/artefact.dm | 16 +- code/game/gamemodes/wizard/godhand.dm | 12 +- code/game/gamemodes/wizard/magic_tarot.dm | 8 +- code/game/gamemodes/wizard/soulstone.dm | 8 +- code/game/gamemodes/wizard/spellbook.dm | 10 +- code/game/machinery/PDApainter.dm | 2 +- code/game/machinery/Sleeper.dm | 2 +- code/game/machinery/adv_med.dm | 2 +- .../airlock_control/airlock_button.dm | 2 +- code/game/machinery/autolathe.dm | 17 +- code/game/machinery/camera/camera.dm | 2 +- code/game/machinery/camera/camera_assembly.dm | 2 +- code/game/machinery/cell_charger.dm | 2 +- code/game/machinery/clonepod.dm | 2 +- .../machinery/computer/HolodeckControl.dm | 8 +- code/game/machinery/computer/ai_core.dm | 2 +- code/game/machinery/computer/arcade.dm | 2 +- .../game/machinery/computer/buildandrepair.dm | 4 +- code/game/machinery/computer/card.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/law.dm | 4 +- .../machinery/computer/medical_records.dm | 2 +- code/game/machinery/computer/prisoner.dm | 2 +- .../machinery/computer/security_records.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/defib_mount.dm | 2 +- code/game/machinery/deployable.dm | 8 +- code/game/machinery/door_control.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- .../machinery/doors/airlock_electronics.dm | 8 +- code/game/machinery/doors/airlock_types.dm | 4 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 4 +- code/game/machinery/doors/unpowered.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/doppler_array.dm | 2 +- code/game/machinery/dye_generator.dm | 4 +- code/game/machinery/firealarm.dm | 2 +- code/game/machinery/floodlight.dm | 2 +- code/game/machinery/guestpass.dm | 2 +- code/game/machinery/iv_drip.dm | 8 +- code/game/machinery/machine_frame.dm | 6 +- code/game/machinery/machinery.dm | 2 +- code/game/machinery/mass_driver.dm | 2 +- code/game/machinery/merch_vendor.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- code/game/machinery/pipe/pipe_construction.dm | 2 +- code/game/machinery/portable_turret.dm | 4 +- code/game/machinery/recharger.dm | 2 +- code/game/machinery/requests_console.dm | 2 +- code/game/machinery/shieldgen.dm | 6 +- code/game/machinery/spaceheater.dm | 2 +- code/game/machinery/suit_storage_unit.dm | 2 +- code/game/machinery/syndicatebomb.dm | 8 +- code/game/machinery/teleporter.dm | 4 +- code/game/machinery/transformer.dm | 2 +- code/game/machinery/turret_control.dm | 2 +- code/game/machinery/vendors/vending.dm | 2 +- code/game/machinery/wall_holosign.dm | 2 +- code/game/machinery/washing_machine.dm | 2 +- .../mecha/equipment/tools/janitor_tools.dm | 4 +- .../game/mecha/equipment/tools/other_tools.dm | 2 +- code/game/mecha/equipment/tools/work_tools.dm | 4 +- code/game/mecha/mech_fabricator.dm | 2 +- code/game/mecha/mecha.dm | 2 +- code/game/mecha/mecha_parts.dm | 4 +- code/game/objects/effects/anomalies.dm | 2 +- .../objects/effects/decals/Cleanable/tar.dm | 2 +- code/game/objects/effects/effects.dm | 2 +- code/game/objects/effects/meteors.dm | 2 +- code/game/objects/effects/mines.dm | 2 +- code/game/objects/effects/snowcloud.dm | 2 +- code/game/objects/items.dm | 4 +- code/game/objects/items/ashtray.dm | 2 +- code/game/objects/items/blueprints.dm | 10 +- code/game/objects/items/bodybag.dm | 4 +- code/game/objects/items/candle.dm | 6 +- code/game/objects/items/cardboard_cutouts.dm | 4 +- code/game/objects/items/collar.dm | 4 +- code/game/objects/items/control_wand.dm | 10 +- code/game/objects/items/crayons.dm | 16 +- code/game/objects/items/dehy_carp.dm | 4 +- code/game/objects/items/devices/aicard.dm | 4 +- code/game/objects/items/devices/autopsy.dm | 6 +- code/game/objects/items/devices/camera_bug.dm | 2 +- .../items/devices/chameleon_counter.dm | 4 +- .../objects/items/devices/chameleonproj.dm | 8 +- .../objects/items/devices/enginepicker.dm | 2 +- code/game/objects/items/devices/flash.dm | 12 +- code/game/objects/items/devices/flashlight.dm | 14 +- .../objects/items/devices/geiger_counter.dm | 6 +- .../objects/items/devices/handheld_defib.dm | 2 +- .../objects/items/devices/laserpointer.dm | 6 +- .../objects/items/devices/lightreplacer.dm | 8 +- code/game/objects/items/devices/megaphone.dm | 2 +- code/game/objects/items/devices/paicard.dm | 4 +- .../objects/items/devices/painter/painter.dm | 4 +- .../objects/items/devices/radio/beacon.dm | 8 +- .../items/devices/radio/electropack.dm | 4 +- .../objects/items/devices/radio/headset.dm | 2 +- .../objects/items/devices/radio/intercom.dm | 6 +- .../items/devices/radio/radio_objects.dm | 4 +- code/game/objects/items/devices/scanners.dm | 24 +- .../objects/items/devices/sensor_device.dm | 2 +- .../objects/items/devices/taperecorder.dm | 8 +- .../objects/items/devices/thermal_drill.dm | 2 +- .../objects/items/devices/traitordevices.dm | 14 +- .../objects/items/devices/transfer_valve.dm | 6 +- code/game/objects/items/devices/uplinks.dm | 4 +- .../objects/items/devices/voice_changer.dm | 2 +- code/game/objects/items/devices/whistle.dm | 4 +- code/game/objects/items/flag.dm | 8 +- code/game/objects/items/granters/_granters.dm | 2 +- code/game/objects/items/hand_item.dm | 8 +- code/game/objects/items/his_grace.dm | 4 +- code/game/objects/items/latexballoon.dm | 2 +- code/game/objects/items/mixing_bowl.dm | 4 +- .../items/mountable_frames/mountables.dm | 2 +- code/game/objects/items/robot/ai_upgrades.dm | 4 +- .../objects/items/robot/cyborg_gripper.dm | 20 +- .../items/robot/items/inflatable_tool.dm | 2 +- code/game/objects/items/robot/robot_items.dm | 2 +- code/game/objects/items/robot/robot_parts.dm | 10 +- .../objects/items/robot/robot_upgrades.dm | 2 +- code/game/objects/items/scratch_card.dm | 4 +- code/game/objects/items/sport.dm | 4 +- .../objects/items/stacks/medical_packs.dm | 6 +- code/game/objects/items/stacks/nanopaste.dm | 6 +- code/game/objects/items/stacks/seaweed.dm | 2 +- .../game/objects/items/stacks/sheets/glass.dm | 4 +- .../objects/items/stacks/sheets/leather.dm | 10 +- .../game/objects/items/stacks/sheets/light.dm | 2 +- .../objects/items/stacks/sheets/mineral.dm | 4 +- .../items/stacks/sheets/sheet_types.dm | 4 +- code/game/objects/items/stacks/stack.dm | 4 +- code/game/objects/items/stacks/telecrystal.dm | 4 +- code/game/objects/items/theft_items.dm | 10 +- code/game/objects/items/tools/crowbar.dm | 2 +- code/game/objects/items/tools/multitool.dm | 2 +- code/game/objects/items/tools/screwdriver.dm | 4 +- code/game/objects/items/tools/welder.dm | 6 +- code/game/objects/items/tools/wirecutters.dm | 4 +- code/game/objects/items/tools/wrench.dm | 2 +- code/game/objects/items/toys.dm | 64 +- code/game/objects/items/trash.dm | 2 +- code/game/objects/items/weapons/AI_modules.dm | 16 +- code/game/objects/items/weapons/RCD.dm | 10 +- code/game/objects/items/weapons/RCL.dm | 4 +- code/game/objects/items/weapons/RSF.dm | 4 +- code/game/objects/items/weapons/agent_id.dm | 8 +- .../objects/items/weapons/alien_specific.dm | 2 +- code/game/objects/items/weapons/batons.dm | 4 +- .../objects/items/weapons/bee_briefcase.dm | 4 +- .../items/weapons/bio_chips/bio_chip_case.dm | 2 +- .../items/weapons/bio_chips/bio_chip_pad.dm | 4 +- .../items/weapons/bio_chips/bio_chipper.dm | 4 +- code/game/objects/items/weapons/cards_ids.dm | 16 +- code/game/objects/items/weapons/caution.dm | 4 +- .../chemical_flamethrower.dm | 6 +- code/game/objects/items/weapons/cigs.dm | 16 +- .../game/objects/items/weapons/clown_items.dm | 6 +- code/game/objects/items/weapons/cosmetics.dm | 6 +- code/game/objects/items/weapons/courtroom.dm | 2 +- code/game/objects/items/weapons/defib.dm | 2 +- code/game/objects/items/weapons/dice.dm | 2 +- code/game/objects/items/weapons/disks.dm | 2 +- .../objects/items/weapons/dna_injector.dm | 2 +- .../objects/items/weapons/dnascrambler.dm | 2 +- code/game/objects/items/weapons/explosives.dm | 10 +- .../objects/items/weapons/extinguisher.dm | 6 +- .../objects/items/weapons/flamethrower.dm | 10 +- code/game/objects/items/weapons/garrote.dm | 4 +- .../objects/items/weapons/gift_wrappaper.dm | 8 +- .../items/weapons/grenades/bananade.dm | 4 +- .../items/weapons/grenades/chem_grenade.dm | 8 +- .../items/weapons/grenades/ghettobomb.dm | 2 +- .../objects/items/weapons/grenades/grenade.dm | 2 +- .../items/weapons/grenades/syndieminibomb.dm | 4 +- code/game/objects/items/weapons/handcuffs.dm | 10 +- .../items/weapons/holosign_projector.dm | 10 +- .../objects/items/weapons/holy_weapons.dm | 18 +- code/game/objects/items/weapons/kitchen.dm | 2 +- .../objects/items/weapons/knuckledusters.dm | 4 +- code/game/objects/items/weapons/legcuffs.dm | 4 +- code/game/objects/items/weapons/lighters.dm | 6 +- .../weapons/melee/energy_melee_weapons.dm | 16 +- .../objects/items/weapons/melee/melee_misc.dm | 12 +- code/game/objects/items/weapons/misc_items.dm | 6 +- code/game/objects/items/weapons/mop.dm | 6 +- .../objects/items/weapons/paint_bucket.dm | 2 +- code/game/objects/items/weapons/paiwire.dm | 2 +- .../objects/items/weapons/picket_signs.dm | 4 +- .../objects/items/weapons/pneumaticCannon.dm | 4 +- code/game/objects/items/weapons/powerfist.dm | 4 +- code/game/objects/items/weapons/rpd.dm | 6 +- code/game/objects/items/weapons/scissors.dm | 2 +- code/game/objects/items/weapons/scrolls.dm | 2 +- code/game/objects/items/weapons/shards.dm | 2 +- code/game/objects/items/weapons/shields.dm | 6 +- code/game/objects/items/weapons/soap.dm | 6 +- code/game/objects/items/weapons/staff.dm | 4 +- .../game/objects/items/weapons/stock_parts.dm | 2 +- .../objects/items/weapons/storage/backpack.dm | 4 +- .../objects/items/weapons/storage/bags.dm | 6 +- .../objects/items/weapons/storage/belt.dm | 8 +- .../objects/items/weapons/storage/bible.dm | 6 +- .../objects/items/weapons/storage/boxes.dm | 4 +- .../items/weapons/storage/briefcase.dm | 6 +- .../objects/items/weapons/storage/fancy.dm | 8 +- .../objects/items/weapons/storage/firstaid.dm | 4 +- .../objects/items/weapons/storage/internal.dm | 2 +- .../objects/items/weapons/storage/lockbox.dm | 4 +- .../objects/items/weapons/storage/secure.dm | 4 +- .../items/weapons/storage/storage_base.dm | 4 +- code/game/objects/items/weapons/stunbaton.dm | 10 +- .../objects/items/weapons/tanks/jetpack.dm | 2 +- .../objects/items/weapons/tanks/tank_types.dm | 2 +- .../game/objects/items/weapons/tanks/tanks.dm | 4 +- .../objects/items/weapons/tanks/watertank.dm | 12 +- code/game/objects/items/weapons/tape.dm | 2 +- .../objects/items/weapons/teleportation.dm | 2 +- code/game/objects/items/weapons/teleprod.dm | 2 +- code/game/objects/items/weapons/thurible.dm | 4 +- code/game/objects/items/weapons/twohanded.dm | 34 +- code/game/objects/items/weapons/weaponry.dm | 8 +- code/game/objects/items/weapons/whetstone.dm | 4 +- code/game/objects/mail.dm | 6 +- code/game/objects/objs.dm | 2 +- code/game/objects/structures/barsign.dm | 4 +- code/game/objects/structures/bedsheet_bin.dm | 6 +- code/game/objects/structures/coathanger.dm | 2 +- .../structures/crates_lockers/closets.dm | 2 +- .../crates_lockers/closets/cardboardbox.dm | 2 +- .../crates_lockers/closets/fireaxe.dm | 2 +- .../closets/secure/depot_closets.dm | 2 +- .../crates_lockers/closets/secure/personal.dm | 2 +- .../structures/crates_lockers/crates.dm | 4 +- .../structures/crates_lockers/largecrate.dm | 2 +- code/game/objects/structures/curtains.dm | 8 +- code/game/objects/structures/displaycase.dm | 4 +- code/game/objects/structures/door_assembly.dm | 2 +- code/game/objects/structures/engicart.dm | 2 +- .../structures/extinguisher_cabinet.dm | 2 +- code/game/objects/structures/false_walls.dm | 6 +- code/game/objects/structures/fence.dm | 2 +- code/game/objects/structures/flora.dm | 2 +- code/game/objects/structures/girders.dm | 4 +- .../objects/structures/grey_autocloner.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/guillotine.dm | 2 +- code/game/objects/structures/inflatable.dm | 10 +- code/game/objects/structures/janicart.dm | 4 +- code/game/objects/structures/kitchen_spike.dm | 4 +- code/game/objects/structures/lattice.dm | 4 +- .../structures/lavaland/necropolis_tendril.dm | 2 +- code/game/objects/structures/loom.dm | 2 +- code/game/objects/structures/mineral_doors.dm | 4 +- code/game/objects/structures/mirror.dm | 2 +- code/game/objects/structures/mop_bucket.dm | 2 +- code/game/objects/structures/morgue.dm | 4 +- code/game/objects/structures/noticeboard.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/shelves.dm | 2 +- code/game/objects/structures/statues.dm | 10 +- .../structures/stool_bed_chair_nest/bed.dm | 12 +- .../structures/stool_bed_chair_nest/chairs.dm | 10 +- code/game/objects/structures/table_frames.dm | 2 +- code/game/objects/structures/tables_racks.dm | 6 +- .../game/objects/structures/tank_dispenser.dm | 2 +- code/game/objects/structures/target_stake.dm | 2 +- .../structures/transit_tubes/station.dm | 2 +- code/game/objects/structures/watercloset.dm | 12 +- .../objects/structures/windoor_assembly.dm | 2 +- code/game/objects/structures/window.dm | 2 +- code/game/turfs/simulated/floor.dm | 4 +- .../turfs/simulated/floor/asteroid_floors.dm | 4 +- code/game/turfs/simulated/floor/chasm.dm | 2 +- .../game/turfs/simulated/floor/fancy_floor.dm | 2 +- .../turfs/simulated/floor/indestructible.dm | 2 +- code/game/turfs/simulated/floor/lava.dm | 4 +- .../game/turfs/simulated/floor/light_floor.dm | 2 +- .../turfs/simulated/floor/mineral_floors.dm | 6 +- code/game/turfs/simulated/floor/plating.dm | 4 +- code/game/turfs/simulated/minerals.dm | 16 +- code/game/turfs/simulated/walls.dm | 2 +- .../turfs/simulated/walls_indestructible.dm | 2 +- code/game/turfs/simulated/walls_mineral.dm | 6 +- code/game/turfs/simulated/walls_reinforced.dm | 2 +- code/game/turfs/space/space_turf.dm | 2 +- code/game/turfs/space/transit.dm | 2 +- code/game/turfs/turf.dm | 6 +- code/modules/admin/topic.dm | 2 +- .../antagonists/_common/antag_spawner.dm | 10 +- .../changeling/powers/biodegrade.dm | 2 +- .../changeling/powers/mutations.dm | 2 +- .../changeling/powers/summon_spiders.dm | 2 +- .../powers/flayer_stealth_powers.dm | 2 +- .../powers/flayer_weapon_powers.dm | 4 +- .../contractor/items/contractor_pinpointer.dm | 2 +- .../contractor/items/contractor_uplink.dm | 2 +- .../vampire_powers/hemomancer_powers.dm | 4 +- .../vampire/vampire_powers/umbrae_powers.dm | 2 +- .../antagonists/zombie/zombie_spells.dm | 4 +- code/modules/arcade/arcade_base.dm | 2 +- code/modules/arcade/arcade_prize.dm | 4 +- code/modules/arcade/prize_counter.dm | 2 +- code/modules/assembly/assembly.dm | 4 +- code/modules/assembly/assembly_holder.dm | 10 +- code/modules/assembly/bomb.dm | 8 +- code/modules/assembly/health.dm | 2 +- code/modules/assembly/igniter.dm | 4 +- code/modules/assembly/infrared.dm | 2 +- code/modules/assembly/mousetrap.dm | 2 +- code/modules/assembly/proximity.dm | 2 +- code/modules/assembly/shock_kit.dm | 6 +- code/modules/assembly/signaler.dm | 4 +- code/modules/assembly/timer.dm | 2 +- code/modules/assembly/voice.dm | 4 +- .../atmospherics/machinery/airalarm.dm | 2 +- .../atmospherics/machinery/atmospherics.dm | 2 +- .../components/binary_devices/pump.dm | 2 +- .../components/binary_devices/volume_pump.dm | 2 +- .../components/trinary_devices/filter.dm | 2 +- .../components/trinary_devices/mixer.dm | 2 +- .../components/unary_devices/cryo.dm | 2 +- .../components/unary_devices/vent_pump.dm | 2 +- .../portable/portable_atmospherics.dm | 4 +- .../ghost_role_spawners/golems.dm | 4 +- .../mission_code/ruins/gps_ruin.dm | 2 +- .../mission_code/ruins/telecomns.dm | 8 +- .../mission_code/ruins/watcher_grave.dm | 2 +- code/modules/clothing/clothing.dm | 10 +- .../clothing/glasses/engine_goggles.dm | 2 +- code/modules/clothing/glasses/glasses.dm | 8 +- code/modules/clothing/glasses/tajblind.dm | 2 +- .../modules/clothing/gloves/colored_gloves.dm | 2 +- code/modules/clothing/gloves/misc_gloves.dm | 2 +- code/modules/clothing/gloves/rings.dm | 2 +- code/modules/clothing/head/hardhat.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/head/misc_hats.dm | 4 +- code/modules/clothing/head/misc_special.dm | 6 +- code/modules/clothing/head/soft_caps.dm | 2 +- code/modules/clothing/masks/boxing.dm | 2 +- code/modules/clothing/masks/breath.dm | 4 +- code/modules/clothing/masks/gasmask.dm | 12 +- code/modules/clothing/masks/misc_masks.dm | 8 +- code/modules/clothing/shoes/colour.dm | 4 +- code/modules/clothing/shoes/magboots.dm | 4 +- .../clothing/spacesuits/alien_suits.dm | 2 +- .../clothing/spacesuits/ert_hardsuits.dm | 2 +- code/modules/clothing/spacesuits/hardsuit.dm | 8 +- .../clothing/spacesuits/misc_spacesuits.dm | 2 +- code/modules/clothing/spacesuits/plasmamen.dm | 2 +- code/modules/clothing/suits/armor_suits.dm | 6 +- code/modules/clothing/suits/misc_suits.dm | 4 +- code/modules/clothing/suits/suit_storage.dm | 4 +- code/modules/clothing/suits/toggles.dm | 2 +- code/modules/clothing/suits/wiz_robe.dm | 2 +- .../clothing/under/accessories/accessory.dm | 24 +- .../clothing/under/accessories/holster.dm | 4 +- .../under/accessories/storage_accessories.dm | 6 +- .../under/jobs/plasmamen/_plasmamen.dm | 2 +- code/modules/crafting/guncrafting.dm | 8 +- code/modules/customitems/item_defines.dm | 42 +- code/modules/detective_work/evidence.dm | 6 +- .../detective_work/footprints_and_rag.dm | 4 +- code/modules/detective_work/scanner.dm | 6 +- .../economy_machinery/account_terminal.dm | 2 +- code/modules/economy/economy_machinery/atm.dm | 2 +- .../economy/economy_machinery/eftpos.dm | 6 +- code/modules/events/spacevine.dm | 4 +- code/modules/fish/fish_items.dm | 8 +- code/modules/fish/fishtank.dm | 2 +- .../food_and_drinks/drinks/bottler/bottler.dm | 2 +- .../food_and_drinks/drinks/drinks/bottle.dm | 6 +- .../food_and_drinks/drinks/drinks/cans.dm | 10 +- .../drinks/drinks/drinkingglass.dm | 2 +- .../drinks/drinks/shotglass.dm | 6 +- .../food_and_drinks/drinks/drinks_base.dm | 8 +- .../modules/food_and_drinks/food/condiment.dm | 10 +- .../food_and_drinks/food/customizables.dm | 16 +- .../food_and_drinks/food/foods/ingredients.dm | 8 +- .../food_and_drinks/food/foods/junkfood.dm | 2 +- .../food_and_drinks/food/foods/meat.dm | 6 +- .../food_and_drinks/food/foods/pizza.dm | 10 +- .../food_and_drinks/food/foods/side_dishes.dm | 2 +- code/modules/food_and_drinks/food_base.dm | 10 +- .../kitchen_machinery/cooker.dm | 2 +- .../kitchen_machinery/deep_fryer.dm | 2 +- .../kitchen_machinery/gibber.dm | 2 +- .../kitchen_machinery/icecream_vat.dm | 2 +- .../kitchen_machinery/kitchen_machine.dm | 2 +- .../kitchen_machinery/monkeyrecycler.dm | 2 +- .../kitchen_machinery/processor.dm | 2 +- .../kitchen_machinery/smartfridge.dm | 2 +- code/modules/games/cards.dm | 14 +- code/modules/hallucinations/effects/common.dm | 4 +- code/modules/hallucinations/effects/major.dm | 2 +- code/modules/holiday/christmas.dm | 2 +- code/modules/hydroponics/beekeeping/beebox.dm | 2 +- code/modules/hydroponics/biogenerator.dm | 2 +- code/modules/hydroponics/compost_bin.dm | 2 +- code/modules/hydroponics/fermenting_barrel.dm | 2 +- code/modules/hydroponics/gene_modder.dm | 6 +- code/modules/hydroponics/grown.dm | 6 +- code/modules/hydroponics/grown/cereals.dm | 2 +- code/modules/hydroponics/grown/citrus.dm | 2 +- code/modules/hydroponics/grown/corn.dm | 4 +- code/modules/hydroponics/grown/cotton.dm | 4 +- code/modules/hydroponics/grown/flowers.dm | 6 +- .../modules/hydroponics/grown/grass_carpet.dm | 2 +- code/modules/hydroponics/grown/herbals.dm | 4 +- code/modules/hydroponics/grown/kudzu.dm | 2 +- code/modules/hydroponics/grown/misc_seeds.dm | 2 +- code/modules/hydroponics/grown/mushrooms.dm | 4 +- code/modules/hydroponics/grown/nettle.dm | 4 +- code/modules/hydroponics/grown/nymph.dm | 2 +- code/modules/hydroponics/grown/potato.dm | 2 +- code/modules/hydroponics/grown/pumpkin.dm | 2 +- code/modules/hydroponics/grown/replicapod.dm | 2 +- code/modules/hydroponics/grown/root.dm | 2 +- code/modules/hydroponics/grown/tomato.dm | 4 +- code/modules/hydroponics/grown/towercap.dm | 4 +- code/modules/hydroponics/growninedible.dm | 2 +- code/modules/hydroponics/hydroitemdefines.dm | 2 +- code/modules/hydroponics/hydroponics_tray.dm | 6 +- code/modules/hydroponics/seed_extractor.dm | 2 +- code/modules/hydroponics/seeds.dm | 6 +- .../instruments/objs/items/_instrument.dm | 2 +- .../objs/items/instrument_items.dm | 8 +- code/modules/library/book.dm | 6 +- code/modules/library/library_computer.dm | 2 +- code/modules/library/library_equipment.dm | 6 +- code/modules/martial_arts/adminfu.dm | 2 +- code/modules/martial_arts/martial.dm | 8 +- code/modules/martial_arts/mimejutsu.dm | 2 +- .../maze_generation/maze_helper_atoms.dm | 8 +- code/modules/mining/abandonedcrates.dm | 2 +- .../mining/equipment/kinetic_crusher.dm | 8 +- .../mining/equipment/lazarus_injector.dm | 6 +- .../mining/equipment/marker_beacons.dm | 6 +- .../mining/equipment/mineral_scanner.dm | 4 +- .../mining/equipment/mining_charges.dm | 12 +- .../mining/equipment/regenerative_core.dm | 6 +- code/modules/mining/equipment/resonator.dm | 4 +- code/modules/mining/equipment/survival_pod.dm | 4 +- .../mining/equipment/wormhole_jaunter.dm | 8 +- code/modules/mining/fulton.dm | 6 +- code/modules/mining/laborcamp/laborshuttle.dm | 4 +- code/modules/mining/lavaland/ash_flora.dm | 2 +- .../mining/lavaland/loot/ashdragon_loot.dm | 10 +- .../mining/lavaland/loot/bubblegum_loot.dm | 4 +- .../mining/lavaland/loot/colossus_loot.dm | 2 +- .../mining/lavaland/loot/hierophant_loot.dm | 2 +- .../mining/lavaland/loot/legion_loot.dm | 6 +- .../mining/lavaland/loot/tendril_loot.dm | 18 +- .../mining/lavaland/necropolis_chests.dm | 8 +- code/modules/mining/machine_redemption.dm | 2 +- code/modules/mining/machine_vending.dm | 6 +- code/modules/mining/minebot.dm | 8 +- code/modules/mining/mint.dm | 2 +- code/modules/mining/ores_coins.dm | 14 +- code/modules/mining/satchel_ore_boxdm.dm | 2 +- code/modules/mob/living/brain/MMI.dm | 6 +- .../modules/mob/living/brain/robotic_brain.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 6 +- .../mob/living/carbon/carbon_defense.dm | 2 +- .../carbon/human/human_deadchat_control.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 4 +- .../living/carbon/human/human_inventory.dm | 2 +- .../living/carbon/human/species/_species.dm | 2 +- .../mob/living/carbon/human/species/golem.dm | 2 +- .../modules/mob/living/silicon/decoy/decoy.dm | 2 +- code/modules/mob/living/silicon/pai/pai.dm | 2 +- .../living/silicon/robot/drone/drone_items.dm | 4 +- .../living/silicon/robot/drone/maint_drone.dm | 2 +- .../living/silicon/robot/misc_robot_items.dm | 8 +- .../mob/living/silicon/robot/robot_mob.dm | 10 +- .../mob/living/silicon/robot/robot_modules.dm | 4 +- .../living/silicon/robot/syndicate_robot.dm | 4 +- .../modules/mob/living/silicon/silicon_mob.dm | 2 +- .../living/simple_animal/animal_defense.dm | 2 +- .../mob/living/simple_animal/bot/bot.dm | 2 +- .../simple_animal/bot/bot_construction.dm | 24 +- .../mob/living/simple_animal/bot/cleanbot.dm | 2 +- .../mob/living/simple_animal/bot/ed209bot.dm | 2 +- .../mob/living/simple_animal/bot/floorbot.dm | 2 +- .../mob/living/simple_animal/bot/griefsky.dm | 2 +- .../mob/living/simple_animal/bot/honkbot.dm | 2 +- .../mob/living/simple_animal/bot/medbot.dm | 2 +- .../mob/living/simple_animal/bot/mulebot.dm | 2 +- .../mob/living/simple_animal/bot/secbot.dm | 2 +- .../mob/living/simple_animal/friendly/dog.dm | 4 +- .../simple_animal/friendly/farm_animals.dm | 6 +- .../friendly/nian_caterpillar.dm | 2 +- .../mob/living/simple_animal/friendly/pet.dm | 2 +- .../simple_animal/friendly/spiderbot.dm | 2 +- .../mob/living/simple_animal/hostile/bees.dm | 2 +- .../living/simple_animal/hostile/hellhound.dm | 2 +- .../living/simple_animal/hostile/hostile.dm | 2 +- .../hostile/megafauna/ancient_robot.dm | 2 +- .../hostile/megafauna/blood_drunk_miner.dm | 2 +- .../hostile/megafauna/hierophant.dm | 2 +- .../hostile/mining/elites/elite.dm | 4 +- .../mining/elites/goliath_broodmother.dm | 2 +- .../hostile/mining/elites/legionnaire.dm | 2 +- .../simple_animal/hostile/mining/gutlunch.dm | 8 +- .../living/simple_animal/hostile/mushroom.dm | 2 +- .../simple_animal/hostile/syndicate_mobs.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 2 +- .../living/simple_animal/posessed_object.dm | 4 +- .../modules/mob/living/simple_animal/shade.dm | 2 +- .../living/simple_animal/slime/slime_mob.dm | 2 +- code/modules/mob/mob.dm | 10 +- code/modules/mob/mob_grab.dm | 4 +- code/modules/mob/mob_holder.dm | 4 +- code/modules/mod/mod_construction.dm | 2 +- code/modules/mod/mod_control.dm | 4 +- code/modules/mod/mod_core.dm | 6 +- code/modules/mod/modules/_modules.dm | 2 +- code/modules/mod/modules/module_pathfinder.dm | 2 +- code/modules/mod/modules/modules_antag.dm | 4 +- .../mod/modules/modules_engineering.dm | 4 +- code/modules/mod/modules/modules_maint.dm | 2 +- code/modules/mod/modules/modules_security.dm | 12 +- code/modules/newscaster/obj/newspaper.dm | 8 +- code/modules/ninja/energy_katana.dm | 4 +- code/modules/paperwork/clipboard.dm | 10 +- code/modules/paperwork/desk_bell.dm | 2 +- code/modules/paperwork/faxmachine.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 2 +- code/modules/paperwork/folders.dm | 8 +- code/modules/paperwork/handlabeler.dm | 6 +- code/modules/paperwork/paper.dm | 6 +- code/modules/paperwork/paper_bundle.dm | 8 +- code/modules/paperwork/paperbin.dm | 2 +- code/modules/paperwork/paperplane.dm | 6 +- code/modules/paperwork/pen.dm | 12 +- code/modules/paperwork/photocopier.dm | 2 +- code/modules/paperwork/photography.dm | 16 +- code/modules/paperwork/ticketmachine.dm | 4 +- code/modules/pda/PDA.dm | 10 +- code/modules/pda/ai_pda.dm | 2 +- code/modules/pda/core_apps.dm | 2 +- code/modules/power/apc/apc.dm | 2 +- code/modules/power/cables/cable.dm | 2 +- code/modules/power/cables/cable_coil.dm | 6 +- code/modules/power/cables/terminal.dm | 2 +- code/modules/power/cell.dm | 2 +- .../power/engines/singularity/collector.dm | 2 +- .../engines/singularity/containment_field.dm | 2 +- .../power/engines/singularity/emitter.dm | 2 +- .../particle_accelerator.dm | 4 +- .../power/engines/singularity/singularity.dm | 2 +- .../power/engines/supermatter/supermatter.dm | 2 +- code/modules/power/engines/tesla/coil.dm | 4 +- .../generators/portable generators/pacman.dm | 2 +- code/modules/power/generators/solar.dm | 2 +- code/modules/power/generators/treadmill.dm | 2 +- code/modules/power/generators/turbine.dm | 4 +- code/modules/power/gravitygenerator.dm | 2 +- code/modules/power/lights.dm | 12 +- code/modules/power/power_machine.dm | 2 +- code/modules/power/smes.dm | 2 +- code/modules/projectiles/ammunition.dm | 6 +- .../projectiles/ammunition/ammo_casings.dm | 6 +- .../projectiles/ammunition/magazines.dm | 8 +- code/modules/projectiles/gun.dm | 12 +- .../guns/energy/kinetic_accelerator.dm | 6 +- code/modules/projectiles/guns/energy/laser.dm | 2 +- code/modules/projectiles/guns/energy/pulse.dm | 4 +- .../projectiles/guns/energy/special_eguns.dm | 12 +- .../projectiles/guns/energy/telegun.dm | 2 +- code/modules/projectiles/guns/energy_guns.dm | 2 +- .../projectiles/guns/grenade_launcher.dm | 4 +- code/modules/projectiles/guns/magic.dm | 2 +- code/modules/projectiles/guns/magic/wand.dm | 6 +- code/modules/projectiles/guns/medbeam.dm | 2 +- .../projectiles/guns/misc/blastcannon.dm | 6 +- .../projectiles/guns/projectile/automatic.dm | 18 +- .../projectiles/guns/projectile/bow.dm | 6 +- .../projectiles/guns/projectile/launchers.dm | 10 +- .../projectiles/guns/projectile/revolver.dm | 26 +- .../projectiles/guns/projectile/saw.dm | 6 +- .../projectiles/guns/projectile/shotgun.dm | 20 +- .../projectiles/guns/projectile_gun.dm | 4 +- code/modules/projectiles/guns/rocket.dm | 2 +- code/modules/projectiles/guns/syringe_gun.dm | 14 +- code/modules/projectiles/guns/throw.dm | 2 +- .../projectiles/guns/throw/crossbow.dm | 4 +- .../chemistry/machinery/chem_dispenser.dm | 8 +- .../chemistry/machinery/chem_heater.dm | 2 +- .../chemistry/machinery/chem_master.dm | 2 +- .../reagents/chemistry/machinery/pandemic.dm | 2 +- .../chemistry/machinery/reagentgrinder.dm | 2 +- code/modules/reagents/reagent_containers.dm | 4 +- .../reagents/reagent_containers/applicator.dm | 4 +- .../reagents/reagent_containers/borghydro.dm | 4 +- .../reagents/reagent_containers/dropper.dm | 6 +- .../reagent_containers/glass_containers.dm | 10 +- .../reagents/reagent_containers/hypospray.dm | 14 +- .../reagents/reagent_containers/iv_bag.dm | 8 +- .../reagents/reagent_containers/patch.dm | 4 +- .../reagents/reagent_containers/pill.dm | 6 +- .../reagents/reagent_containers/spray.dm | 10 +- .../reagents/reagent_containers/syringes.dm | 8 +- code/modules/reagents/reagent_dispenser.dm | 6 +- code/modules/recycling/belt-placer.dm | 6 +- code/modules/recycling/conveyor2.dm | 10 +- .../recycling/disposal-construction.dm | 2 +- code/modules/recycling/disposal.dm | 8 +- code/modules/recycling/sortingmachinery.dm | 12 +- code/modules/research/anomaly/anomaly.dm | 4 +- code/modules/research/backup_console.dm | 2 +- code/modules/research/circuitprinter.dm | 2 +- code/modules/research/destructive_analyzer.dm | 2 +- code/modules/research/experimentor.dm | 2 +- code/modules/research/protolathe.dm | 2 +- code/modules/research/rdconsole.dm | 2 +- code/modules/research/strange_objects.dm | 2 +- .../research/xenobiology/xenobio_camera.dm | 2 +- .../research/xenobiology/xenobiology.dm | 30 +- .../ruins/lavalandruin_code/dead_ratvar.dm | 2 +- .../modules/ruins/lavalandruin_code/puzzle.dm | 2 +- .../ruins/lavalandruin_code/sin_ruins.dm | 2 +- .../ruins/objects_and_mobs/id_upgrader.dm | 2 +- .../security_levels/keycard_authentication.dm | 2 +- code/modules/shuttle/assault_pod.dm | 2 +- code/modules/shuttle/dock_generator.dm | 2 +- code/modules/shuttle/emergency.dm | 2 +- .../modules/shuttle/lance_docking_targeter.dm | 2 +- code/modules/station_goals/dna_vault.dm | 4 +- code/modules/station_goals/shield.dm | 2 +- code/modules/surgery/organs/augments_arms.dm | 4 +- code/modules/surgery/organs/autosurgeon.dm | 4 +- code/modules/surgery/organs/heart.dm | 4 +- code/modules/surgery/organs/organ.dm | 2 +- code/modules/surgery/organs/organ_external.dm | 4 +- .../modules/surgery/organs/organ_extractor.dm | 6 +- code/modules/surgery/organs/organ_internal.dm | 2 +- code/modules/surgery/organs/subtypes/xenos.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 2 +- code/modules/surgery/tools.dm | 4 +- code/modules/telesci/bscrystal.dm | 2 +- code/modules/telesci/gps.dm | 2 +- code/modules/telesci/rcs.dm | 2 +- code/modules/telesci/telepad.dm | 2 +- code/modules/telesci/telesci_computer.dm | 2 +- code/modules/tgui/plugins/tgui_login.dm | 2 +- code/modules/vehicle/janivehicle.dm | 44 +- code/modules/vehicle/tg_vehicles/scooter.dm | 6 +- .../vehicle/tg_vehicles/tg_vehicles.dm | 2 +- code/modules/vehicle/vehicle.dm | 35 +- docs/references/attack_chain.md | 751 +++++++++++++++ .../images/attack_chain_flowchart.drawio | 909 ++++++++++++++++++ .../images/attack_chain_flowchart.png | Bin 0 -> 964338 bytes mkdocs.yml | 2 + paradise.dme | 3 + tools/ci/check_legacy_attack_chain.py | 182 ++++ tools/migrate_attack_chain.py | 100 ++ tools/requirements.txt | 3 + 724 files changed, 4260 insertions(+), 1856 deletions(-) create mode 100644 code/__DEFINES/dcs/attack_chain_signals.dm create mode 100644 code/_onclick/item_attack_legacy.dm create mode 100644 code/game/atom/atom_tool_acts.dm create mode 100644 docs/references/attack_chain.md create mode 100644 docs/references/images/attack_chain_flowchart.drawio create mode 100644 docs/references/images/attack_chain_flowchart.png create mode 100644 tools/ci/check_legacy_attack_chain.py create mode 100644 tools/migrate_attack_chain.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e110a110584e3..20ca21d4a9005 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,6 +54,7 @@ jobs: python tools/ci/no_duplicate_definitions.py python -m tools.ci.check_icon_conflicts python -m tools.ci.check_icon_dupenames + python -m tools.ci.check_legacy_attack_chain python -m tools.maplint.source --github - name: Run DreamChecker @@ -95,7 +96,14 @@ jobs: strategy: fail-fast: false # Let all map tests run to completion matrix: - maptype: ['/datum/map/boxstation', '/datum/map/deltastation', '/datum/map/metastation', '/datum/map/cerestation', '/datum/map/emeraldstation'] + maptype: + [ + '/datum/map/boxstation', + '/datum/map/deltastation', + '/datum/map/metastation', + '/datum/map/cerestation', + '/datum/map/emeraldstation', + ] byondtype: ['STABLE'] services: mariadb: diff --git a/.github/workflows/devdocs.yml b/.github/workflows/devdocs.yml index 7819a3690e24f..4baa9e38f51aa 100644 --- a/.github/workflows/devdocs.yml +++ b/.github/workflows/devdocs.yml @@ -15,7 +15,7 @@ jobs: - name: Build docs run: | - python -m pip install mkdocs==1.6.0 mkdocs-material[imaging]==9.5.31 mkdocs-github-admonitions-plugin==0.0.2 + python -m pip install mkdocs==1.6.0 mkdocs-material[imaging]==9.5.31 mkdocs-github-admonitions-plugin==0.0.2 mkdocs-glightbox==0.4.0 python -m mkdocs build - name: Deploy docs diff --git a/code/__DEFINES/dcs/atom_signals.dm b/code/__DEFINES/dcs/atom_signals.dm index 9c358c6854f8e..d1dbbf2ee1ab7 100644 --- a/code/__DEFINES/dcs/atom_signals.dm +++ b/code/__DEFINES/dcs/atom_signals.dm @@ -8,10 +8,6 @@ // from SSatoms InitAtom - Only if the atom was not deleted or failed initialization #define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success" -///from base of atom/attackby(): (/obj/item, /mob/living, params) -#define COMSIG_PARENT_ATTACKBY "atom_attackby" -///Return this in response if you don't want afterattack to be called - #define COMPONENT_NO_AFTERATTACK (1<<0) ///from base of atom/attack_hulk(): (/mob/living/carbon/human) #define COMSIG_ATOM_HULK_ATTACK "hulk_attack" ///from base of atom/examine(): (examining_user, examine_list) @@ -99,13 +95,6 @@ #define ATOM_PREHIT_SUCCESS (1<<0) #define ATOM_PREHIT_FAILURE (1<<1) -// Attack signals. These should share the returned flags, to standardize the attack chain. -// The chain currently works like: -// tool_act -> pre_attack -> target.attackby (item.attack) -> afterattack -// You can use these signal responses to cancel the attack chain at a certain point from most attack signal types. - /// This response cancels the attack chain entirely. If sent early, it might cause some later effects to be skipped. - #define COMPONENT_CANCEL_ATTACK_CHAIN (1<<0) - /// Called from atom/Initialize() of target: (atom/target) #define COMSIG_ATOM_INITIALIZED_ON "atom_initialized_on" diff --git a/code/__DEFINES/dcs/attack_chain_signals.dm b/code/__DEFINES/dcs/attack_chain_signals.dm new file mode 100644 index 0000000000000..f0d6f716b0953 --- /dev/null +++ b/code/__DEFINES/dcs/attack_chain_signals.dm @@ -0,0 +1,67 @@ +// MARK: Item Interactions + +// Return values for non-attack interactions. +#define ITEM_INTERACT_SUCCESS (1<<0) //! Cancel the rest of the attack chain, indicating success. +#define ITEM_INTERACT_BLOCKING (1<<1) //! Cancel the rest of the attack chain, without indicating success. +#define ITEM_INTERACT_SKIP_TO_ATTACK (1<<2) //! Skip the rest of the interaction chain, going straight to the attack phase. + +/// Combination return value for any item interaction that cancels the rest of the attack chain. +#define ITEM_INTERACT_ANY_BLOCKER (ITEM_INTERACT_SUCCESS | ITEM_INTERACT_BLOCKING) + +/// Sent when this atom is clicked on by a mob with an item. +/// +/// [/atom/proc/item_interaction] -> mob/living/user, obj/item/tool, list/modifiers +#define COMSIG_INTERACT_TARGET "interact_target" + +/// Sent to a mob clicking on an atom with an item. +/// +/// [/atom/proc/item_interaction] -> atom/target, obj/item/tool, list/modifiers +#define COMSIG_INTERACT_USER "interact_user" + +/// Sent to an item clicking on an atom. +/// +/// [/atom/proc/item_interaction] -> mob/living/user, atom/target, list/modifiers +#define COMSIG_INTERACTING "interacting" + +#define COMSIG_INTERACT_RANGED "interact_ranged" //! [/atom/proc/ranged_item_interaction] +#define COMSIG_INTERACTING_RANGED "interacting_ranged" //! [/atom/proc/ranged_item_interaction] + +#define COMSIG_ACTIVATE_SELF "activate_self" //! [/obj/item/proc/activate_self] -> mob/user + +// Attack signals. These should share the returned flags, to standardize the attack chain. +// The chain currently works like: +// tool_act -> pre_attack -> target.attackby (item.attack) -> afterattack +// You can use these signal responses to cancel the attack chain at a certain point from most attack signal types. + +// MARK: Attack Chain + +// Signal interceptors for short-circuiting parts of the attack chain. + +#define COMPONENT_CANCEL_ATTACK_CHAIN (1<<0) //! Cancel the attack chain entirely. +#define COMPONENT_SKIP_ATTACK (1<<1) //! Skip this attack step, continuing for the next one to happen. +#define COMPONENT_SKIP_AFTERATTACK (1<<2) //! Skip after_attacks (while allowing for e.g. attack_by). + +#define COMSIG_PRE_ATTACK "pre_attack" //! [/obj/item/proc/pre_attack] -> atom/target, mob/user, params + +#define COMSIG_ATTACK "attack" //! [/obj/item/proc/attack] -> mob/living/target, mob/living/user +#define COMSIG_ATTACK_OBJ "attack_obj" //! [/obj/item/proc/attack_obj] -> obj/attacked, mob/user +#define COMSIG_ATTACK_OBJ_LIVING "attack_obj_living" //! [/obj/item/proc/attack_obj] -> obj/attacked +#define COMSIG_ATTACK_BY "attack_by" //! [/atom/proc/attackby] -> obj/item/weapon, mob/living/user, params + +#define COMSIG_AFTER_ATTACK "item_after_attack" //! [/obj/item/proc/afterattack] -> atom/target, mob/user, params +#define COMSIG_AFTER_ATTACKED_BY "after_attacked_by" //! [/obj/item/proc/afterattack] -> obj/item/weapon, mob/user, proximity_flag, params + +// Return values for directing the control of the attack chain. Distinct from +// signal interceptors because they're not meant to be combined, and to mesh better with +// historical use of return values in attack chain procs. + +#define CONTINUE_ATTACK 0 //! Continue the attack chain, i.e. allow other signals to respond. +#define FINISH_ATTACK 1 //! Do not continue the attack chain. + +// Legacy-only, do not use in new code + +#define COMSIG_TOOL_ATTACK "tool_attack" //! [/obj/item/proc/tool_attack_chain] -> atom/tool, mob/user +#define COMPONENT_NO_ATTACK (1<<0) +#define COMPONENT_NO_INTERACT (1<<0) +#define COMPONENT_NO_ATTACK_OBJ (1<<0) +#define COMPONENT_CANCEL_TOOLACT (1<<0) diff --git a/code/__DEFINES/dcs/item_signals.dm b/code/__DEFINES/dcs/item_signals.dm index 475c33a538c45..922682352c742 100644 --- a/code/__DEFINES/dcs/item_signals.dm +++ b/code/__DEFINES/dcs/item_signals.dm @@ -6,21 +6,7 @@ // /obj/item -///from base of obj/item/attack(): (/mob/living/target, /mob/living/user) -#define COMSIG_ITEM_ATTACK "item_attack" -///from base of obj/item/attack_self(): (/mob) -#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" - #define COMPONENT_NO_INTERACT (1<<0) -///from base of obj/item/attack_obj(): (/obj, /mob) -#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" - #define COMPONENT_NO_ATTACK_OBJ (1<<0) -///from base of obj/item/pre_attack(): (atom/target, mob/user, params) -#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" - #define COMPONENT_NO_ATTACK (1<<0) -///from base of obj/item/pre_attack(): (atom/target, mob/user, params) -#define COMSIG_ITEM_BEING_ATTACKED "item_being_attacked" -///from base of obj/item/afterattack(): (atom/target, mob/user, params) -#define COMSIG_ITEM_AFTERATTACK "item_afterattack" + ///called on [/obj/item] before unequip from base of [/mob/proc/unEquip]: (force, atom/newloc, no_move, invdrop, silent) #define COMSIG_ITEM_PRE_UNEQUIP "item_pre_unequip" ///only the pre unequip can be cancelled @@ -41,9 +27,6 @@ #define COMPONENT_BLOCK_SHARPEN_BLOCKED (1<<1) #define COMPONENT_BLOCK_SHARPEN_ALREADY (1<<2) #define COMPONENT_BLOCK_SHARPEN_MAXED (1<<3) -///from base of [/obj/item/proc/tool_attack_chain]: (atom/tool, mob/user) -#define COMSIG_TOOL_ATTACK "tool_attack" - #define COMPONENT_CANCEL_TOOLACT (1<<0) /// Called by [/obj/item/assembly/proc/pulse] #define COMSIG_ASSEMBLY_PULSED "item_assembly_pulsed" ///from [/mob/living/carbon/human/proc/Move]: () @@ -129,7 +112,7 @@ // other items -/// from base of /obj/item/slimepotion/speed/afterattack(): (obj/target, /obj/src, mob/user) +/// from base of /obj/item/slimepotion/speed/afterattack__legacy__attackchain(): (obj/target, /obj/src, mob/user) #define COMSIG_SPEED_POTION_APPLIED "speed_potion" #define SPEED_POTION_STOP (1<<0) diff --git a/code/__DEFINES/dcs/mob_signals.dm b/code/__DEFINES/dcs/mob_signals.dm index 2922c06f9f9a9..3d0406f583ead 100644 --- a/code/__DEFINES/dcs/mob_signals.dm +++ b/code/__DEFINES/dcs/mob_signals.dm @@ -36,7 +36,7 @@ #define COMPONENT_ITEM_NO_ATTACK (1<<0) ///from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) #define COMSIG_MOB_APPLY_DAMAGE "mob_apply_damage" -///from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) +///from base of obj/item/afterattack__legacy__attackchain(): (atom/target, mob/user, proximity_flag, click_parameters) #define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" ///from base of mob/RangedAttack(): (atom/A, params) #define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 0c1bda08b3ae4..c108b54e38cf5 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -44,7 +44,7 @@ The most common are: * mob/UnarmedAttack(atom,adjacent) - used here only when adjacent, with no item in hand; in the case of humans, checks gloves * atom/attackby(item,user) - used only when adjacent - * item/afterattack(atom,user,adjacent,params) - used both ranged and adjacent + * item/afterattack__legacy__attackchain(atom,user,adjacent,params) - used both ranged and adjacent * mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed */ /mob/proc/ClickOn(atom/A, params) @@ -123,7 +123,10 @@ var/obj/item/W = get_active_hand() if(W == A) - W.attack_self(src) + if(W.new_attack_chain) + W.activate_self(src) + else + W.attack_self__legacy__attackchain(src) if(hand) update_inv_l_hand() else @@ -150,10 +153,12 @@ if(ismob(A)) changeNext_move(CLICK_CD_MELEE) UnarmedAttack(A, 1) - else if(W) - W.afterattack(A, src, 0, params) // 0: not Adjacent + if(W.new_attack_chain) + A.base_ranged_item_interaction(src, W, params) + else + W.afterattack__legacy__attackchain(A, src, 0, params) // 0: not Adjacent else RangedAttack(A, params) diff --git a/code/_onclick/click_override.dm b/code/_onclick/click_override.dm index 36674ed70987c..c59506c654e1a 100644 --- a/code/_onclick/click_override.dm +++ b/code/_onclick/click_override.dm @@ -25,7 +25,7 @@ icon_state = "book" var/datum/middle_click_override/clickBehavior = new /datum/middle_click_override/badmin_clicker -/obj/item/badmin_book/attack_self(mob/living/user as mob) +/obj/item/badmin_book/attack_self__legacy__attackchain(mob/living/user as mob) if(user.middleClickOverride) to_chat(user, "You try to draw power from [src], but you cannot hold the power at this time!") return diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 39e0b5138ab22..7e5da141d5a10 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -83,7 +83,11 @@ return if(W == A) - W.attack_self(src) + if(W.new_attack_chain) + W.activate_self(src) + else + W.attack_self__legacy__attackchain(src) + return // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents) @@ -98,7 +102,7 @@ if(can_reach(A, W)) W.melee_attack_chain(src, A, params) return - W.afterattack(A, src, 0, params) + W.afterattack__legacy__attackchain(A, src, 0, params) return /mob/living/silicon/robot/MiddleShiftControlClickOn(atom/A) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 4b0dbab47b08f..16a7a09b9ba9f 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -76,7 +76,7 @@ /atom/movable/screen/grab/attack_hand() return -/atom/movable/screen/grab/attackby() +/atom/movable/screen/grab/attackby__legacy__attackchain() return /atom/movable/screen/act_intent name = "intent" @@ -170,7 +170,7 @@ if(master) var/obj/item/I = usr.get_active_hand() if(I) - master.attackby(I, usr, params) + master.attackby__legacy__attackchain(I, usr, params) return TRUE /atom/movable/screen/storage/proc/is_item_accessible(obj/item/I, mob/user) @@ -226,7 +226,7 @@ S.orient2hud(user) S.show_to(user) else // If it's not in the storage, try putting it inside - S.attackby(I, user) + S.attackby__legacy__attackchain(I, user) return TRUE /atom/movable/screen/zone_sel diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 02b314ad6140c..94836bb8663e6 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -1,35 +1,71 @@ -/obj/item/proc/melee_attack_chain(mob/user, atom/target, params) - if(!tool_attack_chain(user, target) && pre_attack(target, user, params)) - // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) - var/resolved = target.attackby(src, user, params) - if(!resolved && target && !QDELETED(src)) - afterattack(target, user, 1, params) // 1: clicking something Adjacent - -//Checks if the item can work as a tool, calling the appropriate tool behavior on the target -//Note that if tool_act returns TRUE, then the tool won't call attack_by. -/obj/item/proc/tool_attack_chain(mob/user, atom/target) - if(!tool_behaviour) - return FALSE - if(SEND_SIGNAL(target, COMSIG_TOOL_ATTACK, src, user) & COMPONENT_CANCEL_TOOLACT) - return FALSE +/** + * This is the proc that handles the order of an item_attack. + * + * The order of procs called is: + * * [/atom/proc/base_item_interaction] 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 FINISH_ATTACK, the chain will be stopped. + * * [/atom/proc/attack_by] on the target. If it returns FINISH_ATTACK, the chain will be stopped. + * * [/obj/item/proc/after_attack]. The return value does not matter. + * + * Currently the return value of this proc is not checked anywhere, and is only used when short-circuiting the rest of the item attack. + */ +/obj/item/proc/melee_attack_chain(mob/user, atom/target, params, proximity_flag = 1) + // TODO: Look into whether proxy attackers are worth porting from /tg/: https://github.com/tgstation/tgstation/pull/83860 + var/list/modifiers = params2list(params) + + var/item_interact_result = target.base_item_interaction(user, src, modifiers) + if(item_interact_result & ITEM_INTERACT_SUCCESS) + return + if(item_interact_result & ITEM_INTERACT_BLOCKING) + return - return target.tool_act(user, src, tool_behaviour) + // Attack phase -// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. -/obj/item/proc/attack_self(mob/user) - var/signal_ret = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) - if(signal_ret & COMPONENT_NO_INTERACT) + if(pre_attack(target, user, params)) return - if(signal_ret & COMPONENT_CANCEL_ATTACK_CHAIN) - return TRUE -/obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby! - if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_CANCEL_ATTACK_CHAIN) - return TRUE + var/resolved = target.new_attack_chain \ + ? target.attack_by(src, user, params) \ + : target.attackby__legacy__attackchain(src, user, params) + + // We were asked to cancel the rest of the attack chain. + if(resolved) + return + + // At this point it means the attack was "successful", or at least + // handled, in some way. This can mean nothing happened, this can mean the + // target took damage, etc. + if(target.new_attack_chain) + target.attacked_by(src, user) + after_attack(target, user, proximity_flag, params) + else + afterattack__legacy__attackchain(target, user, proximity_flag, params) - if(SEND_SIGNAL(A, COMSIG_ITEM_BEING_ATTACKED, src, user, params) & COMPONENT_CANCEL_ATTACK_CHAIN) +/// Called when the item is in the active hand, and clicked; alternately, there +/// is an 'activate held object' verb or you can hit pagedown. +/obj/item/proc/activate_self(mob/user) + SHOULD_CALL_PARENT(TRUE) + + if(SEND_SIGNAL(src, COMSIG_ACTIVATE_SELF, user) & COMPONENT_CANCEL_ATTACK_CHAIN) + return FINISH_ATTACK + +/** + * Called on ourselves before we hit something. Return TRUE to cancel the remainder of the attack chain. + * + * Arguments: + * * atom/A - The atom about to be hit + * * mob/living/user - The mob doing the htting + * * params - click params such as alt/shift etc + * + * See: [/obj/item/proc/melee_attack_chain] + */ +/obj/item/proc/pre_attack(atom/A, mob/living/user, params) + SHOULD_CALL_PARENT(TRUE) + + if(SEND_SIGNAL(src, COMSIG_PRE_ATTACK, A, user, params) & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE + // TODO: Turn this into a component and have a sane implementation instead of extra-specific behavior in a core proc var/temperature = get_heat() if(temperature && A.reagents && !ismob(A) && !istype(A, /obj/item/clothing/mask/cigarette)) var/reagent_temp = A.reagents.chem_temp @@ -37,119 +73,179 @@ if(do_after_once(user, time, TRUE, user, TRUE, attempt_cancel_message = "You stop heating up [A].")) to_chat(user, "You heat [A] with [src].") A.reagents.temperature_reagents(temperature) - return TRUE //return FALSE to avoid calling attackby after this proc does stuff -// No comment -/atom/proc/attackby(obj/item/W, mob/user, params) - if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK) - return TRUE - return FALSE +/** + * Called when mob `user` is hitting us with an item `attacking`. + * Part of the [/obj/item/proc/melee_attack_chain]. + * + * Handles calling [/atom/proc/attack] or [/obj/item/proc/attack_obj] as necessary. + * + * 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 + * + * Handles [COMSIG_ATTACK_BY] returning [COMPONENT_SKIP_AFTERATTACK]. + * Returns [FINISH_ATTACK] if the attack chain should stop here. + */ +/atom/proc/attack_by(obj/item/attacking, mob/user, params) + SHOULD_CALL_PARENT(TRUE) -/obj/attackby(obj/item/I, mob/living/user, params) - return ..() || (can_be_hit && I.attack_obj(src, user, params)) + if(SEND_SIGNAL(src, COMSIG_ATTACK_BY, attacking, user, params) & COMPONENT_SKIP_AFTERATTACK) + return FINISH_ATTACK -/mob/living/attackby(obj/item/I, mob/living/user, params) - user.changeNext_move(CLICK_CD_MELEE) - if(attempt_harvest(I, user)) - return TRUE - return I.attack(src, user) +/obj/attack_by(obj/item/attacking, mob/user, params) + . = ..() -/obj/item/proc/attack(mob/living/M, mob/living/user, def_zone) - if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_CANCEL_ATTACK_CHAIN) + if(.) + return FINISH_ATTACK + + if(!can_be_hit) + return FINISH_ATTACK + + return attacking.attack_obj(src, user, params) + +/mob/living/attack_by(obj/item/attacking, mob/living/user, params) + if(..()) return TRUE - SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, M, user) + user.changeNext_move(CLICK_CD_MELEE) + return attacking.attack(src, user, params) + +/** + * Called when we are used by `user` to attack the living `target`. + * + * Returns `TRUE` if the rest of the attack chain should be cancelled. This may occur if the attack failed for some reason. + * Returns `FALSE` if the attack was "successful" or "handled" in some way, and the rest of the attack chain should still fire. + */ +/obj/item/proc/attack(mob/living/target, mob/living/user, params) + SHOULD_CALL_PARENT(TRUE) + + var/signal_return = SEND_SIGNAL(src, COMSIG_ATTACK, target, user, params) \ + || SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, target, user, params) + + if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN) + return FINISH_ATTACK + + if(signal_return & COMPONENT_SKIP_ATTACK) + return FALSE + + . = __attack_core(target, user) + + if(!target.new_attack_chain) + return target.attacked_by__legacy__attackchain(src, user, /* def_zone */ null) + +/obj/item/proc/__attack_core(mob/living/target, mob/living/user) + PRIVATE_PROC(TRUE) + if(flags & (NOBLUDGEON)) return FALSE - if((is_surgery_tool_by_behavior(src) || is_organ(src) || tool_behaviour) && user.a_intent == INTENT_HELP && on_operable_surface(M) && M != user) + // TODO: Migrate all of this to the proper objects so it's not clogging up a core proc and called at irrelevant times + if((is_surgery_tool_by_behavior(src) || is_organ(src) || tool_behaviour) && user.a_intent == INTENT_HELP && on_operable_surface(target) && target != user) to_chat(user, "You don't want to harm the person you're trying to help!") - return + return FALSE if(force && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "You don't want to harm other living beings!") - return + return FALSE if(!force) playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) else - SEND_SIGNAL(M, COMSIG_ITEM_ATTACK) - add_attack_logs(user, M, "Attacked with [name] ([uppertext(user.a_intent)]) ([uppertext(damtype)])", (M.ckey && force > 0 && damtype != STAMINA) ? null : ATKLOG_ALMOSTALL) + SEND_SIGNAL(target, COMSIG_ATTACK) + add_attack_logs(user, target, "Attacked with [name] ([uppertext(user.a_intent)]) ([uppertext(damtype)])", (target.ckey && force > 0 && damtype != STAMINA) ? null : ATKLOG_ALMOSTALL) if(hitsound) playsound(loc, hitsound, get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0) - M.lastattacker = user.real_name - M.lastattackerckey = user.ckey - - user.do_attack_animation(M) - . = M.attacked_by(src, user, def_zone) + target.lastattacker = user.real_name + target.lastattackerckey = user.ckey + user.do_attack_animation(target) add_fingerprint(user) -//the equivalent of the standard version of attack() but for object targets. -/obj/item/proc/attack_obj(obj/O, mob/living/user, params) - if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ) - return - if(flags & (NOBLUDGEON)) - return - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(O) - O.attacked_by(src, user) +/// The equivalent of the standard version of [/obj/item/proc/attack] but for non mob targets. +/obj/item/proc/attack_obj(obj/attacked_obj, mob/living/user, params) + var/signal_return = SEND_SIGNAL(src, COMSIG_ATTACK_OBJ, attacked_obj, user) | SEND_SIGNAL(user, COMSIG_ATTACK_OBJ_LIVING, attacked_obj) + if(signal_return & COMPONENT_SKIP_ATTACK) + return TRUE + if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN) + return FALSE + if(flags & NOBLUDGEON) + return FALSE -/atom/movable/proc/attacked_by() + if(!attacked_obj.new_attack_chain) + attacked_obj.attacked_by__legacy__attackchain(src, user) + +/** + * Called *after* we have been attacked with the item `attacker` by `user`. + * + * Return value is ignored for purposes of the attack chain. + */ +/atom/proc/attacked_by(obj/item/attacker, mob/living/user) return -/obj/attacked_by(obj/item/I, mob/living/user) - var/damage = I.force - if(I.force) +/obj/attacked_by(obj/item/attacker, mob/living/user) + var/damage = attacker.force + if(attacker.force) user.visible_message( - "[user] has hit [src] with [I]!", - "You hit [src] with [I]!", + "[user] has hit [src] with [attacker]!", + "You hit [src] with [attacker]!", "You hear something being struck by a weapon!" ) if(ishuman(user)) var/mob/living/carbon/human/H = user damage += H.physiology.melee_bonus - take_damage(damage, I.damtype, MELEE, 1) + take_damage(damage, attacker.damtype, MELEE, 1) -/mob/living/attacked_by(obj/item/I, mob/living/user, def_zone) - send_item_attack_message(I, user) - if(I.force) +/mob/living/attacked_by(obj/item/attacker, mob/living/user, def_zone) + send_item_attack_message(attacker, user) + if(attacker.force) var/bonus_damage = 0 if(ishuman(user)) var/mob/living/carbon/human/H = user bonus_damage = H.physiology.melee_bonus - apply_damage(I.force + bonus_damage, I.damtype, def_zone) - if(I.damtype == BRUTE) + apply_damage(attacker.force + bonus_damage, attacker.damtype, def_zone) + if(attacker.damtype == BRUTE) if(prob(33)) - I.add_mob_blood(src) + attacker.add_mob_blood(src) var/turf/location = get_turf(src) add_splatter_floor(location) if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood user.add_mob_blood(src) -/mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user) - if(!I.force) +/mob/living/simple_animal/attacked_by(obj/item/attacker, mob/living/user) + if(!attacker.force) user.visible_message( - "[user] gently taps [src] with [I].", + "[user] gently taps [src] with [attacker].", "This weapon is ineffective, it does no damage!", "You hear a gentle tapping." ) - else if(I.force < force_threshold || I.damtype == STAMINA) + else if(attacker.force < force_threshold || attacker.damtype == STAMINA) visible_message( - "[I] bounces harmlessly off of [src].", - "[I] bounces harmlessly off of [src]!", + "[attacker] bounces harmlessly off of [src].", + "[attacker] bounces harmlessly off of [src]!", "You hear something being struck by a weapon!" ) else return ..() -// 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 Click() code, see that documentation. -/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters) +/** + * Last proc in the [/obj/item/proc/melee_attack_chain]. + * + * Arguments: + * * atom/target - The thing that was hit + * * mob/user - The mob doing the hitting + * * 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/after_attack(atom/target, mob/user, proximity_flag, click_parameters) + SHOULD_CALL_PARENT(TRUE) + + SEND_SIGNAL(src, COMSIG_AFTER_ATTACK, target, user, proximity_flag, click_parameters) + SEND_SIGNAL(target, COMSIG_AFTER_ATTACKED_BY, src, user, proximity_flag, click_parameters) /obj/item/proc/get_clamped_volume() if(w_class) diff --git a/code/_onclick/item_attack_legacy.dm b/code/_onclick/item_attack_legacy.dm new file mode 100644 index 0000000000000..828925008da28 --- /dev/null +++ b/code/_onclick/item_attack_legacy.dm @@ -0,0 +1,115 @@ +/** + * Called after `user` has attacked us with item `W`. + * + * New uses of this proc are prohibited! Used [/atom/proc/attacked_by]. + * If you are modifiying an existing implementation of this proc, it is expected that you replace it with the proper alternative! + */ +/atom/proc/attacked_by__legacy__attackchain(obj/item/W, mob/living/user) + return + +/atom/movable/attacked_by__legacy__attackchain() + return + +/obj/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) + return attacked_by(I, user) + +/mob/living/attacked_by__legacy__attackchain(obj/item/I, mob/living/user, def_zone) + return attacked_by(I, user, def_zone) + +/mob/living/simple_animal/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) + return attacked_by(I, user) + +/obj/item/proc/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) + if(SEND_SIGNAL(src, COMSIG_ATTACK, M, user) & COMPONENT_CANCEL_ATTACK_CHAIN) + return TRUE + + SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, M, user) + + . = __attack_core(M, user) + + if(!M.new_attack_chain) + M.attacked_by__legacy__attackchain(src, user, def_zone) + +/** + * Called when `user` attacks us with item `W`. + * + * Handles [COMSIG_ATTACK_BY] returning [COMPONENT_SKIP_AFTERATTACK]. + * Returns TRUE if afterattack should not be called, FALSE otherwise. + * + * New uses of this proc are prohibited! Use [/atom/proc/attackby] or [/atom/proc/base_item_interaction] instead! + * If you are modifiying an existing implementation of this proc, it is expected that you replace it with the proper alternative! + */ +/atom/proc/attackby__legacy__attackchain(obj/item/W, mob/user, params) + if(SEND_SIGNAL(src, COMSIG_ATTACK_BY, W, user, params) & COMPONENT_SKIP_AFTERATTACK) + return TRUE + return FALSE + +/obj/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) + return ..() || (can_be_hit && I.new_attack_chain \ + ? I.attack_obj(src, user, params) \ + : I.attack_obj__legacy__attackchain(src, user, params)) + +/mob/living/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) + user.changeNext_move(CLICK_CD_MELEE) + if(attempt_harvest(I, user)) + return TRUE + + if(I.new_attack_chain) + return I.attack(src, user, params) + + return I.attack__legacy__attackchain(src, user) + +/** + * Called when `user` attacks us with object `O`. + * + * Handles [COMSIG_ATTACK_OBJ] returning [COMPONENT_NO_ATTACK_OBJ]. + * Returns FALSE if the attack isn't valid. + * + * New uses of this proc are prohibited! Use [/obj/item/proc/interact_with_atom] + * or [/atom/proc/base_item_interaction] if this is not meant to be an attack, and + * [/obj/item/proc/attack_obj] if it is. If you are modifiying an existing + * implementation of this proc, it is expected that you replace it with the proper + * alternative! + */ +/obj/item/proc/attack_obj__legacy__attackchain(obj/O, mob/living/user, params) + if(SEND_SIGNAL(src, COMSIG_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ) + return FALSE + if(flags & (NOBLUDGEON)) + return FALSE + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(O) + + if(!O.new_attack_chain) + O.attacked_by__legacy__attackchain(src, user) + +/** + * Called when `user` has us in the active hand, and has clicked on us. + * + * Handles [COMSIG_ACTIVATE_SELF] returning [COMPONENT_NO_INTERACT]. + * Returns TRUE if a listener has requested the attack chain be cancelled. + * + * New uses of this proc are prohibited! Use [/obj/item/proc/activate_self]. + * If you are modifiying an existing implementation of this proc, it is expected that you replace it with the proper alternative! + */ +/obj/item/proc/attack_self__legacy__attackchain(mob/user) + var/signal_ret = SEND_SIGNAL(src, COMSIG_ACTIVATE_SELF, user) + if(signal_ret & COMPONENT_NO_INTERACT) + return + if(signal_ret & COMPONENT_CANCEL_ATTACK_CHAIN) + return TRUE + +/** + * Last proc in the [/obj/item/proc/melee_attack_chain]. + * + * Sends [COMSIG_AFTER_ATTACK] and [COMSIG_AFTER_ATTACKED_BY], handling no responses. + * New uses of this proc are prohibited! attack() calls on mobs and objects handle sending these signals. + * + * Arguments: + * * atom/target - The thing that was hit + * * mob/user - The mob doing the hitting + * * 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__legacy__attackchain(atom/target, mob/user, proximity_flag, params) + SEND_SIGNAL(src, COMSIG_AFTER_ATTACK, target, user, proximity_flag, params) + SEND_SIGNAL(target, COMSIG_AFTER_ATTACKED_BY, src, user, proximity_flag, params) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 6963ca58801cc..4bd96084e7871 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -100,15 +100,15 @@ qdel(src) -/obj/item/tk_grab/attack_self(mob/user) +/obj/item/tk_grab/attack_self__legacy__attackchain(mob/user) if(focus) focus.attack_self_tk(user) /obj/item/tk_grab/override_throw(mob/user, atom/target) - afterattack(target, user) + afterattack__legacy__attackchain(target, user) return TRUE -/obj/item/tk_grab/afterattack(atom/target , mob/living/user, proximity, params) +/obj/item/tk_grab/afterattack__legacy__attackchain(atom/target , mob/living/user, proximity, params) if(!target || !user) return if(last_throw + TK_COOLDOWN > world.time) @@ -140,9 +140,9 @@ if(isitem(focus) && target.Adjacent(focus) && !user.in_throw_mode) var/obj/item/I = focus - var/resolved = target.attackby(I, user, params) + var/resolved = target.attackby__legacy__attackchain(I, user, params) if(!resolved && target && I) - I.afterattack(target,user,1) // for splashing with beakers + I.afterattack__legacy__attackchain(target,user,1) // for splashing with beakers else @@ -156,7 +156,7 @@ focus.throw_at(target, 10, 1, user) last_throw = world.time -/obj/item/tk_grab/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/tk_grab/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) return /obj/item/tk_grab/is_equivalent(obj/item/I) diff --git a/code/datums/components/defibrillator.dm b/code/datums/components/defibrillator.dm index fa734c62f90d1..a33c4f0a36fb5 100644 --- a/code/datums/components/defibrillator.dm +++ b/code/datums/components/defibrillator.dm @@ -72,7 +72,7 @@ var/effect_target = isnull(actual_unit) ? parent : actual_unit - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(trigger_defib)) + RegisterSignal(parent, COMSIG_ATTACK, PROC_REF(trigger_defib)) RegisterSignal(effect_target, COMSIG_ATOM_EMAG_ACT, PROC_REF(on_emag)) RegisterSignal(effect_target, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp)) @@ -119,7 +119,7 @@ * Start the defibrillation process when triggered by a signal. */ /datum/component/defib/proc/trigger_defib(obj/item/paddles, mob/living/carbon/human/target, mob/living/user) - SIGNAL_HANDLER // COMSIG_ITEM_ATTACK + SIGNAL_HANDLER // COMSIG_ATTACK // This includes some do-afters, so we have to pass it off asynchronously INVOKE_ASYNC(src, PROC_REF(defibrillate), user, target) return TRUE diff --git a/code/datums/components/ducttape.dm b/code/datums/components/ducttape.dm index 516b34e347b64..fa749cbbc50eb 100644 --- a/code/datums/components/ducttape.dm +++ b/code/datums/components/ducttape.dm @@ -12,7 +12,7 @@ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(add_tape_text)) x_offset = x y_offset = y - RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(afterattack)) + RegisterSignal(parent, COMSIG_AFTER_ATTACK, PROC_REF(afterattack__legacy__attackchain)) RegisterSignal(parent, COMSIG_ITEM_PICKUP, PROC_REF(pick_up)) I.update_icon() //Do this first so the action button properly shows the icon if(!hide_tape) //the tape can no longer be removed if TRUE @@ -44,7 +44,7 @@ I.remove_tape() qdel(src) -/datum/component/ducttape/proc/afterattack(obj/item/I, atom/target, mob/user, proximity, params) +/datum/component/ducttape/proc/afterattack__legacy__attackchain(obj/item/I, atom/target, mob/user, proximity, params) if(!proximity) return if(!isturf(target)) diff --git a/code/datums/components/label.dm b/code/datums/components/label.dm index c76e2ca97210e..dcc7a3fc73bbf 100644 --- a/code/datums/components/label.dm +++ b/code/datums/components/label.dm @@ -22,12 +22,12 @@ apply_label() /datum/component/label/RegisterWithParent() - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attack_by)) + RegisterSignal(parent, COMSIG_ATTACK_BY, PROC_REF(on_attack_by)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_NAME, PROC_REF(on_update_name)) /datum/component/label/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_PARENT_ATTACKBY, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_NAME)) + UnregisterSignal(parent, list(COMSIG_ATTACK_BY, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_NAME)) /** This proc will fire after the parent is hit by a hand labeler which is trying to apply another label. @@ -53,7 +53,7 @@ * user: The mob who is wielding the attacking object. */ /datum/component/label/proc/on_attack_by(datum/source, obj/item/attacker, mob/user) - SIGNAL_HANDLER // COMSIG_PARENT_ATTACKBY + SIGNAL_HANDLER // COMSIG_ATTACK_BY // If the attacking object is not a hand labeler or it's not off (has a label ready to apply), return. // The hand labeler should be off in order to remove a label. var/obj/item/hand_labeler/labeler = attacker diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 6041460d068c8..e35d9379578b8 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -37,7 +37,7 @@ precondition = _precondition after_insert = _after_insert - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(OnAttackBy)) + RegisterSignal(parent, COMSIG_ATTACK_BY, PROC_REF(OnAttackBy)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(OnExamine)) var/list/possible_mats = list() @@ -74,7 +74,7 @@ if((I.flags_2 & (HOLOGRAM_2 | NO_MAT_REDEMPTION_2)) || (tc && !is_type_in_typecache(I, tc))) to_chat(user, "[parent] won't accept [I]!") return - . = COMPONENT_NO_AFTERATTACK + . = COMPONENT_SKIP_AFTERATTACK var/datum/callback/pc = precondition if(pc && !pc.Invoke(user)) return diff --git a/code/datums/components/paintable.dm b/code/datums/components/paintable.dm index e77e05147190f..f0a7187149a8e 100644 --- a/code/datums/components/paintable.dm +++ b/code/datums/components/paintable.dm @@ -2,7 +2,7 @@ var/current_paint /datum/component/spraycan_paintable/Initialize() - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(Repaint)) + RegisterSignal(parent, COMSIG_ATTACK_BY, PROC_REF(Repaint)) /datum/component/spraycan_paintable/Destroy() RemoveCurrentCoat() @@ -15,7 +15,7 @@ /datum/component/spraycan_paintable/proc/Repaint(datum/source, obj/item/toy/crayon/spraycan/spraycan, mob/living/user) if(!istype(spraycan) || user.a_intent == INTENT_HARM) return - . = COMPONENT_NO_AFTERATTACK + . = COMPONENT_SKIP_AFTERATTACK if(spraycan.capped) to_chat(user, "Take the cap off first!") return diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index ba240898e34fb..6652b4ed6460f 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -22,8 +22,8 @@ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(rad_examine)) RegisterSignal(parent, COMSIG_ADMIN_DECONTAMINATE, PROC_REF(admin_decontaminate)) if(isitem(parent)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(rad_attack)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK_OBJ, PROC_REF(rad_attack)) + RegisterSignal(parent, COMSIG_ATTACK, PROC_REF(rad_attack)) + RegisterSignal(parent, COMSIG_ATTACK_OBJ, PROC_REF(rad_attack)) if(strength > RAD_MINIMUM_CONTAMINATION) SSradiation.warn(src) //Let's make er glow diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index 1506d2851a688..4ad8faa83d656 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -101,7 +101,7 @@ SIGNAL_HANDLER // COMSIG_GUN_TRY_FIRE if(!tracker?.given_turf || target == get_target(tracker.given_turf)) return NONE - INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, afterattack), get_target(tracker.given_turf), user) + INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, afterattack__legacy__attackchain), get_target(tracker.given_turf), user) return COMPONENT_CANCEL_GUN_FIRE /datum/component/scope/proc/on_examine(datum/source, mob/user, list/examine_list) diff --git a/code/datums/components/shelved.dm b/code/datums/components/shelved.dm index 29ba697d01bb3..3aa678d2efed7 100644 --- a/code/datums/components/shelved.dm +++ b/code/datums/components/shelved.dm @@ -25,7 +25,7 @@ /datum/component/shelver/RegisterWithParent() RegisterSignal(parent, COMSIG_SHELF_ATTEMPT_PICKUP, PROC_REF(on_shelf_attempt_pickup)) - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(parent, COMSIG_ATTACK_BY, PROC_REF(on_attackby)) RegisterSignal(parent, COMSIG_SHELF_ITEM_REMOVED, PROC_REF(on_shelf_item_removed)) RegisterSignal(parent, COMSIG_SHELF_ADDED_ON_MAPLOAD, PROC_REF(prepare_autoshelf)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) @@ -117,18 +117,18 @@ O.update_appearance(UPDATE_ICON) /datum/component/shelver/proc/on_attackby(datum/source, obj/item/attacker, mob/user, params) - SIGNAL_HANDLER // COMSIG_PARENT_ATTACKBY + SIGNAL_HANDLER // COMSIG_ATTACK_BY if(isrobot(user)) - return COMPONENT_NO_AFTERATTACK + return COMPONENT_SKIP_AFTERATTACK if(attacker.flags & ABSTRACT) - return COMPONENT_NO_AFTERATTACK + return COMPONENT_SKIP_AFTERATTACK if(user.a_intent == INTENT_HARM) return if(length(allowed_types) && !(attacker.type in allowed_types)) to_chat(user, "[attacker] won't fit on [parent]!") - return COMPONENT_NO_AFTERATTACK + return COMPONENT_SKIP_AFTERATTACK var/list/PL = params2list(params) var/icon_x = text2num(PL["icon-x"]) @@ -140,7 +140,7 @@ if(icon_x >= coords[1] && icon_x <= coords[3] && icon_y >= coords[2] && icon_y <= coords[4]) if(used_places[i]) to_chat(user, "There's already something there on [parent].") - return COMPONENT_NO_AFTERATTACK + return COMPONENT_SKIP_AFTERATTACK var/position_details = placement_zones[coords] if(user.drop_item()) @@ -149,7 +149,7 @@ "[user] places [attacker] on [parent].", "You place [attacker] on [parent].", ) - return COMPONENT_NO_AFTERATTACK + return COMPONENT_SKIP_AFTERATTACK /** * Add an item to the shelf. diff --git a/code/datums/components/spooky.dm b/code/datums/components/spooky.dm index 99f7ba0581162..3ec7ab5bbe68e 100644 --- a/code/datums/components/spooky.dm +++ b/code/datums/components/spooky.dm @@ -2,7 +2,7 @@ var/too_spooky = TRUE //will it spawn a new instrument? /datum/component/spooky/Initialize() - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(spectral_attack)) + RegisterSignal(parent, COMSIG_ATTACK, PROC_REF(spectral_attack)) /datum/component/spooky/proc/spectral_attack(datum/source, mob/living/carbon/C, mob/user) if(ishuman(user)) //this weapon wasn't meant for mortals. diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index 47a94d7e69d2f..bfb939ed10362 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -22,7 +22,7 @@ /datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override, squeak_on_move, extrarange, falloff_exponent, fallof_distance) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), PROC_REF(play_squeak)) + RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATTACK_BY), PROC_REF(play_squeak)) if(ismovable(parent)) RegisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT), PROC_REF(play_squeak)) RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, PROC_REF(play_squeak_crossed)) @@ -30,8 +30,8 @@ if(squeak_on_move) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(play_squeak)) if(isitem(parent)) - RegisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), PROC_REF(play_squeak)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(use_squeak)) + RegisterSignal(parent, list(COMSIG_ATTACK, COMSIG_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), PROC_REF(play_squeak)) + RegisterSignal(parent, COMSIG_ACTIVATE_SELF, PROC_REF(use_squeak)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) if(istype(parent, /obj/item/clothing/shoes)) diff --git a/code/datums/components/sticky.dm b/code/datums/components/sticky.dm index 83b2d7544f961..9b1c625903f5b 100644 --- a/code/datums/components/sticky.dm +++ b/code/datums/components/sticky.dm @@ -25,11 +25,11 @@ return ..() /datum/component/sticky/RegisterWithParent() - RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(stick_to_it)) + RegisterSignal(parent, COMSIG_PRE_ATTACK, PROC_REF(stick_to_it)) RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, PROC_REF(stick_to_it_throwing)) /datum/component/sticky/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_ITEM_PRE_ATTACK) + UnregisterSignal(parent, COMSIG_PRE_ATTACK) UnregisterSignal(parent, COMSIG_MOVABLE_IMPACT) /datum/component/sticky/proc/stick_to_it(obj/item/I, atom/target, mob/user, params) diff --git a/code/datums/components/surgery_initiator.dm b/code/datums/components/surgery_initiator.dm index 9f476ba089da8..7a7f5966c8975 100644 --- a/code/datums/components/surgery_initiator.dm +++ b/code/datums/components/surgery_initiator.dm @@ -48,12 +48,12 @@ src.forced_surgery = forced_surgery /datum/component/surgery_initiator/RegisterWithParent() - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(initiate_surgery_moment)) + RegisterSignal(parent, COMSIG_ATTACK, PROC_REF(initiate_surgery_moment)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_SHARPNESS, PROC_REF(on_parent_sharpness_change)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE_MORE, PROC_REF(on_parent_examine_more)) /datum/component/surgery_initiator/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_ITEM_ATTACK) + UnregisterSignal(parent, COMSIG_ATTACK) UnregisterSignal(parent, COMSIG_ATOM_UPDATE_SHARPNESS) UnregisterSignal(parent, COMSIG_PARENT_EXAMINE_MORE) @@ -72,7 +72,7 @@ /// Does the surgery initiation. /datum/component/surgery_initiator/proc/initiate_surgery_moment(datum/source, atom/target, mob/user) - SIGNAL_HANDLER // COMSIG_ITEM_ATTACK + SIGNAL_HANDLER // COMSIG_ATTACK if(!isliving(user)) return var/mob/living/L = target diff --git a/code/datums/components/two_handed.dm b/code/datums/components/two_handed.dm index 63c3108efe3e2..c5d8143341a49 100644 --- a/code/datums/components/two_handed.dm +++ b/code/datums/components/two_handed.dm @@ -104,8 +104,8 @@ /datum/component/two_handed/RegisterWithParent() RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(on_attack)) + RegisterSignal(parent, COMSIG_ACTIVATE_SELF, PROC_REF(on_attack_self)) + RegisterSignal(parent, COMSIG_ATTACK, PROC_REF(on_attack)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_update_icon)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) RegisterSignal(parent, COMSIG_ITEM_SHARPEN_ACT, PROC_REF(on_sharpen)) @@ -116,8 +116,8 @@ /datum/component/two_handed/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, - COMSIG_ITEM_ATTACK_SELF, - COMSIG_ITEM_ATTACK, + COMSIG_ACTIVATE_SELF, + COMSIG_ATTACK, COMSIG_ATOM_UPDATE_ICON, COMSIG_MOVABLE_MOVED, COMSIG_ITEM_SHARPEN_ACT)) @@ -151,7 +151,7 @@ /// Triggered on attack self of the item containing the component /datum/component/two_handed/proc/on_attack_self(datum/source, mob/user) - SIGNAL_HANDLER // COMSIG_ITEM_ATTACK_SELF + SIGNAL_HANDLER // COMSIG_ACTIVATE_SELF if(require_twohands) return @@ -311,7 +311,7 @@ * on_attack triggers on attack with the parent item */ /datum/component/two_handed/proc/on_attack(obj/item/source, mob/living/target, mob/living/user) - SIGNAL_HANDLER // COMSIG_ITEM_ATTACK + SIGNAL_HANDLER // COMSIG_ATTACK if(wielded && attacksound) var/obj/item/parent_item = parent playsound(parent_item.loc, attacksound, 50, TRUE) diff --git a/code/datums/ores.dm b/code/datums/ores.dm index 7774a485cff32..07e7ae6090038 100644 --- a/code/datums/ores.dm +++ b/code/datums/ores.dm @@ -136,7 +136,7 @@ else log_game("An explosion has triggered a gibtonite deposit reaction at [AREACOORD(source)].") - RegisterSignal(source, COMSIG_PARENT_ATTACKBY, PROC_REF(on_parent_attackby)) + RegisterSignal(source, COMSIG_ATTACK_BY, PROC_REF(on_attackby)) detonate_start_time = world.time explosion_callback = addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/ore/gibtonite, detonate), source), detonate_time, TIMER_STOPPABLE) @@ -164,13 +164,13 @@ return MINERAL_PREVENT_DIG -/datum/ore/gibtonite/proc/on_parent_attackby(turf/source, obj/item/attacker, mob/user) - SIGNAL_HANDLER // COMSIG_PARENT_ATTACKBY +/datum/ore/gibtonite/proc/on_attackby(turf/source, obj/item/attacker, mob/user) + SIGNAL_HANDLER // COMSIG_ATTACK_BY if(istype(attacker, /obj/item/mining_scanner) || istype(attacker, /obj/item/t_scanner/adv_mining_scanner) && stage == GIBTONITE_ACTIVE) user.visible_message("[user] holds [attacker] to [src]...", "You use [attacker] to locate where to cut off the chain reaction and attempt to stop it...") defuse(source) - return COMPONENT_NO_AFTERATTACK + return COMPONENT_SKIP_AFTERATTACK /datum/ore/gibtonite/proc/detonate(turf/simulated/mineral/source) if(stage == GIBTONITE_STABLE) diff --git a/code/datums/outfits/outfit_debug.dm b/code/datums/outfits/outfit_debug.dm index ccce96c4c0cfd..559c9b8b9a21e 100644 --- a/code/datums/outfits/outfit_debug.dm +++ b/code/datums/outfits/outfit_debug.dm @@ -63,7 +63,7 @@ for(var/channel in SSradio.radiochannels) channels[channel] = 1 // yeah, all channels, sure, probably fine -/obj/item/encryptionkey/syndicate/all_channels/attack_self(mob/user, pickupfireoverride) +/obj/item/encryptionkey/syndicate/all_channels/attack_self__legacy__attackchain(mob/user, pickupfireoverride) change_voice = !change_voice to_chat(user, "You switch [src] to [change_voice ? "" : "not "]change your voice on syndicate communications.") @@ -157,7 +157,7 @@ . = ..() . += "Alt-Click to toggle mind-activation on spawning." -/obj/item/debug/human_spawner/afterattack(atom/target, mob/user, proximity) +/obj/item/debug/human_spawner/afterattack__legacy__attackchain(atom/target, mob/user, proximity) ..() if(!isturf(target)) return @@ -167,7 +167,7 @@ if(activate_mind) H.mind_initialize() -/obj/item/debug/human_spawner/attack_self(mob/user) +/obj/item/debug/human_spawner/attack_self__legacy__attackchain(mob/user) ..() var/choice = input("Select a species", "Human Spawner", null) in GLOB.all_species selected_species = GLOB.all_species[choice] @@ -199,7 +199,7 @@ desc = "A wonder of modern medicine. This tool functions as any other sort of surgery tool, and finishes in only a fraction of the time. Hey, how'd you get your hands on this, anyway?" toolspeed = 0.01 -/obj/item/scalpel/laser/manager/debug/attack_self(mob/user) +/obj/item/scalpel/laser/manager/debug/attack_self__legacy__attackchain(mob/user) . = ..() toolspeed = toolspeed == 0.5 ? 0.01 : 0.5 to_chat(user, "[src] is now set to toolspeed [toolspeed]") diff --git a/code/datums/spells/alien_spells/build_resin_structure.dm b/code/datums/spells/alien_spells/build_resin_structure.dm index c38dcceec66d5..b64925e0b2638 100644 --- a/code/datums/spells/alien_spells/build_resin_structure.dm +++ b/code/datums/spells/alien_spells/build_resin_structure.dm @@ -58,7 +58,7 @@ desc = "The hunger..." icon_state = "alien_acid" -/obj/item/melee/touch_attack/alien/consume_resin/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/touch_attack/alien/consume_resin/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(target == user) to_chat(user, "You stop trying to consume resin.") ..() diff --git a/code/datums/spells/alien_spells/corrosive_acid_spit.dm b/code/datums/spells/alien_spells/corrosive_acid_spit.dm index 2f32c2dcb0499..20593bdd37569 100644 --- a/code/datums/spells/alien_spells/corrosive_acid_spit.dm +++ b/code/datums/spells/alien_spells/corrosive_acid_spit.dm @@ -11,7 +11,7 @@ desc = "A fistfull of death." icon_state = "alien_acid" -/obj/item/melee/touch_attack/alien/corrosive_acid/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/touch_attack/alien/corrosive_acid/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(target == user) to_chat(user, "You withdraw your readied acid.") ..() @@ -45,7 +45,7 @@ desc = "The air warps around your hand, somehow the heat doesn't hurt." icon_state = "alien_acid" -/obj/item/melee/touch_attack/alien/burning_touch/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/touch_attack/alien/burning_touch/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(target == user) to_chat(user, "You cool down your boiled aid.") ..() diff --git a/code/datums/spells/banana_touch.dm b/code/datums/spells/banana_touch.dm index 2c289884a91cd..052e657e807d7 100644 --- a/code/datums/spells/banana_touch.dm +++ b/code/datums/spells/banana_touch.dm @@ -24,13 +24,13 @@ /obj/item/melee/touch_attack/banana/apprentice -/obj/item/melee/touch_attack/banana/apprentice/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/touch_attack/banana/apprentice/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(iswizard(target) && target != user) to_chat(user, "Seriously?! Honk THEM, not me!") return ..() -/obj/item/melee/touch_attack/banana/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/touch_attack/banana/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(!proximity || target == user || !ishuman(target) || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) return diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm index e1229dbcc1612..cb8c1a4c182fe 100644 --- a/code/datums/spells/mime.dm +++ b/code/datums/spells/mime.dm @@ -134,7 +134,7 @@ desc = "It contains various pictures of mimes mid-performance, aswell as some illustrated tutorials." icon_state = "bookmime" -/obj/item/spellbook/oneuse/mime/attack_self(mob/user) +/obj/item/spellbook/oneuse/mime/attack_self__legacy__attackchain(mob/user) var/datum/spell/S = new spell for(var/datum/spell/knownspell in user.mind.spell_list) if(knownspell.type == S.type) diff --git a/code/datums/spells/mime_malaise.dm b/code/datums/spells/mime_malaise.dm index 209863ada380f..8ce906e055a71 100644 --- a/code/datums/spells/mime_malaise.dm +++ b/code/datums/spells/mime_malaise.dm @@ -19,7 +19,7 @@ icon_state = "fleshtostone" item_state = "fleshtostone" -/obj/item/melee/touch_attack/mime_malaise/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/touch_attack/mime_malaise/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(!proximity || target == user || !ishuman(target) || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) return diff --git a/code/datums/spells/spacetime_dist.dm b/code/datums/spells/spacetime_dist.dm index e487936fe03fe..e7cee2a416a0d 100644 --- a/code/datums/spells/spacetime_dist.dm +++ b/code/datums/spells/spacetime_dist.dm @@ -110,7 +110,7 @@ if(!cant_teleport) walk_link(AM) -/obj/effect/cross_action/spacetime_dist/attackby(obj/item/W, mob/user, params) +/obj/effect/cross_action/spacetime_dist/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(user.drop_item(W)) walk_link(W) else diff --git a/code/game/atom/atom_tool_acts.dm b/code/game/atom/atom_tool_acts.dm new file mode 100644 index 0000000000000..6c56e5972da84 --- /dev/null +++ b/code/game/atom/atom_tool_acts.dm @@ -0,0 +1,166 @@ +/** + * ## Item interaction + * + * Handles non-combat iteractions of a tool on this atom, + * such as using a tool on a wall to deconstruct it, + * or scanning someone with a health analyzer + */ +/atom/proc/base_item_interaction(mob/living/user, obj/item/tool, list/modifiers) + SHOULD_CALL_PARENT(TRUE) + PROTECTED_PROC(TRUE) + + // We do not have a combat mode or secondary actions like /tg/, so instead + // I'm unilaterally deciding it here: If you are not on harm intent, tool + // interactions are not attacks. Shit like the autolathe accepting + // screwdrivers on harm intent is unintuitive and needs to go away, and there + // are dozens of ${TOOL}_act procs that do constant harm intent checks. + var/tool_return = tool_act(user, tool, modifiers) + if(tool_return) + return tool_return + + var/early_sig_return = NONE + /* + * This is intentionally using `||` instead of `|` to short-circuit the signal calls + * This is because we want to return early if ANY of these signals return a value + * + * This puts priority on the atom's signals, then the tool's signals, then the user's signals + */ + early_sig_return = SEND_SIGNAL(src, COMSIG_INTERACT_TARGET, user, tool, modifiers) \ + || SEND_SIGNAL(tool, COMSIG_INTERACTING, user, src, modifiers) \ + || SEND_SIGNAL(user, COMSIG_INTERACT_USER, src, tool, modifiers) + + if(early_sig_return) + return early_sig_return + + if(new_attack_chain) + var/self_interaction = item_interaction(user, tool, modifiers) + if(self_interaction) + return self_interaction + + if(tool.new_attack_chain) + var/interact_return = tool.interact_with_atom(src, user, modifiers) + if(interact_return) + return interact_return + + return NONE + +/** + * + * ## Tool Act + * + * Handles using specific tools on this atom directly. + * + * Handles the tool_acts in particular, such as wrenches and screwdrivers. + * + * This can be overriden to handle unique "tool interactions" + * IE using an item like a tool (when it's not actually one) + * but otherwise does nothing that [item_interaction] doesn't already do. + * + * In other words, use sparingly. It's harder to use (correctly) than [item_interaction]. + */ +/atom/proc/tool_act(mob/living/user, obj/item/tool, list/modifiers) + SHOULD_CALL_PARENT(TRUE) + PROTECTED_PROC(TRUE) + + if(SEND_SIGNAL(src, COMSIG_TOOL_ATTACK, tool, user) & COMPONENT_CANCEL_TOOLACT) + return FALSE + + var/tool_type = tool.tool_behaviour + if(!tool_type) + return NONE + + var/act_result = NONE // or FALSE, or null, as some things may return + + switch(tool_type) + if(TOOL_CROWBAR) + act_result = crowbar_act(user, tool) + if(TOOL_MULTITOOL) + act_result = multitool_act(user, tool) + if(TOOL_SCREWDRIVER) + act_result = screwdriver_act(user, tool) + if(TOOL_WRENCH) + act_result = wrench_act(user, tool) + if(TOOL_WIRECUTTER) + act_result = wirecutter_act(user, tool) + if(TOOL_WELDER) + act_result = welder_act(user, tool) + + if(!act_result) + return NONE + + return act_result + +/** + * Called when this atom has an item used on it. + * IE, a mob is clicking on this atom with an item. + * + * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. + * Return NONE to allow default interaction / tool handling. + */ +/atom/proc/item_interaction(mob/living/user, obj/item/used, list/modifiers) + return NONE + +/** + * Called when this item is being used to interact with an atom, + * IE, a mob is clicking on an atom with this item. + * + * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. + * Return NONE to allow default interaction / tool handling. + */ +/obj/item/proc/interact_with_atom(atom/target, mob/living/user, list/modifiers) + return NONE + +/** + * ## Ranged item interaction + * + * Handles non-combat ranged interactions of a tool on this atom, + * such as shooting a gun in the direction of someone*, + * having a scanner you can point at someone to scan them at any distance, + * or pointing a laser pointer at something. + * + * *While this intuitively sounds combat related, it is not, + * because a "combat use" of a gun is gun-butting. + */ +/atom/proc/base_ranged_item_interaction(mob/living/user, obj/item/tool, list/modifiers) + SHOULD_CALL_PARENT(TRUE) + PROTECTED_PROC(TRUE) + + // See [base_item_interaction] for defails on why this is using `||` (TL;DR it's short circuiting) + var/early_sig_return = SEND_SIGNAL(src, COMSIG_INTERACT_RANGED, user, tool, modifiers) \ + || SEND_SIGNAL(tool, COMSIG_INTERACTING_RANGED, user, src, modifiers) + + if(early_sig_return) + return early_sig_return + + var/self_interaction = ranged_item_interaction(user, tool, modifiers) + if(self_interaction) + return self_interaction + + var/interact_return = tool.ranged_interact_with_atom(src, user, modifiers) + if(interact_return) + return interact_return + + return NONE + +/** + * Called when this atom has an item used on it from a distance. + * IE, a mob is clicking on this atom with an item and is not adjacent. + * + * Does NOT include Telekinesis users, they are considered adjacent generally. + * + * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. + */ +/atom/proc/ranged_item_interaction(mob/living/user, obj/item/tool, list/modifiers) + return NONE + +/** + * Called when this item is being used to interact with an atom from a distance, + * IE, a mob is clicking on an atom with this item and is not adjacent. + * + * Does NOT include Telekinesis users, they are considered adjacent generally + * (so long as this item is adjacent to the atom). + * + * Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code. + */ +/obj/item/proc/ranged_interact_with_atom(atom/target, mob/living/user, list/modifiers) + return NONE diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 838de5d24408d..0f77644ea66c1 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -129,6 +129,9 @@ ///When a projectile ricochets off this atom, it deals the normal damage * this modifier to this atom var/receive_ricochet_damage_coeff = 0.33 + /// Whether this atom is using the new attack chain. + var/new_attack_chain = FALSE + /atom/New(loc, ...) SHOULD_CALL_PARENT(TRUE) if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() @@ -549,23 +552,6 @@ if(reagents) reagents.temperature_reagents(exposed_temperature) -/// If it returns TRUE, attack chain stops -/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type) - switch(tool_type) - if(TOOL_CROWBAR) - return crowbar_act(user, I) - if(TOOL_MULTITOOL) - return multitool_act(user, I) - if(TOOL_SCREWDRIVER) - return screwdriver_act(user, I) - if(TOOL_WRENCH) - return wrench_act(user, I) - if(TOOL_WIRECUTTER) - return wirecutter_act(user, I) - if(TOOL_WELDER) - return welder_act(user, I) - - // Tool-specific behavior procs. To be overridden in subtypes. /atom/proc/crowbar_act(mob/living/user, obj/item/I) return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index ba00d87662230..0af9086620762 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -504,9 +504,9 @@ verbs.Cut() return -/atom/movable/overlay/attackby(a, b, c) +/atom/movable/overlay/attackby__legacy__attackchain(a, b, c) if(master) - return master.attackby(a, b, c) + return master.attackby__legacy__attackchain(a, b, c) /atom/movable/overlay/attack_hand(a, b, c) if(master) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 3e140fca048e2..c85ff6a05c3b1 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -190,7 +190,7 @@ QDEL_LIST_CONTENTS(L.grabbed_by) return TRUE -/obj/machinery/dna_scannernew/attackby(obj/item/I, mob/user, params) +/obj/machinery/dna_scannernew/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/glass)) if(beaker) to_chat(user, "A beaker is already loaded into the machine.") @@ -327,7 +327,7 @@ idle_power_consumption = 10 active_power_consumption = 400 -/obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params) +/obj/machinery/computer/scan_consolenew/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/disk/data)) //INSERT SOME diskS if(!disk) user.drop_item() diff --git a/code/game/gamemodes/cult/blood_magic.dm b/code/game/gamemodes/cult/blood_magic.dm index 348345a6aee57..6f97e380e15eb 100644 --- a/code/game/gamemodes/cult/blood_magic.dm +++ b/code/game/gamemodes/cult/blood_magic.dm @@ -410,10 +410,10 @@ /obj/item/melee/blood_magic/customised_abstract_text(mob/living/carbon/owner) return "[owner.p_their(TRUE)] [owner.l_hand == src ? "left hand" : "right hand"] is burning in blood-red fire." -/obj/item/melee/blood_magic/attack_self(mob/living/user) - afterattack(user, user, TRUE) +/obj/item/melee/blood_magic/attack_self__legacy__attackchain(mob/living/user) + attackby__legacy__attackchain(user, user, TRUE) -/obj/item/melee/blood_magic/attack(mob/living/M, mob/living/carbon/user) +/obj/item/melee/blood_magic/attack__legacy__attackchain(mob/living/M, mob/living/carbon/user) if(!iscarbon(user) || !IS_CULTIST(user)) uses = 0 qdel(src) @@ -421,7 +421,7 @@ add_attack_logs(user, M, "used a cult spell ([src]) on") M.lastattacker = user.real_name -/obj/item/melee/blood_magic/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/blood_magic/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) . = ..() if(invocation) user.whisper(invocation) @@ -443,7 +443,7 @@ color = RUNE_COLOR_RED invocation = "Fuu ma'jin!" -/obj/item/melee/blood_magic/stun/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/blood_magic/stun/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(!isliving(target) || !proximity) return var/mob/living/L = target @@ -489,7 +489,7 @@ desc = "Will teleport a cultist to a teleport rune on contact." invocation = "Sas'so c'arta forbici!" -/obj/item/melee/blood_magic/teleport/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/blood_magic/teleport/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(user.holy_check()) return var/list/potential_runes = list() @@ -563,7 +563,7 @@ invocation = "In'totum Lig'abis!" color = "#000000" // black -/obj/item/melee/blood_magic/shackles/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/blood_magic/shackles/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(user.holy_check()) return if(iscarbon(target) && proximity) @@ -626,7 +626,7 @@ [METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal into a construct shell\n Airlocks into brittle runed airlocks after a delay (harm intent)"} -/obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/melee/blood_magic/construction/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, click_parameters) if(user.holy_check()) return if(proximity_flag) @@ -682,7 +682,7 @@ desc = "Will equipt cult combat gear onto a cultist on contact." color = "#33cc33" // green -/obj/item/melee/blood_magic/armor/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/blood_magic/armor/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(user.holy_check()) return if(iscarbon(target) && proximity) @@ -707,7 +707,7 @@ color = "#9c0651" has_source = FALSE //special, only availible for a blood cost. -/obj/item/melee/blood_magic/empower/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/melee/blood_magic/empower/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, click_parameters) if(user.holy_check()) return if(proximity_flag) @@ -857,7 +857,7 @@ new /obj/effect/temp_visual/cult/sparks(get_turf(H)) // This should really be split into multiple procs -/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity) +/obj/item/melee/blood_magic/manipulator/afterattack__legacy__attackchain(atom/target, mob/living/carbon/human/user, proximity) if(user.holy_check()) return if(!proximity) @@ -912,7 +912,7 @@ to_chat(user, "Your blood rite has gained [temp] charge\s from blood sources around you!") uses += max(1, temp) -/obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) +/obj/item/melee/blood_magic/manipulator/attack_self__legacy__attackchain(mob/living/user) if(user.holy_check()) return var/list/options = list("Blood Orb (50)" = image(icon = 'icons/obj/cult.dmi', icon_state = "summoning_orb"), diff --git a/code/game/gamemodes/cult/cult_actions.dm b/code/game/gamemodes/cult/cult_actions.dm index 315350410ebb7..83c1b3155bbbe 100644 --- a/code/game/gamemodes/cult/cult_actions.dm +++ b/code/game/gamemodes/cult/cult_actions.dm @@ -123,6 +123,6 @@ if(D) owner.remove_from_mob(D) owner.put_in_hands(D) - D.attack_self(owner) + D.activate_self(owner) else to_chat(usr, "You do not seem to carry a ritual dagger to draw a rune with. If you need a new one, prepare and use the Summon Dagger spell.") diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index f05682e9d1b17..053ecf814bff2 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -23,6 +23,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sprite_sheets_inhand = list("Skrell" = 'icons/mob/clothing/species/skrell/held.dmi') // To stop skrell stabbing themselves in the head + new_attack_chain = TRUE /obj/item/melee/cultblade/Initialize(mapload) . = ..() @@ -33,7 +34,10 @@ . = ..() . += "This blade is a powerful weapon, capable of severing limbs easily. Nonbelievers are unable to use this weapon. Striking a nonbeliever after downing them with your cult magic will stun them completely." -/obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user) +/obj/item/melee/cultblade/pre_attack(atom/target, mob/living/user, params) + if(..()) + return FINISH_ATTACK + if(!IS_CULTIST(user)) user.Weaken(10 SECONDS) user.unEquip(src, 1) @@ -44,12 +48,17 @@ H.apply_damage(rand(force/2, force), BRUTE, pick("l_arm", "r_arm")) else user.adjustBruteLoss(rand(force/2, force)) - return + + return FINISH_ATTACK + +/obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user) + if(..()) + return FINISH_ATTACK + if(!IS_CULTIST(target)) var/datum/status_effect/cult_stun_mark/S = target.has_status_effect(STATUS_EFFECT_CULT_STUN) if(S) S.trigger() - ..() /obj/item/melee/cultblade/pickup(mob/living/user) . = ..() @@ -241,7 +250,7 @@ /obj/item/whetstone/cult/update_icon_state() icon_state = "cult_sharpener[used ? "_used" : ""]" -/obj/item/whetstone/cult/attackby(obj/item/I, mob/user, params) +/obj/item/whetstone/cult/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() if(used) to_chat(user, "[src] crumbles to ashes.") @@ -281,7 +290,7 @@ icon_state ="shuttlecurse" var/global/curselimit = 0 -/obj/item/shuttle_curse/attack_self(mob/living/user) +/obj/item/shuttle_curse/attack_self__legacy__attackchain(mob/living/user) if(!IS_CULTIST(user)) user.unEquip(src, 1) user.Weaken(10 SECONDS) @@ -330,7 +339,7 @@ pulled.forceMove(turf_behind) . = pulled -/obj/item/cult_shift/attack_self(mob/user) +/obj/item/cult_shift/attack_self__legacy__attackchain(mob/user) if(!uses || !iscarbon(user)) to_chat(user, "[src] is dull and unmoving in your hands.") @@ -625,7 +634,7 @@ playsound(T, 'sound/effects/glassbr3.ogg', 100) qdel(src) -/obj/item/cult_spear/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/cult_spear/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) . = ..() var/datum/status_effect/cult_stun_mark/S = M.has_status_effect(STATUS_EFFECT_CULT_STUN) if(S && HAS_TRAIT(src, TRAIT_WIELDED)) @@ -671,7 +680,7 @@ fire_sound = 'sound/magic/wand_teleport.ogg' flags = NOBLUDGEON | DROPDEL -/obj/item/gun/projectile/shotgun/boltaction/enchanted/arcane_barrage/blood/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/gun/projectile/shotgun/boltaction/enchanted/arcane_barrage/blood/afterattack__legacy__attackchain(atom/target, mob/living/user, flag, params) if(user.holy_check()) return ..() @@ -722,7 +731,7 @@ w_class = WEIGHT_CLASS_SMALL -/obj/item/portal_amulet/afterattack(atom/O, mob/user, proximity) +/obj/item/portal_amulet/afterattack__legacy__attackchain(atom/O, mob/user, proximity) . = ..() if(!IS_CULTIST(user)) if(!iscarbon(user)) @@ -802,7 +811,7 @@ if(target) exit = new /obj/effect/cult_portal_exit(target) -/obj/effect/portal/cult/attackby(obj/I, mob/user, params) +/obj/effect/portal/cult/attackby__legacy__attackchain(obj/I, mob/user, params) if(istype(I, /obj/item/melee/cultblade/dagger) && IS_CULTIST(user) || istype(I, /obj/item/nullrod) && HAS_MIND_TRAIT(user, TRAIT_HOLY)) to_chat(user, "You close the portal with your [I].") playsound(src, 'sound/magic/magic_missile.ogg', 100, TRUE) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index eea528a729b45..b948bad9da635 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -52,7 +52,7 @@ . += "The magic in [src] is weak, it will be ready to use again in [get_ETA()]." . += "[src] is [anchored ? "":"not "]secured to the floor." -/obj/structure/cult/functional/attackby(obj/item/I, mob/user, params) +/obj/structure/cult/functional/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/melee/cultblade/dagger) && IS_CULTIST(user)) if(user.holy_check()) return @@ -180,7 +180,7 @@ . = ..() icon_state = GET_CULT_DATA(forge_icon_state, "forge") -/obj/structure/cult/functional/forge/attackby(obj/item/I, mob/user, params) +/obj/structure/cult/functional/forge/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/grab)) var/obj/item/grab/G = I if(!iscarbon(G.affecting)) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index e20ec8dba5e33..fd1e6f3f1438b 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -32,28 +32,31 @@ . += "Striking another cultist with it will purge holy water from them." . += "Striking a noncultist will tear their flesh, additionally, if you recently downed them with cult magic it will stun them completely." -/obj/item/melee/cultblade/dagger/attack(mob/living/M, mob/living/user) - if(IS_CULTIST(M)) - if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion - if(M == user) // Targeting yourself +/obj/item/melee/cultblade/dagger/pre_attack(atom/target, mob/living/user, params) + if(..()) + return FINISH_ATTACK + + if(IS_CULTIST(target)) + if(target.reagents && target.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion + if(target == user) // Targeting yourself to_chat(user, "You can't remove holy water from yourself!") + else // Targeting someone else - to_chat(user, "You remove the taint from [M].") - to_chat(M, "[user] removes the taint from your body.") - M.reagents.del_reagent("holywater") - add_attack_logs(user, M, "Hit with [src], removing the holy water from them") - return FALSE - else - var/datum/status_effect/cult_stun_mark/S = M.has_status_effect(STATUS_EFFECT_CULT_STUN) - if(S) - S.trigger() - . = ..() + to_chat(user, "You remove the taint from [target].") + to_chat(target, "[user] removes the taint from your body.") + target.reagents.del_reagent("holywater") + add_attack_logs(user, target, "Hit with [src], removing the holy water from them") -/obj/item/melee/cultblade/dagger/attack_self(mob/user) - if(!IS_CULTIST(user)) - to_chat(user, "[src] is covered in unintelligible shapes and markings.") + return FINISH_ATTACK + +/obj/item/melee/cultblade/dagger/activate_self(mob/user) + if(..()) return - scribe_rune(user) + + if(IS_CULTIST(user)) + scribe_rune(user) + else + to_chat(user, "[src] is covered in unintelligible shapes and markings.") /obj/item/melee/cultblade/dagger/proc/narsie_rune_check(mob/living/user, area/A) var/datum/game_mode/gamemode = SSticker.mode @@ -97,7 +100,6 @@ return FALSE return TRUE - /obj/item/melee/cultblade/dagger/proc/scribe_rune(mob/living/user) var/list/shields = list() var/list/possible_runes = list() diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 55674d5770570..ebe886ff10c6e 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -75,7 +75,7 @@ To draw a rune, use a ritual dagger. if(req_keyword && keyword) . += "Keyword: [keyword]" -/obj/effect/rune/attackby(obj/I, mob/user, params) +/obj/effect/rune/attackby__legacy__attackchain(obj/I, mob/user, params) if(istype(I, /obj/item/melee/cultblade/dagger) && IS_CULTIST(user)) if(!can_dagger_erase_rune(user)) return @@ -1098,7 +1098,7 @@ structure_check() searches for nearby cultist structures required for the invoca sleep(40) new /obj/singularity/narsie/large(T) //Causes Nar'Sie to spawn even if the rune has been removed -/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal. +/obj/effect/rune/narsie/attackby__legacy__attackchain(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal. if((istype(I, /obj/item/melee/cultblade/dagger) && IS_CULTIST(user))) log_game("Summon Narsie rune erased by [key_name(user)] with a cult dagger") message_admins("[key_name_admin(user)] erased a Narsie rune with a cult dagger") diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 235cab74862eb..02bc96a04065a 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -191,12 +191,12 @@ CONTENTS: item_state = "silencer" origin_tech = "materials=4;programming=7;abductor=3" -/obj/item/abductor/silencer/attack(mob/living/M, mob/user) +/obj/item/abductor/silencer/attack__legacy__attackchain(mob/living/M, mob/user) if(!AbductorCheck(user)) return radio_off(M, user) -/obj/item/abductor/silencer/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/abductor/silencer/afterattack__legacy__attackchain(atom/target, mob/living/user, flag, params) if(flag) return if(!AbductorCheck(user)) @@ -284,7 +284,7 @@ CONTENTS: icon_state = "wonderprodProbe" item_state = "wonderprodProbe" -/obj/item/abductor_baton/attack(mob/target, mob/living/user) +/obj/item/abductor_baton/attack__legacy__attackchain(mob/target, mob/living/user) if(!isabductor(user)) return @@ -316,7 +316,7 @@ CONTENTS: if(BATON_PROBE) ProbeAttack(L,user) -/obj/item/abductor_baton/attack_self(mob/living/user) +/obj/item/abductor_baton/attack_self__legacy__attackchain(mob/living/user) toggle(user) if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -449,7 +449,7 @@ CONTENTS: var/mob/living/marked = null var/obj/machinery/abductor/console/console -/obj/item/abductor/gizmo/attack_self(mob/user) +/obj/item/abductor/gizmo/attack_self__legacy__attackchain(mob/user) if(!ScientistCheck(user)) return if(!console) @@ -464,7 +464,7 @@ CONTENTS: icon_state = "gizmo_scan" to_chat(user, "You switch the device to [mode==GIZMO_SCAN? "SCAN": "MARK"] MODE") -/obj/item/abductor/gizmo/attack(mob/living/M, mob/user) +/obj/item/abductor/gizmo/attack__legacy__attackchain(mob/living/M, mob/user) if(!ScientistCheck(user)) return if(!console) @@ -477,7 +477,7 @@ CONTENTS: if(GIZMO_MARK) mark(M, user) -/obj/item/abductor/gizmo/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/abductor/gizmo/afterattack__legacy__attackchain(atom/target, mob/living/user, flag, params) if(flag) return if(!ScientistCheck(user)) @@ -531,7 +531,7 @@ CONTENTS: item_state = "silencer" var/mode = MIND_DEVICE_MESSAGE -/obj/item/abductor/mind_device/attack_self(mob/user) +/obj/item/abductor/mind_device/attack_self__legacy__attackchain(mob/user) if(!ScientistCheck(user)) return @@ -543,7 +543,7 @@ CONTENTS: icon_state = "mind_device_message" to_chat(user, "You switch the device to [mode == MIND_DEVICE_MESSAGE ? "TRANSMISSION" : "COMMAND"] MODE") -/obj/item/abductor/mind_device/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/abductor/mind_device/afterattack__legacy__attackchain(atom/target, mob/living/user, flag, params) if(!ScientistCheck(user)) return diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index db6453bcb7f9d..f1539a9929176 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -218,7 +218,7 @@ vest = V return TRUE -/obj/machinery/abductor/console/attackby(obj/O, mob/user, params) +/obj/machinery/abductor/console/attackby__legacy__attackchain(obj/O, mob/user, params) if(istype(O, /obj/item/abductor/gizmo) && AddGizmo(O)) to_chat(user, "You link the tool to the console.") else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O)) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm index 9d13aa35d047a..9d70325835a9f 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm @@ -82,7 +82,7 @@ return ui_interact(user) -/obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, params) +/obj/machinery/abductor/gland_dispenser/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/organ/internal/heart/gland)) if(!user.drop_item()) return diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 1ee6822d206bd..339d4f4e77372 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -174,7 +174,7 @@ H.clear_restraints() return -/obj/machinery/abductor/experiment/attackby(obj/item/G, mob/user) +/obj/machinery/abductor/experiment/attackby__legacy__attackchain(obj/item/G, mob/user) if(istype(G, /obj/item/grab)) var/obj/item/grab/grabbed = G if(!ishuman(grabbed.affecting)) diff --git a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm index df69ab5e4d211..df5df3aae74a1 100644 --- a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm +++ b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm @@ -230,7 +230,7 @@ desc = "It still beats furiously, emitting an aura of fear." color = COLOR_BLACK -/obj/item/organ/internal/heart/demon/shadow/attack_self(mob/living/user) +/obj/item/organ/internal/heart/demon/shadow/attack_self__legacy__attackchain(mob/living/user) . = ..() user.drop_item() insert(user) diff --git a/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm b/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm index beb1b7ae99c84..67e9eca6a599a 100644 --- a/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm +++ b/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm @@ -220,7 +220,7 @@ /obj/item/organ/internal/heart/demon/prepare_eat() return // Just so people don't accidentally waste it -/obj/item/organ/internal/heart/demon/attack_self(mob/living/user) +/obj/item/organ/internal/heart/demon/attack_self__legacy__attackchain(mob/living/user) user.visible_message("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!", \ "An unnatural hunger consumes you. You raise [src] to your mouth and devour it!") playsound(user, 'sound/misc/demon_consume.ogg', 50, 1) @@ -230,7 +230,7 @@ //The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl /// SLAUGHTER DEMON HEART -/obj/item/organ/internal/heart/demon/slaughter/attack_self(mob/living/user) +/obj/item/organ/internal/heart/demon/slaughter/attack_self__legacy__attackchain(mob/living/user) ..() // Eating the heart for the first time. Gives basic bloodcrawling. This is the only time we need to insert the heart. diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 77eb510f82d27..83e47bff1c163 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -279,7 +279,7 @@ "Blue" = "#0000FF") var/name_list = list("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces") -/obj/item/guardiancreator/attack_self(mob/living/user) +/obj/item/guardiancreator/attack_self__legacy__attackchain(mob/living/user) if(has_guardian(user)) to_chat(user, "You already have a [mob_name]!") return diff --git a/code/game/gamemodes/miniantags/guardian/types/explosive_guardian.dm b/code/game/gamemodes/miniantags/guardian/types/explosive_guardian.dm index cd90466c93f15..8ed033b7f9cbb 100644 --- a/code/game/gamemodes/miniantags/guardian/types/explosive_guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/types/explosive_guardian.dm @@ -90,7 +90,7 @@ user.Stun(3 SECONDS)//A bomb went off in your hands. Actually lets people follow up with it if they bait someone, right now it is unreliable. qdel(src) -/obj/item/guardian_bomb/attackby(obj/item/W, mob/living/user) +/obj/item/guardian_bomb/attackby__legacy__attackchain(obj/item/W, mob/living/user) detonate(user) /obj/item/guardian_bomb/attack_hand(mob/user) diff --git a/code/game/gamemodes/miniantags/guardian/types/protector.dm b/code/game/gamemodes/miniantags/guardian/types/protector.dm index 2be939f8cff59..e385fd1e329d4 100644 --- a/code/game/gamemodes/miniantags/guardian/types/protector.dm +++ b/code/game/gamemodes/miniantags/guardian/types/protector.dm @@ -137,7 +137,7 @@ P.on_hit(src, 0) return FALSE -/obj/effect/guardianshield/attacked_by(obj/item/I, mob/living/user) +/obj/effect/guardianshield/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) if(I.force) user.visible_message("[user] has hit [src] with [I]!", "You hit [src] with [I]!") linked_guardian.apply_damage(I.force, I.damtype) diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 1379ec4abfec9..8e05021c240ce 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -220,7 +220,7 @@ #define MORPH_ATTACKED if((. = ..()) && morphed) mimic_spell.restore_form(src) -/mob/living/simple_animal/hostile/morph/attackby(obj/item/O, mob/living/user) +/mob/living/simple_animal/hostile/morph/attackby__legacy__attackchain(obj/item/O, mob/living/user) if(user.a_intent == INTENT_HELP && ambush_prepared) to_chat(user, "You try to use [O] on [src]... it seems different than no-") ambush_attack(user, TRUE) diff --git a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm index 6a768f9d6bacc..c8ef3b159adbc 100644 --- a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm +++ b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon.dm @@ -745,7 +745,7 @@ visible_message("[M] [response_harm] [src].") try_attack_mob(M) -/mob/living/simple_animal/demon/pulse_demon/attackby(obj/item/O, mob/living/user) +/mob/living/simple_animal/demon/pulse_demon/attackby__legacy__attackchain(obj/item/O, mob/living/user) if(is_under_tile()) to_chat(user, "You can't interact with something that's under the floor!") return @@ -821,7 +821,7 @@ . = ..() set_light(13, 2, "#bbbb00") -/obj/item/organ/internal/heart/demon/pulse/attack_self(mob/living/user) +/obj/item/organ/internal/heart/demon/pulse/attack_self__legacy__attackchain(mob/living/user) . = ..() user.drop_item() insert(user) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 1bf8400c4142c..3719b54a9881f 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -228,7 +228,7 @@ ghostize() qdel(src) -/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params) +/mob/living/simple_animal/revenant/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/nullrod)) visible_message("[src] violently flinches!", \ "As \the [W] passes through you, you feel your essence draining away!") diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index b170895fd6f36..0a167ec7724c4 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -378,12 +378,12 @@ possessed_object.escape_chance = 100 // We cannot be contained ADD_TRAIT(possessed_object, TRAIT_DODGE_ALL_OBJECTS, "Revenant") - addtimer(CALLBACK(src, PROC_REF(attack), possessed_object, user), 1 SECONDS, TIMER_UNIQUE) // Short warm-up for floaty ambience - attack_timers.Add(addtimer(CALLBACK(src, PROC_REF(attack), possessed_object, user), 4 SECONDS, TIMER_UNIQUE|TIMER_LOOP|TIMER_STOPPABLE)) // 5 second looping attacks + addtimer(CALLBACK(src, PROC_REF(attack__legacy__attackchain), possessed_object, user), 1 SECONDS, TIMER_UNIQUE) // Short warm-up for floaty ambience + attack_timers.Add(addtimer(CALLBACK(src, PROC_REF(attack__legacy__attackchain), possessed_object, user), 4 SECONDS, TIMER_UNIQUE|TIMER_LOOP|TIMER_STOPPABLE)) // 5 second looping attacks addtimer(CALLBACK(possessed_object, TYPE_PROC_REF(/mob/living/simple_animal/possessed_object, death)), 70 SECONDS, TIMER_UNIQUE) // De-haunt the object /// Handles finding a valid target and throwing us at it -/datum/spell/aoe/revenant/haunt_object/proc/attack(mob/living/simple_animal/possessed_object/possessed_object, mob/living/simple_animal/revenant/user) +/datum/spell/aoe/revenant/haunt_object/proc/attack__legacy__attackchain(mob/living/simple_animal/possessed_object/possessed_object, mob/living/simple_animal/revenant/user) var/list/potential_victims = list() for(var/turf/turf_to_search in spiral_range_turfs(aoe_range, get_turf(possessed_object))) for(var/mob/living/carbon/potential_victim in turf_to_search) diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 59906b7316587..e0ce8b2b03864 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -16,7 +16,7 @@ var/declaring_war = FALSE var/total_tc = 0 //Total amount of telecrystals shared between nuke ops -/obj/item/nuclear_challenge/attack_self(mob/living/user) +/obj/item/nuclear_challenge/attack_self__legacy__attackchain(mob/living/user) if(!check_allowed(user)) return diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 39456a29c8cc4..62423bd03a4c2 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -168,7 +168,7 @@ GLOBAL_VAR(bomb_set) if(NUKE_CORE_FULLY_EXPOSED) . += core ? "nukecore3" : "nukecore4" -/obj/machinery/nuclearbomb/attackby(obj/item/O as obj, mob/user as mob, params) +/obj/machinery/nuclearbomb/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/disk/nuclear)) if(extended) if(auth) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index a8106a2d21076..c316b9a78cd66 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -55,7 +55,7 @@ else if(mode == MODE_NUKE) workbomb() -/obj/item/pinpointer/attack_self(mob/user) +/obj/item/pinpointer/attack_self__legacy__attackchain(mob/user) if(mode == PINPOINTER_MODE_DET) return cycle(user) @@ -396,7 +396,7 @@ ///Var to track the linked detective gun var/linked_gun_UID -/obj/item/pinpointer/crew/attackby(obj/item/I, mob/living/user) +/obj/item/pinpointer/crew/attackby__legacy__attackchain(obj/item/I, mob/living/user) . = ..() if(istype(I, /obj/item/gun/energy/detective)) link_gun(I.UID()) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index cd7d2b48e911f..d9162487b06fa 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -59,7 +59,7 @@ dust_if_respawnable(C) -/obj/item/contract/attack_self(mob/user as mob) +/obj/item/contract/attack_self__legacy__attackchain(mob/user as mob) if(..()) return @@ -88,7 +88,7 @@ var/activate_descriptor = "reality" var/rend_desc = "You should run now." -/obj/item/veilrender/attack_self(mob/user as mob) +/obj/item/veilrender/attack_self__legacy__attackchain(mob/user as mob) if(charged) new /obj/effect/rend(get_turf(user), spawn_type, spawn_amt, rend_desc) charged = 0 @@ -128,7 +128,7 @@ if(spawn_amt_left <= 0) qdel(src) -/obj/effect/rend/attackby(obj/item/I as obj, mob/user as mob) +/obj/effect/rend/attackby__legacy__attackchain(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/nullrod)) user.visible_message("[user] seals \the [src] with \the [I].") qdel(src) @@ -213,7 +213,7 @@ current_owner.update_sight() current_owner.update_icons() -/obj/item/scrying/attack_self(mob/user as mob) +/obj/item/scrying/attack_self__legacy__attackchain(mob/user as mob) if(in_use) return in_use = TRUE @@ -286,13 +286,13 @@ GLOBAL_LIST_EMPTY(multiverse) GLOB.multiverse.Remove(src) return ..() -/obj/item/multisword/attack(mob/living/M as mob, mob/living/user as mob) //to prevent accidental friendly fire or out and out grief. +/obj/item/multisword/attack__legacy__attackchain(mob/living/M as mob, mob/living/user as mob) //to prevent accidental friendly fire or out and out grief. if(M.real_name == user.real_name) to_chat(user, "[src] detects benevolent energies in your target and redirects your attack!") return ..() -/obj/item/multisword/attack_self(mob/user) +/obj/item/multisword/attack_self__legacy__attackchain(mob/user) if(user.mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE) to_chat(user, "You know better than to touch your teacher's stuff.") return @@ -689,7 +689,7 @@ GLOBAL_LIST_EMPTY(multiverse) if(cooldown_time_left) . += "[src] is being strained by the amount of risen skeletons thralls. It cannot be used to rise another skeleton thrall for [cooldown_time_left / 10] seconds." -/obj/item/necromantic_stone/attack(mob/living/carbon/human/victim, mob/living/carbon/human/necromancer) +/obj/item/necromantic_stone/attack__legacy__attackchain(mob/living/carbon/human/victim, mob/living/carbon/human/necromancer) if(!istype(victim) || !istype(necromancer)) return ..() @@ -855,7 +855,7 @@ GLOBAL_LIST_EMPTY(multiverse) desc = "An enchanted mug which can be filled with any of various liquids on command." icon_state = "evermug" -/obj/item/reagent_containers/drinks/everfull/attack_self(mob/user) +/obj/item/reagent_containers/drinks/everfull/attack_self__legacy__attackchain(mob/user) var/static/list/options = list("Omnizine" = image(icon = 'icons/obj/storage.dmi', icon_state = "firstaid"), "Ale" = image(icon = 'icons/obj/drinks.dmi', icon_state = "alebottle"), "Wine" = image(icon = 'icons/obj/drinks.dmi', icon_state = "wineglass"), diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index 592de13f2b91e..7481db80dc9e9 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -29,7 +29,7 @@ /obj/item/melee/touch_attack/customised_abstract_text(mob/living/carbon/owner) return "[owner.p_their(TRUE)] [owner.l_hand == src ? "left hand" : "right hand"] is burning in magic fire." -/obj/item/melee/touch_attack/attack(mob/target, mob/living/carbon/user) +/obj/item/melee/touch_attack/attack__legacy__attackchain(mob/target, mob/living/carbon/user) if(!iscarbon(user)) //Look ma, no hands return if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) @@ -37,7 +37,7 @@ return ..() -/obj/item/melee/touch_attack/afterattack(atom/target, mob/user, proximity) +/obj/item/melee/touch_attack/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(catchphrase) user.say(catchphrase) playsound(get_turf(user), on_use_sound, 50, 1) @@ -53,7 +53,7 @@ icon_state = "disintegrate" item_state = "disintegrate" -/obj/item/melee/touch_attack/disintegrate/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/touch_attack/disintegrate/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(!proximity || target == user || !ismob(target) || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) //exploding after touching yourself would be bad return var/mob/M = target @@ -69,7 +69,7 @@ icon_state = "fleshtostone" item_state = "fleshtostone" -/obj/item/melee/touch_attack/fleshtostone/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/touch_attack/fleshtostone/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(!proximity || target == user || !isliving(target) || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) //getting hard after touching yourself would also be bad return var/mob/living/L = target @@ -86,7 +86,7 @@ item_state = "disintegrate" needs_permit = FALSE -/obj/item/melee/touch_attack/fake_disintegrate/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/touch_attack/fake_disintegrate/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(!proximity || target == user || !ismob(target) || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) //not exploding after touching yourself would be bad return do_sparks(4, 0, target.loc) @@ -101,7 +101,7 @@ icon_state = "cluwnecurse" item_state = "cluwnecurse" -/obj/item/melee/touch_attack/cluwne/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/melee/touch_attack/cluwne/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) if(!proximity || target == user || !ishuman(target) || !iscarbon(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) //clowning around after touching yourself would unsurprisingly, be bad return diff --git a/code/game/gamemodes/wizard/magic_tarot.dm b/code/game/gamemodes/wizard/magic_tarot.dm index 9eed402337ce6..5f7eed073e965 100644 --- a/code/game/gamemodes/wizard/magic_tarot.dm +++ b/code/game/gamemodes/wizard/magic_tarot.dm @@ -16,7 +16,7 @@ maximum_cards = 5 our_card_cooldown_time = 12 SECONDS // A minute for a full hand of 5 cards -/obj/item/tarot_generator/attack_self(mob/user) +/obj/item/tarot_generator/attack_self__legacy__attackchain(mob/user) if(!COOLDOWN_FINISHED(src, card_cooldown)) to_chat(user, "[src]'s magic is still recovering from the last card, wait [round(COOLDOWN_TIMELEFT(src, card_cooldown) / 10)] more second\s!") return @@ -50,7 +50,7 @@ ///How many cards in a pack. 3 in base, 5 in jumbo, 7 in mega var/cards = 3 -/obj/item/tarot_card_pack/attack_self(mob/user) +/obj/item/tarot_card_pack/attack_self__legacy__attackchain(mob/user) user.visible_message("[user] tears open [src].", \ "You tear open [src]!") playsound(loc, 'sound/items/poster_ripped.ogg', 50, TRUE) @@ -92,7 +92,7 @@ else . += "We have the Ink... Could you provide your Vision instead?" -/obj/item/blank_tarot_card/attack_self(mob/user) +/obj/item/blank_tarot_card/attack_self__legacy__attackchain(mob/user) if(!ishuman(user)) return if(!let_people_choose) @@ -181,7 +181,7 @@ if(!face_down) . += "[src] [our_tarot.extended_desc]" -/obj/item/magic_tarot_card/attack_self(mob/user) +/obj/item/magic_tarot_card/attack_self__legacy__attackchain(mob/user) poof() if(has_been_activated) return diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 7e3c863c14817..3d45da2bab258 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -87,7 +87,7 @@ animate(offset = 0, time = 10 SECONDS) //////////////////////////////Capturing//////////////////////////////////////////////////////// -/obj/item/soulstone/attack(mob/living/carbon/human/M, mob/living/user) +/obj/item/soulstone/attack__legacy__attackchain(mob/living/carbon/human/M, mob/living/user) if(M == user) return @@ -169,7 +169,7 @@ transfer_soul("VICTIM", M, user) return -/obj/item/soulstone/attackby(obj/item/O, mob/user) +/obj/item/soulstone/attackby__legacy__attackchain(obj/item/O, mob/user) if(istype(O, /obj/item/storage/bible) && !IS_CULTIST(user) && HAS_MIND_TRAIT(user, TRAIT_HOLY)) if(purified) return @@ -221,7 +221,7 @@ else ..() -/obj/item/soulstone/attack_self(mob/living/user) +/obj/item/soulstone/attack_self__legacy__attackchain(mob/living/user) var/mob/living/simple_animal/shade/S = locate(/mob/living/simple_animal/shade) in contents if(!in_range(src, user) || !S) return @@ -287,7 +287,7 @@ . += "A Wraith, which does high damage and can jaunt through walls, though it is quite fragile." . += "A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow." -/obj/structure/constructshell/attackby(obj/item/I, mob/living/user, params) +/obj/structure/constructshell/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/soulstone)) var/obj/item/soulstone/SS = I if(!SS.can_use(user)) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 4df54ff12eef7..60b8ac422dd8b 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -734,7 +734,7 @@ ..() initialize() -/obj/item/spellbook/attackby(obj/item/O as obj, mob/user as mob, params) +/obj/item/spellbook/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/contract)) var/obj/item/contract/contract = O if(contract.used) @@ -850,7 +850,7 @@ dat += {"[content]"} return dat -/obj/item/spellbook/attack_self(mob/user as mob) +/obj/item/spellbook/attack_self__legacy__attackchain(mob/user as mob) if(!owner) to_chat(user, "You bind the spellbook to yourself.") owner = user @@ -953,7 +953,7 @@ tab = loadout_categories[1] else if(href_list["page"]) tab = sanitize(href_list["page"]) - attack_self(H) + attack_self__legacy__attackchain(H) return 1 //Single Use Spellbooks @@ -972,7 +972,7 @@ /obj/item/spellbook/oneuse/initialize() //No need to init return -/obj/item/spellbook/oneuse/attack_self(mob/user) +/obj/item/spellbook/oneuse/attack_self__legacy__attackchain(mob/user) var/datum/spell/S = new spell for(var/datum/spell/knownspell in user.mind.spell_list) if(knownspell.type == S.type) @@ -998,7 +998,7 @@ used = TRUE user.visible_message("[src] glows dark for a second!") -/obj/item/spellbook/oneuse/attackby() +/obj/item/spellbook/oneuse/attackby__legacy__attackchain() return /obj/item/spellbook/oneuse/fireball diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 5e5edfdcefb3e..b2dfdb8679ccd 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -71,7 +71,7 @@ storedpda = null update_icon() -/obj/machinery/pdapainter/attackby(obj/item/I, mob/user, params) +/obj/machinery/pdapainter/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(default_unfasten_wrench(user, I)) power_change() return diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index f43731f4d041d..2028a84ea9961 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -300,7 +300,7 @@ return FALSE add_fingerprint(usr) -/obj/machinery/sleeper/attackby(obj/item/I, mob/user, params) +/obj/machinery/sleeper/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/glass) && user.a_intent != INTENT_HARM) if(!beaker) if(!user.drop_item()) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index b8e25d463c863..ab53feea9596e 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -64,7 +64,7 @@ else icon_state = "bodyscanner-open" -/obj/machinery/bodyscanner/attackby(obj/item/I, mob/user) +/obj/machinery/bodyscanner/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/grab)) var/obj/item/grab/TYPECAST_YOUR_SHIT = I if(panel_open) diff --git a/code/game/machinery/airlock_control/airlock_button.dm b/code/game/machinery/airlock_control/airlock_button.dm index a4821d5269bca..a4f9ed2c77e7b 100644 --- a/code/game/machinery/airlock_control/airlock_button.dm +++ b/code/game/machinery/airlock_control/airlock_button.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(all_airlock_access_buttons) else icon_state = "access_button_off" -/obj/machinery/access_button/attackby(obj/item/I, mob/user, params) +/obj/machinery/access_button/attackby__legacy__attackchain(obj/item/I, mob/user, params) //Swiping ID on the access button if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) attack_hand(user) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 94a342c7c0f8e..a5c08d677de46 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -50,7 +50,7 @@ component_parts += new /obj/item/stack/sheet/glass(null) RefreshParts() - RegisterSignal(src, COMSIG_TOOL_ATTACK, PROC_REF(on_tool_attack)) + RegisterSignal(src, COMSIG_ATTACK_BY, PROC_REF(on_attack_by)) wires = new(src) files = new /datum/research/autolathe(src) @@ -79,14 +79,15 @@ materials.retrieve_all() return ..() -/obj/machinery/autolathe/proc/on_tool_attack(datum/source, atom/tool, mob/user) - SIGNAL_HANDLER - var/obj/item/I = tool - if(!istype(I)) +/obj/machinery/autolathe/proc/on_attack_by(datum/source, obj/item/attacking, mob/user) + SIGNAL_HANDLER // COMSIG_ATTACK_BY + + if(!istype(attacking)) return + // Allows screwdrivers to be recycled on harm intent - if(I.tool_behaviour == TOOL_SCREWDRIVER && user.a_intent == INTENT_HARM) - return COMPONENT_CANCEL_TOOLACT + if(attacking.tool_behaviour == TOOL_SCREWDRIVER && user.a_intent == INTENT_HARM) + return COMPONENT_SKIP_AFTERATTACK /obj/machinery/autolathe/interact(mob/user) if(shocked && !(stat & NOPOWER)) @@ -262,7 +263,7 @@ data["queue"] = null return data -/obj/machinery/autolathe/attackby(obj/item/O, mob/user, params) +/obj/machinery/autolathe/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(busy) to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.") return TRUE diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index ccfe7b5ee88f1..24bd6f3a7c024 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -130,7 +130,7 @@ toggle_cam(null, 0) ..() -/obj/machinery/camera/attackby(obj/item/I, mob/living/user, params) +/obj/machinery/camera/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) var/msg = "You attach [I] into the assembly inner circuits." var/msg2 = "The camera already has that upgrade!" diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 0844f892ac640..9bdd6811c3639 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -36,7 +36,7 @@ . += "The camera assembly is wired, but the maintenence panel needs to be screwed shut." . += "Upgrades can be added to the camera assembly, and removed with a crowbar." -/obj/item/camera_assembly/attackby(obj/item/I, mob/living/user, params) +/obj/item/camera_assembly/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(state == ASSEMBLY_WELDED && iscoil(I)) var/obj/item/stack/cable_coil/C = I if(C.use(2)) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 6904c345779a9..3b1f8c9084380 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -60,7 +60,7 @@ if(charging) . += "Current charge: [round(charging.percent(), 1)]%" -/obj/machinery/cell_charger/attackby(obj/item/I, mob/user, params) +/obj/machinery/cell_charger/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/stock_parts/cell) && !panel_open) if(stat & BROKEN) to_chat(user, "[src] is broken!") diff --git a/code/game/machinery/clonepod.dm b/code/game/machinery/clonepod.dm index 9dbbc05c98405..de0a0af13a8b2 100644 --- a/code/game/machinery/clonepod.dm +++ b/code/game/machinery/clonepod.dm @@ -561,7 +561,7 @@ return FALSE //Attackby and x_acts -/obj/machinery/clonepod/attackby(obj/item/I, mob/user, params) +/obj/machinery/clonepod/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.is_open_container()) return diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 3033aa18da7fb..42175880711cd 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -43,7 +43,7 @@ /obj/machinery/computer/holodeck_control/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/computer/holodeck_control/attackby(obj/item/D, mob/user) +/obj/machinery/computer/holodeck_control/attackby__legacy__attackchain(obj/item/D, mob/user) return /obj/machinery/computer/holodeck_control/attack_ghost(mob/user) @@ -265,7 +265,7 @@ pixel_y = -9 layer = ABOVE_OPEN_TURF_LAYER -/turf/simulated/floor/holofloor/attackby(obj/item/W as obj, mob/user as mob, params) +/turf/simulated/floor/holofloor/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) return // HOLOFLOOR DOES NOT GIVE A FUCK @@ -396,7 +396,7 @@ ..() item_color = pick("red","blue","green","purple") -/obj/item/holo/esword/attack_self(mob/living/user as mob) +/obj/item/holo/esword/attack_self__legacy__attackchain(mob/living/user as mob) active = !active if(active) force = 30 @@ -437,7 +437,7 @@ to_chat(user, "The station AI is not to interact with these devices.") return -/obj/machinery/readybutton/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/machinery/readybutton/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) to_chat(user, "The device is a solid button, there's nothing you can do with it!") /obj/machinery/readybutton/attack_hand(mob/user) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 039962f2145e3..1378b797a8af4 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -16,7 +16,7 @@ QDEL_NULL(brain) return ..() -/obj/structure/ai_core/attackby(obj/item/P, mob/user, params) +/obj/structure/ai_core/attackby__legacy__attackchain(obj/item/P, mob/user, params) switch(state) if(EMPTY_CORE) if(istype(P, /obj/item/circuitboard/aicore)) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 25e4a9d8b6dbc..76fa090b1e1c6 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -992,7 +992,7 @@ else . += "There's a little switch on the bottom. It's flipped up." -/obj/item/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse +/obj/item/orion_ship/attack_self__legacy__attackchain(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse if(active) return diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index e54c72ea263b1..f8a16c6f5cf87 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -529,7 +529,7 @@ contraband_enabled = !contraband_enabled playsound(src, 'sound/effects/pop.ogg', 50) -/obj/item/circuitboard/rdconsole/attackby(obj/item/I, mob/user, params) +/obj/item/circuitboard/rdconsole/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) if(allowed(user)) user.visible_message("[user] waves [user.p_their()] ID past [src]'s access protocol scanner.", "You swipe your ID past [src]'s access protocol scanner.") @@ -698,7 +698,7 @@ I.play_tool_sound(src) update_icon() -/obj/structure/computerframe/attackby(obj/item/I, mob/user, params) +/obj/structure/computerframe/attackby__legacy__attackchain(obj/item/I, mob/user, params) switch(state) if(STATE_EMPTY) if(!istype(I, /obj/item/circuitboard)) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 0f3b2aee844f0..67247f5aa4759 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -151,7 +151,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) else to_chat(user, "There is nothing to remove from the console.") -/obj/machinery/computer/card/attackby(obj/item/card/id/id_card, mob/user, params) +/obj/machinery/computer/card/attackby__legacy__attackchain(obj/item/card/id/id_card, mob/user, params) if(!istype(id_card)) return ..() diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 063db8a2a9f5b..c858e7668e523 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -47,7 +47,7 @@ P.console = null return ..() -/obj/machinery/computer/cloning/attackby(obj/item/I, mob/user, params) +/obj/machinery/computer/cloning/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!ismultitool(I)) return ..() diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 75817f02ee6b2..b21fa7102b0b8 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -28,7 +28,7 @@ circuit = /obj/item/circuitboard/aiupload_broken return TRUE -/obj/machinery/computer/aiupload/attackby(obj/item/O, mob/user, params) +/obj/machinery/computer/aiupload/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(!istype(O, /obj/item/ai_module)) return ..() if(!check_valid_selection(user)) @@ -127,7 +127,7 @@ circuit = /obj/item/circuitboard/borgupload var/mob/living/silicon/robot/current = null -/obj/machinery/computer/borgupload/attackby(obj/item/ai_module/module, mob/user, params) +/obj/machinery/computer/borgupload/attackby__legacy__attackchain(obj/item/ai_module/module, mob/user, params) if(istype(module, /obj/item/ai_module)) if(!current)//no borg selected to_chat(user, "No borg selected. Please chose a target before proceeding with upload.") diff --git a/code/game/machinery/computer/medical_records.dm b/code/game/machinery/computer/medical_records.dm index e3772b0a7910e..377765d49950d 100644 --- a/code/game/machinery/computer/medical_records.dm +++ b/code/game/machinery/computer/medical_records.dm @@ -63,7 +63,7 @@ active2 = null return ..() -/obj/machinery/computer/med_data/attackby(obj/item/O, mob/user, params) +/obj/machinery/computer/med_data/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(ui_login_attackby(O, user)) return return ..() diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index e5f1aeaed1d03..5df576b11705d 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -21,7 +21,7 @@ GLOB.prisoncomputer_list -= src return ..() -/obj/machinery/computer/prisoner/attackby(obj/item/O, mob/user, params) +/obj/machinery/computer/prisoner/attackby__legacy__attackchain(obj/item/O, mob/user, params) var/datum/ui_login/state = ui_login_get() if(state.logged_in) var/obj/item/card/id/prisoner/I = O diff --git a/code/game/machinery/computer/security_records.dm b/code/game/machinery/computer/security_records.dm index c983a2212194e..bbcb1ad3a71c7 100644 --- a/code/game/machinery/computer/security_records.dm +++ b/code/game/machinery/computer/security_records.dm @@ -57,7 +57,7 @@ record_security = null return ..() -/obj/machinery/computer/secure_data/attackby(obj/item/O, mob/user, params) +/obj/machinery/computer/secure_data/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(ui_login_attackby(O, user)) return return ..() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 9d6613c0c5513..22d9025dc691e 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -451,7 +451,7 @@ name = initial(name) -/obj/machinery/cryopod/attackby(obj/item/I, mob/user, params) +/obj/machinery/cryopod/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/grab)) var/obj/item/grab/G = I diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm index 96a244da0abef..ea7e911c2f39f 100644 --- a/code/game/machinery/defib_mount.dm +++ b/code/game/machinery/defib_mount.dm @@ -85,7 +85,7 @@ defib.paddles_on_defib = FALSE user.put_in_hands(defib.paddles) -/obj/machinery/defibrillator_mount/attackby(obj/item/I, mob/living/user, params) +/obj/machinery/defibrillator_mount/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/defibrillator)) if(defib) to_chat(user, "There's already a defibrillator in [src]!") diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index ad88ec4a177cb..057eeaa7ce90d 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -94,7 +94,7 @@ stacktype = /obj/item/stack/sheet/wood -/obj/structure/barricade/wooden/attackby(obj/item/I, mob/user) +/obj/structure/barricade/wooden/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I,/obj/item/stack/sheet/wood)) var/obj/item/stack/sheet/wood/W = I if(W.get_amount() < 5) @@ -313,7 +313,7 @@ to_chat(user, "[src] is now in [mode == AUTO ? mode : dir2text(mode)] mode.") -/obj/item/grenade/barrier/dropwall/attack_self(mob/user) +/obj/item/grenade/barrier/dropwall/attack_self__legacy__attackchain(mob/user) . = ..() armer = user @@ -376,7 +376,7 @@ connected_shields += new barricade_type(target_turf2, src, FALSE, direction, dir_right) -/obj/structure/dropwall_generator/attacked_by(obj/item/I, mob/living/user) //No, you can not just go up to the generator and whack it. Central shield needs to go down first. +/obj/structure/dropwall_generator/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) //No, you can not just go up to the generator and whack it. Central shield needs to go down first. if(protected) visible_message("[src]'s shield absorbs the blow!") core_shield.take_damage(I.force, I.damtype, MELEE, TRUE) @@ -466,7 +466,7 @@ item_state = "flashbang" var/owner_uid -/obj/item/grenade/turret/attack_self(mob/user) +/obj/item/grenade/turret/attack_self__legacy__attackchain(mob/user) owner_uid = user.UID() return ..() diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index f09c7b56e698f..427dc4585a6c5 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -35,7 +35,7 @@ else to_chat(user, "Error, no route to host.") -/obj/machinery/door_control/attackby(obj/item/W, mob/user as mob, params) +/obj/machinery/door_control/attackby__legacy__attackchain(obj/item/W, mob/user as mob, params) if(istype(W, /obj/item/detective_scanner)) return return ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 06d2270ef8a50..a00ac74e8d223 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -971,7 +971,7 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) else to_chat(user, "The door is now in fast mode.") -/obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params) +/obj/machinery/door/airlock/attackby__legacy__attackchain(obj/item/C, mob/user, params) add_fingerprint(user) if(!headbutt_shock_check(user)) return diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 3b9da5c1be534..1cac4728de0dc 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -29,9 +29,9 @@ "name" = get_access_desc(access), "id" = access)) -/obj/item/airlock_electronics/attack_self(mob/user) - if(!ishuman(user) && !isrobot(user)) - return ..() +/obj/item/airlock_electronics/activate_self(mob/user) + if(..() || (!ishuman(user) && !isrobot(user))) + return if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -108,7 +108,7 @@ name = "burned-out airlock electronics" icon_state = "door_electronics_smoked" -/obj/item/airlock_electronics/destroyed/attack_self(mob/user) +/obj/item/airlock_electronics/destroyed/attack_self__legacy__attackchain(mob/user) return /obj/item/airlock_electronics/destroyed/decompile_act(obj/item/matter_decompiler/C, mob/user) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index f27d0283bb92b..81bbc3a57818e 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -200,7 +200,7 @@ DA.update_appearance(UPDATE_NAME|UPDATE_ICON) qdel(src) -/obj/machinery/door/airlock/plasma/attackby(obj/item/C, mob/user, params) +/obj/machinery/door/airlock/plasma/attackby__legacy__attackchain(obj/item/C, mob/user, params) if(C.get_heat() > 300) message_admins("Plasma airlock ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)") log_game("Plasma airlock ignited by [key_name(user)] in ([x],[y],[z])") @@ -447,7 +447,7 @@ else lock(TRUE) -/obj/machinery/door/airlock/highsecurity/red/attackby(obj/C, mob/user, params) +/obj/machinery/door/airlock/highsecurity/red/attackby__legacy__attackchain(obj/C, mob/user, params) if(!issilicon(user)) if(isElectrified()) if(shock(user, 75)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2b7553f0f8698..7307e20e5d2fe 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -256,7 +256,7 @@ /obj/machinery/door/proc/try_to_crowbar(mob/user, obj/item/I) return -/obj/machinery/door/attackby(obj/item/I, mob/user, params) +/obj/machinery/door/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(HAS_TRAIT(src, TRAIT_CMAGGED) && I.can_clean()) //If the cmagged door is being hit with cleaning supplies, don't open it, it's being cleaned! return diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 604cd02766fc7..efc341602041e 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -124,7 +124,7 @@ "You open [src].") open(auto_close = FALSE) -/obj/machinery/door/firedoor/attackby(obj/item/C, mob/user, params) +/obj/machinery/door/firedoor/attackby__legacy__attackchain(obj/item/C, mob/user, params) add_fingerprint(user) if(operating) @@ -387,7 +387,7 @@ /obj/structure/firelock_frame/update_icon_state() icon_state = "frame[constructionStep]" -/obj/structure/firelock_frame/attackby(obj/item/C, mob/user) +/obj/structure/firelock_frame/attackby__legacy__attackchain(obj/item/C, mob/user) switch(constructionStep) if(CONSTRUCTION_PANEL_OPEN) if(istype(C, /obj/item/stack/sheet/plasteel)) diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm index c2330d3633ad7..49a6343e8ee1f 100644 --- a/code/game/machinery/doors/unpowered.dm +++ b/code/game/machinery/doors/unpowered.dm @@ -6,7 +6,7 @@ return ..() -/obj/machinery/door/unpowered/attackby(obj/item/I, mob/user, params) +/obj/machinery/door/unpowered/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(locked) return else diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index ec1a666d415f2..c0f7bac9d8f03 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -304,7 +304,7 @@ operating = NONE return TRUE -/obj/machinery/door/window/attackby(obj/item/I, mob/living/user, params) +/obj/machinery/door/window/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) //If it's in the process of opening/closing, ignore the click if(operating) return diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index f98f27756622c..3c3c9998ee99a 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -35,7 +35,7 @@ UnregisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION) return ..() -/obj/machinery/doppler_array/attackby(obj/item/I, mob/user, params) +/obj/machinery/doppler_array/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/disk/tech_disk)) var/obj/item/disk/tech_disk/disk = I disk.load_tech(toxins_tech) diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm index a1207bac1c759..32891a83821d5 100644 --- a/code/game/machinery/dye_generator.dm +++ b/code/game/machinery/dye_generator.dm @@ -50,7 +50,7 @@ dye_color = temp set_light(2, l_color = temp) -/obj/machinery/dye_generator/attackby(obj/item/I, mob/user, params) +/obj/machinery/dye_generator/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(default_unfasten_wrench(user, I, time = 60)) return @@ -92,7 +92,7 @@ I.color = dye_color . += I -/obj/item/hair_dye_bottle/attack(mob/living/carbon/M, mob/user) +/obj/item/hair_dye_bottle/attack__legacy__attackchain(mob/living/carbon/M, mob/user) if(user.a_intent != INTENT_HELP) ..() return diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 27e34b3a3903f..e943b88119ed4 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -125,7 +125,7 @@ FIRE ALARM alarm(rand(30/severity, 60/severity)) ..() -/obj/machinery/firealarm/attackby(obj/item/I, mob/user, params) +/obj/machinery/firealarm/attackby__legacy__attackchain(obj/item/I, mob/user, params) add_fingerprint(user) if(wiresexposed) if(buildstage == FIRE_ALARM_UNWIRED) diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index e0c6d035b556a..122dc3f8a6252 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -90,7 +90,7 @@ set_light(brightness_on) update_icon(UPDATE_ICON_STATE) -/obj/machinery/floodlight/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/machinery/floodlight/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/stock_parts/cell)) if(open) if(cell) diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm index 45bf5a158a761..52f90c600d64c 100644 --- a/code/game/machinery/guestpass.dm +++ b/code/game/machinery/guestpass.dm @@ -60,7 +60,7 @@ . = ..() my_terminal_id = ++global_terminal_id -/obj/machinery/computer/guestpass/attackby(obj/item/I, mob/user, params) +/obj/machinery/computer/guestpass/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id)) if(!scan) if(user.drop_item()) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 431e78e175a53..de84be7ef08cb 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -50,7 +50,7 @@ if(!bag) to_chat(user, "There's no IV bag connected to [src]!") return - bag.afterattack(target, usr, TRUE) + bag.afterattack__legacy__attackchain(target, usr, TRUE) START_PROCESSING(SSmachines, src) /obj/machinery/iv_drip/attack_hand(mob/user) @@ -60,7 +60,7 @@ bag = null update_icon(UPDATE_OVERLAYS) -/obj/machinery/iv_drip/attackby(obj/item/I, mob/user, params) +/obj/machinery/iv_drip/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/iv_bag)) if(bag) to_chat(user, "[src] already has an IV bag!") @@ -74,8 +74,8 @@ update_icon(UPDATE_OVERLAYS) START_PROCESSING(SSmachines, src) else if(bag && istype(I, /obj/item/reagent_containers)) - bag.attackby(I) - I.afterattack(bag, usr, TRUE) + bag.attackby__legacy__attackchain(I) + I.afterattack__legacy__attackchain(bag, usr, TRUE) update_icon(UPDATE_OVERLAYS) else return ..() diff --git a/code/game/machinery/machine_frame.dm b/code/game/machinery/machine_frame.dm index 7c2d80469a574..b5033498d1158 100644 --- a/code/game/machinery/machine_frame.dm +++ b/code/game/machinery/machine_frame.dm @@ -90,7 +90,7 @@ else icon_state = "box_0" -/obj/structure/machine_frame/attackby(obj/item/P, mob/user, params) +/obj/structure/machine_frame/attackby__legacy__attackchain(obj/item/P, mob/living/user, params) switch(state) if(MACHINE_FRAME_EMPTY) if(istype(P, /obj/item/stack/cable_coil)) @@ -788,7 +788,7 @@ to destroy them and players will be able to make replacements. . += "Its suction function is [suction ? "enabled" : "disabled"]. Use it in-hand to switch." . += "Its disposal auto-transmit function is [transmit ? "enabled" : "disabled"]. Alt-click it to switch." -/obj/item/circuitboard/dish_drive/attack_self(mob/living/user) +/obj/item/circuitboard/dish_drive/attack_self__legacy__attackchain(mob/living/user) suction = !suction to_chat(user, "You [suction ? "enable" : "disable"] the board's suction function.") @@ -944,7 +944,7 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/matter_bin = 1) var/target -/obj/item/circuitboard/teleporter_perma/attackby(obj/item/I, mob/living/user, params) +/obj/item/circuitboard/teleporter_perma/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/gps)) var/obj/item/gps/L = I if(L.locked_location) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index b325cf00d0fac..00fc7a172ce92 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -354,7 +354,7 @@ reregister_machine() power_change() -/obj/machinery/attackby(obj/item/O, mob/user, params) +/obj/machinery/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(exchange_parts(user, O)) return diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 377050f7902db..c14d22c3cad9e 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -83,7 +83,7 @@ anchored = FALSE var/build = 0 -/obj/machinery/mass_driver_frame/attackby(obj/item/W as obj, mob/user as mob) +/obj/machinery/mass_driver_frame/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob) switch(build) if(0) // Loose frame if(iswrench(W)) diff --git a/code/game/machinery/merch_vendor.dm b/code/game/machinery/merch_vendor.dm index a96878428da83..17333ba48f366 100644 --- a/code/game/machinery/merch_vendor.dm +++ b/code/game/machinery/merch_vendor.dm @@ -34,7 +34,7 @@ var/pp = replacetext(replacetext("[merch.typepath]", "/obj/item/", ""), "/", "-") imagelist[pp] = "[icon2base64(icon(initial(I.icon), initial(I.icon_state), SOUTH, 1))]" -/obj/machinery/economy/merch/attackby(obj/item/I, mob/user) +/obj/machinery/economy/merch/attackby__legacy__attackchain(obj/item/I, mob/user) if(isspacecash(I)) insert_cash(I, user) return TRUE diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index f8d8a0561953e..5568b941a78fa 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -82,7 +82,7 @@ icon_state = "navbeacon[open][invisibility ? "-f" : ""]" // if invisible, set icon to faded version // in case revealed by T-scanner -/obj/machinery/navbeacon/attackby(obj/item/I, mob/user, params) +/obj/machinery/navbeacon/attackby__legacy__attackchain(obj/item/I, mob/user, params) var/turf/T = loc if(T.intact) return // prevent intraction when T-scanner revealed diff --git a/code/game/machinery/pipe/pipe_construction.dm b/code/game/machinery/pipe/pipe_construction.dm index 9f43313f67794..9d549b50a6c51 100644 --- a/code/game/machinery/pipe/pipe_construction.dm +++ b/code/game/machinery/pipe/pipe_construction.dm @@ -336,7 +336,7 @@ else if(pipe_type in list(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W)) dir = 2 -/obj/item/pipe/attack_self(mob/user as mob) +/obj/item/pipe/attack_self__legacy__attackchain(mob/user as mob) return rotate() /obj/item/pipe/wrench_act(mob/user, obj/item/I) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 20abc3eaf8145..77fec4620b94f 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -393,7 +393,7 @@ GLOBAL_LIST_EMPTY(turret_icons) to_chat(user, "You remove the turret but did not manage to salvage anything.") qdel(src) // qdel -/obj/machinery/porta_turret/attackby(obj/item/I, mob/user) +/obj/machinery/porta_turret/attackby__legacy__attackchain(obj/item/I, mob/user) if((stat & BROKEN) && !syndicate) return @@ -874,7 +874,7 @@ GLOBAL_LIST_EMPTY(turret_icons) var/gun_charge = 0 //the gun charge of the gun type installed -/obj/machinery/porta_turret_construct/attackby(obj/item/I, mob/user) +/obj/machinery/porta_turret_construct/attackby__legacy__attackchain(obj/item/I, mob/user) //this is a bit unwieldy but self-explanatory switch(build_step) if(0) //first step diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 27d6fae25cf78..0022fbcf0bc4f 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -30,7 +30,7 @@ for(var/obj/item/stock_parts/capacitor/C in component_parts) recharge_coeff = C.rating -/obj/machinery/recharger/attackby(obj/item/G, mob/user, params) +/obj/machinery/recharger/attackby__legacy__attackchain(obj/item/G, mob/user, params) var/allowed = is_type_in_list(G, allowed_devices) if(!allowed) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index ad2e22fb8c752..4dfa173b2a72f 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -293,7 +293,7 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) silent = !silent -/obj/machinery/requests_console/attackby(obj/item/I, mob/user) +/obj/machinery/requests_console/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/card/id)) if(inoperable(MAINT)) return diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index c38b77c6fb7d6..5f5723b4d2bcf 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -232,7 +232,7 @@ else to_chat(user, "The device must first be secured to the floor.") -/obj/machinery/shieldgen/attackby(obj/item/I as obj, mob/user as mob, params) +/obj/machinery/shieldgen/attackby__legacy__attackchain(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/card/emag)) malfunction = TRUE update_icon(UPDATE_ICON_STATE) @@ -427,7 +427,7 @@ var/list/L = active_shields["[direction]"] L -= SW -/obj/machinery/shieldwallgen/attackby(obj/item/I, mob/user, params) +/obj/machinery/shieldwallgen/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id)||istype(I, /obj/item/pda)) if(allowed(user)) locked = !locked @@ -583,7 +583,7 @@ phaseout() return ..() -/obj/machinery/shieldwall/syndicate/attackby(obj/item/W, mob/user, params) +/obj/machinery/shieldwall/syndicate/attackby__legacy__attackchain(obj/item/W, mob/user, params) phaseout() return ..() diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index d02de4a386309..ac81b6e71d365 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -50,7 +50,7 @@ cell.emp_act(severity) ..(severity) -/obj/machinery/space_heater/attackby(obj/item/I, mob/user, params) +/obj/machinery/space_heater/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/stock_parts/cell)) if(open) if(cell) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 907c897f1dd36..630da09c7843c 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -317,7 +317,7 @@ . += "[base_icon_state]_[occupant ? "body" : "ready"]" -/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params) +/obj/machinery/suit_storage_unit/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(shocked) if(shock(user, 100)) return diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index f6158b34e3630..0324d2e41d272 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -114,7 +114,7 @@ else . = timer_set -/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params) +/obj/machinery/syndicatebomb/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/assembly/signaler)) if(open_panel) wires.Interact(user) @@ -528,7 +528,7 @@ qdel(loc) qdel(src) -/obj/item/bombcore/chemical/attackby(obj/item/I, mob/user, params) +/obj/item/bombcore/chemical/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/glass/beaker) || istype(I, /obj/item/reagent_containers/glass/bottle)) if(length(beakers) < max_beakers) if(!user.drop_item()) @@ -599,7 +599,7 @@ icon_state = "chemcore" var/obj/item/transfer_valve/ttv = null -/obj/item/bombcore/toxins/attackby(obj/item/I, mob/user) +/obj/item/bombcore/toxins/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/transfer_valve)) if(!ttv && !check_attached(I)) if(!user.drop_item()) @@ -655,7 +655,7 @@ var/detonated = 0 var/existant = 0 -/obj/item/syndicatedetonator/attack_self(mob/user) +/obj/item/syndicatedetonator/attack_self__legacy__attackchain(mob/user) if(timer >= world.time) to_chat(user, "Nothing happens.") return diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 8665ecad0fdff..57c8e61d66e77 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -47,7 +47,7 @@ power_station = locate(/obj/machinery/teleport/station, orange(1, src)) return power_station -/obj/machinery/computer/teleporter/attackby(obj/item/I, mob/living/user, params) +/obj/machinery/computer/teleporter/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/gps)) var/obj/item/gps/L = I if(L.locked_location && !(stat & (NOPOWER|BROKEN))) @@ -625,7 +625,7 @@ teleporter_console = null return ..() -/obj/machinery/teleport/station/attackby(obj/item/I, mob/user, params) +/obj/machinery/teleport/station/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(panel_open && istype(I, /obj/item/circuitboard/teleporter_perma)) if(!teleporter_console) to_chat(user, "[src] is not linked to a teleporter console.") diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 1b84d8faef3b0..cbd4bc6bc3f5b 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -313,7 +313,7 @@ domutcheck(H, MUTCHK_FORCED) H.update_mutations() -/obj/machinery/transformer/gene_applier/attackby(obj/item/I, mob/living/user, params) +/obj/machinery/transformer/gene_applier/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/disk/data)) if(locked) to_chat(user, "Access Denied.") diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index c299244991ea6..ea9bf1271819c 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -106,7 +106,7 @@ return FALSE -/obj/machinery/turretid/attackby(obj/item/W, mob/user) +/obj/machinery/turretid/attackby__legacy__attackchain(obj/item/W, mob/user) if(stat & BROKEN) return diff --git a/code/game/machinery/vendors/vending.dm b/code/game/machinery/vendors/vending.dm index 76090845a8f5a..f8f509441d177 100644 --- a/code/game/machinery/vendors/vending.dm +++ b/code/game/machinery/vendors/vending.dm @@ -336,7 +336,7 @@ if(user && (!Adjacent(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))) return COMPONENT_BLOCK_UNTILT -/obj/machinery/economy/vending/attackby(obj/item/I, mob/user, params) +/obj/machinery/economy/vending/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(tilted) if(user.a_intent == INTENT_HELP) to_chat(user, "[src] is tipped over and non-functional! You'll need to right it first.") diff --git a/code/game/machinery/wall_holosign.dm b/code/game/machinery/wall_holosign.dm index 02c5de4cb1ded..a66a4f98a2744 100644 --- a/code/game/machinery/wall_holosign.dm +++ b/code/game/machinery/wall_holosign.dm @@ -49,7 +49,7 @@ /obj/machinery/holosign_switch/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/holosign_switch/attackby(obj/item/W, mob/user as mob, params) +/obj/machinery/holosign_switch/attackby__legacy__attackchain(obj/item/W, mob/user as mob, params) if(istype(W, /obj/item/detective_scanner)) return return ..() diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index b30d3fc114937..61ebcb67676d0 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -84,7 +84,7 @@ toggle_door() -/obj/machinery/washing_machine/attackby(obj/item/W, mob/user, params) +/obj/machinery/washing_machine/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(user.a_intent == INTENT_HARM) return ..() if(default_unfasten_wrench(user, W)) diff --git a/code/game/mecha/equipment/tools/janitor_tools.dm b/code/game/mecha/equipment/tools/janitor_tools.dm index 5980499582d37..62f424914ca32 100644 --- a/code/game/mecha/equipment/tools/janitor_tools.dm +++ b/code/game/mecha/equipment/tools/janitor_tools.dm @@ -71,7 +71,7 @@ current_target_turf.cleaning_act(chassis.occupant, src, mop_speed, "mop", ".", skip_do_after = TRUE) chassis.occupant_message("You mop \the [target].") if(holosign_enabled) - holosign_controller.afterattack(target_turf, chassis.occupant, TRUE) + holosign_controller.afterattack__legacy__attackchain(target_turf, chassis.occupant, TRUE) /obj/item/mecha_parts/mecha_equipment/janitor/mega_mop/post_clean(atom/target, mob/user) var/turf/T = get_turf(target) @@ -109,7 +109,7 @@ if(afilter.get("toggle_holosign")) holosign_enabled = !holosign_enabled if(!holosign_enabled) - holosign_controller.attack_self(chassis.occupant) + holosign_controller.attack_self__legacy__attackchain(chassis.occupant) update_equip_info() return diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index d03fb828be0d6..6f9641454e28a 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -395,7 +395,7 @@ occupant_message("[fuel_name] traces in target minimal! [I] cannot be used as fuel.") return 0 -/obj/item/mecha_parts/mecha_equipment/generator/attackby(weapon,mob/user, params) +/obj/item/mecha_parts/mecha_equipment/generator/attackby__legacy__attackchain(weapon,mob/user, params) load_fuel(weapon) /obj/item/mecha_parts/mecha_equipment/generator/process() diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 2a438536c195d..49e958586f67c 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -503,8 +503,8 @@ chassis.occupant.changeNext_click(equip_cooldown) var/proximate = chassis.Adjacent(target) if(proximate) - target.attackby(internal_crusher, chassis.occupant) - internal_crusher.afterattack(target, chassis.occupant, proximate, null) + target.attackby__legacy__attackchain(internal_crusher, chassis.occupant) + internal_crusher.afterattack__legacy__attackchain(target, chassis.occupant, proximate, null) #undef MECH_RCD_MODE_DECONSTRUCT #undef MECH_RCD_MODE_WALL_OR_FLOOR diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index efcbd0ff3bfa8..9ace87b742295 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -311,7 +311,7 @@ return TRUE // Interaction code -/obj/machinery/mecha_part_fabricator/attackby(obj/item/W, mob/user, params) +/obj/machinery/mecha_part_fabricator/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(default_deconstruction_screwdriver(user, "fab-o", "fab-idle", W)) return diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 898df99b800bf..7590801455ad3 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -711,7 +711,7 @@ ////// MARK: AttackBy ////////////////////// -/obj/mecha/attackby(obj/item/W, mob/user, params) +/obj/mecha/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/mmi)) if(mmi_move_inside(W,user)) to_chat(user, "[src]-MMI interface initialized successfuly") diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index f21c8c9157317..d713a74995a88 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -27,7 +27,7 @@ QDEL_NULL(construct) return ..() -/obj/item/mecha_parts/chassis/attackby(obj/item/W, mob/user, params) +/obj/item/mecha_parts/chassis/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(!construct || !construct.action(W, user)) return ..() @@ -265,7 +265,7 @@ ..() construct = new /datum/construction/mecha/phazon_chassis(src) -/obj/item/mecha_parts/chassis/phazon/attackby(obj/item/I, mob/user, params) +/obj/item/mecha_parts/chassis/phazon/attackby__legacy__attackchain(obj/item/I, mob/user, params) . = ..() if(istype(I, /obj/item/assembly/signaler/anomaly) && !istype(I, /obj/item/assembly/signaler/anomaly/bluespace)) to_chat(user, "The anomaly core socket only accepts bluespace anomaly cores!") diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 0474b8e0f6060..fad65dc1bb658 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -94,7 +94,7 @@ // Else, anomaly core gets deleted by qdel(src). qdel(src) -/obj/effect/anomaly/attackby(obj/item/I, mob/user, params) +/obj/effect/anomaly/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/analyzer)) to_chat(user, "Analyzing... [src]'s unstable field is fluctuating along frequency [format_frequency(aSignal.frequency)], code [aSignal.code].") diff --git a/code/game/objects/effects/decals/Cleanable/tar.dm b/code/game/objects/effects/decals/Cleanable/tar.dm index 3b6092c7a0147..5cc09a4619cf3 100644 --- a/code/game/objects/effects/decals/Cleanable/tar.dm +++ b/code/game/objects/effects/decals/Cleanable/tar.dm @@ -33,7 +33,7 @@ playsound(L, 'sound/effects/attackblob.ogg', 50, TRUE) to_chat(L, "[src] sticks to you!") -/obj/effect/decal/cleanable/tar/attackby(obj/item/welder, mob/living/user, params) +/obj/effect/decal/cleanable/tar/attackby__legacy__attackchain(obj/item/welder, mob/living/user, params) if(!welder.get_heat() || !Adjacent(user)) return playsound(welder, 'sound/items/welder.ogg', 50, TRUE) diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 924c49f6fc474..369f892c511ff 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -103,7 +103,7 @@ if(desc) . += desc -/obj/effect/decal/attackby(obj/item/I, mob/user) +/obj/effect/decal/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/drinks)) scoop(I, user) else if(issimulatedturf(loc)) diff --git a/code/game/objects/effects/meteors.dm b/code/game/objects/effects/meteors.dm index 0c516e6015266..d82db43ca5ff6 100644 --- a/code/game/objects/effects/meteors.dm +++ b/code/game/objects/effects/meteors.dm @@ -159,7 +159,7 @@ GLOBAL_LIST_INIT(meteors_gore, list(/obj/effect/meteor/meaty = 5, /obj/effect/me /obj/effect/meteor/ex_act() return -/obj/effect/meteor/attackby(obj/item/I, mob/user, params) +/obj/effect/meteor/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/pickaxe)) make_debris() qdel(src) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index af4bd5f1e324d..573fe8030f172 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -139,7 +139,7 @@ victim.drop_l_hand() victim.drop_r_hand() victim.put_in_hands(chainsaw) - chainsaw.attack_self(victim) + chainsaw.attack_self__legacy__attackchain(victim) victim.reagents.add_reagent("adminordrazine", 25) victim.flash_screen_color(red_splash, 10) diff --git a/code/game/objects/effects/snowcloud.dm b/code/game/objects/effects/snowcloud.dm index 7446474ea0afd..e4ab02c781b64 100644 --- a/code/game/objects/effects/snowcloud.dm +++ b/code/game/objects/effects/snowcloud.dm @@ -96,7 +96,7 @@ user.put_in_hands(SB) to_chat(user, "You scoop up some snow and make \a [SB]!") -/obj/effect/snow/attackby(obj/item/I, mob/user) +/obj/effect/snow/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/shovel)) var/obj/item/shovel/S = I user.visible_message("[user] is clearing away [src]...", "You begin clearing away [src]...", "You hear a wettish digging sound.") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c1177671c773d..9c49a9e595ba0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -400,7 +400,7 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons // Due to storage type consolidation this should get used more now. // I have cleaned it up a little, but it could probably use more. -Sayu -/obj/item/attackby(obj/item/I, mob/user, params) +/obj/item/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(isstorage(I)) var/obj/item/storage/S = I if(S.use_to_pickup) @@ -593,7 +593,7 @@ GLOBAL_DATUM_INIT(welding_sparks, /mutable_appearance, mutable_appearance('icons // The default action is attack_self(). // Checks before we get to here are: mob is alive, mob is not restrained, paralyzed, asleep, resting, laying, item is on the mob. /obj/item/proc/ui_action_click(mob/user, actiontype) - attack_self(user) + attack_self__legacy__attackchain(user) /obj/item/proc/IsReflect(def_zone) // This proc determines if and at what% an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit return FALSE diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm index 037709e2c00ba..951f3f1098af8 100644 --- a/code/game/objects/items/ashtray.dm +++ b/code/game/objects/items/ashtray.dm @@ -5,7 +5,7 @@ var/icon_full = "" var/material = /obj/item/stack/sheet/metal -/obj/item/ashtray/attackby(obj/item/I, mob/user, params) +/obj/item/ashtray/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/cigbutt) || istype(I, /obj/item/clothing/mask/cigarette) || istype(I, /obj/item/match)) if(length(contents) >= max_butts) to_chat(user, "This ashtray is full.") diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 0b315a200c28a..b9b496eb8a977 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -22,7 +22,7 @@ var/const/ROOM_ERR_TOOLARGE = -2 -/obj/item/areaeditor/attack_self(mob/user as mob) +/obj/item/areaeditor/attack_self__legacy__attackchain(mob/user as mob) add_fingerprint(user) var/text = "[src] \

[station_name()] [src.name]

\ @@ -54,7 +54,7 @@ By submitting this form, you accept any fines, fees, or personal injury/death that may occur during construction." w_class = WEIGHT_CLASS_TINY -/obj/item/areaeditor/permit/attack_self(mob/user) +/obj/item/areaeditor/permit/attack_self__legacy__attackchain(mob/user) . = ..() var/area/our_area = get_area(src) if(get_area_type() == AREA_STATION) @@ -76,7 +76,7 @@ desc = "Used to define new areas in space." fluffnotice = "Praise the Liberator!" -/obj/item/areaeditor/golem/attack_self(mob/user) +/obj/item/areaeditor/golem/attack_self__legacy__attackchain(mob/user) . = ..() var/area/our_area = get_area(src) if(get_area_type() == AREA_STATION) @@ -103,7 +103,7 @@ return ..() -/obj/item/areaeditor/blueprints/attack_self(mob/user) +/obj/item/areaeditor/blueprints/attack_self__legacy__attackchain(mob/user) . = ..() var/area/our_area = get_area(src) if(get_area_type() == AREA_STATION) @@ -134,7 +134,7 @@ clear_viewer(usr) set_viewer(usr) - attack_self(usr) + attack_self__legacy__attackchain(usr) /obj/item/areaeditor/blueprints/proc/get_images(turf/central_turf, viewsize) . = list() diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 68bb083c199d9..ac69cde165bd3 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -7,7 +7,7 @@ icon_state = "bodybag_folded" w_class = WEIGHT_CLASS_SMALL -/obj/item/bodybag/attack_self(mob/user) +/obj/item/bodybag/attack_self__legacy__attackchain(mob/user) var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc) R.add_fingerprint(user) qdel(src) @@ -27,7 +27,7 @@ close_sound_volume = 15 var/item_path = /obj/item/bodybag -/obj/structure/closet/body_bag/attackby(obj/item/I, mob/user, params) +/obj/structure/closet/body_bag/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(is_pen(I)) var/t = rename_interactive(user, I) if(isnull(t)) diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 00ae37bb2b2a0..9c13bf05c3dcb 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -41,7 +41,7 @@ else return TRUE -/obj/item/candle/attackby(obj/item/W, mob/user, params) +/obj/item/candle/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(W.get_heat()) light("[user] lights [src] with [W].") return @@ -113,7 +113,7 @@ set_light(0) -/obj/item/candle/attack_self(mob/user) +/obj/item/candle/attack_self__legacy__attackchain(mob/user) if(lit) user.visible_message("[user] snuffs out [src].") unlight() @@ -134,7 +134,7 @@ desc = "A candle. It smells like magic, so that would explain why it burns brighter." start_lit = TRUE -/obj/item/candle/eternal/wizard/attack_self(mob/user) +/obj/item/candle/eternal/wizard/attack_self__legacy__attackchain(mob/user) return /obj/item/candle/eternal/wizard/process() diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index 8c197a503cc81..25264a60be777 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -33,7 +33,7 @@ alpha = initial(alpha) pushed_over = TRUE -/obj/item/cardboard_cutout/attack_self(mob/living/user) +/obj/item/cardboard_cutout/attack_self__legacy__attackchain(mob/living/user) if(!pushed_over) return to_chat(user, "You right [src].") @@ -42,7 +42,7 @@ icon_state = initial(icon_state) //This resets a cutout to its blank state - this is intentional to allow for resetting pushed_over = FALSE -/obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, params) +/obj/item/cardboard_cutout/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/toy/crayon)) change_appearance(I, user) return diff --git a/code/game/objects/items/collar.dm b/code/game/objects/items/collar.dm index 1a1a40a6cb35f..9bb839442c820 100644 --- a/code/game/objects/items/collar.dm +++ b/code/game/objects/items/collar.dm @@ -11,7 +11,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/petcollar/attack_self(mob/user) +/obj/item/petcollar/attack_self__legacy__attackchain(mob/user) var/option = "Change Name" if(access_id) option = tgui_input_list(user, "What do you want to do?", "[src]", list("Change Name", "Remove ID")) @@ -32,7 +32,7 @@ user.put_in_hands(access_id) access_id = null -/obj/item/petcollar/attackby(obj/item/card/id/W, mob/user, params) +/obj/item/petcollar/attackby__legacy__attackchain(obj/item/card/id/W, mob/user, params) if(!istype(W)) return ..() if(access_id) diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm index 126a38a0cbe81..d3905586c9ab0 100644 --- a/code/game/objects/items/control_wand.dm +++ b/code/game/objects/items/control_wand.dm @@ -28,7 +28,7 @@ QDEL_NULL(ID) return ..() -/obj/item/door_remote/attack_self(mob/user) +/obj/item/door_remote/attack_self__legacy__attackchain(mob/user) var/list/options = list(WAND_OPEN = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_open"), WAND_BOLT = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_bolt"), WAND_EMERGENCY = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_ea"), @@ -49,7 +49,7 @@ . = ..() . += "It's current mode is: [mode]" -/obj/item/door_remote/afterattack(obj/target, mob/user) +/obj/item/door_remote/afterattack__legacy__attackchain(obj/target, mob/user) if(istype(target, /obj/machinery/door/airlock)) access_airlock(target, user) if(istype(target, /obj/machinery/door/window)) @@ -184,7 +184,7 @@ /// How far can we use this. Leave `null` for infinite range var/range -/obj/item/door_remote/omni/access_tuner/afterattack(obj/machinery/door/D, mob/user) +/obj/item/door_remote/omni/access_tuner/afterattack__legacy__attackchain(obj/machinery/door/D, mob/user) if(!istype(D, /obj/machinery/door/airlock) && !istype(D, /obj/machinery/door/window)) return if(!isnull(range) && get_dist(src, D) > range) @@ -228,14 +228,14 @@ . = ..() . += "This keyring has access to Medbay, Science, Engineering, Cargo, the Bar and the Kitchen!" -/obj/item/door_remote/janikeyring/attack_self(mob/user) +/obj/item/door_remote/janikeyring/attack_self__legacy__attackchain(mob/user) if(cooldown > world.time) return to_chat(user, "You shake [src]!") playsound(src, 'sound/items/keyring_shake.ogg', 50) cooldown = world.time + JANGLE_COOLDOWN -/obj/item/door_remote/janikeyring/afterattack(obj/machinery/door/D, mob/user, proximity) +/obj/item/door_remote/janikeyring/afterattack__legacy__attackchain(obj/machinery/door/D, mob/user, proximity) if(!proximity) return if(!istype(D, /obj/machinery/door/airlock) && !istype(D, /obj/machinery/door/window)) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index cf87fa47a1813..5dda16a4f6ce0 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -42,7 +42,7 @@ ..() drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1, 8)]") -/obj/item/toy/crayon/attack_self(mob/living/user as mob) +/obj/item/toy/crayon/attack_self__legacy__attackchain(mob/living/user as mob) update_window(user) /obj/item/toy/crayon/proc/update_window(mob/living/user as mob) @@ -105,7 +105,7 @@ drawtype = temp update_window(usr) -/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity) +/obj/item/toy/crayon/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity) return if(busy) return if(is_type_in_list(target,validSurfaces)) @@ -137,7 +137,7 @@ qdel(src) busy = FALSE -/obj/item/toy/crayon/attack(mob/M, mob/user) +/obj/item/toy/crayon/attack__legacy__attackchain(mob/M, mob/user) if(M == user) if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -255,7 +255,7 @@ dye_color = DYE_MIME uses = 0 -/obj/item/toy/crayon/mime/attack_self(mob/living/user as mob) +/obj/item/toy/crayon/mime/attack_self__legacy__attackchain(mob/living/user as mob) update_window(user) /obj/item/toy/crayon/mime/update_window(mob/living/user as mob) @@ -281,7 +281,7 @@ dye_color = DYE_RAINBOW uses = 0 -/obj/item/toy/crayon/rainbow/attack_self(mob/living/user as mob) +/obj/item/toy/crayon/rainbow/attack_self__legacy__attackchain(mob/living/user as mob) update_window(user) /obj/item/toy/crayon/rainbow/update_window(mob/living/user as mob) @@ -317,10 +317,10 @@ ..() update_icon() -/obj/item/toy/crayon/spraycan/attack(mob/M, mob/user) +/obj/item/toy/crayon/spraycan/attack__legacy__attackchain(mob/M, mob/user) return // To stop you from eating spraycans. It's TOO SILLY! -/obj/item/toy/crayon/spraycan/attack_self(mob/living/user) +/obj/item/toy/crayon/spraycan/attack_self__legacy__attackchain(mob/living/user) var/choice = tgui_input_list(user, "Do you want to...", "Spraycan Options", list("Toggle Cap","Change Drawing", "Change Color")) switch(choice) if("Toggle Cap") @@ -335,7 +335,7 @@ return update_icon() -/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user as mob, proximity) +/obj/item/toy/crayon/spraycan/afterattack__legacy__attackchain(atom/target, mob/user as mob, proximity) . = ..() if(!proximity) return diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm index 99f97b5e032b1..35c1a5082d6b0 100644 --- a/code/game/objects/items/dehy_carp.dm +++ b/code/game/objects/items/dehy_carp.dm @@ -14,7 +14,7 @@ return ..() // Attack self -/obj/item/toy/plushie/carpplushie/dehy_carp/attack_self(mob/user as mob) +/obj/item/toy/plushie/carpplushie/dehy_carp/attack_self__legacy__attackchain(mob/user as mob) src.add_fingerprint(user) // Anyone can add their fingerprints to it with this if(owned) to_chat(user, "[src] stares up at you with friendly eyes.") @@ -27,7 +27,7 @@ if(volume >= 1) Swell() -/obj/item/toy/plushie/carpplushie/dehy_carp/afterattack(obj/O, mob/user,proximity) +/obj/item/toy/plushie/carpplushie/dehy_carp/afterattack__legacy__attackchain(obj/O, mob/user,proximity) if(!proximity) return if(istype(O,/obj/structure/sink)) to_chat(user, "You place [src] under a stream of water...") diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 78067b05071ba..6f66fa335ef76 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -10,7 +10,7 @@ var/flush = null origin_tech = "programming=3;materials=3" -/obj/item/aicard/afterattack(atom/target, mob/user, proximity) +/obj/item/aicard/afterattack__legacy__attackchain(atom/target, mob/user, proximity) ..() if(!proximity || !target) return @@ -45,7 +45,7 @@ else . += "ai" -/obj/item/aicard/attack_self(mob/user) +/obj/item/aicard/attack_self__legacy__attackchain(mob/user) ui_interact(user) /obj/item/aicard/ui_state(mob/user) diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index 3a0036f02f9ce..95103656f6154 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -72,7 +72,7 @@ if(Adjacent(user)) . += "You can use a pen on it to quickly write a coroner's report." -/obj/item/autopsy_scanner/attackby(obj/item/P, mob/user) +/obj/item/autopsy_scanner/attackby__legacy__attackchain(obj/item/P, mob/user) if(!is_pen(P)) return ..() @@ -88,7 +88,7 @@ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, TRUE) user.put_in_hands(R) -/obj/item/autopsy_scanner/attack_self(mob/user) +/obj/item/autopsy_scanner/attack_self__legacy__attackchain(mob/user) var/scan_data = "" if(timeofdeath) @@ -156,7 +156,7 @@ user.put_in_hands(P) -/obj/item/autopsy_scanner/attack(mob/living/carbon/human/M, mob/living/carbon/user) +/obj/item/autopsy_scanner/attack__legacy__attackchain(mob/living/carbon/human/M, mob/living/carbon/user) if(!istype(M)) return diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 6d11a2387407a..3663889b2e77a 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -31,7 +31,7 @@ QDEL_NULL(integrated_console) return ..() -/obj/item/camera_bug/attack_self(mob/user as mob) +/obj/item/camera_bug/attack_self__legacy__attackchain(mob/user as mob) ui_interact(user) /obj/item/camera_bug/ui_state(mob/user) diff --git a/code/game/objects/items/devices/chameleon_counter.dm b/code/game/objects/items/devices/chameleon_counter.dm index 8bb7f7b25b5ba..e374cbd5eb13a 100644 --- a/code/game/objects/items/devices/chameleon_counter.dm +++ b/code/game/objects/items/devices/chameleon_counter.dm @@ -22,7 +22,7 @@ if(dummy_active) . += "It doesn't look quite right..." -/obj/item/chameleon_counterfeiter/afterattack(obj/item/target, mob/user, proximity) +/obj/item/chameleon_counterfeiter/afterattack__legacy__attackchain(obj/item/target, mob/user, proximity) if(!proximity || !check_sprite(target) || target.alpha < 255 || target.invisibility != 0) return if(dummy_active || !isitem(target)) @@ -73,5 +73,5 @@ can_use = FALSE addtimer(VARSET_CALLBACK(src, can_use, TRUE), 3 SECONDS) -/obj/item/chameleon_counterfeiter/attack_self(mob/living/user) +/obj/item/chameleon_counterfeiter/attack_self__legacy__attackchain(mob/living/user) matter_toggle(user) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 660f7720affc3..e10e4ed94a34c 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -25,10 +25,10 @@ /obj/item/chameleon/equipped() disrupt() -/obj/item/chameleon/attack_self() +/obj/item/chameleon/attack_self__legacy__attackchain() toggle() -/obj/item/chameleon/afterattack(atom/target, mob/user, proximity) +/obj/item/chameleon/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity) return if(!check_sprite(target)) @@ -117,7 +117,7 @@ master = C master.active_dummy = src -/obj/effect/dummy/chameleon/attackby() +/obj/effect/dummy/chameleon/attackby__legacy__attackchain() for(var/mob/M in src) to_chat(M, "Your [src] deactivates.") master.disrupt() @@ -204,7 +204,7 @@ . = ..() disrupt(user) -/obj/item/borg_chameleon/attack_self(mob/living/silicon/robot/syndicate/saboteur/user) +/obj/item/borg_chameleon/attack_self__legacy__attackchain(mob/living/silicon/robot/syndicate/saboteur/user) if(user && user.cell && user.cell.charge > activationCost) if(isturf(user.loc)) toggle(user) diff --git a/code/game/objects/items/devices/enginepicker.dm b/code/game/objects/items/devices/enginepicker.dm index 7a728c4637b60..2541d7991843a 100644 --- a/code/game/objects/items/devices/enginepicker.dm +++ b/code/game/objects/items/devices/enginepicker.dm @@ -18,7 +18,7 @@ list_enginebeacons.Cut() return ..() -/obj/item/enginepicker/attack_self(mob/living/carbon/user) +/obj/item/enginepicker/attack_self__legacy__attackchain(mob/living/carbon/user) if(user.incapacitated()) return diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 4d5166a3ed226..047c61dcb9a65 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -33,7 +33,7 @@ var/use_sound = 'sound/weapons/flash.ogg' COOLDOWN_DECLARE(flash_cooldown) -/obj/item/flash/attackby(obj/item/I, mob/user, params) +/obj/item/flash/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!can_overcharge || !istype(I, /obj/item/stock_parts/cell)) return @@ -126,7 +126,7 @@ if(M.flash_eyes()) M.AdjustConfused(power) -/obj/item/flash/attack(mob/living/M, mob/user) +/obj/item/flash/attack__legacy__attackchain(mob/living/M, mob/user) if(!try_use_flash(user)) return FALSE if(iscarbon(M)) @@ -143,7 +143,7 @@ return TRUE user.visible_message("[user] fails to blind [M] with [src]!", "You fail to blind [M] with [src]!") -/obj/item/flash/afterattack(atom/target, mob/living/user, proximity, params) +/obj/item/flash/afterattack__legacy__attackchain(atom/target, mob/living/user, proximity, params) if(!proximity) return if(!istype(target, /obj/machinery/camera)) @@ -157,7 +157,7 @@ user.create_attack_log("[key_name(user)] EMPd a camera with a flash") add_attack_logs(user, C, "EMPd with [src]", ATKLOG_ALL) -/obj/item/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0) +/obj/item/flash/attack_self__legacy__attackchain(mob/living/carbon/user, flag = 0, emp = 0) if(!try_use_flash(user)) return FALSE user.visible_message("[user]'s [name] emits a blinding light!", "Your [name] emits a blinding light!") @@ -207,11 +207,11 @@ origin_tech = null can_overcharge = FALSE -/obj/item/flash/cyborg/attack(mob/living/M, mob/user) +/obj/item/flash/cyborg/attack__legacy__attackchain(mob/living/M, mob/user) ..() new /obj/effect/temp_visual/borgflash(get_turf(src)) -/obj/item/flash/cyborg/attack_self(mob/user) +/obj/item/flash/cyborg/attack_self__legacy__attackchain(mob/user) ..() new /obj/effect/temp_visual/borgflash(get_turf(src)) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 81776dc836cda..06efea7d556be 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -30,7 +30,7 @@ set_light(0) update_icon() -/obj/item/flashlight/attack_self(mob/user) +/obj/item/flashlight/attack_self__legacy__attackchain(mob/user) if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. return FALSE @@ -42,7 +42,7 @@ A.UpdateButtons() return TRUE -/obj/item/flashlight/attack(mob/living/M as mob, mob/living/user as mob) +/obj/item/flashlight/attack__legacy__attackchain(mob/living/M as mob, mob/living/user as mob) add_fingerprint(user) if(on && user.zone_selected == "eyes") @@ -145,7 +145,7 @@ if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) return - attack_self(user) + attack_self__legacy__attackchain(user) //Bananalamp /obj/item/flashlight/lamp/bananalamp @@ -206,7 +206,7 @@ attack_verb = list() update_brightness() -/obj/item/flashlight/flare/attack_self(mob/user) +/obj/item/flashlight/flare/attack_self__legacy__attackchain(mob/user) // Usual checks if(!fuel) to_chat(user, "[src] is out of fuel.") @@ -360,7 +360,7 @@ update_brightness() icon_state = initial(icon_state) -/obj/item/flashlight/slime/attack_self(mob/user) +/obj/item/flashlight/slime/attack_self__legacy__attackchain(mob/user) return //Bio-luminescence does not toggle. /obj/item/flashlight/slime/extinguish_light(force = FALSE) @@ -394,12 +394,12 @@ emp_cur_charges = min(emp_cur_charges+1, emp_max_charges) return TRUE -/obj/item/flashlight/emp/attack(mob/living/M as mob, mob/living/user as mob) +/obj/item/flashlight/emp/attack__legacy__attackchain(mob/living/M as mob, mob/living/user as mob) if(on && user.zone_selected == "eyes") // call original attack proc only if aiming at the eyes ..() return -/obj/item/flashlight/emp/afterattack(atom/A as mob|obj, mob/user, proximity) +/obj/item/flashlight/emp/afterattack__legacy__attackchain(atom/A as mob|obj, mob/user, proximity) if(!proximity) return if(emp_cur_charges > 0) emp_cur_charges -= 1 diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 2db44252dc320..b4237bb1b88c6 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -116,12 +116,12 @@ current_tick_amount += amount update_icon(UPDATE_ICON_STATE) -/obj/item/geiger_counter/attack_self(mob/user) +/obj/item/geiger_counter/attack_self__legacy__attackchain(mob/user) scanning = !scanning update_icon(UPDATE_ICON_STATE) to_chat(user, "[bicon(src)] You switch [scanning ? "on" : "off"] [src].") -/obj/item/geiger_counter/afterattack(atom/target, mob/user) +/obj/item/geiger_counter/afterattack__legacy__attackchain(atom/target, mob/user) . = ..() if(user.a_intent == INTENT_HELP) if(!emagged) @@ -148,7 +148,7 @@ else to_chat(user, "[bicon(src)] Target is free of radioactive contamination.") -/obj/item/geiger_counter/attackby(obj/item/I, mob/user, params) +/obj/item/geiger_counter/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_SCREWDRIVER && emagged) if(scanning) to_chat(user, "Turn off [src] before you perform this action!") diff --git a/code/game/objects/items/devices/handheld_defib.dm b/code/game/objects/items/devices/handheld_defib.dm index d80d23f11a296..09ea14d04689a 100644 --- a/code/game/objects/items/devices/handheld_defib.dm +++ b/code/game/objects/items/devices/handheld_defib.dm @@ -32,7 +32,7 @@ to_chat(user, "You restore the safeties on [src]") return TRUE -/obj/item/handheld_defibrillator/attack(mob/living/carbon/human/H, mob/user) +/obj/item/handheld_defibrillator/attack__legacy__attackchain(mob/living/carbon/human/H, mob/user) if(!istype(H)) return ..() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 3658d32a68764..8f4329b13cc0e 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -43,10 +43,10 @@ -/obj/item/laser_pointer/attack(mob/living/M, mob/user) +/obj/item/laser_pointer/attack__legacy__attackchain(mob/living/M, mob/user) laser_act(M, user) -/obj/item/laser_pointer/attackby(obj/item/W, mob/user, params) +/obj/item/laser_pointer/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/micro_laser)) if(!diode) user.drop_item() @@ -65,7 +65,7 @@ diode = null return TRUE -/obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/laser_pointer/afterattack__legacy__attackchain(atom/target, mob/living/user, flag, params) if(flag) //we're placing the object on a table or in backpack return laser_act(target, user, params) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 2cdeb55648725..29ec73f15e1d9 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -61,7 +61,7 @@ . = ..() . += status_string() -/obj/item/lightreplacer/attackby(obj/item/I, mob/user) +/obj/item/lightreplacer/attackby__legacy__attackchain(obj/item/I, mob/user) if(uses >= max_uses) to_chat(user, "[src] is full.") return @@ -142,7 +142,7 @@ update_appearance(UPDATE_NAME|UPDATE_ICON_STATE) return TRUE -/obj/item/lightreplacer/attack_self(mob/user) +/obj/item/lightreplacer/attack_self__legacy__attackchain(mob/user) for(var/obj/machinery/light/target in user.loc) ReplaceLight(target, user) to_chat(user, status_string()) @@ -210,10 +210,10 @@ else return 0 -/obj/item/lightreplacer/afterattack(atom/target, mob/U, proximity) +/obj/item/lightreplacer/afterattack__legacy__attackchain(atom/target, mob/U, proximity) . = ..() if(isitem(target)) - attackby(target, U) + attackby__legacy__attackchain(target, U) return if(!proximity && !bluespace_toggle) diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 3aa54e27af63e..99c3143a414d5 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -30,7 +30,7 @@ if(HAS_TRAIT(src, TRAIT_CMAGGED)) . += "Yellow ooze seems to be seeping from the speaker..." -/obj/item/megaphone/attack_self(mob/living/user) +/obj/item/megaphone/attack_self__legacy__attackchain(mob/living/user) if(check_mute(user.ckey, MUTE_IC)) to_chat(src, "You cannot speak in IC (muted).") return diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index fe601c9f7d72f..a329fc7ce7ae2 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -31,7 +31,7 @@ QDEL_NULL(radio) return ..() -/obj/item/paicard/attack_self(mob/user) +/obj/item/paicard/attack_self__legacy__attackchain(mob/user) if(!in_range(src, user)) return user.set_machine(src) @@ -288,7 +288,7 @@ to_chat(pai, "Your supplemental directives have been updated. Your new directives are:") to_chat(pai, "Prime Directive:
[pai.pai_law0]") to_chat(pai, "Supplemental Directives:
[pai.pai_laws]") - attack_self(usr) + attack_self__legacy__attackchain(usr) // WIRE_SIGNAL = 1 // WIRE_RECEIVE = 2 diff --git a/code/game/objects/items/devices/painter/painter.dm b/code/game/objects/items/devices/painter/painter.dm index c953381cf8808..1ea7a9588da4d 100644 --- a/code/game/objects/items/devices/painter/painter.dm +++ b/code/game/objects/items/devices/painter/painter.dm @@ -82,13 +82,13 @@ /** * Calls `pick_color()` on the `selected_module`. */ -/obj/item/painter/attack_self(mob/user) +/obj/item/painter/attack_self__legacy__attackchain(mob/user) selected_module.pick_color(user) /** * If adjacent, calls `paint_atom()` on the `selected_module`, then plays the `usesound`. */ -/obj/item/painter/afterattack(atom/target, mob/user, proximity, params) +/obj/item/painter/afterattack__legacy__attackchain(atom/target, mob/user, proximity, params) if(!proximity) return if(selected_module.paint_atom(target, user)) diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 7affcb8c1bab1..d63301a424dc4 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -56,7 +56,7 @@ mycomputer.mybeacon = null return ..() -/obj/item/beacon/syndicate/attack_self(mob/user) +/obj/item/beacon/syndicate/attack_self__legacy__attackchain(mob/user) if(user) to_chat(user, "Locked In") new /obj/machinery/power/singularity_beacon/syndicate( user.loc ) @@ -87,7 +87,7 @@ var/list/selected = list() var/list/unselected = list() -/obj/item/beacon/syndicate/bundle/attack_self(mob/user) +/obj/item/beacon/syndicate/bundle/attack_self__legacy__attackchain(mob/user) if(!user) return @@ -115,7 +115,7 @@ name = "suspicious beacon" desc = "A label on it reads: Warning: Activating this device will send a power sink to your location." -/obj/item/beacon/syndicate/power_sink/attack_self(mob/user) +/obj/item/beacon/syndicate/power_sink/attack_self__legacy__attackchain(mob/user) if(user) to_chat(user, "Locked In") new /obj/item/powersink(user.loc) @@ -129,7 +129,7 @@ origin_tech = "bluespace=5;syndicate=5" var/bomb = /obj/machinery/syndicatebomb -/obj/item/beacon/syndicate/bomb/attack_self(mob/user) +/obj/item/beacon/syndicate/bomb/attack_self__legacy__attackchain(mob/user) if(user) to_chat(user, "Locked In") new bomb(user.loc) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 309d1ee12eec5..0594ba7774cf7 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -38,10 +38,10 @@ ..() -/obj/item/electropack/attack_self(mob/user) +/obj/item/electropack/attack_self__legacy__attackchain(mob/user) ui_interact(user) -/obj/item/electropack/attackby(obj/item/W, mob/user, params) +/obj/item/electropack/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(istype(W, /obj/item/clothing/head/helmet)) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index cd0946c341135..201ceb11fcfe8 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -395,7 +395,7 @@ return FALSE return ..() -/obj/item/radio/headset/attackby(obj/item/key, mob/user) +/obj/item/radio/headset/attackby__legacy__attackchain(obj/item/key, mob/user) if(istype(key, /obj/item/encryptionkey/)) if(keyslot1 && keyslot2) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 4479fe1d71e02..e9811960327fa 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -121,11 +121,11 @@ /obj/item/radio/intercom/attack_ai(mob/user) add_hiddenprint(user) add_fingerprint(user) - attack_self(user) + attack_self__legacy__attackchain(user) /obj/item/radio/intercom/attack_hand(mob/user) add_fingerprint(user) - attack_self(user) + attack_self__legacy__attackchain(user) /obj/item/radio/intercom/receive_range(freq, level) if(!is_listening()) @@ -151,7 +151,7 @@ if(2) . += "The intercom is wired, and the maintenance panel is unscrewed." -/obj/item/radio/intercom/attackby(obj/item/W, mob/user) +/obj/item/radio/intercom/attackby__legacy__attackchain(obj/item/W, mob/user) if(istype(W, /obj/item/stack/tape_roll)) //eww return else if(iscoil(W) && buildstage == 1) diff --git a/code/game/objects/items/devices/radio/radio_objects.dm b/code/game/objects/items/devices/radio/radio_objects.dm index 3b01d9989c71e..d505e3aa64d0f 100644 --- a/code/game/objects/items/devices/radio/radio_objects.dm +++ b/code/game/objects/items/devices/radio/radio_objects.dm @@ -121,7 +121,7 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems) /obj/item/radio/attack_ghost(mob/user) return interact(user) -/obj/item/radio/attack_self(mob/user) +/obj/item/radio/attack_self__legacy__attackchain(mob/user) interact(user) /obj/item/radio/interact(mob/user) @@ -672,7 +672,7 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems) /obj/item/radio/borg/ert/specops keyslot = new /obj/item/encryptionkey/centcom -/obj/item/radio/borg/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/radio/borg/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/encryptionkey/)) if(keyslot) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 1802076b2ba89..f164e8283d0cd 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -37,7 +37,7 @@ SLIME SCANNER else STOP_PROCESSING(SSobj, src) -/obj/item/t_scanner/attack_self(mob/user) +/obj/item/t_scanner/attack_self__legacy__attackchain(mob/user) toggle_on() /obj/item/t_scanner/process() @@ -125,7 +125,7 @@ SLIME SCANNER . = ..() . += "Use [src] in hand to toggle showing localised damage." -/obj/item/healthanalyzer/attack_self(mob/user) +/obj/item/healthanalyzer/attack_self__legacy__attackchain(mob/user) mode = !mode switch(mode) if(DETAILED_HEALTH_SCAN) @@ -133,7 +133,7 @@ SLIME SCANNER if(SIMPLE_HEALTH_SCAN) to_chat(user, "The scanner is no longer showing localised limb damage.") -/obj/item/healthanalyzer/attack(mob/living/M, mob/living/user) +/obj/item/healthanalyzer/attack__legacy__attackchain(mob/living/M, mob/living/user) if((HAS_TRAIT(user, TRAIT_CLUMSY) || user.getBrainLoss() >= 60) && prob(50)) var/list/msgs = list() user.visible_message("[user] analyzes the floor's vitals!", "You stupidly try to analyze the floor's vitals!") @@ -324,7 +324,7 @@ SLIME SCANNER to_chat(user, chat_box_healthscan(msgs.Join("
"))) -/obj/item/healthanalyzer/attackby(obj/item/I, mob/user, params) +/obj/item/healthanalyzer/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/healthupgrade)) return ..() @@ -389,7 +389,7 @@ SLIME SCANNER msgs += "Chassis Temperature: ???" to_chat(user, chat_box_healthscan(msgs.Join("
"))) -/obj/item/robotanalyzer/attack_obj(obj/machinery/M, mob/living/user) // Scanning a machine object +/obj/item/robotanalyzer/attack_obj__legacy__attackchain(obj/machinery/M, mob/living/user) // Scanning a machine object if(!ismachinery(M)) return if((HAS_TRAIT(user, TRAIT_CLUMSY) || user.getBrainLoss() >= 60) && prob(50)) @@ -407,7 +407,7 @@ SLIME SCANNER if(M.stat & BROKEN) // Displays alongside above message. Machines with a "broken" state do not become broken at 0% HP - anything that reaches that point is destroyed to_chat(user, "Further analysis: Catastrophic component failure detected! [M] requires reconstruction to fully repair.") -/obj/item/robotanalyzer/attack(mob/living/M, mob/living/user) // Scanning borgs, IPCs/augmented crew, and AIs +/obj/item/robotanalyzer/attack__legacy__attackchain(mob/living/M, mob/living/user) // Scanning borgs, IPCs/augmented crew, and AIs if((HAS_TRAIT(user, TRAIT_CLUMSY) || user.getBrainLoss() >= 60) && prob(50)) handle_clumsy(user) return @@ -536,7 +536,7 @@ SLIME SCANNER . = ..() . += "Alt-click [src] to activate the barometer function." -/obj/item/analyzer/attack_self(mob/user as mob) +/obj/item/analyzer/attack_self__legacy__attackchain(mob/user as mob) if(user.stat) return @@ -611,7 +611,7 @@ SLIME SCANNER amount += inaccurate return DisplayTimeText(max(1, amount)) -/obj/item/analyzer/afterattack(atom/target, mob/user, proximity, params) +/obj/item/analyzer/afterattack__legacy__attackchain(atom/target, mob/user, proximity, params) . = ..() if(!can_see(user, target, 1)) return @@ -730,7 +730,7 @@ SLIME SCANNER var/scanning = TRUE actions_types = list(/datum/action/item_action/print_report) -/obj/item/reagent_scanner/afterattack(obj/O, mob/user as mob) +/obj/item/reagent_scanner/afterattack__legacy__attackchain(obj/O, mob/user as mob) if(user.stat) return if(!user.IsAdvancedToolUser()) @@ -805,7 +805,7 @@ SLIME SCANNER throw_range = 7 materials = list(MAT_METAL=30, MAT_GLASS=20) -/obj/item/slime_scanner/attack(mob/living/M, mob/living/user) +/obj/item/slime_scanner/attack__legacy__attackchain(mob/living/M, mob/living/user) if(user.incapacitated() || user.AmountBlinded()) return if(!isslime(M)) @@ -911,7 +911,7 @@ SLIME SCANNER if(printing) . += "bodyanalyzer_printing" -/obj/item/bodyanalyzer/attack(mob/living/M, mob/living/carbon/human/user) +/obj/item/bodyanalyzer/attack__legacy__attackchain(mob/living/M, mob/living/carbon/human/user) if(user.incapacitated() || !user.Adjacent(M)) return @@ -926,7 +926,7 @@ SLIME SCANNER to_chat(user, "The scanner beeps angrily at you! It's out of charge!") playsound(user.loc, 'sound/machines/buzz-sigh.ogg', 50, 1) -/obj/item/bodyanalyzer/borg/attack(mob/living/M, mob/living/silicon/robot/user) +/obj/item/bodyanalyzer/borg/attack__legacy__attackchain(mob/living/M, mob/living/silicon/robot/user) if(user.incapacitated() || !user.Adjacent(M)) return diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm index bd5932287ac21..de6c40b98821c 100644 --- a/code/game/objects/items/devices/sensor_device.dm +++ b/code/game/objects/items/devices/sensor_device.dm @@ -16,7 +16,7 @@ QDEL_NULL(crew_monitor) return ..() -/obj/item/sensor_device/attack_self(mob/user as mob) +/obj/item/sensor_device/attack_self__legacy__attackchain(mob/user as mob) ui_interact(user) /obj/item/sensor_device/ui_state(mob/user) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 5e20328ce2b21..ef64e9412ac47 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -59,7 +59,7 @@ else soundloop.start() -/obj/item/taperecorder/attackby(obj/item/I, mob/user) +/obj/item/taperecorder/attackby__legacy__attackchain(obj/item/I, mob/user) if(!mytape && istype(I, /obj/item/tape)) if(user.drop_item()) I.forceMove(src) @@ -106,7 +106,7 @@ mytape.timestamp += mytape.used_capacity mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [M.name] [msg]" -/obj/item/taperecorder/attack_self(mob/user) +/obj/item/taperecorder/attack_self__legacy__attackchain(mob/user) if(!mytape || mytape.ruined) return if(recording) @@ -303,7 +303,7 @@ ..() ruin() -/obj/item/tape/attack_self(mob/user) +/obj/item/tape/attack_self__legacy__attackchain(mob/user) if(!ruined) ruin(user) @@ -336,7 +336,7 @@ ruined = TRUE update_icon(UPDATE_OVERLAYS) -/obj/item/tape/attackby(obj/item/I, mob/user) +/obj/item/tape/attackby__legacy__attackchain(obj/item/I, mob/user) if(is_pen(I)) rename_interactive(user, I) diff --git a/code/game/objects/items/devices/thermal_drill.dm b/code/game/objects/items/devices/thermal_drill.dm index 884c60db5aadb..203b54bd04605 100644 --- a/code/game/objects/items/devices/thermal_drill.dm +++ b/code/game/objects/items/devices/thermal_drill.dm @@ -26,7 +26,7 @@ QDEL_NULL(song) return ..() -/obj/item/thermal_drill/attack_self(mob/user) +/obj/item/thermal_drill/attack_self__legacy__attackchain(mob/user) add_fingerprint(user) ui_interact(user) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 4df719f93d9dd..724f9d9bf94ae 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -19,7 +19,7 @@ else icon_state = "[initial(icon_state)]" -/obj/item/jammer/attack_self(mob/user) +/obj/item/jammer/attack_self__legacy__attackchain(mob/user) to_chat(user, "You [active ? "deactivate [src]. It goes quiet with a small click." : "activate [src]. It starts to hum softly."]") active = !active update_icon(UPDATE_ICON_STATE) @@ -68,7 +68,7 @@ . = ..() . += "[src] has [charges] out of [max_charges] charges left." -/obj/item/teleporter/attack_self(mob/user) +/obj/item/teleporter/attack_self__legacy__attackchain(mob/user) attempt_teleport(user, FALSE) /obj/item/teleporter/process() @@ -274,7 +274,7 @@ icon_state = "combat_hypo" var/used = FALSE -/obj/item/fireproofing_injector/attack_self(mob/living/user) +/obj/item/fireproofing_injector/attack_self__legacy__attackchain(mob/living/user) if(HAS_TRAIT(user, TRAIT_RESISTHEAT)) to_chat(user, "You are already fireproof!") return @@ -306,7 +306,7 @@ . += "" . += "Clinical trials have shown a four times increase in the rate of healing compared to a placebo. Whilst the product is technically not yet available to the public, the right connections with the right people allow interested parties to obtain samples early..." -/obj/item/cryoregenerative_enhancer/attack_self(mob/living/user) +/obj/item/cryoregenerative_enhancer/attack_self__legacy__attackchain(mob/living/user) if(HAS_TRAIT(user, TRAIT_DRASK_SUPERCOOL)) to_chat(user, "Your regeneration is already enhanced!") return @@ -368,7 +368,7 @@ times_used-- icon_state = "batterer" -/obj/item/batterer/attack_self(mob/living/carbon/user) +/obj/item/batterer/attack_self__legacy__attackchain(mob/living/carbon/user) activate_batterer(user) /obj/item/batterer/proc/activate_batterer(mob/user) @@ -458,7 +458,7 @@ /obj/item/handheld_mirror/ui_interact(mob/user, datum/tgui/ui = null) appearance_changer_holder.ui_interact(user, ui) -/obj/item/handheld_mirror/attack_self(mob/user) +/obj/item/handheld_mirror/attack_self__legacy__attackchain(mob/user) if(ishuman(user)) appearance_changer_holder = new(src, user) appearance_changer_holder.flags = APPEARANCE_ALL_BODY @@ -498,7 +498,7 @@ COOLDOWN_DECLARE(scan_cooldown) var/on_hit_sound = 'sound/effects/ping_hit.ogg' -/obj/item/syndi_scanner/attack_self(mob/user) +/obj/item/syndi_scanner/attack_self__legacy__attackchain(mob/user) if(!COOLDOWN_FINISHED(src, scan_cooldown)) to_chat(user, "[src] is recharging!") return diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index f13c7847f476f..58b20eb669f2e 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -25,7 +25,7 @@ /obj/item/transfer_valve/IsAssemblyHolder() return 1 -/obj/item/transfer_valve/attackby(obj/item/I, mob/user, params) +/obj/item/transfer_valve/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/tank)) if(tank_one && tank_two) to_chat(user, "There are already two tanks attached, remove one first.") @@ -88,7 +88,7 @@ for(var/obj/O in contents) O.hear_message(M, msg) -/obj/item/transfer_valve/attack_self(mob/user) +/obj/item/transfer_valve/attack_self__legacy__attackchain(mob/user) ui_interact(user) /obj/item/transfer_valve/ui_state(mob/user) @@ -137,7 +137,7 @@ toggle_valve(usr) if("device") if(attached_device) - attached_device.attack_self(usr) + attached_device.attack_self__legacy__attackchain(usr) if("remove_device") if(attached_device) attached_device.forceMove(get_turf(src)) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index ffaa3372ff81e..32256602c3ee9 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -427,7 +427,7 @@ GLOBAL_LIST_EMPTY(world_uplinks) /obj/item/radio/uplink/show_examine_hotkeys() return list() -/obj/item/radio/uplink/attack_self(mob/user as mob) +/obj/item/radio/uplink/attack_self__legacy__attackchain(mob/user as mob) if(hidden_uplink) hidden_uplink.trigger(user) @@ -456,7 +456,7 @@ GLOBAL_LIST_EMPTY(world_uplinks) ..() hidden_uplink = new(src) -/obj/item/multitool/uplink/attack_self(mob/user as mob) +/obj/item/multitool/uplink/attack_self__legacy__attackchain(mob/user as mob) if(hidden_uplink) hidden_uplink.trigger(user) diff --git a/code/game/objects/items/devices/voice_changer.dm b/code/game/objects/items/devices/voice_changer.dm index 26cd3ad6ff12d..25f3d56447595 100644 --- a/code/game/objects/items/devices/voice_changer.dm +++ b/code/game/objects/items/devices/voice_changer.dm @@ -24,7 +24,7 @@ return ..() -/obj/item/voice_changer/attack_self(mob/user) +/obj/item/voice_changer/attack_self__legacy__attackchain(mob/user) active = !active icon_state = "voice_changer_[active ? "on" : "off"]" to_chat(user, "You toggle [src] [active ? "on" : "off"].") diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index 7a4dfbd41e0ab..92c81ecbbcb55 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -12,7 +12,7 @@ var/next_use_time var/spamcheck = FALSE -/obj/item/hailer/attack_self(mob/living/carbon/user as mob) +/obj/item/hailer/attack_self__legacy__attackchain(mob/living/carbon/user as mob) if(world.time < next_use_time) return @@ -51,7 +51,7 @@ "Grey" = 'icons/mob/clothing/species/grey/mask.dmi' ) -/obj/item/clothing/mask/whistle/attack_self(mob/user) +/obj/item/clothing/mask/whistle/attack_self__legacy__attackchain(mob/user) if(!COOLDOWN_FINISHED(src, whistle_cooldown)) return diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm index c949612017f17..cc04d4e708029 100644 --- a/code/game/objects/items/flag.dm +++ b/code/game/objects/items/flag.dm @@ -11,13 +11,13 @@ custom_fire_overlay = "fire" var/rolled = FALSE -/obj/item/flag/attackby(obj/item/W, mob/user, params) +/obj/item/flag/attackby__legacy__attackchain(obj/item/W, mob/user, params) . = ..() if(W.get_heat() && !(resistance_flags & ON_FIRE)) user.visible_message("[user] lights [src] with [W].", "You light [src] with [W].", "You hear a low whoosh.") fire_act() -/obj/item/flag/attack_self(mob/user) +/obj/item/flag/attack_self__legacy__attackchain(mob/user) rolled = !rolled user.visible_message("[user] [rolled ? "rolls up" : "unfurls"] [src].", "You [rolled ? "roll up" : "unfurl"] [src].", "You hear fabric rustling.") update_icon() @@ -221,7 +221,7 @@ updated_icon_state = icon_state ..() -/obj/item/flag/chameleon/attack_self(mob/user) +/obj/item/flag/chameleon/attack_self__legacy__attackchain(mob/user) if(used) return ..() @@ -248,7 +248,7 @@ desc = chosen_flag.desc used = TRUE -/obj/item/flag/chameleon/attackby(obj/item/I, mob/user, params) +/obj/item/flag/chameleon/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/grenade) && !boobytrap) if(user.drop_item()) boobytrap = I diff --git a/code/game/objects/items/granters/_granters.dm b/code/game/objects/items/granters/_granters.dm index 6978f29064c8f..a3954dcf40d90 100644 --- a/code/game/objects/items/granters/_granters.dm +++ b/code/game/objects/items/granters/_granters.dm @@ -21,7 +21,7 @@ 'sound/effects/pageturn3.ogg' ) -/obj/item/book/granter/attack_self(mob/living/user) +/obj/item/book/granter/attack_self__legacy__attackchain(mob/living/user) if(reading) to_chat(user, "You're already reading this!") return FALSE diff --git a/code/game/objects/items/hand_item.dm b/code/game/objects/items/hand_item.dm index 51519d827237c..8bfcc9c0ebc26 100644 --- a/code/game/objects/items/hand_item.dm +++ b/code/game/objects/items/hand_item.dm @@ -11,7 +11,7 @@ /// How many smaller table smacks we can do before we're out var/table_smacks_left = 3 -/obj/item/slapper/attack(mob/M, mob/living/carbon/human/user) +/obj/item/slapper/attack__legacy__attackchain(mob/M, mob/living/carbon/human/user) user.do_attack_animation(M) playsound(M, hitsound, 50, TRUE, -1) user.visible_message("[user] slaps [M]!", "You slap [M]!", "You hear a slap.") @@ -22,14 +22,14 @@ if(force) return ..() -/obj/item/slapper/attack_self(mob/user) +/obj/item/slapper/attack_self__legacy__attackchain(mob/user) . = ..() if(!isliving(user)) return var/mob/living/L = user L.emote("highfive", intentional = TRUE) -/obj/item/slapper/attack_obj(obj/O, mob/living/user, params) +/obj/item/slapper/attack_obj__legacy__attackchain(obj/O, mob/living/user, params) if(!istype(O, /obj/structure/table)) return ..() @@ -81,7 +81,7 @@ UnregisterSignal(owner, COMSIG_MOB_WEAPON_APPEARS) return ..() -/obj/item/slapper/parry/attack(mob/M, mob/living/carbon/human/user) +/obj/item/slapper/parry/attack__legacy__attackchain(mob/M, mob/living/carbon/human/user) if(isliving(M)) var/mob/living/creature = M SEND_SOUND(creature, sound('sound/weapons/flash_ring.ogg')) diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index bfbab38847822..388dfc7f60203 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -61,11 +61,11 @@ else . += "single_latch" -/obj/item/his_grace/attack_self(mob/living/user) +/obj/item/his_grace/attack_self__legacy__attackchain(mob/living/user) if(!awakened) INVOKE_ASYNC(src, PROC_REF(awaken), user) -/obj/item/his_grace/attack(mob/living/M, mob/user) +/obj/item/his_grace/attack__legacy__attackchain(mob/living/M, mob/user) if(awakened && M.stat) consume(M) else diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index c3eb9ee2e0644..0501b49aa7b8e 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -57,7 +57,7 @@ if(temperature > T0C+100) burst() -/obj/item/latexballon/attackby(obj/item/W, mob/user, params) +/obj/item/latexballon/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/tank)) var/obj/item/tank/T = W blow(T, user) diff --git a/code/game/objects/items/mixing_bowl.dm b/code/game/objects/items/mixing_bowl.dm index f7c7b9c9697eb..665bbb3cb3fb3 100644 --- a/code/game/objects/items/mixing_bowl.dm +++ b/code/game/objects/items/mixing_bowl.dm @@ -14,7 +14,7 @@ ..() create_reagents(100) -/obj/item/mixing_bowl/attackby(obj/item/I, mob/user, params) +/obj/item/mixing_bowl/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(dirty) if(istype(I, /obj/item/soap)) user.visible_message("[user] starts to scrub [src].", "You start to scrub [src].") @@ -58,7 +58,7 @@ I.forceMove(src) user.visible_message("[user] adds [I] to [src].", "You add [I] to [src].") -/obj/item/mixing_bowl/attack_self(mob/user) +/obj/item/mixing_bowl/attack_self__legacy__attackchain(mob/user) var/dat = "" if(dirty) dat = {"This [src] is dirty!
Please clean it before use!
"} diff --git a/code/game/objects/items/mountable_frames/mountables.dm b/code/game/objects/items/mountable_frames/mountables.dm index 31fa665a51b56..99b2a7f55d8bf 100644 --- a/code/game/objects/items/mountable_frames/mountables.dm +++ b/code/game/objects/items/mountable_frames/mountables.dm @@ -6,7 +6,7 @@ var/allow_floor_mounting = FALSE -/obj/item/mounted/afterattack(atom/A, mob/user, proximity_flag) +/obj/item/mounted/afterattack__legacy__attackchain(atom/A, mob/user, proximity_flag) if(is_type_in_list(A, buildon_types)) if(try_build(A, user, proximity_flag)) return do_build(A, user) diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index a91516d141907..db0e5955e3ade 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -9,7 +9,7 @@ icon_state = "datadisk3" -/obj/item/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user) +/obj/item/malf_upgrade/afterattack__legacy__attackchain(mob/living/silicon/ai/AI, mob/user) if(!istype(AI)) return if(AI.malf_picker) @@ -29,7 +29,7 @@ icon = 'icons/obj/module.dmi' icon_state = "datadisk3" -/obj/item/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user) +/obj/item/surveillance_upgrade/afterattack__legacy__attackchain(mob/living/silicon/ai/AI, mob/user) if(!istype(AI)) return if(AI.eyeobj) diff --git a/code/game/objects/items/robot/cyborg_gripper.dm b/code/game/objects/items/robot/cyborg_gripper.dm index ed07f4c4a92a3..4f81cdc5f9774 100644 --- a/code/game/objects/items/robot/cyborg_gripper.dm +++ b/code/game/objects/items/robot/cyborg_gripper.dm @@ -58,17 +58,17 @@ gripped_item = null return TRUE -/obj/item/gripper/attack_self(mob/user) +/obj/item/gripper/attack_self__legacy__attackchain(mob/user) if(!gripped_item) to_chat(user, "[src] is empty.") return - gripped_item.attack_self(user) + gripped_item.attack_self__legacy__attackchain(user) // This is required to ensure that the forceMove checks on some objects don't rip the gripper out of the borg's inventory and toss it on the floor. That would hurt, a lot! /obj/item/gripper/forceMove(atom/destination) return -/obj/item/gripper/afterattack(atom/target, mob/living/user, proximity, params) +/obj/item/gripper/afterattack__legacy__attackchain(atom/target, mob/living/user, proximity, params) // Target is invalid or we are not adjacent. if(!target || !proximity) return @@ -76,8 +76,8 @@ // Does the gripper already have an item? if(gripped_item) // Pass the attack on to the target. This might delete/relocate gripped_item. If the attackby doesn't resolve or delete the target or gripped_item, afterattack. - if(!target.attackby(gripped_item, user, params)) - gripped_item?.afterattack(target, user, 1, params) + if(!target.attackby__legacy__attackchain(gripped_item, user, params)) + gripped_item?.afterattack__legacy__attackchain(target, user, 1, params) // Check to see if there is still an item in the gripper (stackable items trigger this). if(!gripped_item && length(contents)) gripped_item = contents[1] @@ -157,7 +157,7 @@ ..() return TRUE -/obj/item/gripper/attack(mob/living/M, mob/living/silicon/robot/user, params) +/obj/item/gripper/attack__legacy__attackchain(mob/living/M, mob/living/silicon/robot/user, params) if(gripped_item) return @@ -194,7 +194,7 @@ if(isanimal(M) && !M.holder_type) var/list/modifiers = params2list(params) // This enables borgs to get the floating heart icon and mob emote from simple_animals that have petbonus == TRUE. - M.attack_hand(user, modifiers) + M.attack_hand(user, modifiers) if(user.zone_selected == BODY_ZONE_HEAD) user.visible_message( @@ -279,10 +279,10 @@ // MARK: Gripper Types -/* +/* * Universal Gripper -* Not supplied to any cyborg by default. -* Can be varedited onto a borg for event stuff. +* Not supplied to any cyborg by default. +* Can be varedited onto a borg for event stuff. * Functions almost like a real hand! */ /obj/item/gripper/universal diff --git a/code/game/objects/items/robot/items/inflatable_tool.dm b/code/game/objects/items/robot/items/inflatable_tool.dm index 105a029d7a7df..0bf7cd77f68d2 100644 --- a/code/game/objects/items/robot/items/inflatable_tool.dm +++ b/code/game/objects/items/robot/items/inflatable_tool.dm @@ -17,7 +17,7 @@ . = ..() . += "As a synthetic, you can restore them at a cyborg recharger." -/obj/item/inflatable/cyborg/attack_self(mob/user) +/obj/item/inflatable/cyborg/attack_self__legacy__attackchain(mob/user) if(locate(/obj/structure/inflatable) in get_turf(user)) to_chat(user, "There's already an inflatable structure!") return FALSE diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 5c0a6ba3fa652..538183524332d 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -14,7 +14,7 @@ Keeping it in for adminabuse but the malf one is /obj/item/melee/baton/borg_stun icon_state = "elecarm" var/charge_cost = 30 -/obj/item/borg/stun/attack(mob/living/M, mob/living/silicon/robot/user) +/obj/item/borg/stun/attack__legacy__attackchain(mob/living/M, mob/living/silicon/robot/user) if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.check_shields(src, 0, "[M]'s [name]", MELEE_ATTACK)) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index ff7db9b09eca2..49353ed07ec97 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -24,7 +24,7 @@ AddComponent(/datum/component/surgery_initiator/limb, forced_surgery = /datum/surgery/attach_robotic_limb) -/obj/item/robot_parts/attack_self(mob/user) +/obj/item/robot_parts/attack_self__legacy__attackchain(mob/user) var/choice = tgui_input_list(user, "Select the company appearance for this limb", "Limb Company Selection", GLOB.selectable_robolimbs) if(!choice) return @@ -116,7 +116,7 @@ forced_ai = null return ..() -/obj/item/robot_parts/robot_suit/attack_self(mob/user) +/obj/item/robot_parts/robot_suit/attack_self__legacy__attackchain(mob/user) return /obj/item/robot_parts/robot_suit/update_overlays() @@ -142,7 +142,7 @@ return 1 return 0 -/obj/item/robot_parts/robot_suit/attackby(obj/item/W, mob/user, params) +/obj/item/robot_parts/robot_suit/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(istype(W, /obj/item/stack/sheet/metal) && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) var/obj/item/stack/sheet/metal/M = W @@ -367,7 +367,7 @@ Interact(usr) return -/obj/item/robot_parts/chest/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/robot_parts/chest/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) ..() if(istype(W, /obj/item/stock_parts/cell)) if(cell) @@ -389,7 +389,7 @@ to_chat(user, "You insert the wire!") return -/obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/robot_parts/head/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) ..() if(istype(W, /obj/item/flash)) if(isrobot(user)) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index f695c93b61355..ce79de34f6b52 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -120,7 +120,7 @@ delete_after_install = TRUE var/heldname = "default name" -/obj/item/borg/upgrade/rename/attack_self(mob/user) +/obj/item/borg/upgrade/rename/attack_self__legacy__attackchain(mob/user) var/new_heldname = tgui_input_text(user, "Enter new robot name", "Cyborg Reclassification", heldname, MAX_NAME_LEN) if(!new_heldname) return diff --git a/code/game/objects/items/scratch_card.dm b/code/game/objects/items/scratch_card.dm index 5864b207e7eed..f498a080acae9 100644 --- a/code/game/objects/items/scratch_card.dm +++ b/code/game/objects/items/scratch_card.dm @@ -11,7 +11,7 @@ /// Is this the winner card? var/winner = FALSE -/obj/item/scratch/attackby(obj/item/I, mob/user, params) +/obj/item/scratch/attackby__legacy__attackchain(obj/item/I, mob/user, params) . = ..() if(scratched) return @@ -29,7 +29,7 @@ scratched = TRUE update_icon(UPDATE_ICON_STATE) -/obj/item/scratch/attack_obj(obj/O, mob/living/user, params) +/obj/item/scratch/attack_obj__legacy__attackchain(obj/O, mob/living/user, params) if(winner && istype(O, /obj/machinery/economy/atm)) playsound(user, 'sound/machines/ping.ogg', 50, TRUE) O.atom_say("Congratulations for winning the lottery!") diff --git a/code/game/objects/items/sport.dm b/code/game/objects/items/sport.dm index 01e75aaa2d54d..7f40b5b2cc2ab 100644 --- a/code/game/objects/items/sport.dm +++ b/code/game/objects/items/sport.dm @@ -15,7 +15,7 @@ /// Whether `attack_self` will move ("dribble") it to the other hand var/dribbleable = FALSE // Most balls do not have a dribble animation -/obj/item/beach_ball/attack_self(mob/user) +/obj/item/beach_ball/attack_self__legacy__attackchain(mob/user) if(!dribbleable) return @@ -69,7 +69,7 @@ density = TRUE pass_flags_self = LETPASSTHROW | PASSTAKE -/obj/structure/holohoop/attackby(obj/item/W, mob/user, params) +/obj/structure/holohoop/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/grab) && get_dist(src, user) <= 1) var/obj/item/grab/G = W if(G.state < GRAB_AGGRESSIVE) diff --git a/code/game/objects/items/stacks/medical_packs.dm b/code/game/objects/items/stacks/medical_packs.dm index 71fe2f71701c1..c6f92f52d3a06 100644 --- a/code/game/objects/items/stacks/medical_packs.dm +++ b/code/game/objects/items/stacks/medical_packs.dm @@ -77,10 +77,10 @@ "You apply [src] on [M].") use(1) -/obj/item/stack/medical/attack(mob/living/M, mob/user) +/obj/item/stack/medical/attack__legacy__attackchain(mob/living/M, mob/user) return apply(M, user) -/obj/item/stack/medical/attack_self(mob/user) +/obj/item/stack/medical/attack_self__legacy__attackchain(mob/user) return apply(user, user) /obj/item/stack/medical/proc/heal(mob/living/M, mob/user) @@ -135,7 +135,7 @@ stop_bleeding = 1800 dynamic_icon_state = TRUE -/obj/item/stack/medical/bruise_pack/attackby(obj/item/I, mob/user, params) +/obj/item/stack/medical/bruise_pack/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.sharp) if(get_amount() < 2) to_chat(user, "You need at least two gauzes to do this!") diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 1035b0f70188f..4c244f375d4b2 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -11,7 +11,7 @@ toolspeed = 1 merge_type = /obj/item/stack/nanopaste -/obj/item/stack/nanopaste/attack(mob/living/M as mob, mob/user as mob) +/obj/item/stack/nanopaste/attack__legacy__attackchain(mob/living/M as mob, mob/user as mob) if(!istype(M) || !istype(user)) return 0 if(isrobot(M)) //Repairing cyborgs @@ -33,7 +33,7 @@ else to_chat(user, "[src] won't work on that.") -/obj/item/stack/nanopaste/afterattack(atom/A, mob/user, proximity_flag) +/obj/item/stack/nanopaste/afterattack__legacy__attackchain(atom/A, mob/user, proximity_flag) if(!ismecha(A) || user.a_intent == INTENT_HARM || !proximity_flag) return var/obj/mecha/mecha = A @@ -93,7 +93,7 @@ energy_type = /datum/robot_storage/energy/medical/nanopaste is_cyborg = TRUE -/obj/item/stack/nanopaste/cyborg/attack(mob/living/M, mob/user) +/obj/item/stack/nanopaste/cyborg/attack__legacy__attackchain(mob/living/M, mob/user) if(get_amount() <= 0) to_chat(user, "You don't have enough energy to dispense more [name]!") else diff --git a/code/game/objects/items/stacks/seaweed.dm b/code/game/objects/items/stacks/seaweed.dm index 90a8a9c7da431..6d277dfb23f86 100644 --- a/code/game/objects/items/stacks/seaweed.dm +++ b/code/game/objects/items/stacks/seaweed.dm @@ -11,7 +11,7 @@ usesound = 'sound/items/deconstruct.ogg' merge_type = /obj/item/stack/seaweed -/obj/item/stack/seaweed/attack_self(mob/user) +/obj/item/stack/seaweed/attack_self__legacy__attackchain(mob/user) return /obj/item/stack/seaweed/attack_self_tk() diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 6c815fb7bb8d1..edc0dd43ba748 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -65,7 +65,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( recipes = GLOB.glass_recipes ..() -/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user, params) +/obj/item/stack/sheet/glass/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W if(CC.get_amount() < 5) @@ -187,7 +187,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( recipes = GLOB.pglass_recipes ..() -/obj/item/stack/sheet/plasmaglass/attackby(obj/item/W, mob/user, params) +/obj/item/stack/sheet/plasmaglass/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(istype(W, /obj/item/stack/rods)) var/obj/item/stack/rods/V = W diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index c2a9bcf0b689d..de7987e35c920 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -192,7 +192,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( /obj/item/clothing/head/hooded/explorer, /obj/item/clothing/head/helmet/space/plasmaman/mining)) -/obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/stack/sheet/animalhide/goliath_hide/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag) if(!proximity_flag) return if(is_type_in_typecache(target, goliath_platable_armor_typecache)) @@ -246,7 +246,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( w_class = WEIGHT_CLASS_NORMAL layer = MOB_LAYER -/obj/item/stack/sheet/animalhide/armor_plate/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/stack/sheet/animalhide/armor_plate/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag) if(!proximity_flag) return if(istype(target, /obj/mecha/working/ripley)) @@ -264,7 +264,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( else to_chat(user, "You can't improve [D] any further!") -/obj/item/stack/sheet/animalhide/armor_plate/attackby(obj/item/W, mob/user, params) +/obj/item/stack/sheet/animalhide/armor_plate/attackby__legacy__attackchain(obj/item/W, mob/user, params) return // no steel leather for ya /obj/item/stack/sheet/animalhide/ashdrake @@ -279,7 +279,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( layer = MOB_LAYER dynamic_icon_state = TRUE -/obj/item/stack/sheet/animalhide/ashdrake/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/stack/sheet/animalhide/ashdrake/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag) if(!proximity_flag) return if(istype(target, /obj/mecha/working/ripley)) @@ -301,7 +301,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( //Step one - dehairing. -/obj/item/stack/sheet/animalhide/attackby(obj/item/W, mob/user, params) +/obj/item/stack/sheet/animalhide/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(W.sharp) user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.") if(do_after(user, 50 * W.toolspeed, target = src)) diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index ddbe453a32408..d0a3c536124d9 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -13,7 +13,7 @@ flags = CONDUCT max_amount = 60 -/obj/item/stack/light_w/attackby(obj/item/I, mob/user, params) +/obj/item/stack/light_w/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() if(istype(I, /obj/item/wirecutters)) var/obj/item/stack/cable_coil/CC = new(user.loc) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 386eca38fe640..2e53e687d1e9d 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -199,7 +199,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( icon_state = "empty-sandbags" w_class = WEIGHT_CLASS_TINY -/obj/item/emptysandbag/attackby(obj/item/I, mob/user, params) +/obj/item/emptysandbag/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/stack/ore/glass)) var/obj/item/stack/ore/glass/G = I to_chat(user, "You fill the sandbag.") @@ -300,7 +300,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( log_and_set_aflame(user, I) return TRUE -/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/I, mob/living/user, params) +/obj/item/stack/sheet/mineral/plasma/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(I.get_heat()) log_and_set_aflame(user, I) else diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 87f861c4caa31..313caa58c9b2d 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -490,7 +490,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( )), )) -/obj/item/stack/sheet/cardboard/attackby(obj/item/I, mob/user, params) +/obj/item/stack/sheet/cardboard/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/stamp/clown) && !isstorage(loc)) var/atom/droploc = drop_location() if(use(1)) @@ -572,7 +572,7 @@ GLOBAL_LIST_INIT(cult_recipes, list ( item_state = GET_CULT_DATA(runed_metal_item_state, initial(item_state)) recipes = GLOB.cult_recipes -/obj/item/stack/sheet/runed_metal/attack_self(mob/living/user) +/obj/item/stack/sheet/runed_metal/attack_self__legacy__attackchain(mob/living/user) if(!IS_CULTIST(user)) to_chat(user, "Only one with forbidden knowledge could hope to work this metal...") return diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index a24d5121619bc..4066e3702c7b3 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -135,7 +135,7 @@ return FALSE return TRUE -/obj/item/stack/attack_self(mob/user) +/obj/item/stack/attack_self__legacy__attackchain(mob/user) ui_interact(user) /obj/item/stack/attack_self_tk(mob/user) @@ -164,7 +164,7 @@ if(src && user.machine == src) ui_interact(user) -/obj/item/stack/attackby(obj/item/thing, mob/user, params) +/obj/item/stack/attackby__legacy__attackchain(obj/item/thing, mob/user, params) if(!can_merge(thing, TRUE)) return ..() diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 865f45bc27126..8b05fb164e9fb 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -11,7 +11,7 @@ origin_tech = "materials=6;syndicate=1" dynamic_icon_state = TRUE -/obj/item/stack/telecrystal/attack(mob/target, mob/user) +/obj/item/stack/telecrystal/attack__legacy__attackchain(mob/target, mob/user) if(target == user) //You can't go around smacking people with crystals to find out if they have an uplink or not. for(var/obj/item/bio_chip/uplink/I in target) if(I && I.imp_in) @@ -19,7 +19,7 @@ use(amount) to_chat(user, "You press [src] onto yourself and charge your hidden uplink.") -/obj/item/stack/telecrystal/afterattack(obj/item/I, mob/user, proximity) +/obj/item/stack/telecrystal/afterattack__legacy__attackchain(obj/item/I, mob/user, proximity) if(!proximity) return if(istype(I) && I.hidden_uplink && I.hidden_uplink.active) //No metagaming by using this on every PDA around just to see if it gets used up. diff --git a/code/game/objects/items/theft_items.dm b/code/game/objects/items/theft_items.dm index 213f59ff20f11..3c5a1424f3bf1 100644 --- a/code/game/objects/items/theft_items.dm +++ b/code/game/objects/items/theft_items.dm @@ -23,7 +23,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/nuke_core/attackby(obj/item/nuke_core_container/container, mob/user) +/obj/item/nuke_core/attackby__legacy__attackchain(obj/item/nuke_core_container/container, mob/user) if(istype(container)) container.load(src, user) else @@ -106,7 +106,7 @@ if(ismob(loc)) to_chat(loc, "[src] is permanently sealed, [core]'s radiation is contained.") -/obj/item/nuke_core_container/attackby(obj/item/nuke_core/plutonium/core, mob/user) +/obj/item/nuke_core_container/attackby__legacy__attackchain(obj/item/nuke_core/plutonium/core, mob/user) if(!istype(core) || cracked) return ..() @@ -177,7 +177,7 @@ return TRUE return FALSE -/obj/item/nuke_core/supermatter_sliver/attackby(obj/item/I, mob/living/user, params) +/obj/item/nuke_core/supermatter_sliver/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/retractor/supermatter)) var/obj/item/retractor/supermatter/tongs = I if(tongs.sliver) @@ -279,7 +279,7 @@ icon_state = "core_container_cracked_empty" to_chat(user, "You carefully pick up [I.sliver] with [I].") -/obj/item/nuke_core_container/supermatter/attackby(obj/item/retractor/supermatter/tongs, mob/user) +/obj/item/nuke_core_container/supermatter/attackby__legacy__attackchain(obj/item/retractor/supermatter/tongs, mob/user) if(istype(tongs)) if(cracked) //lets take that shard out @@ -348,7 +348,7 @@ QDEL_NULL(sliver) return ..() -/obj/item/retractor/supermatter/afterattack(atom/O, mob/user, proximity) +/obj/item/retractor/supermatter/afterattack__legacy__attackchain(atom/O, mob/user, proximity) . = ..() if(!sliver) return diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 70795a2d89ac0..8f1b1fdb27424 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -131,7 +131,7 @@ playsound(loc, 'sound/items/jaws_pry.ogg', 50, TRUE, -1) return BRUTELOSS -/obj/item/crowbar/power/attack_self(mob/user) +/obj/item/crowbar/power/attack_self__legacy__attackchain(mob/user) playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) var/obj/item/wirecutters/power/cutjaws = new /obj/item/wirecutters/power to_chat(user, "You attach the cutting jaws to [src].") diff --git a/code/game/objects/items/tools/multitool.dm b/code/game/objects/items/tools/multitool.dm index 51437649a0cd8..6e824e6ccf7ee 100644 --- a/code/game/objects/items/tools/multitool.dm +++ b/code/game/objects/items/tools/multitool.dm @@ -47,7 +47,7 @@ buffer = null return ..() -/obj/item/multitool/attack_self(mob/user) +/obj/item/multitool/attack_self__legacy__attackchain(mob/user) if(!COOLDOWN_FINISHED(src, cd_apc_scan)) return COOLDOWN_START(src, cd_apc_scan, 1.5 SECONDS) diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 9cedc192c75b3..dce3f64054ca5 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -50,7 +50,7 @@ if(prob(75)) src.pixel_y = rand(0, 16) -/obj/item/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user) +/obj/item/screwdriver/attack__legacy__attackchain(mob/living/carbon/M, mob/living/carbon/user) if(!istype(M) || user.a_intent == INTENT_HELP) return ..() if(user.zone_selected != "eyes" && user.zone_selected != "head") @@ -117,7 +117,7 @@ user.visible_message("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS -/obj/item/screwdriver/power/attack_self(mob/user) +/obj/item/screwdriver/power/attack_self__legacy__attackchain(mob/user) playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1) var/obj/item/wrench/power/b_drill = new /obj/item/wrench/power to_chat(user, "You attach the bolt driver bit to [src].") diff --git a/code/game/objects/items/tools/welder.dm b/code/game/objects/items/tools/welder.dm index 0a645a62b7b3e..9208ae62090b4 100644 --- a/code/game/objects/items/tools/welder.dm +++ b/code/game/objects/items/tools/welder.dm @@ -86,7 +86,7 @@ return remove_fuel(maximum_fuel) -/obj/item/weldingtool/attack_self(mob/user) +/obj/item/weldingtool/attack_self__legacy__attackchain(mob/user) if(tool_enabled) //Turn off the welder if it's on to_chat(user, "You switch off [src].") toggle_welder() @@ -145,7 +145,7 @@ remove_fuel(amount) return TRUE -/obj/item/weldingtool/afterattack(atom/target, mob/user, proximity, params) +/obj/item/weldingtool/afterattack__legacy__attackchain(atom/target, mob/user, proximity, params) . = ..() if(!tool_enabled) return @@ -153,7 +153,7 @@ return remove_fuel(0.5) -/obj/item/weldingtool/attack(mob/living/target, mob/living/user) +/obj/item/weldingtool/attack__legacy__attackchain(mob/living/target, mob/living/user, def_zone) if(cigarette_lighter_act(user, target)) return if(tool_enabled && target.IgniteMob()) diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index ff1ee43e3ffa5..9ddf4fe8ffc66 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -31,7 +31,7 @@ belt_icon = "wirecutters_[param_color]" icon_state = "cutters_[param_color]" -/obj/item/wirecutters/attack(mob/living/carbon/C, mob/user) +/obj/item/wirecutters/attack__legacy__attackchain(mob/living/carbon/C, mob/user) if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/restraints/handcuffs/cable)) user.visible_message("[user] cuts [C]'s restraints with [src]!") QDEL_NULL(C.handcuffed) @@ -145,7 +145,7 @@ return OXYLOSS -/obj/item/wirecutters/power/attack_self(mob/user) +/obj/item/wirecutters/power/attack_self__legacy__attackchain(mob/user) playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) var/obj/item/crowbar/power/pryjaws = new /obj/item/crowbar/power to_chat(user, "You attach the pry jaws to [src].") diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index c63fb0bb23033..0601ca4d473ae 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -69,7 +69,7 @@ toolspeed = 0.25 w_class = WEIGHT_CLASS_NORMAL -/obj/item/wrench/power/attack_self(mob/user) +/obj/item/wrench/power/attack_self__legacy__attackchain(mob/user) playsound(get_turf(user),'sound/items/change_drill.ogg', 50, 1) var/obj/item/wirecutters/power/s_drill = new /obj/item/screwdriver/power to_chat(user, "You attach the screwdriver bit to [src].") diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 120303459ab52..d45c130ae91bb 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -40,10 +40,10 @@ ..() create_reagents(10) -/obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob) +/obj/item/toy/balloon/attack__legacy__attackchain(mob/living/carbon/human/M as mob, mob/user as mob) return -/obj/item/toy/balloon/afterattack(atom/A, mob/user, proximity) +/obj/item/toy/balloon/afterattack__legacy__attackchain(atom/A, mob/user, proximity) if(!proximity) return if(istype(A, /obj/structure/reagent_dispensers)) @@ -66,7 +66,7 @@ update_icon() return -/obj/item/toy/balloon/attackby(obj/O as obj, mob/user as mob, params) +/obj/item/toy/balloon/attackby__legacy__attackchain(obj/O as obj, mob/user as mob, params) if(istype(O, /obj/item/reagent_containers/glass) || istype(O, /obj/item/reagent_containers/drinks/drinkingglass)) if(O.reagents) if(O.reagents.total_volume < 1) @@ -115,7 +115,7 @@ w_class = WEIGHT_CLASS_BULKY var/lastused = null -/obj/item/toy/syndicateballoon/attack_self(mob/user) +/obj/item/toy/syndicateballoon/attack_self__legacy__attackchain(mob/user) if(world.time - lastused < CLICK_CD_MELEE) return var/playverb = pick("bat [src]", "tug on [src]'s string", "play with [src]") @@ -184,7 +184,7 @@ w_class = WEIGHT_CLASS_SMALL attack_verb = list("attacked", "struck", "hit") -/obj/item/toy/sword/attack_self(mob/user) +/obj/item/toy/sword/attack_self__legacy__attackchain(mob/user) active = !active if(active) to_chat(user, "You extend the plastic blade with a quick flick of your wrist.") @@ -207,7 +207,7 @@ return // Copied from /obj/item/melee/energy/sword/attackby -/obj/item/toy/sword/attackby(obj/item/W, mob/living/user, params) +/obj/item/toy/sword/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) ..() if(istype(W, /obj/item/toy/sword)) if(W == src) @@ -229,7 +229,7 @@ /// Sets to TRUE once the character using it hits something and realises it's not a real energy sword var/pranked = FALSE -/obj/item/toy/sword/attack(mob/target, mob/living/user) +/obj/item/toy/sword/attack__legacy__attackchain(mob/target, mob/living/user) if(!cigarette_lighter_act(user, target)) return ..() @@ -283,7 +283,7 @@ target.unEquip(cig, TRUE) return TRUE -/obj/item/toy/sword/chaosprank/afterattack(mob/living/target, mob/living/user, proximity) +/obj/item/toy/sword/chaosprank/afterattack__legacy__attackchain(mob/living/target, mob/living/user, proximity) ..() if(!pranked) to_chat(user, "Oh... It's a fake.") @@ -423,7 +423,7 @@ w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 -/obj/item/toy/nuke/attack_self(mob/user) +/obj/item/toy/nuke/attack_self__legacy__attackchain(mob/user) if(cooldown < world.time) cooldown = world.time + 1800 //3 minutes user.visible_message("[user] presses a button on [src]", "You activate [src], it plays a loud noise!", "You hear the click of a button.") @@ -455,7 +455,7 @@ desc += " This one is [item_color]." icon_state = "therapy[item_color]" -/obj/item/toy/therapy/attack_self(mob/user) +/obj/item/toy/therapy/attack_self__legacy__attackchain(mob/user) if(cooldown < world.time - 8) to_chat(user, "You relieve some stress with \the [src].") playsound(user, 'sound/items/squeaktoy.ogg', 20, 1) @@ -580,14 +580,14 @@ var/obj/item/grenade/grenade //You can remove the stuffing from a plushie and add a grenade to it for *nefarious uses* -/obj/item/toy/plushie/attack(mob/M as mob, mob/user as mob) +/obj/item/toy/plushie/attack__legacy__attackchain(mob/M as mob, mob/user as mob) playsound(loc, pickweight(poof_sound), 20, 1) // Play the whoosh sound in local area if(iscarbon(M)) if(prob(10)) M.reagents.add_reagent("hugs", 10) return ..() -/obj/item/toy/plushie/attack_self(mob/user as mob) +/obj/item/toy/plushie/attack_self__legacy__attackchain(mob/user as mob) if(has_stuffing || grenade) var/cuddle_verb = pick("hugs", "cuddles", "snugs") user.visible_message("[user] [cuddle_verb] [src].") @@ -609,7 +609,7 @@ QDEL_NULL(grenade) return ..() -/obj/item/toy/plushie/attackby(obj/item/I, mob/living/user, params) +/obj/item/toy/plushie/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(I.sharp) if(!grenade) if(!has_stuffing) @@ -796,7 +796,7 @@ /obj/item/toy/plushie/greyplushie/proc/reset_hugdown() hug_cooldown = FALSE //Resets the hug interaction cooldown. -/obj/item/toy/plushie/greyplushie/attack_self(mob/user)//code for talking when hugged. +/obj/item/toy/plushie/greyplushie/attack_self__legacy__attackchain(mob/user)//code for talking when hugged. . = ..() if(hug_cooldown) return @@ -814,7 +814,7 @@ item_state = "plushie_vox" var/cooldown = 0 -/obj/item/toy/plushie/voxplushie/attack_self(mob/user) +/obj/item/toy/plushie/voxplushie/attack_self__legacy__attackchain(mob/user) if(!cooldown) playsound(user, 'sound/voice/shriek1.ogg', 10, 0) visible_message("Skreee!") @@ -829,7 +829,7 @@ icon_state = "plushie_ipc" item_state = "plushie_ipc" -/obj/item/toy/plushie/ipcplushie/attackby(obj/item/B, mob/user, params) +/obj/item/toy/plushie/ipcplushie/attackby__legacy__attackchain(obj/item/B, mob/user, params) if(istype(B, /obj/item/food/breadslice)) new /obj/item/food/toast(get_turf(loc)) to_chat(user, "You insert bread into the toaster.") @@ -871,7 +871,7 @@ item_state = "plushie_nian" var/cooldown = FALSE -/obj/item/toy/plushie/nianplushie/attack_self(mob/user) +/obj/item/toy/plushie/nianplushie/attack_self__legacy__attackchain(mob/user) if(cooldown) return ..() @@ -945,7 +945,7 @@ else . += "single_latch" -/obj/item/toy/windup_toolbox/attack_self(mob/user) +/obj/item/toy/windup_toolbox/attack_self__legacy__attackchain(mob/user) if(!active) to_chat(user, "You wind up [src], it begins to rumble.") active = TRUE @@ -974,7 +974,7 @@ item_state = "flashtool" w_class = WEIGHT_CLASS_TINY -/obj/item/toy/flash/attack(mob/living/M, mob/user) +/obj/item/toy/flash/attack__legacy__attackchain(mob/living/M, mob/user) playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) flick("[initial(icon_state)]2", src) user.visible_message("[user] blinds [M] with the flash!") @@ -991,7 +991,7 @@ w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 -/obj/item/toy/redbutton/attack_self(mob/user) +/obj/item/toy/redbutton/attack_self__legacy__attackchain(mob/user) if(cooldown >= world.time) to_chat(user, "Nothing happens.") return @@ -1016,7 +1016,7 @@ w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 -/obj/item/toy/ai/attack_self(mob/user) +/obj/item/toy/ai/attack_self__legacy__attackchain(mob/user) if(!cooldown) //for the sanity of everyone var/message = generate_ion_law() to_chat(user, "You press the button on [src].") @@ -1036,7 +1036,7 @@ var/list/messages = list("You must challenge the devil to a dance-off!", "The devils true name is Ian", "The devil hates salt!", "Would you like infinite power?", "Would you like infinite wisdom?", " Would you like infinite healing?") var/cooldown = FALSE -/obj/item/toy/codex_gigas/attack_self(mob/user) +/obj/item/toy/codex_gigas/attack_self__legacy__attackchain(mob/user) if(!cooldown) user.visible_message( "[user] presses the button on \the [src].", @@ -1096,7 +1096,7 @@ attack_verb = list("attacked", "bashed", "smashed", "stoned") hitsound = "swing_hit" -/obj/item/toy/pet_rock/attack_self(mob/user) +/obj/item/toy/pet_rock/attack_self__legacy__attackchain(mob/user) var/cuddle_verb = pick("admires", "respects", "cherises", "appreciates") user.visible_message("[user] [cuddle_verb] [src].") @@ -1121,7 +1121,7 @@ var/cooldown = 0 var/obj/stored_minature = null -/obj/item/toy/minigibber/attack_self(mob/user) +/obj/item/toy/minigibber/attack_self__legacy__attackchain(mob/user) if(stored_minature) to_chat(user, "\The [src] makes a violent grinding noise as it tears apart the miniature figure inside!") @@ -1134,7 +1134,7 @@ playsound(user, 'sound/goonstation/effects/gib.ogg', 20, 1) cooldown = world.time -/obj/item/toy/minigibber/attackby(obj/O, mob/user, params) +/obj/item/toy/minigibber/attackby__legacy__attackchain(obj/O, mob/user, params) if(istype(O,/obj/item/toy/character) && O.loc == user) to_chat(user, "You start feeding \the [O] [bicon(O)] into \the [src]'s mini-input.") if(do_after(user, 10, target = src)) @@ -1180,7 +1180,7 @@ ..() spin_cylinder() -/obj/item/toy/russian_revolver/attack_self(mob/user) +/obj/item/toy/russian_revolver/attack_self__legacy__attackchain(mob/user) if(!bullets_left) user.visible_message("[user] loads a bullet into [src]'s cylinder before spinning it.") spin_cylinder() @@ -1188,10 +1188,10 @@ user.visible_message("[user] spins the cylinder on [src]!") spin_cylinder() -/obj/item/toy/russian_revolver/attack(mob/M, mob/living/user) +/obj/item/toy/russian_revolver/attack__legacy__attackchain(mob/M, mob/living/user) return -/obj/item/toy/russian_revolver/afterattack(atom/target, mob/user, flag, params) +/obj/item/toy/russian_revolver/afterattack__legacy__attackchain(atom/target, mob/user, flag, params) if(flag) if(target in user.contents) return @@ -1259,7 +1259,7 @@ to_chat(user, "You go to spin the chamber... and it goes off in your face!") shoot_gun(user) -/obj/item/toy/russian_revolver/trick_revolver/attack_self(mob/user) +/obj/item/toy/russian_revolver/trick_revolver/attack_self__legacy__attackchain(mob/user) if(!bullets_left) //You can re-arm the trap... user.visible_message("[user] loads a bullet into [src]'s cylinder before spinning it.") spin_cylinder() @@ -1267,7 +1267,7 @@ user.visible_message("[user] tries to empty [src], but it goes off in their face!") shoot_gun(user) -/obj/item/toy/russian_revolver/trick_revolver/attackby(obj/item/I, mob/user, params) +/obj/item/toy/russian_revolver/trick_revolver/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(is_pen(I)) to_chat(user, "You go to write on [src].. and it goes off in your face!") shoot_gun(user) @@ -1347,7 +1347,7 @@ var/cooldown = 0 var/cooldown_time = 3 SECONDS -/obj/item/toy/figure/attack_self(mob/user) +/obj/item/toy/figure/attack_self__legacy__attackchain(mob/user) ..() if(cooldown < world.time) cooldown = world.time + cooldown_time @@ -1730,7 +1730,7 @@ var/cooldown = 0 var/list/possible_answers = list("Definitely", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future Unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.") -/obj/item/toy/eight_ball/attack_self(mob/user as mob) +/obj/item/toy/eight_ball/attack_self__legacy__attackchain(mob/user as mob) if(!cooldown) var/answer = pick(possible_answers) user.visible_message("[user] focuses on [user.p_their()] question and [use_action]...") diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 42635506edb81..3fcc330ad135e 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -17,7 +17,7 @@ return TRUE return ..() -/obj/item/trash/attack(mob/M as mob, mob/living/user as mob) +/obj/item/trash/attack__legacy__attackchain(mob/M as mob, mob/living/user as mob) return /obj/item/trash/raisins diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 4748342592bb1..91e8d09040451 100755 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -116,7 +116,7 @@ AI MODULES icon_state = "light_blue_medium" origin_tech = "programming=3;materials=3" -/obj/item/ai_module/safeguard/attack_self(mob/user as mob) +/obj/item/ai_module/safeguard/attack_self__legacy__attackchain(mob/user as mob) ..() var/new_targetName = tgui_input_text(user, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name) if(!new_targetName) @@ -145,7 +145,7 @@ AI MODULES icon_state = "green_high" origin_tech = "programming=4;materials=4" -/obj/item/ai_module/one_crew_member/attack_self(mob/user as mob) +/obj/item/ai_module/one_crew_member/attack_self__legacy__attackchain(mob/user as mob) ..() var/new_targetName = tgui_input_text(usr, "Please enter the name of the person who is the only crew.", "Who?", user.real_name) if(!new_targetName) @@ -178,7 +178,7 @@ AI MODULES icon_state = "red_high" origin_tech = "programming=4;materials=4" //made of gold -/obj/item/ai_module/protect_station/attack_self(mob/user as mob) +/obj/item/ai_module/protect_station/attack_self__legacy__attackchain(mob/user as mob) ..() /obj/item/ai_module/protect_station/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender) @@ -194,7 +194,7 @@ AI MODULES icon_state = "light_blue_high" origin_tech = "programming=4;biotech=2;materials=4" -/obj/item/ai_module/oxygen/attack_self(mob/user as mob) +/obj/item/ai_module/oxygen/attack_self__legacy__attackchain(mob/user as mob) ..() /obj/item/ai_module/oxygen/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender) @@ -213,7 +213,7 @@ AI MODULES icon_state = "standard_high" origin_tech = "programming=4;materials=4" -/obj/item/ai_module/freeform/attack_self(mob/user as mob) +/obj/item/ai_module/freeform/attack_self__legacy__attackchain(mob/user as mob) ..() var/new_lawpos = tgui_input_number(user, "Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority", lawpos, MAX_SUPPLIED_LAW_NUMBER, MIN_SUPPLIED_LAW_NUMBER) if(isnull(new_lawpos)) @@ -423,7 +423,7 @@ AI MODULES icon_state = "standard_high" origin_tech = "programming=5;materials=4" -/obj/item/ai_module/freeformcore/attack_self(mob/user as mob) +/obj/item/ai_module/freeformcore/attack_self__legacy__attackchain(mob/user as mob) ..() var/new_targetName = tgui_input_text(usr, "Please enter a new core law for the AI.", "Freeform Law Entry") if(!new_targetName) @@ -452,7 +452,7 @@ AI MODULES icon_state = "syndicate" origin_tech = "programming=5;materials=5;syndicate=2" -/obj/item/ai_module/syndicate/attack_self(mob/user as mob) +/obj/item/ai_module/syndicate/attack_self__legacy__attackchain(mob/user as mob) ..() var/new_targetName = tgui_input_text(usr, "Please enter a new law for the AI.", "Freeform Law Entry", max_length = MAX_MESSAGE_LEN) if(!new_targetName) @@ -492,7 +492,7 @@ AI MODULES target.add_ion_law(ion_law) return ion_law -/obj/item/ai_module/toy_ai/attack_self(mob/user) +/obj/item/ai_module/toy_ai/attack_self__legacy__attackchain(mob/user) ion_law = generate_ion_law() to_chat(user, "You press the button on [src].") playsound(user, 'sound/machines/click.ogg', 20, TRUE) diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index d7ea80dd794bf..07fa4649fd5e2 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -357,7 +357,7 @@ return OBLITERATION user.visible_message("[user] puts the barrel of [src] into [user.p_their()] mouth and pulls the trigger. It looks like [user.p_theyre()] trying to commit suicide!") - if(!afterattack(suicide_tile, user, TRUE)) + if(!afterattack__legacy__attackchain(suicide_tile, user, TRUE)) flags &= ~NODROP return SHAME user.visible_message("[user] explodes as [src] builds a structure inside [user.p_them()]!") @@ -413,7 +413,7 @@ update_icon(UPDATE_OVERLAYS) SStgui.update_uis(src) -/obj/item/rcd/attackby(obj/item/W, mob/user, params) +/obj/item/rcd/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(!istype(W, /obj/item/rcd_ammo)) return ..() var/obj/item/rcd_ammo/R = W @@ -465,7 +465,7 @@ to_chat(user, "You change [src]'s mode to '[choice]'.") -/obj/item/rcd/attack_self(mob/user) +/obj/item/rcd/attack_self__legacy__attackchain(mob/user) //Change the mode // Oh I thought the UI was just for fucking staring at radial_menu(user) @@ -598,7 +598,7 @@ else return FALSE -/obj/item/rcd/afterattack(atom/A, mob/user, proximity) +/obj/item/rcd/afterattack__legacy__attackchain(atom/A, mob/user, proximity) if(!proximity) return FALSE if(istype(A, /turf/space/transit)) @@ -716,7 +716,7 @@ materials = list(MAT_METAL=16000, MAT_GLASS=8000) var/ammoamt = 20 -/obj/item/rcd_ammo/attackby(obj/item/I, mob/user) +/obj/item/rcd_ammo/attackby__legacy__attackchain(obj/item/I, mob/user) if(!istype(I, /obj/item/rcd) || issilicon(user)) return ..() var/obj/item/rcd/R = I diff --git a/code/game/objects/items/weapons/RCL.dm b/code/game/objects/items/weapons/RCL.dm index ca9494174125a..d97ec8f6ceab1 100644 --- a/code/game/objects/items/weapons/RCL.dm +++ b/code/game/objects/items/weapons/RCL.dm @@ -20,7 +20,7 @@ . = ..() AddComponent(/datum/component/two_handed) -/obj/item/rcl/attackby(obj/item/W, mob/user) +/obj/item/rcl/attackby__legacy__attackchain(obj/item/W, mob/user) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W if(!loaded) @@ -110,7 +110,7 @@ active = FALSE last = null -/obj/item/rcl/attack_self(mob/user) +/obj/item/rcl/attack_self__legacy__attackchain(mob/user) ..() active = HAS_TRAIT(src, TRAIT_WIELDED) if(!active) diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 8c5895727298f..a9ca00fa7ffed 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -16,7 +16,7 @@ var/atom/currently_dispensing var/power_mode = POWER_NONE -/obj/item/rsf/attack_self(mob/user) +/obj/item/rsf/attack_self__legacy__attackchain(mob/user) playsound(loc, 'sound/effects/pop.ogg', 50, 0) if(!currently_dispensing) to_chat(user, "Choose an item to dispense!") @@ -68,7 +68,7 @@ return TRUE -/obj/item/rsf/afterattack(atom/A, mob/user, proximity) +/obj/item/rsf/afterattack__legacy__attackchain(atom/A, mob/user, proximity) if(!currently_dispensing) return if(!proximity) diff --git a/code/game/objects/items/weapons/agent_id.dm b/code/game/objects/items/weapons/agent_id.dm index c3c48a09e02ca..da0f82d9a475d 100644 --- a/code/game/objects/items/weapons/agent_id.dm +++ b/code/game/objects/items/weapons/agent_id.dm @@ -52,7 +52,7 @@ untrackable = TRUE access = list(ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS) -/obj/item/card/id/syndicate/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/card/id/syndicate/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, params) if(!proximity_flag) return if(istype(target, /obj/item/card/id)) @@ -127,7 +127,7 @@ ui = new(user, src, "AgentCard", name) ui.open() -/obj/item/card/id/syndicate/attack_self(mob/user) +/obj/item/card/id/syndicate/attack_self__legacy__attackchain(mob/user) if(!ishuman(user)) return if(!registered_human) @@ -289,8 +289,8 @@ if(isAntag(user)) . += "Similar to an agent ID, this ID card can be used to copy accesses, but it lacks the customization and anti-tracking capabilities of an agent ID." -/obj/item/card/id/syndi_scan_only/afterattack(obj/item/O, mob/user, proximity) - if(!proximity) +/obj/item/card/id/syndi_scan_only/afterattack__legacy__attackchain(atom/O, mob/user, proximity_flag, params) + if(!proximity_flag) return if(istype(O, /obj/item/card/id)) var/obj/item/card/id/I = O diff --git a/code/game/objects/items/weapons/alien_specific.dm b/code/game/objects/items/weapons/alien_specific.dm index ed58a1f0a5f56..a5780bc2f34f7 100644 --- a/code/game/objects/items/weapons/alien_specific.dm +++ b/code/game/objects/items/weapons/alien_specific.dm @@ -31,7 +31,7 @@ icon_state = "borg-spray-smoke" list_reagents = list("water" = 50) -/obj/item/reagent_containers/spray/alien/smoke/afterattack(atom/A as mob|obj, mob/user as mob) +/obj/item/reagent_containers/spray/alien/smoke/afterattack__legacy__attackchain(atom/A as mob|obj, mob/user as mob) if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) if(!A.reagents.total_volume && A.reagents) to_chat(user, "\The [A] is empty.") diff --git a/code/game/objects/items/weapons/batons.dm b/code/game/objects/items/weapons/batons.dm index 9430adcb21c61..2e905ae25409c 100644 --- a/code/game/objects/items/weapons/batons.dm +++ b/code/game/objects/items/weapons/batons.dm @@ -35,7 +35,7 @@ /// Whether the baton is toggled on (to allow attacking) var/on = TRUE -/obj/item/melee/classic_baton/attack(mob/living/target, mob/living/user) +/obj/item/melee/classic_baton/attack__legacy__attackchain(mob/living/target, mob/living/user) if(!on) return ..() @@ -184,7 +184,7 @@ force = force_off attack_verb = on ? attack_verb_on : attack_verb_off -/obj/item/melee/classic_baton/telescopic/attack_self(mob/user) +/obj/item/melee/classic_baton/telescopic/attack_self__legacy__attackchain(mob/user) on = !on icon_state = on ? icon_state_on : icon_state_off if(on) diff --git a/code/game/objects/items/weapons/bee_briefcase.dm b/code/game/objects/items/weapons/bee_briefcase.dm index 8575e710b4527..6f34ff42983f9 100644 --- a/code/game/objects/items/weapons/bee_briefcase.dm +++ b/code/game/objects/items/weapons/bee_briefcase.dm @@ -30,7 +30,7 @@ . += "A briefcase filled with deadly bees, you should inject this with a syringe of your own blood before opening it. Exotic blood cannot be used." -/obj/item/bee_briefcase/attackby(obj/item/I, mob/user, params) +/obj/item/bee_briefcase/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/S = I if(!bees_left) @@ -55,7 +55,7 @@ to_chat(user, "You spray [I] into [src].") playsound(loc, 'sound/effects/spray3.ogg', 50, TRUE, -6) -/obj/item/bee_briefcase/attack_self(mob/user) +/obj/item/bee_briefcase/attack_self__legacy__attackchain(mob/user) var/bees_released if(!bees_left) to_chat(user, "The lack of all and any bees at this event has been somewhat of a let-down...") diff --git a/code/game/objects/items/weapons/bio_chips/bio_chip_case.dm b/code/game/objects/items/weapons/bio_chips/bio_chip_case.dm index 96ff2a4a15ebb..1a9e927f57d53 100644 --- a/code/game/objects/items/weapons/bio_chips/bio_chip_case.dm +++ b/code/game/objects/items/weapons/bio_chips/bio_chip_case.dm @@ -43,7 +43,7 @@ var/image/implant_overlay = image('icons/obj/bio_chips.dmi', imp.implant_state) . += implant_overlay -/obj/item/bio_chip_case/attackby(obj/item/W, mob/user) +/obj/item/bio_chip_case/attackby__legacy__attackchain(obj/item/W, mob/user) ..() if(is_pen(W)) diff --git a/code/game/objects/items/weapons/bio_chips/bio_chip_pad.dm b/code/game/objects/items/weapons/bio_chips/bio_chip_pad.dm index 195d8e8364cd1..6aca8065875d3 100644 --- a/code/game/objects/items/weapons/bio_chips/bio_chip_pad.dm +++ b/code/game/objects/items/weapons/bio_chips/bio_chip_pad.dm @@ -26,10 +26,10 @@ else icon_state = "implantpad-off" -/obj/item/bio_chip_pad/attack_self(mob/user) +/obj/item/bio_chip_pad/attack_self__legacy__attackchain(mob/user) ui_interact(user) -/obj/item/bio_chip_pad/attackby(obj/item/bio_chip_case/C, mob/user) +/obj/item/bio_chip_pad/attackby__legacy__attackchain(obj/item/bio_chip_case/C, mob/user) if(istype(C)) addcase(user, C) else diff --git a/code/game/objects/items/weapons/bio_chips/bio_chipper.dm b/code/game/objects/items/weapons/bio_chips/bio_chipper.dm index cc39c68ae3834..25d0b9d7cc39b 100644 --- a/code/game/objects/items/weapons/bio_chips/bio_chipper.dm +++ b/code/game/objects/items/weapons/bio_chips/bio_chipper.dm @@ -21,7 +21,7 @@ icon_state = "implanter0" origin_tech = initial(origin_tech) -/obj/item/bio_chip_implanter/attack(mob/living/carbon/M, mob/user) +/obj/item/bio_chip_implanter/attack__legacy__attackchain(mob/living/carbon/M, mob/user) if(!iscarbon(M)) return if(user && imp) @@ -39,7 +39,7 @@ imp = null update_icon(UPDATE_ICON_STATE) -/obj/item/bio_chip_implanter/attackby(obj/item/W, mob/user, params) +/obj/item/bio_chip_implanter/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(is_pen(W)) rename_interactive(user, W) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index c8558c182c56a..716ed73ca8350 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -38,10 +38,10 @@ flags = NOBLUDGEON flags_2 = NO_MAT_REDEMPTION_2 -/obj/item/card/emag/attack() +/obj/item/card/emag/attack__legacy__attackchain() return -/obj/item/card/emag/afterattack(atom/target, mob/user, proximity) +/obj/item/card/emag/afterattack__legacy__attackchain(atom/target, mob/user, proximity) var/atom/A = target if(!proximity) return @@ -53,7 +53,7 @@ icon_state = "magic_key" origin_tech = "magnets=2" -/obj/item/card/emag/magic_key/afterattack(atom/target, mob/user, proximity) +/obj/item/card/emag/magic_key/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!isairlock(target)) return var/obj/machinery/door/D = target @@ -75,10 +75,10 @@ . = ..() AddComponent(/datum/component/slippery, src, 16 SECONDS, 100) -/obj/item/card/cmag/attack() +/obj/item/card/cmag/attack__legacy__attackchain() return -/obj/item/card/cmag/afterattack(atom/target, mob/user, proximity) +/obj/item/card/cmag/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity) return target.cmag_act(user) @@ -151,7 +151,7 @@ popup.set_content(dat) popup.open() -/obj/item/card/id/attack_self(mob/user as mob) +/obj/item/card/id/attack_self__legacy__attackchain(mob/user as mob) user.visible_message("[user] shows you: [bicon(src)] [name]. The assignment on the card: [assignment]",\ "You flash your ID card: [bicon(src)] [name]. The assignment on the card: [assignment]") if(mining_points) @@ -251,7 +251,7 @@ /obj/item/card/id/proc/get_departments() return get_departments_from_job(rank) -/obj/item/card/id/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/card/id/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) ..() if(istype(W, /obj/item/id_decal/)) @@ -751,7 +751,7 @@ access = list(ACCESS_FREE_GOLEMS, ACCESS_ROBOTICS, ACCESS_CLOWN, ACCESS_MIME, ACCESS_XENOBIOLOGY) //access to robots/mechs var/registered = FALSE -/obj/item/card/id/golem/attack_self(mob/user as mob) +/obj/item/card/id/golem/attack_self__legacy__attackchain(mob/user as mob) if(!registered && ishuman(user)) registered_name = user.real_name SetOwnerInfo(user) diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm index 883dc8def006a..4ff358a88272a 100644 --- a/code/game/objects/items/weapons/caution.dm +++ b/code/game/objects/items/weapons/caution.dm @@ -21,7 +21,7 @@ . = ..() AddComponent(/datum/component/proximity_monitor) -/obj/item/caution/proximity_sign/attack_self(mob/user as mob) +/obj/item/caution/proximity_sign/attack_self__legacy__attackchain(mob/user as mob) if(ishuman(user)) var/mob/living/carbon/human/H = user if(!H.mind.has_antag_datum(/datum/antagonist/traitor) && !IS_MINDSLAVE(H)) @@ -74,7 +74,7 @@ energy_type = /datum/robot_storage/energy/jani_landmine is_cyborg = TRUE -/obj/item/stack/caution/proximity_sign/malf/afterattack(atom/target, mob/user, proximity) +/obj/item/stack/caution/proximity_sign/malf/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!check_allowed_items(target, 1)) return if(!proximity) diff --git a/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm b/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm index 32ef36bb8a6a4..a5205aae1e42a 100644 --- a/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm +++ b/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm @@ -56,7 +56,7 @@ . += mutable_appearance('icons/obj/chemical_flamethrower.dmi', "[chemical_canister.icon_state]_[iterator]") iterator++ -/obj/item/chemical_flamethrower/attack_self(mob/user) +/obj/item/chemical_flamethrower/attack_self__legacy__attackchain(mob/user) . = ..() if(length(canisters)) unequip_canisters(user) @@ -71,7 +71,7 @@ canisters -= canister_to_remove update_icon(UPDATE_OVERLAYS) -/obj/item/chemical_flamethrower/attackby(obj/item/I, mob/user, params) +/obj/item/chemical_flamethrower/attackby__legacy__attackchain(obj/item/I, mob/user, params) . = ..() if(!istype(I, /obj/item/chemical_canister)) to_chat(user, "You can't fit [I] in there!") @@ -112,7 +112,7 @@ canister_fire_applications = round(fire_applications / how_many_canisters, 1) update_icon(UPDATE_OVERLAYS) -/obj/item/chemical_flamethrower/afterattack(atom/target, mob/user, flag) +/obj/item/chemical_flamethrower/afterattack__legacy__attackchain(atom/target, mob/user, flag) . = ..() if(flag || !user) return diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 35efab9e071a7..bdaaceb28fe90 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -72,7 +72,7 @@ LIGHTERS ARE IN LIGHTERS.DM return TRUE return ..() -/obj/item/clothing/mask/cigarette/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/clothing/mask/cigarette/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) if(istype(M) && M.on_fire) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(M) @@ -90,7 +90,7 @@ LIGHTERS ARE IN LIGHTERS.DM light(user, user) return TRUE -/obj/item/clothing/mask/cigarette/afterattack(atom/target, mob/living/user, proximity) +/obj/item/clothing/mask/cigarette/afterattack__legacy__attackchain(atom/target, mob/living/user, proximity) if(!proximity) return @@ -129,7 +129,7 @@ LIGHTERS ARE IN LIGHTERS.DM return ..() -/obj/item/clothing/mask/cigarette/attack_self(mob/user) +/obj/item/clothing/mask/cigarette/attack_self__legacy__attackchain(mob/user) if(lit) user.visible_message( "[user] calmly drops and treads on [src], putting it out instantly.", @@ -176,7 +176,7 @@ LIGHTERS ARE IN LIGHTERS.DM cig.light(user, target) return TRUE -/obj/item/clothing/mask/cigarette/attackby(obj/item/I, mob/living/user, params) +/obj/item/clothing/mask/cigarette/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(I.cigarette_lighter_act(user, user, src)) return @@ -380,7 +380,7 @@ LIGHTERS ARE IN LIGHTERS.DM icon_state = "cig_paper" w_class = WEIGHT_CLASS_TINY -/obj/item/rollingpaper/afterattack(atom/target, mob/user, proximity) +/obj/item/rollingpaper/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity) return @@ -500,7 +500,7 @@ LIGHTERS ARE IN LIGHTERS.DM REMOVE_TRAIT(user, TRAIT_BADASS, HOLO_CIGAR) to_chat(user, "You feel less badass.") -/obj/item/clothing/mask/holo_cigar/attack_self(mob/user) +/obj/item/clothing/mask/holo_cigar/attack_self__legacy__attackchain(mob/user) . = ..() if(enabled) enabled = FALSE @@ -555,7 +555,7 @@ LIGHTERS ARE IN LIGHTERS.DM return smoke() -/obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user) // Extinguishes the pipe. +/obj/item/clothing/mask/cigarette/pipe/attack_self__legacy__attackchain(mob/user) // Extinguishes the pipe. if(lit) user.visible_message( "[user] puts out [src].", @@ -569,7 +569,7 @@ LIGHTERS ARE IN LIGHTERS.DM return // Refill the pipe -/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/mask/cigarette/pipe/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/food/grown)) var/obj/item/food/grown/O = I if(O.dry) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 7a818cc6f47b2..1aa6d6ba99017 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -41,11 +41,11 @@ item_state = "gold_horn" var/cooldown = 0 -/obj/item/bikehorn/golden/attack(mob/M, mob/user) +/obj/item/bikehorn/golden/attack__legacy__attackchain(mob/M, mob/user) flip_mobs(user) return ..() -/obj/item/bikehorn/golden/attack_self(mob/user) +/obj/item/bikehorn/golden/attack_self__legacy__attackchain(mob/user) flip_mobs(user) ..() @@ -81,7 +81,7 @@ actions_types = list(/datum/action/item_action/laugh_track) var/cooldown = 0 -/obj/item/clown_recorder/attack_self(mob/user) +/obj/item/clown_recorder/attack_self__legacy__attackchain(mob/user) if(cooldown > world.time) to_chat(user, "The tape is still winding back.") return diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 90dd8b77f83c0..4b15f6244e5c5 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -58,7 +58,7 @@ colour = pick(lipstick_colors) name = "[colour] lipstick" -/obj/item/lipstick/attack_self(mob/user) +/obj/item/lipstick/attack_self__legacy__attackchain(mob/user) cut_overlays() to_chat(user, "You twist \the [src] [open ? "closed" : "open"].") open = !open @@ -70,7 +70,7 @@ else icon_state = "lipstick" -/obj/item/lipstick/attack(mob/M, mob/user) +/obj/item/lipstick/attack__legacy__attackchain(mob/M, mob/user) if(!open || !istype(M)) return @@ -107,7 +107,7 @@ usesound = 'sound/items/welder2.ogg' toolspeed = 1 -/obj/item/razor/attack(mob/living/carbon/M as mob, mob/user as mob) +/obj/item/razor/attack__legacy__attackchain(mob/living/carbon/M as mob, mob/user as mob) if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/head/C = H.get_organ("head") diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm index fada7d9a400f8..07ba7116a9d9f 100644 --- a/code/game/objects/items/weapons/courtroom.dm +++ b/code/game/objects/items/weapons/courtroom.dm @@ -29,7 +29,7 @@ resistance_flags = FLAMMABLE var/next_gavel_hit -/obj/item/gavelblock/attackby(obj/item/I, mob/user, params) +/obj/item/gavelblock/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/gavelhammer)) return if(world.time > next_gavel_hit) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 688f302d01b95..8ac8075cb39a5 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -97,7 +97,7 @@ if(ishuman(user) && Adjacent(user)) toggle_paddles(user) -/obj/item/defibrillator/attackby(obj/item/W, mob/user, params) +/obj/item/defibrillator/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = W if(cell) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 79ba850f4fe3d..14ca7c6fb5074 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -339,7 +339,7 @@ /obj/item/dice/d20/e20 var/triggered = FALSE -/obj/item/dice/attack_self(mob/user) +/obj/item/dice/attack_self__legacy__attackchain(mob/user) diceroll(user) /obj/item/dice/throw_impact(atom/target) diff --git a/code/game/objects/items/weapons/disks.dm b/code/game/objects/items/weapons/disks.dm index 99629843d98dc..e40c18bbe1b7d 100644 --- a/code/game/objects/items/weapons/disks.dm +++ b/code/game/objects/items/weapons/disks.dm @@ -57,7 +57,7 @@ var/diskcolor = pick(0, 1, 2) icon_state = "datadisk[diskcolor]" -/obj/item/disk/data/attack_self(mob/user) +/obj/item/disk/data/attack_self__legacy__attackchain(mob/user) read_only = !read_only to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index b976673864bef..e4c09eff7eb4c 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -118,7 +118,7 @@ if(H) H.sync_organ_dna(assimilate = 0, old_ue = prev_ue) -/obj/item/dnainjector/attack(mob/M, mob/user) +/obj/item/dnainjector/attack__legacy__attackchain(mob/M, mob/user) if(used) to_chat(user, "This injector is used up!") return diff --git a/code/game/objects/items/weapons/dnascrambler.dm b/code/game/objects/items/weapons/dnascrambler.dm index 3fb6d3d812203..ba362a3a4a235 100644 --- a/code/game/objects/items/weapons/dnascrambler.dm +++ b/code/game/objects/items/weapons/dnascrambler.dm @@ -12,7 +12,7 @@ else icon_state = "lepopen" -/obj/item/dnascrambler/attack(mob/M as mob, mob/user as mob) +/obj/item/dnascrambler/attack__legacy__attackchain(mob/M as mob, mob/user as mob) if(!M || !user) return diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 9ad6b1cc5a3b1..be4d87fd36eb5 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -28,7 +28,7 @@ plastic_overlay_target = null return ..() -/obj/item/grenade/plastic/attackby(obj/item/I, mob/user, params) +/obj/item/grenade/plastic/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!nadeassembly && istype(I, /obj/item/assembly)) var/obj/item/assembly/A = I if(!user.unEquip(I)) @@ -58,9 +58,9 @@ if(nadeassembly) nadeassembly.on_found(finder) -/obj/item/grenade/plastic/attack_self(mob/user) +/obj/item/grenade/plastic/attack_self__legacy__attackchain(mob/user) if(nadeassembly) - nadeassembly.attack_self(user) + nadeassembly.attack_self__legacy__attackchain(user) return var/newtime = input(usr, "Please set the timer.", "Timer", det_time) as num if(user.is_in_active_hand(src)) @@ -68,7 +68,7 @@ det_time = newtime to_chat(user, "Timer set for [det_time] seconds.") -/obj/item/grenade/plastic/afterattack(mob/AM, mob/user, flag) +/obj/item/grenade/plastic/afterattack__legacy__attackchain(mob/AM, mob/user, flag) if(!flag) return if(ismob(AM) && AM.stat == CONSCIOUS) @@ -166,7 +166,7 @@ /// Will the explosion cause a breach. C4 placed on floors will always cause a breach, regardless of this value. var/ex_breach = FALSE -/obj/item/grenade/plastic/c4/afterattack(atom/movable/AM, mob/user, flag) +/obj/item/grenade/plastic/c4/afterattack__legacy__attackchain(atom/movable/AM, mob/user, flag) aim_dir = get_dir(user, AM) ..() diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 5fff7b07f6c67..88ffb6d244701 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -52,12 +52,12 @@ reagents.add_reagent("water", max_water) ADD_TRAIT(src, TRAIT_CAN_POINT_WITH, ROUNDSTART_TRAIT) -/obj/item/extinguisher/attack_self(mob/user as mob) +/obj/item/extinguisher/attack_self__legacy__attackchain(mob/user as mob) safety = !safety icon_state = "[base_icon_state][!safety]" to_chat(user, "You [safety ? "enable" : "disable"] [src]'s safety.") -/obj/item/extinguisher/attack_obj(obj/O, mob/living/user, params) +/obj/item/extinguisher/attack_obj__legacy__attackchain(obj/O, mob/living/user, params) if(AttemptRefill(O, user)) refilling = TRUE return FALSE @@ -85,7 +85,7 @@ safety = old_safety return TRUE -/obj/item/extinguisher/afterattack(atom/target, mob/user, flag) +/obj/item/extinguisher/afterattack__legacy__attackchain(atom/target, mob/user, flag) . = ..() //TODO; Add support for reagents in water. if(target.loc == user)//No more spraying yourself when putting your extinguisher away diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index f496e5fdb3d71..b1f9f9557cf94 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -74,7 +74,7 @@ else return TRUE -/obj/item/flamethrower/attack(mob/living/target, mob/living/user) +/obj/item/flamethrower/attack__legacy__attackchain(mob/living/target, mob/living/user) if(!cigarette_lighter_act(user, target)) return ..() @@ -121,7 +121,7 @@ cig.light(user, target) return TRUE -/obj/item/flamethrower/afterattack(atom/target, mob/user, flag) +/obj/item/flamethrower/afterattack__legacy__attackchain(atom/target, mob/user, flag) . = ..() if(flag) return // too close @@ -140,7 +140,7 @@ add_attack_logs(user, target, "Flamethrowered at [target.x],[target.y],[target.z]") flame_turf(turflist) -/obj/item/flamethrower/attackby(obj/item/I, mob/user, params) +/obj/item/flamethrower/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(isigniter(I)) var/obj/item/assembly/igniter/IG = I if(IG.secured) @@ -206,7 +206,7 @@ return ptank.return_analyzable_air() return null -/obj/item/flamethrower/attack_self(mob/user) +/obj/item/flamethrower/attack_self__legacy__attackchain(mob/user) toggle_igniter(user) /obj/item/flamethrower/AltClick(mob/user) @@ -269,7 +269,7 @@ operating = FALSE for(var/mob/M in viewers(1, loc)) if(M.client && M.machine == src) - attack_self(M) + attack_self__legacy__attackchain(M) /obj/item/flamethrower/proc/default_ignite(turf/target, release_amount = 0.05) diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm index cc70eb9816af3..a36a2be9779ac 100644 --- a/code/game/objects/items/weapons/garrote.dm +++ b/code/game/objects/items/weapons/garrote.dm @@ -52,7 +52,7 @@ STOP_PROCESSING(SSobj, src) -/obj/item/garrote/attack(mob/living/carbon/M as mob, mob/user as mob) +/obj/item/garrote/attack__legacy__attackchain(mob/living/carbon/M as mob, mob/user as mob) if(garrote_time > world.time) // Cooldown return @@ -84,7 +84,7 @@ to_chat(user, "You cannot use [src] on two people at once!") return - attack_self(user) + attack_self__legacy__attackchain(user) U.swap_hand() // For whatever reason the grab will not properly work if we don't have the free hand active. var/obj/item/grab/G = M.grabbedby(U, 1) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index c43c9cf486325..a8f28a7eab7e6 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -25,7 +25,7 @@ icon_state = "gift[pick(1, 2, 3)]" return -/obj/item/gift/attack_self(mob/user as mob) +/obj/item/gift/attack_self__legacy__attackchain(mob/user as mob) user.drop_item() if(src.gift) user.put_in_active_hand(gift) @@ -39,7 +39,7 @@ return to_chat(user, "You can't move.") -/obj/effect/spresent/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/effect/spresent/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) ..() if(!istype(W, /obj/item/wirecutters)) @@ -53,7 +53,7 @@ qdel(src) -/obj/item/a_gift/attack_self(mob/M as mob) +/obj/item/a_gift/attack_self__legacy__attackchain(mob/M as mob) var/gift_type = pick(/obj/item/sord, /obj/item/storage/wallet, /obj/item/storage/photo_album, @@ -138,5 +138,5 @@ max_amount = 25 resistance_flags = FLAMMABLE -/obj/item/stack/wrapping_paper/attack_self(mob/user) +/obj/item/stack/wrapping_paper/attack_self__legacy__attackchain(mob/user) to_chat(user, "You need to use it on a package that has already been wrapped!") diff --git a/code/game/objects/items/weapons/grenades/bananade.dm b/code/game/objects/items/weapons/grenades/bananade.dm index 11504ffde14f0..4d404ac862c88 100644 --- a/code/game/objects/items/weapons/grenades/bananade.dm +++ b/code/game/objects/items/weapons/grenades/bananade.dm @@ -37,13 +37,13 @@ /obj/item/grenade/bananade/casing/attack_hand() return // No activating an empty grenade -/obj/item/grenade/bananade/casing/attack_self() +/obj/item/grenade/bananade/casing/attack_self__legacy__attackchain() return // Stop trying to break stuff /obj/item/grenade/bananade/casing/prime() return // The grenade isnt completed yet, dont even try to blow it up -/obj/item/grenade/bananade/casing/attackby(obj/item/I, mob/user, params) +/obj/item/grenade/bananade/casing/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/grown/bananapeel)) if(deliveryamt < 9) to_chat(user, "You add another banana peel to the assembly.") diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 9f468b673fd1f..82acfec372359 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -89,12 +89,12 @@ underlays += "[O]_r" -/obj/item/grenade/chem_grenade/attack_self(mob/user) +/obj/item/grenade/chem_grenade/attack_self__legacy__attackchain(mob/user) if(stage == READY && !active) var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) if(nadeassembly) - nadeassembly.attack_self(user) + nadeassembly.attack_self__legacy__attackchain(user) update_icon(UPDATE_ICON_STATE) else if(clown_check(user)) // This used to go before the assembly check, but that has absolutely zero to do with priming the damn thing. You could spam the admins with it. @@ -124,7 +124,7 @@ return TRUE return ..() -/obj/item/grenade/chem_grenade/attackby(obj/item/I, mob/user, params) +/obj/item/grenade/chem_grenade/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I,/obj/item/hand_labeler)) var/obj/item/hand_labeler/HL = I if(length(HL.label)) @@ -360,7 +360,7 @@ //I tried to just put it in the allowed_containers list but //if you do that it must have reagents. If you're going to //make a special case you might as well do it explicitly. -Sayu -/obj/item/grenade/chem_grenade/large/attackby(obj/item/I, mob/user, params) +/obj/item/grenade/chem_grenade/large/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/slime_extract) && stage == WIRED) to_chat(user, "You add [I] to the assembly.") user.drop_item() diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index 462a9b722356a..2fa8456663865 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -42,7 +42,7 @@ underlays += can_underlay -/obj/item/grenade/iedcasing/attack_self(mob/user) // +/obj/item/grenade/iedcasing/attack_self__legacy__attackchain(mob/user) // if(!active) if(clown_check(user)) to_chat(user, "You light [src]!") diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index b51fb00bfd49e..eb6015b3835ad 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -55,7 +55,7 @@ return FALSE return TRUE -/obj/item/grenade/attack_self(mob/user as mob) +/obj/item/grenade/attack_self__legacy__attackchain(mob/user as mob) if(active) return if(!clown_check(user)) diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm index cf3629985c3dd..4bd01c7f8838d 100644 --- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm +++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm @@ -19,7 +19,7 @@ if(HAS_TRAIT(user, TRAIT_CLUMSY)) . += "There are small glue ejectors all over the bomb." -/obj/item/grenade/syndieminibomb/fake/attack_self(mob/user) +/obj/item/grenade/syndieminibomb/fake/attack_self__legacy__attackchain(mob/user) if(!active) flags |= NODROP to_chat(user, "As you activate the bomb, it emits a substance that sticks to your hand! It won't come off!") @@ -33,7 +33,7 @@ icon_state = "pen" item_state = "pen" -/obj/item/grenade/syndieminibomb/pen/attack_self(mob/user) +/obj/item/grenade/syndieminibomb/pen/attack_self__legacy__attackchain(mob/user) if(!active) visible_message("[user] fumbles with [src]!") . = ..() diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index cc6288bb74c52..6f53ae837093d 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -58,7 +58,7 @@ /// If set to TRUE, people with the TRAIT_CLUMSY won't cuff themselves when trying to cuff others. var/ignoresClumsy = FALSE -/obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/user) +/obj/item/restraints/handcuffs/attack__legacy__attackchain(mob/living/carbon/C, mob/user) if(!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") return @@ -214,8 +214,6 @@ materials = list() trashtype = /obj/item/restraints/handcuffs/cable/zipties/used - - /obj/item/restraints/handcuffs/cable/zipties/used desc = "A pair of broken zipties." icon_state = "cablecuff_used" @@ -227,7 +225,7 @@ return TRUE return ..() -/obj/item/restraints/handcuffs/cable/zipties/used/attack() +/obj/item/restraints/handcuffs/cable/zipties/used/attack__legacy__attackchain() return ////////////////////////////// @@ -264,7 +262,7 @@ ////////////////////////////// // MARK: CRAFTING ////////////////////////////// -/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params) +/obj/item/restraints/handcuffs/cable/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() handle_attack_construction(I, user) @@ -305,7 +303,7 @@ var/obj/item/toy/crayon/C = I cable_color(C.dye_color) -/obj/item/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user) +/obj/item/restraints/handcuffs/cable/zipties/cyborg/attack__legacy__attackchain(mob/living/carbon/C, mob/user) if(isrobot(user)) cuff(C, user, FALSE) diff --git a/code/game/objects/items/weapons/holosign_projector.dm b/code/game/objects/items/weapons/holosign_projector.dm index 5d30939ad2e93..a105715320ae1 100644 --- a/code/game/objects/items/weapons/holosign_projector.dm +++ b/code/game/objects/items/weapons/holosign_projector.dm @@ -18,7 +18,7 @@ var/holosign_type = null var/holocreator_busy = FALSE //to prevent placing multiple holo barriers at once -/obj/item/holosign_creator/afterattack(atom/target, mob/user, flag) +/obj/item/holosign_creator/afterattack__legacy__attackchain(atom/target, mob/user, flag) if(flag) if(!check_allowed_items(target, 1)) return @@ -50,10 +50,10 @@ else to_chat(user, "[src] is projecting at max capacity!") -/obj/item/holosign_creator/attack(mob/living/carbon/human/M, mob/user) +/obj/item/holosign_creator/attack__legacy__attackchain(mob/living/carbon/human/M, mob/user) return -/obj/item/holosign_creator/attack_self(mob/user) +/obj/item/holosign_creator/attack_self__legacy__attackchain(mob/user) if(length(signs)) for(var/H in signs) qdel(H) @@ -80,7 +80,7 @@ . += "Alt Click to [wet_enabled ? "deactivate" : "activate"] its built-in wet evaporation timer." -/obj/item/holosign_creator/janitor/afterattack(atom/target, mob/user, flag) +/obj/item/holosign_creator/janitor/afterattack__legacy__attackchain(atom/target, mob/user, flag) var/obj/structure/holosign/wetsign/WS = ..() if(WS && wet_enabled) WS.wet_timer_start(src) @@ -127,7 +127,7 @@ holosign_type = /obj/structure/holosign/barrier/cyborg var/shock = 0 -/obj/item/holosign_creator/cyborg/attack_self(mob/user) +/obj/item/holosign_creator/cyborg/attack_self__legacy__attackchain(mob/user) if(isrobot(user)) var/mob/living/silicon/robot/R = user diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 12333965c90ac..a1179c681676c 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -35,7 +35,7 @@ user.visible_message("[user] is killing [user.p_themselves()] with \the [src.name]! It looks like [user.p_theyre()] trying to get closer to god!") return BRUTELOSS|FIRELOSS -/obj/item/nullrod/attack(mob/M, mob/living/carbon/user) +/obj/item/nullrod/attack__legacy__attackchain(mob/M, mob/living/carbon/user) ..() var/datum/antagonist/vampire/V = M.mind?.has_antag_datum(/datum/antagonist/vampire) if(ishuman(M) && V && HAS_MIND_TRAIT(M, TRAIT_HOLY)) @@ -62,7 +62,7 @@ throw_at(get_edge_target_turf(user, pick(GLOB.alldirs)), rand(1, 3), 5) -/obj/item/nullrod/attack_self(mob/user) +/obj/item/nullrod/attack_self__legacy__attackchain(mob/user) if(HAS_MIND_TRAIT(user, TRAIT_HOLY) && !reskinned) reskin_holy_weapon(user) @@ -293,7 +293,7 @@ obj_integrity = 100 var/possessed = FALSE -/obj/item/nullrod/scythe/talking/attack_self(mob/living/user) +/obj/item/nullrod/scythe/talking/attack_self__legacy__attackchain(mob/living/user) if(possessed) return @@ -329,7 +329,7 @@ qdel(S) return ..() -/obj/item/nullrod/scythe/talking/attackby(obj/item/I, mob/user, params) +/obj/item/nullrod/scythe/talking/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/soulstone) || !possessed) return ..() if(obj_integrity >= max_integrity) @@ -473,7 +473,7 @@ hitsound = 'sound/weapons/bite.ogg' var/used_blessing = FALSE -/obj/item/nullrod/carp/attack_self(mob/living/user) +/obj/item/nullrod/carp/attack_self__legacy__attackchain(mob/living/user) if(used_blessing) return if(user.mind && !HAS_MIND_TRAIT(user, TRAIT_HOLY)) @@ -546,7 +546,7 @@ throwforce = 0 var/praying = FALSE -/obj/item/nullrod/rosary/attack(mob/living/carbon/M, mob/living/carbon/user) +/obj/item/nullrod/rosary/attack__legacy__attackchain(mob/living/carbon/M, mob/living/carbon/user) if(!iscarbon(M)) return ..() @@ -603,7 +603,7 @@ var/ghostcall_CD = 0 -/obj/item/nullrod/salt/attack_self(mob/user) +/obj/item/nullrod/salt/attack_self__legacy__attackchain(mob/user) if(!user.mind || !HAS_MIND_TRAIT(user, TRAIT_HOLY)) to_chat(user, "You are not close enough with [SSticker.Bible_deity_name] to use [src].") @@ -699,7 +699,7 @@ robes = null return ..() -/obj/item/nullrod/missionary_staff/attack_self(mob/user) +/obj/item/nullrod/missionary_staff/attack_self__legacy__attackchain(mob/user) if(robes) //as long as it is linked, sec can't try to meta by stealing your staff and seeing if they get the link error message return FALSE if(!ishuman(user)) //prevents the horror (runtimes) of missionary xenos and other non-human mobs that might be able to activate the item @@ -719,7 +719,7 @@ to_chat(missionary, "You must be wearing the missionary robes you wish to link with this staff.") return FALSE -/obj/item/nullrod/missionary_staff/afterattack(mob/living/carbon/human/target, mob/living/carbon/human/missionary, flag, params) +/obj/item/nullrod/missionary_staff/afterattack__legacy__attackchain(mob/living/carbon/human/target, mob/living/carbon/human/missionary, flag, params) if(!ishuman(target) || !ishuman(missionary)) //ishuman checks return if(target == missionary) //you can't convert yourself, that would raise too many questions about your own dedication to the cause diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 69066ea45d37a..c176eea3c8d0e 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -44,7 +44,7 @@ create_reagents(5) -/obj/item/kitchen/utensil/attack(mob/living/carbon/C, mob/living/carbon/user) +/obj/item/kitchen/utensil/attack__legacy__attackchain(mob/living/carbon/C, mob/living/carbon/user) if(!istype(C)) return ..() diff --git a/code/game/objects/items/weapons/knuckledusters.dm b/code/game/objects/items/weapons/knuckledusters.dm index e8981aa5e67ea..b9af92f84a816 100644 --- a/code/game/objects/items/weapons/knuckledusters.dm +++ b/code/game/objects/items/weapons/knuckledusters.dm @@ -19,7 +19,7 @@ /// How much organ damage can the weapon do? var/trauma = 5 -/obj/item/melee/knuckleduster/attack_self(mob/user) +/obj/item/melee/knuckleduster/attack_self__legacy__attackchain(mob/user) if(!gripped) gripped = TRUE to_chat(user, "You tighten your grip on [src], ensuring you won't drop it.") @@ -34,7 +34,7 @@ gripped = FALSE flags &= ~(NODROP | ABSTRACT) -/obj/item/melee/knuckleduster/attack(mob/living/target, mob/living/user) +/obj/item/melee/knuckleduster/attack__legacy__attackchain(mob/living/target, mob/living/user) . = ..() hitsound = pick('sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg') if(!ishuman(target) || QDELETED(target)) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index c6ce59d40b29a..146695a515a77 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -39,7 +39,7 @@ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, TRUE, -1) return BRUTELOSS -/obj/item/restraints/legcuffs/beartrap/attack_self(mob/user) +/obj/item/restraints/legcuffs/beartrap/attack_self__legacy__attackchain(mob/user) ..() if(!ishuman(user) || user.restrained()) @@ -50,7 +50,7 @@ update_icon(UPDATE_ICON_STATE) to_chat(user, "[src] is now [armed ? "armed" : "disarmed"]") -/obj/item/restraints/legcuffs/beartrap/attackby(obj/item/I, mob/user) //Let's get explosive. +/obj/item/restraints/legcuffs/beartrap/attackby__legacy__attackchain(obj/item/I, mob/user) //Let's get explosive. if(istype(I, /obj/item/grenade/iedcasing)) if(IED) to_chat(user, "This beartrap already has an IED hooked up to it!") diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm index 4c295e6bf2b31..1f1d539a9edbc 100644 --- a/code/game/objects/items/weapons/lighters.dm +++ b/code/game/objects/items/weapons/lighters.dm @@ -30,7 +30,7 @@ lighter_color = pick("r","c","y","g") update_icon() -/obj/item/lighter/attack_self(mob/living/user) +/obj/item/lighter/attack_self__legacy__attackchain(mob/living/user) . = ..() if(!lit) turn_on_lighter(user) @@ -96,7 +96,7 @@ playsound(src, 'sound/items/lighter/plastic_close.ogg', 25, TRUE) next_off_message = world.time + 5 SECONDS -/obj/item/lighter/attack(mob/living/target, mob/living/user) +/obj/item/lighter/attack__legacy__attackchain(mob/living/target, mob/living/user) if(cigarette_lighter_act(user, target)) return @@ -315,7 +315,7 @@ else return TRUE -/obj/item/match/attack(mob/living/target, mob/living/user) +/obj/item/match/attack__legacy__attackchain(mob/living/target, mob/living/user) if(cigarette_lighter_act(user, target)) return diff --git a/code/game/objects/items/weapons/melee/energy_melee_weapons.dm b/code/game/objects/items/weapons/melee/energy_melee_weapons.dm index 8391118d92bc1..de97b9b90c56f 100644 --- a/code/game/objects/items/weapons/melee/energy_melee_weapons.dm +++ b/code/game/objects/items/weapons/melee/energy_melee_weapons.dm @@ -57,7 +57,7 @@ UnregisterSignal(src, COMSIG_ITEM_SHARPEN_ACT) return ..() -/obj/item/melee/energy/attack(mob/living/target, mob/living/user) +/obj/item/melee/energy/attack__legacy__attackchain(mob/living/target, mob/living/user) if(cigarette_lighter_act(user, target)) return @@ -109,7 +109,7 @@ "[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS|FIRELOSS -/obj/item/melee/energy/attack_self(mob/living/carbon/user) +/obj/item/melee/energy/attack_self__legacy__attackchain(mob/living/carbon/user) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) to_chat(user, "You accidentally cut yourself with [src], like a doofus!") user.take_organ_damage(5,5) @@ -234,11 +234,11 @@ /obj/item/melee/energy/sword/cyborg var/hitcost = 50 -/obj/item/melee/energy/sword/cyborg/attack(mob/M, mob/living/silicon/robot/R) +/obj/item/melee/energy/sword/cyborg/attack__legacy__attackchain(mob/M, mob/living/silicon/robot/R) if(R.cell) var/obj/item/stock_parts/cell/C = R.cell if(HAS_TRAIT(src, TRAIT_ITEM_ACTIVE) && !(C.use(hitcost))) - attack_self(R) + attack_self__legacy__attackchain(R) to_chat(R, "It's out of charge!") return ..() @@ -266,7 +266,7 @@ /obj/item/melee/energy/sword/saber/red item_color = "red" -/obj/item/melee/energy/sword/saber/attackby(obj/item/W, mob/living/user, params) +/obj/item/melee/energy/sword/saber/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) ..() if(istype(W, /obj/item/melee/energy/sword/saber)) if(W == src) @@ -377,7 +377,7 @@ . = ..() ADD_TRAIT(src, TRAIT_ITEM_ACTIVE, ROUNDSTART_TRAIT) -/obj/item/melee/energy/blade/attack_self(mob/user) +/obj/item/melee/energy/blade/attack_self__legacy__attackchain(mob/user) return /obj/item/melee/energy/blade/hardlight @@ -428,7 +428,7 @@ else B.add_bleed(B.bleed_buildup) -/obj/item/melee/energy/cleaving_saw/attack_self(mob/living/carbon/user) +/obj/item/melee/energy/cleaving_saw/attack_self__legacy__attackchain(mob/living/carbon/user) transform_weapon(user) /obj/item/melee/energy/cleaving_saw/proc/transform_weapon(mob/living/user, supress_message_text) @@ -498,7 +498,7 @@ if(!HAS_TRAIT(src, TRAIT_ITEM_ACTIVE)) user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly -/obj/item/melee/energy/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user) +/obj/item/melee/energy/cleaving_saw/attack__legacy__attackchain(mob/living/target, mob/living/carbon/human/user) if(!HAS_TRAIT(src, TRAIT_ITEM_ACTIVE) || swiping || !target.density || get_turf(target) == get_turf(user)) if(!HAS_TRAIT(src, TRAIT_ITEM_ACTIVE)) faction_bonus_force = 0 diff --git a/code/game/objects/items/weapons/melee/melee_misc.dm b/code/game/objects/items/weapons/melee/melee_misc.dm index c051715815d76..8c8f6851c40cd 100644 --- a/code/game/objects/items/weapons/melee/melee_misc.dm +++ b/code/game/objects/items/weapons/melee/melee_misc.dm @@ -180,12 +180,12 @@ user.remove_status_effect(STATUS_EFFECT_BREACH_AND_CLEAVE) update_icon(UPDATE_ICON_STATE) -/obj/item/melee/breach_cleaver/attack_obj(obj/O, mob/living/user, params) +/obj/item/melee/breach_cleaver/attack_obj__legacy__attackchain(obj/O, mob/living/user, params) if(!HAS_TRAIT(src, TRAIT_WIELDED)) // Only works good when wielded return ..() if(!ismachinery(O) && !isstructure(O)) // This sword hates doors return ..() - if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ) + if(SEND_SIGNAL(src, COMSIG_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ) return if(flags & (NOBLUDGEON)) return @@ -197,7 +197,7 @@ damage += H.physiology.melee_bonus O.take_damage(damage * 3, BRUTE, MELEE, TRUE, get_dir(src, H), 30) // Multiplied to do big damage to doors, closets, windows, and machines, but normal damage to mobs. -/obj/item/melee/breach_cleaver/attack(mob/target, mob/living/user) +/obj/item/melee/breach_cleaver/attack__legacy__attackchain(mob/target, mob/living/user) if(!HAS_TRAIT(src, TRAIT_WIELDED) || !ishuman(target)) return ..() @@ -286,7 +286,7 @@ /obj/item/queen_bee)) strong_against -= /mob/living/simple_animal/hostile/poison/bees/syndi // Syndi-bees have special anti-flyswatter tech installed -/obj/item/melee/flyswatter/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/melee/flyswatter/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) . = ..() if(is_type_in_typecache(M, strong_against)) new /obj/effect/decal/cleanable/insectguts(M.drop_location()) @@ -324,11 +324,11 @@ QDEL_NULL(enchant) return ..() -/obj/item/melee/spellblade/afterattack(atom/target, mob/user, proximity, params) +/obj/item/melee/spellblade/afterattack__legacy__attackchain(atom/target, mob/user, proximity, params) . = ..() enchant?.on_hit(target, user, proximity, src) -/obj/item/melee/spellblade/attack_self(mob/user) +/obj/item/melee/spellblade/attack_self__legacy__attackchain(mob/user) if(enchant) return diff --git a/code/game/objects/items/weapons/misc_items.dm b/code/game/objects/items/weapons/misc_items.dm index d579201359620..90905dcdbb8d8 100644 --- a/code/game/objects/items/weapons/misc_items.dm +++ b/code/game/objects/items/weapons/misc_items.dm @@ -71,7 +71,7 @@ icon_state = "crutches0" return ..() -/obj/item/crutches/attackby(obj/item/I, mob/user, params) +/obj/item/crutches/attackby__legacy__attackchain(obj/item/I, mob/user, params) . = ..() if(!is_open) return @@ -160,7 +160,7 @@ ..() icon_state = "1" -/obj/item/lightning/afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) +/obj/item/lightning/afterattack__legacy__attackchain(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) var/angle = get_angle(A, user) //to_chat(world, angle) angle = round(angle) + 45 @@ -204,7 +204,7 @@ hitsound = 'sound/weapons/ring.ogg' var/cooldown = 0 -/obj/item/phone/attack_self(mob/user) +/obj/item/phone/attack_self__legacy__attackchain(mob/user) if(cooldown < world.time - 20) playsound(user.loc, 'sound/weapons/ring.ogg', 50, 1) cooldown = world.time diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index fc49d051a0472..82fce2da025a2 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -45,7 +45,7 @@ to_chat(user, "You wet [src] in [O].") playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) -/obj/item/mop/afterattack(atom/A, mob/user, proximity) +/obj/item/mop/afterattack__legacy__attackchain(atom/A, mob/user, proximity) if(!proximity) return if(istype(A, /obj/item/reagent_containers/glass/bucket) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/structure/mopbucket)) @@ -70,7 +70,7 @@ reagents.reaction(T, REAGENT_TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. reagents.remove_any(1) //reaction() doesn't use up the reagents -/obj/effect/attackby(obj/item/I, mob/user, params) +/obj/effect/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/mop) || istype(I, /obj/item/soap)) return else @@ -100,7 +100,7 @@ ..() START_PROCESSING(SSobj, src) -/obj/item/mop/advanced/attack_self(mob/user) +/obj/item/mop/advanced/attack_self__legacy__attackchain(mob/user) refill_enabled = !refill_enabled if(refill_enabled) START_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/weapons/paint_bucket.dm b/code/game/objects/items/weapons/paint_bucket.dm index 85435b23f1440..4dc67b6b783bc 100644 --- a/code/game/objects/items/weapons/paint_bucket.dm +++ b/code/game/objects/items/weapons/paint_bucket.dm @@ -16,7 +16,7 @@ container_type = OPENCONTAINER blocks_emissive = EMISSIVE_BLOCK_GENERIC -/obj/item/reagent_containers/glass/paint/afterattack(turf/simulated/target, mob/user, proximity) +/obj/item/reagent_containers/glass/paint/afterattack__legacy__attackchain(turf/simulated/target, mob/user, proximity) if(!proximity) return if(!is_open_container()) diff --git a/code/game/objects/items/weapons/paiwire.dm b/code/game/objects/items/weapons/paiwire.dm index 5206005e089da..05f2ea5dc9f45 100644 --- a/code/game/objects/items/weapons/paiwire.dm +++ b/code/game/objects/items/weapons/paiwire.dm @@ -7,5 +7,5 @@ else user.visible_message("[user] dumbly fumbles to find a place on [M] to plug in [src].", "There aren't any ports on [M] that match the jack belonging to [src].") -/obj/item/pai_cable/attack(obj/machinery/M as obj, mob/user as mob) +/obj/item/pai_cable/attack__legacy__attackchain(obj/machinery/M as obj, mob/user as mob) src.plugin(M, user) diff --git a/code/game/objects/items/weapons/picket_signs.dm b/code/game/objects/items/weapons/picket_signs.dm index aa928f6c7fd17..53dcfb45e4f28 100644 --- a/code/game/objects/items/weapons/picket_signs.dm +++ b/code/game/objects/items/weapons/picket_signs.dm @@ -12,7 +12,7 @@ var/label = "" -/obj/item/picket_sign/attackby(obj/item/W, mob/user, params) +/obj/item/picket_sign/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(is_pen(W) || istype(W, /obj/item/toy/crayon)) var/txt = tgui_input_text(user, "What would you like to write on the sign?", "Sign Label", max_length = 30) if(isnull(txt)) @@ -22,7 +22,7 @@ desc = "It reads: [label]" ..() -/obj/item/picket_sign/attack_self(mob/living/carbon/human/user) +/obj/item/picket_sign/attack_self__legacy__attackchain(mob/living/carbon/human/user) if(delayed) user.show_message("Your arm is too tired to do that again so soon!") return diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 75b9ee1294395..b82481a841bd3 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -75,7 +75,7 @@ pressure_setting++ to_chat(user, "You tweak [src]'s pressure output to [pressure_setting].") -/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/user, params) +/obj/item/pneumatic_cannon/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(istype(W, /obj/item/tank/internals) && !tank) if(istype(W, /obj/item/tank/internals/emergency_oxygen)) @@ -92,7 +92,7 @@ remove_tank(user) return TRUE -/obj/item/pneumatic_cannon/afterattack(atom/target, mob/living/carbon/human/user, flag, params) +/obj/item/pneumatic_cannon/afterattack__legacy__attackchain(atom/target, mob/living/carbon/human/user, flag, params) if(isstorage(target)) //So you can store it in backpacks return ..() if(istype(target, /obj/structure/rack)) //So you can store it on racks diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm index 5e86f27a5d081..f7cec8da4f0fc 100644 --- a/code/game/objects/items/weapons/powerfist.dm +++ b/code/game/objects/items/weapons/powerfist.dm @@ -30,7 +30,7 @@ else if(tank) . += "[bicon(tank)] It has [tank] mounted onto it." -/obj/item/melee/powerfist/attackby(obj/item/W, mob/user, params) +/obj/item/melee/powerfist/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/tank/internals)) if(!user.is_holding(src)) to_chat(user, "You have to hold [src] in your hand!") @@ -87,7 +87,7 @@ flags |= NODROP -/obj/item/melee/powerfist/attack(mob/living/target, mob/living/user) +/obj/item/melee/powerfist/attack__legacy__attackchain(mob/living/target, mob/living/user) if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "You don't want to harm other living beings!") return diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index bc55bdcf4c6f7..a7795aff20a3e 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -211,7 +211,7 @@ return // TGUI stuff -/obj/item/rpd/attack_self(mob/user) +/obj/item/rpd/attack_self__legacy__attackchain(mob/user) ui_interact(user) /obj/item/rpd/ui_state(mob/user) @@ -304,7 +304,7 @@ return //Either nothing was selected, or an invalid mode was selected to_chat(user, "You set [src]'s mode.") -/obj/item/rpd/afterattack(atom/target, mob/user, proximity) +/obj/item/rpd/afterattack__legacy__attackchain(atom/target, mob/user, proximity) ..() if(isstorage(target)) var/obj/item/storage/S = target @@ -355,7 +355,7 @@ user.Beam(T, icon_state = "rped_upgrade", icon = 'icons/effects/effects.dmi', time = 0.5 SECONDS) T.rpd_act(user, src) -/obj/item/rpd/attack_obj(obj/O, mob/living/user) +/obj/item/rpd/attack_obj__legacy__attackchain(obj/O, mob/living/user) if(user.a_intent != INTENT_HARM) if(istype(O, /obj/machinery/atmospherics/pipe)) return diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm index fc6ccffb4606f..b4fdb6b0ea2e4 100644 --- a/code/game/objects/items/weapons/scissors.dm +++ b/code/game/objects/items/weapons/scissors.dm @@ -18,7 +18,7 @@ attack_verb = list("beautifully sliced", "artistically cut", "smoothly stabbed", "quickly jabbed") toolspeed = 0.75 -/obj/item/scissors/attack(mob/living/carbon/M as mob, mob/user as mob) +/obj/item/scissors/attack__legacy__attackchain(mob/living/carbon/M as mob, mob/user as mob) if(user.a_intent != INTENT_HELP) ..() return diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 4da6b3284ac03..375f4d3acdd25 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -21,7 +21,7 @@ . += "Number of uses: [uses]. This scroll will vanish after the final use." . += "P.S. Don't forget to bring your gear, you'll need it to cast most spells." -/obj/item/teleportation_scroll/attack_self(mob/living/user) +/obj/item/teleportation_scroll/attack_self__legacy__attackchain(mob/living/user) if(!uses) //somehow? to_chat(user, "You attempt to read the scroll but it disintegrates in your hand, it appears that is has run out of charges!") qdel(src) diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index de8e2279f08a0..fa2ec1c9fdea4 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -45,7 +45,7 @@ AddComponent(/datum/component/caltrop, force) set_initial_icon_state() -/obj/item/shard/afterattack(atom/movable/AM, mob/user, proximity) +/obj/item/shard/afterattack__legacy__attackchain(atom/movable/AM, mob/user, proximity) if(!proximity || !(src in user)) return if(isturf(AM)) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index f5c0ccbcb1f08..87e84330eab45 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -33,7 +33,7 @@ var/cooldown = 0 //shield bash cooldown. based on world.time var/list/allowed_bashers = list(/obj/item/melee/baton, /obj/item/kitchen/knife/combat) -/obj/item/shield/riot/attackby(obj/item/W, mob/user, params) +/obj/item/shield/riot/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(is_type_in_list(W, allowed_bashers)) if(cooldown < world.time - 2.5 SECONDS) user.visible_message("[user] bashes [src] with [W]!") @@ -96,7 +96,7 @@ /obj/item/shield/energy/IsReflect() return (active) -/obj/item/shield/energy/attack_self(mob/living/carbon/human/user) +/obj/item/shield/energy/attack_self__legacy__attackchain(mob/living/carbon/human/user) toggle(user, FALSE) /obj/item/shield/energy/proc/toggle(mob/living/carbon/human/user, forced) @@ -148,7 +148,7 @@ return ..() return FALSE // by not calling the parent the hit_reaction signal is never sent -/obj/item/shield/riot/tele/attack_self(mob/living/user) +/obj/item/shield/riot/tele/attack_self__legacy__attackchain(mob/living/user) if(HAS_TRAIT(src, TRAIT_ITEM_ACTIVE)) REMOVE_TRAIT(src,TRAIT_ITEM_ACTIVE, TRAIT_GENERIC) force = 3 diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 7b7cf35ccc35c..b0f9180a6812e 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -19,7 +19,7 @@ . = ..() AddComponent(/datum/component/slippery, src, 8 SECONDS, 100, 0, FALSE) -/obj/item/soap/afterattack(atom/target, mob/user, proximity) +/obj/item/soap/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity) return if(user.zone_selected == "mouth" && ishuman(target)) // cleaning out someone's mouth is a different act @@ -58,7 +58,7 @@ else . += "[src] has been eaten down to a sliver!" -/obj/item/soap/attack(mob/target as mob, mob/user as mob) +/obj/item/soap/attack__legacy__attackchain(mob/target as mob, mob/user as mob) if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_selected == "mouth") user.visible_message("[user] starts washing [target]'s mouth out with [name]!") if(do_after(user, cleanspeed, target = target)) @@ -83,7 +83,7 @@ desc = "A homemade bar of soap. It seems to be gibs and tape..Will this clean anything?" icon_state = "soapgibs" -/obj/item/soap/ducttape/afterattack(atom/target, mob/user as mob, proximity) +/obj/item/soap/ducttape/afterattack__legacy__attackchain(atom/target, mob/user as mob, proximity) if(!proximity) return if(user.client && (target in user.client.screen)) diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index f64fdee6ca744..4f1f9ed227602 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -49,7 +49,7 @@ animate(user, pixel_y = pixel_y, time = 10, loop = 1, easing = SINE_EASING) animate(user) -/obj/item/staff/broom/attackby(obj/O, mob/user) +/obj/item/staff/broom/attackby__legacy__attackchain(obj/O, mob/user) if(istype(O, /obj/item/clothing/mask/horsehead)) new/obj/item/staff/broom/horsebroom(get_turf(src)) user.unEquip(O) @@ -69,7 +69,7 @@ icon_state = "horsebroom" item_state = "horsebroom0" -/obj/item/staff/broom/horsebroom/attack_self(mob/user as mob) +/obj/item/staff/broom/horsebroom/attack_self__legacy__attackchain(mob/user as mob) ..() item_state = "horsebroom[HAS_TRAIT(src, TRAIT_WIELDED) ? 1 : 0]" diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm index d93f0f1f9667f..359802da3d5c7 100644 --- a/code/game/objects/items/weapons/stock_parts.dm +++ b/code/game/objects/items/weapons/stock_parts.dm @@ -43,7 +43,7 @@ return FALSE return ..() -/obj/item/storage/part_replacer/afterattack(obj/machinery/M, mob/user, proximity_flag, params) +/obj/item/storage/part_replacer/afterattack__legacy__attackchain(obj/machinery/M, mob/user, proximity_flag, params) if(!istype(M)) return ..() diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 7a1752b514d2c..3a767524ad78b 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -22,7 +22,7 @@ "Grey" = 'icons/mob/clothing/species/grey/back.dmi' ) -/obj/item/storage/backpack/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/storage/backpack/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(Adjacent(user)) playsound(src.loc, "rustle", 50, TRUE, -5) return ..() @@ -63,7 +63,7 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 60, ACID = 50) allow_same_size = TRUE -/obj/item/storage/backpack/holding/attackby(obj/item/W, mob/user, params) +/obj/item/storage/backpack/holding/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/storage/backpack/holding)) var/response = tgui_alert(user, "This creates a singularity, destroying you and much of the station. Are you SURE?", "IMMINENT DEATH!", list("No", "Yes")) if(response == "Yes") diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 132f478a121cf..a9fc87d9fdd8a 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -244,7 +244,7 @@ /obj/item/seeds, /obj/item/unsorted_seeds) -/obj/item/storage/bag/plants/seed_sorting_tray/attack_self(mob/user) +/obj/item/storage/bag/plants/seed_sorting_tray/attack_self__legacy__attackchain(mob/user) var/depth = 0 for(var/obj/item/unsorted_seeds/unsorted in src) if(!do_after(user, 1 SECONDS, TRUE, src, must_be_held = TRUE)) @@ -303,7 +303,7 @@ materials = list(MAT_METAL=3000) cant_hold = list(/obj/item/disk/nuclear) // Prevents some cheesing -/obj/item/storage/bag/tray/attack(mob/living/M, mob/living/user) +/obj/item/storage/bag/tray/attack__legacy__attackchain(mob/living/M, mob/living/user) ..() // Drop all the things. All of them. var/list/obj/item/oldContents = contents.Copy() @@ -340,7 +340,7 @@ /obj/item/storage/bag/tray/cyborg -/obj/item/storage/bag/tray/cyborg/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/storage/bag/tray/cyborg/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag) // We cannot reach the target. if(!proximity_flag) return diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 4c47548dfe33a..bb1605fae8e38 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -484,7 +484,7 @@ /obj/item/detective_scanner ) -/obj/item/storage/belt/military/assault/attackby(obj/item/I, mob/user) +/obj/item/storage/belt/military/assault/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.w_class > WEIGHT_CLASS_NORMAL) to_chat(user, "[I] is too big for [src].") return @@ -585,7 +585,7 @@ /obj/item/storage/belt/lazarus/update_icon_state() icon_state = "[base_icon_state]_[length(contents)]" -/obj/item/storage/belt/lazarus/attackby(obj/item/I, mob/user) +/obj/item/storage/belt/lazarus/attackby__legacy__attackchain(obj/item/I, mob/user) var/amount = length(contents) . = ..() if(amount != length(contents)) @@ -618,7 +618,7 @@ /obj/item/storage/belt/bandolier/update_icon_state() icon_state = "bandolier_[min(length(contents), 8)]" -/obj/item/storage/belt/bandolier/attackby(obj/item/I, mob/user) +/obj/item/storage/belt/bandolier/attackby__legacy__attackchain(obj/item/I, mob/user) var/amount = length(contents) ..() if(amount != length(contents)) @@ -904,7 +904,7 @@ if(H.s_active && H.s_active == src) H.s_active.show_to(H) -/obj/item/storage/belt/bluespace/attack(mob/M, mob/user, def_zone) +/obj/item/storage/belt/bluespace/attack__legacy__attackchain(mob/M, mob/user, def_zone) return /obj/item/storage/belt/bluespace/admin diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 86fcbcffa0934..44fa4b8a701b4 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -71,7 +71,7 @@ H.heal_overall_damage(10, 10) return -/obj/item/storage/bible/attack(mob/living/M, mob/living/user) +/obj/item/storage/bible/attack__legacy__attackchain(mob/living/M, mob/living/user) add_attack_logs(user, M, "Hit with [src]") if(!iscarbon(user)) M.LAssailant = null @@ -109,7 +109,7 @@ playsound(src.loc, "punch", 25, TRUE, -1) -/obj/item/storage/bible/afterattack(atom/target, mob/user, proximity, params) +/obj/item/storage/bible/afterattack__legacy__attackchain(atom/target, mob/user, proximity, params) if(!proximity) return @@ -137,7 +137,7 @@ target.reagents.del_reagent("unholywater") target.reagents.add_reagent("holywater", unholy2clean) -/obj/item/storage/bible/attack_self(mob/user) +/obj/item/storage/bible/attack_self__legacy__attackchain(mob/user) . = ..() if(!customisable || !HAS_MIND_TRAIT(user, TRAIT_HOLY)) return diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index ef61b6a35ada0..b6e25d9c2f97c 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -1016,7 +1016,7 @@ else icon_state = "[item_state]_closed" -/obj/item/storage/box/papersack/attackby(obj/item/W, mob/user, params) +/obj/item/storage/box/papersack/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(is_pen(W)) //if a pen is used on the sack, dialogue to change its design appears if(length(contents)) @@ -1185,7 +1185,7 @@ user.visible_message("[user] clamps the box of hugs on [user.p_their()] jugular! Guess it wasn't such a hugbox after all..") return (BRUTELOSS) -/obj/item/storage/box/hug/attack_self(mob/user) +/obj/item/storage/box/hug/attack_self__legacy__attackchain(mob/user) ..() user.changeNext_move(CLICK_CD_MELEE) playsound(loc, "rustle", 50, TRUE, -5) diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm index 7d03cf3a78406..ab0409a715299 100644 --- a/code/game/objects/items/weapons/storage/briefcase.dm +++ b/code/game/objects/items/weapons/storage/briefcase.dm @@ -41,13 +41,13 @@ QDEL_NULL(stored_item) return ..() -/obj/item/storage/briefcase/false_bottomed/afterattack(atom/A, mob/user, flag, params) +/obj/item/storage/briefcase/false_bottomed/afterattack__legacy__attackchain(atom/A, mob/user, flag, params) ..() if(stored_item && isgun(stored_item)) var/obj/item/gun/stored_gun = stored_item - stored_gun.afterattack(A, user, flag, params) + stored_gun.afterattack__legacy__attackchain(A, user, flag, params) -/obj/item/storage/briefcase/false_bottomed/attackby(obj/item/I, mob/user) +/obj/item/storage/briefcase/false_bottomed/attackby__legacy__attackchain(obj/item/I, mob/user) if(bottom_open) if(stored_item) to_chat(user, "There's already something in the false bottom!") diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 1dad0fb1fb655..f05629c1d3dd6 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -163,7 +163,7 @@ for(var/obj/item/toy/crayon/crayon in contents) . += image('icons/obj/crayons.dmi', crayon.dye_color) -/obj/item/storage/fancy/crayons/attackby(obj/item/I, mob/user, params) +/obj/item/storage/fancy/crayons/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = I switch(C.dye_color) @@ -198,7 +198,7 @@ for(var/I in 1 to storage_slots) new /obj/item/match(src) -/obj/item/storage/fancy/matches/attackby(obj/item/match/W, mob/user, params) +/obj/item/storage/fancy/matches/attackby__legacy__attackchain(obj/item/match/W, mob/user, params) if(istype(W, /obj/item/match) && !W.lit) W.matchignite() playsound(user.loc, 'sound/goonstation/misc/matchstick_light.ogg', 50, TRUE) @@ -247,7 +247,7 @@ /obj/item/storage/fancy/cigarettes/update_icon_state() icon_state = "[initial(icon_state)][length(contents)]" -/obj/item/storage/fancy/cigarettes/attack(mob/living/carbon/M, mob/living/user) +/obj/item/storage/fancy/cigarettes/attack__legacy__attackchain(mob/living/carbon/M, mob/living/user) if(!ismob(M)) return @@ -447,7 +447,7 @@ else . += "ledb" -/obj/item/storage/lockbox/vials/attackby(obj/item/I, mob/user, params) +/obj/item/storage/lockbox/vials/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() update_icon() diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index d458698437394..9fcdfeb583989 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -301,7 +301,7 @@ I.color = wrapper_color overlays += I -/obj/item/storage/pill_bottle/attack(mob/M, mob/user) +/obj/item/storage/pill_bottle/attack__legacy__attackchain(mob/M, mob/user) if(iscarbon(M) && length(contents)) if(applying_meds) to_chat(user, "You are already applying meds.") @@ -363,7 +363,7 @@ return ..() -/obj/item/storage/pill_bottle/attackby(obj/item/I, mob/user, params) +/obj/item/storage/pill_bottle/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(is_pen(I)) rename_interactive(user, I) else diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 923ce4866378e..8641af62486c7 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -22,7 +22,7 @@ //Helper procs to cleanly implement internal storages - storage items that provide inventory slots for other items. //These procs are completely optional, it is up to the master item to decide when it's storage get's opened by calling open() //However they are helpful for allowing the master item to pretend it is a storage item itself. -//If you are using these you will probably want to override attackby() as well. +//If you are using these you will probably want to override attackby__legacy__attackchain() as well. //See /obj/item/clothing/suit/storage for an example. //items that use internal storage have the option of calling this to emulate default storage MouseDrop behaviour. diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index cd6c8d7a49dfc..6bc41f4a8c3b1 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -14,7 +14,7 @@ var/icon_closed = "lockbox" var/icon_broken = "lockbox+b" -/obj/item/storage/lockbox/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/storage/lockbox/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) if(broken) to_chat(user, "It appears to be broken.") @@ -173,7 +173,7 @@ /obj/item/storage/lockbox/medal/hardmode_box/populate_contents() return -/obj/item/storage/lockbox/medal/hardmode_box/attackby(obj/item/W, mob/user, params) +/obj/item/storage/lockbox/medal/hardmode_box/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/disk/fauna_research)) var/obj/item/disk/fauna_research/disky = W var/obj/item/pride = new disky.output(get_turf(src)) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index e66bc988adee5..0656ef5e203b3 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -39,7 +39,7 @@ new /obj/item/paper(src) new /obj/item/pen(src) -/obj/item/storage/secure/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/storage/secure/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(locked) if((istype(W, /obj/item/melee/energy/blade)) && (!emagged)) emag_act(user, W) @@ -126,7 +126,7 @@ /obj/item/storage/secure/hear_message(mob/living/M as mob, msg) return -/obj/item/storage/secure/attack_self(mob/user) +/obj/item/storage/secure/attack_self__legacy__attackchain(mob/user) ui_interact(user) /obj/item/storage/secure/ui_state(mob/user) diff --git a/code/game/objects/items/weapons/storage/storage_base.dm b/code/game/objects/items/weapons/storage/storage_base.dm index 4335e8a213ac2..6581136461d56 100644 --- a/code/game/objects/items/weapons/storage/storage_base.dm +++ b/code/game/objects/items/weapons/storage/storage_base.dm @@ -543,7 +543,7 @@ qdel(src) //This proc is called when you want to place an item into the storage item. -/obj/item/storage/attackby(obj/item/I, mob/user, params) +/obj/item/storage/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() if(istype(I, /obj/item/hand_labeler)) var/obj/item/hand_labeler/labeler = I @@ -634,7 +634,7 @@ for(var/obj/O in contents) O.hear_message(M, msg) -/obj/item/storage/attack_self(mob/user) +/obj/item/storage/attack_self__legacy__attackchain(mob/user) //Clicking on itself will empty it, if allow_quick_empty is TRUE if(allow_quick_empty && user.is_in_active_hand(src)) drop_inventory(user) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 4358bd0f724fa..518650657322f 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -121,7 +121,7 @@ update_icon() playsound(src, "sparks", 75, TRUE, -1) -/obj/item/melee/baton/attackby(obj/item/I, mob/user, params) +/obj/item/melee/baton/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = I if(cell) @@ -151,7 +151,7 @@ turned_on = FALSE update_icon(UPDATE_ICON_STATE) -/obj/item/melee/baton/attack_self(mob/user) +/obj/item/melee/baton/attack_self__legacy__attackchain(mob/user) if(cell?.charge >= hitcost) turned_on = !turned_on to_chat(user, "[src] is now [turned_on ? "on" : "off"].") @@ -171,7 +171,7 @@ if(!. && turned_on && istype(hit_mob)) thrown_baton_stun(hit_mob) -/obj/item/melee/baton/attack(mob/M, mob/living/user) +/obj/item/melee/baton/attack__legacy__attackchain(mob/M, mob/living/user) if(turned_on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) if(baton_stun(user, user, skip_cooldown = TRUE)) // for those super edge cases where you clumsy baton yourself in quick succession user.visible_message("[user] accidentally hits [user.p_themselves()] with [src]!", @@ -361,13 +361,13 @@ /obj/item/melee/baton/flayerprod/update_icon_state() return -/obj/item/melee/baton/flayerprod/attackby(obj/item/I, mob/user, params) +/obj/item/melee/baton/flayerprod/attackby__legacy__attackchain(obj/item/I, mob/user, params) return /obj/item/melee/baton/flayerprod/screwdriver_act(mob/living/user, obj/item/I) return -/obj/item/melee/baton/flayerprod/attack_self(mob/user) +/obj/item/melee/baton/flayerprod/attack_self__legacy__attackchain(mob/user) return /obj/item/melee/baton/flayerprod/play_hit_sound() diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 0ddddced09222..3d8052094ceb0 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -168,7 +168,7 @@ STOP_PROCESSING(SSobj, src) temp_air_contents = air_contents -/obj/item/tank/jetpack/suit/attack_self() +/obj/item/tank/jetpack/suit/attack_self__legacy__attackchain() return /obj/item/tank/jetpack/suit/cycle(mob/user) diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 83eb5a4c03b71..5edd367f1ef69 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -63,7 +63,7 @@ /obj/item/tank/internals/plasma/populate_gas() air_contents.set_toxins((3 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)) -/obj/item/tank/internals/plasma/attackby(obj/item/I, mob/user, params) +/obj/item/tank/internals/plasma/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/flamethrower)) var/obj/item/flamethrower/F = I if((!F.status)||(F.ptank)) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 4b73b7f3342e7..fcfb23970f517 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -137,7 +137,7 @@ playsound(src.loc, 'sound/effects/spray.ogg', 10, TRUE, -3) qdel(src) -/obj/item/tank/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/tank/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) ..() add_fingerprint(user) @@ -147,7 +147,7 @@ if(istype(W, /obj/item/assembly_holder)) bomb_assemble(W,user) -/obj/item/tank/attack_self(mob/user as mob) +/obj/item/tank/attack_self__legacy__attackchain(mob/user as mob) if(!(air_contents)) return diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 0c0a8c237d14b..01ad9ed3764a1 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -95,7 +95,7 @@ H.put_in_l_hand(src) return -/obj/item/watertank/attackby(obj/item/W, mob/user, params) +/obj/item/watertank/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(W == noz) remove_noz() return @@ -138,7 +138,7 @@ tank.on = FALSE loc = tank -/obj/item/reagent_containers/spray/mister/attack_self() +/obj/item/reagent_containers/spray/mister/attack_self__legacy__attackchain() return /proc/check_tank_exists(parent_tank, mob/living/carbon/human/M, obj/O) @@ -152,7 +152,7 @@ if(loc != tank.loc) loc = tank.loc -/obj/item/reagent_containers/spray/mister/afterattack(obj/target, mob/user, proximity) +/obj/item/reagent_containers/spray/mister/afterattack__legacy__attackchain(obj/target, mob/user, proximity) if(target.loc == loc || target == tank) //Safety check so you don't fill your mister with mutagen or something and then blast yourself in the face with it putting it away return ..() @@ -182,7 +182,7 @@ /obj/item/watertank/janitor/make_noz() return new /obj/item/reagent_containers/spray/mister/janitor(src) -/obj/item/reagent_containers/spray/mister/janitor/attack_self(mob/user) +/obj/item/reagent_containers/spray/mister/janitor/attack_self__legacy__attackchain(mob/user) amount_per_transfer_from_this = (amount_per_transfer_from_this == 5 ? 10 : 5) spray_currentrange = (spray_currentrange == 2 ? spray_maxrange : 2) to_chat(user, "You [amount_per_transfer_from_this == 5 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.") @@ -255,7 +255,7 @@ if(tank && loc != tank.loc) forceMove(tank) -/obj/item/extinguisher/mini/nozzle/attack_self(mob/user) +/obj/item/extinguisher/mini/nozzle/attack_self__legacy__attackchain(mob/user) switch(nozzle_mode) if(EXTINGUISHER) nozzle_mode = NANOFROST @@ -276,7 +276,7 @@ tank.on = FALSE loc = tank -/obj/item/extinguisher/mini/nozzle/afterattack(atom/target, mob/user) +/obj/item/extinguisher/mini/nozzle/afterattack__legacy__attackchain(atom/target, mob/user) if(nozzle_mode == EXTINGUISHER) ..() return diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 6390fe821df94..13a6ab38e09a3 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -12,7 +12,7 @@ ..() update_icon(UPDATE_ICON_STATE) -/obj/item/stack/tape_roll/attack(mob/living/carbon/human/M, mob/living/user) +/obj/item/stack/tape_roll/attack__legacy__attackchain(mob/living/carbon/human/M, mob/living/user) if(!istype(M)) //What good is a duct tape mask if you are unable to speak? return if(M.wear_mask) diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index e33a4d681fcac..8d027e4ff3363 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -42,7 +42,7 @@ . = ..() RegisterSignal(src, COMSIG_PARENT_QDELETING, PROC_REF(alert_admins_on_destroy)) -/obj/item/hand_tele/attack_self(mob/user) +/obj/item/hand_tele/attack_self__legacy__attackchain(mob/user) // The turf the user is currently located in. var/turf/current_location = get_turf(user) if(emp_timer > world.time) diff --git a/code/game/objects/items/weapons/teleprod.dm b/code/game/objects/items/weapons/teleprod.dm index c659c3e3d5974..690387428000e 100644 --- a/code/game/objects/items/weapons/teleprod.dm +++ b/code/game/objects/items/weapons/teleprod.dm @@ -7,7 +7,7 @@ base_icon = "teleprod" origin_tech = "combat=2;bluespace=4;materials=3" -/obj/item/melee/baton/cattleprod/teleprod/attack(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit +/obj/item/melee/baton/cattleprod/teleprod/attack__legacy__attackchain(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit ..() if(!turned_on) return diff --git a/code/game/objects/items/weapons/thurible.dm b/code/game/objects/items/weapons/thurible.dm index 8c79b2cd0dcf8..63f0cbc4e305c 100644 --- a/code/game/objects/items/weapons/thurible.dm +++ b/code/game/objects/items/weapons/thurible.dm @@ -57,7 +57,7 @@ H.update_inv_r_hand() return ..() -/obj/item/thurible/attackby(obj/item/fire_source, mob/user, params) +/obj/item/thurible/attackby__legacy__attackchain(obj/item/fire_source, mob/user, params) . = ..() if(fire_source.get_heat()) user.visible_message( @@ -67,7 +67,7 @@ ) light(user) -/obj/item/thurible/attack_self(mob/user) +/obj/item/thurible/attack_self__legacy__attackchain(mob/user) if(lit) to_chat(user, "You extinguish [src].") put_out(user) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index d782b59f3e5d1..80136bc5cb581 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -36,7 +36,7 @@ icon_state = "[base_icon_state]0" return ..() -/obj/item/fireaxe/afterattack(atom/A, mob/user, proximity) +/obj/item/fireaxe/afterattack__legacy__attackchain(atom/A, mob/user, proximity) if(!proximity) return if(HAS_TRAIT(src, TRAIT_WIELDED)) //destroys windows and grilles in one hit @@ -77,7 +77,7 @@ /obj/item/fireaxe/energized/process() charge = min(charge + 1, max_charge) -/obj/item/fireaxe/energized/attack(mob/M, mob/user) +/obj/item/fireaxe/energized/attack__legacy__attackchain(mob/M, mob/user) . = ..() if(HAS_TRAIT(src, TRAIT_WIELDED) && charge == max_charge) if(isliving(M)) @@ -139,7 +139,7 @@ icon_state = "dualsaber0" set_light(0) -/obj/item/dualsaber/attack(mob/target, mob/living/user) +/obj/item/dualsaber/attack__legacy__attackchain(mob/target, mob/living/user) if(cigarette_lighter_act(user, target)) return @@ -318,7 +318,7 @@ ..() -/obj/item/spear/afterattack(atom/movable/AM, mob/user, proximity) +/obj/item/spear/afterattack__legacy__attackchain(atom/movable/AM, mob/user, proximity) if(!proximity) return if(isturf(AM)) //So you can actually melee with it @@ -366,7 +366,7 @@ throw_speed = 4 attack_verb = list("gored") -/obj/item/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity) +/obj/item/spear/grey_tide/afterattack__legacy__attackchain(atom/movable/AM, mob/living/user, proximity) ..() if(!proximity) return @@ -383,7 +383,7 @@ M.GiveTarget(L) //Putting heads on spears -/obj/item/spear/attackby(obj/item/I, mob/living/user) +/obj/item/spear/attackby__legacy__attackchain(obj/item/I, mob/living/user) if(istype(I, /obj/item/organ/external/head)) if(user.unEquip(src) && user.drop_item()) to_chat(user, "You stick [I] onto the spear and stand it upright on the ground.") @@ -454,7 +454,7 @@ AddComponent(/datum/component/two_handed, require_twohands = TRUE) -/obj/item/chainsaw/attack_self(mob/user) +/obj/item/chainsaw/attack_self__legacy__attackchain(mob/user) on = !on to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]") if(on) @@ -535,14 +535,14 @@ /obj/item/butcher_chainsaw/update_icon_state() icon_state = "[base_icon_state]0" -/obj/item/butcher_chainsaw/attack(mob/living/target, mob/living/user) +/obj/item/butcher_chainsaw/attack__legacy__attackchain(mob/living/target, mob/living/user) . = ..() if(HAS_TRAIT(src, TRAIT_WIELDED)) playsound(loc, 'sound/weapons/chainsaw.ogg', 100, TRUE, -1) //incredibly loud; you ain't goin' for stealth with this thing. Credit to Lonemonk of Freesound for this sound. if(isnull(.)) //necessary check, successful attacks return null, without it target will drop any shields they may have before they get a chance to block target.KnockDown(8 SECONDS) -/obj/item/butcher_chainsaw/afterattack(mob/living/target, mob/living/user, proximity) +/obj/item/butcher_chainsaw/afterattack__legacy__attackchain(mob/living/target, mob/living/user, proximity) if(!proximity) //only works on adjacent targets, no telekinetic chainsaws return if(!HAS_TRAIT(src, TRAIT_WIELDED)) @@ -628,7 +628,7 @@ step_towards(H, pull) step_towards(H, pull) -/obj/item/singularityhammer/afterattack(atom/A, mob/user, proximity) +/obj/item/singularityhammer/afterattack__legacy__attackchain(atom/A, mob/user, proximity) if(!proximity) return if(HAS_TRAIT(src, TRAIT_WIELDED)) @@ -673,7 +673,7 @@ var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) target.throw_at(throw_target, 200, 4) -/obj/item/mjollnir/attack(mob/living/M, mob/user) +/obj/item/mjollnir/attack__legacy__attackchain(mob/living/M, mob/user) ..() if(HAS_TRAIT(src, TRAIT_WIELDED)) playsound(loc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) @@ -727,7 +727,7 @@ /obj/item/knighthammer/update_icon_state() //Currently only here to fuck with the on-mob icons. icon_state = "knighthammer0" -/obj/item/knighthammer/afterattack(atom/A, mob/user, proximity) +/obj/item/knighthammer/afterattack__legacy__attackchain(atom/A, mob/user, proximity) if(!proximity) return if(charged == 5) @@ -803,7 +803,7 @@ if(prob(15)) do_sparks(rand(1,6), 1, loc) -/obj/item/pyro_claws/afterattack(atom/target, mob/user, proximity) +/obj/item/pyro_claws/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity) return if(prob(60) && world.time > next_spark_time) @@ -877,7 +877,7 @@ do_sparks(rand(1,6), 1, loc) next_spark_time = world.time + 0.8 SECONDS -/obj/item/clothing/gloves/color/black/pyro_claws/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/gloves/color/black/pyro_claws/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/assembly/signaler/anomaly/pyro)) if(core) to_chat(user, "[src] already has a [I]!") @@ -935,7 +935,7 @@ /obj/item/push_broom/proc/unwield(obj/item/source, mob/user) UnregisterSignal(user, COMSIG_MOVABLE_MOVED) -/obj/item/push_broom/afterattack(atom/A, mob/user, proximity) +/obj/item/push_broom/afterattack__legacy__attackchain(atom/A, mob/user, proximity) . = ..() if(!proximity) return @@ -995,7 +995,7 @@ Help intent will sweep foes away from you, disarm intent sweeps their legs from under them, grab intent confuses \ and minorly fatigues them, and harm intent hits them normally." -/obj/item/push_broom/traitor/attack(mob/target, mob/living/user) +/obj/item/push_broom/traitor/attack__legacy__attackchain(mob/target, mob/living/user) if(!HAS_TRAIT(src, TRAIT_WIELDED) || !ishuman(target)) return ..() @@ -1079,7 +1079,7 @@ icon_state = "[base_icon_state]0" return ..() -/obj/item/supermatter_halberd/afterattack(atom/A, mob/user, proximity) +/obj/item/supermatter_halberd/afterattack__legacy__attackchain(atom/A, mob/user, proximity) if(!proximity) return diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index c0fbf6766a740..2deabb7505025 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -20,7 +20,7 @@ visible_message("[user] is hitting [user.p_themselves()] with [src]! It looks like [user.p_theyre()] trying to ban [user.p_themselves()] from life.") return BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS -/obj/item/banhammer/attack(mob/M, mob/user) +/obj/item/banhammer/attack__legacy__attackchain(mob/M, mob/user) to_chat(M, " You have been banned FOR NO REISIN by [user]") to_chat(user, " You have BANNED [M]") playsound(loc, 'sound/effects/adminhelp.ogg', 15) //keep it at 15% volume so people don't jump out of their skin too much @@ -134,7 +134,7 @@ materials = list(MAT_METAL=1150, MAT_GLASS=75) attack_verb = list("hit", "bludgeoned", "whacked", "bonked") -/obj/item/wirerod/attackby(obj/item/I, mob/user, params) +/obj/item/wirerod/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() if(istype(I, /obj/item/shard)) var/obj/item/spear/S = new /obj/item/spear @@ -242,7 +242,7 @@ lastdeflect = world.time + 3000 return TRUE -/obj/item/melee/baseball_bat/attack_self(mob/user) +/obj/item/melee/baseball_bat/attack_self__legacy__attackchain(mob/user) if(!homerun_able) if(!deflectmode && world.time >= lastdeflect) to_chat(user, "You prepare to deflect objects thrown at you. You cannot attack during this time.") @@ -263,7 +263,7 @@ homerun_ready = 1 ..() -/obj/item/melee/baseball_bat/attack(mob/living/target, mob/living/user) +/obj/item/melee/baseball_bat/attack__legacy__attackchain(mob/living/target, mob/living/user) if(deflectmode) to_chat(user, "You cannot attack in deflect mode!") return diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm index 7c21ddda9c8c7..8c908965e13ae 100644 --- a/code/game/objects/items/weapons/whetstone.dm +++ b/code/game/objects/items/weapons/whetstone.dm @@ -13,7 +13,7 @@ var/claw_damage_increase = 2 -/obj/item/whetstone/attackby(obj/item/I, mob/user, params) +/obj/item/whetstone/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(used) to_chat(user, "The whetstone is too worn to use again!") return @@ -46,7 +46,7 @@ used = TRUE update_icon() -/obj/item/whetstone/attack_self(mob/user) +/obj/item/whetstone/attack_self__legacy__attackchain(mob/user) if(used) to_chat(user, "The whetstone is too worn to use again!") return diff --git a/code/game/objects/mail.dm b/code/game/objects/mail.dm index 27ed8bbb4a943..d8aa461b729f6 100644 --- a/code/game/objects/mail.dm +++ b/code/game/objects/mail.dm @@ -24,7 +24,7 @@ playsound(loc, 'sound/effects/-adminhelp.ogg', 50, TRUE, -1) return BRUTELOSS -/obj/item/envelope/attack_self(mob/user) +/obj/item/envelope/attack_self__legacy__attackchain(mob/user) if(!user?.mind) return if(user.real_name != recipient) @@ -251,10 +251,10 @@ . = ..() . += "Scan a letter to log it into the active database, then scan the person you wish to hand the letter to. Correctly scanning the recipient of the letter logged into the active database will add credits to the Supply budget." -/obj/item/mail_scanner/attack() +/obj/item/mail_scanner/attack__legacy__attackchain() return -/obj/item/mail_scanner/afterattack(atom/A, mob/user) +/obj/item/mail_scanner/afterattack__legacy__attackchain(atom/A, mob/user) if(get_dist(A, user) > scanner_range) to_chat(user, "The scanner doesn't reach that far!") return diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 05f3bbb5d02f4..80f1ee8c36e22 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -163,7 +163,7 @@ /obj/item/proc/updateSelfDialog() var/mob/M = src.loc if(istype(M) && M.client && M.machine == src) - src.attack_self(M) + src.attack_self__legacy__attackchain(M) /obj/proc/hide(h) return diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index f8e7d994cd1c8..d68b48bb0a72f 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -178,7 +178,7 @@ return attack_hand(user) -/obj/machinery/barsign/attackby(obj/item/I, mob/user, params) +/obj/machinery/barsign/attackby__legacy__attackchain(obj/item/I, mob/user, params) switch(build_stage) // Inserting the electronics/circuit if(BARSIGN_FRAME) @@ -483,7 +483,7 @@ . = ..() . += "Use it while in your active hand to toggle the access restrictions." -/obj/item/barsign_electronics/attack_self(mob/user) +/obj/item/barsign_electronics/attack_self__legacy__attackchain(mob/user) . = ..() if(destroyed) return diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 19aca13808141..443e92b8dfe75 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -35,7 +35,7 @@ LINEN BINS return return ..() -/obj/item/bedsheet/attack_self(mob/user as mob) +/obj/item/bedsheet/attack_self__legacy__attackchain(mob/user as mob) user.drop_item() if(layer == initial(layer)) layer = 5 @@ -44,7 +44,7 @@ LINEN BINS add_fingerprint(user) return -/obj/item/bedsheet/attackby(obj/item/I, mob/user, params) +/obj/item/bedsheet/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.sharp) var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3) transfer_fingerprints_to(C) @@ -316,7 +316,7 @@ LINEN BINS default_unfasten_wrench(user, I, time = 20) return TRUE -/obj/structure/bedsheetbin/attackby(obj/item/I, mob/user, params) +/obj/structure/bedsheetbin/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/bedsheet)) if(!user.drop_item()) to_chat(user, "[I] is stuck to your hand!") diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index 40fa5b0ab3674..b6f30a05c181d 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -15,7 +15,7 @@ coat = null update_icon(UPDATE_OVERLAYS) -/obj/structure/coatrack/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/structure/coatrack/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) var/can_hang = FALSE for(var/T in allowed) if(istype(W,T)) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 98e360a997ae6..b3b6ef724e986 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -280,7 +280,7 @@ if(!broken && !(flags & NODECONSTRUCT)) bust_open() -/obj/structure/closet/attackby(obj/item/W, mob/user, params) +/obj/structure/closet/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/rcs) && !opened) var/obj/item/rcs/E = W E.try_send_container(user, src) diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 0e0a292418b9f..15b57e1df1f8d 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -69,7 +69,7 @@ /obj/structure/closet/cardboard/welder_act() return -/obj/structure/closet/cardboard/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/structure/closet/cardboard/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(src.opened) if(istype(W, /obj/item/wirecutters)) var/obj/item/wirecutters/WC = W diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index 1bde25e8c79ea..bec34e3f23bc7 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -29,7 +29,7 @@ else . += "It is damaged beyond repair." -/obj/structure/closet/fireaxecabinet/attackby(obj/item/O as obj, mob/living/user as mob) //Marker -Agouri +/obj/structure/closet/fireaxecabinet/attackby__legacy__attackchain(obj/item/O as obj, mob/living/user as mob) //Marker -Agouri if(isrobot(user) || locked) if(istype(O, /obj/item/multitool)) to_chat(user, "Resetting circuitry...") diff --git a/code/game/objects/structures/crates_lockers/closets/secure/depot_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/depot_closets.dm index 78139592e790e..d334f3233f45f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/depot_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/depot_closets.dm @@ -36,7 +36,7 @@ return return ..() -/obj/structure/closet/secure_closet/depot/attackby(obj/item/W, mob/user, params) +/obj/structure/closet/secure_closet/depot/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/rcs)) to_chat(user, "Bluespace interference prevents [W] from locking onto [src]!") return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm index c8074cd4f6295..c7056037507ee 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm @@ -35,7 +35,7 @@ new /obj/item/storage/backpack/satchel/withwallet( src ) new /obj/item/radio/headset( src ) -/obj/structure/closet/secure_closet/personal/attackby(obj/item/W, mob/user, params) +/obj/structure/closet/secure_closet/personal/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(opened || !istype(W, /obj/item/card/id)) return ..() diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 2145818d6f811..40e729f30e3bd 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -86,7 +86,7 @@ opened = FALSE return TRUE -/obj/structure/closet/crate/attackby(obj/item/W, mob/user, params) +/obj/structure/closet/crate/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(!opened && try_rig(W, user)) return return ..() @@ -306,7 +306,7 @@ return FALSE return TRUE -/obj/structure/closet/crate/secure/personal/attackby(obj/item/I, mob/user, params) +/obj/structure/closet/crate/secure/personal/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(opened || !istype(I, /obj/item/card/id)) return ..() diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index f5e0e0dbb4dc2..d9642b8788660 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -29,7 +29,7 @@ to_chat(user, "You need a crowbar to pry this open!") return -/obj/structure/largecrate/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/structure/largecrate/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(user.a_intent != INTENT_HARM) attack_hand(user) else diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index c569526f0b631..a9032998a5146 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -9,6 +9,7 @@ layer = SHOWER_CLOSED_LAYER opacity = TRUE density = FALSE + new_attack_chain = TRUE /obj/structure/curtain/open icon_state = "open" @@ -39,11 +40,10 @@ icon_state = "open" layer = SHOWER_OPEN_LAYER -/obj/structure/curtain/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/toy/crayon)) +/obj/structure/curtain/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(istype(used, /obj/item/toy/crayon)) color = tgui_input_color(user,"Please choose a color.", "Curtain Color") - return - return ..() + return ITEM_INTERACT_SUCCESS /obj/structure/curtain/screwdriver_act(mob/user, obj/item/I) . = TRUE diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index b708793ac85bf..94953b6f8ba9f 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -130,7 +130,7 @@ if(!open && !broken) . += "glassbox_closed" -/obj/structure/displaycase/attackby(obj/item/I, mob/user, params) +/obj/structure/displaycase/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.GetID()) if(!openable) to_chat(user, "There is no ID scanner, looks like this one is sealed shut.") @@ -232,7 +232,7 @@ icon_state = "glassbox_chassis" var/obj/item/airlock_electronics/electronics -/obj/structure/displaycase_chassis/attackby(obj/item/I, mob/user, params) +/obj/structure/displaycase_chassis/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/airlock_electronics)) to_chat(user, "You start installing the electronics into [src]...") playsound(loc, I.usesound, 50, TRUE) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 3511f2bb5e479..4566e9bbfc26e 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -55,7 +55,7 @@ else . += "There is a small paper placard on the assembly[doorname]." -/obj/structure/door_assembly/attackby(obj/item/W, mob/user, params) +/obj/structure/door_assembly/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(is_pen(W)) // The door assembly gets renamed to "Assembly - Foobar", // but the `t` returned from the proc is just "Foobar" without the prefix. diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/engicart.dm index 37b69f505c160..7d5ec19c99bb0 100644 --- a/code/game/objects/structures/engicart.dm +++ b/code/game/objects/structures/engicart.dm @@ -30,7 +30,7 @@ to_chat(user, "You put [I] into [src].") return -/obj/structure/engineeringcart/attackby(obj/item/I, mob/user, params) +/obj/structure/engineeringcart/attackby__legacy__attackchain(obj/item/I, mob/user, params) var/fail_msg = "There is already one of those in [src]." if(!I.is_robot_module()) if(istype(I, /obj/item/stack/sheet/glass)) diff --git a/code/game/objects/structures/extinguisher_cabinet.dm b/code/game/objects/structures/extinguisher_cabinet.dm index 77b53eb0e21b5..f25520be1e0cb 100644 --- a/code/game/objects/structures/extinguisher_cabinet.dm +++ b/code/game/objects/structures/extinguisher_cabinet.dm @@ -62,7 +62,7 @@ has_extinguisher = null update_icon(UPDATE_ICON_STATE) -/obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user, params) +/obj/structure/extinguisher_cabinet/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(isrobot(user) || isalien(user)) return if(istype(O, /obj/item/extinguisher)) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 7c7f95f3e8d90..27df94912bdf0 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -112,7 +112,7 @@ qdel(src) return T -/obj/structure/falsewall/attackby(obj/item/W, mob/user, params) +/obj/structure/falsewall/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(opening) to_chat(user, "You must wait until the door has stopped moving.") return @@ -217,7 +217,7 @@ smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_URANIUM_WALLS) canSmoothWith = list(SMOOTH_GROUP_URANIUM_WALLS) -/obj/structure/falsewall/uranium/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/structure/falsewall/uranium/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) radiate() ..() @@ -288,7 +288,7 @@ smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASMA_WALLS) canSmoothWith = list(SMOOTH_GROUP_PLASMA_WALLS) -/obj/structure/falsewall/plasma/attackby(obj/item/W, mob/user, params) +/obj/structure/falsewall/plasma/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(W.get_heat() > 300) var/turf/T = locate(user) message_admins("Plasma falsewall ignited by [key_name_admin(user)] in [ADMIN_VERBOSEJMP(T)]") diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 65e5e07a211b7..351d42a6b6751 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -121,7 +121,7 @@ return update_cut_status() -/obj/structure/fence/attackby(obj/item/C, mob/user) +/obj/structure/fence/attackby__legacy__attackchain(obj/item/C, mob/user) if(shock(user, 90)) return if(istype(C, /obj/item/stack/rods)) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 09cf587e2e8b1..522881d1a453d 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -515,7 +515,7 @@ A.loc = get_turf(src) */ -/obj/structure/bush/attackby(obj/I as obj, mob/user as mob, params) +/obj/structure/bush/attackby__legacy__attackchain(obj/I as obj, mob/user as mob, params) //hatchets can clear away undergrowth if(istype(I, /obj/item/hatchet) && !stump) if(indestructable) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d1f47ae9ac88e..a7f2125a0a713 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -46,7 +46,7 @@ if(temp_check >= GIRDER_MELTING_TEMP) take_damage(10) -/obj/structure/girder/attackby(obj/item/W, mob/user, params) +/obj/structure/girder/attackby__legacy__attackchain(obj/item/W, mob/user, params) add_fingerprint(user) if(istype(W, /obj/item/gun/energy/plasmacutter)) to_chat(user, "You start slicing apart the girder...") @@ -463,7 +463,7 @@ . = ..() icon_state = GET_CULT_DATA(cult_girder_icon_state, initial(icon_state)) -/obj/structure/girder/cult/attackby(obj/item/W, mob/user, params) +/obj/structure/girder/cult/attackby__legacy__attackchain(obj/item/W, mob/user, params) add_fingerprint(user) if(istype(W, /obj/item/melee/cultblade/dagger) && IS_CULTIST(user)) //Cultists can demolish cult girders instantly with their dagger user.visible_message("[user] strikes [src] with [W]!", "You demolish [src].") diff --git a/code/game/objects/structures/grey_autocloner.dm b/code/game/objects/structures/grey_autocloner.dm index 7afed5b66b3b7..d11afe9a220cc 100644 --- a/code/game/objects/structures/grey_autocloner.dm +++ b/code/game/objects/structures/grey_autocloner.dm @@ -24,7 +24,7 @@ clonemind = null return ..() -/obj/machinery/grey_autocloner/attackby(obj/item/bio_chip_implanter/implant, mob/user, params) +/obj/machinery/grey_autocloner/attackby__legacy__attackchain(obj/item/bio_chip_implanter/implant, mob/user, params) if(!istype(implant) || !(istype(implant.imp, /obj/item/bio_chip/grey_autocloner))) return ..() var/obj/item/bio_chip/grey_autocloner/autoclone = implant.imp diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 81aa7972720c3..e0aa89bca9b1e 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -102,7 +102,7 @@ if(pass_info.is_movable) . = . || pass_info.pass_flags & PASSGRILLE -/obj/structure/grille/attackby(obj/item/I, mob/user, params) +/obj/structure/grille/attackby__legacy__attackchain(obj/item/I, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) add_fingerprint(user) if(istype(I, /obj/item/stack/rods) && broken) diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index 3061e4dbbac38..692510e8cecaf 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -155,7 +155,7 @@ blade_status = GUILLOTINE_BLADE_DROPPED icon_state = "guillotine" -/obj/structure/guillotine/attackby(obj/item/W, mob/user, params) +/obj/structure/guillotine/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/whetstone)) add_fingerprint(user) if(blade_status == GUILLOTINE_BLADE_SHARPENING) diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 0f25600855176..0c1267ff89185 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -9,7 +9,7 @@ . = ..() . += "Use this item in hand to create an inflatable wall." -/obj/item/inflatable/attack_self(mob/user) +/obj/item/inflatable/attack_self__legacy__attackchain(mob/user) playsound(loc, 'sound/items/zip.ogg', 75, 1) to_chat(user, "You inflate [src].") var/obj/structure/inflatable/R = new /obj/structure/inflatable(user.loc) @@ -51,7 +51,7 @@ /obj/structure/inflatable/attack_hand(mob/user) add_fingerprint(user) -/obj/structure/inflatable/attackby(obj/item/I, mob/living/user, params) +/obj/structure/inflatable/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(I.sharp || is_type_in_typecache(I, GLOB.pointed_types)) user.do_attack_animation(src, used_item = I) deconstruct(FALSE) @@ -88,7 +88,7 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "folded_door" -/obj/item/inflatable/door/attack_self(mob/user) +/obj/item/inflatable/door/attack_self__legacy__attackchain(mob/user) playsound(loc, 'sound/items/zip.ogg', 75, 1) to_chat(user, "You inflate [src].") var/obj/structure/inflatable/door/R = new /obj/structure/inflatable/door(user.loc) @@ -165,7 +165,7 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "folded_wall_torn" -/obj/item/inflatable/torn/attack_self(mob/user) +/obj/item/inflatable/torn/attack_self__legacy__attackchain(mob/user) to_chat(user, "The inflatable wall is too torn to be inflated!") add_fingerprint(user) @@ -175,7 +175,7 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "folded_door_torn" -/obj/item/inflatable/door/torn/attack_self(mob/user) +/obj/item/inflatable/door/torn/attack_self__legacy__attackchain(mob/user) to_chat(user, "The inflatable door is too torn to be inflated!") add_fingerprint(user) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index be9c4a1df4713..e9e02ff2e8bd6 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -47,7 +47,7 @@ /obj/structure/janitorialcart/on_reagent_change() update_icon(UPDATE_OVERLAYS) -/obj/structure/janitorialcart/attackby(obj/item/I, mob/user, params) +/obj/structure/janitorialcart/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.is_robot_module()) to_chat(user, "You cannot interface your modules with [src]!") return @@ -89,7 +89,7 @@ to_chat(user, "There is already one of those in [src].") else if(mybag) - mybag.attackby(I, user, params) + mybag.attackby__legacy__attackchain(I, user, params) else to_chat(user, "There is already one of those in [src].") diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 5ff8c68f188d9..4ab47a636f323 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -20,7 +20,7 @@ deconstruct(TRUE) return TRUE -/obj/structure/kitchenspike_frame/attackby(obj/item/I, mob/user, params) +/obj/structure/kitchenspike_frame/attackby__legacy__attackchain(obj/item/I, mob/user, params) add_fingerprint(user) if(istype(I, /obj/item/stack/rods)) var/obj/item/stack/rods/R = I @@ -69,7 +69,7 @@ else ..() -/obj/structure/kitchenspike/attackby(obj/item/I, mob/user) +/obj/structure/kitchenspike/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/grab)) var/obj/item/grab/G = I if(G.affecting && isliving(G.affecting)) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 79842217c312b..b92d65247add6 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -29,7 +29,7 @@ /obj/structure/lattice/proc/deconstruction_hints(mob/user) return "The rods look like they could be cut. There's space for more rods or a tile." -/obj/structure/lattice/attackby(obj/item/C, mob/user, params) +/obj/structure/lattice/attackby__legacy__attackchain(obj/item/C, mob/user, params) if(resistance_flags & INDESTRUCTIBLE) return if(istype(C, /obj/item/wirecutters)) @@ -39,7 +39,7 @@ deconstruct() else var/turf/T = get_turf(src) - return T.attackby(C, user) //hand this off to the turf instead (for building plating, catwalks, etc) + return T.attackby__legacy__attackchain(C, user) //hand this off to the turf instead (for building plating, catwalks, etc) /obj/structure/lattice/deconstruct(disassembled = TRUE) if(!(flags & NODECONSTRUCT)) diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index 4b05102f57314..8550806b07213 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -42,7 +42,7 @@ GLOBAL_LIST_EMPTY(tendrils) new /obj/structure/closet/crate/necropolis/tendril(loc) return ..() -/obj/structure/spawner/lavaland/attacked_by(obj/item/I, mob/living/user) +/obj/structure/spawner/lavaland/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) . = ..() SEND_SIGNAL(src, COMSIG_SPAWNER_SET_TARGET, user) diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm index 1687478e6b40c..fd0e30d1144cb 100644 --- a/code/game/objects/structures/loom.dm +++ b/code/game/objects/structures/loom.dm @@ -10,7 +10,7 @@ density = TRUE anchored = TRUE -/obj/structure/loom/attackby(obj/item/I, mob/user) +/obj/structure/loom/attackby__legacy__attackchain(obj/item/I, mob/user) if(weave(I, user)) return return ..() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index dca1467ea517e..c17308c90af69 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -115,7 +115,7 @@ else icon_state = initial_state -/obj/structure/mineral_door/attackby(obj/item/W, mob/user, params) +/obj/structure/mineral_door/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/pickaxe)) var/obj/item/pickaxe/digTool = W to_chat(user, "You start digging \the [src].") @@ -181,7 +181,7 @@ icon_state = "plasma" sheetType = /obj/item/stack/sheet/mineral/plasma -/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/W, mob/user) +/obj/structure/mineral_door/transparent/plasma/attackby__legacy__attackchain(obj/item/W, mob/user) if(W.get_heat()) message_admins("Plasma mineral door ignited by [key_name_admin(user)] in ([x], [y], [z] - JMP)", 0, 1) log_game("Plasma mineral door ignited by [key_name(user)] in ([x], [y], [z])") diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index eabccdf939a5a..c7c9923cab485 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -166,7 +166,7 @@ /obj/structure/mirror/magic/ui_close(mob/user) curse(user) -/obj/structure/mirror/magic/attackby(obj/item/I, mob/living/user, params) +/obj/structure/mirror/magic/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) return /obj/structure/mirror/magic/proc/curse(mob/living/user) diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index eae1f93757431..d727e7062389f 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -23,7 +23,7 @@ GLOB.janitorial_equipment -= src return ..() -/obj/structure/mopbucket/attackby(obj/item/W, mob/user, params) +/obj/structure/mopbucket/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(W.is_robot_module()) to_chat(user, "You cannot interface your modules with [src]!") return diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 2be0a5f1ff08b..9ed6bfc1750b5 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -172,7 +172,7 @@ return ..() attack_hand(user) -/obj/structure/morgue/attackby(P as obj, mob/user as mob, params) +/obj/structure/morgue/attackby__legacy__attackchain(P as obj, mob/user as mob, params) if(is_pen(P)) var/t = rename_interactive(user, P) @@ -419,7 +419,7 @@ GLOBAL_LIST_EMPTY(crematoriums) GLOB.crematoriums += src return TRUE -/obj/structure/crematorium/attackby(obj/item/P, mob/user, params) +/obj/structure/crematorium/attackby__legacy__attackchain(obj/item/P, mob/user, params) if(is_pen(P)) rename_interactive(user, P) add_fingerprint(user) diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 99858b3ef2601..3100a070ebff0 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -89,7 +89,7 @@ return var/obj/item/held_item = usr.get_active_hand() if(is_pen(held_item)) - paper.attackby(held_item, usr) + paper.attackby__legacy__attackchain(held_item, usr) return else usr.put_in_hands(paper) @@ -104,7 +104,7 @@ paper.show_content(usr) return -/obj/structure/noticeboard/attackby(obj/item/I, mob/user, params) +/obj/structure/noticeboard/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/paper)) if(notices >= MAX_NOTICES) to_chat(user, "You reach to pin your paper to the board but hesitate. You are certain your paper will not be seen among the many others already attached.") diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 4be0439ea3d3d..ebe2e672006d5 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -33,7 +33,7 @@ /obj/structure/railing/cap/reversed icon_state = "railing_cap_reversed" -/obj/structure/railing/attackby(obj/item/I, mob/living/user, params) +/obj/structure/railing/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) ..() add_fingerprint(user) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index a0582bb533285..80d4e69828234 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -42,7 +42,7 @@ return -1 -/obj/structure/reflector/attackby(obj/item/W, mob/user, params) +/obj/structure/reflector/attackby__legacy__attackchain(obj/item/W, mob/user, params) //Finishing the frame if(istype(W,/obj/item/stack/sheet)) if(finished) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 435763c9908c6..ee476c27cbdc5 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -188,7 +188,7 @@ GLOBAL_LIST_EMPTY(safes) else ui_interact(user) -/obj/structure/safe/attackby(obj/item/I, mob/user, params) +/obj/structure/safe/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(open) if(I.flags && ABSTRACT) return diff --git a/code/game/objects/structures/shelves.dm b/code/game/objects/structures/shelves.dm index 71d8f84fd9dd6..f6585a6720cda 100644 --- a/code/game/objects/structures/shelves.dm +++ b/code/game/objects/structures/shelves.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_INIT(shelf_colors, list("basic", "sci", "sup", "serv", "med", "sec", if(mapload) SEND_SIGNAL(src, COMSIG_SHELF_ADDED_ON_MAPLOAD) -/obj/structure/shelf/attackby(obj/item/I, mob/living/user, params) +/obj/structure/shelf/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) var/obj/item/toy/crayon/spraycan/spraycan = I if(!istype(spraycan)) return ..() diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 14fa44bc785a4..8eadb12fe09ae 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -9,7 +9,7 @@ var/oreAmount = 5 var/material_drop_type = /obj/item/stack/sheet/metal -/obj/structure/statue/attackby(obj/item/W, mob/living/user, params) +/obj/structure/statue/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) add_fingerprint(user) if(!(flags & NODECONSTRUCT)) if(default_unfasten_wrench(user, W)) @@ -71,7 +71,7 @@ desc = "This statue has a sickening green colour." icon_state = "eng" -/obj/structure/statue/uranium/attackby(obj/item/W, mob/user, params) +/obj/structure/statue/uranium/attackby__legacy__attackchain(obj/item/W, mob/user, params) radiate() return ..() @@ -122,7 +122,7 @@ PlasmaBurn() ..() -/obj/structure/statue/plasma/attackby(obj/item/W, mob/user, params) +/obj/structure/statue/plasma/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(W.get_heat() > 300)//If the temperature of the object is over 300, then ignite message_admins("[key_name_admin(user)] ignited a plasma statue at [COORD(loc)]") log_game("[key_name(user)] ignited plasma a statue at [COORD(loc)]") @@ -240,7 +240,7 @@ honk() ..() -/obj/structure/statue/bananium/attackby(obj/item/W, mob/user, params) +/obj/structure/statue/bananium/attackby__legacy__attackchain(obj/item/W, mob/user, params) honk() return ..() @@ -336,7 +336,7 @@ new /obj/item/grown/log(drop_location()) return ..() -/obj/structure/snowman/built/attackby(obj/item/I, mob/user) +/obj/structure/snowman/built/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/snowball) && obj_integrity < max_integrity) to_chat(user, "You patch some of the damage on [src] with [I].") obj_integrity = max_integrity diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 9ec32313a45a4..1a774e177914f 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -145,7 +145,7 @@ var/icon_down = "down" var/folded = /obj/item/roller -/obj/structure/bed/roller/attackby(obj/item/W, mob/user, params) +/obj/structure/bed/roller/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/roller_holder)) if(has_buckled_mobs()) if(length(buckled_mobs) > 1) @@ -185,12 +185,12 @@ w_class = WEIGHT_CLASS_BULKY var/extended = /obj/structure/bed/roller -/obj/item/roller/attack_self(mob/user) +/obj/item/roller/attack_self__legacy__attackchain(mob/user) var/obj/structure/bed/roller/R = new extended(user.loc) R.add_fingerprint(user) qdel(src) -/obj/item/roller/afterattack(atom/target, mob/user, proximity, params) +/obj/item/roller/afterattack__legacy__attackchain(atom/target, mob/user, proximity, params) if(!proximity) return if(isturf(target)) @@ -200,7 +200,7 @@ R.add_fingerprint(user) qdel(src) -/obj/item/roller/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/roller/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/roller_holder)) var/obj/item/roller_holder/RH = W if(!RH.held) @@ -216,7 +216,7 @@ origin_tech = "magnets=3;biotech=4;powerstorage=3" extended = /obj/structure/bed/roller/holo -/obj/item/roller/holo/attackby(obj/item/W, mob/user, params) +/obj/item/roller/holo/attackby__legacy__attackchain(obj/item/W, mob/user, params) return /obj/structure/bed/roller/MouseDrop(over_object, src_location, over_location) @@ -242,7 +242,7 @@ ..() held = new /obj/item/roller(src) -/obj/item/roller_holder/attack_self(mob/user as mob) +/obj/item/roller_holder/attack_self__legacy__attackchain(mob/user as mob) if(!held) to_chat(user, "The rack is empty.") return diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index b9c9d10163f77..68acdf87b6178 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -36,7 +36,7 @@ . = ..() handle_rotation() -/obj/structure/chair/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/structure/chair/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/assembly/shock_kit)) var/obj/item/assembly/shock_kit/SK = W if(!SK.status) @@ -294,7 +294,7 @@ armrest.layer = ABOVE_MOB_LAYER return ..() -/obj/structure/chair/sofa/attacked_by(obj/item/I, mob/living/user) +/obj/structure/chair/sofa/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) . = ..() if(!colorable) return @@ -399,7 +399,7 @@ /obj/structure/chair/sofa/bench/handle_layer() return -/obj/structure/chair/sofa/bench/attacked_by(obj/item/I, mob/living/user) +/obj/structure/chair/sofa/bench/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) . = ..() if(istype(I, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = I @@ -557,7 +557,7 @@ return 1 return 0 -/obj/item/chair/afterattack(atom/target, mob/living/carbon/user, proximity) +/obj/item/chair/afterattack__legacy__attackchain(atom/target, mob/living/carbon/user, proximity) ..() if(!proximity) return @@ -571,7 +571,7 @@ playsound(src.loc, 'sound/weapons/punch1.ogg', 50, TRUE, -1) smash(user) -/obj/item/chair/stool/attack(mob/M as mob, mob/user as mob) +/obj/item/chair/stool/attack__legacy__attackchain(mob/M as mob, mob/user as mob) if(prob(5) && isliving(M)) user.visible_message("[user] breaks [src] over [M]'s back!.") user.unEquip(src) diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index a2ac6103dfb97..160e74bbad323 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -27,7 +27,7 @@ ///What stacks can be used to make the table, and if it will result in a unique table var/list/restrict_table_types = list() //ex: list(/obj/item/stack/tile/carpet = /obj/structure/table/wood/poker, /obj/item/stack/sheet/wood = /obj/item/stack/sheet/wood::table_type), carpet will make poker table, wood will result in standard table_type. If the list is empty, any material can be used for its default table_type. -/obj/structure/table_frame/attackby(obj/item/I, mob/user, params) +/obj/structure/table_frame/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!try_make_table(I, user)) return ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 22287c20f7bc6..23f533f22967b 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -223,7 +223,7 @@ return TRUE qdel(G) -/obj/structure/table/attackby(obj/item/I, mob/user, params) +/obj/structure/table/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/grab)) tablepush(I, user) return @@ -935,7 +935,7 @@ step(O, get_dir(O, src)) return TRUE -/obj/structure/rack/attackby(obj/item/W, mob/user, params) +/obj/structure/rack/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(isrobot(user)) return if(user.a_intent == INTENT_HARM) @@ -1016,7 +1016,7 @@ new /obj/item/stack/sheet/metal(user.loc) qdel(src) -/obj/item/rack_parts/attack_self(mob/user) +/obj/item/rack_parts/attack_self__legacy__attackchain(mob/user) if(building) return building = TRUE diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index b5e20b076c962..e86d23a5d356d 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -95,7 +95,7 @@ add_fingerprint(usr) return TRUE -/obj/structure/dispenser/attackby(obj/item/I, mob/user, params) +/obj/structure/dispenser/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/tank/internals/oxygen) || istype(I, /obj/item/tank/internals/air) || istype(I, /obj/item/tank/internals/anesthetic)) try_insert_tank(user, stored_oxygen_tanks, I) return diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 503101e02b7de..625a8a8ba919f 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -22,7 +22,7 @@ pinned_target = null density = TRUE -/obj/structure/target_stake/attackby(obj/item/W, mob/user, params) +/obj/structure/target_stake/attackby__legacy__attackchain(obj/item/W, mob/user, params) // Putting objects on the stake. Most importantly, targets if(istype(W, /obj/item/target) && !pinned_target) density = FALSE diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index aa3e6163f755e..70df8bf037cc6 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -104,7 +104,7 @@ L.Weaken(10 SECONDS) -/obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, params) +/obj/structure/transit_tube/station/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/grab) && hatch_state == TRANSIT_TUBE_OPEN) var/obj/item/grab/G = W if(ismob(G.affecting) && G.state >= GRAB_AGGRESSIVE) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 06631ce17fdbc..e882da691101a 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -62,7 +62,7 @@ pixel_y = -8 layer = FLY_LAYER -/obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) +/obj/structure/toilet/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/reagent_containers)) if(!open) return @@ -230,7 +230,7 @@ anchored = TRUE -/obj/structure/urinal/attackby(obj/item/I, mob/user, params) +/obj/structure/urinal/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/grab)) var/obj/item/grab/G = I if(!G.confirm()) @@ -339,7 +339,7 @@ if(istype(T) && !T.density) T.MakeSlippery(TURF_WET_WATER, 5 SECONDS) -/obj/machinery/shower/attackby(obj/item/I, mob/user, params) +/obj/machinery/shower/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.type == /obj/item/analyzer) to_chat(user, "The water temperature seems to be [current_temperature].") return ..() @@ -540,7 +540,7 @@ user.clean_blood() -/obj/structure/sink/attackby(obj/item/O, mob/user, params) +/obj/structure/sink/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(busy) to_chat(user, "Someone's already washing here!") return @@ -650,7 +650,7 @@ ..() icon_state = "puddle" -/obj/structure/sink/puddle/attackby(obj/item/O as obj, mob/user as mob, params) +/obj/structure/sink/puddle/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) icon_state = "puddle-splash" ..() icon_state = "puddle" @@ -711,7 +711,7 @@ ..() desc = "An entire [result_name] in a box, straight from Space Sweden. It has an [pick("unpronounceable", "overly accented", "entirely gibberish", "oddly normal-sounding")] name." -/obj/item/bathroom_parts/attack_self(mob/user) +/obj/item/bathroom_parts/attack_self__legacy__attackchain(mob/user) var/turf/T = get_turf(user) if(!T) to_chat(user, "You can't build that here!") diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index a5db59da8af93..4a12a0132f01e 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -103,7 +103,7 @@ else return 1 -/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params) +/obj/structure/windoor_assembly/attackby__legacy__attackchain(obj/item/W, mob/user, params) //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 b90246baa5b51..0727ea69e34d8 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -186,7 +186,7 @@ deconstruct(FALSE) M.visible_message("[M] smashes through [src]!", "You smash through [src].", "You hear glass breaking.") -/obj/structure/window/attackby(obj/item/I, mob/living/user, params) +/obj/structure/window/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(!can_be_reached(user)) return 1 //skip the afterattack diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 748bcdaab3981..c863cde3f8f6b 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -152,7 +152,7 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama W.update_icon() return W -/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob, params) +/turf/simulated/floor/attackby__legacy__attackchain(obj/item/C as obj, mob/user as mob, params) if(!C || !user) return TRUE @@ -207,7 +207,7 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","dama var/turf/simulated/floor/plating/P = pry_tile(thing, user, TRUE) if(!istype(P)) return - P.attackby(T, user, params) + P.attackby__legacy__attackchain(T, user, params) /turf/simulated/floor/proc/pry_tile(obj/item/C, mob/user, silent = FALSE) if(!silent) diff --git a/code/game/turfs/simulated/floor/asteroid_floors.dm b/code/game/turfs/simulated/floor/asteroid_floors.dm index cd0bf4891085e..d9802a666ff64 100644 --- a/code/game/turfs/simulated/floor/asteroid_floors.dm +++ b/code/game/turfs/simulated/floor/asteroid_floors.dm @@ -63,10 +63,10 @@ if(S.pickup_all_on_tile) for(var/obj/item/stack/ore/O in contents) - O.attackby(S, user) + O.attackby__legacy__attackchain(S, user) return -/turf/simulated/floor/plating/asteroid/attackby(obj/item/I, mob/user, params) +/turf/simulated/floor/plating/asteroid/attackby__legacy__attackchain(obj/item/I, mob/user, params) //note that this proc does not call ..() if(!I|| !user) return FALSE diff --git a/code/game/turfs/simulated/floor/chasm.dm b/code/game/turfs/simulated/floor/chasm.dm index 4a819fd6385a5..2ad987572d183 100644 --- a/code/game/turfs/simulated/floor/chasm.dm +++ b/code/game/turfs/simulated/floor/chasm.dm @@ -62,7 +62,7 @@ underlay_appearance.icon_state = "basalt" return TRUE -/turf/simulated/floor/chasm/attackby(obj/item/C, mob/user, params, area/area_restriction) +/turf/simulated/floor/chasm/attackby__legacy__attackchain(obj/item/C, mob/user, params, area/area_restriction) ..() if(istype(C, /obj/item/stack/rods)) var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 78586e5bb78b1..a13082aaca882 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -83,7 +83,7 @@ /turf/simulated/floor/grass/get_broken_states() return list("damaged") -/turf/simulated/floor/grass/attackby(obj/item/C, mob/user, params) +/turf/simulated/floor/grass/attackby__legacy__attackchain(obj/item/C, mob/user, params) if(..()) return if(istype(C, /obj/item/shovel)) diff --git a/code/game/turfs/simulated/floor/indestructible.dm b/code/game/turfs/simulated/floor/indestructible.dm index 5eaf1b65af3f6..02d7a526c2363 100644 --- a/code/game/turfs/simulated/floor/indestructible.dm +++ b/code/game/turfs/simulated/floor/indestructible.dm @@ -18,7 +18,7 @@ /turf/simulated/floor/indestructible/burn_down() return -/turf/simulated/floor/indestructible/attackby(obj/item/I, mob/user, params) +/turf/simulated/floor/indestructible/attackby__legacy__attackchain(obj/item/I, mob/user, params) return /turf/simulated/floor/indestructible/attack_hand(mob/user) diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm index 2eab0b2fb0d60..880cde958178c 100644 --- a/code/game/turfs/simulated/floor/lava.dm +++ b/code/game/turfs/simulated/floor/lava.dm @@ -119,7 +119,7 @@ L.IgniteMob() -/turf/simulated/floor/lava/attackby(obj/item/C, mob/user, params) //Lava isn't a good foundation to build on +/turf/simulated/floor/lava/attackby__legacy__attackchain(obj/item/C, mob/user, params) //Lava isn't a good foundation to build on if(istype(C, /obj/item/stack/rods/lava)) var/obj/item/stack/rods/lava/R = C var/obj/structure/lattice/lava/H = locate(/obj/structure/lattice/lava, src) @@ -183,7 +183,7 @@ . = ..() . += "Some liquid plasma could probably be scooped up with a container." -/turf/simulated/floor/lava/lava_land_surface/plasma/attackby(obj/item/I, mob/user, params) +/turf/simulated/floor/lava/lava_land_surface/plasma/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!I.is_open_container()) return ..() if(!I.reagents.add_reagent("plasma", 10)) diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm index 5d3e3982e24e6..e592923681296 100644 --- a/code/game/turfs/simulated/floor/light_floor.dm +++ b/code/game/turfs/simulated/floor/light_floor.dm @@ -50,7 +50,7 @@ return toggle_light(!on) -/turf/simulated/floor/light/attackby(obj/item/C, mob/user, params) +/turf/simulated/floor/light/attackby__legacy__attackchain(obj/item/C, mob/user, params) if(istype(C, /obj/item/light/bulb)) //only for light tiles if(!light_broken) qdel(C) diff --git a/code/game/turfs/simulated/floor/mineral_floors.dm b/code/game/turfs/simulated/floor/mineral_floors.dm index 6eed3f080b3d0..d3ffe5a854c28 100644 --- a/code/game/turfs/simulated/floor/mineral_floors.dm +++ b/code/game/turfs/simulated/floor/mineral_floors.dm @@ -34,7 +34,7 @@ if(exposed_temperature > 300) PlasmaBurn() -/turf/simulated/floor/mineral/plasma/attackby(obj/item/W, mob/user, params) +/turf/simulated/floor/mineral/plasma/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(W.get_heat() > 300)//If the temperature of the object is over 300, then ignite message_admins("Plasma flooring was ignited by [key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) in ([x],[y],[z] - JMP)",0,1) log_game("Plasma flooring was ignited by [key_name(user)] in ([x],[y],[z])") @@ -174,7 +174,7 @@ if(istype(M)) squeek() -/turf/simulated/floor/mineral/bananium/attackby(obj/item/W, mob/user, params) +/turf/simulated/floor/mineral/bananium/attackby__legacy__attackchain(obj/item/W, mob/user, params) .=..() if(!.) honk() @@ -250,7 +250,7 @@ if(istype(AM)) radiate() -/turf/simulated/floor/mineral/uranium/attackby(obj/item/W, mob/user, params) +/turf/simulated/floor/mineral/uranium/attackby__legacy__attackchain(obj/item/W, mob/user, params) .=..() if(!.) radiate() diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 82e34dd3f79d6..820d5bc0eb71c 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -48,7 +48,7 @@ if(unfastened) . += "It has been unfastened." -/turf/simulated/floor/plating/attackby(obj/item/C, mob/user, params) +/turf/simulated/floor/plating/attackby__legacy__attackchain(obj/item/C, mob/user, params) if(..()) return TRUE @@ -393,7 +393,7 @@ if(METAL_FOAM_IRON) icon_state = "ironfoam" -/turf/simulated/floor/plating/metalfoam/attackby(obj/item/C, mob/user, params) +/turf/simulated/floor/plating/metalfoam/attackby__legacy__attackchain(obj/item/C, mob/user, params) if(..()) return TRUE diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index fdba192ee8599..48ce133374eee 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -62,10 +62,10 @@ /turf/simulated/mineral/shuttleRotate(rotation) QUEUE_SMOOTH(src) -/turf/simulated/mineral/attackby(obj/item/I, mob/user, params) +/turf/simulated/mineral/attackby__legacy__attackchain(obj/item/I, mob/user, params) // TODO: Just sticking this here for now because attack chain refactor is coming later // No point in threading this through everything right now - if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, I, user, params) & COMPONENT_NO_AFTERATTACK) + if(SEND_SIGNAL(src, COMSIG_ATTACK_BY, I, user, params) & COMPONENT_SKIP_AFTERATTACK) return if(!user.IsAdvancedToolUser()) @@ -126,15 +126,15 @@ if(ishuman(AM)) var/mob/living/carbon/human/H = AM if((istype(H.l_hand,/obj/item/pickaxe)) && (!H.hand)) - attackby(H.l_hand,H) + attackby__legacy__attackchain(H.l_hand,H) else if((istype(H.r_hand,/obj/item/pickaxe)) && H.hand) - attackby(H.r_hand,H) + attackby__legacy__attackchain(H.r_hand,H) return else if(isrobot(AM)) var/mob/living/silicon/robot/R = AM if(istype(R.module_active, /obj/item/pickaxe)) - attackby(R.module_active, R) + attackby__legacy__attackchain(R.module_active, R) else if(ismecha(AM)) var/obj/mecha/M = AM @@ -192,7 +192,7 @@ should_reset_color = FALSE baseturf = /turf/simulated/floor/plating/asteroid/ancient -/turf/simulated/mineral/ancient/attackby(obj/item/I, mob/user, params) +/turf/simulated/mineral/ancient/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!user.IsAdvancedToolUser()) to_chat(usr, "You don't have the dexterity to do this!") return @@ -250,7 +250,7 @@ /obj/item/pickaxe/drill/diamonddrill, )) -/turf/simulated/mineral/ancient/outer/attackby(obj/item/I, mob/user, params) +/turf/simulated/mineral/ancient/outer/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/pickaxe) && !(is_type_in_typecache(I, allowed_picks_typecache))) to_chat(user, "Only a diamond tools or a sonic jackhammer can break this rock.") return @@ -278,7 +278,7 @@ /obj/item/pickaxe/drill/diamonddrill, )) -/turf/simulated/mineral/ancient/lava_land_surface_hard/attackby(obj/item/I, mob/user, params) +/turf/simulated/mineral/ancient/lava_land_surface_hard/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/pickaxe) && !(is_type_in_typecache(I, allowed_picks_typecache))) to_chat(user, "Only a diamond tools or a sonic jackhammer can break this rock.") return diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 251151d413423..c59f8e5220f92 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -342,7 +342,7 @@ add_fingerprint(user) return ..() -/turf/simulated/wall/attackby(obj/item/I, mob/user, params) +/turf/simulated/wall/attackby__legacy__attackchain(obj/item/I, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) if(!isturf(user.loc)) diff --git a/code/game/turfs/simulated/walls_indestructible.dm b/code/game/turfs/simulated/walls_indestructible.dm index 9b8af3672dfff..b4d822bb10e67 100644 --- a/code/game/turfs/simulated/walls_indestructible.dm +++ b/code/game/turfs/simulated/walls_indestructible.dm @@ -34,7 +34,7 @@ /turf/simulated/wall/indestructible/burn_down() return -/turf/simulated/wall/indestructible/attackby(obj/item/I, mob/user, params) +/turf/simulated/wall/indestructible/attackby__legacy__attackchain(obj/item/I, mob/user, params) return /turf/simulated/wall/indestructible/attack_hand(mob/user) diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index 7dc6f13e138c5..97a2c674a16aa 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -87,7 +87,7 @@ radiate() ..() -/turf/simulated/wall/mineral/uranium/attackby(obj/item/W as obj, mob/user as mob, params) +/turf/simulated/wall/mineral/uranium/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) radiate() ..() @@ -106,7 +106,7 @@ smoothing_groups = list(SMOOTH_GROUP_SIMULATED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASMA_WALLS) canSmoothWith = list(SMOOTH_GROUP_PLASMA_WALLS) -/turf/simulated/wall/mineral/plasma/attackby(obj/item/W, mob/user) +/turf/simulated/wall/mineral/plasma/attackby__legacy__attackchain(obj/item/W, mob/user) if(W.get_heat() > 300)//If the temperature of the object is over 300, then ignite message_admins("Plasma wall ignited by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1) log_game("Plasma wall ignited by [key_name(user)] in ([x], [y], [z])") @@ -171,7 +171,7 @@ smoothing_groups = list(SMOOTH_GROUP_SIMULATED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WOOD_WALLS) canSmoothWith = list(SMOOTH_GROUP_WOOD_WALLS) -/turf/simulated/wall/mineral/wood/attackby(obj/item/W, mob/user) +/turf/simulated/wall/mineral/wood/attackby__legacy__attackchain(obj/item/W, mob/user) if(W.sharp && W.force) var/duration = (48 / W.force) * 2 //In seconds, for now. if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/fireaxe)) diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 8c31d3d415885..a922b664583d3 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -40,7 +40,7 @@ if(RWALL_SHEATH) . += "The support rods have been sliced through, and the outer sheath is connected loosely to the girder." -/turf/simulated/wall/r_wall/attackby(obj/item/I, mob/user, params) +/turf/simulated/wall/r_wall/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(d_state == RWALL_COVER && istype(I, /obj/item/gun/energy/plasmacutter)) to_chat(user, "You begin slicing through the metal cover...") if(I.use_tool(src, user, 40, volume = I.tool_volume) && d_state == RWALL_COVER) diff --git a/code/game/turfs/space/space_turf.dm b/code/game/turfs/space/space_turf.dm index 21d4a3f4b7d73..712aed9a41caa 100644 --- a/code/game/turfs/space/space_turf.dm +++ b/code/game/turfs/space/space_turf.dm @@ -74,7 +74,7 @@ return set_light(0) -/turf/space/attackby(obj/item/C as obj, mob/user as mob, params) +/turf/space/attackby__legacy__attackchain(obj/item/C as obj, mob/user as mob, params) ..() if(istype(C, /obj/item/stack/rods)) var/obj/item/stack/rods/R = C diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index e2f7bc5e67ade..07fc46f73f9e5 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -5,7 +5,7 @@ dir = SOUTH //Overwrite because we dont want people building rods in space. -/turf/space/transit/attackby(obj/O as obj, mob/user as mob, params) +/turf/space/transit/attackby__legacy__attackchain(obj/O as obj, mob/user as mob, params) return /// moving to the north diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 85f6c09c388d0..eef62cd46f4c9 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -482,13 +482,13 @@ if(SSticker) GLOB.cameranet.updateVisibility(src) -/turf/attackby(obj/item/I, mob/user, params) +/turf/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(can_lay_cable()) if(istype(I, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = I for(var/obj/structure/cable/LC in src) if(LC.d1 == 0 || LC.d2 == 0) - LC.attackby(C, user) + LC.attackby__legacy__attackchain(C, user) return C.place_turf(src, user) return TRUE @@ -497,7 +497,7 @@ if(R.loaded) for(var/obj/structure/cable/LC in src) if(LC.d1 == 0 || LC.d2 == 0) - LC.attackby(R, user) + LC.attackby__legacy__attackchain(R, user) return R.loaded.place_turf(src, user) R.is_empty(user) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index b4c26706babab..c10a2b406fa99 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2011,7 +2011,7 @@ possible_guardians -= "Random" scarab.possible_guardians = list() scarab.possible_guardians += typechoice - scarab.attack_self(H) + scarab.attack_self__legacy__attackchain(H) spawn(700) qdel(scarab) logmsg = "scarab guardian." diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index c6793185540cd..e594fd2f32bd4 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -40,7 +40,7 @@ return FALSE return TRUE -/obj/item/antag_spawner/nuke_ops/attack_self(mob/user) +/obj/item/antag_spawner/nuke_ops/attack_self__legacy__attackchain(mob/user) if(!(check_usability(user))) return @@ -187,7 +187,7 @@ var/objective_verb = "Kill" var/mob/living/demon_type = /mob/living/simple_animal/demon/slaughter -/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user) +/obj/item/antag_spawner/slaughter_demon/attack_self__legacy__attackchain(mob/user) if(level_blocks_magic(user.z)) //this is to make sure the wizard does NOT summon a demon from the Den.. to_chat(user, "You should probably wait until you reach the station.") return @@ -279,7 +279,7 @@ var/objective_verb = "Eat" var/mob/living/morph_type = /mob/living/simple_animal/hostile/morph -/obj/item/antag_spawner/morph/attack_self(mob/user) +/obj/item/antag_spawner/morph/attack_self__legacy__attackchain(mob/user) if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a morph from the Den.. to_chat(user, "You should probably wait until you reach the station.") return @@ -349,7 +349,7 @@ var/objective_verb = "Harvest" var/mob/living/revenant = /mob/living/simple_animal/revenant -/obj/item/antag_spawner/revenant/attack_self(mob/user) +/obj/item/antag_spawner/revenant/attack_self__legacy__attackchain(mob/user) if(level_blocks_magic(user.z)) //this is to make sure the wizard does NOT summon a revenant from the Den.. to_chat(user, "You should probably wait until you reach the station.") return @@ -406,7 +406,7 @@ var/objective_verb = "Electrocute" var/mob/living/demon_type = /mob/living/simple_animal/demon/pulse_demon -/obj/item/antag_spawner/pulse_demon/attack_self(mob/user) +/obj/item/antag_spawner/pulse_demon/attack_self__legacy__attackchain(mob/user) if(level_blocks_magic(user.z)) to_chat(user, "You should probably wait until you reach the station.") return diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index 7a94fbf46e467..2982058152b42 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -145,7 +145,7 @@ parent_action.UnregisterSignal(parent_action.owner, COMSIG_MOB_WILLINGLY_DROP) return ..() -/obj/item/melee/changeling_corrosive_acid/afterattack(atom/target, mob/user, proximity, params) +/obj/item/melee/changeling_corrosive_acid/afterattack__legacy__attackchain(atom/target, mob/user, proximity, params) if(target == user) to_chat(user, "You withdraw your readied acid.") parent_action.remove_hand_spell(user) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 3f9c2481dd05f..62d63bb3dec99 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -159,7 +159,7 @@ parent_action = null return ..() -/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, proximity) +/obj/item/melee/arm_blade/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity) return if(istype(target, /obj/structure/table)) diff --git a/code/modules/antagonists/changeling/powers/summon_spiders.dm b/code/modules/antagonists/changeling/powers/summon_spiders.dm index 3233b307958c2..e535b7319f1dc 100644 --- a/code/modules/antagonists/changeling/powers/summon_spiders.dm +++ b/code/modules/antagonists/changeling/powers/summon_spiders.dm @@ -159,7 +159,7 @@ if(!faction_check_mob(M)) enemies |= M -/mob/living/simple_animal/hostile/poison/giant_spider/hunter/infestation_spider/attackby(obj/item/W, mob/user, params) +/mob/living/simple_animal/hostile/poison/giant_spider/hunter/infestation_spider/attackby__legacy__attackchain(obj/item/W, mob/user, params) . = ..() if(W.force == 0) return diff --git a/code/modules/antagonists/mind_flayer/powers/flayer_stealth_powers.dm b/code/modules/antagonists/mind_flayer/powers/flayer_stealth_powers.dm index f06e4850bed32..22152269a6a5e 100644 --- a/code/modules/antagonists/mind_flayer/powers/flayer_stealth_powers.dm +++ b/code/modules/antagonists/mind_flayer/powers/flayer_stealth_powers.dm @@ -189,7 +189,7 @@ w_class = WEIGHT_CLASS_HUGE var/conversion_time = 7 SECONDS -/obj/item/melee/swarm_hand/afterattack(atom/target, mob/living/user, proximity_flag, click_parameters) +/obj/item/melee/swarm_hand/afterattack__legacy__attackchain(atom/target, mob/living/user, proximity_flag, click_parameters) . = ..() if(!isrobot(target)) return diff --git a/code/modules/antagonists/mind_flayer/powers/flayer_weapon_powers.dm b/code/modules/antagonists/mind_flayer/powers/flayer_weapon_powers.dm index 81d20456fd991..a38584f0e7c9c 100644 --- a/code/modules/antagonists/mind_flayer/powers/flayer_weapon_powers.dm +++ b/code/modules/antagonists/mind_flayer/powers/flayer_weapon_powers.dm @@ -283,10 +283,10 @@ var/obj/item/ammo_casing/AC = magazine.get_round() //load next casing. chambered = AC -/obj/item/gun/projectile/revolver/doublebarrel/flayer/attack_self(mob/living/user) +/obj/item/gun/projectile/revolver/doublebarrel/flayer/attack_self__legacy__attackchain(mob/living/user) return FALSE // Not getting those shrapnel rounds out of there. -/obj/item/gun/projectile/revolver/doublebarrel/flayer/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/revolver/doublebarrel/flayer/attackby__legacy__attackchain(obj/item/A, mob/user, params) return FALSE // No loading your gun /obj/item/gun/projectile/revolver/doublebarrel/flayer/sleight_of_handling(mob/living/carbon/human/user) diff --git a/code/modules/antagonists/traitor/contractor/items/contractor_pinpointer.dm b/code/modules/antagonists/traitor/contractor/items/contractor_pinpointer.dm index 119e868abe8f9..dc3472cd3afe1 100644 --- a/code/modules/antagonists/traitor/contractor/items/contractor_pinpointer.dm +++ b/code/modules/antagonists/traitor/contractor/items/contractor_pinpointer.dm @@ -37,7 +37,7 @@ var/turf/there = get_turf(H) return here && there && there.z == here.z -/obj/item/pinpointer/crew/contractor/attack_self(mob/living/user) +/obj/item/pinpointer/crew/contractor/attack_self__legacy__attackchain(mob/living/user) if(owner) if(owner != user.mind.current) to_chat(user, "[src] refuses to do anything.") diff --git a/code/modules/antagonists/traitor/contractor/items/contractor_uplink.dm b/code/modules/antagonists/traitor/contractor/items/contractor_uplink.dm index 2edeadfd98a16..8a34bf9a23a88 100644 --- a/code/modules/antagonists/traitor/contractor/items/contractor_uplink.dm +++ b/code/modules/antagonists/traitor/contractor/items/contractor_uplink.dm @@ -19,7 +19,7 @@ QDEL_NULL(hub) return ..() -/obj/item/contractor_uplink/attack_self(mob/user) +/obj/item/contractor_uplink/attack_self__legacy__attackchain(mob/user) hub.ui_interact(user) /** diff --git a/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm b/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm index a25a691e3a866..d4a54300dbb63 100644 --- a/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm @@ -73,7 +73,7 @@ /obj/item/vamp_claws/customised_abstract_text(mob/living/carbon/owner) return "[owner.p_they(TRUE)] [owner.p_have(FALSE)] bloodied claws extending from [owner.p_their(FALSE)] wrists." -/obj/item/vamp_claws/afterattack(atom/target, mob/user, proximity) +/obj/item/vamp_claws/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity) return @@ -120,7 +120,7 @@ if(HAS_TRAIT(src, TRAIT_WIELDED)) user.changeNext_move(CLICK_CD_MELEE * 0.5) -/obj/item/vamp_claws/attack_self(mob/user) +/obj/item/vamp_claws/attack_self__legacy__attackchain(mob/user) qdel(src) to_chat(user, "You dispel your claws!") diff --git a/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm b/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm index fcbd61fd752fd..7750d4f69b9ff 100644 --- a/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/umbrae_powers.dm @@ -84,7 +84,7 @@ to_chat(user, "The snare sends a psychic backlash!") C.EyeBlind(20 SECONDS) -/obj/item/restraints/legcuffs/beartrap/shadow_snare/attackby(obj/item/I, mob/user) +/obj/item/restraints/legcuffs/beartrap/shadow_snare/attackby__legacy__attackchain(obj/item/I, mob/user) var/obj/item/flash/flash = I if(!istype(flash) || !flash.try_use_flash(user)) return ..() diff --git a/code/modules/antagonists/zombie/zombie_spells.dm b/code/modules/antagonists/zombie/zombie_spells.dm index 391b46c58b346..3739a953438c7 100644 --- a/code/modules/antagonists/zombie/zombie_spells.dm +++ b/code/modules/antagonists/zombie/zombie_spells.dm @@ -88,7 +88,7 @@ else force = initial(force) -/obj/item/zombie_claw/afterattack(atom/atom_target, mob/user, proximity_flag, click_parameters) +/obj/item/zombie_claw/afterattack__legacy__attackchain(atom/atom_target, mob/user, proximity_flag, click_parameters) . = ..() if(!proximity_flag) return @@ -150,6 +150,6 @@ for(var/datum/disease/zombie/zomb in target.viruses) zomb.stage = max(zomb.stage, infection_stage) -/obj/item/zombie_claw/attack_self(mob/user) +/obj/item/zombie_claw/attack_self__legacy__attackchain(mob/user) . = ..() qdel(src) diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm index 7c1d4b913eee4..dbf3db54bf488 100644 --- a/code/modules/arcade/arcade_base.dm +++ b/code/modules/arcade/arcade_base.dm @@ -56,7 +56,7 @@ to_chat(user, "Someone else is already playing this machine, please wait your turn!") return -/obj/machinery/economy/arcade/attackby(obj/item/O, mob/user, params) +/obj/machinery/economy/arcade/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(!freeplay) if(isspacecash(O)) insert_cash(O, user, token_price) diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm index 85d2b65785219..992f8be598701 100644 --- a/code/modules/arcade/arcade_prize.dm +++ b/code/modules/arcade/arcade_prize.dm @@ -14,7 +14,7 @@ . = ..() icon_state = pick("prizeball_1","prizeball_2","prizeball_3") -/obj/item/toy/prizeball/attack_self(mob/user as mob) +/obj/item/toy/prizeball/attack_self__legacy__attackchain(mob/user as mob) if(opening) return opening = 1 @@ -73,7 +73,7 @@ ..() update_icon(UPDATE_ICON_STATE) -/obj/item/stack/tickets/attack_self(mob/user as mob) +/obj/item/stack/tickets/attack_self__legacy__attackchain(mob/user as mob) return /obj/item/stack/tickets/update_icon_state() diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm index 2170898307596..bbfb26aa84d7c 100644 --- a/code/modules/arcade/prize_counter.dm +++ b/code/modules/arcade/prize_counter.dm @@ -79,7 +79,7 @@ else icon_state = "prize_counter-on" -/obj/machinery/prize_counter/attackby(obj/item/O, mob/user, params) +/obj/machinery/prize_counter/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/stack/tickets)) var/obj/item/stack/tickets/T = O if(user.unEquip(T)) //Because if you can't drop it for some reason, you shouldn't be increasing the tickets var diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 4b35f44324303..ee47d325f737c 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -99,7 +99,7 @@ return TRUE return FALSE -/obj/item/assembly/attackby(obj/item/W, mob/user, params) +/obj/item/assembly/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(isassembly(W)) var/obj/item/assembly/A = W if(!A.secured && !secured) @@ -128,7 +128,7 @@ else . += "[src] can be attached!" -/obj/item/assembly/attack_self(mob/user) +/obj/item/assembly/attack_self__legacy__attackchain(mob/user) if(!user) return user.set_machine(src) diff --git a/code/modules/assembly/assembly_holder.dm b/code/modules/assembly/assembly_holder.dm index 2b6db0074412d..151ce67aa7e9c 100644 --- a/code/modules/assembly/assembly_holder.dm +++ b/code/modules/assembly/assembly_holder.dm @@ -153,7 +153,7 @@ to_chat(user, "[src] can now be taken apart!") update_icon() -/obj/item/assembly_holder/attack_self(mob/user) +/obj/item/assembly_holder/attack_self__legacy__attackchain(mob/user) add_fingerprint(user) if(secured) if(!a_left || !a_right) @@ -162,13 +162,13 @@ if(istype(a_left, a_right.type)) // If they are the same type it causes issues due to window code switch(tgui_alert(user, "Which side would you like to use?", "Choose", list("Left", "Right"))) if("Left") - a_left.attack_self(user) + a_left.attack_self__legacy__attackchain(user) if("Right") - a_right.attack_self(user) + a_right.attack_self__legacy__attackchain(user) return else - a_left.attack_self(user) - a_right.attack_self(user) + a_left.attack_self__legacy__attackchain(user) + a_right.attack_self__legacy__attackchain(user) else var/turf/T = get_turf(src) if(!T) diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 6cd315d4ded9f..38c60e7167f34 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -27,9 +27,9 @@ . += bombassembly.overlays . += "bomb_assembly" -/obj/item/onetankbomb/attackby(obj/item/W, mob/user, params) +/obj/item/onetankbomb/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/analyzer)) - bombtank.attackby(W, user, params) + bombtank.attackby__legacy__attackchain(W, user, params) return return ..() @@ -65,8 +65,8 @@ to_chat(user, "The hole has been closed.") -/obj/item/onetankbomb/attack_self(mob/user) //pressing the bomb accesses its assembly - bombassembly.attack_self(user, 1) +/obj/item/onetankbomb/attack_self__legacy__attackchain(mob/user) //pressing the bomb accesses its assembly + bombassembly.attack_self__legacy__attackchain(user, 1) add_fingerprint(user) return diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index b85d0037687f0..a7ac581dc3fa5 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -70,7 +70,7 @@ user_health = null // Clear out the user data, we're no longer scanning STOP_PROCESSING(SSobj, src) -/obj/item/assembly/health/attack_self(mob/user) +/obj/item/assembly/health/attack_self__legacy__attackchain(mob/user) ui_interact(user) /obj/item/assembly/health/ui_state(mob/user) diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 0f09929b83a1f..f3433f5b208f7 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -57,7 +57,7 @@ return TRUE -/obj/item/assembly/igniter/attack(mob/living/target, mob/living/user) +/obj/item/assembly/igniter/attack__legacy__attackchain(mob/living/target, mob/living/user) if(!cigarette_lighter_act(user, target)) return ..() @@ -82,7 +82,7 @@ cig.light(user, target) return TRUE -/obj/item/assembly/igniter/attack_self(mob/user) +/obj/item/assembly/igniter/attack_self__legacy__attackchain(mob/user) if(!istype(loc, /obj/item/assembly_holder)) activate() add_fingerprint(user) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index f11cccdefc3b4..ee9df746b436e 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -166,7 +166,7 @@ usr << browse(null, "window=infra") return if(usr) - attack_self(usr) + attack_self__legacy__attackchain(usr) /obj/item/assembly/infra/AltClick(mob/user) rotate(user) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 5284fc3fdc8ed..734e9a7f4248e 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -77,7 +77,7 @@ update_icon() pulse(0) -/obj/item/assembly/mousetrap/attack_self(mob/living/user) +/obj/item/assembly/mousetrap/attack_self__legacy__attackchain(mob/living/user) if(!armed) to_chat(user, "You arm [src].") else diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index a9fb8b088f36c..a3163d7141b51 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -137,4 +137,4 @@ return if(usr) - attack_self(usr) + attack_self__legacy__attackchain(usr) diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 02a5f9d9739ea..8ecfa9d1d231d 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -35,9 +35,9 @@ add_fingerprint(user) return TRUE -/obj/item/assembly/shock_kit/attack_self(mob/user as mob) - part1.attack_self(user, status) - part2.attack_self(user, status) +/obj/item/assembly/shock_kit/attack_self__legacy__attackchain(mob/user as mob) + part1.attack_self__legacy__attackchain(user, status) + part2.attack_self__legacy__attackchain(user, status) add_fingerprint(user) return diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 7bc513cd2fc0c..d8f874ac6ed46 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -34,7 +34,7 @@ GLOBAL_LIST_EMPTY(remote_signalers) to_chat(user, "You activate [src].") activate() -/obj/item/assembly/signaler/attackby(obj/item/W, mob/user, params) +/obj/item/assembly/signaler/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(issignaler(W)) var/obj/item/assembly/signaler/signaler2 = W if(secured && signaler2.secured) @@ -76,7 +76,7 @@ GLOBAL_LIST_EMPTY(remote_signalers) // UI STUFF // -/obj/item/assembly/signaler/attack_self(mob/user) +/obj/item/assembly/signaler/attack_self__legacy__attackchain(mob/user) ui_interact(user) /obj/item/assembly/signaler/ui_state(mob/user) diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index de4e4ee85b526..ae87e8534b04f 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -126,4 +126,4 @@ return if(usr) - attack_self(usr) + attack_self__legacy__attackchain(usr) diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index f367dea9c49a7..5db23c7c7e948 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -46,7 +46,7 @@ return ..() // previously this toggled listning when not in a holder, that's a little silly. It was only called in attack_self that way. -/obj/item/assembly/voice/attack_self(mob/user) +/obj/item/assembly/voice/attack_self__legacy__attackchain(mob/user) if(!user || !secured) return FALSE @@ -68,7 +68,7 @@ origin_tech = "magnets=1;engineering=1" bomb_name = "noise-activated bomb" -/obj/item/assembly/voice/noise/attack_self(mob/user) +/obj/item/assembly/voice/noise/attack_self__legacy__attackchain(mob/user) return /obj/item/assembly/voice/noise/examine(mob/user) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 202817bf443cf..164d81a608156 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -994,7 +994,7 @@ playsound(src.loc, 'sound/effects/sparks4.ogg', 50, TRUE) return TRUE -/obj/machinery/alarm/attackby(obj/item/I, mob/user, params) +/obj/machinery/alarm/attackby__legacy__attackchain(obj/item/I, mob/user, params) add_fingerprint(user) switch(buildstage) diff --git a/code/modules/atmospherics/machinery/atmospherics.dm b/code/modules/atmospherics/machinery/atmospherics.dm index 22f8ba3ec196e..945b1a6c4daff 100644 --- a/code/modules/atmospherics/machinery/atmospherics.dm +++ b/code/modules/atmospherics/machinery/atmospherics.dm @@ -256,7 +256,7 @@ Pipelines + Other Objects -> Pipe network return FALSE //(De)construction -/obj/machinery/atmospherics/attackby(obj/item/W, mob/user) +/obj/machinery/atmospherics/attackby__legacy__attackchain(obj/item/W, mob/user) var/turf/T = get_turf(src) if(T.transparent_floor) to_chat(user, "You can't interact with something that's under the floor!") diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 25c0758b0ae29..16f7ff116e735 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -157,7 +157,7 @@ Thus, the two variables affect pump operation are set in New(): return update_icon() -/obj/machinery/atmospherics/binary/pump/attackby(obj/item/W, mob/user, params) +/obj/machinery/atmospherics/binary/pump/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(is_pen(W)) rename_interactive(user, W) return TRUE diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 63ec6859eaa7e..a39e69c387328 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -153,7 +153,7 @@ Thus, the two variables affect pump operation are set in New(): return update_icon() -/obj/machinery/atmospherics/binary/volume_pump/attackby(obj/item/W, mob/user, params) +/obj/machinery/atmospherics/binary/volume_pump/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(is_pen(W)) rename_interactive(user, W) return TRUE diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index f4bac4ae3882a..8ac8021ead3ec 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -227,7 +227,7 @@ if(.) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos") -/obj/machinery/atmospherics/trinary/filter/attackby(obj/item/W, mob/user, params) +/obj/machinery/atmospherics/trinary/filter/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(is_pen(W)) rename_interactive(user, W) return diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index 677df08ea0665..977ce8e4d18ab 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -201,7 +201,7 @@ if(.) investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos") -/obj/machinery/atmospherics/trinary/mixer/attackby(obj/item/W, mob/user, params) +/obj/machinery/atmospherics/trinary/mixer/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(is_pen(W)) rename_interactive(user, W) return diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index eea8d55505f11..6ed09eda30bc8 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -298,7 +298,7 @@ add_fingerprint(usr) -/obj/machinery/atmospherics/unary/cryo_cell/attackby(obj/item/G, mob/user, params) +/obj/machinery/atmospherics/unary/cryo_cell/attackby__legacy__attackchain(obj/item/G, mob/user, params) if(istype(G, /obj/item/reagent_containers/glass) && user.a_intent != INTENT_HARM) var/obj/item/reagent_containers/B = G if(beaker) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 12e3d2bf01a4d..e59f55d0b45a2 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -182,7 +182,7 @@ pipe_image.plane = ABOVE_HUD_PLANE playsound(loc, 'sound/weapons/bladeslice.ogg', 100, TRUE) -/obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user, params) +/obj/machinery/atmospherics/unary/vent_pump/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/paper)) if(!welded) if(open) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index c9ee9fd5c0258..2cf3b4d5935b9 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -118,7 +118,7 @@ update_icon() return TRUE -/obj/machinery/atmospherics/portable/attackby(obj/item/W, mob/user, params) +/obj/machinery/atmospherics/portable/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/tank)) if(!(stat & BROKEN)) if(!user.drop_item()) @@ -155,7 +155,7 @@ else to_chat(user, "Nothing happens.") -/obj/machinery/atmospherics/portable/attacked_by(obj/item/I, mob/user) +/obj/machinery/atmospherics/portable/attacked_by__legacy__attackchain(obj/item/I, mob/user) if(I.force < 10 && !(stat & BROKEN)) take_damage(0) else diff --git a/code/modules/awaymissions/mission_code/ghost_role_spawners/golems.dm b/code/modules/awaymissions/mission_code/ghost_role_spawners/golems.dm index f8d301fa93c8e..7d69d469a3aae 100644 --- a/code/modules/awaymissions/mission_code/ghost_role_spawners/golems.dm +++ b/code/modules/awaymissions/mission_code/ghost_role_spawners/golems.dm @@ -13,7 +13,7 @@ name = "incomplete servant golem shell" shell_type = /obj/effect/mob_spawn/human/alive/golem/servant -/obj/item/golem_shell/attackby(obj/item/I, mob/user, params) +/obj/item/golem_shell/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() var/static/list/golem_shell_species_types = list( /obj/item/stack/sheet/metal = /datum/species/golem, @@ -166,7 +166,7 @@ create(ckey = user.ckey, name = user.real_name) user.death() -/obj/effect/mob_spawn/human/alive/golem/attackby(obj/item/I, mob/living/carbon/user, params) +/obj/effect/mob_spawn/human/alive/golem/attackby__legacy__attackchain(obj/item/I, mob/living/carbon/user, params) if(!istype(I, /obj/item/slimepotion/transference)) return ..() if(iscarbon(user) && can_transfer) diff --git a/code/modules/awaymissions/mission_code/ruins/gps_ruin.dm b/code/modules/awaymissions/mission_code/ruins/gps_ruin.dm index fa26eea5d0d69..51fa397574098 100644 --- a/code/modules/awaymissions/mission_code/ruins/gps_ruin.dm +++ b/code/modules/awaymissions/mission_code/ruins/gps_ruin.dm @@ -10,4 +10,4 @@ gpstag = "Unknown Signal" /obj/item/gps/ruin/attack_hand(mob/user) - attack_self(user) + attack_self__legacy__attackchain(user) diff --git a/code/modules/awaymissions/mission_code/ruins/telecomns.dm b/code/modules/awaymissions/mission_code/ruins/telecomns.dm index d485817cf1930..2d24fe5e65f3d 100644 --- a/code/modules/awaymissions/mission_code/ruins/telecomns.dm +++ b/code/modules/awaymissions/mission_code/ruins/telecomns.dm @@ -93,7 +93,7 @@ GLOBAL_LIST_EMPTY(telecomms_trap_tank) /obj/machinery/autolathe/trapped/Initialize(mapload) . = ..() - RegisterSignal(src, COMSIG_PARENT_ATTACKBY, PROC_REF(material_container_shenanigins)) + RegisterSignal(src, COMSIG_ATTACK_BY, PROC_REF(material_container_shenanigins)) /obj/machinery/autolathe/trapped/proc/material_container_shenanigins(datum/source, obj/item/attacker, mob/user) if(!disguise_broken) @@ -393,14 +393,14 @@ GLOBAL_LIST_EMPTY(telecomms_trap_tank) QDEL_NULL(integrated_console) return ..() -/obj/item/remote_ai_upload/attack_self(mob/user as mob) +/obj/item/remote_ai_upload/attack_self__legacy__attackchain(mob/user as mob) integrated_console.attack_hand(user) -/obj/item/remote_ai_upload/attackby(obj/item/O, mob/user, params) +/obj/item/remote_ai_upload/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/card/emag)) to_chat(user, "You are more likely to damage this with an emag, than achieve something useful.") return - var/time_to_die = integrated_console.attackby(O, user, params) + var/time_to_die = integrated_console.attackby__legacy__attackchain(O, user, params) if(time_to_die) to_chat(user, "[src]'s relay begins to overheat...") playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) diff --git a/code/modules/awaymissions/mission_code/ruins/watcher_grave.dm b/code/modules/awaymissions/mission_code/ruins/watcher_grave.dm index 715f78f424914..398eda18c0952 100644 --- a/code/modules/awaymissions/mission_code/ruins/watcher_grave.dm +++ b/code/modules/awaymissions/mission_code/ruins/watcher_grave.dm @@ -100,7 +100,7 @@ /// Who are we orbiting? var/mob/living/owner -/obj/item/watcher_hatchling/attack_self(mob/user, modifiers) +/obj/item/watcher_hatchling/attack_self__legacy__attackchain(mob/user, modifiers) . = ..() if(!isnull(orbiter)) watcher_return() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 90f4024708777..553179b84eaae 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -274,7 +274,7 @@ /obj/item/clothing/gloves/proc/Touch(atom/A, proximity) return // return TRUE to cancel attack_hand() -/obj/item/clothing/gloves/attackby(obj/item/W, mob/user, params) +/obj/item/clothing/gloves/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/wirecutters)) if(!clipped) playsound(src.loc, W.usesound, 100, 1) @@ -525,7 +525,7 @@ return FALSE -/obj/item/clothing/head/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/head/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/clothing/head) && can_have_hats) attach_hat(I, user, TRUE) @@ -665,7 +665,7 @@ if(H.get_item_by_slot(ITEM_SLOT_SHOES) == src) REMOVE_TRAIT(H, TRAIT_NOSLIP, UID()) -/obj/item/clothing/shoes/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/shoes/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/match) && src.loc == user) var/obj/item/match/M = I if(!M.lit && !M.burnt) // Match isn't lit, but isn't burnt. @@ -1032,13 +1032,13 @@ return FALSE return TRUE -/obj/item/clothing/under/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/under/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/clothing/accessory)) attach_accessory(I, user, TRUE) if(length(accessories)) for(var/obj/item/clothing/accessory/A in accessories) - A.attackby(I, user, params) + A.attackby__legacy__attackchain(I, user, params) return TRUE . = ..() diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index d6189f7615874..97b535890a1a5 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -67,7 +67,7 @@ var/datum/action/A = X A.UpdateButtons() -/obj/item/clothing/glasses/meson/engine/attack_self(mob/user) +/obj/item/clothing/glasses/meson/engine/attack_self__legacy__attackchain(mob/user) toggle_mode(user, TRUE) /obj/item/clothing/glasses/meson/engine/process() diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 420c2888feed3..5874362d7f179 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -3,7 +3,7 @@ if(prescription_upgradable && prescription) upgrade_prescription() -/obj/item/clothing/glasses/attackby(obj/item/I, mob/user) +/obj/item/clothing/glasses/attackby__legacy__attackchain(obj/item/I, mob/user) if(!prescription_upgradable || user.stat || user.restrained() || !ishuman(user)) return ..() var/mob/living/carbon/human/H = user @@ -366,7 +366,7 @@ desc = "Somehow these seem even more out-of-date than normal sunglasses." actions_types = list(/datum/action/item_action/noir) -/obj/item/clothing/glasses/sunglasses/noir/attack_self(mob/user) +/obj/item/clothing/glasses/sunglasses/noir/attack_self__legacy__attackchain(mob/user) toggle_noir(user) /obj/item/clothing/glasses/sunglasses/noir/item_action_slot_check(slot) @@ -383,7 +383,7 @@ var/punused = FALSE actions_types = list(/datum/action/item_action/yeeeaaaaahhhhhhhhhhhhh) -/obj/item/clothing/glasses/sunglasses/yeah/attack_self(mob/user) +/obj/item/clothing/glasses/sunglasses/yeah/attack_self__legacy__attackchain(mob/user) pun(user) /obj/item/clothing/glasses/sunglasses/yeah/proc/pun(mob/user) @@ -451,7 +451,7 @@ "Kidan" = 'icons/mob/clothing/species/kidan/eyes.dmi' ) -/obj/item/clothing/glasses/welding/attack_self(mob/user) +/obj/item/clothing/glasses/welding/attack_self__legacy__attackchain(mob/user) weldingvisortoggle(user) /obj/item/clothing/glasses/welding/superior diff --git a/code/modules/clothing/glasses/tajblind.dm b/code/modules/clothing/glasses/tajblind.dm index 00ec29e529651..c336b9c23a936 100644 --- a/code/modules/clothing/glasses/tajblind.dm +++ b/code/modules/clothing/glasses/tajblind.dm @@ -19,7 +19,7 @@ "Grey" = 'icons/mob/clothing/species/grey/eyes.dmi' ) -/obj/item/clothing/glasses/hud/tajblind/attack_self(mob/user) +/obj/item/clothing/glasses/hud/tajblind/attack_self__legacy__attackchain(mob/user) toggle_veil(user, TRUE) /obj/item/clothing/glasses/hud/tajblind/proc/toggle_veil(mob/user, voluntary) diff --git a/code/modules/clothing/gloves/colored_gloves.dm b/code/modules/clothing/gloves/colored_gloves.dm index 0493b1ac1c25f..a4426893cceeb 100644 --- a/code/modules/clothing/gloves/colored_gloves.dm +++ b/code/modules/clothing/gloves/colored_gloves.dm @@ -60,7 +60,7 @@ /obj/item/clothing/gloves/color/black/thief pickpocket = 1 -/obj/item/clothing/gloves/color/black/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/clothing/gloves/color/black/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/wirecutters)) if(can_be_cut && icon_state == initial(icon_state))//only if not dyed var/confirm = tgui_alert(user, "Do you want to cut off the gloves fingertips? Warning: It might destroy their functionality.", "Cut tips?", list("Yes","No")) diff --git a/code/modules/clothing/gloves/misc_gloves.dm b/code/modules/clothing/gloves/misc_gloves.dm index 3cc42d2328400..956d8254e7d37 100644 --- a/code/modules/clothing/gloves/misc_gloves.dm +++ b/code/modules/clothing/gloves/misc_gloves.dm @@ -162,7 +162,7 @@ if(cell) . += "gloves_cell" -/obj/item/clothing/gloves/color/yellow/stun/attackby(obj/item/W, mob/living/user, params) +/obj/item/clothing/gloves/color/yellow/stun/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/stock_parts/cell)) if(!cell) if(!user.drop_item()) diff --git a/code/modules/clothing/gloves/rings.dm b/code/modules/clothing/gloves/rings.dm index aa64d1ca9f378..c0d6e4e1b9b70 100644 --- a/code/modules/clothing/gloves/rings.dm +++ b/code/modules/clothing/gloves/rings.dm @@ -25,7 +25,7 @@ if(stud) . += "It is adorned with a single gem." -/obj/item/clothing/gloves/ring/attackby(obj/item/I as obj, mob/user as mob, params) +/obj/item/clothing/gloves/ring/attackby__legacy__attackchain(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/stack/sheet/mineral/diamond)) var/obj/item/stack/sheet/mineral/diamond/D = I if(stud) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 40ba093a9f3be..59cb22ee07143 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -17,7 +17,7 @@ "Vox" = 'icons/mob/clothing/species/vox/head.dmi' ) -/obj/item/clothing/head/hardhat/attack_self(mob/living/user) +/obj/item/clothing/head/hardhat/attack_self__legacy__attackchain(mob/living/user) toggle_helmet_light(user) /obj/item/clothing/head/hardhat/proc/toggle_helmet_light(mob/living/user) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 848651f2b1b6d..c676e14ed77e0 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -21,7 +21,7 @@ "Grey" = 'icons/mob/clothing/species/grey/helmet.dmi' ) -/obj/item/clothing/head/helmet/attack_self(mob/user) +/obj/item/clothing/head/helmet/attack_self__legacy__attackchain(mob/user) if(can_toggle && !user.incapacitated()) if(world.time > cooldown + toggle_cooldown) cooldown = world.time diff --git a/code/modules/clothing/head/misc_hats.dm b/code/modules/clothing/head/misc_hats.dm index d8cb0d72d0244..82ed36e1a68e0 100644 --- a/code/modules/clothing/head/misc_hats.dm +++ b/code/modules/clothing/head/misc_hats.dm @@ -277,7 +277,7 @@ "Grey" = 'icons/mob/clothing/species/grey/head.dmi' ) -/obj/item/clothing/head/fedora/attack_self(mob/user) +/obj/item/clothing/head/fedora/attack_self__legacy__attackchain(mob/user) tip_fedora(user) /obj/item/clothing/head/fedora/item_action_slot_check(slot) @@ -488,7 +488,7 @@ ) actions_types = list(/datum/action/item_action/caw) -/obj/item/clothing/head/griffin/attack_self() +/obj/item/clothing/head/griffin/attack_self__legacy__attackchain() caw() /obj/item/clothing/head/griffin/proc/caw() diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 35c40863d2519..1c0f9e83ea2be 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -35,7 +35,7 @@ "Grey" = 'icons/mob/clothing/species/grey/helmet.dmi' ) -/obj/item/clothing/head/welding/attack_self(mob/user) +/obj/item/clothing/head/welding/attack_self__legacy__attackchain(mob/user) weldingvisortoggle(user) /obj/item/clothing/head/welding/flamedecal @@ -80,7 +80,7 @@ if(isturf(location)) location.hotspot_expose(700, 1) -/obj/item/clothing/head/cakehat/attack_self(mob/user) +/obj/item/clothing/head/cakehat/attack_self__legacy__attackchain(mob/user) if(status > 1) return onfire = !onfire @@ -112,7 +112,7 @@ "Vox" = 'icons/mob/clothing/species/vox/head.dmi' ) -/obj/item/clothing/head/ushanka/attack_self(mob/user as mob) +/obj/item/clothing/head/ushanka/attack_self__legacy__attackchain(mob/user as mob) if(icon_state == "ushankadown") icon_state = "ushankaup" item_state = "ushankaup" diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index d995941c91c1e..216a793b30494 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -19,7 +19,7 @@ flipped = FALSE ..() -/obj/item/clothing/head/soft/attack_self(mob/user) +/obj/item/clothing/head/soft/attack_self__legacy__attackchain(mob/user) flip(user) /obj/item/clothing/head/soft/proc/flip(mob/user) diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index cab34dd939f12..14c5b20e33c81 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -19,7 +19,7 @@ "Drask" = 'icons/mob/clothing/species/drask/mask.dmi' ) -/obj/item/clothing/mask/balaclava/attack_self(mob/user) +/obj/item/clothing/mask/balaclava/attack_self__legacy__attackchain(mob/user) adjustmask(user) /obj/item/clothing/mask/luchador diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index b3dbe8df3f804..1c0f6a910ebb4 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -21,7 +21,7 @@ "Plasmaman" = 'icons/mob/clothing/species/plasmaman/mask.dmi' ) -/obj/item/clothing/mask/breath/attack_self(mob/user) +/obj/item/clothing/mask/breath/attack_self__legacy__attackchain(mob/user) adjustmask(user) /obj/item/clothing/mask/breath/AltClick(mob/user) @@ -53,7 +53,7 @@ icon_state = "voxmask2" item_state = "voxmask2" -/obj/item/clothing/mask/breath/vox/attack_self(mob/user) +/obj/item/clothing/mask/breath/vox/attack_self__legacy__attackchain(mob/user) return /obj/item/clothing/mask/breath/vox/AltClick(mob/user) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index db44cb387f9cb..1e3b00c3fea8c 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -48,7 +48,7 @@ "Vulpkanin" = 'icons/mob/clothing/species/vulpkanin/mask.dmi' ) -/obj/item/clothing/mask/gas/welding/attack_self(mob/user) +/obj/item/clothing/mask/gas/welding/attack_self__legacy__attackchain(mob/user) weldingvisortoggle(user) /obj/item/clothing/mask/gas/explorer @@ -73,7 +73,7 @@ /obj/item/clothing/mask/gas/explorer/marines name = "military gas mask" -/obj/item/clothing/mask/gas/explorer/attack_self(mob/user) +/obj/item/clothing/mask/gas/explorer/attack_self__legacy__attackchain(mob/user) adjustmask(user) /obj/item/clothing/mask/gas/explorer/adjustmask(user) @@ -136,7 +136,7 @@ resistance_flags = FLAMMABLE dog_fashion = /datum/dog_fashion/head/clown -/obj/item/clothing/mask/gas/clown_hat/attack_self(mob/living/user) +/obj/item/clothing/mask/gas/clown_hat/attack_self__legacy__attackchain(mob/living/user) var/list/mask_type = list("True Form" = /obj/item/clothing/mask/gas/clown_hat, "The Feminist" = /obj/item/clothing/mask/gas/clown_hat/sexy, "The Madman" = /obj/item/clothing/mask/gas/clown_hat/joker, @@ -234,7 +234,7 @@ /obj/item/clothing/mask/gas/owl_mask/super_hero flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | NODROP -/obj/item/clothing/mask/gas/owl_mask/attack_self() +/obj/item/clothing/mask/gas/owl_mask/attack_self__legacy__attackchain() hoot() /obj/item/clothing/mask/gas/owl_mask/proc/hoot() @@ -364,7 +364,7 @@ else to_chat(user, "It's broken.") -/obj/item/clothing/mask/gas/sechailer/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/clothing/mask/gas/sechailer/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/wirecutters)) if(aggressiveness != 5) to_chat(user, "You broke it!") @@ -394,7 +394,7 @@ to_chat(user, "You adjust the restrictor but nothing happens, probably because its broken.") return TRUE -/obj/item/clothing/mask/gas/sechailer/attack_self() +/obj/item/clothing/mask/gas/sechailer/attack_self__legacy__attackchain() halt() /obj/item/clothing/mask/gas/sechailer/emag_act(mob/user as mob) diff --git a/code/modules/clothing/masks/misc_masks.dm b/code/modules/clothing/masks/misc_masks.dm index b2915e0090cab..b26f2dc893f63 100644 --- a/code/modules/clothing/masks/misc_masks.dm +++ b/code/modules/clothing/masks/misc_masks.dm @@ -113,7 +113,7 @@ origin_tech = "materials=1;engineering=1" materials = list(MAT_METAL=500, MAT_GLASS=50) -/obj/item/clothing/mask/muzzle/safety/shock/attackby(obj/item/W, mob/user, params) +/obj/item/clothing/mask/muzzle/safety/shock/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/assembly/signaler) || istype(W, /obj/item/assembly/voice)) if(istype(trigger, /obj/item/assembly/signaler) || istype(trigger, /obj/item/assembly/voice)) to_chat(user, "Something is already attached to [src].") @@ -198,7 +198,7 @@ ) -/obj/item/clothing/mask/surgical/attack_self(mob/user) +/obj/item/clothing/mask/surgical/attack_self__legacy__attackchain(mob/user) adjustmask(user) /obj/item/clothing/mask/fakemoustache @@ -218,7 +218,7 @@ "Drask" = 'icons/mob/clothing/species/drask/mask.dmi' ) -/obj/item/clothing/mask/fakemoustache/attack_self(mob/user) +/obj/item/clothing/mask/fakemoustache/attack_self__legacy__attackchain(mob/user) pontificate(user) /obj/item/clothing/mask/fakemoustache/item_action_slot_check(slot) @@ -377,7 +377,7 @@ ) actions_types = list(/datum/action/item_action/adjust) -/obj/item/clothing/mask/bandana/attack_self(mob/user) +/obj/item/clothing/mask/bandana/attack_self__legacy__attackchain(mob/user) adjustmask(user) /obj/item/clothing/mask/bandana/red diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 60f6998a72914..30641f6403dc5 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -73,14 +73,14 @@ QDEL_NULL(shackles) return ..() -/obj/item/clothing/shoes/orange/attack_self(mob/user) +/obj/item/clothing/shoes/orange/attack_self__legacy__attackchain(mob/user) if(shackles) user.put_in_hands(shackles) shackles = null slowdown = SHOES_SLOWDOWN icon_state = "orange" -/obj/item/clothing/shoes/orange/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/shoes/orange/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/restraints/handcuffs) && !shackles) if(user.drop_item()) I.forceMove(src) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 6e36ba0d104f6..c7b38f8995eb9 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -34,7 +34,7 @@ return check_mag_pulse(user, removing = TRUE) -/obj/item/clothing/shoes/magboots/attack_self(mob/user) +/obj/item/clothing/shoes/magboots/attack_self__legacy__attackchain(mob/user) toggle_magpulse(user) /obj/item/clothing/shoes/magboots/proc/toggle_magpulse(mob/user, no_message) @@ -272,7 +272,7 @@ cell = null update_icon() -/obj/item/clothing/shoes/magboots/gravity/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/shoes/magboots/gravity/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/stock_parts/cell)) if(cell) to_chat(user, "[src] already has a cell!") diff --git a/code/modules/clothing/spacesuits/alien_suits.dm b/code/modules/clothing/spacesuits/alien_suits.dm index 159b011cc96a6..972b98a5b3ad6 100644 --- a/code/modules/clothing/spacesuits/alien_suits.dm +++ b/code/modules/clothing/spacesuits/alien_suits.dm @@ -214,7 +214,7 @@ "Vox" = 'icons/mob/clothing/species/vox/feet.dmi') multiple_icons = FALSE -/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user) +/obj/item/clothing/shoes/magboots/vox/attack_self__legacy__attackchain(mob/user) if(magpulse) flags &= ~NODROP to_chat(user, "You relax your deathgrip on the flooring.") diff --git a/code/modules/clothing/spacesuits/ert_hardsuits.dm b/code/modules/clothing/spacesuits/ert_hardsuits.dm index db21c8f4efbd9..6a41c7d413753 100644 --- a/code/modules/clothing/spacesuits/ert_hardsuits.dm +++ b/code/modules/clothing/spacesuits/ert_hardsuits.dm @@ -28,7 +28,7 @@ register_camera(wearer) return ..() -/obj/item/clothing/head/helmet/space/hardsuit/ert/attack_self(mob/user) +/obj/item/clothing/head/helmet/space/hardsuit/ert/attack_self__legacy__attackchain(mob/user) if(camera || !has_camera) ..(user) else diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 2043bdd69e061..ac6af273e4eae 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -50,7 +50,7 @@ suit = null return ..() -/obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user) +/obj/item/clothing/head/helmet/space/hardsuit/attack_self__legacy__attackchain(mob/user) toggle_light(user) /obj/item/clothing/head/helmet/space/hardsuit/proc/toggle_light(mob/user) @@ -192,11 +192,11 @@ W.suit = src helmet = W -/obj/item/clothing/suit/space/hardsuit/attack_self(mob/user) +/obj/item/clothing/suit/space/hardsuit/attack_self__legacy__attackchain(mob/user) user.changeNext_move(CLICK_CD_MELEE) ..() -/obj/item/clothing/suit/space/hardsuit/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/suit/space/hardsuit/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/tank/jetpack/suit)) if(jetpack) to_chat(user, "[src] already has a jetpack installed.") @@ -280,7 +280,7 @@ linkedsuit = null return ..() -/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user) //Toggle Helmet +/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self__legacy__attackchain(mob/user) //Toggle Helmet if(!isturf(user.loc)) to_chat(user, "You cannot toggle your helmet while in this [user.loc]!" ) return diff --git a/code/modules/clothing/spacesuits/misc_spacesuits.dm b/code/modules/clothing/spacesuits/misc_spacesuits.dm index c07d9b4729116..c918e52c86321 100644 --- a/code/modules/clothing/spacesuits/misc_spacesuits.dm +++ b/code/modules/clothing/spacesuits/misc_spacesuits.dm @@ -124,7 +124,7 @@ flags_cover = HEADCOVERSEYES dog_fashion = /datum/dog_fashion/head/santa -/obj/item/clothing/head/helmet/space/santahat/attack_self(mob/user as mob) +/obj/item/clothing/head/helmet/space/santahat/attack_self__legacy__attackchain(mob/user as mob) if(src.icon_state == "santahat") src.icon_state = "santahat_beard" src.item_state = "santahat_beard" diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 26b09df981fa2..91cfe6e8e4cd6 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -66,7 +66,7 @@ if(!up) . += visor_icon -/obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user) +/obj/item/clothing/head/helmet/space/plasmaman/attack_self__legacy__attackchain(mob/user) toggle_light(user) /obj/item/clothing/head/helmet/space/plasmaman/proc/toggle_light(mob/user, update_light) diff --git a/code/modules/clothing/suits/armor_suits.dm b/code/modules/clothing/suits/armor_suits.dm index 1657f320aa6a1..4cc5f9e29376f 100644 --- a/code/modules/clothing/suits/armor_suits.dm +++ b/code/modules/clothing/suits/armor_suits.dm @@ -52,7 +52,7 @@ item_state = "armor" var/obj/item/clothing/accessory/holobadge/attached_badge -/obj/item/clothing/suit/armor/vest/security/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/suit/armor/vest/security/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/clothing/accessory/holobadge)) if(user.unEquip(I)) add_fingerprint(user) @@ -67,7 +67,7 @@ return ..() -/obj/item/clothing/suit/armor/vest/security/attack_self(mob/user) +/obj/item/clothing/suit/armor/vest/security/attack_self__legacy__attackchain(mob/user) if(attached_badge) add_fingerprint(user) user.put_in_hands(attached_badge) @@ -436,7 +436,7 @@ . += "Outside of the strange effects caused by the anomaly core, the armour provides no protection against conventional attacks. \ Nanotrasen cannot be held liable for injury and/or death due to misuse or proper operation of the reactive armour." -/obj/item/clothing/suit/armor/reactive/attack_self(mob/user) +/obj/item/clothing/suit/armor/reactive/attack_self__legacy__attackchain(mob/user) active = !(active) if(disabled) to_chat(user, "[src] is disabled and rebooting!") diff --git a/code/modules/clothing/suits/misc_suits.dm b/code/modules/clothing/suits/misc_suits.dm index 1701f6dde2c72..09a6e5f11df44 100644 --- a/code/modules/clothing/suits/misc_suits.dm +++ b/code/modules/clothing/suits/misc_suits.dm @@ -1151,7 +1151,7 @@ icon_state = "griffin_wings" item_state = "griffin_wings" -/obj/item/clothing/suit/toggle/attack_self() +/obj/item/clothing/suit/toggle/attack_self__legacy__attackchain() if(icon_state == initial(icon_state)) icon_state = icon_state + "_t" item_state = icon_state + "_t" @@ -1385,7 +1385,7 @@ to_chat(L, "You are now wearing \a [choice]. Allahu Akbar!") qdel(src) -/obj/item/clothing/suit/hooded/abaya/attack_self(mob/user) +/obj/item/clothing/suit/hooded/abaya/attack_self__legacy__attackchain(mob/user) . = ..() reskin_abaya(user) diff --git a/code/modules/clothing/suits/suit_storage.dm b/code/modules/clothing/suits/suit_storage.dm index b932d45d69331..2e1839c32b760 100644 --- a/code/modules/clothing/suits/suit_storage.dm +++ b/code/modules/clothing/suits/suit_storage.dm @@ -44,9 +44,9 @@ pockets.show_to(user) return ..() -/obj/item/clothing/suit/storage/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/clothing/suit/storage/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) ..() - return pockets?.attackby(W, user, params) + return pockets?.attackby__legacy__attackchain(W, user, params) /obj/item/clothing/suit/storage/emp_act(severity) ..() diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 0e55e6ae647cb..e5e8813818d18 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -12,7 +12,7 @@ if(ishuman(helmet.loc)) var/mob/living/carbon/H = helmet.loc if(helmet.on) - helmet.attack_self(H) + helmet.attack_self__legacy__attackchain(H) H.unEquip(helmet, TRUE) helmet.forceMove(src) H.update_inv_wear_suit() diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index b99ea6d18af9c..6a4511534f1d8 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -222,7 +222,7 @@ resistance_flags = FIRE_PROOF | ACID_PROOF magical = TRUE -/obj/item/clothing/head/helmet/space/hardsuit/wizard/attack_self(mob/user) +/obj/item/clothing/head/helmet/space/hardsuit/wizard/attack_self__legacy__attackchain(mob/user) return /obj/item/clothing/head/helmet/space/hardsuit/wizard/arch diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index b1a6cf91d0403..e13a51c287b2a 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -72,7 +72,7 @@ user.put_in_hands(src) add_fingerprint(user) -/obj/item/clothing/accessory/attack(mob/living/carbon/human/H, mob/living/user) +/obj/item/clothing/accessory/attack__legacy__attackchain(mob/living/carbon/human/H, mob/living/user) // This code lets you put accessories on other people by attacking their sprite with the accessory if(istype(H) && !ismonkeybasic(H)) //Monkeys are a snowflake because you can't remove accessories once added if(H.wear_suit && H.wear_suit.flags_inv & HIDEJUMPSUIT) @@ -97,7 +97,7 @@ return //default attackby behaviour -/obj/item/clothing/accessory/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/accessory/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() //default attack_hand behaviour @@ -151,7 +151,7 @@ icon_state = "stethoscope" item_color = "stethoscope" -/obj/item/clothing/accessory/stethoscope/attack(mob/living/carbon/human/M, mob/living/user) +/obj/item/clothing/accessory/stethoscope/attack__legacy__attackchain(mob/living/carbon/human/M, mob/living/user) if(!ishuman(M) || !isliving(user)) return ..(M, user) @@ -220,7 +220,7 @@ if(channel) . += "The tiny radio inside seems to be [try_announce ? "active" : "inactive"]." -/obj/item/clothing/accessory/medal/attack_self(mob/user) +/obj/item/clothing/accessory/medal/attack_self__legacy__attackchain(mob/user) . = ..() if(channel) try_announce = !try_announce @@ -421,7 +421,7 @@ icon_state = "holobadge-cord" item_color = "holobadge-cord" -/obj/item/clothing/accessory/holobadge/attack_self(mob/user) +/obj/item/clothing/accessory/holobadge/attack_self__legacy__attackchain(mob/user) if(!stored_name) to_chat(user, "Waving around a badge before swiping an ID would be pretty pointless.") return @@ -429,7 +429,7 @@ user.visible_message("[user] displays [user.p_their()] Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.", "You display your Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.") -/obj/item/clothing/accessory/holobadge/attackby(obj/item/I, mob/user, params) +/obj/item/clothing/accessory/holobadge/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) var/obj/item/card/id/id_card = null @@ -458,7 +458,7 @@ to_chat(user, "You swipe the card and crack the holobadge security checks.") return TRUE -/obj/item/clothing/accessory/holobadge/attack(mob/living/carbon/human/H, mob/living/user) +/obj/item/clothing/accessory/holobadge/attack__legacy__attackchain(mob/living/carbon/human/H, mob/living/user) if(H != user) user.visible_message("[user] invades [H]'s personal space, thrusting [src] into [H.p_their()] face insistently.", "You invade [H]'s personal space, thrusting [src] into [H.p_their()] face insistently. You are THE LAW!") @@ -478,12 +478,12 @@ var/cached_bubble_icon = null var/what_you_are = "THE LAW" -/obj/item/clothing/accessory/legal_badge/attack_self(mob/user) +/obj/item/clothing/accessory/legal_badge/attack_self__legacy__attackchain(mob/user) if(prob(1)) user.say("The testimony contradicts the evidence!") user.visible_message("[user] shows [user.p_their()] [name].", "You show your [name].") -/obj/item/clothing/accessory/legal_badge/attack(mob/living/carbon/human/H, mob/living/user) +/obj/item/clothing/accessory/legal_badge/attack__legacy__attackchain(mob/living/carbon/human/H, mob/living/user) if(H != user) user.visible_message("[user] invades [H]'s personal space, thrusting [src] into [H.p_their()] face insistently.", "You invade [H]'s personal space, thrusting [src] into [H.p_their()] face insistently. You are [what_you_are]!") @@ -652,7 +652,7 @@ return ..() -/obj/item/clothing/accessory/necklace/locket/attack_self(mob/user as mob) +/obj/item/clothing/accessory/necklace/locket/attack_self__legacy__attackchain(mob/user as mob) if(!base_icon) base_icon = icon_state @@ -671,7 +671,7 @@ else icon_state = "[base_icon]" -/obj/item/clothing/accessory/necklace/locket/attackby(obj/item/O as obj, mob/user as mob) +/obj/item/clothing/accessory/necklace/locket/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob) if(!open) to_chat(user, "You have to open it first.") return @@ -865,7 +865,7 @@ var/image/pin_icon = image(icon, icon_state = flag_types[current_pin]) flag_icons[current_pin] = pin_icon -/obj/item/clothing/accessory/pin/pride/attack_self(mob/user) +/obj/item/clothing/accessory/pin/pride/attack_self__legacy__attackchain(mob/user) . = ..() var/chosen_pin = show_radial_menu(user, src, flag_icons, require_near = TRUE) if(!chosen_pin) diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index cde430b1edc97..0c6b5722a9831 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -24,7 +24,7 @@ else return TRUE -/obj/item/clothing/accessory/holster/attack_self() +/obj/item/clothing/accessory/holster/attack_self__legacy__attackchain() var/holsteritem = usr.get_active_hand() if(!holstered) holster(holsteritem, usr) @@ -80,7 +80,7 @@ ..(user) -/obj/item/clothing/accessory/holster/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/clothing/accessory/holster/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) holster(W, user) /obj/item/clothing/accessory/holster/emp_act(severity) diff --git a/code/modules/clothing/under/accessories/storage_accessories.dm b/code/modules/clothing/under/accessories/storage_accessories.dm index d295056c5b8ba..aa8e75f392e79 100644 --- a/code/modules/clothing/under/accessories/storage_accessories.dm +++ b/code/modules/clothing/under/accessories/storage_accessories.dm @@ -33,8 +33,8 @@ if(hold.handle_mousedrop(usr, over_object)) ..(over_object) -/obj/item/clothing/accessory/storage/attackby(obj/item/W as obj, mob/user as mob, params) - return hold.attackby(W, user, params) +/obj/item/clothing/accessory/storage/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) + return hold.attackby__legacy__attackchain(W, user, params) /obj/item/clothing/accessory/storage/emp_act(severity) ..() @@ -62,7 +62,7 @@ L += G.gift:return_inv() return L -/obj/item/clothing/accessory/storage/attack_self(mob/user as mob) +/obj/item/clothing/accessory/storage/attack_self__legacy__attackchain(mob/user as mob) if(has_suit) //if we are part of a suit hold.open(user) else diff --git a/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm b/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm index 1669a3afcbcee..57126c15280d7 100644 --- a/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm +++ b/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm @@ -39,7 +39,7 @@ new /obj/effect/particle_effect/water(get_turf(H)) return FALSE -/obj/item/clothing/under/plasmaman/attackby(obj/item/E, mob/user, params) +/obj/item/clothing/under/plasmaman/attackby__legacy__attackchain(obj/item/E, mob/user, params) if(istype(E, /obj/item/extinguisher_refill)) if(extinguishes_left == 5) to_chat(user, "The inbuilt extinguisher is full.") diff --git a/code/modules/crafting/guncrafting.dm b/code/modules/crafting/guncrafting.dm index d1ce20522c76a..ed1748695ad04 100644 --- a/code/modules/crafting/guncrafting.dm +++ b/code/modules/crafting/guncrafting.dm @@ -120,7 +120,7 @@ name = "sol gov universal self assembling gun parts kit" icon_state = "solcase" //Ikea reference pending. -/obj/item/weaponcrafting/gunkit/universal_gun_kit/afterattack(obj/item/weaponcrafting/gunkit/gunkit_to_use, mob/user, flag) +/obj/item/weaponcrafting/gunkit/universal_gun_kit/afterattack__legacy__attackchain(obj/item/weaponcrafting/gunkit/gunkit_to_use, mob/user, flag) if(!istype(gunkit_to_use)) return if(!gunkit_to_use.outcome) @@ -146,7 +146,7 @@ // CRAFTING // -/obj/item/weaponcrafting/receiver/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/weaponcrafting/receiver/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/pipe)) to_chat(user, "You attach the shotgun barrel to the receiver. The pins seem loose.") var/obj/item/weaponcrafting/ishotgunconstruction/I = new /obj/item/weaponcrafting/ishotgunconstruction @@ -178,7 +178,7 @@ icon = 'icons/obj/improvised.dmi' icon_state = "ishotgunstep1" -/obj/item/weaponcrafting/ishotgunconstruction2/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/weaponcrafting/ishotgunconstruction2/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W,/obj/item/weaponcrafting/stock)) to_chat(user, "You attach the stock to the receiver-barrel assembly.") var/obj/item/weaponcrafting/ishotgunconstruction3/I = new /obj/item/weaponcrafting/ishotgunconstruction3 @@ -194,7 +194,7 @@ icon = 'icons/obj/improvised.dmi' icon_state = "ishotgunstep2" -/obj/item/weaponcrafting/ishotgunconstruction3/attackby(obj/item/I, mob/user as mob, params) +/obj/item/weaponcrafting/ishotgunconstruction3/attackby__legacy__attackchain(obj/item/I, mob/user as mob, params) ..() if(istype(I, /obj/item/stack/package_wrap)) var/obj/item/stack/package_wrap/C = I diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 1f31b1d41170b..d3e4b0bd5b19f 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -33,7 +33,7 @@ toolspeed = 1 usesound = 'sound/items/welder2.ogg' -/obj/item/fluff/tattoo_gun/attack(mob/living/carbon/M as mob, mob/user as mob) +/obj/item/fluff/tattoo_gun/attack__legacy__attackchain(mob/living/carbon/M as mob, mob/user as mob) if(user.a_intent == INTENT_HARM) user.visible_message("[user] stabs [M] with [src]!", "You stab [M] with [src]!") to_chat(M, "[user] stabs you with [src]!
You feel a tiny prick!") @@ -98,7 +98,7 @@ tattoo_g = 138 tattoo_b = 176 -/obj/item/fluff/tattoo_gun/elliot_cybernetic_tat/attack_self(mob/user as mob) +/obj/item/fluff/tattoo_gun/elliot_cybernetic_tat/attack_self__legacy__attackchain(mob/user as mob) if(!used) var/ink_color = tgui_input_color(user, "Please select an ink color.", "Tattoo Ink Color", rgb(tattoo_r, tattoo_g, tattoo_b)) if(!isnull(ink_color) && !(user.incapacitated() || used)) @@ -120,7 +120,7 @@ icon_state = "bird_orb" icon = 'icons/obj/custom_items.dmi' -/obj/item/fluff/bird_painter/attack_self(mob/user) +/obj/item/fluff/bird_painter/attack_self__legacy__attackchain(mob/user) if(ishuman(user)) var/mob/living/carbon/human/H = user H.s_tone = -115 @@ -194,7 +194,7 @@ desc = "An assorted set of exchangable parts for a wheelchair." icon_state = "modkit" -/obj/item/fluff/rapid_wheelchair_kit/afterattack(atom/target, mob/user, proximity) +/obj/item/fluff/rapid_wheelchair_kit/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity || !ishuman(user) || user.incapacitated()) return @@ -255,7 +255,7 @@ item_state = "dogwhistle" force = 2 -/obj/item/fluff/dogwhistle/attack_self(mob/user) +/obj/item/fluff/dogwhistle/attack_self__legacy__attackchain(mob/user) user.visible_message("[user] blows on the whistle, but no sound comes out.", "You blow on the whistle, but don't hear anything.") addtimer(CALLBACK(src, PROC_REF(summon_sax), user), 20) @@ -300,7 +300,7 @@ throwforce = 0 w_class = WEIGHT_CLASS_SMALL -/obj/item/fluff/wingler_comb/attack_self(mob/user) +/obj/item/fluff/wingler_comb/attack_self__legacy__attackchain(mob/user) if(used) return @@ -319,7 +319,7 @@ icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL -/obj/item/fluff/desolate_coat_kit/afterattack(atom/target, mob/user, proximity) +/obj/item/fluff/desolate_coat_kit/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity || !ishuman(user) || user.incapacitated()) return @@ -351,7 +351,7 @@ icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL -/obj/item/fluff/fei_gasmask_kit/afterattack(atom/target, mob/user, proximity) +/obj/item/fluff/fei_gasmask_kit/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity || !ishuman(user) || user.incapacitated()) return @@ -379,7 +379,7 @@ icon_state = "scifikit" w_class = WEIGHT_CLASS_SMALL -/obj/item/fluff/desolate_baton_kit/afterattack(atom/target, mob/user, proximity) +/obj/item/fluff/desolate_baton_kit/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity || !ishuman(user) || user.incapacitated()) return @@ -407,7 +407,7 @@ force = 0 throwforce = 0 -/obj/item/fluff/cardgage_helmet_kit/afterattack(atom/target, mob/user, proximity) +/obj/item/fluff/cardgage_helmet_kit/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity || !ishuman(user) || user.incapacitated()) return @@ -430,7 +430,7 @@ force = 0 throwforce = 0 -/obj/item/fluff/merchant_sallet_modkit/afterattack(atom/target, mob/user, proximity) +/obj/item/fluff/merchant_sallet_modkit/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity || !ishuman(user) || user.incapacitated()) return @@ -474,7 +474,7 @@ force = 0 throwforce = 0 -/obj/item/fluff/k3_webbing_modkit/afterattack(atom/target, mob/user, proximity) +/obj/item/fluff/k3_webbing_modkit/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity || !ishuman(user) || user.incapacitated()) return @@ -498,7 +498,7 @@ icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL /* -/obj/item/fluff/pyro_wintersec_kit/afterattack(atom/target, mob/user, proximity) +/obj/item/fluff/pyro_wintersec_kit/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity || !ishuman(user) || user.incapacitated()) return var/mob/living/carbon/human/H = user @@ -552,7 +552,7 @@ icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL /* -/obj/item/fluff/sylus_conversion_kit/afterattack(atom/target, mob/user, proximity) +/obj/item/fluff/sylus_conversion_kit/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity || !ishuman(user) || user.incapacitated()) return var/mob/living/carbon/human/H = user @@ -707,7 +707,7 @@ flags_inv = HIDEEYES|HIDEMASK|HIDEFACE|HIDEEARS var/state = "Soldier Up" -/obj/item/clothing/head/helmet/fluff/merchant_sallet/attack_self(mob/user) +/obj/item/clothing/head/helmet/fluff/merchant_sallet/attack_self__legacy__attackchain(mob/user) if(!user.incapacitated() && (world.time > cooldown + toggle_cooldown) && Adjacent(user)) var/list/options = list() options["Soldier Up"] = list( @@ -778,7 +778,7 @@ actions_types = list(/datum/action/item_action/openclose) adjust_flavour = "unbutton" -/obj/item/clothing/suit/jacket/miljacket/patch/attack_self(mob/user) +/obj/item/clothing/suit/jacket/miljacket/patch/attack_self__legacy__attackchain(mob/user) var/list/options = list() options["purple"] = "shazjacket_purple" options["purple light"] = "shazjacket_purple_light" @@ -1067,7 +1067,7 @@ throwforce = 0 w_class = WEIGHT_CLASS_SMALL -/obj/item/fluff/pinapplehairgel/attack_self(mob/user) +/obj/item/fluff/pinapplehairgel/attack_self__legacy__attackchain(mob/user) var/mob/living/carbon/human/target = user if(!istype(target) || !isslimeperson(target)) return @@ -1502,7 +1502,7 @@ icon_state = "classic_witch" item_state = "classic_witch" -/obj/item/clothing/head/wizard/fake/fluff/dreamy/attack_self(mob/user) +/obj/item/clothing/head/wizard/fake/fluff/dreamy/attack_self__legacy__attackchain(mob/user) var/list/options = list() options["Classic"] = "classic_witch" options["Good"] = "good_witch" @@ -1539,7 +1539,7 @@ throwforce = 0 w_class = WEIGHT_CLASS_SMALL -/obj/item/fluff/zekemirror/attack_self(mob/user) +/obj/item/fluff/zekemirror/attack_self__legacy__attackchain(mob/user) var/mob/living/carbon/human/target = user if(!istype(target) || !isskrell(target)) // It'd be strange to see other races with head tendrils. return @@ -1597,7 +1597,7 @@ icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL -/obj/item/fluff/lighty_plasman_modkit/afterattack(atom/target, mob/user, proximity, params) +/obj/item/fluff/lighty_plasman_modkit/afterattack__legacy__attackchain(atom/target, mob/user, proximity, params) if(!proximity || !ishuman(user) || user.incapacitated() || !isitem(target)) return var/mob/living/carbon/human/H = user @@ -1777,7 +1777,7 @@ /obj/item/clothing/gloves/ring/fluff/update_icon_state() return -/obj/item/clothing/gloves/ring/fluff/attackby(obj/item/I as obj, mob/user as mob, params) +/obj/item/clothing/gloves/ring/fluff/attackby__legacy__attackchain(obj/item/I as obj, mob/user as mob, params) return diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm index a8b7d04782514..d8840f8cdfd19 100644 --- a/code/modules/detective_work/evidence.dm +++ b/code/modules/detective_work/evidence.dm @@ -8,12 +8,12 @@ item_state = "" w_class = WEIGHT_CLASS_TINY -/obj/item/evidencebag/afterattack(obj/item/I, mob/user,proximity) +/obj/item/evidencebag/afterattack__legacy__attackchain(obj/item/I, mob/user,proximity) if(!proximity || loc == I) return evidencebagEquip(I, user) -/obj/item/evidencebag/attackby(obj/item/I, mob/user, params) +/obj/item/evidencebag/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(evidencebagEquip(I, user)) return 1 @@ -65,7 +65,7 @@ w_class = I.w_class return 1 -/obj/item/evidencebag/attack_self(mob/user) +/obj/item/evidencebag/attack_self__legacy__attackchain(mob/user) if(length(contents)) var/obj/item/I = contents[1] user.visible_message("[user] takes [I] out of [src].", "You take [I] out of [src].",\ diff --git a/code/modules/detective_work/footprints_and_rag.dm b/code/modules/detective_work/footprints_and_rag.dm index 468eb94e3221a..66afdc8379653 100644 --- a/code/modules/detective_work/footprints_and_rag.dm +++ b/code/modules/detective_work/footprints_and_rag.dm @@ -13,7 +13,7 @@ blocks_emissive = EMISSIVE_BLOCK_GENERIC var/wipespeed = 30 -/obj/item/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag) +/obj/item/reagent_containers/glass/rag/attack__legacy__attackchain(atom/target as obj|turf|area, mob/user as mob , flag) if(ismob(target) && target.reagents && reagents.total_volume) user.visible_message("[user] has smothered [target] with [src]!", "You smother [target] with [src]!", "You hear some struggling and muffled cries of surprise") src.reagents.reaction(target, REAGENT_TOUCH) @@ -22,7 +22,7 @@ else ..() -/obj/item/reagent_containers/glass/rag/afterattack(atom/target, mob/user, proximity) +/obj/item/reagent_containers/glass/rag/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity || ishuman(target)) //Human check so we don't clean the person we're trying to ether return target.cleaning_act(user, src, wipespeed) diff --git a/code/modules/detective_work/scanner.dm b/code/modules/detective_work/scanner.dm index 6bb25918fee25..a79a11bdcd5ad 100644 --- a/code/modules/detective_work/scanner.dm +++ b/code/modules/detective_work/scanner.dm @@ -16,7 +16,7 @@ var/list/log = list() actions_types = list(/datum/action/item_action/print_forensic_report, /datum/action/item_action/clear_records) -/obj/item/detective_scanner/attack_self(mob/user) +/obj/item/detective_scanner/attack_self__legacy__attackchain(mob/user) var/search = tgui_input_text(user, "Enter name, fingerprint or blood DNA.", "Find record") if(!search || user.stat || user.incapacitated()) @@ -100,10 +100,10 @@ to_chat(usr, "The scanner has no logs or is in use.") -/obj/item/detective_scanner/attack() +/obj/item/detective_scanner/attack__legacy__attackchain() return -/obj/item/detective_scanner/afterattack(atom/A, mob/user) +/obj/item/detective_scanner/afterattack__legacy__attackchain(atom/A, mob/user) scan(A, user) /obj/item/detective_scanner/proc/scan(atom/A, mob/user) diff --git a/code/modules/economy/economy_machinery/account_terminal.dm b/code/modules/economy/economy_machinery/account_terminal.dm index 631b3abdb0556..f3576f42edff2 100644 --- a/code/modules/economy/economy_machinery/account_terminal.dm +++ b/code/modules/economy/economy_machinery/account_terminal.dm @@ -24,7 +24,7 @@ /obj/machinery/computer/account_database/proc/reconnect_database() account_db = GLOB.station_money_database -/obj/machinery/computer/account_database/attackby(obj/O, mob/user, params) +/obj/machinery/computer/account_database/attackby__legacy__attackchain(obj/O, mob/user, params) if(ui_login_attackby(O, user)) return return ..() diff --git a/code/modules/economy/economy_machinery/atm.dm b/code/modules/economy/economy_machinery/atm.dm index 87b551ec2d54d..3481fe0289534 100644 --- a/code/modules/economy/economy_machinery/atm.dm +++ b/code/modules/economy/economy_machinery/atm.dm @@ -77,7 +77,7 @@ /obj/machinery/economy/atm/attack_ghost(mob/user) ui_interact(user) -/obj/machinery/economy/atm/attackby(obj/item/I, mob/user) +/obj/machinery/economy/atm/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/card/id)) if(has_power()) handle_id_insert(I, user) diff --git a/code/modules/economy/economy_machinery/eftpos.dm b/code/modules/economy/economy_machinery/eftpos.dm index 2ff07deab52a3..c28cda4a1e97f 100644 --- a/code/modules/economy/economy_machinery/eftpos.dm +++ b/code/modules/economy/economy_machinery/eftpos.dm @@ -36,10 +36,10 @@ /obj/item/eftpos/proc/reconnect_database() account_database = GLOB.station_money_database -/obj/item/eftpos/attack_self(mob/user) +/obj/item/eftpos/attack_self__legacy__attackchain(mob/user) ui_interact(user) -/obj/item/eftpos/attackby(obj/O, mob/user, params) +/obj/item/eftpos/attackby__legacy__attackchain(obj/O, mob/user, params) if(istype(O, /obj/item/card/id)) //attempt to connect to a new db, and if that doesn't work then fail if(!account_database) @@ -264,7 +264,7 @@ /obj/item/eftpos/register/ui_state(mob/user) return GLOB.human_adjacent_state -/obj/item/eftpos/register/attack_self(mob/user) +/obj/item/eftpos/register/attack_self__legacy__attackchain(mob/user) to_chat(user, "[src] has to be set down and secured to be used.") /obj/item/eftpos/register/check_user_position(mob/user) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 95f6203b20562..6d0d6ec1c19e7 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -87,7 +87,7 @@ //All of this shit is useless for vines -/turf/simulated/floor/vines/attackby() +/turf/simulated/floor/vines/attackby__legacy__attackchain() return /turf/simulated/floor/vines/burn_tile() @@ -477,7 +477,7 @@ eater.say("Nom") wither() -/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user) +/obj/structure/spacevine/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) var/damage_dealt = I.force if(istype(I, /obj/item/scythe)) var/obj/item/scythe/S = I diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm index fe31a78edeb67..ad47d59cf3d36 100644 --- a/code/modules/fish/fish_items.dm +++ b/code/modules/fish/fish_items.dm @@ -133,7 +133,7 @@ hitsound = 'sound/weapons/bite.ogg' force = 3 -/obj/item/fish/shark/attackby(obj/item/O, mob/user as mob) +/obj/item/fish/shark/attackby__legacy__attackchain(obj/item/O, mob/user as mob) if(istype(O, /obj/item/wirecutters)) to_chat(user, "You rip out the teeth of \the [src.name]!") new /obj/item/fish/toothless_shark(get_turf(src)) @@ -167,7 +167,7 @@ desc = "Apparently, catfish don't purr like you might have expected them to. Such a confusing name!" icon_state = "catfish" -/obj/item/fish/catfish/attackby(obj/item/O, mob/user as mob) +/obj/item/fish/catfish/attackby__legacy__attackchain(obj/item/O, mob/user as mob) if(O.sharp) to_chat(user, "You carefully clean and gut \the [src.name].") new /obj/item/food/catfishmeat(get_turf(src)) @@ -186,7 +186,7 @@ desc = "The second-favorite food of Space Bears, right behind crew members." icon_state = "salmon" -/obj/item/fish/salmon/attackby(obj/item/O, mob/user as mob) +/obj/item/fish/salmon/attackby__legacy__attackchain(obj/item/O, mob/user as mob) if(O.sharp) to_chat(user, "You carefully clean and gut \the [src.name].") new /obj/item/food/salmonmeat(get_turf(src)) @@ -202,7 +202,7 @@ hitsound = 'sound/weapons/bite.ogg' force = 3 -/obj/item/fish/babycarp/attackby(obj/item/O, mob/user as mob) +/obj/item/fish/babycarp/attackby__legacy__attackchain(obj/item/O, mob/user as mob) if(O.sharp) to_chat(user, "You carefully clean and gut \the [src.name].") new /obj/item/food/carpmeat(get_turf(src)) //just one fillet; this is a baby, afterall. diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index 7f83edf497c96..a5fb9ffed0d92 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -604,7 +604,7 @@ new /obj/item/stack/sheet/glass(get_turf(src), shard_count + 1) //Produce the appropriate number of glass sheets, in a single stack qdel(src) -/obj/machinery/fishtank/attackby(obj/item/O, mob/user) +/obj/machinery/fishtank/attackby__legacy__attackchain(obj/item/O, mob/user) //Open reagent containers add and remove water if(O.is_drainable()) //Containers with any reagents will get dumped in diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm index c4b6911633abd..9d8b4b8fd394e 100644 --- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm +++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm @@ -40,7 +40,7 @@ else qdel(recipe) -/obj/machinery/bottler/attackby(obj/item/O, mob/user, params) +/obj/machinery/bottler/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(!user.canUnEquip(O, 0)) to_chat(user, "[O] is stuck to your hand, you can't seem to put it down!") return 0 diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index cb932b6880c00..ea49443bbc96c 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -42,7 +42,7 @@ qdel(src) -/obj/item/reagent_containers/drinks/bottle/attack(mob/living/target, mob/living/user) +/obj/item/reagent_containers/drinks/bottle/attack__legacy__attackchain(mob/living/target, mob/living/user) if(!target) return @@ -378,7 +378,7 @@ hotspot.temperature = 1000 hotspot.recolor() -/obj/item/reagent_containers/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) +/obj/item/reagent_containers/drinks/bottle/molotov/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.get_heat() && !active) active = TRUE var/turf/bombturf = get_turf(src) @@ -402,7 +402,7 @@ A.fire_act() qdel(src) -/obj/item/reagent_containers/drinks/bottle/molotov/attack_self(mob/user) +/obj/item/reagent_containers/drinks/bottle/molotov/attack_self__legacy__attackchain(mob/user) if(active) if(!is_glass) to_chat(user, "The flame's spread too far on it!") diff --git a/code/modules/food_and_drinks/drinks/drinks/cans.dm b/code/modules/food_and_drinks/drinks/drinks/cans.dm index 8119ee9ee2584..a3d535519dce9 100644 --- a/code/modules/food_and_drinks/drinks/drinks/cans.dm +++ b/code/modules/food_and_drinks/drinks/drinks/cans.dm @@ -15,7 +15,7 @@ else . += "Ctrl-click to shake it up!" -/obj/item/reagent_containers/drinks/cans/attack_self(mob/user) +/obj/item/reagent_containers/drinks/cans/attack_self__legacy__attackchain(mob/user) if(can_opened) return ..() if(times_shaken) @@ -67,7 +67,7 @@ else return ..() -/obj/item/reagent_containers/drinks/cans/attack(mob/M, mob/user, proximity) +/obj/item/reagent_containers/drinks/cans/attack__legacy__attackchain(mob/M, mob/user, proximity) if(!can_opened) to_chat(user, "You need to open the drink!") return @@ -77,15 +77,15 @@ return return ..() -/obj/item/reagent_containers/drinks/cans/attackby(obj/item/I, mob/user, params) +/obj/item/reagent_containers/drinks/cans/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/bag/trash/cyborg)) user.visible_message("[user] crushes [src] in [user.p_their()] trash compactor.", "You crush [src] in your trash compactor.") var/obj/can = crush(user) - can.attackby(I, user, params) + can.attackby__legacy__attackchain(I, user, params) return TRUE ..() -/obj/item/reagent_containers/drinks/cans/afterattack(obj/target, mob/user, proximity) +/obj/item/reagent_containers/drinks/cans/afterattack__legacy__attackchain(obj/target, mob/user, proximity) if(!proximity) return if(istype(target, /obj/structure/reagent_dispensers) && !can_opened) diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index 3b56fbaae3d6d..c94e7b27f18e5 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -15,7 +15,7 @@ drop_sound = 'sound/items/handling/drinkglass_drop.ogg' pickup_sound = 'sound/items/handling/drinkglass_pickup.ogg' -/obj/item/reagent_containers/drinks/drinkingglass/attackby(obj/item/I, mob/user, params) +/obj/item/reagent_containers/drinks/drinkingglass/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/food/egg)) //breaking eggs var/obj/item/food/egg/E = I if(reagents) diff --git a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm index 5947abb4a5271..47e131a6552d3 100644 --- a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm @@ -90,13 +90,13 @@ /obj/item/reagent_containers/drinks/drinkingglass/shotglass/burn() //Let's override fire deleting the reagents inside the shot return -/obj/item/reagent_containers/drinks/drinkingglass/shotglass/attack(mob/living/carbon/human/user) +/obj/item/reagent_containers/drinks/drinkingglass/shotglass/attack__legacy__attackchain(mob/living/carbon/human/user) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50) && (resistance_flags & ON_FIRE)) clumsilyDrink(user) else ..() -/obj/item/reagent_containers/drinks/drinkingglass/shotglass/attackby(obj/item/W) +/obj/item/reagent_containers/drinks/drinkingglass/shotglass/attackby__legacy__attackchain(obj/item/W) ..() if(W.get_heat()) fire_act() @@ -104,7 +104,7 @@ /obj/item/reagent_containers/drinks/drinkingglass/shotglass/attack_hand(mob/user, pickupfireoverride = TRUE) ..() -/obj/item/reagent_containers/drinks/drinkingglass/shotglass/attack_self(mob/living/carbon/human/user) +/obj/item/reagent_containers/drinks/drinkingglass/shotglass/attack_self__legacy__attackchain(mob/living/carbon/human/user) ..() if(!(resistance_flags & ON_FIRE)) return diff --git a/code/modules/food_and_drinks/drinks/drinks_base.dm b/code/modules/food_and_drinks/drinks/drinks_base.dm index 4574e56c98406..161865a7fcd2c 100644 --- a/code/modules/food_and_drinks/drinks/drinks_base.dm +++ b/code/modules/food_and_drinks/drinks/drinks_base.dm @@ -14,10 +14,10 @@ var/consume_sound = 'sound/items/drink.ogg' var/chugging = FALSE -/obj/item/reagent_containers/drinks/attack_self(mob/user) +/obj/item/reagent_containers/drinks/attack_self__legacy__attackchain(mob/user) return -/obj/item/reagent_containers/drinks/attack(mob/M, mob/user, def_zone) +/obj/item/reagent_containers/drinks/attack__legacy__attackchain(mob/M, mob/user, def_zone) if(!reagents || !reagents.total_volume) to_chat(user, "None of [src] left, oh no!") return FALSE @@ -54,7 +54,7 @@ break chugging = FALSE -/obj/item/reagent_containers/drinks/afterattack(obj/target, mob/user, proximity) +/obj/item/reagent_containers/drinks/afterattack__legacy__attackchain(obj/target, mob/user, proximity) if(!proximity) return if(chugging) @@ -277,7 +277,7 @@ . = ..() reagents.set_reacting(FALSE) -/obj/item/reagent_containers/drinks/shaker/attack_self(mob/user) +/obj/item/reagent_containers/drinks/shaker/attack_self__legacy__attackchain(mob/user) if(!reagents.total_volume) to_chat(user, "You won't shake an empty shaker now, will you?") return diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index bb86363c0b290..b0371fbacd55d 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -39,10 +39,10 @@ "rice" = list("rice", "rice sack", "A big bag of rice. Good for cooking!")) var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. -/obj/item/reagent_containers/condiment/attack_self(mob/user) +/obj/item/reagent_containers/condiment/attack_self__legacy__attackchain(mob/user) return -/obj/item/reagent_containers/condiment/attack(mob/M, mob/user, def_zone) +/obj/item/reagent_containers/condiment/attack__legacy__attackchain(mob/M, mob/user, def_zone) if(!reagents || !reagents.total_volume) to_chat(user, "None of [src] left, oh no!") @@ -69,7 +69,7 @@ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) return 1 -/obj/item/reagent_containers/condiment/afterattack(obj/target, mob/user , proximity) +/obj/item/reagent_containers/condiment/afterattack__legacy__attackchain(obj/target, mob/user , proximity) if(!proximity) return if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us. @@ -319,10 +319,10 @@ "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!"), "vinegar" =list("condi_mixed", "vinegar", "Perfect for chips, if you're feeling Space British.")) -/obj/item/reagent_containers/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. +/obj/item/reagent_containers/condiment/pack/attack__legacy__attackchain(mob/M, mob/user, def_zone) //Can't feed these to people directly. return -/obj/item/reagent_containers/condiment/pack/afterattack(obj/target, mob/user , proximity) +/obj/item/reagent_containers/condiment/pack/afterattack__legacy__attackchain(obj/target, mob/user , proximity) if(!proximity) return //You can tear the bag open above food to put the condiments on it, obviously. diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 8546d186f4b74..d667e8827d587 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -6,33 +6,33 @@ do {\ qdel(src);\ } while(FALSE) -/obj/item/food/breadslice/attackby(obj/item/W, mob/user, params) +/obj/item/food/breadslice/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/food) && !(W.flags & NODROP)) MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/sandwich) return ..() -/obj/item/food/bun/attackby(obj/item/W, mob/user, params) +/obj/item/food/bun/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/food) && !(W.flags & NODROP)) MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/burger) return ..() -/obj/item/food/sliceable/flatdough/attackby(obj/item/W, mob/user, params) +/obj/item/food/sliceable/flatdough/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/food) && !(W.flags & NODROP)) MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/pizza) return ..() -/obj/item/food/boiledspaghetti/attackby(obj/item/W, mob/user, params) +/obj/item/food/boiledspaghetti/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/food) && !(W.flags & NODROP)) MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/pasta) return ..() -/obj/item/trash/plate/attackby(obj/item/W, mob/user, params) +/obj/item/trash/plate/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/food) && !(W.flags & NODROP)) MAKE_CUSTOM_FOOD(W, user, /obj/item/food/customizable/fullycustom) return @@ -46,10 +46,10 @@ do {\ icon = 'icons/obj/food/custom.dmi' icon_state = "soup" -/obj/item/trash/bowl/attackby(obj/item/I, mob/user, params) +/obj/item/trash/bowl/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/food) && !(I.flags & NODROP)) var/obj/item/food/customizable/soup/S = new(get_turf(user)) - S.attackby(I, user, params) + S.attackby__legacy__attackchain(I, user, params) qdel(src) else ..() @@ -326,7 +326,7 @@ do {\ tastes = list("bun" = 4) -/obj/item/food/customizable/attackby(obj/item/I, mob/user, params) +/obj/item/food/customizable/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() if(istype(I, /obj/item/kitchen/utensil) || is_pen(I)) diff --git a/code/modules/food_and_drinks/food/foods/ingredients.dm b/code/modules/food_and_drinks/food/foods/ingredients.dm index fda18eae17b72..c30770175fc34 100644 --- a/code/modules/food_and_drinks/food/foods/ingredients.dm +++ b/code/modules/food_and_drinks/food/foods/ingredients.dm @@ -125,7 +125,7 @@ tastes = list("dough" = 1) // Dough + rolling pin = flat dough -/obj/item/food/dough/attackby(obj/item/I, mob/user, params) +/obj/item/food/dough/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/kitchen/rollingpin)) if(isturf(loc)) new /obj/item/food/sliceable/flatdough(loc) @@ -180,7 +180,7 @@ icon_state = "cookiedough" // Dough + rolling pin = flat cookie dough // Flat dough + circular cutter = unbaked cookies -/obj/item/food/cookiedough/attackby(obj/item/I, mob/user, params) +/obj/item/food/cookiedough/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/kitchen/rollingpin) && !flat) if(isturf(loc)) to_chat(user, "You flatten [src].") @@ -206,7 +206,7 @@ icon_state = "unbaked_cookies" list_reagents = list("nutriment" = 5, "sugar" = 5) -/obj/item/food/rawcookies/attackby(obj/item/I, mob/user, params) +/obj/item/food/rawcookies/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/food/choc_pile)) if(isturf(loc)) new /obj/item/food/rawcookies/chocochips(loc) @@ -240,7 +240,7 @@ goal_difficulty = FOOD_GOAL_EASY ///Chocolate crumbles/pile -/obj/item/food/chocolatebar/attackby(obj/item/I, mob/user, params) +/obj/item/food/chocolatebar/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/kitchen/knife)) if(isturf(loc)) new /obj/item/food/choc_pile(loc) diff --git a/code/modules/food_and_drinks/food/foods/junkfood.dm b/code/modules/food_and_drinks/food/foods/junkfood.dm index e988c416c177a..981abacca5e52 100644 --- a/code/modules/food_and_drinks/food/foods/junkfood.dm +++ b/code/modules/food_and_drinks/food/foods/junkfood.dm @@ -111,7 +111,7 @@ list_reagents = list("nutriment" = 2, "sugar" = 10) tastes = list("sweetness" = 3, "liquorice" = 2) -/obj/item/food/twimsts/attack_self(mob/user) +/obj/item/food/twimsts/attack_self__legacy__attackchain(mob/user) var/obj/item/restraints/handcuffs/twimsts/L = new /obj/item/restraints/handcuffs/twimsts L.create_reagents(100) reagents.copy_to(L, reagents.total_volume) diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm index 1e423c119df44..022d0dc6fa097 100644 --- a/code/modules/food_and_drinks/food/foods/meat.dm +++ b/code/modules/food_and_drinks/food/foods/meat.dm @@ -15,7 +15,7 @@ ingredient_name = "slab of meat" ingredient_name_plural = "slabs of meat" -/obj/item/food/meat/attackby(obj/item/W, mob/user, params) +/obj/item/food/meat/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/kitchen/knife) || istype(W, /obj/item/scalpel)) new /obj/item/food/rawcutlet(src) new /obj/item/food/rawcutlet(src) @@ -99,7 +99,7 @@ bitesize = 1 list_reagents = list("protein" = 1) -/obj/item/food/rawcutlet/attackby(obj/item/W, mob/user, params) +/obj/item/food/rawcutlet/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/kitchen/knife) || istype(W, /obj/item/scalpel)) user.visible_message( \ "[user] cuts the raw cutlet with [W]!", \ @@ -426,7 +426,7 @@ reagents.reaction(hit_atom, REAGENT_TOUCH) qdel(src) -/obj/item/food/egg/attackby(obj/item/W, mob/user, params) +/obj/item/food/egg/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/toy/crayon)) var/obj/item/toy/crayon/C = W var/clr = C.dye_color diff --git a/code/modules/food_and_drinks/food/foods/pizza.dm b/code/modules/food_and_drinks/food/foods/pizza.dm index 09ce56ee91bbc..a6dc899d7445a 100644 --- a/code/modules/food_and_drinks/food/foods/pizza.dm +++ b/code/modules/food_and_drinks/food/foods/pizza.dm @@ -356,7 +356,7 @@ open = !open update_appearance(UPDATE_DESC|UPDATE_ICON) -/obj/item/pizzabox/attack_self(mob/user) +/obj/item/pizzabox/attack_self__legacy__attackchain(mob/user) if(length(boxes) > 0) return open = !open @@ -364,7 +364,7 @@ is_messy = TRUE update_appearance(UPDATE_DESC|UPDATE_ICON) -/obj/item/pizzabox/attackby(obj/item/I, mob/user, params) +/obj/item/pizzabox/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/pizzabox/)) var/obj/item/pizzabox/box = I if(!box.open && !open) @@ -506,9 +506,9 @@ icon_state = "pizzabox_bomb" /obj/item/pizzabox/pizza_bomb/AltClick(mob/user) - attack_self(user) + attack_self__legacy__attackchain(user) -/obj/item/pizzabox/pizza_bomb/attack_self(mob/user) +/obj/item/pizzabox/pizza_bomb/attack_self__legacy__attackchain(mob/user) if(pizza_bomb_status == PIZZA_BOMB_NOT_ARMED) open = TRUE update_appearance(UPDATE_NAME|UPDATE_DESC|UPDATE_ICON) @@ -576,7 +576,7 @@ to_chat(user, "You smear the bananium ooze all over the pizza bomb's internals! You think you smell a bit of tomato sauce.") ADD_TRAIT(src, TRAIT_CMAGGED, CLOWN_EMAG) -/obj/item/pizzabox/pizza_bomb/wirecutter_act(mob/living/user, obj/item/I) +/obj/item/pizzabox/pizza_bomb/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!open) return . = TRUE diff --git a/code/modules/food_and_drinks/food/foods/side_dishes.dm b/code/modules/food_and_drinks/food/foods/side_dishes.dm index eedcbc833495c..a0232062623ac 100644 --- a/code/modules/food_and_drinks/food/foods/side_dishes.dm +++ b/code/modules/food_and_drinks/food/foods/side_dishes.dm @@ -117,7 +117,7 @@ tastes = list("rice" = 1) goal_difficulty = FOOD_GOAL_NORMAL -/obj/item/food/boiledrice/attackby(obj/item/I, mob/user, params) +/obj/item/food/boiledrice/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/stack/seaweed)) return ..() var/obj/item/stack/seaweed/S = I diff --git a/code/modules/food_and_drinks/food_base.dm b/code/modules/food_and_drinks/food_base.dm index 6e9b7d07e2df0..d7674e34464bb 100644 --- a/code/modules/food_and_drinks/food_base.dm +++ b/code/modules/food_and_drinks/food_base.dm @@ -159,10 +159,10 @@ /obj/item/food/proc/Post_Consume(mob/living/M) return -/obj/item/food/attack_self(mob/user) +/obj/item/food/attack_self__legacy__attackchain(mob/user) return -/obj/item/food/attack(mob/M, mob/user, def_zone) +/obj/item/food/attack__legacy__attackchain(mob/M, mob/user, def_zone) if(user.a_intent == INTENT_HARM && force) return ..() if(reagents && !reagents.total_volume) // Shouldn't be needed but it checks to see if it has anything left in it. @@ -179,10 +179,10 @@ return TRUE return FALSE -/obj/item/food/afterattack(obj/target, mob/user, proximity) +/obj/item/food/afterattack__legacy__attackchain(obj/target, mob/user, proximity) return -/obj/item/food/attackby(obj/item/W, mob/user, params) +/obj/item/food/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(is_pen(W)) rename_interactive(user, W, use_prefix = FALSE, prompt = "What would you like to name this dish?") return @@ -305,7 +305,7 @@ add_fingerprint(user) I.forceMove(src) -/obj/item/food/sliceable/attackby(obj/item/I, mob/user, params) +/obj/item/food/sliceable/attackby__legacy__attackchain(obj/item/I, mob/user, params) if((slices_num <= 0 || !slices_num) || !slice_path) return FALSE diff --git a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm index 9dad856f762fb..0ae75aedd439a 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm @@ -180,7 +180,7 @@ var/obj/item/food/type = new(get_turf(src)) return type -/obj/machinery/cooker/attackby(obj/item/I, mob/user, params) +/obj/machinery/cooker/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(upgradeable) //Not all cooker types currently support build/upgrade stuff, so not all of it will work well with this //Until we decide whether or not we want to bring back the cereal maker or old grill/oven in some form, this initial check will have to suffice diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index dec5fcbe1303e..f070d09d29057 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -43,7 +43,7 @@ var/obj/item/food/deepfryholder/type = new(get_turf(src)) return type -/obj/machinery/cooker/deepfryer/attackby(obj/item/I, mob/user, params) +/obj/machinery/cooker/deepfryer/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/drinks/ice)) var/ice_amount = I.reagents.get_reagent_amount("ice") if(ice_amount) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 11c571388bf1f..ee5c23ac0fb1e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -93,7 +93,7 @@ startgibbing(user) -/obj/machinery/gibber/attackby(obj/item/P, mob/user, params) +/obj/machinery/gibber/attackby__legacy__attackchain(obj/item/P, mob/user, params) if(istype(P, /obj/item/grab)) var/obj/item/grab/G = P if(G.state < 2) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index b57424f48bd15..672781e46dcc6 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -29,7 +29,7 @@ . = ..() create_reagents(500) -/obj/machinery/icemachine/attackby(obj/item/I, mob/user, params) +/obj/machinery/icemachine/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/glass)) if(beaker) to_chat(user, "A container is already inside [src].") diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm index 90274d1ac1594..8ac8d7562f9ed 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm @@ -71,7 +71,7 @@ * Item Adding ********************/ -/obj/machinery/kitchen_machine/attackby(obj/item/O, mob/user, params) +/obj/machinery/kitchen_machine/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(operating) return diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index e007796c9df84..a5079e4ffde81 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) cube_production = cubes_made required_grind = req_grind -/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) +/obj/machinery/monkey_recycler/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) return diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index fee84b57b2b43..63608f5fe3945 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -188,7 +188,7 @@ return P return 0 -/obj/machinery/processor/attackby(obj/item/O, mob/user, params) +/obj/machinery/processor/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(processing) to_chat(user, "\the [src] is already processing something!") return TRUE diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index a74227a5fef34..085113c3884e4 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -177,7 +177,7 @@ return TRUE return ..() -/obj/machinery/smartfridge/attackby(obj/item/O, mob/user) +/obj/machinery/smartfridge/attackby__legacy__attackchain(obj/item/O, mob/user) if(istype(O, /obj/item/storage/part_replacer)) . = ..() SStgui.update_uis(src) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index ef51b912bf8f0..b9e36a34aef6c 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -124,7 +124,7 @@ INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, attack_hand), attacker) return COMPONENT_CANCEL_ATTACK_CHAIN -/obj/item/deck/attackby(obj/O, mob/user) +/obj/item/deck/attackby__legacy__attackchain(obj/O, mob/user) // clicking is for drawing if(istype(O, /obj/item/deck)) var/obj/item/deck/other_deck = O @@ -450,7 +450,7 @@ ) H.throw_at(get_step(target, target.dir), 3, 1, null) -/obj/item/deck/attack_self(mob/user) +/obj/item/deck/attack_self__legacy__attackchain(mob/user) deckshuffle(user) /obj/item/deck/proc/deckshuffle(mob/user) @@ -510,7 +510,7 @@ var/parentdeck = null // For future card pack that need to be compatible with eachother i.e. cardemon -/obj/item/pack/attack_self(mob/user as mob) +/obj/item/pack/attack_self__legacy__attackchain(mob/user as mob) user.visible_message( "[name] rips open [src]!", "You rip open [src]!", @@ -570,7 +570,7 @@ /obj/item/cardhand/proc/single() return length(cards) == 1 -/obj/item/cardhand/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/cardhand/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, click_parameters) // this is how we handle our ranged attacks. . = ..() if(!istype(target, /obj/item/deck) || proximity_flag) @@ -579,7 +579,7 @@ var/obj/item/deck/D = target if(D.in_play_range(user)) - return D.attackby(src, user) + return D.attackby__legacy__attackchain(src, user) /obj/item/deck/hitby(atom/movable/thrown, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) @@ -674,7 +674,7 @@ attack_verb = source.attack_verb resistance_flags = source.resistance_flags -/obj/item/cardhand/attackby(obj/O, mob/user) +/obj/item/cardhand/attackby__legacy__attackchain(obj/O, mob/user) // Augh I really don't like this if(length(cards) == 1 && is_pen(O)) var/datum/playingcard/P = cards[1] @@ -709,7 +709,7 @@ return return ..() -/obj/item/cardhand/attack_self(mob/user) +/obj/item/cardhand/attack_self__legacy__attackchain(mob/user) if(length(cards) == 1) turn_hand(user) return diff --git a/code/modules/hallucinations/effects/common.dm b/code/modules/hallucinations/effects/common.dm index 827ab482b19a2..cecbe2c1686e5 100644 --- a/code/modules/hallucinations/effects/common.dm +++ b/code/modules/hallucinations/effects/common.dm @@ -101,7 +101,7 @@ if(was_weakened && !should_attack_weakened) return - attack(was_weakened) + attack__legacy__attackchain(was_weakened) /** * Called every Think when we are attacking the target. @@ -109,7 +109,7 @@ * Arguments: * * was_weakened - Whether the target was already knocked down prior to this attack. */ -/obj/effect/hallucination/chaser/attacker/proc/attack(was_weakened) +/obj/effect/hallucination/chaser/attacker/proc/attack__legacy__attackchain(was_weakened) dir = get_dir(src, target) attack_effects() target.apply_damage(damage, STAMINA) diff --git a/code/modules/hallucinations/effects/major.dm b/code/modules/hallucinations/effects/major.dm index 012da9f55ad52..0b5f4a45ba553 100644 --- a/code/modules/hallucinations/effects/major.dm +++ b/code/modules/hallucinations/effects/major.dm @@ -68,7 +68,7 @@ target.visible_message("[target] trips over nothing.", "You get stuck in [src]!") -/obj/effect/hallucination/tripper/spider_web/attackby(obj/item/I, mob/user, params) +/obj/effect/hallucination/tripper/spider_web/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(user != target) return diff --git a/code/modules/holiday/christmas.dm b/code/modules/holiday/christmas.dm index 26c2d35b5c4fc..34e6972bada4f 100644 --- a/code/modules/holiday/christmas.dm +++ b/code/modules/holiday/christmas.dm @@ -33,7 +33,7 @@ desc = "Directions for use: Requires two people, one to pull each end." var/cracked = 0 -/obj/item/toy/xmas_cracker/attack(mob/target, mob/user) +/obj/item/toy/xmas_cracker/attack__legacy__attackchain(mob/target, mob/user) if(!cracked && ishuman(target) && (target.stat == CONSCIOUS) && !target.get_active_hand()) target.visible_message("[user] and [target] pop \an [src]! *pop*", "You pull \an [src] with [target]! *pop*", "You hear a *pop*.") var/obj/item/paper/Joke = new /obj/item/paper(user.loc) diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 9debfe1aa6a36..391429b8ec244 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -146,7 +146,7 @@ . += "there's no room for more honeycomb!" -/obj/structure/beebox/attackby(obj/item/I, mob/user, params) +/obj/structure/beebox/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/honey_frame)) var/obj/item/honey_frame/HF = I if(length(honey_frames) < BEEBOX_MAX_FRAMES) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index c7a49fc28d436..e348785359551 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -102,7 +102,7 @@ /obj/machinery/biogenerator/crowbar_act(mob/living/user, obj/item/I) return default_deconstruction_crowbar(user, I) -/obj/machinery/biogenerator/attackby(obj/item/O, mob/user, params) +/obj/machinery/biogenerator/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(user.a_intent == INTENT_HARM) return ..() diff --git a/code/modules/hydroponics/compost_bin.dm b/code/modules/hydroponics/compost_bin.dm index d42c6f74b9567..1badb7576b228 100644 --- a/code/modules/hydroponics/compost_bin.dm +++ b/code/modules/hydroponics/compost_bin.dm @@ -66,7 +66,7 @@ qdel(O) // takes care of plant insertion and conversion to biomass, and start composting what was inserted -/obj/machinery/compost_bin/attackby(obj/item/O, mob/user, params) +/obj/machinery/compost_bin/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(user.a_intent == INTENT_HARM) return ..() diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 3236f0b59fec9..21e3c917560dd 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -39,7 +39,7 @@ qdel(G) playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) -/obj/structure/fermenting_barrel/attackby(obj/item/I, mob/user, params) +/obj/structure/fermenting_barrel/attackby__legacy__attackchain(obj/item/I, mob/user, params) var/obj/item/food/grown/G = I if(istype(G)) if(!G.can_distill) diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index 24521ccb0f85d..1993e781e175c 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -130,7 +130,7 @@ if(panel_open) . += "dnamod-open" -/obj/machinery/plantgenes/attackby(obj/item/I, mob/user, params) +/obj/machinery/plantgenes/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "dnamod", "dnamod", I)) update_icon(UPDATE_OVERLAYS) return @@ -589,7 +589,7 @@ QDEL_NULL(gene) return ..() -/obj/item/disk/plantgene/attackby(obj/item/W, mob/user, params) +/obj/item/disk/plantgene/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(is_pen(W)) rename_interactive(user, W) @@ -657,7 +657,7 @@ . += "datadisk_gene" -/obj/item/disk/plantgene/attack_self(mob/user) +/obj/item/disk/plantgene/attack_self__legacy__attackchain(mob/user) if(HAS_TRAIT(src, TRAIT_CMAGGED)) return read_only = !read_only diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 6991995dcc2bc..ad72da94e3575 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -69,7 +69,7 @@ if(T.examine_line) . += T.examine_line -/obj/item/food/grown/attackby(obj/item/O, mob/user, params) +/obj/item/food/grown/attackby__legacy__attackchain(obj/item/O, mob/user, params) ..() if(slices_num && slice_path) var/inaccurate = TRUE @@ -106,7 +106,7 @@ // Various gene procs -/obj/item/food/grown/attack_self(mob/user) +/obj/item/food/grown/attack_self__legacy__attackchain(mob/user) if(seed && seed.get_gene(/datum/plant_gene/trait/squash)) squash(user) ..() @@ -174,7 +174,7 @@ return ..() // For item-containing growns such as eggy or gatfruit -/obj/item/food/grown/shell/attack_self(mob/user) +/obj/item/food/grown/shell/attack_self__legacy__attackchain(mob/user) if(!do_after(user, 1.5 SECONDS, target = user)) return user.unEquip(src) diff --git a/code/modules/hydroponics/grown/cereals.dm b/code/modules/hydroponics/grown/cereals.dm index 0d57acbdd9a6c..87f882bfe872e 100644 --- a/code/modules/hydroponics/grown/cereals.dm +++ b/code/modules/hydroponics/grown/cereals.dm @@ -89,7 +89,7 @@ tastes = list("meatwheat" = 1) can_distill = FALSE -/obj/item/food/grown/meatwheat/attack_self(mob/living/user) +/obj/item/food/grown/meatwheat/attack_self__legacy__attackchain(mob/living/user) user.visible_message("[user] crushes [src] into meat.", "You crush [src] into something that resembles meat.") playsound(user, 'sound/effects/blobattack.ogg', 50, 1) var/obj/item/food/meat/meatwheat/M = new(get_turf(user)) diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index 1ee7a1d9f1550..71db76937f775 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -114,7 +114,7 @@ tastes = list("burning lemon" = 1) wine_flavor = "fire" -/obj/item/food/grown/firelemon/attack_self(mob/living/user) +/obj/item/food/grown/firelemon/attack_self__legacy__attackchain(mob/living/user) var/area/A = get_area(user) user.visible_message("[user] primes [src]!", "You prime [src]!") investigate_log("[key_name(user)] primed a combustible lemon for detonation at [A] [COORD(user)].", INVESTIGATE_BOMB) diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 90b7bd8d7d04c..e9767333eab55 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -38,7 +38,7 @@ throw_speed = 3 throw_range = 7 -/obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, params) +/obj/item/grown/corncob/attackby__legacy__attackchain(obj/item/grown/W, mob/user, params) if(W.sharp) to_chat(user, "You use [W] to fashion a pipe out of the corn cob!") new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc) @@ -75,7 +75,7 @@ ..() snap_pops = max(round(seed.potency/8), 1) -/obj/item/grown/snapcorn/attack_self(mob/user) +/obj/item/grown/snapcorn/attack_self__legacy__attackchain(mob/user) ..() to_chat(user, "You pick a snap pop from the cob.") var/obj/item/toy/snappop/S = new /obj/item/toy/snappop(user.loc) diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index 9a5863d1f1610..4f1df4e85a492 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -31,7 +31,7 @@ var/cotton_type = /obj/item/stack/sheet/cotton var/cotton_name = "raw cotton" -/obj/item/grown/cotton/attack_self(mob/user) +/obj/item/grown/cotton/attack_self__legacy__attackchain(mob/user) user.show_message("You pull some [cotton_name] out of [src]!", 1) var/seed_modifier = 0 if(seed) @@ -40,7 +40,7 @@ var/old_cotton_amount = cotton.amount for(var/obj/item/stack/ST in user.loc) if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount) - ST.attackby(cotton, user) + ST.attackby__legacy__attackchain(cotton, user) if(cotton.amount > old_cotton_amount) to_chat(user, "You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].") qdel(src) diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index fce7e54527005..9cac51031a67d 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -167,7 +167,7 @@ throw_speed = 1 throw_range = 3 -/obj/item/grown/sunflower/attack(mob/M, mob/user) +/obj/item/grown/sunflower/attack__legacy__attackchain(mob/M, mob/user) to_chat(M, "[user] smacks you with a sunflower!FLOWER POWER") to_chat(user, "Your sunflower's FLOWER POWER strikes [M]") @@ -228,7 +228,7 @@ ..() force = round((5 + seed.potency / 5), 1) -/obj/item/grown/novaflower/attack(mob/living/carbon/M, mob/user) +/obj/item/grown/novaflower/attack__legacy__attackchain(mob/living/carbon/M, mob/user) ..() if(isliving(M)) to_chat(M, "You are lit on fire from the intense heat of [src]!") @@ -237,7 +237,7 @@ message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire") log_game("[key_name(user)] set [key_name(M)] on fire") -/obj/item/grown/novaflower/afterattack(atom/A as mob|obj, mob/user,proximity) +/obj/item/grown/novaflower/afterattack__legacy__attackchain(atom/A as mob|obj, mob/user,proximity) if(!proximity) return if(force > 0) diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 2a78f12fddae5..b28e0555d1409 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -30,7 +30,7 @@ tastes = list("grass" = 1) wine_power = 0.15 -/obj/item/food/grown/grass/attack_self(mob/user) +/obj/item/food/grown/grass/attack_self__legacy__attackchain(mob/user) to_chat(user, "You prepare the astroturf.") var/grassAmt = 1 + round(seed.potency * tile_coefficient) // The grass we're holding for(var/obj/item/food/grown/grass/G in user.loc) // The grass on the floor diff --git a/code/modules/hydroponics/grown/herbals.dm b/code/modules/hydroponics/grown/herbals.dm index 3c4c1735d1e3e..d1d0421cf8e7f 100644 --- a/code/modules/hydroponics/grown/herbals.dm +++ b/code/modules/hydroponics/grown/herbals.dm @@ -20,7 +20,7 @@ tastes = list("comfrey" = 1) bitesize_mod = 2 -/obj/item/food/grown/comfrey/attack_self(mob/user) +/obj/item/food/grown/comfrey/attack_self__legacy__attackchain(mob/user) var/obj/item/stack/medical/bruise_pack/comfrey/C = new(get_turf(user)) C.heal_brute = seed.potency to_chat(user, "You mash [src] into a poultice.") @@ -47,7 +47,7 @@ tastes = list("aloe" = 1) bitesize_mod = 2 -/obj/item/food/grown/aloe/attack_self(mob/user) +/obj/item/food/grown/aloe/attack_self__legacy__attackchain(mob/user) var/obj/item/stack/medical/ointment/aloe/A = new(get_turf(user)) A.heal_burn = seed.potency to_chat(user, "You mash [src] into a poultice.") diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index 950971fb591e9..586c42115a428 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -36,7 +36,7 @@ user.drop_item() qdel(src) -/obj/item/seeds/kudzu/attack_self(mob/user) +/obj/item/seeds/kudzu/attack_self__legacy__attackchain(mob/user) plant(user) to_chat(user, "You plant the kudzu. You monster.") diff --git a/code/modules/hydroponics/grown/misc_seeds.dm b/code/modules/hydroponics/grown/misc_seeds.dm index c1639a4558113..b3779e1d0cc5c 100644 --- a/code/modules/hydroponics/grown/misc_seeds.dm +++ b/code/modules/hydroponics/grown/misc_seeds.dm @@ -191,7 +191,7 @@ max_integrity = 40 wine_power = 0.8 -/obj/item/food/grown/cherry_bomb/attack_self(mob/living/user) +/obj/item/food/grown/cherry_bomb/attack_self__legacy__attackchain(mob/living/user) var/area/A = get_area(user) user.visible_message("[user] plucks the stem from [src]!", "You pluck the stem from [src], which begins to hiss loudly!") message_admins("[user] ([user.key ? user.key : "no key"]) primed a cherry bomb for detonation at [A] ([user.x], [user.y], [user.z]) (JMP)") diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index a3bb028724de0..cc7df22619cc6 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -174,7 +174,7 @@ tastes = list("walking mushroom" = 1, "motion" = 1) can_distill = FALSE -/obj/item/food/grown/mushroom/walkingmushroom/attack_self(mob/user) +/obj/item/food/grown/mushroom/walkingmushroom/attack_self__legacy__attackchain(mob/user) if(isspaceturf(user.loc)) return var/mob/living/simple_animal/hostile/mushroom/M = new /mob/living/simple_animal/hostile/mushroom(user.loc) @@ -248,7 +248,7 @@ tastes = list("warmth" = 1, "light" = 1, "glowshroom" = 1) wine_power = 0.5 -/obj/item/food/grown/mushroom/glowshroom/attack_self(mob/user) +/obj/item/food/grown/mushroom/glowshroom/attack_self__legacy__attackchain(mob/user) if(isspaceturf(user.loc)) return FALSE if(!isturf(user.loc)) diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index d9c4adbd991d8..ffc4ce7a4c7ed 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -69,7 +69,7 @@ -/obj/item/grown/nettle/afterattack(atom/A as mob|obj, mob/user,proximity) +/obj/item/grown/nettle/afterattack__legacy__attackchain(atom/A as mob|obj, mob/user,proximity) if(!proximity) return if(force > 0) @@ -105,7 +105,7 @@ user.Weaken(10 SECONDS) to_chat(user, "You are stunned by the Deathnettle when you try picking it up!") -/obj/item/grown/nettle/death/attack(mob/living/carbon/M, mob/user) +/obj/item/grown/nettle/death/attack__legacy__attackchain(mob/living/carbon/M, mob/user) ..() if(!isliving(M)) return diff --git a/code/modules/hydroponics/grown/nymph.dm b/code/modules/hydroponics/grown/nymph.dm index 8c8c9e70fd5bc..674ac06110cde 100644 --- a/code/modules/hydroponics/grown/nymph.dm +++ b/code/modules/hydroponics/grown/nymph.dm @@ -19,7 +19,7 @@ icon_state = "mushy" bitesize_mod = 2 -/obj/item/food/grown/nymph_pod/attack_self(mob/user) +/obj/item/food/grown/nymph_pod/attack_self__legacy__attackchain(mob/user) new /mob/living/simple_animal/diona(get_turf(user)) to_chat(user, "You crack open [src] letting the nymph out.") user.drop_item() diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm index 09c7e5f6fe739..dd9dbc59d7e95 100644 --- a/code/modules/hydroponics/grown/potato.dm +++ b/code/modules/hydroponics/grown/potato.dm @@ -38,7 +38,7 @@ distill_reagent = "sbiten" -/obj/item/food/grown/potato/attackby(obj/item/W, mob/user, params) +/obj/item/food/grown/potato/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(W.sharp) to_chat(user, "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 4a3668acc052b..5f6592da81f95 100644 --- a/code/modules/hydroponics/grown/pumpkin.dm +++ b/code/modules/hydroponics/grown/pumpkin.dm @@ -28,7 +28,7 @@ wine_power = 0.2 var/carved_type = /obj/item/clothing/head/hardhat/pumpkinhead -/obj/item/food/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/food/grown/pumpkin/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(W.sharp) user.show_message("You carve a face into [src]!", 1) new carved_type(user.loc) diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 68a5da7883c47..784dabc6bd300 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -25,7 +25,7 @@ mind = null return ..() -/obj/item/seeds/replicapod/attackby(obj/item/W, mob/user, params) +/obj/item/seeds/replicapod/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W,/obj/item/reagent_containers/syringe)) if(!contains_sample) for(var/datum/reagent/blood/bloodSample in W.reagents.reagent_list) diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 9a52dc6b88ca3..c45ca2e22d107 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -31,7 +31,7 @@ filling_color = "#FFA500" bitesize_mod = 2 -/obj/item/food/grown/carrot/attackby(obj/item/I, mob/user, params) +/obj/item/food/grown/carrot/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.sharp) to_chat(user, "You sharpen the carrot into a shiv with [I].") var/obj/item/kitchen/knife/shiv/carrot/Shiv = new () diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 4f26bf4f6fe54..355e0bce240c5 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -129,13 +129,13 @@ origin_tech = "biotech=4;combat=5" distill_reagent = "demonsblood" -/obj/item/food/grown/tomato/killer/attack(mob/M, mob/user, def_zone) +/obj/item/food/grown/tomato/killer/attack__legacy__attackchain(mob/M, mob/user, def_zone) if(awakening) to_chat(user, "The tomato is twitching and shaking, preventing you from eating it.") return ..() -/obj/item/food/grown/tomato/killer/attack_self(mob/user) +/obj/item/food/grown/tomato/killer/attack_self__legacy__attackchain(mob/user) if(awakening || isspaceturf(user.loc)) return to_chat(user, "You begin to awaken the Killer Tomato...") diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 484afa4f43fc8..d9536cbb57363 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -52,7 +52,7 @@ /obj/item/food/grown/ambrosia/deus, /obj/item/food/grown/wheat)) -/obj/item/grown/log/attackby(obj/item/W, mob/user, params) +/obj/item/grown/log/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(W.sharp) if(in_inventory) to_chat(user, "You need to place [src] on a flat surface to make [plank_name].") @@ -146,7 +146,7 @@ . = ..() StartBurning() -/obj/structure/bonfire/attackby(obj/item/W, mob/user, params) +/obj/structure/bonfire/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/rods) && !can_buckle) var/obj/item/stack/rods/R = W R.use(1) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 8e84ace5abcca..7b754316f6059 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -42,7 +42,7 @@ QDEL_NULL(seed) return ..() -/obj/item/grown/attackby(obj/item/O, mob/user, params) +/obj/item/grown/attackby__legacy__attackchain(obj/item/O, mob/user, params) ..() if(istype(O, /obj/item/plant_analyzer)) send_plant_details(user) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 543e1f026a227..f99b0dfa202e3 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -204,7 +204,7 @@ attack_verb = list("hit", "poked") hitsound = "swing_hit" -/obj/item/scythe/tele/attack_self(mob/user) +/obj/item/scythe/tele/attack_self__legacy__attackchain(mob/user) extend = !extend if(extend) to_chat(user, "With a flick of your wrist, you extend the scythe. It's reaping time!") diff --git a/code/modules/hydroponics/hydroponics_tray.dm b/code/modules/hydroponics/hydroponics_tray.dm index 538094feb4794..3b7b0f3477cfc 100644 --- a/code/modules/hydroponics/hydroponics_tray.dm +++ b/code/modules/hydroponics/hydroponics_tray.dm @@ -123,7 +123,7 @@ QDEL_NULL(myseed) return ..() -/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/user, params) +/obj/machinery/hydroponics/constructable/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "hydrotray3", "hydrotray3", I)) return return ..() @@ -770,7 +770,7 @@ to_chat(user, message.Join("")) doping_chem = new_chem -/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params) +/obj/machinery/hydroponics/attackby__legacy__attackchain(obj/item/O, mob/user, params) //Called when mob user "attacks" it with object O if(istype(O, /obj/item/reagent_containers)) // Syringe stuff (and other reagent containers now too) var/obj/item/reagent_containers/reagent_source = O @@ -1029,7 +1029,7 @@ /obj/machinery/hydroponics/soil/update_icon_lights() return // Has no lights -/obj/machinery/hydroponics/soil/attackby(obj/item/O, mob/user, params) +/obj/machinery/hydroponics/soil/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/shovel) && !istype(O, /obj/item/shovel/spade)) //Doesn't include spades because of uprooting plants to_chat(user, "You clear up [src]!") qdel(src) diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 32f0f2d2ab72d..b3b91a5831358 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -74,7 +74,7 @@ for(var/obj/item/stock_parts/manipulator/M in component_parts) seed_multiplier = M.rating -/obj/machinery/seed_extractor/attackby(obj/item/O, mob/user, params) +/obj/machinery/seed_extractor/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(default_deconstruction_screwdriver(user, "sextractor_open", "sextractor", O)) return diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index e98fd98a52b8f..4132930cae0ee 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -391,7 +391,7 @@ /obj/item/seeds/proc/on_chem_reaction(datum/reagents/S) // In case seeds have some special interaction with special chems return -/obj/item/seeds/attackby(obj/item/O, mob/user, params) +/obj/item/seeds/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/plant_analyzer)) to_chat(user, "This is \a [src].") var/text = get_analyzer_text() @@ -640,12 +640,12 @@ /obj/item/unsorted_seeds/proc/sort(depth = 1) seed_data.transform(src, depth) -/obj/item/unsorted_seeds/attack_self(mob/user) +/obj/item/unsorted_seeds/attack_self__legacy__attackchain(mob/user) user.visible_message("[user] crudely sorts through [src] by hand.", "You crudely sort through [src] by hand. This would be easier and more effective with some sort of tool.") if(do_after(user, 3 SECONDS, TRUE, src, must_be_held = TRUE)) sort() -/obj/item/unsorted_seeds/attackby(obj/item/O, mob/user, params) +/obj/item/unsorted_seeds/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/plant_analyzer)) to_chat(user, "This is \a [src].") var/text = get_analyzer_text() diff --git a/code/modules/instruments/objs/items/_instrument.dm b/code/modules/instruments/objs/items/_instrument.dm index e189757286389..5155b6fe23d61 100644 --- a/code/modules/instruments/objs/items/_instrument.dm +++ b/code/modules/instruments/objs/items/_instrument.dm @@ -27,7 +27,7 @@ user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS -/obj/item/instrument/attack_self(mob/user) +/obj/item/instrument/attack_self__legacy__attackchain(mob/user) ui_interact(user) /obj/item/instrument/ui_data(mob/user) diff --git a/code/modules/instruments/objs/items/instrument_items.dm b/code/modules/instruments/objs/items/instrument_items.dm index 6ed3fe637c086..4c8477c4d4725 100644 --- a/code/modules/instruments/objs/items/instrument_items.dm +++ b/code/modules/instruments/objs/items/instrument_items.dm @@ -91,7 +91,7 @@ . = ..() AddComponent(/datum/component/spooky) -/obj/item/instrument/trumpet/spectral/attack(mob/living/carbon/C, mob/user) +/obj/item/instrument/trumpet/spectral/attack__legacy__attackchain(mob/living/carbon/C, mob/user) playsound(src, 'sound/instruments/trombone/En4.mid', 100, TRUE, -1) ..() @@ -114,7 +114,7 @@ . = ..() AddComponent(/datum/component/spooky) -/obj/item/instrument/saxophone/spectral/attack(mob/living/carbon/C, mob/user) +/obj/item/instrument/saxophone/spectral/attack__legacy__attackchain(mob/living/carbon/C, mob/user) playsound(src, 'sound/instruments/saxophone/En4.mid', 100, TRUE,-1) ..() @@ -137,7 +137,7 @@ . = ..() AddComponent(/datum/component/spooky) -/obj/item/instrument/trombone/spectral/attack(mob/living/carbon/C, mob/user) +/obj/item/instrument/trombone/spectral/attack__legacy__attackchain(mob/living/carbon/C, mob/user) playsound (src, 'sound/instruments/trombone/Cn4.mid', 100,1,-1) ..() @@ -147,7 +147,7 @@ force = 0 attack_verb = list("Wahed", "Waahed", "Waaahed", "Honked") -/obj/item/instrument/trombone/sad/attack(mob/living/carbon/C, mob/user) +/obj/item/instrument/trombone/sad/attack__legacy__attackchain(mob/living/carbon/C, mob/user) playsound(loc, 'sound/misc/sadtrombone.ogg', 50, TRUE, -1) ..() diff --git a/code/modules/library/book.dm b/code/modules/library/book.dm index ae7a964ed720b..016a5fb8136a4 100644 --- a/code/modules/library/book.dm +++ b/code/modules/library/book.dm @@ -74,7 +74,7 @@ icon_state = "book[rand(1,8)]" -/obj/item/book/attack(mob/M, mob/living/user) +/obj/item/book/attack__legacy__attackchain(mob/M, mob/living/user) if(user.a_intent == INTENT_HELP) force = 0 attack_verb = list("educated") @@ -83,7 +83,7 @@ attack_verb = list("bashed", "whacked") ..() -/obj/item/book/attack_self(mob/user) +/obj/item/book/attack_self__legacy__attackchain(mob/user) if(carved) //Attempt to remove inserted object, if none found, remind user that someone vandalized their book (Bastards)! if(!remove_stored_item(user, TRUE)) @@ -92,7 +92,7 @@ user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.") read_book(user) -/obj/item/book/attackby(obj/item/I, mob/user, params) +/obj/item/book/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(is_pen(I)) edit_book(user) else if(istype(I, /obj/item/barcodescanner)) diff --git a/code/modules/library/library_computer.dm b/code/modules/library/library_computer.dm index a98a441fca9dc..56cbb2c9539b0 100644 --- a/code/modules/library/library_computer.dm +++ b/code/modules/library/library_computer.dm @@ -65,7 +65,7 @@ /obj/machinery/computer/library/attack_ghost(mob/user) ui_interact(user) -/obj/machinery/computer/library/attackby(obj/item/O, mob/user, params) +/obj/machinery/computer/library/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/book)) select_book(O) return diff --git a/code/modules/library/library_equipment.dm b/code/modules/library/library_equipment.dm index 66f23e72f1a07..38b9038220e4a 100644 --- a/code/modules/library/library_equipment.dm +++ b/code/modules/library/library_equipment.dm @@ -31,7 +31,7 @@ I.forceMove(src) update_icon(UPDATE_ICON_STATE) -/obj/structure/bookcase/attackby(obj/item/O, mob/user) +/obj/structure/bookcase/attackby__legacy__attackchain(obj/item/O, mob/user) if(is_type_in_list(O, allowed_books)) if(!user.drop_item()) return @@ -183,7 +183,7 @@ ui_interact(user) -/obj/machinery/bookbinder/attackby(obj/item/I, mob/user) +/obj/machinery/bookbinder/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/paper)) select_paper(I) if(istype(I, /obj/item/paper_bundle)) @@ -337,7 +337,7 @@ var/obj/machinery/computer/library/computer var/mode = BARCODE_MODE_SCAN_SELECT -/obj/item/barcodescanner/attack_self(mob/user) +/obj/item/barcodescanner/attack_self__legacy__attackchain(mob/user) if(!check_connection(user)) return mode++ diff --git a/code/modules/martial_arts/adminfu.dm b/code/modules/martial_arts/adminfu.dm index c8ae841ffb5b8..dbda7fe374156 100644 --- a/code/modules/martial_arts/adminfu.dm +++ b/code/modules/martial_arts/adminfu.dm @@ -40,7 +40,7 @@ icon_state ="scroll2" var/used = FALSE -/obj/item/adminfu_scroll/attack_self(mob/user as mob) +/obj/item/adminfu_scroll/attack_self__legacy__attackchain(mob/user as mob) if(!ishuman(user)) return if(!used) diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm index 5a17d897145e3..fa82a4f47eee2 100644 --- a/code/modules/martial_arts/martial.dm +++ b/code/modules/martial_arts/martial.dm @@ -293,7 +293,7 @@ icon_state ="scroll2" var/used = FALSE -/obj/item/plasma_fist_scroll/attack_self(mob/user as mob) +/obj/item/plasma_fist_scroll/attack_self__legacy__attackchain(mob/user as mob) if(!ishuman(user)) return @@ -313,7 +313,7 @@ icon = 'icons/obj/wizard.dmi' icon_state = "scroll2" -/obj/item/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user as mob) +/obj/item/sleeping_carp_scroll/attack_self__legacy__attackchain(mob/living/carbon/human/user as mob) if(!istype(user) || !user) return if(user.mind) //Prevents changelings and vampires from being able to learn it @@ -337,7 +337,7 @@ icon = 'icons/obj/library.dmi' icon_state = "cqcmanual" -/obj/item/cqc_manual/attack_self(mob/living/carbon/human/user) +/obj/item/cqc_manual/attack_self__legacy__attackchain(mob/living/carbon/human/user) if(!istype(user) || !user) return if(user.mind) //Prevents changelings and vampires from being able to learn it @@ -382,7 +382,7 @@ /obj/item/bostaff/update_icon_state() icon_state = "[base_icon_state]0" -/obj/item/bostaff/attack(mob/target, mob/living/user) +/obj/item/bostaff/attack__legacy__attackchain(mob/target, mob/living/user) add_fingerprint(user) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) to_chat(user, "You club yourself over the head with [src].") diff --git a/code/modules/martial_arts/mimejutsu.dm b/code/modules/martial_arts/mimejutsu.dm index 3cda37e39e53a..8a1f1e693fb11 100644 --- a/code/modules/martial_arts/mimejutsu.dm +++ b/code/modules/martial_arts/mimejutsu.dm @@ -20,7 +20,7 @@ icon_state = "beret" var/used = FALSE -/obj/item/mimejutsu_scroll/attack_self(mob/user as mob) +/obj/item/mimejutsu_scroll/attack_self__legacy__attackchain(mob/user as mob) if(!ishuman(user)) return if(!used) diff --git a/code/modules/maze_generation/maze_helper_atoms.dm b/code/modules/maze_generation/maze_helper_atoms.dm index 4ea9777bd76e2..b3eecbd3fffe5 100644 --- a/code/modules/maze_generation/maze_helper_atoms.dm +++ b/code/modules/maze_generation/maze_helper_atoms.dm @@ -11,6 +11,10 @@ desc = "You can't take this down. Looks like you have to solve the maze." resistance_flags = INDESTRUCTIBLE +/obj/structure/window/reinforced/mazeglass/Initialize(mapload, direct) + . = ..() + RegisterSignal(src, COMSIG_TOOL_ATTACK, PROC_REF(do_nothing)) + // No taking apart -/obj/structure/window/reinforced/mazeglass/tool_act(mob/living/user, obj/item/I, tool_type) - return FALSE +/obj/structure/window/reinforced/mazeglass/proc/do_nothing(mob/living/user, obj/item/I, tool_type) + return COMPONENT_CANCEL_TOOLACT diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index e8c49f5d821a3..d5b9394871f2f 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -165,7 +165,7 @@ else return ..() -/obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user) +/obj/structure/closet/crate/secure/loot/attackby__legacy__attackchain(obj/item/W, mob/user) if(locked) if(istype(W, /obj/item/card/emag)) boom(user) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 6e8241f6dd1b5..6b68ea56f4d14 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -53,7 +53,7 @@ var/obj/item/crusher_trophy/T = t . += "It has \a [T] attached, which causes [T.effect_desc()]." -/obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user) +/obj/item/kinetic_crusher/attackby__legacy__attackchain(obj/item/I, mob/living/user) if(istype(I, /obj/item/crusher_trophy)) var/obj/item/crusher_trophy/T = I T.add_to(src, user) @@ -72,7 +72,7 @@ else to_chat(user, "There are no trophies on [src].") -/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) +/obj/item/kinetic_crusher/attack__legacy__attackchain(mob/living/target, mob/living/carbon/user) if(!HAS_TRAIT(src, TRAIT_WIELDED)) to_chat(user, "[src] is too heavy to use with one hand. You fumble and drop everything.") user.drop_r_hand() @@ -103,7 +103,7 @@ if(ismob(user) && isturf(user.loc)) return user.loc -/obj/item/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) +/obj/item/kinetic_crusher/afterattack__legacy__attackchain(atom/target, mob/living/user, proximity_flag, clickparams) . = ..() if(!HAS_TRAIT(src, TRAIT_WIELDED)) return @@ -245,7 +245,7 @@ /obj/item/crusher_trophy/proc/effect_desc() return "errors" -/obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user) +/obj/item/crusher_trophy/attackby__legacy__attackchain(obj/item/A, mob/living/user) if(istype(A, /obj/item/kinetic_crusher)) add_to(A, user) else diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm index fa5b0b657f726..0156ba9fc58be 100644 --- a/code/modules/mining/equipment/lazarus_injector.dm +++ b/code/modules/mining/equipment/lazarus_injector.dm @@ -14,7 +14,7 @@ var/malfunctioning = 0 var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it -/obj/item/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/lazarus_injector/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag) if(!loaded) return if(isliving(target) && proximity_flag) @@ -91,7 +91,7 @@ QDEL_NULL(captured) return ..() -/obj/item/mobcapsule/attack(mob/living/simple_animal/S, mob/user, prox_flag) +/obj/item/mobcapsule/attack__legacy__attackchain(mob/living/simple_animal/S, mob/user, prox_flag) if(istype(S) && S.sentience_type == capture_type) capture(S, user) return TRUE @@ -121,7 +121,7 @@ captured.forceMove(get_turf(src)) captured = null -/obj/item/mobcapsule/attack_self(mob/user) +/obj/item/mobcapsule/attack_self__legacy__attackchain(mob/user) colorindex += 1 if(colorindex >= 6) colorindex = 0 diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index f0acc21cc5352..e482243b6e904 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -47,7 +47,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( /obj/item/stack/marker_beacon/update_icon_state() icon_state = "[base_icon_state][lowertext(picked_color)]" -/obj/item/stack/marker_beacon/attack_self(mob/user) +/obj/item/stack/marker_beacon/attack_self__legacy__attackchain(mob/user) if(!isturf(user.loc)) to_chat(user, "You need more space to place a [singular_name] here.") return @@ -125,7 +125,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) qdel(src) -/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, params) +/obj/structure/marker_beacon/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/stack/marker_beacon)) var/obj/item/stack/marker_beacon/M = I to_chat(user, "You start picking [src] up...") @@ -157,7 +157,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( /obj/structure/marker_beacon/dock_marker/update_icon_state() set_light(light_range, light_power, LIGHT_COLOR_BLUE) -/obj/structure/marker_beacon/dock_marker/attackby() +/obj/structure/marker_beacon/dock_marker/attackby__legacy__attackchain() return /obj/structure/marker_beacon/dock_marker/attack_hand() diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index fe0fd5b0a7854..24d0bca968c85 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -13,7 +13,7 @@ origin_tech = "engineering=1;magnets=1" -/obj/item/mining_scanner/attack_self(mob/user) +/obj/item/mining_scanner/attack_self__legacy__attackchain(mob/user) if(!user.client) return if(current_cooldown <= world.time) @@ -24,7 +24,7 @@ //Debug item to identify all ore spread quickly /obj/item/mining_scanner/admin -/obj/item/mining_scanner/admin/attack_self(mob/user) +/obj/item/mining_scanner/admin/attack_self__legacy__attackchain(mob/user) for(var/turf/simulated/mineral/M in world) if(M.ore?.scan_icon_state) M.icon_state = M.ore.scan_icon_state diff --git a/code/modules/mining/equipment/mining_charges.dm b/code/modules/mining/equipment/mining_charges.dm index 74454a4b4ab8d..fa3996820e9e9 100644 --- a/code/modules/mining/equipment/mining_charges.dm +++ b/code/modules/mining/equipment/mining_charges.dm @@ -26,11 +26,11 @@ if(timer_off) . += "The mining charge is connected to a detonator." -/obj/item/grenade/plastic/miningcharge/attack_self(mob/user) +/obj/item/grenade/plastic/miningcharge/attack_self__legacy__attackchain(mob/user) if(nadeassembly) - nadeassembly.attack_self(user) + nadeassembly.attack_self__legacy__attackchain(user) -/obj/item/grenade/plastic/miningcharge/afterattack(atom/movable/AM, mob/user, flag) +/obj/item/grenade/plastic/miningcharge/afterattack__legacy__attackchain(atom/movable/AM, mob/user, flag) if(!ismineralturf(AM) && !hacked) return if(is_ancient_rock(AM) && !hacked) @@ -55,7 +55,7 @@ installed = TRUE target.overlays += image_overlay -/obj/item/grenade/plastic/miningcharge/attackby(obj/item/I, mob/user, params) +/obj/item/grenade/plastic/miningcharge/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/detonator)) return var/obj/item/detonator/detonator = I @@ -157,7 +157,7 @@ . = ..() . += "This scanner has an extra port for overriding mining charge safeties." -/obj/item/t_scanner/adv_mining_scanner/syndicate/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/t_scanner/adv_mining_scanner/syndicate/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, click_parameters) if(!istype(target, /obj/item/grenade/plastic/miningcharge)) return var/obj/item/grenade/plastic/miningcharge/charge = target @@ -200,7 +200,7 @@ else icon_state = initial(icon_state) -/obj/item/detonator/attack_self(mob/user) +/obj/item/detonator/attack_self__legacy__attackchain(mob/user) playsound(src, 'sound/items/detonator.ogg', 40) if(length(bombs)) to_chat(user, "Activating explosives...") diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index b592a93b3bc65..24c6808384a0d 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -7,7 +7,7 @@ w_class = WEIGHT_CLASS_TINY origin_tech = "biotech=3" -/obj/item/hivelordstabilizer/afterattack(obj/item/organ/internal/M, mob/user) +/obj/item/hivelordstabilizer/afterattack__legacy__attackchain(obj/item/organ/internal/M, mob/user) . = ..() var/obj/item/organ/internal/regenerative_core/C = M if(!istype(C, /obj/item/organ/internal/regenerative_core)) @@ -90,12 +90,12 @@ user.drop_item() qdel(src) -/obj/item/organ/internal/regenerative_core/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/organ/internal/regenerative_core/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag) . = ..() if(proximity_flag) applyto(target, user) -/obj/item/organ/internal/regenerative_core/attack_self(mob/user) +/obj/item/organ/internal/regenerative_core/attack_self__legacy__attackchain(mob/user) applyto(user, user) /obj/item/organ/internal/regenerative_core/insert(mob/living/carbon/M, special = 0) diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm index ba80370b2617d..f9d9ad373c61b 100644 --- a/code/modules/mining/equipment/resonator.dm +++ b/code/modules/mining/equipment/resonator.dm @@ -21,7 +21,7 @@ /// the number that is added to the failure_prob, which is the probability of whether it will spread or not var/adding_failure = 50 -/obj/item/resonator/attack_self(mob/user) +/obj/item/resonator/attack_self__legacy__attackchain(mob/user) if(mode == RESONATOR_MODE_AUTO) to_chat(user, "You set the [name]'s fields to detonate only after you hit it with [src].") mode = RESONATOR_MODE_MANUAL @@ -37,7 +37,7 @@ fieldlimit = 6 quick_burst_mod = 1 -/obj/item/resonator/upgraded/attack_self(mob/user) +/obj/item/resonator/upgraded/attack_self__legacy__attackchain(mob/user) if(mode == RESONATOR_MODE_AUTO) to_chat(user, "You set [src]'s fields to detonate only after being attacked by [src].") mode = RESONATOR_MODE_MANUAL diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 03b66feb01185..d8488322eab27 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -38,7 +38,7 @@ . += "This capsule has the [template.name] stored." . += template.description -/obj/item/survivalcapsule/attack_self() +/obj/item/survivalcapsule/attack_self__legacy__attackchain() // Can't grab when capsule is New() because templates aren't loaded then get_template() if(!used) @@ -217,7 +217,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/economy/vending/wallmed/survival_pod, qdel(src) /obj/item/gps/computer/attack_hand(mob/user) - attack_self(user) + attack_self__legacy__attackchain(user) //Bed /obj/structure/bed/pod diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 17cf4e80bd8f7..5195a1fdb39fe 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -14,7 +14,7 @@ GLOBAL_LIST_EMPTY(wormhole_effect) origin_tech = "bluespace=2" slot_flags = ITEM_SLOT_BELT -/obj/item/wormhole_jaunter/attack_self(mob/user) +/obj/item/wormhole_jaunter/attack_self__legacy__attackchain(mob/user) user.visible_message("[user.name] activates the [name]!") activate(user, TRUE) @@ -131,7 +131,7 @@ GLOBAL_LIST_EMPTY(wormhole_effect) return destination = L[desc] -/obj/item/wormhole_jaunter/contractor/attack_self(mob/user) // message is later down +/obj/item/wormhole_jaunter/contractor/attack_self__legacy__attackchain(mob/user) // message is later down activate(user, TRUE) /obj/item/wormhole_jaunter/contractor/activate(mob/user) @@ -197,7 +197,7 @@ GLOBAL_LIST_EMPTY(wormhole_effect) thrower = null return ..() -/obj/item/grenade/jaunter_grenade/attack_self(mob/user) +/obj/item/grenade/jaunter_grenade/attack_self__legacy__attackchain(mob/user) . = ..() thrower = user @@ -261,7 +261,7 @@ GLOBAL_LIST_EMPTY(wormhole_effect) /// The turf where we activated the wormwhole. var/wormhole_loc -/obj/item/wormhole_jaunter/wormhole_weaver/attack_self(mob/user) +/obj/item/wormhole_jaunter/wormhole_weaver/attack_self__legacy__attackchain(mob/user) activate(user, TRUE) /obj/item/wormhole_jaunter/wormhole_weaver/emp_act(severity) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index f05c780505a4e..1b6a0a2f1a670 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -17,7 +17,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) . = ..() . += "It has [uses_left] use\s remaining." -/obj/item/extraction_pack/attack_self(mob/user) +/obj/item/extraction_pack/attack_self__legacy__attackchain(mob/user) var/list/possible_beacons = list() for(var/B in GLOB.total_extraction_beacons) var/obj/structure/extraction_point/EP = B @@ -38,7 +38,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) beacon = A to_chat(user, "You link the extraction pack to the beacon system.") -/obj/item/extraction_pack/afterattack(atom/movable/A, mob/living/carbon/human/user, flag, params) +/obj/item/extraction_pack/afterattack__legacy__attackchain(atom/movable/A, mob/living/carbon/human/user, flag, params) . = ..() if(!beacon) to_chat(user, "[src] is not linked to a beacon, and cannot be used!") @@ -151,7 +151,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) icon = 'icons/obj/fulton.dmi' icon_state = "folded_extraction" -/obj/item/fulton_core/attack_self(mob/user) +/obj/item/fulton_core/attack_self__legacy__attackchain(mob/user) if(do_after(user, 15, target = user) && !QDELETED(src)) new /obj/structure/extraction_point(get_turf(user)) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) diff --git a/code/modules/mining/laborcamp/laborshuttle.dm b/code/modules/mining/laborcamp/laborshuttle.dm index 837b6b5f8b88b..abb5d60094235 100644 --- a/code/modules/mining/laborcamp/laborshuttle.dm +++ b/code/modules/mining/laborcamp/laborshuttle.dm @@ -46,7 +46,7 @@ QDEL_NULL(announcer) return ..() -/obj/machinery/mineral/labor_prisoner_shuttle_console/attackby(obj/item/I, mob/user, params) +/obj/machinery/mineral/labor_prisoner_shuttle_console/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id/prisoner)) if(inserted_id_uid) to_chat(user, "There's an ID inserted already.") @@ -172,7 +172,7 @@ return user.examinate(src) -/obj/machinery/mineral/labor_points_checker/attackby(obj/item/I, mob/user, params) +/obj/machinery/mineral/labor_points_checker/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id/prisoner)) var/obj/item/card/id/prisoner/prisoner_id = I if(!prisoner_id.goal) diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 9780ef5a7c846..494596b6202a5 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -60,7 +60,7 @@ desc = initial(desc) harvested = FALSE -/obj/structure/flora/ash/attackby(obj/item/W, mob/user, params) +/obj/structure/flora/ash/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(!harvested && needs_sharp_harvest && W.sharp) user.visible_message("[user] starts to harvest from [src] with [W].","You begin to harvest from [src] with [W].") if(do_after(user, harvest_time, target = src)) diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm index 94fc152dab4ec..9ef9c6de45e71 100644 --- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -71,7 +71,7 @@ else . += "It glows weakly." -/obj/item/melee/ghost_sword/attack_self(mob/user) +/obj/item/melee/ghost_sword/attack_self__legacy__attackchain(mob/user) if(summon_cooldown > world.time) to_chat(user, "You just recently called out for aid. You don't want to annoy the spirits.") return @@ -163,7 +163,7 @@ break -/obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user) +/obj/item/melee/ghost_sword/attack__legacy__attackchain(mob/living/target, mob/living/carbon/human/user) force = 0 var/ghost_counter = length(orbs) @@ -203,7 +203,7 @@ icon = 'icons/obj/wizard.dmi' icon_state = "vial" -/obj/item/dragons_blood/attack_self(mob/living/carbon/human/user) +/obj/item/dragons_blood/attack_self__legacy__attackchain(mob/living/carbon/human/user) if(!istype(user)) return @@ -273,7 +273,7 @@ . = ..() banned_turfs = typecacheof(list(/turf/space/transit, /turf/simulated/wall, /turf/simulated/mineral)) -/obj/item/lava_staff/attack(mob/target, mob/living/user) +/obj/item/lava_staff/attack__legacy__attackchain(mob/target, mob/living/user) if(!cigarette_lighter_act(user, target)) return ..() @@ -295,7 +295,7 @@ cig.light(user, target) return TRUE -/obj/item/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/lava_staff/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, click_parameters) ..() if(timer > world.time) return diff --git a/code/modules/mining/lavaland/loot/bubblegum_loot.dm b/code/modules/mining/lavaland/loot/bubblegum_loot.dm index 6bd2a3e7ac03b..19d6bf7fff3b9 100644 --- a/code/modules/mining/lavaland/loot/bubblegum_loot.dm +++ b/code/modules/mining/lavaland/loot/bubblegum_loot.dm @@ -85,7 +85,7 @@ icon = 'icons/obj/wizard.dmi' icon_state = "vial" -/obj/item/mayhem/attack_self(mob/user) +/obj/item/mayhem/attack_self__legacy__attackchain(mob/user) for(var/mob/living/carbon/human/H in range(7,user)) spawn() var/obj/effect/mine/pickup/bloodbath/B = new(H) @@ -104,7 +104,7 @@ desc = "Mark your target for death." var/used = FALSE -/obj/item/blood_contract/attack_self(mob/user) +/obj/item/blood_contract/attack_self__legacy__attackchain(mob/user) if(used) return diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index a4786aa23cfdd..740a502eab196 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -49,7 +49,7 @@ ..() ActivationReaction(user,"touch") -/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params) +/obj/machinery/anomalous_crystal/attackby__legacy__attackchain(obj/item/I, mob/user, params) ActivationReaction(user,"weapon") return ..() diff --git a/code/modules/mining/lavaland/loot/hierophant_loot.dm b/code/modules/mining/lavaland/loot/hierophant_loot.dm index eaa7ecc93184c..940a929eb114e 100644 --- a/code/modules/mining/lavaland/loot/hierophant_loot.dm +++ b/code/modules/mining/lavaland/loot/hierophant_loot.dm @@ -48,7 +48,7 @@ return OBLITERATION -/obj/item/hierophant_club/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/hierophant_club/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, click_parameters) ..() if(world.time < timer) return diff --git a/code/modules/mining/lavaland/loot/legion_loot.dm b/code/modules/mining/lavaland/loot/legion_loot.dm index 4153ea14f90fc..afbbc627a4718 100644 --- a/code/modules/mining/lavaland/loot/legion_loot.dm +++ b/code/modules/mining/lavaland/loot/legion_loot.dm @@ -30,7 +30,7 @@ . += "Use it on targets to summon thunderbolts from the sky." . += "The thunderbolts are boosted if in an area with weather effects." -/obj/item/storm_staff/attack(mob/living/target, mob/living/user) +/obj/item/storm_staff/attack__legacy__attackchain(mob/living/target, mob/living/user) if(cigarette_lighter_act(user, target)) return TRUE @@ -62,7 +62,7 @@ thunder_charges-- return TRUE -/obj/item/storm_staff/attack_self(mob/user) +/obj/item/storm_staff/attack_self__legacy__attackchain(mob/user) var/area/user_area = get_area(user) var/turf/user_turf = get_turf(user) if(!user_area || !user_turf) @@ -92,7 +92,7 @@ user.transform *= 1.2 animate(user, color = old_color, transform = old_transform, time = 1 SECONDS) -/obj/item/storm_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/storm_staff/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, click_parameters) // This early return stops the staff from shooting lightning at someone when being used as a lighter. if(iscarbon(target)) var/mob/living/carbon/cig_haver = target diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index 956f6ab9c3d12..d0329bf4fcbce 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -45,8 +45,8 @@ . = ..() ADD_TRAIT(src, TRAIT_ADJACENCY_TRANSPARENT, ROUNDSTART_TRAIT) -/obj/item/shared_storage/attackby(obj/item/W, mob/user, params) - bag?.attackby(W, user, params) +/obj/item/shared_storage/attackby__legacy__attackchain(obj/item/W, mob/user, params) + bag?.attackby__legacy__attackchain(W, user, params) /obj/item/shared_storage/attack_ghost(mob/user) if(isobserver(user)) @@ -54,7 +54,7 @@ bag?.show_to(user) return ..() -/obj/item/shared_storage/attack_self(mob/living/carbon/user) +/obj/item/shared_storage/attack_self__legacy__attackchain(mob/living/carbon/user) if(!iscarbon(user)) return if(user.is_holding(src)) @@ -108,7 +108,7 @@ icon_state = "book1" w_class = 2 -/obj/item/book_of_babel/attack_self(mob/user) +/obj/item/book_of_babel/attack_self__legacy__attackchain(mob/user) to_chat(user, "You flip through the pages of the book, quickly and conveniently learning every language in existence. Somewhat less conveniently, the aging book crumbles to dust in the process. Whoops.") user.grant_all_babel_languages() new /obj/effect/decal/cleanable/ash(get_turf(user)) @@ -183,7 +183,7 @@ icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "ship_bottle" -/obj/item/ship_in_a_bottle/attack_self(mob/user) +/obj/item/ship_in_a_bottle/attack_self__legacy__attackchain(mob/user) to_chat(user, "You're not sure how they get the ships in these things, but you're pretty sure you know how to get it out.") playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1) new /obj/vehicle/lavaboat/dragon(get_turf(src)) @@ -210,7 +210,7 @@ var/sight_flags = SEE_MOBS var/lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE -/obj/item/wisp_lantern/attack_self(mob/user) +/obj/item/wisp_lantern/attack_self__legacy__attackchain(mob/user) if(!wisp) to_chat(user, "The wisp has gone missing!") icon_state = "lantern" @@ -282,7 +282,7 @@ linked = null return ..() -/obj/item/warp_cube/attack_self(mob/user) +/obj/item/warp_cube/attack_self__legacy__attackchain(mob/user) if(!linked) to_chat(user, "[src] fizzles uselessly.") return @@ -402,7 +402,7 @@ else return QDEL_HINT_LETMELIVE -/obj/item/immortality_talisman/attack_self(mob/user) +/obj/item/immortality_talisman/attack_self__legacy__attackchain(mob/user) if(cooldown < world.time) SSblackbox.record_feedback("amount", "immortality_talisman_uses", 1) // usage cooldown = world.time + 600 @@ -433,7 +433,7 @@ . = ..() ADD_TRAIT(src, TRAIT_EFFECT_CAN_TELEPORT, ROUNDSTART_TRAIT) -/obj/effect/immortality_talisman/attackby() +/obj/effect/immortality_talisman/attackby__legacy__attackchain() return /obj/effect/immortality_talisman/ex_act() diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 2f9ee2df6cc14..e4b1f52529dbd 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -321,7 +321,7 @@ var/usedHand var/mob/living/carbon/owner -/obj/item/rod_of_asclepius/attack_self(mob/user) +/obj/item/rod_of_asclepius/attack_self__legacy__attackchain(mob/user) if(activated) return if(!iscarbon(user)) @@ -435,7 +435,7 @@ return // It's a shard -/obj/item/organ/internal/cyberimp/arm/katana/attack_self(mob/living/carbon/user, modifiers) +/obj/item/organ/internal/cyberimp/arm/katana/attack_self__legacy__attackchain(mob/living/carbon/user, modifiers) . = ..() to_chat(user,"The mass goes up your arm and inside it!") playsound(user, 'sound/misc/demon_consume.ogg', 50, TRUE) @@ -546,11 +546,11 @@ . = ..() reset_inputs(null, TRUE) -/obj/item/cursed_katana/attack_self(mob/user) +/obj/item/cursed_katana/attack_self__legacy__attackchain(mob/user) . = ..() reset_inputs(user, TRUE) -/obj/item/cursed_katana/attack(mob/living/target, mob/user, click_parameters) +/obj/item/cursed_katana/attack__legacy__attackchain(mob/living/target, mob/user, click_parameters) if(target.stat == DEAD || target == user) //No, you can not stab yourself to cloak / not take the penalty for not drawing blood return ..() if(HAS_TRAIT(user, TRAIT_PACIFISM)) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 4c0231627ee32..dbb770a72c7d3 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -180,7 +180,7 @@ message_sent = TRUE // Interactions -/obj/machinery/mineral/ore_redemption/attackby(obj/item/I, mob/user, params) +/obj/machinery/mineral/ore_redemption/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/part_replacer)) return ..() diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index bc3a2f957d9a7..660934f55a128 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -220,7 +220,7 @@ return FALSE add_fingerprint() -/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params) +/obj/machinery/mineral/equipment_vendor/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(panel_open) return TRUE if(istype(I, /obj/item/mining_voucher)) @@ -446,7 +446,7 @@ EQUIPMENT("Point Transfer Card", /obj/item/card/mining_point_card, 500), ) -/obj/machinery/mineral/equipment_vendor/explorer/attackby(obj/item/I, mob/user, params) +/obj/machinery/mineral/equipment_vendor/explorer/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "explorer-open", "explorer", I)) return if(panel_open) @@ -501,7 +501,7 @@ icon_state = "data" var/points = 500 -/obj/item/card/mining_point_card/attackby(obj/item/I, mob/user, params) +/obj/item/card/mining_point_card/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id)) if(points) var/obj/item/card/id/C = I diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 09508bde00d14..6e4e3bd5f4fa1 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -88,7 +88,7 @@ . += "There is \a [M] installed, using [M.cost]% capacity." -/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) +/mob/living/simple_animal/hostile/mining_drone/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner)) to_chat(user, "You instruct [src] to drop any collected ore.") DropOre() @@ -188,7 +188,7 @@ /mob/living/simple_animal/hostile/mining_drone/OpenFire(atom/A) if(CheckFriendlyFire(A)) return - stored_gun.afterattack(A, src) //of the possible options to allow minebots to have KA mods, would you believe this is the best? + stored_gun.afterattack__legacy__attackchain(A, src) //of the possible options to allow minebots to have KA mods, would you believe this is the best? /mob/living/simple_animal/hostile/mining_drone/proc/CollectOre() for(var/obj/item/stack/ore/O in range(1, src)) @@ -287,7 +287,7 @@ icon_state = "door_electronics" icon = 'icons/obj/doors/door_assembly.dmi' -/obj/item/mine_bot_upgrade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity) +/obj/item/mine_bot_upgrade/afterattack__legacy__attackchain(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity) if(!istype(M) || !proximity) return upgrade_bot(M, user) @@ -350,7 +350,7 @@ icon_state = "minedronecube" item_state = "electronic" -/obj/item/mining_drone_cube/attack_self(mob/user) +/obj/item/mining_drone_cube/attack_self__legacy__attackchain(mob/user) user.visible_message("\The [src] suddenly expands into a fully functional mining drone!", \ "You press center button on \the [src]. The device suddenly expands into a fully functional mining drone!") new /mob/living/simple_animal/hostile/mining_drone(get_turf(src)) diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index 5ff52401effa8..099d937ccd460 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -122,7 +122,7 @@ if("ejectBag") eject_bag(usr) -/obj/machinery/mineral/mint/attackby(obj/item/I, mob/user, params) +/obj/machinery/mineral/mint/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/bag/money)) if(money_bag) to_chat(user, "There is already a [money_bag.name] inside!") diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index f4f0ed7cae9bf..6c0b366586fa1 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -58,7 +58,7 @@ var/mob/living/L = AM if(istype(L.pulling, /obj/structure/ore_box)) var/obj/structure/ore_box/box = L.pulling - box.attackby(OB, AM) + box.attackby__legacy__attackchain(OB, AM) return ..() /obj/item/stack/ore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) @@ -275,7 +275,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ QDEL_NULL(wires) return ..() -/obj/item/gibtonite/attackby(obj/item/I, mob/user, params) +/obj/item/gibtonite/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!wires && istype(I, /obj/item/assembly/igniter)) user.visible_message("[user] attaches [I] to [src].", "You attach [I] to [src].") wires = new(src) @@ -305,7 +305,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ if(wires) wires.Interact(user) -/obj/item/gibtonite/attack_self(mob/user) +/obj/item/gibtonite/attack_self__legacy__attackchain(mob/user) if(wires) wires.Interact(user) else @@ -422,7 +422,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ if(!QDELETED(src) && !P.nodamage && (P.damage_type == BURN)) log_and_set_aflame(P.firer, P) -/obj/item/coin/plasma/attackby(obj/item/I, mob/living/user, params) +/obj/item/coin/plasma/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(!I.get_heat()) return ..() log_and_set_aflame(user, I) @@ -448,7 +448,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ credits = 160 COOLDOWN_DECLARE(radiation_cooldown) -/obj/item/coin/uranium/attack_self(mob/user) +/obj/item/coin/uranium/attack_self__legacy__attackchain(mob/user) ..() if(!COOLDOWN_FINISHED(src, radiation_cooldown)) return @@ -501,7 +501,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ name = "syndicate coin" credits = 160 -/obj/item/coin/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/coin/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W if(string_attached) @@ -548,7 +548,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ user.put_in_hands(ring) -/obj/item/coin/attack_self(mob/user as mob) +/obj/item/coin/attack_self__legacy__attackchain(mob/user as mob) if(cooldown < world.time - 15) var/coinflip = pick(sideslist) cooldown = world.time diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 3ff5be8c1a188..3d5aa45f685fc 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -9,7 +9,7 @@ density = TRUE pressure_resistance = 5 * ONE_ATMOSPHERE -/obj/structure/ore_box/attackby(obj/item/W, mob/user, params) +/obj/structure/ore_box/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/ore)) if(!user.drop_item()) return diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 7c5dd49937b43..49d30828cfa56 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -38,7 +38,7 @@ . = ..() . += extended_desc -/obj/item/mmi/attackby(obj/item/O as obj, mob/user as mob, params) +/obj/item/mmi/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/organ/internal/brain/golem)) to_chat(user, "You can't find a way to plug [O] into [src].") return @@ -126,7 +126,7 @@ "You uninstall the radio from [src].") -/obj/item/mmi/attack_self(mob/user as mob) +/obj/item/mmi/attack_self__legacy__attackchain(mob/user as mob) if(!brainmob) to_chat(user, "You upend the MMI, but there's nothing in it.") else @@ -307,7 +307,7 @@ Whilst these specialty MMIs are rarely used owing to the far greater applicability and convenience of the mindslave implant, they do see occasional employment by undercover agents that wish to stealthily convert the AI-slaved cyborgs of Nanotrasen. \ Just like the mindslave implant, these are extremely illegal in most regions of space. Simple possession (to say nothing of actual use) generally warrants a very long prison sentence." -/obj/item/mmi/syndie/attackby(obj/item/O, mob/user, params) +/obj/item/mmi/syndie/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(!master_uid && ishuman(user) && user.mind && istype(O,/obj/item/organ/internal/brain)) to_chat(user, "You press your thumb on [src] and imprint your user information.") master_uid = user.mind.UID() diff --git a/code/modules/mob/living/brain/robotic_brain.dm b/code/modules/mob/living/brain/robotic_brain.dm index fbaa53320c670..870adf823a289 100644 --- a/code/modules/mob/living/brain/robotic_brain.dm +++ b/code/modules/mob/living/brain/robotic_brain.dm @@ -24,7 +24,7 @@ imprinted_master = null return ..() -/obj/item/mmi/robotic_brain/attack_self(mob/user) +/obj/item/mmi/robotic_brain/attack_self__legacy__attackchain(mob/user) if(isgolem(user)) to_chat(user, "Your golem fingers are too large to press the switch on [src].") return diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 39920b0cacef9..4e11337826aff 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -34,8 +34,8 @@ if(obj_integrity < 90) Die() -/obj/item/clothing/mask/facehugger/attackby(obj/item/O, mob/user, params) - return O.attack_obj(src, user, params) +/obj/item/clothing/mask/facehugger/attackby__legacy__attackchain(obj/item/O, mob/user, params) + return O.attack_obj__legacy__attackchain(src, user, params) /obj/item/clothing/mask/facehugger/attack_hand(mob/user) if((stat != DEAD && !sterile) && !isalien(user)) @@ -43,7 +43,7 @@ return ..() -/obj/item/clothing/mask/facehugger/attack(mob/living/M, mob/user) +/obj/item/clothing/mask/facehugger/attack__legacy__attackchain(mob/living/M, mob/user) ..() user.unEquip(src) Attach(M) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 681856dc6833f..7e48f88904048 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -21,7 +21,7 @@ if(volume > 10) // Anything over 10 volume will make the mob wetter. wetlevel = min(wetlevel + 1,5) -/mob/living/carbon/attackby(obj/item/I, mob/user, params) +/mob/living/carbon/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(length(surgeries)) if(user.a_intent == INTENT_HELP) for(var/datum/surgery/S in surgeries) diff --git a/code/modules/mob/living/carbon/human/human_deadchat_control.dm b/code/modules/mob/living/carbon/human/human_deadchat_control.dm index fdb6db4f5b6de..2c1092efbaced 100644 --- a/code/modules/mob/living/carbon/human/human_deadchat_control.dm +++ b/code/modules/mob/living/carbon/human/human_deadchat_control.dm @@ -118,7 +118,7 @@ visible_message("[src] points [held_gun] towards [possible_target]!") return // for his neutral special, he wields a Gun - held_gun.afterattack(possible_target, src) + held_gun.afterattack__legacy__attackchain(possible_target, src) visible_message("[src] fires [held_gun][isturf(possible_target) ? "" : " towards [possible_target]!"]") /mob/living/carbon/human/proc/dchat_step(dir) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index dc716c7d532f0..f44685b03377c 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -466,7 +466,7 @@ emp_act return ..() //Returns TRUE if the attack hit, FALSE if it missed. -/mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, def_zone) +/mob/living/carbon/human/attacked_by__legacy__attackchain(obj/item/I, mob/living/user, def_zone) if(!I || !user) return FALSE @@ -819,7 +819,7 @@ emp_act -/mob/living/carbon/human/attackby(obj/item/I, mob/user, params) +/mob/living/carbon/human/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(SEND_SIGNAL(src, COMSIG_HUMAN_ATTACKED, user) & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE return ..() diff --git a/code/modules/mob/living/carbon/human/human_inventory.dm b/code/modules/mob/living/carbon/human/human_inventory.dm index f845177919589..4f87fe4ff7abe 100644 --- a/code/modules/mob/living/carbon/human/human_inventory.dm +++ b/code/modules/mob/living/carbon/human/human_inventory.dm @@ -335,7 +335,7 @@ I.forceMove(back) if(ITEM_SLOT_ACCESSORY) var/obj/item/clothing/under/uniform = src.w_uniform - uniform.attackby(I, src) + uniform.attackby__legacy__attackchain(I, src) else to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!") diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index c5ebf064008c3..086d8272ac533 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -575,7 +575,7 @@ target.visible_message("[user] has knocked down [target]!", \ "[user] has knocked down [target]!") target.KnockDown(4 SECONDS) - SEND_SIGNAL(target, COMSIG_PARENT_ATTACKBY) + SEND_SIGNAL(target, COMSIG_ATTACK_BY) /datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(user == target) diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index abb29f946ebed..c38a25432fecb 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -758,7 +758,7 @@ cloth_golem = null qdel(src) -/obj/structure/cloth_pile/attackby(obj/item/P, mob/living/carbon/human/user, params) +/obj/structure/cloth_pile/attackby__legacy__attackchain(obj/item/P, mob/living/carbon/human/user, params) . = ..() if(resistance_flags & ON_FIRE) diff --git a/code/modules/mob/living/silicon/decoy/decoy.dm b/code/modules/mob/living/silicon/decoy/decoy.dm index 93700276264d2..9e589873c6e76 100644 --- a/code/modules/mob/living/silicon/decoy/decoy.dm +++ b/code/modules/mob/living/silicon/decoy/decoy.dm @@ -6,7 +6,7 @@ mobility_flags = 0 a_intent = INTENT_HARM // This is apparently the only thing that stops other mobs walking through them as if they were thin air. -/mob/living/silicon/decoy/attackby(obj/item/W, mob/user, params) +/mob/living/silicon/decoy/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/aicard)) to_chat(user, "You cannot find an intellicard slot on [src].") return TRUE diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 356cddbb192dd..dd136add437d8 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -288,7 +288,7 @@ update_icons() //Overriding this will stop a number of headaches down the track. -/mob/living/silicon/pai/attackby(obj/item/W as obj, mob/user as mob, params) +/mob/living/silicon/pai/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/stack/nanopaste)) var/obj/item/stack/nanopaste/N = W if(stat == DEAD) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index af23670492094..ef250a010f358 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -10,10 +10,10 @@ "wood" = 0 ) -/obj/item/matter_decompiler/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) +/obj/item/matter_decompiler/attack__legacy__attackchain(mob/living/carbon/M as mob, mob/living/carbon/user as mob) return -/obj/item/matter_decompiler/afterattack(atom/target, mob/living/user, proximity, params) +/obj/item/matter_decompiler/afterattack__legacy__attackchain(atom/target, mob/living/user, proximity, params) if(!proximity) return // Not adjacent. diff --git a/code/modules/mob/living/silicon/robot/drone/maint_drone.dm b/code/modules/mob/living/silicon/robot/drone/maint_drone.dm index 2f15d921bc370..1e5b4e52b887f 100644 --- a/code/modules/mob/living/silicon/robot/drone/maint_drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/maint_drone.dm @@ -155,7 +155,7 @@ . += "The ever-loyal workers of Nanotrasen facilities. Known for their small and cute look, these drones seek only to repair damaged parts of the station, being lawed against hurting even a spiderling. These fine drones are programmed against interfering with any business of anyone, so they won't do anything you don't want them to." //Drones cannot be upgraded with borg modules so we need to catch some items before they get used in ..(). -/mob/living/silicon/robot/drone/attackby(obj/item/I, mob/user, params) +/mob/living/silicon/robot/drone/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/borg/upgrade)) to_chat(user, "The maintenance drone chassis is not compatible with [I].") return diff --git a/code/modules/mob/living/silicon/robot/misc_robot_items.dm b/code/modules/mob/living/silicon/robot/misc_robot_items.dm index 22b21a4104c3d..a0410be25c944 100644 --- a/code/modules/mob/living/silicon/robot/misc_robot_items.dm +++ b/code/modules/mob/living/silicon/robot/misc_robot_items.dm @@ -6,7 +6,7 @@ name = "Printing Pen" var/mode = 1 -/obj/item/pen/multi/robopen/attack_self(mob/user as mob) +/obj/item/pen/multi/robopen/attack_self__legacy__attackchain(mob/user as mob) var/choice = tgui_input_list(user, "Would you like to change colour or mode?", name, list("Colour","Mode")) if(!choice) return @@ -45,10 +45,10 @@ icon_state = "paper_bin1" item_state = "sheet-metal" -/obj/item/form_printer/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) +/obj/item/form_printer/attack__legacy__attackchain(mob/living/carbon/M as mob, mob/living/carbon/user as mob) return -/obj/item/form_printer/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) +/obj/item/form_printer/afterattack__legacy__attackchain(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) if(!target || !flag) return @@ -56,7 +56,7 @@ if(istype(target,/obj/structure/table)) deploy_paper(get_turf(target)) -/obj/item/form_printer/attack_self(mob/user as mob) +/obj/item/form_printer/attack_self__legacy__attackchain(mob/user as mob) deploy_paper(get_turf(src)) /obj/item/form_printer/proc/deploy_paper(turf/T) diff --git a/code/modules/mob/living/silicon/robot/robot_mob.dm b/code/modules/mob/living/silicon/robot/robot_mob.dm index d05a6284a755b..3e1b5940227c1 100644 --- a/code/modules/mob/living/silicon/robot/robot_mob.dm +++ b/code/modules/mob/living/silicon/robot/robot_mob.dm @@ -920,7 +920,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( return 2 -/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params) +/mob/living/silicon/robot/attackby__legacy__attackchain(obj/item/W, mob/user, params) // Check if the user is trying to insert another component like a radio, actuator, armor etc. if(istype(W, /obj/item/robot_parts/robot_component) && opened) for(var/V in components) @@ -978,7 +978,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( else if(istype(W, /obj/item/encryptionkey/) && opened) if(radio)//sanityyyyyy - radio.attackby(W,user)//GTFO, you have your own procs + radio.attackby__legacy__attackchain(W,user)//GTFO, you have your own procs else to_chat(user, "Unable to locate a radio.") @@ -1132,7 +1132,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( -/mob/living/silicon/robot/attacked_by(obj/item/I, mob/living/user, def_zone) +/mob/living/silicon/robot/attacked_by__legacy__attackchain(obj/item/I, mob/living/user, def_zone) if(I.force && I.damtype != STAMINA && stat != DEAD) //only sparks if real damage is dealt. spark_system.start() ..() @@ -1303,7 +1303,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( if(href_list["mod"]) var/obj/item/O = locate(href_list["mod"]) if(istype(O) && (O.loc == src)) - O.attack_self(src) + O.attack_self__legacy__attackchain(src) return 1 if(href_list["act"]) @@ -1456,7 +1456,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( var/obj/item/W = get_active_hand() if(W) - W.attack_self(src) + W.attack_self__legacy__attackchain(src) /mob/living/silicon/robot/proc/SetLockdown(state = TRUE) // They stay locked down if their wire is cut. diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 922bc893b0d47..4387f96dabd6f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -415,7 +415,7 @@ process_chamber() //Cannot manually remove syringes -/obj/item/gun/syringemalf/attack_self(mob/living/user) +/obj/item/gun/syringemalf/attack_self__legacy__attackchain(mob/living/user) return //Load syringe into the chamber @@ -601,7 +601,7 @@ attack_verb = list("smashed", "slammed", "whacked", "thwacked", "swept") force = 20 -/obj/item/malfbroom/attack(mob/target, mob/user) +/obj/item/malfbroom/attack__legacy__attackchain(mob/target, mob/user) if(!ishuman(target)) return ..() var/mob/living/carbon/human/H = target diff --git a/code/modules/mob/living/silicon/robot/syndicate_robot.dm b/code/modules/mob/living/silicon/robot/syndicate_robot.dm index d88415375b6e4..35215d7f23621 100644 --- a/code/modules/mob/living/silicon/robot/syndicate_robot.dm +++ b/code/modules/mob/living/silicon/robot/syndicate_robot.dm @@ -111,9 +111,9 @@ if(!cham_proj) to_chat(src, "Error : No chameleon projector system found.") return - cham_proj.attack_self(src) + cham_proj.attack_self__legacy__attackchain(src) -/mob/living/silicon/robot/syndicate/saboteur/attackby() +/mob/living/silicon/robot/syndicate/saboteur/attackby__legacy__attackchain() if(cham_proj) cham_proj.disrupt(src) ..() diff --git a/code/modules/mob/living/silicon/silicon_mob.dm b/code/modules/mob/living/silicon/silicon_mob.dm index 157e2fea9dd4a..feb6cc0a63848 100644 --- a/code/modules/mob/living/silicon/silicon_mob.dm +++ b/code/modules/mob/living/silicon/silicon_mob.dm @@ -280,7 +280,7 @@ return 2 -/mob/living/silicon/attacked_by(obj/item/I, mob/living/user, def_zone) +/mob/living/silicon/attacked_by__legacy__attackchain(obj/item/I, mob/living/user, def_zone) if(istype(I, /obj/item/clothing/head) && user.a_intent == INTENT_HELP) place_on_head(user.get_active_hand(), user) return TRUE diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 9df8ebb79c92d..d99ec190c8339 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/attackby(obj/item/O, mob/living/user) +/mob/living/simple_animal/attackby__legacy__attackchain(obj/item/O, mob/living/user) if(can_collar && istype(O, /obj/item/petcollar) && !pcollar) add_collar(O, user) return diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index f3c2996519022..f110db49ec455 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -395,7 +395,7 @@ /mob/living/simple_animal/bot/proc/interact(mob/user) show_controls(user) -/mob/living/simple_animal/bot/attackby(obj/item/W, mob/user, params) +/mob/living/simple_animal/bot/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) if(allowed(user) && !open && !emagged) locked = !locked diff --git a/code/modules/mob/living/simple_animal/bot/bot_construction.dm b/code/modules/mob/living/simple_animal/bot/bot_construction.dm index 3974ef55abedf..d7c307eb3301b 100644 --- a/code/modules/mob/living/simple_animal/bot/bot_construction.dm +++ b/code/modules/mob/living/simple_animal/bot/bot_construction.dm @@ -14,7 +14,7 @@ var/created_name = "Cleanbot" var/robot_arm = /obj/item/robot_parts/l_arm -/obj/item/bucket_sensor/attackby(obj/item/W, mob/user as mob, params) +/obj/item/bucket_sensor/attackby__legacy__attackchain(obj/item/W, mob/user as mob, params) ..() if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) if(!user.unEquip(W)) @@ -49,7 +49,7 @@ var/lasercolor = "" var/new_name = "" -/obj/item/ed209_assembly/attackby(obj/item/W, mob/user, params) +/obj/item/ed209_assembly/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(is_pen(W)) @@ -248,7 +248,7 @@ desc = "It's a toolbox with tiles sticking out the top and a sensor attached." icon_state = "toolbox_tiles_sensor" -/obj/item/storage/toolbox/attackby(obj/item/stack/tile/plasteel/T, mob/user, params) +/obj/item/storage/toolbox/attackby__legacy__attackchain(obj/item/stack/tile/plasteel/T, mob/user, params) if(!istype(T, /obj/item/stack/tile/plasteel)) ..() return @@ -289,7 +289,7 @@ /obj/item/toolbox_tiles/update_icon_state() icon_state = "[toolbox_color]toolbox_tiles" -/obj/item/toolbox_tiles/attackby(obj/item/W, mob/user, params) +/obj/item/toolbox_tiles/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(isprox(W)) qdel(W) @@ -313,7 +313,7 @@ /obj/item/toolbox_tiles/sensor/update_icon_state() icon_state = "[toolbox_color]toolbox_tiles_sensor" -/obj/item/toolbox_tiles/sensor/attackby(obj/item/W, mob/user, params) +/obj/item/toolbox_tiles/sensor/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) qdel(W) @@ -325,7 +325,7 @@ qdel(src) //Medbot Assembly -/obj/item/storage/firstaid/attackby(obj/item/I, mob/user, params) +/obj/item/storage/firstaid/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/robot_parts/l_arm) && !istype(I, /obj/item/robot_parts/r_arm)) return ..() else @@ -383,7 +383,7 @@ if(build_step > 0) . += "na_scanner" -/obj/item/firstaid_arm_assembly/attackby(obj/item/I, mob/user, params) +/obj/item/firstaid_arm_assembly/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() if(is_pen(I)) var/t = rename_interactive(user, I, prompt = "Enter new robot name") @@ -442,7 +442,7 @@ var/build_step = 0 var/robot_arm = /obj/item/robot_parts/l_arm -/obj/item/clothing/head/helmet/attackby(obj/item/assembly/signaler/S, mob/user, params) +/obj/item/clothing/head/helmet/attackby__legacy__attackchain(obj/item/assembly/signaler/S, mob/user, params) ..() if(!issignaler(S)) ..() @@ -459,7 +459,7 @@ qdel(src) -/obj/item/secbot_assembly/attackby(obj/item/I, mob/user, params) +/obj/item/secbot_assembly/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() if(I.tool_behaviour == TOOL_WELDER && I.use_tool(src, user, volume = I.tool_volume)) if(!build_step) @@ -564,7 +564,7 @@ var/build_step = 0 var/toy_step = 0 -/obj/item/griefsky_assembly/attackby(obj/item/I, mob/user, params) +/obj/item/griefsky_assembly/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() if((istype(I, /obj/item/melee/energy/sword)) && (build_step < 3)) if(!user.unEquip(I)) @@ -612,7 +612,7 @@ return TRUE //Honkbot Assembly -/obj/item/storage/box/clown/attackby(obj/item/W, mob/user, params) +/obj/item/storage/box/clown/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(!istype(W, /obj/item/robot_parts/l_arm) && !istype(W, /obj/item/robot_parts/r_arm)) return ..() else @@ -640,7 +640,7 @@ var/created_name = "Honkbot" //To preserve the name if it's a unique medbot I guess var/robot_arm = /obj/item/robot_parts/l_arm -/obj/item/honkbot_arm_assembly/attackby(obj/item/W, mob/user, params) +/obj/item/honkbot_arm_assembly/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(build_step == 0) if(istype(W, /obj/item/assembly/prox_sensor)) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 5c44404782ee5..f9ed81612f1e7 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -88,7 +88,7 @@ text_dehack = "[name]'s software has been reset!" text_dehack_fail = "[name] does not seem to respond to your repair code!" -/mob/living/simple_animal/bot/cleanbot/attackby(obj/item/W, mob/user, params) +/mob/living/simple_animal/bot/cleanbot/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda)) if(allowed(user) && !open && !emagged) locked = !locked diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 105fe7d83944c..ec63bdb27f426 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -184,7 +184,7 @@ retaliate(H) return ..() -/mob/living/simple_animal/bot/ed209/attackby(obj/item/W, mob/user, params) +/mob/living/simple_animal/bot/ed209/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(W.force && !target && W.damtype != STAMINA) retaliate(user) diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index d1deee6abc414..20b1ec93929f3 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -133,7 +133,7 @@ if("ejectpai") ejectpai() -/mob/living/simple_animal/bot/floorbot/attackby(obj/item/W , mob/user, params) +/mob/living/simple_animal/bot/floorbot/attackby__legacy__attackchain(obj/item/W , mob/user, params) if(istype(W, /obj/item/stack/tile/plasteel)) var/obj/item/stack/tile/plasteel/T = W if(amount >= MAX_AMOUNT) diff --git a/code/modules/mob/living/simple_animal/bot/griefsky.dm b/code/modules/mob/living/simple_animal/bot/griefsky.dm index f91168748fead..e2e0296b7f80c 100644 --- a/code/modules/mob/living/simple_animal/bot/griefsky.dm +++ b/code/modules/mob/living/simple_animal/bot/griefsky.dm @@ -222,7 +222,7 @@ return return ..() -/mob/living/simple_animal/bot/secbot/griefsky/attackby(obj/item/W, mob/user, params) //cant touch or attack him while spinning +/mob/living/simple_animal/bot/secbot/griefsky/attackby__legacy__attackchain(obj/item/W, mob/user, params) //cant touch or attack him while spinning if(src.icon_state == spin_icon) if(prob(block_chance_melee)) user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 5112d7e626814..d7736b24c2081 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -112,7 +112,7 @@ addtimer(CALLBACK(src, PROC_REF(react_buzz)), 5) return ..() -/mob/living/simple_animal/bot/honkbot/attackby(obj/item/W, mob/user, params) +/mob/living/simple_animal/bot/honkbot/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry. return diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index d3245101d07c5..91d39972eeb4a 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -236,7 +236,7 @@ reagent_glass.forceMove(get_turf(src)) reagent_glass = null -/mob/living/simple_animal/bot/medbot/attackby(obj/item/W, mob/user, params) +/mob/living/simple_animal/bot/medbot/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/glass)) . = TRUE //no afterattack if(locked) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 80904841ab2eb..ad9eca0a77871 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -100,7 +100,7 @@ ..() reached_target = 0 -/mob/living/simple_animal/bot/mulebot/attackby(obj/item/I, mob/user, params) +/mob/living/simple_animal/bot/mulebot/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I,/obj/item/stock_parts/cell) && open && !cell) if(!user.drop_item()) return diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 0a9f94f34f3f0..e0c34eb5c94f7 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -192,7 +192,7 @@ retaliate(H) return ..() -/mob/living/simple_animal/bot/secbot/attackby(obj/item/W, mob/user, params) +/mob/living/simple_animal/bot/secbot/attackby__legacy__attackchain(obj/item/W, mob/user, params) ..() if(W.force && !target && W.damtype != STAMINA) retaliate(user) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index a5f8d3deab569..bbd7799283489 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -115,7 +115,7 @@ /mob/living/simple_animal/pet/dog/corgi/RangedAttack(atom/A, params) if(inventory_back) - inventory_back.afterattack(A, src) + inventory_back.afterattack__legacy__attackchain(A, src) /mob/living/simple_animal/pet/dog/corgi/UnarmedAttack(atom/A) if(istype(inventory_back, /obj/item/extinguisher)) @@ -184,7 +184,7 @@ armorval += inventory_back.armor.getRating(type) return armorval * 0.5 -/mob/living/simple_animal/pet/dog/corgi/attackby(obj/item/O, mob/user, params) +/mob/living/simple_animal/pet/dog/corgi/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/razor)) if(shaved) to_chat(user, "You can't shave this corgi, it's already been shaved!") diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 32aace078b5a4..e981995f26dc0 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -73,7 +73,7 @@ if(stat == CONSCIOUS) eat_plants() -/mob/living/simple_animal/hostile/retaliate/goat/attackby(obj/item/O as obj, mob/user as mob, params) +/mob/living/simple_animal/hostile/retaliate/goat/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) udder.milkAnimal(O, user) else @@ -146,7 +146,7 @@ QDEL_NULL(udder) return ..() -/mob/living/simple_animal/cow/attackby(obj/item/O, mob/user, params) +/mob/living/simple_animal/cow/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) udder.milkAnimal(O, user) return TRUE @@ -314,7 +314,7 @@ GLOBAL_VAR_INIT(chicken_count, 0) return GLOB.chicken_count -= 1 -/mob/living/simple_animal/chicken/attackby(obj/item/O, mob/user, params) +/mob/living/simple_animal/chicken/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, food_type)) //feedin' dem chickens if(stat == CONSCIOUS && eggsleft < 8) var/feedmsg = "[user] feeds [O] to [name]! [pick(feedMessages)]" diff --git a/code/modules/mob/living/simple_animal/friendly/nian_caterpillar.dm b/code/modules/mob/living/simple_animal/friendly/nian_caterpillar.dm index 31cc4310a2384..ebffde91bd8db 100644 --- a/code/modules/mob/living/simple_animal/friendly/nian_caterpillar.dm +++ b/code/modules/mob/living/simple_animal/friendly/nian_caterpillar.dm @@ -124,7 +124,7 @@ else get_scooped(M) -/mob/living/simple_animal/nian_caterpillar/attacked_by(obj/item/I, mob/living/user, def_zone) +/mob/living/simple_animal/nian_caterpillar/attacked_by__legacy__attackchain(obj/item/I, mob/living/user, def_zone) if(istype(I, /obj/item/melee/flyswatter) && I.force) gib() // Commit die. else diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index 3454ff0468017..3fe1738f7f2a5 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -7,7 +7,7 @@ speed = 0 // same speed as a person. hud_type = /datum/hud/corgi -/mob/living/simple_animal/pet/attackby(obj/item/O, mob/user, params) +/mob/living/simple_animal/pet/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(!istype(O, /obj/item/newspaper)) return ..() var/obj/item/newspaper/paper = O diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index 863b98e530c97..2b1c3ecc76c42 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -46,7 +46,7 @@ eject_brain() return ..() -/mob/living/simple_animal/spiderbot/attackby(obj/item/O, mob/living/user, params) +/mob/living/simple_animal/spiderbot/attackby__legacy__attackchain(obj/item/O, mob/living/user, params) if(istype(O, /obj/item/mmi)) var/obj/item/mmi/B = O if(mmi) //There's already a brain in it. diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index dcbcc16ba39c8..db719c53f01bb 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -286,7 +286,7 @@ var/mob/living/simple_animal/hostile/poison/bees/queen/queen -/obj/item/queen_bee/attackby(obj/item/I, mob/user, params) +/obj/item/queen_bee/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/reagent_containers/syringe)) return ..() var/obj/item/reagent_containers/syringe/S = I diff --git a/code/modules/mob/living/simple_animal/hostile/hellhound.dm b/code/modules/mob/living/simple_animal/hostile/hellhound.dm index 559e9f7fd5bba..d87fbc58aa057 100644 --- a/code/modules/mob/living/simple_animal/hostile/hellhound.dm +++ b/code/modules/mob/living/simple_animal/hostile/hellhound.dm @@ -92,7 +92,7 @@ return TRUE return FALSE -/mob/living/simple_animal/hostile/hellhound/attackby(obj/item/C, mob/user, params) +/mob/living/simple_animal/hostile/hellhound/attackby__legacy__attackchain(obj/item/C, mob/user, params) . = ..() if(target && isliving(target)) var/mob/living/L = target diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index ecf791c723cbb..04cce099cb2fc 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -115,7 +115,7 @@ Move(get_step(src, chosen_dir)) face_atom(target) //Looks better if they keep looking at you when dodging -/mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user) +/mob/living/simple_animal/hostile/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client && user) FindTarget(list(user), 1) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm index 07def89e33008..9dbac40967d7d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm @@ -344,7 +344,7 @@ Difficulty: Hard if(P.damage) disable_shield() -/mob/living/simple_animal/hostile/megafauna/ancient_robot/attacked_by(obj/item/I, mob/living/user) +/mob/living/simple_animal/hostile/megafauna/ancient_robot/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) if(!body_shield_enabled) return ..() do_sparks(2, 1, src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 400e87cc01d0f..3ef8d70604be0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -116,7 +116,7 @@ Difficulty: Medium force = 6 force_on = 10 -/obj/item/melee/energy/cleaving_saw/miner/attack(mob/living/target, mob/living/carbon/human/user) +/obj/item/melee/energy/cleaving_saw/miner/attack__legacy__attackchain(mob/living/target, mob/living/carbon/human/user) target.add_stun_absorption("miner", 10, INFINITY) ..() target.remove_stun_absorption("miner") 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 943b86921906e..59d2e4b3e86ec 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -784,7 +784,7 @@ Difficulty: Hard /obj/effect/hierophant/ex_act() return -/obj/effect/hierophant/attackby(obj/item/I, mob/user, params) +/obj/effect/hierophant/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/hierophant_club)) var/obj/item/hierophant_club/H = I if(H.timer > world.time) diff --git a/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm index 7f780f02737c1..229d8c8e0a69f 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm @@ -297,7 +297,7 @@ While using this makes the system rely on OnFire, it still gives options for tim var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(mychild)) H.color = "#FF0000" -/obj/structure/elite_tumor/attackby(obj/item/attacking_item, mob/user, params) +/obj/structure/elite_tumor/attackby__legacy__attackchain(obj/item/attacking_item, mob/user, params) . = ..() if(istype(attacking_item, /obj/item/organ/internal/regenerative_core) && activity == TUMOR_INACTIVE && !boosted) var/obj/item/organ/internal/regenerative_core/core = attacking_item @@ -425,7 +425,7 @@ While using this makes the system rely on OnFire, it still gives options for tim throw_speed = 3 throw_range = 5 -/obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/tumor_shard/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag) . = ..() if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag) var/mob/living/simple_animal/hostile/asteroid/elite/E = target diff --git a/code/modules/mob/living/simple_animal/hostile/mining/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining/elites/goliath_broodmother.dm index c2bfa29476cbd..204e21a3c66cf 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/elites/goliath_broodmother.dm @@ -263,7 +263,7 @@ if(prob(bonus_value) && target.stat != DEAD) new /obj/effect/temp_visual/goliath_tentacle/broodmother/patch(get_turf(target), user) -/obj/item/crusher_trophy/broodmother_tongue/attack_self(mob/user) +/obj/item/crusher_trophy/broodmother_tongue/attack_self__legacy__attackchain(mob/user) if(!isliving(user)) return var/mob/living/living_user = user diff --git a/code/modules/mob/living/simple_animal/hostile/mining/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining/elites/legionnaire.dm index cf8b65a09d9c1..037ab6c2551f8 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/elites/legionnaire.dm @@ -337,7 +337,7 @@ A.friends += user A.faction = user.faction.Copy() -/obj/item/crusher_trophy/legionnaire_spine/attack_self(mob/user) +/obj/item/crusher_trophy/legionnaire_spine/attack_self__legacy__attackchain(mob/user) if(!isliving(user)) return var/mob/living/LivingUser = user diff --git a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm index a4283dd927aaa..8152bc5e4fd65 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm @@ -39,9 +39,9 @@ animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch = 100) - wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/organ/internal/eyes, - /obj/item/organ/internal/heart, /obj/item/organ/internal/lungs, - /obj/item/organ/internal/liver, /obj/item/organ/internal/kidneys, + wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/organ/internal/eyes, + /obj/item/organ/internal/heart, /obj/item/organ/internal/lungs, + /obj/item/organ/internal/liver, /obj/item/organ/internal/kidneys, /obj/item/organ/internal/appendix) var/obj/item/udder/gutlunch/udder = null @@ -58,7 +58,7 @@ if(udder.reagents.total_volume == udder.reagents.maximum_volume) add_overlay("gl_full") -/mob/living/simple_animal/hostile/asteroid/gutlunch/attackby(obj/item/O, mob/user, params) +/mob/living/simple_animal/hostile/asteroid/gutlunch/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(stat == CONSCIOUS && istype(O, /obj/item/reagent_containers/glass)) udder.milkAnimal(O, user) regenerate_icons() diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 5a49fc3311436..2bb2f7ece42f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -151,7 +151,7 @@ src.visible_message("[src] was bruised!") bruised = 1 -/mob/living/simple_animal/hostile/mushroom/attackby(obj/item/I as obj, mob/user as mob, params) +/mob/living/simple_animal/hostile/mushroom/attackby__legacy__attackchain(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/food/grown/mushroom)) if(stat == DEAD && !recovery_cooldown) Recover() diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate_mobs.dm b/code/modules/mob/living/simple_animal/hostile/syndicate_mobs.dm index 3021c468cbd6a..b982c5168b522 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate_mobs.dm @@ -60,7 +60,7 @@ var/melee_block_chance = 20 var/ranged_block_chance = 35 -/mob/living/simple_animal/hostile/syndicate/melee/attackby(obj/item/O as obj, mob/user as mob, params) +/mob/living/simple_animal/hostile/syndicate/melee/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) if(O.force) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index edc9434b2e920..1d4cd2ecaf82d 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -167,7 +167,7 @@ return //Mobs with objects -/mob/living/simple_animal/parrot/attackby(obj/item/O, mob/user, params) +/mob/living/simple_animal/parrot/attackby__legacy__attackchain(obj/item/O, mob/user, params) ..() if(stat == CONSCIOUS && !client && !istype(O, /obj/item/stack/medical)) if(O.force) diff --git a/code/modules/mob/living/simple_animal/posessed_object.dm b/code/modules/mob/living/simple_animal/posessed_object.dm index 7505d6ec02e2d..e0680fdc37d3c 100644 --- a/code/modules/mob/living/simple_animal/posessed_object.dm +++ b/code/modules/mob/living/simple_animal/posessed_object.dm @@ -144,7 +144,7 @@ name = spirit_name if(A == src) // If we're clicking ourself we should not attack ourself. - possessed_item.attack_self(src) + possessed_item.attack_self__legacy__attackchain(src) else ..() @@ -173,7 +173,7 @@ set_opacity(possessed_item.opacity) return ..(NONE) -/mob/living/simple_animal/possessed_object/attackby(obj/item/O, mob/living/user) +/mob/living/simple_animal/possessed_object/attackby__legacy__attackchain(obj/item/O, mob/living/user) . = ..() if(istype(O, /obj/item/nullrod)) visible_message("[O] dispels the spooky aura!") diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 61cd634b258c6..7bc00e3cf489f 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -33,7 +33,7 @@ initial_traits = list(TRAIT_FLYING, TRAIT_SHOCKIMMUNE) var/holy = FALSE -/mob/living/simple_animal/shade/attackby(obj/item/O, mob/user) //Marker -Agouri +/mob/living/simple_animal/shade/attackby__legacy__attackchain(obj/item/O, mob/user) //Marker -Agouri if(istype(O, /obj/item/soulstone)) var/obj/item/soulstone/SS = O SS.transfer_soul("SHADE", src, user) diff --git a/code/modules/mob/living/simple_animal/slime/slime_mob.dm b/code/modules/mob/living/simple_animal/slime/slime_mob.dm index 08682a4717ad2..ce0a5d3087ace 100644 --- a/code/modules/mob/living/simple_animal/slime/slime_mob.dm +++ b/code/modules/mob/living/simple_animal/slime/slime_mob.dm @@ -353,7 +353,7 @@ -/mob/living/simple_animal/slime/attackby(obj/item/I, mob/living/user, params) +/mob/living/simple_animal/slime/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(stat == DEAD && length(surgeries)) if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM) for(var/datum/surgery/S in surgeries) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 64d4aad8058ac..b1a145c43906f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -701,12 +701,18 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ if(hand) var/obj/item/W = l_hand if(W) - W.attack_self(src) + if(W.new_attack_chain) + W.activate_self(src) + else + W.attack_self__legacy__attackchain(src) update_inv_l_hand() else var/obj/item/W = r_hand if(W) - W.attack_self(src) + if(W.new_attack_chain) + W.activate_self(src) + else + W.attack_self__legacy__attackchain(src) update_inv_r_hand() return diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 793850891d852..99cf29d37794d 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -247,7 +247,7 @@ adjust_position() -/obj/item/grab/attack_self(mob/user) +/obj/item/grab/attack_self__legacy__attackchain(mob/user) s_click(hud) //Updating pixelshift, position and direction @@ -370,7 +370,7 @@ return 1 -/obj/item/grab/attack(mob/living/M, mob/living/carbon/user) +/obj/item/grab/attack__legacy__attackchain(mob/living/M, mob/living/carbon/user) if(!affecting) return diff --git a/code/modules/mob/mob_holder.dm b/code/modules/mob/mob_holder.dm index f99b8229166eb..18290c6cecb02 100644 --- a/code/modules/mob/mob_holder.dm +++ b/code/modules/mob/mob_holder.dm @@ -25,9 +25,9 @@ qdel(src) -/obj/item/holder/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/holder/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) for(var/mob/M in src.contents) - M.attackby(W,user, params) + M.attackby__legacy__attackchain(W,user, params) /obj/item/holder/proc/show_message(message, m_type, chat_message_type) for(var/mob/living/M in contents) diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index e74d76e3a35da..059495b3c001c 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -126,7 +126,7 @@ display_text = "All it's missing is external plating..." . += "[display_text]" -/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, params) +/obj/item/mod/construction/shell/attackby__legacy__attackchain(obj/item/part, mob/user, params) . = ..() switch(construction_step) if(START_STEP) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index d0da24d5ac154..21b9618c2d48c 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -352,7 +352,7 @@ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE -/obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params) +/obj/item/mod/control/attackby__legacy__attackchain(obj/item/attacking_item, mob/living/user, params) if(istype(attacking_item, /obj/item/mod/module)) if(!open) to_chat(user, "Open the cover first!") @@ -399,7 +399,7 @@ else if(istype(attacking_item, /obj/item/mod/skin_applier)) return ..() else if(bag && istype(attacking_item)) - bag.attackby(attacking_item, user, params) + bag.attackby__legacy__attackchain(attacking_item, user, params) return ..() diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index 40d9abe1a3a4e..be25414c8afce 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -213,13 +213,13 @@ if(cell) to_chat(user, "Cell already installed!") playsound(mod, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return COMPONENT_NO_AFTERATTACK + return COMPONENT_SKIP_AFTERATTACK user.drop_item() install_cell(attacking_item) to_chat(user, "You install the cell.") playsound(mod, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) mod.update_charge_alert() - return COMPONENT_NO_AFTERATTACK + return COMPONENT_SKIP_AFTERATTACK return NONE /obj/item/mod/core/standard/proc/on_wearer_set(datum/source, mob/user) @@ -252,7 +252,7 @@ /// Associated list of charge sources, only stacks allowed. var/list/charger_list = list(/obj/item/stack/ore/plasma, /obj/item/stack/sheet/mineral/plasma) -/obj/item/mod/core/plasma/attackby(obj/item/attacking_item, mob/user, params) +/obj/item/mod/core/plasma/attackby__legacy__attackchain(obj/item/attacking_item, mob/user, params) if(charge_plasma(attacking_item, user)) return TRUE return ..() diff --git a/code/modules/mod/modules/_modules.dm b/code/modules/mod/modules/_modules.dm index 1d9bb25290d0c..20384feb6d857 100644 --- a/code/modules/mod/modules/_modules.dm +++ b/code/modules/mod/modules/_modules.dm @@ -398,7 +398,7 @@ return FALSE return TRUE -/obj/item/mod/module/anomaly_locked/attackby(obj/item/item, mob/living/user, params) +/obj/item/mod/module/anomaly_locked/attackby__legacy__attackchain(obj/item/item, mob/living/user, params) if(item.type in accepted_anomalies) if(core) to_chat(user, "A core is already installed!") diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm index c99b4989b09d5..020e048bf0353 100644 --- a/code/modules/mod/modules/module_pathfinder.dm +++ b/code/modules/mod/modules/module_pathfinder.dm @@ -31,7 +31,7 @@ else . += "The implant is missing." -/obj/item/mod/module/pathfinder/attack(mob/living/target, mob/living/user, params) +/obj/item/mod/module/pathfinder/attack__legacy__attackchain(mob/living/target, mob/living/user, params) if(!ishuman(target) || !implant) return if(!do_after(user, 1.5 SECONDS, target = target)) diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index 909cb209e5048..f33db48aa27f2 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -287,7 +287,7 @@ RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, PROC_REF(unstealth)) RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act)) - RegisterSignals(mod.wearer, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW), PROC_REF(unstealth)) + RegisterSignals(mod.wearer, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_ATTACK_BY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW), PROC_REF(unstealth)) mod.wearer.set_alpha_tracking(stealth_alpha, src, update_alpha = FALSE) animate(mod.wearer, alpha = mod.wearer.get_alpha(), time = 1.5 SECONDS) drain_power(use_power_cost) @@ -298,7 +298,7 @@ return if(bumpoff) UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) - UnregisterSignal(mod.wearer, list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW)) + UnregisterSignal(mod.wearer, list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_ATTACK_BY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW)) mod.wearer.set_alpha_tracking(ALPHA_VISIBLE, src, update_alpha = FALSE) animate(mod.wearer, alpha = mod.wearer.get_alpha(), time = 1.5 SECONDS) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index e5abb7c873a29..230f9d1634114 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -188,7 +188,7 @@ var/metal_synthesis_charge = 5 COOLDOWN_DECLARE(nanofrost_cooldown) -/obj/item/extinguisher/mini/mod/attack_self(mob/user) +/obj/item/extinguisher/mini/mod/attack_self__legacy__attackchain(mob/user) switch(nozzle_mode) if(EXTINGUISHER) nozzle_mode = NANOFROST @@ -220,7 +220,7 @@ if(METAL_FOAM) . += "[src] is currently set to metal foam mode." -/obj/item/extinguisher/mini/mod/afterattack(atom/target, mob/user) +/obj/item/extinguisher/mini/mod/afterattack__legacy__attackchain(atom/target, mob/user) var/is_adjacent = user.Adjacent(target) if(is_adjacent && AttemptRefill(target, user)) return diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 75a43d02571ba..c15c5ccf9ad2e 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -122,7 +122,7 @@ desc = "A high-power stamp, able to switch between accept and deny mode when used." flags = NODROP -/obj/item/stamp/mod/attack_self(mob/user, modifiers) +/obj/item/stamp/mod/attack_self__legacy__attackchain(mob/user, modifiers) . = ..() if(icon_state == "stamp-ok") icon_state = "stamp-deny" diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 865cf356faa80..b8e627f434a15 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -66,7 +66,7 @@ if(!.) return var/obj/item/grenade/mirage/grenade = . - grenade.attack_self(mod.wearer) + grenade.attack_self__legacy__attackchain(mod.wearer) /obj/item/grenade/mirage name = "mirage grenade" @@ -81,7 +81,7 @@ thrower = null return ..() -/obj/item/grenade/mirage/attack_self(mob/user) +/obj/item/grenade/mirage/attack_self__legacy__attackchain(mob/user) . = ..() thrower = user @@ -191,7 +191,7 @@ playsound(src, 'sound/machines/click.ogg', 100, TRUE) drain_power(use_power_cost) var/obj/item/grenade/grenade = dispensed - grenade.attack_self(mod.wearer) + grenade.attack_self__legacy__attackchain(mod.wearer) return grenade /obj/item/mod/module/anomaly_locked/firewall/prebuilt @@ -245,7 +245,7 @@ playsound(src, 'sound/machines/click.ogg', 100, TRUE) drain_power(use_power_cost) var/obj/item/grenade/grenade = dispensed - grenade.attack_self(mod.wearer) + grenade.attack_self__legacy__attackchain(mod.wearer) return grenade /obj/item/mod/module/anomaly_locked/cryogrenade/prebuilt @@ -270,7 +270,7 @@ thrower = null return ..() -/obj/item/grenade/cryogrenade_mod/attack_self(mob/user) +/obj/item/grenade/cryogrenade_mod/attack_self__legacy__attackchain(mob/user) . = ..() thrower = user @@ -304,4 +304,4 @@ var/obj/item/grenade/smokebomb/grenade = ..() if(!grenade) return - grenade.attack_self(mod.wearer) + grenade.attack_self__legacy__attackchain(mod.wearer) diff --git a/code/modules/newscaster/obj/newspaper.dm b/code/modules/newscaster/obj/newspaper.dm index 16bf3a4538ea8..bc142f6cb63cf 100644 --- a/code/modules/newscaster/obj/newspaper.dm +++ b/code/modules/newscaster/obj/newspaper.dm @@ -37,7 +37,7 @@ if(!news_content) news_content = list() -/obj/item/newspaper/attack_self(mob/user) +/obj/item/newspaper/attack_self__legacy__attackchain(mob/user) if(rolled) to_chat(user, "Unroll it first!") return @@ -153,9 +153,9 @@ curr_page-- playsound(loc, "pageturn", 50, TRUE) if(loc == M) - attack_self(M) + attack_self__legacy__attackchain(M) -/obj/item/newspaper/attackby(obj/item/W, mob/user, params) +/obj/item/newspaper/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(is_pen(W)) if(rolled) to_chat(user, "Unroll it first!") @@ -170,7 +170,7 @@ scribble = s user.visible_message("[user] scribbles something on [src].",\ "You scribble on page number [curr_page] of [src].") - attack_self(user) + attack_self__legacy__attackchain(user) return return ..() diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index e160887fe6ff1..a6b64a4c73b7c 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -12,11 +12,11 @@ var/datum/effect_system/spark_spread/spark_system -/obj/item/katana/energy/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) +/obj/item/katana/energy/attack__legacy__attackchain(mob/living/carbon/M as mob, mob/living/carbon/user as mob) playsound(user, 'sound/weapons/blade1.ogg', 50, TRUE, -1) return ..() -/obj/item/katana/energy/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/katana/energy/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, click_parameters) if(!user || !target) return diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 620fb395ddf35..e40303fdc711b 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -94,7 +94,7 @@ break . += "clipboard_over" -/obj/item/clipboard/attackby(obj/item/W, mob/user) +/obj/item/clipboard/attackby__legacy__attackchain(obj/item/W, mob/user) if(isPaperwork(W)) //If it's a photo, paper bundle, or piece of paper, place it on the clipboard. user.unEquip(W) W.forceMove(src) @@ -109,14 +109,14 @@ return if(!Adjacent(user) || user.incapacitated()) return - toppaper.attackby(W, user) + toppaper.attackby__legacy__attackchain(W, user) else if(istype(W, /obj/item/stamp) && toppaper) //We can stamp the topmost piece of paper - toppaper.attackby(W, user) + toppaper.attackby__legacy__attackchain(W, user) update_icon() else return ..() -/obj/item/clipboard/attack_self(mob/user) +/obj/item/clipboard/attack_self__legacy__attackchain(mob/user) showClipboard(user) /obj/item/clipboard/Topic(href, href_list) @@ -142,7 +142,7 @@ if(!isPaperwork(P)) return if(is_pen(I) && isPaperwork(P) != PHOTO) //Because you can't write on photos that aren't in your hand - P.attackby(I, usr) + P.attackby__legacy__attackchain(I, usr) else if(isPaperwork(P) == PAPERWORK) //Why can't these be subtypes of paper P.examine(usr) else if(isPaperwork(P) == PHOTO) diff --git a/code/modules/paperwork/desk_bell.dm b/code/modules/paperwork/desk_bell.dm index 65a7d075eb455..485d36f6bce2b 100644 --- a/code/modules/paperwork/desk_bell.dm +++ b/code/modules/paperwork/desk_bell.dm @@ -34,7 +34,7 @@ attached_signaler = null return ..() -/obj/item/desk_bell/attackby(obj/item/I, mob/user, params) +/obj/item/desk_bell/attackby__legacy__attackchain(obj/item/I, mob/user, params) // can only attach its on your person if(istype(I, /obj/item/assembly/signaler)) if(!in_inventory) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 0188fcbb5b602..bcf5c8118a811 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -90,7 +90,7 @@ GLOBAL_LIST_EMPTY(fax_blacklist) /obj/machinery/photocopier/faxmachine/attack_ghost(mob/user) ui_interact(user) -/obj/machinery/photocopier/faxmachine/attackby(obj/item/item, mob/user, params) +/obj/machinery/photocopier/faxmachine/attackby__legacy__attackchain(obj/item/item, mob/user, params) if(istype(item,/obj/item/card/id) && !scan) scan(item) else if(istype(item, /obj/item/paper) || istype(item, /obj/item/photo) || istype(item, /obj/item/paper_bundle)) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 215803c13d019..0579fa3a8e32f 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -44,7 +44,7 @@ I.loc = src -/obj/structure/filingcabinet/attackby(obj/item/O, mob/user, params) +/obj/structure/filingcabinet/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(insert(O, user)) return if(user.a_intent != INTENT_HARM) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 556208bbc3fe7..62a244fe57374 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -34,7 +34,7 @@ if(length(contents)) . += "folder_paper" -/obj/item/folder/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/folder/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo) || istype(W, /obj/item/paper_bundle) || istype(W, /obj/item/documents)) user.drop_item() W.loc = src @@ -45,7 +45,7 @@ else return ..() -/obj/item/folder/attack_self(mob/user as mob) +/obj/item/folder/attack_self__legacy__attackchain(mob/user as mob) var/dat = {"[name]"} for(var/obj/item/paper/P in src) @@ -85,11 +85,11 @@ else if(href_list["browse"]) var/obj/item/paper_bundle/P = locate(href_list["browse"]) if(P && (P.loc == src) && istype(P)) - P.attack_self(usr) + P.attack_self__legacy__attackchain(usr) onclose(usr, "[P.name]") //Update everything - attack_self(usr) + attack_self__legacy__attackchain(usr) update_icon(UPDATE_OVERLAYS) return diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 72fae016821bd..6e6a50806b3db 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -12,7 +12,7 @@ var/labels_left = 30 var/mode = LABEL_MODE_OFF -/obj/item/hand_labeler/afterattack(atom/A, mob/user, proximity) +/obj/item/hand_labeler/afterattack__legacy__attackchain(atom/A, mob/user, proximity) if(!proximity) return if(mode == LABEL_MODE_OFF) //if it's off, give up. @@ -48,7 +48,7 @@ playsound(A, 'sound/items/handling/component_pickup.ogg', 20, TRUE) labels_left-- -/obj/item/hand_labeler/attack_self(mob/user as mob) +/obj/item/hand_labeler/attack_self__legacy__attackchain(mob/user as mob) // off -> normal // normal or goal -> off mode = !mode @@ -65,7 +65,7 @@ else to_chat(user, "You turn off \the [src].") -/obj/item/hand_labeler/attackby(obj/item/I, mob/user, params) +/obj/item/hand_labeler/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/hand_labeler_refill)) to_chat(user, "You insert [I] into [src].") user.drop_item() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 8a66a3b1f4911..69252548e7d09 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -127,7 +127,7 @@ desc = initial(desc) add_fingerprint(user) -/obj/item/paper/attack_self(mob/living/user as mob) +/obj/item/paper/attack_self__legacy__attackchain(mob/living/user as mob) user.examinate(src) if(rigged && (SSholiday.holidays && SSholiday.holidays[APRIL_FOOLS])) if(!spam_flag) @@ -149,7 +149,7 @@ else show_content(user, forcestars = 1) -/obj/item/paper/attack(mob/living/carbon/M, mob/living/carbon/user, def_zone) +/obj/item/paper/attack__legacy__attackchain(mob/living/carbon/M, mob/living/carbon/user, def_zone) if(!ishuman(M)) return ..() var/mob/living/carbon/human/H = M @@ -391,7 +391,7 @@ var/input_element = input("Enter what you want to write:", "Write") as message topic_href_write(id, input_element) -/obj/item/paper/attackby(obj/item/P, mob/living/user, params) +/obj/item/paper/attackby__legacy__attackchain(obj/item/P, mob/living/user, params) ..() if(resistance_flags & ON_FIRE) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 4bd0eef2f6a25..188b50fbaa395 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -23,7 +23,7 @@ new /obj/item/paper(src) amount += 1 -/obj/item/paper_bundle/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/paper_bundle/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) ..() var/obj/item/paper/P if(istype(W, /obj/item/paper)) @@ -73,7 +73,7 @@ if(is_pen(W) || istype(W, /obj/item/toy/crayon)) usr << browse("", "window=PaperBundle[UID()]") //Closes the dialog P = get_page() - P.attackby(W, user, params) + P.attackby__legacy__attackchain(W, user, params) update_icon() @@ -133,7 +133,7 @@ + "[P.scribble ? "

Written on the back:
[P.scribble]" : ""]"\ + "", "window=PaperBundle[UID()]") -/obj/item/paper_bundle/attack_self(mob/user as mob) +/obj/item/paper_bundle/attack_self__legacy__attackchain(mob/user as mob) show_content(user) add_fingerprint(usr) @@ -189,7 +189,7 @@ else to_chat(usr, "You need to hold it in your hands to change pages.") if(ismob(loc)) - attack_self(loc) + attack_self__legacy__attackchain(loc) /obj/item/paper_bundle/AltClick(mob/user) if(in_range(user, src) && !user.incapacitated()) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 9da49f25804af..d24d85240dcb0 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -106,7 +106,7 @@ return -/obj/item/paper_bin/attackby(obj/item/paper/i as obj, mob/user as mob, params) +/obj/item/paper_bin/attackby__legacy__attackchain(obj/item/paper/i as obj, mob/user as mob, params) if(istype(i)) user.drop_item() i.loc = src diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index e894c699d41fe..b401745e5883c 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -51,7 +51,7 @@ var/obj/item/stamp = S . += "paperplane_[initial(stamp.icon_state)]" -/obj/item/paperplane/attack_self(mob/user) // Unfold the paper plane +/obj/item/paperplane/attack_self__legacy__attackchain(mob/user) // Unfold the paper plane to_chat(user, "You unfold [src].") if(internal_paper) internal_paper.forceMove(get_turf(src)) @@ -59,7 +59,7 @@ internal_paper = null qdel(src) -/obj/item/paperplane/attackby(obj/item/P, mob/living/carbon/human/user, params) +/obj/item/paperplane/attackby__legacy__attackchain(obj/item/P, mob/living/carbon/human/user, params) ..() if(is_pen(P) || istype(P, /obj/item/toy/crayon)) @@ -67,7 +67,7 @@ return else if(istype(P, /obj/item/stamp)) //we don't randomize stamps on a paperplane - internal_paper.attackby(P, user) //spoofed attack to update internal paper. + internal_paper.attackby__legacy__attackchain(P, user) //spoofed attack to update internal paper. update_icon() else if(P.get_heat()) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 0021507a6f148..a02cdf3c4eb25 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -74,7 +74,7 @@ playsound(loc, 'sound/effects/pop.ogg', 50, 1) update_icon() -/obj/item/pen/multi/attack_self(mob/living/user as mob) +/obj/item/pen/multi/attack_self__legacy__attackchain(mob/living/user as mob) select_colour(user) /obj/item/pen/multi/update_overlays() @@ -146,7 +146,7 @@ origin_tech = "engineering=4;syndicate=2" var/transfer_amount = 50 -/obj/item/pen/sleepy/attack(mob/living/M, mob/user) +/obj/item/pen/sleepy/attack__legacy__attackchain(mob/living/M, mob/user) if(!istype(M)) return @@ -216,7 +216,7 @@ armour_penetration_flat = 20 throw_speed = 4 -/obj/item/pen/edagger/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/pen/edagger/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) if(cigarette_lighter_act(user, M)) return @@ -270,7 +270,7 @@ /obj/item/pen/edagger/get_clamped_volume() //So the parent proc of attack isn't the loudest sound known to man return FALSE -/obj/item/pen/edagger/attack_self(mob/living/user) +/obj/item/pen/edagger/attack_self__legacy__attackchain(mob/living/user) if(active) active = FALSE force = initial(force) @@ -314,7 +314,7 @@ /obj/item/pen/multi/poison var/current_poison = null -/obj/item/pen/multi/poison/attack_self(mob/living/user) +/obj/item/pen/multi/poison/attack_self__legacy__attackchain(mob/living/user) . = ..() switch(colour) if("black") @@ -343,7 +343,7 @@ /obj/item/pen/chameleon var/forge_name -/obj/item/pen/chameleon/attack_self(mob/living/user) +/obj/item/pen/chameleon/attack_self__legacy__attackchain(mob/user) if(!iscarbon(user)) return diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index a13b8c3d12df4..e27d43b7b0fb8 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -477,7 +477,7 @@ use_power(active_power_consumption) COOLDOWN_START(src, copying_cooldown, PHOTOCOPIER_DELAY) -/obj/machinery/photocopier/attackby(obj/item/O, mob/user, params) +/obj/machinery/photocopier/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/paper) || istype(O, /obj/item/photo) || istype(O, /obj/item/paper_bundle)) if(!copyitem) user.drop_item() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 42a3cb531e71e..2d20a77d90374 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -36,10 +36,10 @@ var/icon/tiny var/photo_size = 3 -/obj/item/photo/attack_self(mob/user as mob) +/obj/item/photo/attack_self__legacy__attackchain(mob/user as mob) user.examinate(src) -/obj/item/photo/attackby(obj/item/P as obj, mob/user as mob, params) +/obj/item/photo/attackby__legacy__attackchain(obj/item/P as obj, mob/user as mob, params) if(is_pen(P) || istype(P, /obj/item/toy/crayon)) var/txt = tgui_input_text(user, "What would you like to write on the back?", "Photo Writing") if(!txt) @@ -230,10 +230,10 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor size = nsize to_chat(user, "Camera will now take [size]x[size] photos.") -/obj/item/camera/attack(mob/living/carbon/human/M as mob, mob/user as mob) +/obj/item/camera/attack__legacy__attackchain(mob/living/carbon/human/M as mob, mob/user as mob) return -/obj/item/camera/attack_self(mob/user) +/obj/item/camera/attack_self__legacy__attackchain(mob/user) if(on_cooldown) to_chat(user, "[src] is still on cooldown!") return @@ -244,7 +244,7 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor icon_state = icon_off to_chat(user, "You switch the camera [on ? "on" : "off"].") -/obj/item/camera/attackby(obj/item/I as obj, mob/user as mob, params) +/obj/item/camera/attackby__legacy__attackchain(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/camera_film)) if(pictures_left) to_chat(user, "[src] still has some film in it!") @@ -364,7 +364,7 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." return mob_detail -/obj/item/camera/afterattack(atom/target, mob/user, flag) +/obj/item/camera/afterattack__legacy__attackchain(atom/target, mob/user, flag) if(!on || !pictures_left || ismob(target.loc)) return captureimage(target, user, flag) @@ -495,7 +495,7 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor . += "Alt-Shift-Click [src] to print a specific photo." . += "Ctrl-Shift-Click [src] to delete a specific photo." -/obj/item/camera/digital/afterattack(atom/target, mob/user, flag) +/obj/item/camera/digital/afterattack__legacy__attackchain(atom/target, mob/user, flag) if(!on || !pictures_left || ismob(target.loc)) return @@ -598,7 +598,7 @@ GLOBAL_LIST_INIT(SpookyGhosts, list("ghost","shade","shade2","ghost-narsie","hor TV.update_icon(UPDATE_OVERLAYS) video_cooldown = world.time + CAMERA_STATE_COOLDOWN -/obj/item/videocam/attack_self(mob/user) +/obj/item/videocam/attack_self__legacy__attackchain(mob/user) if(world.time < video_cooldown) to_chat(user, "[src] is overheating, give it some time.") return diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index 83ecda42f0881..b6b3fd5cf404f 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -118,7 +118,7 @@ maptext_x = 8 maptext = "[ticket_number]" -/obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, params) +/obj/machinery/ticket_machine/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/hand_labeler_refill)) if(!(ticket_number >= max_number)) to_chat(user, "[src] refuses [I]! There [max_number-ticket_number==1 ? "is" : "are"] still [max_number-ticket_number] ticket\s left!") @@ -213,7 +213,7 @@ . = ..() maptext = saved_maptext //For some reason, storage code removes all maptext off objs, this stops its number from being wiped off when taken out of storage. -/obj/item/ticket_machine_ticket/attackby(obj/item/P, mob/living/carbon/human/user, params) //Stolen from papercode +/obj/item/ticket_machine_ticket/attackby__legacy__attackchain(obj/item/P, mob/living/carbon/human/user, params) //Stolen from papercode ..() if(P.get_heat()) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10)) diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index e3f2c06cb397f..01594e14e3699 100644 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -108,9 +108,9 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/pda/MouseDrop(obj/over_object as obj, src_location, over_location) var/mob/M = usr if((!is_screen_atom(over_object)) && can_use()) - return attack_self(M) + return attack_self__legacy__attackchain(M) -/obj/item/pda/attack_self(mob/user as mob) +/obj/item/pda/attack_self__legacy__attackchain(mob/user as mob) if(active_uplink_check(user)) return ui_interact(user) @@ -244,7 +244,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(wearing_human.wear_id == src) wearing_human.sec_hud_set_ID() -/obj/item/pda/attackby(obj/item/C, mob/user, params) +/obj/item/pda/attackby__legacy__attackchain(obj/item/C, mob/user, params) ..() if(istype(C, /obj/item/cartridge) && !cartridge) cartridge = C @@ -309,11 +309,11 @@ GLOBAL_LIST_EMPTY(PDAs) UnregisterSignal(held_pen, COMSIG_PARENT_QDELETING) held_pen = null -/obj/item/pda/attack(mob/living/C as mob, mob/living/user as mob) +/obj/item/pda/attack__legacy__attackchain(mob/living/C as mob, mob/living/user as mob) if(iscarbon(C) && scanmode) scanmode.scan_mob(C, user) -/obj/item/pda/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) +/obj/item/pda/afterattack__legacy__attackchain(atom/A as mob|obj|turf|area, mob/user as mob, proximity) if(proximity && scanmode) scanmode.scan_atom(A, user) diff --git a/code/modules/pda/ai_pda.dm b/code/modules/pda/ai_pda.dm index e6c603aa18780..d93fa0e1b8e52 100644 --- a/code/modules/pda/ai_pda.dm +++ b/code/modules/pda/ai_pda.dm @@ -68,7 +68,7 @@ silent = !silent to_chat(usr, "PDA ringer toggled [(silent ? "Off" : "On")]!") -/obj/item/pda/silicon/attack_self(mob/user as mob) +/obj/item/pda/silicon/attack_self__legacy__attackchain(mob/user as mob) if((honkamt > 0) && (prob(60)))//For clown virus. honkamt-- playsound(loc, 'sound/items/bikehorn.ogg', 30, 1) diff --git a/code/modules/pda/core_apps.dm b/code/modules/pda/core_apps.dm index a45c9653c4588..fabff30eac985 100644 --- a/code/modules/pda/core_apps.dm +++ b/code/modules/pda/core_apps.dm @@ -39,7 +39,7 @@ else switch(text2num(params["option"])) if(1) // Configure pAI device - pda.pai.attack_self(usr) + pda.pai.attack_self__legacy__attackchain(usr) if(2) // Eject pAI device var/turf/T = get_turf(pda.loc) if(T) diff --git a/code/modules/power/apc/apc.dm b/code/modules/power/apc/apc.dm index f818ad845c98a..6552d232ce6b9 100644 --- a/code/modules/power/apc/apc.dm +++ b/code/modules/power/apc/apc.dm @@ -238,7 +238,7 @@ . += "An APC can be emagged to unlock it, this will keep it in it's refresh state, making very obvious something is wrong." //attack with an item - open/close cover, insert cell, or (un)lock interface -/obj/machinery/power/apc/attackby(obj/item/W, mob/living/user, params) +/obj/machinery/power/apc/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) if(issilicon(user) && get_dist(src, user) > 1) return attack_hand(user) diff --git a/code/modules/power/cables/cable.dm b/code/modules/power/cables/cable.dm index eff1525f01b84..e46b052f0a3fe 100644 --- a/code/modules/power/cables/cable.dm +++ b/code/modules/power/cables/cable.dm @@ -83,7 +83,7 @@ By design, d1 is the smallest direction and d2 is the highest // - Cable coil : merge cables // - Multitool : get the power currently passing through the cable // -/obj/structure/cable/attackby(obj/item/W, mob/user) +/obj/structure/cable/attackby__legacy__attackchain(obj/item/W, mob/user) var/turf/T = get_turf(src) if(T.transparent_floor || T.intact) to_chat(user, "You can't interact with something that's under the floor!") diff --git a/code/modules/power/cables/cable_coil.dm b/code/modules/power/cables/cable_coil.dm index 9b651bb913353..9f5ec33fc4e5c 100644 --- a/code/modules/power/cables/cable_coil.dm +++ b/code/modules/power/cables/cable_coil.dm @@ -77,7 +77,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain . += "A coil of power cables." //you can use wires to heal robotics -/obj/item/stack/cable_coil/attack(mob/M, mob/user) +/obj/item/stack/cable_coil/attack__legacy__attackchain(mob/M, mob/user) if(!ishuman(M)) return ..() var/mob/living/carbon/human/H = M @@ -134,7 +134,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain // Items usable on a cable coil : // - Wirecutters : cut them duh ! // - Cable coil : merge cables -/obj/item/stack/cable_coil/attackby(obj/item/W, mob/user) +/obj/item/stack/cable_coil/attackby__legacy__attackchain(obj/item/W, mob/user) . = ..() if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W @@ -398,7 +398,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe/cable_restrain /obj/item/stack/cable_coil/cyborg/update_icon_state() return // icon_state should always be a full cable -/obj/item/stack/cable_coil/cyborg/attack_self(mob/user) +/obj/item/stack/cable_coil/cyborg/attack_self__legacy__attackchain(mob/user) var/cablecolor = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white") color = cablecolor update_icon() diff --git a/code/modules/power/cables/terminal.dm b/code/modules/power/cables/terminal.dm index b48bd9362c2b8..c459f7864ead6 100644 --- a/code/modules/power/cables/terminal.dm +++ b/code/modules/power/cables/terminal.dm @@ -77,7 +77,7 @@ qdel(src) -/obj/machinery/power/terminal/attackby(obj/item/W, mob/living/user, params) +/obj/machinery/power/terminal/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/wirecutters)) dismantle(user, W) else diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index c9f94b1663b17..d9f9b545fc6c1 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -105,7 +105,7 @@ to_chat(viewers(user), "[user] is licking the electrodes of [src]! It looks like [user.p_theyre()] trying to commit suicide!") return FIRELOSS -/obj/item/stock_parts/cell/attackby(obj/item/W, mob/user, params) +/obj/item/stock_parts/cell/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/S = W diff --git a/code/modules/power/engines/singularity/collector.dm b/code/modules/power/engines/singularity/collector.dm index 4631406508cb5..4dd7d9110cbe0 100644 --- a/code/modules/power/engines/singularity/collector.dm +++ b/code/modules/power/engines/singularity/collector.dm @@ -66,7 +66,7 @@ disconnect_from_network() -/obj/machinery/power/rad_collector/attackby(obj/item/I, mob/user, params) +/obj/machinery/power/rad_collector/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/tank/internals/plasma)) if(!anchored) to_chat(user, "[src] needs to be secured to the floor first.") diff --git a/code/modules/power/engines/singularity/containment_field.dm b/code/modules/power/engines/singularity/containment_field.dm index 0c8f67e9c62c3..f1af0eeb29145 100644 --- a/code/modules/power/engines/singularity/containment_field.dm +++ b/code/modules/power/engines/singularity/containment_field.dm @@ -28,7 +28,7 @@ shock_field(user) return 1 -/obj/machinery/field/containment/attackby(obj/item/W, mob/user, params) +/obj/machinery/field/containment/attackby__legacy__attackchain(obj/item/W, mob/user, params) shock(user) return TRUE diff --git a/code/modules/power/engines/singularity/emitter.dm b/code/modules/power/engines/singularity/emitter.dm index cac7fa7fa89a8..1e1af0ed3ecb3 100644 --- a/code/modules/power/engines/singularity/emitter.dm +++ b/code/modules/power/engines/singularity/emitter.dm @@ -146,7 +146,7 @@ if(!anchored) step(src, get_dir(M, src)) -/obj/machinery/power/emitter/attackby(obj/item/I, mob/user, params) +/obj/machinery/power/emitter/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/card/id) && !istype(I, /obj/item/pda)) return ..() diff --git a/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm index 3269f4f87d820..a64c70fd53623 100644 --- a/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/engines/singularity/particle_accelerator/particle_accelerator.dm @@ -164,7 +164,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return 1 return 0 -/obj/structure/particle_accelerator/attackby(obj/item/W, mob/user, params) +/obj/structure/particle_accelerator/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(!iscoil(W)) return ..() if(construction_state == ACCELERATOR_WRENCHED) @@ -241,7 +241,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return dir = turn(dir, 270) -/obj/machinery/particle_accelerator/attackby(obj/item/W, mob/user, params) +/obj/machinery/particle_accelerator/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(!iscoil(W)) return ..() if(construction_state == ACCELERATOR_WRENCHED) diff --git a/code/modules/power/engines/singularity/singularity.dm b/code/modules/power/engines/singularity/singularity.dm index a043f9999fb6a..7dd13a29701d3 100644 --- a/code/modules/power/engines/singularity/singularity.dm +++ b/code/modules/power/engines/singularity/singularity.dm @@ -82,7 +82,7 @@ /obj/singularity/attack_animal(mob/user) consume(user) -/obj/singularity/attackby(obj/item/W, mob/user, params) +/obj/singularity/attackby__legacy__attackchain(obj/item/W, mob/user, params) consume(user) return 1 diff --git a/code/modules/power/engines/supermatter/supermatter.dm b/code/modules/power/engines/supermatter/supermatter.dm index 8e2c20709c0ae..f9a4c20c9fc85 100644 --- a/code/modules/power/engines/supermatter/supermatter.dm +++ b/code/modules/power/engines/supermatter/supermatter.dm @@ -776,7 +776,7 @@ playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, TRUE) Consume(nom) -/obj/machinery/atmospherics/supermatter_crystal/attackby(obj/item/I, mob/living/user, params) +/obj/machinery/atmospherics/supermatter_crystal/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) if(!istype(I) || (I.flags & ABSTRACT) || !istype(user)) return if(moveable && default_unfasten_wrench(user, I, time = 20)) diff --git a/code/modules/power/engines/tesla/coil.dm b/code/modules/power/engines/tesla/coil.dm index 15b5120a33ab1..93078385b0bcc 100644 --- a/code/modules/power/engines/tesla/coil.dm +++ b/code/modules/power/engines/tesla/coil.dm @@ -43,7 +43,7 @@ if(in_range(user, src) || isobserver(user)) . += "The status display reads: Power generation at [input_power_multiplier*100]%.
Shock interval at [zap_cooldown*0.1] seconds.
" -/obj/machinery/power/tesla_coil/attackby(obj/item/W, mob/user, params) +/obj/machinery/power/tesla_coil/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/assembly/signaler) && panel_open) wires.Interact(user) else @@ -129,7 +129,7 @@ component_parts += new /obj/item/stock_parts/capacitor(null) RefreshParts() -/obj/machinery/power/grounding_rod/attackby(obj/item/W, mob/user, params) +/obj/machinery/power/grounding_rod/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(exchange_parts(user, W)) return diff --git a/code/modules/power/generators/portable generators/pacman.dm b/code/modules/power/generators/portable generators/pacman.dm index 8111f4dd2702e..f350c7bf8a118 100644 --- a/code/modules/power/generators/portable generators/pacman.dm +++ b/code/modules/power/generators/portable generators/pacman.dm @@ -191,7 +191,7 @@ emagged = TRUE return TRUE -/obj/machinery/power/port_gen/pacman/attackby(obj/item/O as obj, mob/user as mob) +/obj/machinery/power/port_gen/pacman/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob) 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/generators/solar.dm b/code/modules/power/generators/solar.dm index 0c29dfbcec4e4..3f68c097ab96d 100644 --- a/code/modules/power/generators/solar.dm +++ b/code/modules/power/generators/solar.dm @@ -209,7 +209,7 @@ if(anchored) .+= "The solar assembly needs glass to be completed." -/obj/item/solar_assembly/attackby(obj/item/W, mob/user, params) +/obj/item/solar_assembly/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(anchored || !isturf(loc)) if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass)) diff --git a/code/modules/power/generators/treadmill.dm b/code/modules/power/generators/treadmill.dm index efaf83b4af245..6a6f68b8b5bd5 100644 --- a/code/modules/power/generators/treadmill.dm +++ b/code/modules/power/generators/treadmill.dm @@ -96,7 +96,7 @@ spawn(100) stat &= ~BROKEN -/obj/machinery/power/treadmill/attackby(obj/item/W, mob/user) +/obj/machinery/power/treadmill/attackby__legacy__attackchain(obj/item/W, mob/user) if(default_unfasten_wrench(user, W, time = 60)) if(anchored) connect_to_network() diff --git a/code/modules/power/generators/turbine.dm b/code/modules/power/generators/turbine.dm index 57bf68eed7388..0b15beb5fbc6e 100644 --- a/code/modules/power/generators/turbine.dm +++ b/code/modules/power/generators/turbine.dm @@ -126,7 +126,7 @@ E += M.rating efficiency = E / 6 -/obj/machinery/power/compressor/attackby(obj/item/I, mob/user, params) +/obj/machinery/power/compressor/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(default_change_direction_wrench(user, I)) turbine = null inturf = get_step(src, dir) @@ -328,7 +328,7 @@ return . += image(icon, "turb-o", FLY_LAYER) -/obj/machinery/power/turbine/attackby(obj/item/I, mob/user, params) +/obj/machinery/power/turbine/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I)) return diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index b56a3151cdcac..7a21e52a42b78 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -152,7 +152,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) update_icon() // Step 2 -/obj/machinery/gravity_generator/main/attackby(obj/item/I, mob/user, params) +/obj/machinery/gravity_generator/main/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(construction_state != GRAV_NEEDS_PLASTEEL) return ..() if(istype(I, /obj/item/stack/sheet/plasteel)) diff --git a/code/modules/power/lights.dm b/code/modules/power/lights.dm index efbb8c1c7cb77..eae1c664e1c4c 100644 --- a/code/modules/power/lights.dm +++ b/code/modules/power/lights.dm @@ -96,7 +96,7 @@ transfer_fingerprints_to(newlight) qdel(src) -/obj/machinery/light_construct/attackby(obj/item/W, mob/living/user, params) +/obj/machinery/light_construct/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) add_fingerprint(user) if(istype(W, /obj/item/stack/cable_coil)) if(stage != LIGHT_CONSTRUCT_EMPTY_FRAME) @@ -591,7 +591,7 @@ // attack with item - insert light (if right type), otherwise try to break the light -/obj/machinery/light/attackby(obj/item/W, mob/living/user, params) +/obj/machinery/light/attackby__legacy__attackchain(obj/item/W, mob/living/user, params) user.changeNext_move(CLICK_CD_MELEE) // This is an ugly hack and I hate it forever //Light replacer code if(istype(W, /obj/item/lightreplacer)) @@ -710,7 +710,7 @@ transfer_fingerprints_to(newlight) qdel(src) -/obj/machinery/light/attacked_by(obj/item/I, mob/living/user) +/obj/machinery/light/attacked_by__legacy__attackchain(obj/item/I, mob/living/user) ..() if(status == LIGHT_BROKEN || status == LIGHT_EMPTY) if(on && (I.flags & CONDUCT)) @@ -1075,7 +1075,7 @@ // attack bulb/tube with object // if a syringe, can inject plasma to make it explode. Light replacers eat them. -/obj/item/light/attackby(obj/item/I, mob/user, params) +/obj/item/light/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/S = I @@ -1096,11 +1096,11 @@ else // If it's not a syringe return ..() -/obj/item/light/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/light/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) ..() shatter() -/obj/item/light/attack_obj(obj/O, mob/living/user, params) +/obj/item/light/attack_obj__legacy__attackchain(obj/O, mob/living/user, params) ..() shatter() diff --git a/code/modules/power/power_machine.dm b/code/modules/power/power_machine.dm index a4a329b833eb0..4f3903da067af 100644 --- a/code/modules/power/power_machine.dm +++ b/code/modules/power/power_machine.dm @@ -76,7 +76,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/I, mob/user, params) +/obj/machinery/power/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = I var/turf/T = user.loc diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index decfac1f1a0d5..fd247fe44eafc 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -102,7 +102,7 @@ if(charge_level > 0) . += "smes-og[charge_level]" -/obj/machinery/power/smes/attackby(obj/item/I, mob/user, params) +/obj/machinery/power/smes/attackby__legacy__attackchain(obj/item/I, mob/user, params) // Opening using screwdriver if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", initial(icon_state), I)) update_icon() diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 18435e4dd15b1..5d04ea7009c68 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -49,7 +49,7 @@ BB = new projectile_type(src, params) return -/obj/item/ammo_casing/attackby(obj/item/I as obj, mob/user as mob, params) +/obj/item/ammo_casing/attackby__legacy__attackchain(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/ammo_box)) var/obj/item/ammo_box/box = I if(box.slow_loading) @@ -192,7 +192,7 @@ /obj/item/ammo_box/proc/can_load(mob/user) return 1 -/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = 0, replace_spent = 0) +/obj/item/ammo_box/attackby__legacy__attackchain(obj/item/A, mob/user, params, silent = 0, replace_spent = 0) var/num_loaded = 0 if(!can_load(user)) return @@ -220,7 +220,7 @@ return num_loaded -/obj/item/ammo_box/attack_self(mob/user as mob) +/obj/item/ammo_box/attack_self__legacy__attackchain(mob/user as mob) var/obj/item/ammo_casing/A = get_round() if(A) user.put_in_hands(A) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index f8b17ff619688..3ff42fbc314e1 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -282,7 +282,7 @@ ..() create_reagents(30) -/obj/item/ammo_casing/shotgun/dart/attackby() +/obj/item/ammo_casing/shotgun/dart/attackby__legacy__attackchain() return /obj/item/ammo_casing/shotgun/dart/bioterror @@ -411,7 +411,7 @@ if(BB) BB.icon_state = initial(BB.icon_state) -/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params) +/obj/item/ammo_casing/caseless/foam_dart/attackby__legacy__attackchain(obj/item/A, mob/user, params) ..() var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB if((is_pen(A)) && modified && !FD.pen) @@ -440,7 +440,7 @@ FD.damage = 5 FD.nodamage = FALSE -/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user) +/obj/item/ammo_casing/caseless/foam_dart/attack_self__legacy__attackchain(mob/living/user) var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB if(FD.pen) FD.damage = initial(FD.damage) diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 0b4aa1d82842e..1a02c79f3552c 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -281,7 +281,7 @@ /// There are two reloading processes ongoing so cancel them var/double_loaded = FALSE -/obj/item/ammo_box/magazine/wt550m9/attackby(obj/item/A, mob/user, params) +/obj/item/ammo_box/magazine/wt550m9/attackby__legacy__attackchain(obj/item/A, mob/user, params) if(istype(A, /obj/item/ammo_casing)) var/obj/item/ammo_casing/AC = A if(give_round(AC)) @@ -625,10 +625,10 @@ . = ..() . += "There is [charge_percent()]% charge left!" -/obj/item/ammo_box/magazine/detective/speedcharger/attack_self() +/obj/item/ammo_box/magazine/detective/speedcharger/attack_self__legacy__attackchain() return -/obj/item/ammo_box/magazine/detective/speedcharger/attackby() +/obj/item/ammo_box/magazine/detective/speedcharger/attackby__legacy__attackchain() return /obj/item/ammo_box/magazine/c_foam @@ -638,5 +638,5 @@ ammo_type = /obj/item/ammo_casing/caseless/c_foam max_ammo = 12 -/obj/item/ammo_box/magazine/c_foam/attack_self(mob/user) +/obj/item/ammo_box/magazine/c_foam/attack_self__legacy__attackchain(mob/user) return diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index c0d5882cc8153..af858679316be 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -174,7 +174,7 @@ for(var/obj/O in contents) O.emp_act(severity) -/obj/item/gun/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/gun/afterattack__legacy__attackchain(atom/target, mob/living/user, flag, params) if(firing_burst) return if(SEND_SIGNAL(src, COMSIG_GUN_TRY_FIRE, user, target, flag, params) & COMPONENT_CANCEL_GUN_FIRE) @@ -330,21 +330,21 @@ user.update_inv_r_hand() SSblackbox.record_feedback("tally", "gun_fired", 1, type) -/obj/item/gun/attack(mob/M, mob/user) +/obj/item/gun/attack__legacy__attackchain(mob/M, mob/user) if(user.a_intent == INTENT_HARM) //Flogging if(bayonet) - M.attackby(bayonet, user) + M.attackby__legacy__attackchain(bayonet, user) else return ..() -/obj/item/gun/attack_obj(obj/O, mob/user, params) +/obj/item/gun/attack_obj__legacy__attackchain(obj/O, mob/user, params) if(user.a_intent == INTENT_HARM) if(bayonet) - O.attackby(bayonet, user) + O.attackby__legacy__attackchain(bayonet, user) return return ..() -/obj/item/gun/attackby(obj/item/I, mob/user, params) +/obj/item/gun/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/flashlight/seclite)) var/obj/item/flashlight/seclite/S = I if(can_flashlight) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index a5a8f66f95374..c00fbdaa20427 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -36,7 +36,7 @@ . += "There is a [M.name] mod installed, using [M.cost]% capacity." . += "You can use a crowbar on it to remove it's installed mod kits." -/obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user) +/obj/item/gun/energy/kinetic_accelerator/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/borg/upgrade/modkit) && max_mod_capacity) var/obj/item/borg/upgrade/modkit/MK = I MK.install(src, user) @@ -305,7 +305,7 @@ if(in_range(user, src)) . += "Occupies [cost]% of mod capacity." -/obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user) +/obj/item/borg/upgrade/modkit/attackby__legacy__attackchain(obj/item/A, mob/user) if(istype(A, /obj/item/gun/energy/kinetic_accelerator) && !issilicon(user)) var/obj/item/gun/energy/kinetic_accelerator/KA = A if(KA.max_mod_capacity) @@ -657,5 +657,5 @@ name = "adjustable tracer bolts" desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color." -/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user) +/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self__legacy__attackchain(mob/user) bolt_color = tgui_input_color(user, "Please select a tracer color", "PKA Tracer Color", bolt_color) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index f65ba7ddba880..07d38c92ee764 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -248,7 +248,7 @@ select_fire(user) user.remove_status_effect(STATUS_EFFECT_LWAPSCOPE) -/obj/item/gun/energy/lwap/attack_self() +/obj/item/gun/energy/lwap/attack_self__legacy__attackchain() return //no manual ammo changing. /obj/item/ammo_casing/energy/laser/sniper diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 557a23fd42598..bf5c510f9cd78 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -115,7 +115,7 @@ cell_type = /obj/item/stock_parts/cell/infinite ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse) -/obj/item/gun/energy/pulse/destroyer/attack_self(mob/living/user) +/obj/item/gun/energy/pulse/destroyer/attack_self__legacy__attackchain(mob/living/user) to_chat(user, "[src] is now set to DESTROY.") ////////////////////////////// @@ -126,7 +126,7 @@ desc = "A pulse rifle fitted with a heavy duty prism, spreading a cone of destruction in front of the user. The fire selector has three settings, and they are all 'ANNIHILATE'." ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter/pulse) -/obj/item/gun/energy/pulse/destroyer/annihilator/attack_self(mob/living/user) +/obj/item/gun/energy/pulse/destroyer/annihilator/attack_self__legacy__attackchain(mob/living/user) to_chat(user, "[src] is now set to ANNIHILATE.") ////////////////////////////// diff --git a/code/modules/projectiles/guns/energy/special_eguns.dm b/code/modules/projectiles/guns/energy/special_eguns.dm index f36a39eafedb0..27032627abeda 100644 --- a/code/modules/projectiles/guns/energy/special_eguns.dm +++ b/code/modules/projectiles/guns/energy/special_eguns.dm @@ -139,7 +139,7 @@ /obj/item/gun/energy/floragun/pre_attack(atom/A, mob/living/user, params) if(istype(A, /obj/machinery/hydroponics)) // Calling afterattack from pre_attack looks stupid, but afterattack with proximity FALSE is what makes the gun fire, and we're returning FALSE to cancel the melee attack. - afterattack(A, user, FALSE, params) + afterattack__legacy__attackchain(A, user, FALSE, params) return FALSE return ..() @@ -269,7 +269,7 @@ . += "It can be reloaded using refined plasma sheets, or plasma ore obtained in the field (although the latter is less efficient). \ Plasma cutters such as these can be found in use at plasma mining operations throughout known space." -/obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user) +/obj/item/gun/energy/plasmacutter/attackby__legacy__attackchain(obj/item/A, mob/user) if(istype(A, /obj/item/stack/sheet/mineral/plasma)) if(cell.charge >= cell.maxcharge) to_chat(user,"[src] is already fully charged.") @@ -510,7 +510,7 @@ if(cell.charge <= PLASMA_DISCHARGE_LIMIT) discharge() -/obj/item/gun/energy/plasma_pistol/attack_self(mob/living/user) +/obj/item/gun/energy/plasma_pistol/attack_self__legacy__attackchain(mob/living/user) if(overloaded) to_chat(user, "[src] is already overloaded!") return @@ -656,7 +656,7 @@ it will create a finely-tuned neutralising bluespace field that protects the user from the blast wave generated by the weapon's projectile. \ However, this field will not protect the user from a second BSG, as it is tied to the energy signature of an individual gun's flux anomaly core." -/obj/item/gun/energy/bsg/attackby(obj/item/O, mob/user, params) +/obj/item/gun/energy/bsg/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/stack/ore/bluespace_crystal)) if(has_bluespace_crystal) to_chat(user, "[src] already has a bluespace crystal installed.") @@ -767,7 +767,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/gun/energy/temperature/attack_self(mob/user) +/obj/item/gun/energy/temperature/attack_self__legacy__attackchain(mob/user) add_fingerprint(user) ui_interact(user) @@ -1001,7 +1001,7 @@ user.visible_message("[user] [overcharged ? "removes" : "restores"] the safety limits on [src].", "You [overcharged ? "remove" : "restore" ] the safety limits on [src]") update_icon() -/obj/item/gun/energy/detective/attackby(obj/item/I, mob/user, params) +/obj/item/gun/energy/detective/attackby__legacy__attackchain(obj/item/I, mob/user, params) . = ..() if(!istype(I, /obj/item/ammo_box/magazine/detective/speedcharger)) return diff --git a/code/modules/projectiles/guns/energy/telegun.dm b/code/modules/projectiles/guns/energy/telegun.dm index 16078734d849b..e0f6359abfd55 100644 --- a/code/modules/projectiles/guns/energy/telegun.dm +++ b/code/modules/projectiles/guns/energy/telegun.dm @@ -14,7 +14,7 @@ teleport_target = null return ..() -/obj/item/gun/energy/telegun/attack_self(mob/living/user) +/obj/item/gun/energy/telegun/attack_self__legacy__attackchain(mob/living/user) var/list/L = list() var/list/areaindex = list() diff --git a/code/modules/projectiles/guns/energy_guns.dm b/code/modules/projectiles/guns/energy_guns.dm index 63f5852da1faf..d51cce88a8b64 100644 --- a/code/modules/projectiles/guns/energy_guns.dm +++ b/code/modules/projectiles/guns/energy_guns.dm @@ -98,7 +98,7 @@ /obj/item/gun/energy/proc/on_recharge() newshot() -/obj/item/gun/energy/attack_self(mob/living/user as mob) +/obj/item/gun/energy/attack_self__legacy__attackchain(mob/living/user as mob) if(length(ammo_type) > 1) select_fire(user) update_icon() diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm index 26e5ed6ae1870..d4e589948b2ea 100644 --- a/code/modules/projectiles/guns/grenade_launcher.dm +++ b/code/modules/projectiles/guns/grenade_launcher.dm @@ -18,7 +18,7 @@ if(get_dist(user, src) <= 2) . += "[length(grenades)] / [max_grenades] grenades." -/obj/item/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) +/obj/item/gun/grenadelauncher/attackby__legacy__attackchain(obj/item/I as obj, mob/user as mob, params) if((istype(I, /obj/item/grenade))) if(length(grenades) < max_grenades) if(!user.unEquip(I)) @@ -32,7 +32,7 @@ else return ..() -/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) +/obj/item/gun/grenadelauncher/afterattack__legacy__attackchain(obj/target, mob/user , flag) if(target == user) return diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 227ea6264d402..c542ffa00417d 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -23,7 +23,7 @@ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' //not really a gun and some toys use these inhands righthand_file = 'icons/mob/inhands/items_righthand.dmi' -/obj/item/gun/magic/afterattack(atom/target, mob/living/user, flag) +/obj/item/gun/magic/afterattack__legacy__attackchain(atom/target, mob/living/user, flag) if(no_den_usage) var/area/A = get_area(user) if(istype(A, /area/wizard_station)) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 709370ec588f3..3e3d488741da8 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -44,12 +44,12 @@ CONTENTS: icon_state = "[initial(icon_state)][charges ? "" : "-drained"]" -/obj/item/gun/magic/wand/attack(atom/target, mob/living/user) +/obj/item/gun/magic/wand/attack__legacy__attackchain(atom/target, mob/living/user) if(target == user) return ..() -/obj/item/gun/magic/wand/afterattack(atom/target, mob/living/user) +/obj/item/gun/magic/wand/afterattack__legacy__attackchain(atom/target, mob/living/user) if(!charges) shoot_with_empty_chamber(user) return @@ -192,7 +192,7 @@ CONTENTS: charges-- ..() -/obj/item/gun/magic/wand/fireball/attack(atom/target, mob/living/user) +/obj/item/gun/magic/wand/fireball/attack__legacy__attackchain(atom/target, mob/living/user) if(!iscarbon(target)) return ..() diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index 1c19cb35602c2..eb1ab9d1702a4 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -225,7 +225,7 @@ current_heat = min(current_heat + 1, max_heat) -/obj/item/gun/medbeam/damaged/attackby(obj/item/attacking_item, mob/user, params) +/obj/item/gun/medbeam/damaged/attackby__legacy__attackchain(obj/item/attacking_item, mob/user, params) . = ..() if(broken == INSTALL_CELL) diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index 44a6ca8aa933b..5dcf9c661ea7f 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -16,7 +16,7 @@ QDEL_NULL(bomb) return ..() -/obj/item/gun/blastcannon/attack_self(mob/user) +/obj/item/gun/blastcannon/attack_self__legacy__attackchain(mob/user) if(bomb) bomb.forceMove(user.loc) user.put_in_hands(bomb) @@ -45,7 +45,7 @@ else icon_state = initial(icon_state) -/obj/item/gun/blastcannon/attackby(obj/O, mob/user) +/obj/item/gun/blastcannon/attackby__legacy__attackchain(obj/O, mob/user) if(istype(O, /obj/item/transfer_valve)) var/obj/item/transfer_valve/T = O if(!T.tank_one || !T.tank_two) @@ -76,7 +76,7 @@ return 0 return (pressure / TANK_FRAGMENT_SCALE) -/obj/item/gun/blastcannon/afterattack(atom/target, mob/user, flag, params) +/obj/item/gun/blastcannon/afterattack__legacy__attackchain(atom/target, mob/user, flag, params) if((!bomb) || (!target) || (get_dist(get_turf(target), get_turf(user)) <= 2)) return ..() var/power = calculate_bomb() diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index a07ed3c001978..e02773310a259 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -32,7 +32,7 @@ if(select == 1) . += "[initial(icon_state)]burst" -/obj/item/gun/projectile/automatic/attackby(obj/item/A as obj, mob/user as mob, params) +/obj/item/gun/projectile/automatic/attackby__legacy__attackchain(obj/item/A as obj, mob/user as mob, params) . = ..() if(.) if(alarmed) // Did the empty clip alarm go off already? @@ -121,7 +121,7 @@ . = ..() update_icon() -/obj/item/gun/projectile/automatic/c20r/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) +/obj/item/gun/projectile/automatic/c20r/afterattack__legacy__attackchain(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) ..() empty_alarm() @@ -193,18 +193,18 @@ qdel(underbarrel) return ..() -/obj/item/gun/projectile/automatic/m90/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/gun/projectile/automatic/m90/afterattack__legacy__attackchain(atom/target, mob/living/user, flag, params) if(select == 2) - underbarrel.afterattack(target, user, flag, params) + underbarrel.afterattack__legacy__attackchain(target, user, flag, params) else ..() return -/obj/item/gun/projectile/automatic/m90/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/automatic/m90/attackby__legacy__attackchain(obj/item/A, mob/user, params) if(istype(A, /obj/item/ammo_casing)) if(istype(A, underbarrel.magazine.ammo_type)) - underbarrel.attack_self(user) - underbarrel.attackby(A, user, params) + underbarrel.attack_self__legacy__attackchain(user) + underbarrel.attackby__legacy__attackchain(A, user, params) else return ..() @@ -339,7 +339,7 @@ /obj/item/gun/projectile/automatic/shotgun/bulldog/update_icon_state() icon_state = "bulldog[chambered ? "" : "-e"]" -/obj/item/gun/projectile/automatic/shotgun/bulldog/attackby(obj/item/A as obj, mob/user as mob, params) +/obj/item/gun/projectile/automatic/shotgun/bulldog/attackby__legacy__attackchain(obj/item/A as obj, mob/user as mob, params) if(istype(A, /obj/item/ammo_box/magazine/m12g/xtr_lrg)) if(isstorage(loc)) // To prevent inventory exploits var/obj/item/storage/Strg = loc @@ -348,7 +348,7 @@ return return ..() -/obj/item/gun/projectile/automatic/shotgun/bulldog/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) +/obj/item/gun/projectile/automatic/shotgun/bulldog/afterattack__legacy__attackchain(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) ..() empty_alarm() diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index b6e572c87691a..b65b06a202f4b 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -28,7 +28,7 @@ ready_to_fire = FALSE update_icon() -/obj/item/gun/projectile/bow/attack_self(mob/living/user) +/obj/item/gun/projectile/bow/attack_self__legacy__attackchain(mob/living/user) if(!ready_to_fire && magazine.ammo_count()) ready_to_fire = TRUE playsound(user, draw_sound, 100, 1) @@ -37,8 +37,8 @@ ready_to_fire = FALSE update_icon() -/obj/item/gun/projectile/bow/attackby(obj/item/A, mob/user, params) - var/num_loaded = magazine.attackby(A, user, params, 1) +/obj/item/gun/projectile/bow/attackby__legacy__attackchain(obj/item/A, mob/user, params) + var/num_loaded = magazine.attackby__legacy__attackchain(A, user, params, 1) if(num_loaded) to_chat(user, "You ready \the [A] into \the [src].") update_icon() diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm index 470ff0b0c861c..6ff760fc0b925 100644 --- a/code/modules/projectiles/guns/projectile/launchers.dm +++ b/code/modules/projectiles/guns/projectile/launchers.dm @@ -11,7 +11,7 @@ w_class = WEIGHT_CLASS_NORMAL can_holster = FALSE // Not your normal revolver -/obj/item/gun/projectile/revolver/grenadelauncher/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/revolver/grenadelauncher/attackby__legacy__attackchain(obj/item/A, mob/user, params) ..() if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing)) chamber_round() @@ -29,7 +29,7 @@ icon_state = "mecha_grenadelnchr" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher/multi/fifteen -/obj/item/gun/projectile/revolver/grenadelauncher/multi/cyborg/attack_self() +/obj/item/gun/projectile/revolver/grenadelauncher/multi/cyborg/attack_self__legacy__attackchain() return /obj/item/gun/projectile/automatic/gyropistol @@ -72,14 +72,14 @@ /obj/item/gun/projectile/automatic/speargun/update_icon_state() return -/obj/item/gun/projectile/automatic/speargun/attack_self() +/obj/item/gun/projectile/automatic/speargun/attack_self__legacy__attackchain() return /obj/item/gun/projectile/automatic/speargun/process_chamber(eject_casing = 0, empty_chamber = 1) ..() -/obj/item/gun/projectile/automatic/speargun/attackby(obj/item/A, mob/user, params) - var/num_loaded = magazine.attackby(A, user, params, 1) +/obj/item/gun/projectile/automatic/speargun/attackby__legacy__attackchain(obj/item/A, mob/user, params) + var/num_loaded = magazine.attackby__legacy__attackchain(A, user, params, 1) if(num_loaded) to_chat(user, "You load [num_loaded] spear\s into \the [src].") update_icon() diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 8d3d20861eb03..8a82da356006c 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -28,20 +28,20 @@ /obj/item/gun/projectile/revolver/process_chamber() return ..(0, 1) -/obj/item/gun/projectile/revolver/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/revolver/attackby__legacy__attackchain(obj/item/A, mob/user, params) . = ..() if(istype(A, /obj/item/ammo_box/b357)) return if(.) return - var/num_loaded = magazine.attackby(A, user, params, 1) + var/num_loaded = magazine.attackby__legacy__attackchain(A, user, params, 1) if(num_loaded) to_chat(user, "You load [num_loaded] shell\s into \the [src].") A.update_icon() update_icon() chamber_round(0) -/obj/item/gun/projectile/revolver/attack_self(mob/living/user) +/obj/item/gun/projectile/revolver/attack_self__legacy__attackchain(mob/living/user) var/num_unloaded = 0 chambered = null while(get_ammo() > 0) @@ -152,16 +152,16 @@ qdel(src) return -/obj/item/gun/projectile/revolver/fingergun/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/gun/projectile/revolver/fingergun/afterattack__legacy__attackchain(atom/target, mob/living/user, flag, params) if(!user.mind.miming) to_chat(usr, "You must dedicate yourself to silence first. Use your fingers if you wish to holster them.") return ..() -/obj/item/gun/projectile/revolver/fingergun/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/revolver/fingergun/attackby__legacy__attackchain(obj/item/A, mob/user, params) return -/obj/item/gun/projectile/revolver/fingergun/attack_self(mob/living/user) +/obj/item/gun/projectile/revolver/fingergun/attack_self__legacy__attackchain(mob/living/user) to_chat(usr, "You holster your fingers. Another time.") qdel(src) return @@ -221,7 +221,7 @@ chamber_round() spun = 1 -/obj/item/gun/projectile/revolver/russian/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/revolver/russian/attackby__legacy__attackchain(obj/item/A, mob/user, params) var/num_loaded = ..() if(num_loaded) user.visible_message("[user] loads a single bullet into the revolver and spins the chamber.", "You load a single bullet into the chamber and spin it.") @@ -233,7 +233,7 @@ A.update_icon() return -/obj/item/gun/projectile/revolver/russian/attack_self(mob/user) +/obj/item/gun/projectile/revolver/russian/attack_self__legacy__attackchain(mob/user) if(!spun && can_shoot()) user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.") Spin() @@ -252,7 +252,7 @@ else to_chat(user, "[src] is empty.") -/obj/item/gun/projectile/revolver/russian/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) +/obj/item/gun/projectile/revolver/russian/afterattack__legacy__attackchain(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) if(flag) if(!(target in user.contents) && ismob(target)) if(user.a_intent == INTENT_HARM) // Flogging action @@ -350,7 +350,7 @@ options["Maple"] = "dbshotgun_l" options["Rosewood"] = "dbshotgun_p" -/obj/item/gun/projectile/revolver/doublebarrel/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/revolver/doublebarrel/attackby__legacy__attackchain(obj/item/A, mob/user, params) if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing)) chamber_round() if(!can_sawoff) @@ -370,7 +370,7 @@ . = ..() weapon_weight = WEAPON_MEDIUM -/obj/item/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user) +/obj/item/gun/projectile/revolver/doublebarrel/attack_self__legacy__attackchain(mob/living/user) var/num_unloaded = 0 while(get_ammo() > 0) @@ -435,7 +435,7 @@ unique_reskin = FALSE var/sling = FALSE -/obj/item/gun/projectile/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/revolver/doublebarrel/improvised/attackby__legacy__attackchain(obj/item/A, mob/user, params) ..() if(istype(A, /obj/item/stack/cable_coil) && !sawn_state) var/obj/item/stack/cable_coil/C = A @@ -494,7 +494,7 @@ /obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/update_overlays() return list() -/obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/attackby__legacy__attackchain(obj/item/A, mob/user, params) if(istype(A, /obj/item/stack/cable_coil)) return else diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm index 4c113421fdeb2..c8ddc466f2dac 100644 --- a/code/modules/projectiles/guns/projectile/saw.dm +++ b/code/modules/projectiles/guns/projectile/saw.dm @@ -22,7 +22,7 @@ . = ..() AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) -/obj/item/gun/projectile/automatic/l6_saw/attack_self(mob/user) +/obj/item/gun/projectile/automatic/l6_saw/attack_self__legacy__attackchain(mob/user) cover_open = !cover_open to_chat(user, "You [cover_open ? "open" : "close"] [src]'s cover.") playsound(src, cover_open ? 'sound/weapons/gun_interactions/sawopen.ogg' : 'sound/weapons/gun_interactions/sawclose.ogg', 50, 1) @@ -32,7 +32,7 @@ icon_state = "l6[cover_open ? "open" : "closed"][magazine ? CEILING(get_ammo(0)/12.5, 1)*25 : "-empty"][suppressed ? "-suppressed" : ""]" item_state = "l6[cover_open ? "openmag" : "closedmag"]" -/obj/item/gun/projectile/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) //what I tried to do here is just add a check to see if the cover is open or not and add an icon_state change because I can't figure out how c-20rs do it with overlays +/obj/item/gun/projectile/automatic/l6_saw/afterattack__legacy__attackchain(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) //what I tried to do here is just add a check to see if the cover is open or not and add an icon_state change because I can't figure out how c-20rs do it with overlays if(cover_open) to_chat(user, "[src]'s cover is open! Close it before firing!") else @@ -56,7 +56,7 @@ to_chat(user, "You remove the magazine from [src].") -/obj/item/gun/projectile/automatic/l6_saw/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/automatic/l6_saw/attackby__legacy__attackchain(obj/item/A, mob/user, params) if(istype(A, /obj/item/ammo_box/magazine)) var/obj/item/ammo_box/magazine/AM = A if(istype(AM, mag_type)) diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index e7c537fcd0404..9e259be181b01 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -28,11 +28,11 @@ /obj/item/gun/projectile/shotgun/proc/get_shotgun_info() return "After firing a shot, use this item in hand to remove the spent shell." -/obj/item/gun/projectile/shotgun/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/shotgun/attackby__legacy__attackchain(obj/item/A, mob/user, params) . = ..() if(.) return - var/num_loaded = magazine.attackby(A, user, params, 1) + var/num_loaded = magazine.attackby__legacy__attackchain(A, user, params, 1) if(num_loaded) to_chat(user, "You load [num_loaded] shell\s into \the [src]!") A.update_icon() @@ -50,7 +50,7 @@ return FALSE return chambered.BB -/obj/item/gun/projectile/shotgun/attack_self(mob/living/user) +/obj/item/gun/projectile/shotgun/attack_self__legacy__attackchain(mob/living/user) if(!COOLDOWN_FINISHED(src, pump_cooldown)) return pump(user) @@ -91,7 +91,7 @@ sawn_desc = "Come with me if you want to live." sawn_state = SAWN_INTACT -/obj/item/gun/projectile/shotgun/riot/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/shotgun/riot/attackby__legacy__attackchain(obj/item/A, mob/user, params) if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter)) sawoff(user) if(istype(A, /obj/item/melee/energy)) @@ -116,7 +116,7 @@ user.visible_message("\The [src] goes off!", "\The [src] goes off in your face!") return else - afterattack(user, user) + afterattack__legacy__attackchain(user, user) user.visible_message("[src] goes click!", "[src] you are holding goes click.") if(magazine.ammo_count()) //Spill the mag onto the floor user.visible_message("[user.name] opens [src] up and the shells go goes flying around!", "You open [src] up and the shells go goes flying everywhere!!") @@ -153,11 +153,11 @@ return if(chambered) //if the gun is chambering live ammo, shoot self, if chambering empty ammo, 'click' if(chambered.BB) - afterattack(user, user) + afterattack__legacy__attackchain(user, user) user.visible_message("\The [src] goes off!", "\The [src] goes off in your face!") return else - afterattack(user, user) + afterattack__legacy__attackchain(user, user) user.visible_message("[src] goes click!", "[src] you are holding goes click.") if(magazine.ammo_count()) //Spill the mag onto the floor user.visible_message("[user.name] opens [src] up and the shells go goes flying around!", "You open [src] up and the shells go goes flying everywhere!!") @@ -237,7 +237,7 @@ process_fire(user, user,0) . = 1 -/obj/item/gun/projectile/shotgun/boltaction/attackby(obj/item/A, mob/user, params) +/obj/item/gun/projectile/shotgun/boltaction/attackby__legacy__attackchain(obj/item/A, mob/user, params) if(!bolt_open) to_chat(user, "The bolt is closed!") return @@ -263,7 +263,7 @@ ..() guns_left = 0 -/obj/item/gun/projectile/shotgun/boltaction/enchanted/attack_self() +/obj/item/gun/projectile/shotgun/boltaction/enchanted/attack_self__legacy__attackchain() return /obj/item/gun/projectile/shotgun/boltaction/enchanted/shoot_live_shot(mob/living/user, atom/target, pointblank = FALSE, message = TRUE) @@ -355,7 +355,7 @@ QDEL_NULL(alternate_magazine) return ..() -/obj/item/gun/projectile/shotgun/automatic/dual_tube/attack_self(mob/living/user) +/obj/item/gun/projectile/shotgun/automatic/dual_tube/attack_self__legacy__attackchain(mob/living/user) if(!chambered && length(magazine.contents)) pump() else diff --git a/code/modules/projectiles/guns/projectile_gun.dm b/code/modules/projectiles/guns/projectile_gun.dm index e3797a2c35b2b..db7d318597fd4 100644 --- a/code/modules/projectiles/guns/projectile_gun.dm +++ b/code/modules/projectiles/guns/projectile_gun.dm @@ -98,7 +98,7 @@ user.update_inv_l_hand() return -/obj/item/gun/projectile/attackby(obj/item/A as obj, mob/user as mob, params) +/obj/item/gun/projectile/attackby__legacy__attackchain(obj/item/A as obj, mob/user as mob, params) if(istype(A, /obj/item/ammo_box/magazine)) var/obj/item/ammo_box/magazine/AM = A if(istype(AM, mag_type)) @@ -161,7 +161,7 @@ return ..() -/obj/item/gun/projectile/attack_self(mob/living/user as mob) +/obj/item/gun/projectile/attack_self__legacy__attackchain(mob/living/user as mob) var/obj/item/ammo_casing/AC = chambered //Find chambered round if(magazine) magazine.loc = get_turf(loc) diff --git a/code/modules/projectiles/guns/rocket.dm b/code/modules/projectiles/guns/rocket.dm index 0cb19b33b8560..b67fbe18eecef 100644 --- a/code/modules/projectiles/guns/rocket.dm +++ b/code/modules/projectiles/guns/rocket.dm @@ -26,7 +26,7 @@ . += "It is currently [chambered ? "" : "un"]loaded." -/obj/item/gun/rocketlauncher/attackby(obj/item/I, mob/user, params) +/obj/item/gun/rocketlauncher/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/ammo_casing/rocket)) return ..() if(!chambered) diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index d9a21e04070f6..7f44b91ae15c2 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -34,7 +34,7 @@ syringes.Remove(S) qdel(S) -/obj/item/gun/syringe/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/gun/syringe/afterattack__legacy__attackchain(atom/target, mob/living/user, flag, params) if(target == loc) return ..() @@ -44,7 +44,7 @@ var/num_syringes = length(syringes) + (chambered.BB ? 1 : 0) . += "Can hold [max_syringes] syringe\s. Has [num_syringes] syringe\s remaining." -/obj/item/gun/syringe/attack_self(mob/living/user) +/obj/item/gun/syringe/attack_self__legacy__attackchain(mob/living/user) if(!length(syringes) && !chambered.BB) to_chat(user, "[src] is empty.") return FALSE @@ -66,7 +66,7 @@ to_chat(user, "You unload [S] from [src]!") return TRUE -/obj/item/gun/syringe/attackby(obj/item/A, mob/user, params, show_msg = TRUE) +/obj/item/gun/syringe/attackby__legacy__attackchain(obj/item/A, mob/user, params, show_msg = TRUE) if(istype(A, /obj/item/reagent_containers/syringe)) if(istype(A, /obj/item/reagent_containers/syringe/lethal)) to_chat(user, "[A] is too big to fit into [src].") @@ -180,7 +180,7 @@ process_chamber() // Chamber the syringe if none is already return TRUE -/obj/item/gun/syringe/rapidsyringe/attackby(obj/item/A, mob/user, params, show_msg) +/obj/item/gun/syringe/rapidsyringe/attackby__legacy__attackchain(obj/item/A, mob/user, params, show_msg) if(isstorage(A)) // Boxes can be dumped in. @@ -244,7 +244,7 @@ return ..() // Allow for emptying your deathmix, or for sec to find out what you were dumping into people -/obj/item/gun/syringe/rapidsyringe/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/gun/syringe/rapidsyringe/afterattack__legacy__attackchain(atom/target, mob/living/user, flag, params) if(istype(target, /obj/item/reagent_containers)) var/obj/item/reagent_containers/destination = target @@ -328,7 +328,7 @@ qdel(S) // Unload an empty syringe, making sure its existing contents get returned to the reservoir -/obj/item/gun/syringe/rapidsyringe/attack_self(mob/living/user) +/obj/item/gun/syringe/rapidsyringe/attack_self__legacy__attackchain(mob/living/user) if(!length(syringes) && !chambered.BB) to_chat(user, "[src] is empty.") return FALSE @@ -396,7 +396,7 @@ // add a new syringe so it's technically infinite insert_single_syringe(new /obj/item/reagent_containers/syringe) -/obj/item/gun/syringe/rapidsyringe/preloaded/beaker_blaster/attack_self(mob/living/user) +/obj/item/gun/syringe/rapidsyringe/preloaded/beaker_blaster/attack_self__legacy__attackchain(mob/living/user) // no printing infinite syringes. return diff --git a/code/modules/projectiles/guns/throw.dm b/code/modules/projectiles/guns/throw.dm index 0a7a246b16bdf..61deb59015ef2 100644 --- a/code/modules/projectiles/guns/throw.dm +++ b/code/modules/projectiles/guns/throw.dm @@ -47,7 +47,7 @@ /obj/item/gun/throw/update_overlays() return list() -/obj/item/gun/throw/attackby(obj/item/I, mob/user, params) +/obj/item/gun/throw/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, valid_projectile_type) && !(I.flags & NODROP)) if(get_ammocount() < max_capacity) user.drop_item() diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm index e2b679ff6cbb7..d2e3093fe6075 100644 --- a/code/modules/projectiles/guns/throw/crossbow.dm +++ b/code/modules/projectiles/guns/throw/crossbow.dm @@ -68,7 +68,7 @@ modify_projectile(to_launch, 1) update_icon(UPDATE_ICON_STATE) -/obj/item/gun/throw/crossbow/attack_self(mob/living/user) +/obj/item/gun/throw/crossbow/attack_self__legacy__attackchain(mob/living/user) if(tension) if(to_launch) user.visible_message("[user] relaxes the tension on [src]'s string and removes [to_launch].","You relax the tension on [src]'s string and remove [to_launch].") @@ -97,7 +97,7 @@ user.visible_message("[usr] draws back the string of [src]!","[src] clunks as you draw the string to its maximum tension!!") update_icon(UPDATE_ICON_STATE) -/obj/item/gun/throw/crossbow/attackby(obj/item/I, mob/user, params) +/obj/item/gun/throw/crossbow/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/stock_parts/cell)) return ..() diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 948e667d2f87a..f23b282bfb776 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -234,7 +234,7 @@ add_fingerprint(usr) -/obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params) +/obj/machinery/chem_dispenser/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/part_replacer)) . = ..() SStgui.update_uis(src) @@ -446,7 +446,7 @@ /obj/item/handheld_chem_dispenser/get_cell() return cell -/obj/item/handheld_chem_dispenser/afterattack(obj/target, mob/user, proximity) +/obj/item/handheld_chem_dispenser/afterattack__legacy__attackchain(obj/target, mob/user, proximity) if(!proximity || !current_reagent || !amount) return @@ -470,7 +470,7 @@ if(!target.reagents.isolate_reagent(current_reagent)) to_chat(user, "You remove all but [current_reagent] from [target].") -/obj/item/handheld_chem_dispenser/attack_self(mob/user) +/obj/item/handheld_chem_dispenser/attack_self__legacy__attackchain(mob/user) if(cell) ui_interact(user) else @@ -570,7 +570,7 @@ update_icon(UPDATE_OVERLAYS) return TRUE -/obj/item/handheld_chem_dispenser/attackby(obj/item/W, mob/user, params) +/obj/item/handheld_chem_dispenser/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = W if(cell) diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index bdbad39598cbc..ecfb026025bf0 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -62,7 +62,7 @@ else stat |= NOPOWER -/obj/machinery/chem_heater/attackby(obj/item/I, mob/user) +/obj/machinery/chem_heater/attackby__legacy__attackchain(obj/item/I, mob/user) if(istype(I, /obj/item/reagent_containers/glass) && user.a_intent != INTENT_HARM) if(beaker) to_chat(user, "A beaker is already loaded into the machine.") diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 23f2dcacdb910..45f09791651af 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -114,7 +114,7 @@ return update_icon() -/obj/machinery/chem_master/attackby(obj/item/I, mob/user, params) +/obj/machinery/chem_master/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/part_replacer)) return ..() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index bf48302233965..eb622e874c4b7 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -384,7 +384,7 @@ /obj/machinery/computer/pandemic/attack_ghost(mob/user) ui_interact(user) -/obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params) +/obj/machinery/computer/pandemic/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(default_unfasten_wrench(user, I, time = 4 SECONDS)) power_change() return diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index 45eae9706d47f..77cbb7b361122 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -157,7 +157,7 @@ return default_unfasten_wrench(user, I) -/obj/machinery/reagentgrinder/attackby(obj/item/I, mob/user, params) +/obj/machinery/reagentgrinder/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/part_replacer)) ..() SStgui.update_uis(src) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 0a4f38c15c233..51733f92f80eb 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -88,7 +88,7 @@ container_type |= REFILLABLE | DRAINABLE update_icon(UPDATE_OVERLAYS) -/obj/item/reagent_containers/attack_self(mob/user) +/obj/item/reagent_containers/attack_self__legacy__attackchain(mob/user) if(has_lid) if(is_open_container()) to_chat(usr, "You put the lid on [src].") @@ -97,7 +97,7 @@ to_chat(usr, "You take the lid off [src].") remove_lid() -/obj/item/reagent_containers/attack(mob/M, mob/user, def_zone) +/obj/item/reagent_containers/attack__legacy__attackchain(mob/M, mob/user, def_zone) if(user.a_intent == INTENT_HARM) return ..() diff --git a/code/modules/reagents/reagent_containers/applicator.dm b/code/modules/reagents/reagent_containers/applicator.dm index b8b3eca0eb7ae..ade44dc8a67b5 100644 --- a/code/modules/reagents/reagent_containers/applicator.dm +++ b/code/modules/reagents/reagent_containers/applicator.dm @@ -96,10 +96,10 @@ update_icon() user.changeNext_move(CLICK_CD_MELEE) -/obj/item/reagent_containers/applicator/attack(mob/living/M, mob/user) +/obj/item/reagent_containers/applicator/attack__legacy__attackchain(mob/living/M, mob/user) return apply(M, user) -/obj/item/reagent_containers/applicator/attack_self(mob/user) +/obj/item/reagent_containers/applicator/attack_self__legacy__attackchain(mob/user) return apply(user, user) /obj/item/reagent_containers/applicator/proc/apply_to(mob/living/carbon/M, mob/user, multiplier = 1, show_message = TRUE) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 7a2e25eb4796c..11c8af8fa0cb2 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -88,7 +88,7 @@ robot.cell.use(charge_cost) total_reagents = min((total_reagents + BORGHYPO_REFILL_VALUE), maximum_reagents) -/obj/item/reagent_containers/borghypo/attack(mob/living/carbon/human/M, mob/user) +/obj/item/reagent_containers/borghypo/attack__legacy__attackchain(mob/living/carbon/human/M, mob/user) if(!total_reagents) to_chat(user, "The injector is empty.") return @@ -109,7 +109,7 @@ /obj/item/reagent_containers/borghypo/proc/get_radial_contents() return reagent_icons & reagent_ids -/obj/item/reagent_containers/borghypo/attack_self(mob/user) +/obj/item/reagent_containers/borghypo/attack_self__legacy__attackchain(mob/user) playsound(loc, 'sound/effects/pop.ogg', 50, 0) var/selected_reagent = show_radial_menu(user, src, get_radial_contents(), radius = 48) if(!selected_reagent) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index c8a02d8f7975b..798098070611b 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -18,10 +18,10 @@ else icon_state = "[initial(icon_state)]1" -/obj/item/reagent_containers/dropper/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/reagent_containers/dropper/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) return -/obj/item/reagent_containers/dropper/afterattack(atom/target, mob/user, proximity) +/obj/item/reagent_containers/dropper/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity) return var/to_transfer = 0 @@ -113,7 +113,7 @@ //Syndicate item. Virus transmitting mini hypospray /obj/item/reagent_containers/dropper/precision/viral_injector -/obj/item/reagent_containers/dropper/precision/viral_injector/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/reagent_containers/dropper/precision/viral_injector/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) if(M.can_inject(user, TRUE)) to_chat(user, "You stealthily stab [M] with [src].") if(reagents.total_volume && M.reagents) diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 9c7b309cc61ed..496f385e4dbff 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -27,7 +27,7 @@ . += "[src] can hold up to [reagents.maximum_volume] units." -/obj/item/reagent_containers/glass/attack(mob/M, mob/user, def_zone) +/obj/item/reagent_containers/glass/attack__legacy__attackchain(mob/M, mob/user, def_zone) if(!is_open_container()) return ..() @@ -69,7 +69,7 @@ addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), M, 5), 5) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) -/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity) +/obj/item/reagent_containers/glass/afterattack__legacy__attackchain(obj/target, mob/user, proximity) if((!proximity) || !check_allowed_items(target, target_self = TRUE)) return @@ -110,7 +110,7 @@ reagents.reaction(target, REAGENT_TOUCH) reagents.clear_reagents() -/obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params) +/obj/item/reagent_containers/glass/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(is_pen(I)) var/t = rename_interactive(user, I) if(!isnull(t)) @@ -171,7 +171,7 @@ if(reagents) reagents.temperature_reagents(4000) -/obj/item/reagent_containers/glass/beaker/attackby(obj/item/W, mob/user, params) +/obj/item/reagent_containers/glass/beaker/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/assembly_holder) && can_assembly) if(assembly) to_chat(usr, "[src] already has an assembly.") @@ -324,7 +324,7 @@ reagents.reaction(user, REAGENT_TOUCH) reagents.clear_reagents() -/obj/item/reagent_containers/glass/bucket/attackby(obj/D, mob/user, params) +/obj/item/reagent_containers/glass/bucket/attackby__legacy__attackchain(obj/D, mob/user, params) if(istype(D, /obj/item/mop)) var/obj/item/mop/m = D m.wet_mop(src, user) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 269a092459ee9..ff53f822daa6b 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -69,13 +69,13 @@ reagents.reaction(M, REAGENT_INGEST, 0.1) return TRUE -/obj/item/reagent_containers/hypospray/attack(mob/living/M, mob/user) +/obj/item/reagent_containers/hypospray/attack__legacy__attackchain(mob/living/M, mob/user) return apply(M, user) -/obj/item/reagent_containers/hypospray/attack_self(mob/user) +/obj/item/reagent_containers/hypospray/attack_self__legacy__attackchain(mob/user) return apply(user, user) -/obj/item/reagent_containers/hypospray/attackby(obj/item/I, mob/user, params) +/obj/item/reagent_containers/hypospray/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(is_pen(I)) rename_interactive(user, I, use_prefix = TRUE, prompt = "Give [src] a title.") return TRUE @@ -189,7 +189,7 @@ container_type = DRAWABLE flags = null -/obj/item/reagent_containers/hypospray/autoinjector/attack(mob/M, mob/user) +/obj/item/reagent_containers/hypospray/autoinjector/attack__legacy__attackchain(mob/M, mob/user) if(!reagents.total_volume) to_chat(user, "[src] is empty!") return @@ -197,7 +197,7 @@ update_icon(UPDATE_ICON_STATE) return TRUE -/obj/item/reagent_containers/hypospray/autoinjector/attack_self(mob/user) +/obj/item/reagent_containers/hypospray/autoinjector/attack_self__legacy__attackchain(mob/user) ..() update_icon(UPDATE_ICON_STATE) return TRUE @@ -268,7 +268,7 @@ volume = 40 list_reagents = list("nanocalcium" = 30, "epinephrine" = 10) -/obj/item/reagent_containers/hypospray/autoinjector/nanocalcium/attack(mob/living/M, mob/user) +/obj/item/reagent_containers/hypospray/autoinjector/nanocalcium/attack__legacy__attackchain(mob/living/M, mob/user) if(..()) playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 20, 1) @@ -281,7 +281,7 @@ container_type = null //No sucking out the reagent list_reagents = list("zombiecure1" = 15) -/obj/item/reagent_containers/hypospray/autoinjector/zombiecure/attack(mob/living/M, mob/user) +/obj/item/reagent_containers/hypospray/autoinjector/zombiecure/attack__legacy__attackchain(mob/living/M, mob/user) if(..()) playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 20, TRUE) //Sucker for sounds, also gets zombies attention. diff --git a/code/modules/reagents/reagent_containers/iv_bag.dm b/code/modules/reagents/reagent_containers/iv_bag.dm index ade28979dab48..30bfa515a700d 100644 --- a/code/modules/reagents/reagent_containers/iv_bag.dm +++ b/code/modules/reagents/reagent_containers/iv_bag.dm @@ -32,7 +32,7 @@ ..() update_icon(UPDATE_OVERLAYS) -/obj/item/reagent_containers/iv_bag/attack_self(mob/user) +/obj/item/reagent_containers/iv_bag/attack_self__legacy__attackchain(mob/user) ..() mode = !mode update_icon(UPDATE_OVERLAYS) @@ -87,10 +87,10 @@ injection_target.reagents.trans_id_to(src, reagent.id, amount_per_transfer_from_this / 10) update_icon(UPDATE_OVERLAYS) -/obj/item/reagent_containers/iv_bag/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/reagent_containers/iv_bag/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) return -/obj/item/reagent_containers/iv_bag/afterattack(atom/target, mob/user, proximity) +/obj/item/reagent_containers/iv_bag/afterattack__legacy__attackchain(atom/target, mob/user, proximity) if(!proximity) return if(!target.reagents) @@ -157,7 +157,7 @@ if(IV_INJECT) . += "inject" -/obj/item/reagent_containers/iv_bag/attackby(obj/item/I, mob/user, params) +/obj/item/reagent_containers/iv_bag/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(is_pen(I)) rename_interactive(user, I) diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index 70686bfa61713..fb1cbc239ef3d 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -12,10 +12,10 @@ var/instant_application = FALSE var/needs_to_apply_reagents = TRUE -/obj/item/reagent_containers/patch/attack(mob/living/carbon/C, mob/user) +/obj/item/reagent_containers/patch/attack__legacy__attackchain(mob/living/carbon/C, mob/user) return apply(C, user) -/obj/item/reagent_containers/patch/attack_self(mob/user) +/obj/item/reagent_containers/patch/attack_self__legacy__attackchain(mob/user) return apply(user, user) /obj/item/reagent_containers/patch/proc/apply(mob/living/carbon/C, mob/user) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 20bed70015674..dfbb26ab892d2 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -47,13 +47,13 @@ qdel(src) return TRUE -/obj/item/reagent_containers/pill/attack(mob/living/carbon/C, mob/user) +/obj/item/reagent_containers/pill/attack__legacy__attackchain(mob/living/carbon/C, mob/user) return apply(C, user) -/obj/item/reagent_containers/pill/attack_self(mob/user) +/obj/item/reagent_containers/pill/attack_self__legacy__attackchain(mob/user) return apply(user, user) -/obj/item/reagent_containers/pill/afterattack(obj/target, mob/user, proximity) +/obj/item/reagent_containers/pill/afterattack__legacy__attackchain(obj/target, mob/user, proximity) if(!proximity || !target.is_refillable()) return if(target.reagents.holder_full()) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index de67f8769c5ad..b639acd9ad154 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -23,7 +23,7 @@ . = ..() ADD_TRAIT(src, TRAIT_CAN_POINT_WITH, ROUNDSTART_TRAIT) -/obj/item/reagent_containers/spray/afterattack(atom/A, mob/user) +/obj/item/reagent_containers/spray/afterattack__legacy__attackchain(atom/A, mob/user) if(isstorage(A) || ismodcontrol(A) || istype(A, /obj/structure/table) || istype(A, /obj/structure/rack) || istype(A, /obj/structure/closet) \ || istype(A, /obj/item/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics)) return @@ -95,7 +95,7 @@ qdel(D) -/obj/item/reagent_containers/spray/attack_self(mob/user) +/obj/item/reagent_containers/spray/attack_self__legacy__attackchain(mob/user) amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) spray_currentrange = (spray_currentrange == 1 ? spray_maxrange : 1) @@ -135,7 +135,7 @@ amount_per_transfer_from_this = 10 list_reagents = list("cleaner" = 250) -/obj/item/reagent_containers/spray/cleaner/attack_self(mob/user) +/obj/item/reagent_containers/spray/cleaner/attack_self__legacy__attackchain(mob/user) amount_per_transfer_from_this = (amount_per_transfer_from_this == 5 ? 10 : 5) spray_currentrange = (spray_currentrange == 1 ? spray_maxrange : 1) to_chat(user, "You [amount_per_transfer_from_this == 5 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.") @@ -215,7 +215,7 @@ volume = 10 list_reagents = list("water" = 10) -/obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays +/obj/item/reagent_containers/spray/waterflower/attack_self__legacy__attackchain(mob/user) //Don't allow changing how much the flower sprays return //chemsprayer @@ -271,7 +271,7 @@ -/obj/item/reagent_containers/spray/chemsprayer/attack_self(mob/user) +/obj/item/reagent_containers/spray/chemsprayer/attack_self__legacy__attackchain(mob/user) amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) to_chat(user, "You adjust the output switch. You'll now use [amount_per_transfer_from_this] units per spray.") diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 73b400127950c..dc79be44db93c 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -33,7 +33,7 @@ ..() update_icon() -/obj/item/reagent_containers/syringe/attack_self(mob/user) +/obj/item/reagent_containers/syringe/attack_self__legacy__attackchain(mob/user) mode = !mode update_icon() @@ -41,14 +41,14 @@ ..() update_icon() -/obj/item/reagent_containers/syringe/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/reagent_containers/syringe/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) return -/obj/item/reagent_containers/syringe/attackby(obj/item/I, mob/user, params) +/obj/item/reagent_containers/syringe/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/storage/bag)) ..() -/obj/item/reagent_containers/syringe/afterattack(atom/target, mob/user , proximity) +/obj/item/reagent_containers/syringe/afterattack__legacy__attackchain(atom/target, mob/user , proximity) if(!proximity) return if(!target.reagents) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 8137f1f545952..67f4a1ae1beb6 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -24,7 +24,7 @@ if(tank_volume && (damage_flag == BULLET || damage_flag == LASER)) boom(FALSE, TRUE) -/obj/structure/reagent_dispensers/attackby(obj/item/I, mob/user, params) +/obj/structure/reagent_dispensers/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.is_refillable()) return FALSE //so we can refill them via their afterattack. return ..() @@ -158,7 +158,7 @@ lastrigger = null overlays.Cut() -/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/user, params) +/obj/structure/reagent_dispensers/fueltank/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/assembly_holder) && accepts_rig) if(rig) to_chat(user, "There is another device in the way.") @@ -282,7 +282,7 @@ /// If TRUE, prevents the player from inserting the disk again while it is currently exploding. var/exploding = FALSE -/obj/structure/reagent_dispensers/beerkeg/nuke/attackby(obj/item/O, mob/user, params) +/obj/structure/reagent_dispensers/beerkeg/nuke/attackby__legacy__attackchain(obj/item/O, mob/user, params) . = ..() if(exploding) return diff --git a/code/modules/recycling/belt-placer.dm b/code/modules/recycling/belt-placer.dm index 8e1db8b15fced..739ff0274d54f 100644 --- a/code/modules/recycling/belt-placer.dm +++ b/code/modules/recycling/belt-placer.dm @@ -25,7 +25,7 @@ max_combined_w_class = 200 //50 belts origin_tech = "engineering=2;bluespace=1" -/obj/item/storage/conveyor/attackby(obj/item/I, mob/user, params) //So we can link belts en masse +/obj/item/storage/conveyor/attackby__legacy__attackchain(obj/item/I, mob/user, params) //So we can link belts en masse if(istype(I, /obj/item/conveyor_switch_construct)) var/obj/item/conveyor_switch_construct/S = I var/linked = FALSE //For nice message @@ -37,11 +37,11 @@ else return ..() -/obj/item/storage/conveyor/afterattack(atom/A, mob/user, proximity) +/obj/item/storage/conveyor/afterattack__legacy__attackchain(atom/A, mob/user, proximity) if(!proximity) return var/obj/item/conveyor_construct/C = locate() in src if(!C) to_chat(user, "There are no belts in [src].") else - C.afterattack(A, user, proximity) + C.afterattack__legacy__attackchain(A, user, proximity) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 3f3b9fba58f8b..61f1f912f0808 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -52,7 +52,7 @@ GLOBAL_LIST_EMPTY(conveyor_switches) update_move_direction() // attack with item, place item on conveyor -/obj/machinery/conveyor/attackby(obj/item/I, mob/user) +/obj/machinery/conveyor/attackby__legacy__attackchain(obj/item/I, mob/user) if(stat & BROKEN) return ..() @@ -425,7 +425,7 @@ GLOBAL_LIST_EMPTY(conveyor_switches) w_class = WEIGHT_CLASS_BULKY var/id -/obj/item/conveyor_construct/attackby(obj/item/I, mob/user, params) +/obj/item/conveyor_construct/attackby__legacy__attackchain(obj/item/I, mob/user, params) ..() if(!istype(I, /obj/item/conveyor_switch_construct)) return @@ -433,7 +433,7 @@ GLOBAL_LIST_EMPTY(conveyor_switches) to_chat(user, "You link [src] to [C].") id = C.id -/obj/item/conveyor_construct/afterattack(turf/T, mob/user, proximity) +/obj/item/conveyor_construct/afterattack__legacy__attackchain(turf/T, mob/user, proximity) if(!proximity) return if(user.incapacitated()) @@ -468,7 +468,7 @@ GLOBAL_LIST_EMPTY(conveyor_switches) id = world.time + rand() //this couldn't possibly go wrong -/obj/item/conveyor_switch_construct/afterattack(turf/T, mob/user, proximity) +/obj/item/conveyor_switch_construct/afterattack__legacy__attackchain(turf/T, mob/user, proximity) if(!proximity) return if(user.incapacitated()) @@ -487,7 +487,7 @@ GLOBAL_LIST_EMPTY(conveyor_switches) transfer_fingerprints_to(NC) qdel(src) -/obj/item/conveyor_switch_construct/attackby(obj/item/I, mob/user) +/obj/item/conveyor_switch_construct/attackby__legacy__attackchain(obj/item/I, mob/user) if(!istype(I, /obj/item/conveyor_switch_construct)) return ..() var/obj/item/conveyor_switch_construct/S = I diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 87fade596f100..81882d2d730be 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -187,7 +187,7 @@ nicetype = "sorting pipe" return nicetype -/obj/structure/disposalconstruct/attackby(obj/item/I, mob/user, params) +/obj/structure/disposalconstruct/attackby__legacy__attackchain(obj/item/I, mob/user, params) var/nicetype = get_nice_name() var/ispipe = is_pipe() // Indicates if we should change the level of this pipe var/turf/T = get_turf(src) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 071e5d5d90aad..6c478825d6bc6 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -123,7 +123,7 @@ disposal.update() // attack by item places it in to disposal -/obj/machinery/disposal/attackby(obj/item/I, mob/user, params) +/obj/machinery/disposal/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(stat & BROKEN || !user || I.flags & ABSTRACT) return @@ -1050,7 +1050,7 @@ //attack by item //weldingtool: unfasten and convert to obj/disposalconstruct -/obj/structure/disposalpipe/attackby(obj/item/I, mob/user, params) +/obj/structure/disposalpipe/attackby__legacy__attackchain(obj/item/I, mob/user, params) var/turf/T = get_turf(src) if(T.intact || T.transparent_floor) to_chat(user, "You can't interact with something that's under the floor!") @@ -1228,7 +1228,7 @@ if(mapping_fail) stack_trace("[src] mapped incorrectly at [x],[y],[z] - [mapping_fail]") -/obj/structure/disposalpipe/sortjunction/attackby(obj/item/I, mob/user, params) +/obj/structure/disposalpipe/sortjunction/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(..()) return @@ -1426,7 +1426,7 @@ D.linkedtrunk = src // Override attackby so we disallow trunkremoval when somethings ontop -/obj/structure/disposalpipe/trunk/attackby(obj/item/I, mob/user, params) +/obj/structure/disposalpipe/trunk/attackby__legacy__attackchain(obj/item/I, mob/user, params) //Disposal bins or chutes //Disposal constructors diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index d0440121847d1..d1fa9d14eb55b 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -35,7 +35,7 @@ qdel(src) -/obj/structure/big_delivery/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/structure/big_delivery/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/dest_tagger)) var/obj/item/dest_tagger/O = W @@ -95,7 +95,7 @@ var/atom/A = i A.emp_act(severity) -/obj/item/small_delivery/attack_self(mob/user) +/obj/item/small_delivery/attack_self__legacy__attackchain(mob/user) if(wrapped?.loc == src) //sometimes items can disappear. For example, bombs. --rastaf0 wrapped.forceMove(get_turf(src)) if(ishuman(user)) @@ -103,7 +103,7 @@ playsound(src, 'sound/items/poster_ripped.ogg', 50, TRUE) qdel(src) -/obj/item/small_delivery/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/small_delivery/attackby__legacy__attackchain(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/dest_tagger)) var/obj/item/dest_tagger/O = W @@ -262,7 +262,7 @@ QDEL_NULL(destination_tagger) return ..() -/obj/item/dest_tagger/attack_self(mob/user) +/obj/item/dest_tagger/attack_self__legacy__attackchain(mob/user) add_fingerprint(user) ui_interact(user) @@ -405,7 +405,7 @@ var/sortTag = 1 var/sealed = 0 -/obj/item/shipping_package/attackby(obj/item/O, mob/user, params) +/obj/item/shipping_package/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(sealed) if(is_pen(O)) var/str = tgui_input_text(user, "Intended recipient?", "Address", max_length = MAX_NAME_LEN) @@ -432,7 +432,7 @@ add_fingerprint(usr) to_chat(user, "You put [O] in [src].") -/obj/item/shipping_package/attack_self(mob/user) +/obj/item/shipping_package/attack_self__legacy__attackchain(mob/user) if(sealed) to_chat(user, "You tear open [src], dropping the contents onto the floor.") playsound(loc, 'sound/items/poster_ripped.ogg', 50, 1) diff --git a/code/modules/research/anomaly/anomaly.dm b/code/modules/research/anomaly/anomaly.dm index b895540988ea6..d4564b3e2f2fb 100644 --- a/code/modules/research/anomaly/anomaly.dm +++ b/code/modules/research/anomaly/anomaly.dm @@ -13,7 +13,7 @@ var/obj/effect/anomaly/A = loc A.anomalyNeutralize() -/obj/item/assembly/signaler/anomaly/attack_self() +/obj/item/assembly/signaler/anomaly/attack_self__legacy__attackchain() return //Anomaly cores @@ -76,7 +76,7 @@ icon = 'icons/obj/clothing/suits.dmi' w_class = WEIGHT_CLASS_NORMAL -/obj/item/reactive_armour_shell/attackby(obj/item/I, mob/user, params) +/obj/item/reactive_armour_shell/attackby__legacy__attackchain(obj/item/I, mob/user, params) var/static/list/anomaly_armour_types = list( /obj/item/assembly/signaler/anomaly/grav = /obj/item/clothing/suit/armor/reactive/repulse, /obj/item/assembly/signaler/anomaly/flux = /obj/item/clothing/suit/armor/reactive/tesla, diff --git a/code/modules/research/backup_console.dm b/code/modules/research/backup_console.dm index 2bdb661519c3d..2f3412d97503f 100644 --- a/code/modules/research/backup_console.dm +++ b/code/modules/research/backup_console.dm @@ -38,7 +38,7 @@ SStgui.update_uis(src) -/obj/machinery/computer/rnd_backup/attackby(obj/item/O, mob/user, params) +/obj/machinery/computer/rnd_backup/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/disk/rnd_backup_disk) && istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(!H.unEquip(O)) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 4728e195f6958..1b07264d9e9f4 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -74,7 +74,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). return round(A / max(1, (all_materials[M] * efficiency_coeff))) -/obj/machinery/r_n_d/circuit_imprinter/attackby(obj/item/O as obj, mob/user as mob, params) +/obj/machinery/r_n_d/circuit_imprinter/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/storage/part_replacer)) return ..() diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 0401476f4e81f..a84bb3b4f0735 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -48,7 +48,7 @@ Note: Must be placed within 3 tiles of the R&D Console return temp_list -/obj/machinery/r_n_d/destructive_analyzer/attackby(obj/item/O as obj, mob/user as mob, params) +/obj/machinery/r_n_d/destructive_analyzer/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/storage/part_replacer)) return ..() diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 4cac5ee49c70d..7061b494e48d3 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -98,7 +98,7 @@ return FALSE return TRUE -/obj/machinery/r_n_d/experimentor/attackby(obj/item/O, mob/user, params) +/obj/machinery/r_n_d/experimentor/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/storage/part_replacer)) return ..() diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index eb0e7f7c2c9a3..ad5848af12574 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -76,7 +76,7 @@ Note: Must be placed west/left of and R&D console to function. A = A / max(1, (being_built.materials[M] * efficiency_coeff)) return A -/obj/machinery/r_n_d/protolathe/attackby(obj/item/O as obj, mob/user as mob, params) +/obj/machinery/r_n_d/protolathe/attackby__legacy__attackchain(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/storage/part_replacer)) return ..() diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 28b410b9d373e..d0c6f0ccd87ac 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -179,7 +179,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, wait_message_timer = 0 return ..() -/obj/machinery/computer/rdconsole/attackby(obj/item/D as obj, mob/user as mob, params) +/obj/machinery/computer/rdconsole/attackby__legacy__attackchain(obj/item/D as obj, mob/user as mob, params) //Loading a disk into it. if(istype(D, /obj/item/disk)) diff --git a/code/modules/research/strange_objects.dm b/code/modules/research/strange_objects.dm index 9b33060c59c8a..2be7bdc81ee87 100644 --- a/code/modules/research/strange_objects.dm +++ b/code/modules/research/strange_objects.dm @@ -85,7 +85,7 @@ ) -/obj/item/relic/attack_self(mob/user) +/obj/item/relic/attack_self__legacy__attackchain(mob/user) if(revealed) if((last_use_time + cooldown_duration) > world.time) to_chat(user, "[src] does not react!") diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 6546a8dda9c0f..83510e1318705 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -176,7 +176,7 @@ return return ..() -/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params) +/obj/machinery/computer/camera_advanced/xenobio/attackby__legacy__attackchain(obj/item/O, mob/user, params) if(istype(O, /obj/item/food/monkeycube)) if(user.drop_item()) monkeys++ diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index cf08aa8ea0255..0a99b1ec1ac20 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -18,7 +18,7 @@ /// The mob who last injected the extract with plasma, water or blood. Used for logging. var/mob/living/injector_mob -/obj/item/slime_extract/attackby(obj/item/O, mob/user) +/obj/item/slime_extract/attackby__legacy__attackchain(obj/item/O, mob/user) if(istype(O, /obj/item/slimepotion/enhancer)) if(Uses >= 5) to_chat(user, "You cannot enhance this extract further!") @@ -133,7 +133,7 @@ origin_tech = "biotech=4" var/being_used = FALSE -/obj/item/slimepotion/attack(mob/living/simple_animal/slime/M, mob/user) +/obj/item/slimepotion/attack__legacy__attackchain(mob/living/simple_animal/slime/M, mob/user) if(!isslime(M)) to_chat(user, "[src] only works on slimes!") return FALSE @@ -145,7 +145,7 @@ return FALSE return TRUE -/obj/item/slimepotion/afterattack(obj/item/reagent_containers/target, mob/user, proximity_flag) +/obj/item/slimepotion/afterattack__legacy__attackchain(obj/item/reagent_containers/target, mob/user, proximity_flag) if(!proximity_flag) return if(istype(target)) @@ -157,7 +157,7 @@ desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame." icon_state = "bottle19" -/obj/item/slimepotion/slime/docility/attack(mob/living/simple_animal/slime/M, mob/user) +/obj/item/slimepotion/slime/docility/attack__legacy__attackchain(mob/living/simple_animal/slime/M, mob/user) . = ..() if(!.) return @@ -200,10 +200,10 @@ if(2) . += "The vial is scalding hot! Is it really a good idea to use this..?" -/obj/item/slimepotion/sentience/attack() +/obj/item/slimepotion/sentience/attack__legacy__attackchain() return -/obj/item/slimepotion/sentience/afterattack(mob/living/M, mob/user, proximity_flag) +/obj/item/slimepotion/sentience/afterattack__legacy__attackchain(mob/living/M, mob/user, proximity_flag) if(!proximity_flag) return if(being_used || !ismob(M)) @@ -285,7 +285,7 @@ var/prompted = FALSE var/animal_type = SENTIENCE_ORGANIC -/obj/item/slimepotion/transference/afterattack(mob/living/M, mob/user, proximity_flag) +/obj/item/slimepotion/transference/afterattack__legacy__attackchain(mob/living/M, mob/user, proximity_flag) if(!proximity_flag) return if(prompted || !ismob(M)) @@ -326,7 +326,7 @@ desc = "A potent chemical mix that will cause a baby slime to generate more extract." icon_state = "bottle16" -/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/M, mob/user) +/obj/item/slimepotion/slime/steroid/attack__legacy__attackchain(mob/living/simple_animal/slime/M, mob/user) . = ..() if(!.) return @@ -352,7 +352,7 @@ desc = "A potent chemical mix that will reduce the chance of a slime mutating." icon_state = "bottle15" -/obj/item/slimepotion/slime/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user) +/obj/item/slimepotion/slime/stabilizer/attack__legacy__attackchain(mob/living/simple_animal/slime/M, mob/user) . = ..() if(!.) return @@ -370,7 +370,7 @@ desc = "A potent chemical mix that will increase the chance of a slime mutating." icon_state = "bottle3" -/obj/item/slimepotion/slime/mutator/attack(mob/living/simple_animal/slime/M, mob/user) +/obj/item/slimepotion/slime/mutator/attack__legacy__attackchain(mob/living/simple_animal/slime/M, mob/user) . = ..() if(!.) return @@ -394,7 +394,7 @@ desc = "A monkey-shaped treat that heats up your little slime friend!" icon_state = "slime_treat" -/obj/item/slimepotion/speed/attack(mob/living/simple_animal/slime/M, mob/user) +/obj/item/slimepotion/speed/attack__legacy__attackchain(mob/living/simple_animal/slime/M, mob/user) . = ..() if(!.) return @@ -421,7 +421,7 @@ resistance_flags = FIRE_PROOF var/uses = 3 -/obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/C, mob/user, proximity_flag) +/obj/item/slimepotion/fireproof/afterattack__legacy__attackchain(obj/item/clothing/C, mob/user, proximity_flag) ..() if(!proximity_flag) return @@ -448,7 +448,7 @@ if(usr.incapacitated()) return if(loc == usr && loc.Adjacent(over_object)) - afterattack(over_object, usr, TRUE) + afterattack__legacy__attackchain(over_object, usr, TRUE) /obj/item/slimepotion/oil_slick name = "slime oil potion" @@ -457,7 +457,7 @@ icon_state = "bottle4" origin_tech = "biotech=5" -/obj/item/slimepotion/oil_slick/afterattack(obj/O, mob/user, proximity_flag) +/obj/item/slimepotion/oil_slick/afterattack__legacy__attackchain(obj/O, mob/user, proximity_flag) if(!proximity_flag) return ..() @@ -501,7 +501,7 @@ if(usr.incapacitated()) return if(loc == usr && loc.Adjacent(over_object)) - afterattack(over_object, usr, TRUE) + afterattack__legacy__attackchain(over_object, usr, TRUE) /obj/effect/timestop anchored = TRUE diff --git a/code/modules/ruins/lavalandruin_code/dead_ratvar.dm b/code/modules/ruins/lavalandruin_code/dead_ratvar.dm index 3f32048e4dda6..04740d501b8f7 100644 --- a/code/modules/ruins/lavalandruin_code/dead_ratvar.dm +++ b/code/modules/ruins/lavalandruin_code/dead_ratvar.dm @@ -93,7 +93,7 @@ return default_unfasten_wrench(user, I, 10) -/obj/structure/clockwork/wall_gear/attackby(obj/item/I, mob/user, params) +/obj/structure/clockwork/wall_gear/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/stack/tile/brass)) var/obj/item/stack/tile/brass/W = I if(W.get_amount() < 1) diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm index 5ee35c7fa259e..0905ee6975dfe 100644 --- a/code/modules/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -303,7 +303,7 @@ icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "prison_cube" -/obj/item/prisoncube/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/prisoncube/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(!proximity_flag || !isliving(target)) return diff --git a/code/modules/ruins/lavalandruin_code/sin_ruins.dm b/code/modules/ruins/lavalandruin_code/sin_ruins.dm index cc6719c595511..b6281e66fa3b7 100644 --- a/code/modules/ruins/lavalandruin_code/sin_ruins.dm +++ b/code/modules/ruins/lavalandruin_code/sin_ruins.dm @@ -194,7 +194,7 @@ w_class = WEIGHT_CLASS_NORMAL hitsound = 'sound/weapons/bladeslice.ogg' -/obj/item/kitchen/knife/envy/afterattack(atom/movable/AM, mob/living/carbon/human/user, proximity) +/obj/item/kitchen/knife/envy/afterattack__legacy__attackchain(atom/movable/AM, mob/living/carbon/human/user, proximity) . = ..() if(!proximity) return diff --git a/code/modules/ruins/objects_and_mobs/id_upgrader.dm b/code/modules/ruins/objects_and_mobs/id_upgrader.dm index c9d8d684dc48c..af4fa2906ba86 100644 --- a/code/modules/ruins/objects_and_mobs/id_upgrader.dm +++ b/code/modules/ruins/objects_and_mobs/id_upgrader.dm @@ -8,7 +8,7 @@ /// Have we been used? var/used = FALSE -/obj/machinery/computer/id_upgrader/attackby(obj/item/I, mob/user, params) +/obj/machinery/computer/id_upgrader/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id)) var/obj/item/card/id/D = I if(!length(access_to_give)) diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 9ae9a8a0da4b9..2a761a0ea1f50 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -43,7 +43,7 @@ to_chat(user, "The station AI is not to interact with these devices.") return -/obj/machinery/keycard_auth/attackby(obj/item/W, mob/user, params) +/obj/machinery/keycard_auth/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") return diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index 68336212acd9f..f1a50126fe7f8 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -31,7 +31,7 @@ var/lz_dir = 1 -/obj/item/assault_pod/attack_self(mob/living/user) +/obj/item/assault_pod/attack_self__legacy__attackchain(mob/living/user) var/target_area target_area = tgui_input_list(user, "Area to land", "Select a Landing Zone", SSmapping.teleportlocs) if(!target_area) diff --git a/code/modules/shuttle/dock_generator.dm b/code/modules/shuttle/dock_generator.dm index e6841aa9db1e0..d6769dfeca335 100644 --- a/code/modules/shuttle/dock_generator.dm +++ b/code/modules/shuttle/dock_generator.dm @@ -13,7 +13,7 @@ var/plural = count > 1 . += "There [plural ? "are" : "is"] [count] use[plural ? "s" : ""] left." -/obj/item/whiteship_port_generator/attack_self(mob/living/user) +/obj/item/whiteship_port_generator/attack_self__legacy__attackchain(mob/living/user) if(is_station_level(user.z)) log_admin("[key_name(user)] attempted to create a whiteship dock in the station's sector at [COORD(user)].") to_chat(user, "New docking areas cannot be designated within the station's sector!") diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 3bd7321a74a51..762fba8ab68aa 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -36,7 +36,7 @@ if(hijack_announce) . += "It is probably best to fortify your position as to be uninterrupted during the attempt, given the automatic announcements..." -/obj/machinery/computer/emergency_shuttle/attackby(obj/item/card/id/W, mob/user, params) +/obj/machinery/computer/emergency_shuttle/attackby__legacy__attackchain(obj/item/card/id/W, mob/user, params) if(stat & (BROKEN|NOPOWER)) return if(!istype(W, /obj/item/card/id)) diff --git a/code/modules/shuttle/lance_docking_targeter.dm b/code/modules/shuttle/lance_docking_targeter.dm index dcdda66d5f998..78b237dc433f6 100644 --- a/code/modules/shuttle/lance_docking_targeter.dm +++ b/code/modules/shuttle/lance_docking_targeter.dm @@ -22,7 +22,7 @@ playsound(T, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) return TRUE -/obj/item/lance_docking_generator/attack_self(mob/living/user) +/obj/item/lance_docking_generator/attack_self__legacy__attackchain(mob/living/user) if(!is_station_level(user.z)) to_chat(user, "You'll want this to dock on the station.") return diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 04d85784bd037..5e6477acf1d19 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/monkey,/mob/living/carbon/alien))) -/obj/item/dna_probe/afterattack(atom/target, mob/user, proximity) +/obj/item/dna_probe/afterattack__legacy__attackchain(atom/target, mob/user, proximity) ..() if(!proximity || !target) return @@ -252,7 +252,7 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m if(length(plants) >= plants_max && length(animals) >= animals_max && length(dna) >= dna_max) completed = TRUE -/obj/machinery/dna_vault/attackby(obj/item/I, mob/user, params) +/obj/machinery/dna_vault/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/dna_probe)) var/obj/item/dna_probe/P = I var/uploaded = 0 diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 8cadd0fb23d7b..57871cd10cfc5 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -143,7 +143,7 @@ /obj/machinery/satellite/update_icon_state() icon_state = active ? "sat_active" : "sat_inactive" -/obj/machinery/satellite/attackby(obj/item/I, mob/user, params) +/obj/machinery/satellite/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/multitool)) to_chat(user, "// NTSAT-[id] // Mode : [active ? "PRIMARY" : "STANDBY"] //[emagged ? "DEBUG_MODE //" : ""]") else diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index eb8ded652b435..ede59565f2b58 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -416,7 +416,7 @@ flags = NOBLUDGEON var/drawing_power = FALSE -/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/apc_powercord/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag, click_parameters) if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) return ..() if(drawing_power) @@ -801,7 +801,7 @@ desc = "An implant awaiting installation of a vortex anomaly core." icon_state = "v1_arm" -/obj/item/v1_arm_shell/attackby(obj/item/I, mob/user, params) +/obj/item/v1_arm_shell/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, /obj/item/assembly/signaler/anomaly/vortex)) to_chat(user, "You insert [I] into the back of the hand, and the implant begins to boot up.") new /obj/item/organ/internal/cyberimp/arm/v1_arm(get_turf(src)) diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index 8ca45f7e023a9..92ee6f5ebfc19 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -29,7 +29,7 @@ I.forceMove(src) name = "[initial(name)] ([storedorgan.name])" -/obj/item/autosurgeon/organ/attack_self(mob/user) //when the object it used... +/obj/item/autosurgeon/organ/attack_self__legacy__attackchain(mob/user) //when the object it used... if(!uses) to_chat(user, "[src] has already been used. The tools are dull and won't reactivate.") return @@ -46,7 +46,7 @@ if(!uses) desc = "[initial(desc)] Looks like it's been used up." -/obj/item/autosurgeon/organ/attackby(obj/item/I, mob/user, params) +/obj/item/autosurgeon/organ/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(istype(I, organ_type)) if(storedorgan) to_chat(user, "[src] already has an implant stored.") diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index c35fca1463d5a..d2c5426fc3dd5 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -16,7 +16,7 @@ else icon_state = "[base_icon_state]-off" -/obj/item/organ/internal/heart/attack_self(mob/user) +/obj/item/organ/internal/heart/attack_self__legacy__attackchain(mob/user) ..() if(status & ORGAN_DEAD) to_chat(user, "You can't restart a dead heart.") @@ -56,7 +56,7 @@ var/heal_burn = 0 var/heal_oxy = 0 -/obj/item/organ/internal/heart/cursed/attack(mob/living/carbon/human/H, mob/living/carbon/human/user, obj/target) +/obj/item/organ/internal/heart/cursed/attack__legacy__attackchain(mob/living/carbon/human/H, mob/living/carbon/human/user, obj/target) if(H == user && istype(H)) if(NO_BLOOD in H.dna.species.species_traits) to_chat(H, "[src] is not compatible with your form!") diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 4111e112cf9b2..3cbb358b23a19 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -71,7 +71,7 @@ if(species_override) dna.species = new species_override -/obj/item/organ/attackby(obj/item/I, mob/user, params) +/obj/item/organ/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(is_robotic() && istype(I, /obj/item/stack/nanopaste)) var/obj/item/stack/nanopaste/nano = I nano.use(1) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 623ce326cb2ba..0cdb6f6ce4e69 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -166,7 +166,7 @@ if(!HAS_TRAIT(owner, TRAIT_IB_IMMUNE)) limb_flags &= ~CANNOT_INT_BLEED -/obj/item/organ/external/attack(mob/M, mob/living/user) +/obj/item/organ/external/attack__legacy__attackchain(mob/M, mob/living/user) if(!ishuman(M)) return ..() var/mob/living/carbon/human/C = M @@ -713,7 +713,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(disembowel("groin")) return TRUE -/obj/item/organ/external/attackby(obj/item/I, mob/user, params) +/obj/item/organ/external/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(I.sharp) add_fingerprint(user) if(!length(contents)) diff --git a/code/modules/surgery/organs/organ_extractor.dm b/code/modules/surgery/organs/organ_extractor.dm index 16ee7fe6f11b4..4d8229d2fc548 100644 --- a/code/modules/surgery/organs/organ_extractor.dm +++ b/code/modules/surgery/organs/organ_extractor.dm @@ -39,10 +39,10 @@ if(storedorgan) storedorgan.emp_act(severity) -/obj/item/organ_extractor/attack_self(mob/user) +/obj/item/organ_extractor/attack_self__legacy__attackchain(mob/user) insert_organ(user, user) -/obj/item/organ_extractor/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/organ_extractor/attack__legacy__attackchain(mob/living/M, mob/living/user, def_zone) if(in_use) to_chat(user, "[src] is already busy!") return @@ -179,7 +179,7 @@ self_insert_time = 1 SECONDS advanced = TRUE -/obj/item/organ_extractor/abductor/attackby(obj/item/I, mob/user, params) +/obj/item/organ_extractor/abductor/attackby__legacy__attackchain(obj/item/I, mob/user, params) . = ..() if(istype(I, /obj/item/organ/internal) && !storedorgan) user.unEquip(I) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 594cef1864705..2175c825bfea0 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -204,7 +204,7 @@ /obj/item/organ/internal/proc/render() return -/obj/item/organ/internal/attack(mob/living/carbon/M, mob/user) +/obj/item/organ/internal/attack__legacy__attackchain(mob/living/carbon/M, mob/user) if(M == user && ishuman(user)) var/mob/living/carbon/human/H = user var/obj/item/food/S = prepare_eat() diff --git a/code/modules/surgery/organs/subtypes/xenos.dm b/code/modules/surgery/organs/subtypes/xenos.dm index 606c15cf96133..efa105e358f59 100644 --- a/code/modules/surgery/organs/subtypes/xenos.dm +++ b/code/modules/surgery/organs/subtypes/xenos.dm @@ -37,7 +37,7 @@ else . += "You can hijack the latent functions of this organ by using a Hemostat on it." -/obj/item/organ/internal/alien/attackby(obj/item/hemostat/item, mob/user, params) +/obj/item/organ/internal/alien/attackby__legacy__attackchain(obj/item/hemostat/item, mob/user, params) if(istype(item)) if(!hijacked) to_chat(user, "You slice off the control node of this organ. This organ will now be effective against aliens.") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 8dcf71a6f2cfd..a4e35b9bec99f 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -500,7 +500,7 @@ GLOBAL_DATUM_INIT(multispin_words, /regex, regex("like a record baby")) desc = "They carry the voice of an ancient god. This one is enchanted to implant it into yourself when used in hand." var/has_implanted = FALSE -/obj/item/organ/internal/vocal_cords/colossus/wizard/attack_self(mob/living/user) +/obj/item/organ/internal/vocal_cords/colossus/wizard/attack_self__legacy__attackchain(mob/living/user) if(has_implanted) return user.drop_item() diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index f98fe6eea4327..49d3ebd3e0e9e 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -56,7 +56,7 @@ attack_verb = list("burnt") tool_behaviour = TOOL_CAUTERY -/obj/item/cautery/attack(mob/living/target, mob/living/user) +/obj/item/cautery/attack__legacy__attackchain(mob/living/target, mob/living/user) if(!cigarette_lighter_act(user, target)) return ..() @@ -168,7 +168,7 @@ damtype = "fire" hitsound = 'sound/weapons/sear.ogg' -/obj/item/scalpel/laser/attack(mob/living/carbon/target, mob/living/user) +/obj/item/scalpel/laser/attack__legacy__attackchain(mob/living/carbon/target, mob/living/user) if(!cigarette_lighter_act(user, target)) return ..() diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index d09edc18b7411..65782477e2eaa 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -34,7 +34,7 @@ pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) -/obj/item/stack/ore/bluespace_crystal/attack_self(mob/user) +/obj/item/stack/ore/bluespace_crystal/attack_self__legacy__attackchain(mob/user) if(use(1)) blink_mob(user) user.visible_message("[user] crushes a [singular_name]!") diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index 9bcba4f51b0ab..e057f73527641 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -118,7 +118,7 @@ GLOBAL_LIST_EMPTY(GPS_list) return data -/obj/item/gps/attack_self(mob/user) +/obj/item/gps/attack_self__legacy__attackchain(mob/user) ui_interact(user) /obj/item/gps/ui_state(mob/user) diff --git a/code/modules/telesci/rcs.dm b/code/modules/telesci/rcs.dm index 109d1b09bc7fb..92f7a1109fef1 100644 --- a/code/modules/telesci/rcs.dm +++ b/code/modules/telesci/rcs.dm @@ -46,7 +46,7 @@ /** * Used to select telepad location. */ -/obj/item/rcs/attack_self(mob/user) +/obj/item/rcs/attack_self__legacy__attackchain(mob/user) if(teleporting) to_chat(user, "Error: Unable to change destination while in use.") return diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index e6975d8b19518..fdd2770d7c270 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -99,7 +99,7 @@ item_state = "signaler" origin_tech = "bluespace=3" -/obj/item/telepad_beacon/attack_self(mob/user as mob) +/obj/item/telepad_beacon/attack_self__legacy__attackchain(mob/user as mob) if(user) to_chat(user, " Locked In") new /obj/machinery/telepad_cargo(user.loc) diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 76d5faa083d79..8e3d33310f7a1 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -60,7 +60,7 @@ . = ..() . += "There are [crystals ? crystals : "no"] bluespace crystal\s in the crystal slots." -/obj/machinery/computer/telescience/attackby(obj/item/W, mob/user, params) +/obj/machinery/computer/telescience/attackby__legacy__attackchain(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/ore/bluespace_crystal)) var/obj/item/stack/ore/bluespace_crystal/B = W if(crystals >= MAX_CRYSTALS) diff --git a/code/modules/tgui/plugins/tgui_login.dm b/code/modules/tgui/plugins/tgui_login.dm index e558cc118bebe..0f80f0a13fe48 100644 --- a/code/modules/tgui/plugins/tgui_login.dm +++ b/code/modules/tgui/plugins/tgui_login.dm @@ -11,7 +11,7 @@ * 1. Call [/obj/proc/ui_login_act] at the start of your ui_act() proc * 2. Call [/obj/proc/ui_login_data] in your ui_data() proc while passing the data list * 3. In your object, call [/obj/proc/ui_login_get] to get the current login state. - * 4. Optional: call [/obj/proc/ui_login_attackby] in your attackby() to make the login process easier. + * 4. Optional: call [/obj/proc/ui_login_attackby] in your attackby__legacy__attackchain() to make the login process easier. * * How to use (JS side): Use the and interfaces. */ diff --git a/code/modules/vehicle/janivehicle.dm b/code/modules/vehicle/janivehicle.dm index 3082551c672aa..a116fad9de308 100644 --- a/code/modules/vehicle/janivehicle.dm +++ b/code/modules/vehicle/janivehicle.dm @@ -90,37 +90,43 @@ if(buffer_installed) . += "It has been upgraded with a floor buffer." -/obj/vehicle/janicart/attackby(obj/item/I, mob/user, params) +/obj/vehicle/janicart/attack_by(obj/item/attacking, mob/user, params) + if(..()) + return FINISH_ATTACK + var/fail_msg = "There is already one of those in [src]." - if(istype(I, /obj/item/storage/bag/trash)) + if(istype(attacking, /obj/item/storage/bag/trash)) if(mybag) to_chat(user, fail_msg) - return + return FINISH_ATTACK if(!user.drop_item()) - return - to_chat(user, "You hook [I] onto [src].") - I.forceMove(src) - mybag = I + return FINISH_ATTACK + to_chat(user, "You hook [attacking] onto [src].") + attacking.forceMove(src) + mybag = attacking update_icon(UPDATE_OVERLAYS) - return - if(istype(I, /obj/item/borg/upgrade/floorbuffer)) + return FINISH_ATTACK + if(istype(attacking, /obj/item/borg/upgrade/floorbuffer)) if(buffer_installed) to_chat(user, fail_msg) - return + return FINISH_ATTACK buffer_installed = TRUE - qdel(I) - to_chat(user,"You upgrade [src] with [I].") + qdel(attacking) + to_chat(user,"You upgrade [src] with [attacking].") update_icon(UPDATE_OVERLAYS) - return - if(istype(I, /obj/item/borg/upgrade/vtec) && floorbuffer) + return FINISH_ATTACK + if(mybag && user.a_intent == INTENT_HELP && !is_key(attacking)) + mybag.attackby__legacy__attackchain(attacking, user) + else + return FINISH_ATTACK + +/obj/vehicle/janicart/install_vtec(obj/item/borg/upgrade/vtec/vtec, mob/user) + if(..() && floorbuffer) floorbuffer = FALSE vehicle_move_delay -= buffer_delay - return ..() //VTEC installation is handled in parent attackby, so we're returning to it early - if(mybag && user.a_intent == INTENT_HELP && !is_key(I)) - mybag.attackby(I, user) - else - return ..() + + return TRUE /obj/vehicle/janicart/update_overlays() . = ..() diff --git a/code/modules/vehicle/tg_vehicles/scooter.dm b/code/modules/vehicle/tg_vehicles/scooter.dm index 1a751677edb8e..6ff3e1b4a1682 100644 --- a/code/modules/vehicle/tg_vehicles/scooter.dm +++ b/code/modules/vehicle/tg_vehicles/scooter.dm @@ -275,7 +275,7 @@ icon_state = "scooter_frame" w_class = WEIGHT_CLASS_NORMAL -/obj/item/scooter_frame/attackby(obj/item/I, mob/user, params) +/obj/item/scooter_frame/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/stack/sheet/metal)) return ..() var/obj/item/stack/S = I @@ -301,7 +301,7 @@ /obj/tgvehicle/scooter/skateboard/wrench_act(mob/living/user, obj/item/I) return -/obj/tgvehicle/scooter/skateboard/improvised/attackby(obj/item/I, mob/user, params) +/obj/tgvehicle/scooter/skateboard/improvised/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!istype(I, /obj/item/stack/rods)) return ..() var/obj/item/stack/S = I @@ -351,7 +351,7 @@ ///The vehicle counterpart for the board var/board_item_type = /obj/tgvehicle/scooter/skateboard -/obj/item/melee/skateboard/attack_self(mob/user) +/obj/item/melee/skateboard/attack_self__legacy__attackchain(mob/user) var/obj/tgvehicle/scooter/skateboard/S = new board_item_type(get_turf(user))//this probably has fucky interactions with telekinesis but for the record it wasn't my fault S.buckle_mob(user) qdel(src) diff --git a/code/modules/vehicle/tg_vehicles/tg_vehicles.dm b/code/modules/vehicle/tg_vehicles/tg_vehicles.dm index b0bf2f2f39d18..57c52ad3bae18 100644 --- a/code/modules/vehicle/tg_vehicles/tg_vehicles.dm +++ b/code/modules/vehicle/tg_vehicles/tg_vehicles.dm @@ -192,7 +192,7 @@ add_occupant(M) return ..() -/obj/tgvehicle/attackby(obj/item/I, mob/user, params) +/obj/tgvehicle/attackby__legacy__attackchain(obj/item/I, mob/user, params) if(!key_type || is_key(inserted_key) || !is_key(I)) return ..() if(user.drop_item()) diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm index 117b5a11148c7..4b0c49da3c1ff 100644 --- a/code/modules/vehicle/vehicle.dm +++ b/code/modules/vehicle/vehicle.dm @@ -24,6 +24,8 @@ var/generic_pixel_y = 0 //All dirs shwo this pixel_y for the driver var/spaceworthy = FALSE + new_attack_chain = TRUE + /obj/vehicle/Initialize(mapload) . = ..() @@ -58,23 +60,30 @@ if(0 to 25) . += "It's falling apart!" -/obj/vehicle/attackby(obj/item/I, mob/user, params) - if(key_type && !is_key(inserted_key) && is_key(I)) +/obj/vehicle/proc/install_vtec(obj/item/borg/upgrade/vtec/vtec, mob/user) + if(vehicle_move_delay > 1) + vehicle_move_delay = 1 + qdel(vtec) + to_chat(user, "You upgrade [src] with [vtec].") + + return TRUE + +/obj/vehicle/attack_by(obj/item/attacking, mob/user, params) + if(..()) + return FINISH_ATTACK + + if(key_type && !is_key(inserted_key) && is_key(attacking)) if(user.drop_item()) - I.forceMove(src) - to_chat(user, "You insert [I] into [src].") + attacking.forceMove(src) + to_chat(user, "You insert [attacking] into [src].") if(inserted_key) //just in case there's an invalid key inserted_key.forceMove(drop_location()) - inserted_key = I + inserted_key = attacking else - to_chat(user, "[I] seems to be stuck to your hand!") - return - if(istype(I, /obj/item/borg/upgrade/vtec) && vehicle_move_delay > 1) - vehicle_move_delay = 1 - qdel(I) - to_chat(user, "You upgrade [src] with [I].") - return - return ..() + to_chat(user, "[attacking] seems to be stuck to your hand!") + return FINISH_ATTACK + if(istype(attacking, /obj/item/borg/upgrade/vtec) && install_vtec(attacking, user)) + return FINISH_ATTACK /obj/vehicle/AltClick(mob/user) if(inserted_key && user.Adjacent(user)) diff --git a/docs/references/attack_chain.md b/docs/references/attack_chain.md new file mode 100644 index 0000000000000..2132b5c25f009 --- /dev/null +++ b/docs/references/attack_chain.md @@ -0,0 +1,751 @@ +# The Attack Chain + +The vast majority of things that happen when a player performs an action on an +object or another player occurs within the _attack chain_. The attack chain is +the set of procs and signals that determine what should happen when an action is +performed, if an attack should occur, and what to do afterwards. + +## Overview + +The attack chain is made up of multiple procs and signals which are expected to +respect each other's responses as to how the attack chain should be executed. +For most mobs, this begins in [`/mob/proc/ClickOn`][clickon]. + +First, any click performed with a modifier key such as `SHIFT` or `ALT` is +handled first in separate procs. A handful of global use cases are handled next, +such as if the user is in a mech, if they are restrained, if they are throwing +an item, or if the thing they're interacting with is an SSD player. + +The core of the attack chain commences: + +1. If the user is holding the item and clicking on it, + `/obj/item/activate_self()` is called. This sends `COMSIG_ACTIVATE_SELF` and + cancels the rest of the attack chain if `COMPONENT_CANCEL_ATTACK_CHAIN` is + returned by any listeners. +2. If the user can reach the item or it is in relatively accessible inventory + (three levels deep), the melee attack chain is called via + `/obj/item/melee_attack_chain()`. +3. If the user is on HELP intent and the item is a tool, the various + `multitool_act()`/`welder_act()`/`screwdriver_act()`/etc. methods are called + depending on the tool type. This typically causes the attack chain to end. +4. Several signals are sent: `COMSIG_INTERACT_TARGET`, `COMSIG_INTERACTING`, and + `COMSIG_INTERACT_USER`. If any listeners request it (usually by returning a + non-null value), the attack chain may end here. +5. If the target implements `item_interaction()`, it is called here, and can + return one of the `ITEM_INTERACT_` flags to end the attack chain. +6. If the item being used on the target implements `interact_with_atom()`, it is + called here, and can return one of the `ITEM_INTERACT_` flags to end the + attack chain. + +The above steps can generally be considered the "item interaction phase", when +the action is not meant to cause in-game harm to the target. If the attack chain +has not been ended, this means we are in the "attack phase": + +1. `pre_attack()` is called on the used item, which sends `COMSIG_PRE_ATTACK`, + and cancels the rest of the attack chain if any listeners return + `COMPONENT_CANCEL_ATTACK_CHAIN`. +2. `attack_by()` is called on the target. This sends `COMSIG_ATTACKBY`, and + cancels the rest of the attack chain if any listeners return + `COMPONENT_SKIP_AFTERATTACK`. +3. `attacked_by()` is called on the target. +4. `COMSIG_AFTER_ATTACK` is sent on the used item, and + `COMSIG_AFTER_ATTACKED_BY` is sent on the target. + +The benefits of this approach is that it allows an enormous amount of +flexibility when it comes to dealing with attacks, while ensuring that behaviors +that are always expected occur consistently. + +For a high-level flowchart of the attack chain, see below. Note that this +flowchart may not be 100% accurate/up-to-date. When in doubt, check the +implementation. + + + + + +![](./images/attack_chain_flowchart.png) + +[clickon]: https://codedocs.paradisestation.org/mob.html#proc/ClickOn + +## Why? + +A reasonable question to ask would be, why do we need all of these procs and +signals? + +A good way to think of the attack chain is as a series of suggestions, rather +than a series of instructions. If a player attacks a mob with an object, there +are many things in the game world that may want to have a say in whether that +will happen, and how it will happen. + +For example, there may be a component attached to the player that wants to +intercept whenever an attack is attempted in order to cancel it or substitute +its own action. The item being used to attack may want to cancel the attack +based on its own internal state. The mob or object being attacked may have +specific ways to react to the attack. + +By having as many procs and signals as we do, we're allowing all involved +objects and any attached components or elements to contribute their own behavior +into the attack chain. + +### ITEM_INTERACT flags + +One may also ask why there are several `ITEM_INTERACT_` flags if returning any +of them always results in the end of the attack chain. This is for two reasons: + +1. To make it clear at the call site what the intent of the code is, and +2. So that in the future, if we do wish to separate the behavior of these flags, + we do not need to refactor all of the call sites. + +## Attack Chain Refactor + +The attack chain was overhauled in [#26834][]. This overhaul introduced several +safeties, renamed many procs and signals, and helped to ensure consistent +handling of signals in order to help make the attack chain more reliable. + +[#26834]: https://github.com/ParadiseSS13/Paradise/pull/26834 + +Prior to the attack chain refactoring, this system was disorganized and its +behavior was not unified. Some procs would call their parent procs, some +wouldn't. Some would send out signals at the right time, some wouldn't. The +attack chain refactor unified all this behavior, but it did not do it across the +entire codebase, all at once. + +Instead, a separate codepath was introduced, and all existing uses of the attack +chain were placed in separate procs. These are easily identified by procs which +contain `legacy__attackchain` in the name. The goal is to move all uses of the +legacy attack chain onto the new one, but it would be infeasible to attempt to +do this all at once. + +Anyone can choose to migrate attack chains if they so desire to help complete +the migration. + +> [!NOTE] +> +> If you are working in code that touches the legacy attack chain, it is +> expected that you migrate the code to the new attack chain first. + +## Performing Migrations + +Procs with the `__legacy__attackchain` suffix must be carefully understood in +order to migrate them properly. This is not just a matter of renaming procs; it +is expected that a migration preserve all existing behavior while fixing any +potential bugs that were a result of the original implementation. + +There are several important points: + +1. Any subtype which is being migrated must have all of its parent types (up to + but not including `/obj/item`) migrated as well. If you are migrating + `/obj/item/foo/bar/baz/proc/attacked_by__legacy__attackchain()`, then you + must also migrate `/obj/item/foo/bar/proc/attacked_by__legacy__attackchain()` + and `/obj/item/foo/proc/attacked_by__legacy__attackchain()`. +2. Once a tree of items has been updated to the new attack chain, its + `new_attack_chain` var must be set to `TRUE`. +3. All legacy attack chain procs in an object tree must be migrated at once. + +While this may seem overwhelming, the good news is that most migrations are +straightforward, and because you are only migrating a small part of the codebase +at a time, it is easy to test the results. + +In order to make this process easier, we'll examine some sample migrations that +have already been performed. + +### `attackby` + +`attackby` is used in cases when an item needs to respond to another item being +used on it. These can be fairly straightforward if the type tree is shallow and +the number of interactions is small. + +Our example migration is `/obj/vehicle`. This type tree only requires migrating: + +- `/obj/vehicle/proc/attackby__legacy__attackchain` +- `/obj/vehicle/janicart/proc/attackby__legacy__attackchain` + +First, let's look at `/obj/vehicle/attackby__legacy__attackchain`: + +```dm +/obj/vehicle/attackby__legacy__attackchain(obj/item/I, mob/user, params) + if(key_type && !is_key(inserted_key) && is_key(I)) + if(user.drop_item()) + I.forceMove(src) + to_chat(user, "You insert [I] into [src].") + if(inserted_key) //just in case there's an invalid key + inserted_key.forceMove(drop_location()) + inserted_key = I + else + to_chat(user, "[I] seems to be stuck to your hand!") + return + if(istype(I, /obj/item/borg/upgrade/vtec) && vehicle_move_delay > 1) + vehicle_move_delay = 1 + qdel(I) + to_chat(user, "You upgrade [src] with [I].") + return + return ..() +``` + +The logic here is pretty straightforward. We check to see if the user is +attempting to insert a key, if there's already one in the vehicle, and if the +key can be dropped by the user. We also check to see if the user is attempting +to install the VTEC upgrade. Otherwise we return control to the parent. + +Now let's look at `/obj/vehicle/janicart/attackby__legacy__attackchain`: + +```dm +/obj/vehicle/janicart/attackby(obj/item/I, mob/user, params) + var/fail_msg = "There is already one of those in [src]." + + if(istype(I, /obj/item/storage/bag/trash)) + if(mybag) + to_chat(user, fail_msg) + return + if(!user.drop_item()) + return + to_chat(user, "You hook [I] onto [src].") + I.forceMove(src) + mybag = I + update_icon(UPDATE_OVERLAYS) + return + if(istype(I, /obj/item/borg/upgrade/floorbuffer)) + if(buffer_installed) + to_chat(user, fail_msg) + return + buffer_installed = TRUE + qdel(I) + to_chat(user,"You upgrade [src] with [I].") + update_icon(UPDATE_OVERLAYS) + return + if(istype(I, /obj/item/borg/upgrade/vtec) && floorbuffer) + floorbuffer = FALSE + vehicle_move_delay -= buffer_delay + return ..() //VTEC installation is handled in parent attackby, so we're returning to it early + if(mybag && user.a_intent == INTENT_HELP && !is_key(I)) + mybag.attackby(I, user) + else + return ..() +``` + +Here the logic is a bit more complex, but has a basic structure: we check to see +what kind of thing the janicart is being attacked with. If it's a trash bag or +floor buffer, we attach it. If it's VTEC upgrade we remove the floorbuffer and +return control to the parent for installing the VTEC. If there's a bag and the +user is clicking on it with anything else with help intent, attempt to put it in +the bag. Otherwise, return control to the parent. + +Most of this logic will work just fine as is, with the exception that we will +need to return `FINISH_ATTACK` in the appropriate places when we want the attack +chain to stop. + +We also need to refactor the code regarding VTEC installation: because one +subtype does something different in reaction to the installation, we will pull +that into its own proc, rather than try to rely on a back-and-forth between +parent and child `attack_by`. + +At the end of `/obj/vehicle/attack_by`: + +```diff + to_chat(user, "[I] seems to be stuck to your hand!") + return +- if(istype(I, /obj/item/borg/upgrade/vtec) && vehicle_move_delay > 1) +- vehicle_move_delay = 1 +- qdel(I) +- to_chat(user, "You upgrade [src] with [I].") +- return +- return ..() ++ if(istype(I, /obj/item/borg/upgrade/vtec) && install_vtec(I, user)) ++ return FINISH_ATTACK +``` + +And then: + +```diff ++/obj/vehicle/proc/install_vtec(obj/item/borg/upgrade/vtec/vtec, mob/user) ++ if(vehicle_move_delay > 1) ++ vehicle_move_delay = 1 ++ qdel(vtec) ++ to_chat(user, "You upgrade [src] with [vtec].") ++ ++ return TRUE +``` + +Now, since we know the parent `attack_by` will get called first, we don't need +to check for an attempted VTEC installation in the janicart at all. We just need +to react to it properly: + +```diff ++/obj/vehicle/janicart/install_vtec(obj/item/borg/upgrade/vtec/vtec, mob/user) ++ if(..() && floorbuffer) ++ floorbuffer = FALSE ++ vehicle_move_delay -= buffer_delay ++ ++ return TRUE +``` + +That is: if the VTEC installation was successful, we remove the floorbuffer and +its delay. We want to return `TRUE` at the end no matter what, because this is +the indication not that the VTEC installation was succesful, but that it was +attempted, and thus the rest of the attack chain is not necessary. + +We make sure to include: + +```diff ++ if(..()) ++ return FINISH_ATTACK +``` + +At the top of each `attack_by` proc, and set `new_attack_chain = TRUE` on +`/obj/vehicle.` + +> [!NOTE] +> +> An advantage of migrating the attack chain procs piecemeal is that each PR +> requires less testing relative to the whole, but this testing must still +> occur. +> +> It is important to come up with a comprehensive list of things to test for +> each migration PR. For the above migration, an example set of tasks might +> include: +> +> - Testing that bags can be attached to janicarts +> - Testing that players can get on and off all vehicles +> - Testing that keys can be inserted into vehicles +> - Testing that only the correct keys can be inserted into vehicles +> - Testing attacking vehicles with other objects +> - Testing adding the floor buffer to janicarts +> - Testing adding VTEC to vehicles +> - Come up with your own test cases! +> +> The valuable thing about keys and attacks with other objects is because +> they're not part of the new attack chain yet. This helps to ensure the legacy +> and new attack chains are interacting with each other properly, as well. + +### `attack_self` + +`attack_self` is, typically, not part of the chain's attack phase at all. In the +new attack chain, the proc is called `activate_self` to reflect this. + +Let's examine the case of airlock electronics, `/obj/item/airlock_electronics`. +This is a good example because it has no parent types we need to migrate. Here +is the proc before the migration: + +```dm +/obj/item/airlock_electronics/attack_self__legacy__attackchain(mob/user) + if(!ishuman(user) && !isrobot(user)) + return ..() + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.getBrainLoss() >= max_brain_damage) + to_chat(user, "You forget how to use [src].") + return + ui_interact(user) +``` + +There's a couple things to note here: + +1. Currently, the parent proc is only called if the player is in a mob that + isn't meant to interact with the electronics; which means the signal + `COMSIG_ACTIVATE_SELF` is only sent if the electronics _aren't_ activated by + the user! +2. The behavior regarding brain damage and being unable to use the electronics + seems like it would be much more useful if generalized into a component, but + we can ignore that for now. + +The first thing we do is ensure that the parent proc is called at the correct +time, and correctly respond to its requests if the interaction should be cancelled: + +```diff +/obj/item/airlock_electronics/attack_self__legacy__attackchain(mob/user) ++ if(..()) ++ return + + if(!ishuman(user) && !isrobot(user)) + return ..() +``` + +Secondly, we can pull the other guard clause into the conditional, since it +returns in the same manner: + +```diff +/obj/item/airlock_electronics/attack_self__legacy__attackchain(mob/user) +- if(..()) ++ if(..() || (!ishuman(user) && !isrobot(user))) + return + +- if(!ishuman(user) && !isrobot(user)) +- return ..() +``` + +Then, we rename the proc: + +```diff +-/obj/item/airlock_electronics/attack_self__legacy__attackchain(mob/user) ++/obj/item/airlock_electronics/activate_self(mob/user) +``` + +And, importantly, we change the value of `var/new_attack_chain` in the +object declaration to let the attack chain know to use the new proc: + +```diff +/obj/item/airlock_electronics + name = "airlock electronics" + icon = 'icons/obj/doors/door_assembly.dmi' + // ... + ++ new_attack_chain = TRUE +``` + +The migration is complete. The proc now looks like this: + +```dm +/obj/item/airlock_electronics/activate_self(mob/user) + if(..() || (!ishuman(user) && !isrobot(user))) + return + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.getBrainLoss() >= max_brain_damage) + to_chat(user, "You forget how to use [src].") + return + ui_interact(user) +``` + +### `attack` + +Let's now look at a more complex example, the cult dagger, +`/obj/item/melee/cultblade/dagger`. This is the code as it exists before the +migration: + +```dm +/obj/item/melee/cultblade/dagger/attack__legacy__attackchain(mob/living/M, mob/living/user) + if(IS_CULTIST(M)) + if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion + if(M == user) // Targeting yourself + to_chat(user, "You can't remove holy water from yourself!") + else // Targeting someone else + to_chat(user, "You remove the taint from [M].") + to_chat(M, "[user] removes the taint from your body.") + M.reagents.del_reagent("holywater") + add_attack_logs(user, M, "Hit with [src], removing the holy water from them") + return FALSE + else + var/datum/status_effect/cult_stun_mark/S = M.has_status_effect(STATUS_EFFECT_CULT_STUN) + if(S) + S.trigger() + . = ..() +``` + +Because the dagger has a parent proc, let's also examine that: + +```dm +/obj/item/melee/cultblade/attack__legacy__attackchain(mob/living/target, mob/living/carbon/human/user) + if(!IS_CULTIST(user)) + user.Weaken(10 SECONDS) + user.unEquip(src, 1) + user.visible_message("A powerful force shoves [user] away from [target]!", + "\"You shouldn't play with sharp things. You'll poke someone's eye out.\"") + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_damage(rand(force/2, force), BRUTE, pick("l_arm", "r_arm")) + else + user.adjustBruteLoss(rand(force/2, force)) + return + if(!IS_CULTIST(target)) + var/datum/status_effect/cult_stun_mark/S = target.has_status_effect(STATUS_EFFECT_CULT_STUN) + if(S) + S.trigger() + ..() +``` + +There are several codepaths happening here: + +1. If a non-cultist attacks with the dagger, they are forced to drop it, gain + several status effects, and receive brute damage. +2. If a cultist attacks another cultist, it removes holy water from the target. + If the target has no holy water in them, it does nothing. +3. If a cultist attacks a non-cultist, and the non-cultist has a cult-stun + status effect, it is prolonged. + +Several issues should become apparent while reading through this. First let's +determine when the root `attack()` proc is actually called: + +1. In `cultblade/dagger/attack()`, there is an early return if the target is a cultist. +2. In `cultblade/attack()`, there is an early return if the user is _not_ a cultist. + +This means that we only wish to follow through with an attack if the user is a +cultist and the target is not. This suggests to us that the code for the first +two codepaths above should come before the `attack()`, logically, the +`pre_attack()`. + +(You may also notice a bug in the code. We'll point it out below but see if you +can spot it yourself.) + +The first thing we'll do is handle the first codepath, in the dagger's parent +type: + +```diff +-/obj/item/melee/cultblade/attack__legacy__attackchain(mob/living/target, mob/living/carbon/human/user) ++/obj/item/melee/cultblade/pre_attack(atom/target, mob/living/user, params) ++ if(..()) ++ return FINISH_ATTACK + + if(!IS_CULTIST(user)) + // ... + ++ return FINISH_ATTACK +``` + +We return early if our parent proc asks us to, and we return early if the user +isn't a cultist, because the user can't perform an attack. + +We adjust the attack proc itself to check its parent, and perform the cult-stun +trigger. We return nothing to let the attack chain know to continue: + +```diff ++/obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user) ++ if(..()) ++ return FINISH_ATTACK ++ + if(!IS_CULTIST(target)) + var/datum/status_effect/cult_stun_mark/S = target.has_status_effect(STATUS_EFFECT_CULT_STUN) + if(S) + S.trigger() +- ..() +``` + +Then we'll handle the dagger itself. Again, we want to cancel the attack chain +if a cultist user is attacking a cultist target, one way or another: + +```diff +-/obj/item/melee/cultblade/dagger/attack(mob/living/M, mob/living/user) +- if(IS_CULTIST(M)) +- if(M.reagents && M.reagents.has_reagent("holywater")) +- if(M == user) // Targeting yourself ++/obj/item/melee/cultblade/dagger/pre_attack(atom/target, mob/living/user, params) ++ if(..()) ++ return FINISH_ATTACK ++ ++ if(IS_CULTIST(target)) ++ if(target.reagents && target.reagents.has_reagent("holywater")) ++ if(target == user) // Targeting yourself + + // ... + ++ return FINISH_ATTACK +``` + +By regularly calling the parent proc first, it's easier to think through the +process of what's happening. It's much easier to tell that the parent proc +handles failed attacks by non-cultists first, and only if that's not the case +does the holy-water removal behavior run. Since we know we're not a non-cultist +at this point, we don't need to perform a second check for that, either. + +This also fixes a bug in the original code. Because the code to re-trigger +cult-stuns on targets was duplicated in both attack procs, it was being called +twice. It's now much easier to tell when that is happening. + +The resultant code looks like this: + +```dm +/obj/item/melee/cultblade/pre_attack(atom/target, mob/living/user, params) + if(..()) + return FINISH_ATTACK + + if(!IS_CULTIST(user)) + user.Weaken(10 SECONDS) + user.unEquip(src, 1) + user.visible_message("A powerful force shoves [user] away from [target]!", + "\"You shouldn't play with sharp things. You'll poke someone's eye out.\"") + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_damage(rand(force/2, force), BRUTE, pick("l_arm", "r_arm")) + else + user.adjustBruteLoss(rand(force/2, force)) + + return FINISH_ATTACK + +/obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user) + if(..()) + return FINISH_ATTACK + + if(!IS_CULTIST(target)) + var/datum/status_effect/cult_stun_mark/S = target.has_status_effect(STATUS_EFFECT_CULT_STUN) + if(S) + S.trigger() + +/obj/item/melee/cultblade/dagger/pre_attack(atom/target, mob/living/user, params) + if(..()) + return FINISH_ATTACK + + if(IS_CULTIST(target)) + if(target.reagents && target.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion + if(target == user) // Targeting yourself + to_chat(user, "You can't remove holy water from yourself!") + + else // Targeting someone else + to_chat(user, "You remove the taint from [target].") + to_chat(target, "[user] removes the taint from your body.") + target.reagents.del_reagent("holywater") + add_attack_logs(user, target, "Hit with [src], removing the holy water from them") + + return FINISH_ATTACK +``` + +Not only is it much easier to read and understand what is happening, it is also +divided up into smaller, more manageable procs with clear names to explain the +sequence of events. Finally, because we constantly check the parent proc, all +signals that are expected to be sent, are, so any other components or listeners +can take appropriate action and cancel the attack chain themselves, if requested. + +## Migration Helpers + +There are two important tools which can help make the migration process easier: +the _migration plan checker_ and the _attack chain CI checks_. + +### Migration Plan Checker + +If you are making a code change and need to update the attack chain on an +object, the migration plan checker will tell you what other types will need to +be migrated in the same PR. For example, if I wanted to migrate `/turf/simulated/wall/cult`, I could rune the migration plan checker at the command line: + +``` +$ python .\tools\migrate_attack_chain.py /turf/simulated/wall/cult +Migration Plan for Path /turf/simulated/wall/cult +Required Additional Migrations: + /turf + /turf/simulated/floor + /turf/simulated/floor/chasm + /turf/simulated/floor/grass + /turf/simulated/floor/holofloor + /turf/simulated/floor/indestructible + /turf/simulated/floor/lava + /turf/simulated/floor/lava/lava_land_surface/plasma + /turf/simulated/floor/light + /turf/simulated/floor/mineral/bananium + /turf/simulated/floor/mineral/plasma + /turf/simulated/floor/mineral/uranium + /turf/simulated/floor/plating + /turf/simulated/floor/plating/asteroid + /turf/simulated/floor/plating/metalfoam + /turf/simulated/floor/vines + /turf/simulated/mineral + /turf/simulated/mineral/ancient + /turf/simulated/mineral/ancient/lava_land_surface_hard + /turf/simulated/mineral/ancient/outer + /turf/simulated/wall + /turf/simulated/wall/indestructible + /turf/simulated/wall/mineral/plasma + /turf/simulated/wall/mineral/uranium + /turf/simulated/wall/mineral/wood + /turf/simulated/wall/r_wall + /turf/space + /turf/space/transit +Toggle `new_attack_chain = TRUE` on: + /turf +``` + +You can see the output shows two things: + +1. The list of other types that will need to be migrated at the same time, and +2. The type that `new_attack_chain` should be set to TRUE after the migration is + complete. + +This means that instead of just migrating `/turf/simulated/wall/cult`, we will +be migrating 28 types. This is a lot! A migration of this size is not recommended +for new contributors. On the other hand, let us examine migrating wirecutters: + +``` +$ python .\tools\migrate_attack_chain.py /obj/item/wirecutters +Migration Plan for Path /obj/item/wirecutters +Required Additional Migrations: + /obj/item/wirecutters + /obj/item/wirecutters/power +Toggle `new_attack_chain = TRUE` on: + /obj/item/wirecutters +``` + +If we wanted to migrate `/obj/item/wirecutters`, we only need to migrate that +type and one other, the power wirecutters. This is a much more manageable +migration for novice contributors. + +### Attack Chain CI Checks + +The attack chain CI checks are run when a pull request is opened or modified. It +provides a high-level overview of how complete a migration is. These checks will: + +- Ensure that anything marked with `new_attack_chain = TRUE` does not override + any legacy attack chain procs +- Ensure that all of the objects required in a specific type migration have been + migrated +- Ensure that any other types that call attack chain methods on migrated types + no longer call legacy attack chain procs. + +Let's look at our wirecutters example again. If we were simply to set +`new_attack_chain = TRUE` on `/obj/item/wirecutters` without making any other +code changes, the CI check will return something like this: + +``` +check_legacy_attack_chain started +new_attack_chain on /obj/item/wirecutters still has legacy procs: + attack__legacy__attackchain +new_attack_chain on /obj/item/wirecutters/power still has legacy procs: + attack_self__legacy__attackchain +check_legacy_attack_chain tests completed in 5.06s +``` + +This makes it clear that both types in the type chain marked as new still have +legacy procs that need to be migrated. + +Let's return to our `/turf` example. You can see in the output from the +Migration Plan Checker that if we were to migrate `/turf/simulated/wall/cult` +that `new_attack_chain` should be set to `TRUE` on `/turf` itself. What if we +were to ignore that, and not make any other changes but to set +`new_attack_chain` to `TRUE` on `/turf/simulated/wall`? + +The CI check will return something like this: + +``` +check_legacy_attack_chain started +new_attack_chain on /turf/simulated/mineral still has legacy procs: + attackby__legacy__attackchain +new_attack_chain on /turf/simulated/mineral but related type /turf is not +Call sites requiring migration: +code\game\turfs\simulated\minerals.dm:139: /turf/simulated/mineral/Bumped(...) calls attackby__legacy__attackchain(...) on var /turf/simulated/mineral/src +code\game\turfs\simulated\minerals.dm:133: /turf/simulated/mineral/Bumped(...) calls attackby__legacy__attackchain(...) on var /turf/simulated/mineral/src +code\game\turfs\simulated\minerals.dm:131: /turf/simulated/mineral/Bumped(...) calls attackby__legacy__attackchain(...) on var /turf/simulated/mineral/src +new_attack_chain on /turf/simulated/mineral/ancient still has legacy procs: + attackby__legacy__attackchain +new_attack_chain on /turf/simulated/mineral/ancient but related type /turf is not +new_attack_chain on /turf/simulated/mineral/ancient/lava_land_surface_hard still has legacy procs: + attackby__legacy__attackchain +new_attack_chain on /turf/simulated/mineral/ancient/lava_land_surface_hard but related type /turf is not +new_attack_chain on /turf/simulated/mineral/ancient/outer still has legacy procs: + attackby__legacy__attackchain +new_attack_chain on /turf/simulated/mineral/ancient/outer but related type /turf is not +new_attack_chain on /turf/simulated/mineral/clown but related type /turf is not +new_attack_chain on /turf/simulated/mineral/random but related type /turf is not +new_attack_chain on /turf/simulated/mineral/random/high_chance but related type /turf is not +new_attack_chain on /turf/simulated/mineral/random/high_chance/clown but related type /turf is not +new_attack_chain on /turf/simulated/mineral/random/high_chance/volcanic but related type /turf is not +new_attack_chain on /turf/simulated/mineral/random/labormineral but related type /turf is not +new_attack_chain on /turf/simulated/mineral/random/low_chance but related type /turf is not +new_attack_chain on /turf/simulated/mineral/random/volcanic but related type /turf is not +new_attack_chain on /turf/simulated/mineral/random/volcanic/labormineral but related type /turf is not +new_attack_chain on /turf/simulated/mineral/volcanic but related type /turf is not +new_attack_chain on /turf/simulated/mineral/volcanic/clown but related type /turf is not +new_attack_chain on /turf/simulated/mineral/volcanic/lava_land_surface but related type /turf is not +check_legacy_attack_chain tests completed in 5.51s +``` + +There is a lot of output here, but it should be straightforward to understand: + +1. First, it tells you that `/turf/simulated/wall` (the type we changed to + `new_attack_chain`) still has legacy procs. That check is straightforward. +2. Then, it tells you that a parent type, `/turf`, is not on the new attack + chain, despite one of its subtypes being so. +3. There is a set of "call sites requiring migration": these let you know that + there are procs that make calls to legacy attack chain procs on a type that + we've marked as migrated. In this case, they are all on turf instances, but + they may be anywhere in the codebase. +4. Finally, it performs the same checks as above to other related types. + +This makes it clear that there are many more steps that must be performed before +the migration is complete. diff --git a/docs/references/images/attack_chain_flowchart.drawio b/docs/references/images/attack_chain_flowchart.drawio new file mode 100644 index 0000000000000..385bc4e9ba4ee --- /dev/null +++ b/docs/references/images/attack_chain_flowchart.drawio @@ -0,0 +1,909 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/references/images/attack_chain_flowchart.png b/docs/references/images/attack_chain_flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..1339bd8fef0516276ef2d9549ab2af33a6968aa9 GIT binary patch literal 964338 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�+}n`pP|nEGOWyL+qrE3)asxW}wU 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�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

WZtKMMR+9 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

nIHZ+X)kX=l+`YwaKkh<19 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 PA5%?jzM#4LdMpfuK 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�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 literal 0 HcmV?d00001 diff --git a/mkdocs.yml b/mkdocs.yml index abe447dda8b0b..8d2160d6a3d9d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -36,6 +36,7 @@ plugins: - social: cards_layout_options: background_color: '#861f41' + - glightbox markdown_extensions: - admonition @@ -97,3 +98,4 @@ nav: - 'Advanced Bitflags': './references/adv_bitflags.md' - 'Using Feedback Data': './references/feedback_data.md' - 'Tick Order': './references/tick_order.md' + - 'Attack Chain': './references/attack_chain.md' diff --git a/paradise.dme b/paradise.dme index d544ef151278e..2028cf966b98f 100644 --- a/paradise.dme +++ b/paradise.dme @@ -146,6 +146,7 @@ #include "code\__DEFINES\zlevel_defines.dm" #include "code\__DEFINES\zoom.dm" #include "code\__DEFINES\dcs\atom_signals.dm" +#include "code\__DEFINES\dcs\attack_chain_signals.dm" #include "code\__DEFINES\dcs\basetype_signals.dm" #include "code\__DEFINES\dcs\carbon_signals.dm" #include "code\__DEFINES\dcs\datum_signals.dm" @@ -232,6 +233,7 @@ #include "code\_onclick\cyborg.dm" #include "code\_onclick\drag_drop.dm" #include "code\_onclick\item_attack.dm" +#include "code\_onclick\item_attack_legacy.dm" #include "code\_onclick\observer_onclick.dm" #include "code\_onclick\other_mobs.dm" #include "code\_onclick\overmind_onclick.dm" @@ -714,6 +716,7 @@ #include "code\game\area\ss13_areas\service_areas.dm" #include "code\game\area\ss13_areas\station_area.dm" #include "code\game\area\ss13_areas\supply_areas.dm" +#include "code\game\atom\atom_tool_acts.dm" #include "code\game\dna\dna2.dm" #include "code\game\dna\dna2_domutcheck.dm" #include "code\game\dna\dna2_helpers.dm" diff --git a/tools/ci/check_legacy_attack_chain.py b/tools/ci/check_legacy_attack_chain.py new file mode 100644 index 0000000000000..5804a0235a052 --- /dev/null +++ b/tools/ci/check_legacy_attack_chain.py @@ -0,0 +1,182 @@ +import os +import sys +import time +from dataclasses import dataclass +from collections import namedtuple, defaultdict + +from avulto import DMM, DME, DMI, Dir, Path as p, paths, ProcDecl, TypeDecl +from avulto.ast import NodeKind +from avulto import exceptions + + +RED = "\033[0;31m" +GREEN = "\033[0;32m" +BLUE = "\033[0;34m" +NC = "\033[0m" # No Color + + +@dataclass(frozen=True) +class AttackChainCall: + proc_decl: ProcDecl + var_name: str + var_type: p | None + call_name: str + source_info: any + + def make_error_message(self): + return f"{self.proc_decl.type_path}/{self.proc_decl.name}(...) calls {self.call_name}(...) on var {self.var_type}/{self.var_name}" + + def format_error(self): + if os.getenv("GITHUB_ACTIONS") == "true": + return f"::error file={self.source_info.file_path},line={self.source_info.line},title=Attack Chain::{self.source_info.file_path}:{self.source_info.line}: {RED}{self.make_error_message()}{NC}" + + else: + return f"{self.source_info.file_path}:{self.source_info.line}: {RED}{self.make_error_message()}{NC}" + + +# Walker for determining if a proc contains any calls to a legacy attack chain +# proc on an object that is in the type tree of our migrating type. +# +# We check local, proc-argument, and type-declaration scope to find variables of +# matching names for when an attack chain proc is called, and attempt to find +# that variable's matching type. If the type matches, then the call site is +# calling a legacy proc on that type. +class AttackChainCallWalker: + def __init__(self, type_decl: TypeDecl, proc_decl: ProcDecl): + self.type_decl = type_decl + self.proc_decl = proc_decl + self.local_vars = dict() + self.attack_chain_calls = list() + + def get_var_type(self, name): + if name == "src": + return self.type_decl.path + if name in self.local_vars: + return self.local_vars[name] + for arg in self.proc_decl.args: + if arg.arg_name == name: + return arg.arg_type + + try: + vd = self.type_decl.var_decl(name, parents=True) + if vd.declared_type: + return vd.declared_type + except: + pass + + return None + + def add_attack_call(self, var_name, chain_call, source_info): + var_type = self.get_var_type(var_name) + CALLS[var_type].add( + AttackChainCall( + self.proc_decl, + var_name, + self.get_var_type(var_name), + chain_call, + source_info, + ) + ) + + def visit_Var(self, node, source_info): + self.local_vars[str(node.name)] = node.declared_type + + def visit_Expr(self, node, source_info): + if node.kind == NodeKind.CALL: + if "__legacy__attackchain" in node.name.name: + if node.expr: + if node.expr.kind == NodeKind.IDENTIFIER: + self.add_attack_call( + str(node.expr), node.name.name, source_info + ) + elif node.expr.kind == NodeKind.CONSTANT: + if not node.expr.constant.val: + self.add_attack_call("src", node.name.name, source_info) + + +# Ignored types will never be part of the attack chain. +IGNORED_TYPES = [ + p("/area"), + p("/client"), + p("/database"), + p("/datum"), + p("/dm_filter"), + p("/exception"), + p("/generator"), + p("/icon"), + p("/image"), + p("/matrix"), + p("/mutable_appearance"), + p("/particles"), + p("/regex"), + p("/sound"), +] + +# Assisted types are the ones which actually perform negotiation between old/new +# attack chains, and will not be migrated until everything else is. +ASSISTED_TYPES = [ + p("/atom"), + p("/mob"), + p("/obj"), + p("/obj/item"), +] + + +if __name__ == "__main__": + print("check_legacy_attack_chain started") + + exit_code = 0 + start = time.time() + + CALLS = defaultdict(set) + SETTING_CACHE = dict() + LEGACY_PROCS = dict() + BAD_TREES = dict() + PROCS = dict() + + dme = DME.from_file("paradise.dme", parse_procs=True) + + for pth in dme.subtypesof("/"): + td = dme.types[pth] + if any( + [ + pth.child_of(assisted_type, strict=True) + for assisted_type in ASSISTED_TYPES + ] + ): + try: + SETTING_CACHE[pth] = bool( + td.var_decl("new_attack_chain", parents=True).const_val + ) + except: + SETTING_CACHE[pth] = False + LEGACY_PROCS[pth] = { + x for x in td.proc_names(modified=True) if "__legacy__attackchain" in x + } + for proc_decl in td.proc_decls(): + walker = AttackChainCallWalker(td, proc_decl) + proc_decl.walk(walker) + + for pth, new_attack_chain in SETTING_CACHE.items(): + cursor = pth + if new_attack_chain: + if LEGACY_PROCS[pth]: + exit_code = 1 + print(f"new_attack_chain on {pth} still has legacy procs:") + for proc in sorted(LEGACY_PROCS[pth]): + print(f"\t{proc}") + while cursor not in ASSISTED_TYPES and not cursor.is_root: + if LEGACY_PROCS[cursor] and not SETTING_CACHE[cursor]: + exit_code = 1 + print(f"new_attack_chain on {pth} but related type {cursor} is not") + cursor = cursor.parent + if pth in CALLS: + exit_code = 1 + print("Call sites requiring migration:") + for call in CALLS[pth]: + print(call.format_error()) + + end = time.time() + print(f"check_legacy_attack_chain tests completed in {end - start:.2f}s\n") + + sys.exit(exit_code) diff --git a/tools/migrate_attack_chain.py b/tools/migrate_attack_chain.py new file mode 100644 index 0000000000000..0e80d383f139d --- /dev/null +++ b/tools/migrate_attack_chain.py @@ -0,0 +1,100 @@ +from dataclasses import dataclass, field +import sys + +from avulto import DME, Path as p + + +@dataclass(frozen=True) +class MigrationPlan: + target_path: p + toggle_on: p + additional_paths: list[p] = field(default_factory=list) + + +ASSISTED_PATHS = [ + p("/obj"), + p("/obj/item"), + p("/mob"), + p("/mob/living"), + p("/atom"), +] + + +def has_legacy_procs(dme: DME, pth: p) -> bool: + td = dme.type_decl(pth) + proc_names = td.proc_names(modified=True) + return any([x for x in proc_names if "legacy__attackchain" in x]) + + +def get_migration_plan( + dme: DME, target_path: p, checked_types: set | None = None +) -> None | MigrationPlan: + if checked_types is None: + checked_types = set() + td = dme.type_decl(target_path) + new_attack_chain = td.var_decl("new_attack_chain", parents=True) + if new_attack_chain.const_val: + print( + f"Type {target_path} appears to be migrated already. Run CI tests to confirm valid migration." + ) + return + + additional_paths = set() + for subtype in dme.subtypesof(target_path): + if has_legacy_procs(dme, subtype): + additional_paths.add(subtype) + if subtype not in checked_types: + checked_types.add(subtype) + migration_plan = get_migration_plan(dme, subtype, checked_types) + if migration_plan: + additional_paths.update(migration_plan.additional_paths) + + toggle_on = target_path + parent = target_path + while not any([parent == x for x in ASSISTED_PATHS]): + parent = parent.parent + if not has_legacy_procs(dme, parent): + continue + if parent in ASSISTED_PATHS: + continue + + toggle_on = parent + if parent not in checked_types: + checked_types.add(parent) + migration_plan = get_migration_plan(dme, parent, checked_types) + if migration_plan: + additional_paths.update(migration_plan.additional_paths) + + additional_paths.add(parent) + + return MigrationPlan( + target_path=target_path, + toggle_on=toggle_on, + additional_paths=additional_paths, + ) + + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("usage: migrate_attack_chain.py /target/path") + sys.exit(1) + dme = DME.from_file("paradise.dme") + target_path = p(sys.argv[1]) + + if not target_path.child_of("/atom"): + print(f"Type {target_path} is not an atom.") + sys.exit(1) + if target_path in ASSISTED_PATHS: + print(f"Type {target_path} should not be migrated.") + sys.exit(1) + + migration_plan = get_migration_plan(dme, target_path) + if migration_plan: + print(f"Migration Plan for Path {target_path}") + if migration_plan.additional_paths: + print("Required Additional Migrations:") + for addl_path in sorted(migration_plan.additional_paths): + print(f"\t{addl_path}") + else: + print("No Additional Migrations Required") + print(f"Toggle `new_attack_chain = TRUE` on:\n\t{migration_plan.toggle_on}") diff --git a/tools/requirements.txt b/tools/requirements.txt index 98e5e48cab09d..751e8771deeb3 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -6,3 +6,6 @@ json5==0.9.14 # changelogs PyYaml==6.0.1 # maplint also beautifulsoup4==4.12.2 + +# various CI checks +avulto==0.1.4