diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm index 2c1e548f80a..92ff8502ef7 100644 --- a/code/game/machinery/newscaster/newscaster_machine.dm +++ b/code/game/machinery/newscaster/newscaster_machine.dm @@ -490,15 +490,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30) . = ..() update_appearance() -/obj/machinery/newscaster/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) - if(istype(attacking_item, /obj/item/paper)) - if(!user.temporarilyRemoveItemFromInventory(attacking_item)) - return - paper_remaining++ - to_chat(user, span_notice("You insert [attacking_item] into [src]! It now holds [paper_remaining] sheet\s of paper.")) - qdel(attacking_item) - return - return ..() +/obj/machinery/newscaster/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/paper)) + return NONE + if(!user.temporarilyRemoveItemFromInventory(tool)) + return ITEM_INTERACT_BLOCKING + paper_remaining++ + to_chat(user, span_notice("You insert [tool] into [src]! It now holds [paper_remaining] sheet\s of paper.")) + qdel(tool) + return ITEM_INTERACT_SUCCESS ///returns (machine_stat & broken) /obj/machinery/newscaster/proc/needs_repair() diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 7c8e0b642b4..0fafff15822 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -151,14 +151,13 @@ ui = new(user, src, "PipeDispenser", name) ui.open() -/obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) +/obj/machinery/pipedispenser/item_interaction(mob/living/user, obj/item/tool, list/modifiers) add_fingerprint(user) - if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter)) - to_chat(usr, span_notice("You put [W] back into [src].")) - qdel(W) - return - else - return ..() + if (!istype(tool, /obj/item/pipe) && !istype(tool, /obj/item/pipe_meter)) + return NONE + to_chat(usr, span_notice("You put [tool] back into [src].")) + qdel(tool) + return ITEM_INTERACT_SUCCESS /obj/machinery/pipedispenser/proc/verify_recipe(recipes, path) for(var/category in recipes) diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index 6b06894e010..4305dbb936c 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -42,157 +42,162 @@ if(PTURRET_START_EXTERNAL_ARMOUR) . += span_notice("The turret's armor needs to be welded in place, the armor looks like it could be pried off.") -/obj/machinery/porta_turret_construct/attackby(obj/item/used, mob/user, list/modifiers, list/attack_modifiers) +/obj/machinery/porta_turret_construct/item_interaction(mob/living/user, obj/item/tool, list/modifiers) //this is a bit unwieldy but self-explanatory switch(build_step) - if(PTURRET_UNSECURED) //first step - if(used.tool_behaviour == TOOL_WRENCH && !anchored) - used.play_tool_sound(src, 100) - to_chat(user, span_notice("You secure the external bolts.")) - set_anchored(TRUE) - build_step = PTURRET_BOLTED - return - - else if(used.tool_behaviour == TOOL_CROWBAR && !anchored) - used.play_tool_sound(src, 75) - to_chat(user, span_notice("You dismantle the turret construction.")) - new /obj/item/stack/sheet/iron(loc, 5) - qdel(src) - return - if(PTURRET_BOLTED) - if(istype(used, /obj/item/stack/sheet/iron)) - var/obj/item/stack/sheet/iron/sheet = used - if(sheet.use(2)) - to_chat(user, span_notice("You add some metal armor to the interior frame.")) - build_step = PTURRET_START_INTERNAL_ARMOUR - icon_state = "turret_frame2" - else - to_chat(user, span_warning("You need two sheets of iron to continue construction!")) - return - - else if(used.tool_behaviour == TOOL_WRENCH) - used.play_tool_sound(src, 75) - to_chat(user, span_notice("You unfasten the external bolts.")) - set_anchored(FALSE) - build_step = PTURRET_UNSECURED - return - - - if(PTURRET_START_INTERNAL_ARMOUR) - if(used.tool_behaviour == TOOL_WRENCH) - used.play_tool_sound(src, 100) - to_chat(user, span_notice("You bolt the metal armor into place.")) - build_step = PTURRET_INTERNAL_ARMOUR_ON - return - - else if(used.tool_behaviour == TOOL_WELDER) - if(!used.tool_start_check(user, amount = 5)) //uses up 5 fuel - return - - to_chat(user, span_notice("You start to remove the turret's interior metal armor...")) - - if(used.use_tool(src, user, 20, volume = 50, amount = 5)) //uses up 5 fuel - build_step = PTURRET_BOLTED - to_chat(user, span_notice("You remove the turret's interior metal armor.")) - new /obj/item/stack/sheet/iron(drop_location(), 2) - return - + if(!istype(tool, /obj/item/stack/sheet/iron)) + return NONE + var/obj/item/stack/sheet/iron/sheet = tool + if(!sheet.use(2)) + to_chat(user, span_warning("You need two sheets of iron to continue construction!")) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("You add some metal armor to the interior frame.")) + build_step = PTURRET_START_INTERNAL_ARMOUR + icon_state = "turret_frame2" + return ITEM_INTERACT_SUCCESS if(PTURRET_INTERNAL_ARMOUR_ON) - if(istype(used, /obj/item/gun/energy)) //the gun installation part - var/obj/item/gun/energy/egun = used - if(egun.gun_flags & TURRET_INCOMPATIBLE) - to_chat(user, span_notice("You don't think it would be right to add [used] to the turret")) - return - if(!user.transferItemToLoc(egun, src)) - return - installed_gun = egun - to_chat(user, span_notice("You add [used] to the turret.")) - build_step = PTURRET_GUN_EQUIPPED - return - else if(used.tool_behaviour == TOOL_WRENCH) - used.play_tool_sound(src, 100) - to_chat(user, span_notice("You remove the turret's metal armor bolts.")) - build_step = PTURRET_START_INTERNAL_ARMOUR - return + if(!istype(tool, /obj/item/gun/energy)) //the gun installation part + return NONE + var/obj/item/gun/energy/egun = tool + if(egun.gun_flags & TURRET_INCOMPATIBLE) + to_chat(user, span_notice("You don't think it would be right to add [tool] to the turret")) + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(egun, src)) + return ITEM_INTERACT_BLOCKING + installed_gun = egun + to_chat(user, span_notice("You add [tool] to the turret.")) + build_step = PTURRET_GUN_EQUIPPED + return ITEM_INTERACT_SUCCESS if(PTURRET_GUN_EQUIPPED) - if(isprox(used)) - build_step = PTURRET_SENSORS_ON - if(!user.temporarilyRemoveItemFromInventory(used)) - return - to_chat(user, span_notice("You add the proximity sensor to the turret.")) - qdel(used) - return - - - if(PTURRET_SENSORS_ON) - if(used.tool_behaviour == TOOL_SCREWDRIVER) - used.play_tool_sound(src, 100) - build_step = PTURRET_CLOSED - to_chat(user, span_notice("You close the internal access hatch.")) - return - + if(!isprox(tool)) + return NONE + build_step = PTURRET_SENSORS_ON + if(!user.temporarilyRemoveItemFromInventory(tool)) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("You add the proximity sensor to the turret.")) + qdel(tool) + return ITEM_INTERACT_SUCCESS if(PTURRET_CLOSED) - if(istype(used, /obj/item/stack/sheet/iron)) - var/obj/item/stack/sheet/iron/sheet = used - if(sheet.use(2)) - to_chat(user, span_notice("You add some metal armor to the exterior frame.")) - build_step = PTURRET_START_EXTERNAL_ARMOUR - else - to_chat(user, span_warning("You need two sheets of iron to continue construction!")) - return + if(!istype(tool, /obj/item/stack/sheet/iron)) + return NONE + var/obj/item/stack/sheet/iron/sheet = tool + if(!sheet.use(2)) + to_chat(user, span_warning("You need two sheets of iron to continue construction!")) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("You add some metal armor to the exterior frame.")) + build_step = PTURRET_START_EXTERNAL_ARMOUR + return ITEM_INTERACT_SUCCESS - else if(used.tool_behaviour == TOOL_SCREWDRIVER) - used.play_tool_sound(src, 100) - build_step = PTURRET_SENSORS_ON - to_chat(user, span_notice("You open the internal access hatch.")) - return + return NONE + +/obj/machinery/porta_turret_construct/wrench_act(mob/living/user, obj/item/tool) + switch(build_step) + if(PTURRET_UNSECURED) + tool.play_tool_sound(src, 100) + to_chat(user, span_notice("You secure the external bolts.")) + set_anchored(TRUE) + build_step = PTURRET_BOLTED + return ITEM_INTERACT_SUCCESS + + if(PTURRET_BOLTED) + tool.play_tool_sound(src, 75) + to_chat(user, span_notice("You unfasten the external bolts.")) + set_anchored(FALSE) + build_step = PTURRET_UNSECURED + return ITEM_INTERACT_SUCCESS + + if(PTURRET_START_INTERNAL_ARMOUR) + tool.play_tool_sound(src, 100) + to_chat(user, span_notice("You bolt the metal armor into place.")) + build_step = PTURRET_INTERNAL_ARMOUR_ON + return ITEM_INTERACT_SUCCESS + + if(PTURRET_INTERNAL_ARMOUR_ON) + tool.play_tool_sound(src, 100) + to_chat(user, span_notice("You remove the turret's metal armor bolts.")) + build_step = PTURRET_START_INTERNAL_ARMOUR + return ITEM_INTERACT_SUCCESS + + return ITEM_INTERACT_SKIP_TO_ATTACK + +/obj/machinery/porta_turret_construct/crowbar_act(mob/living/user, obj/item/tool) + switch(build_step) + if(PTURRET_UNSECURED) + tool.play_tool_sound(src, 75) + to_chat(user, span_notice("You dismantle the turret construction.")) + new /obj/item/stack/sheet/iron(loc, 5) + qdel(src) + return ITEM_INTERACT_SUCCESS if(PTURRET_START_EXTERNAL_ARMOUR) - if(used.tool_behaviour == TOOL_WELDER) - if(!used.tool_start_check(user, amount = 5)) - return + tool.play_tool_sound(src, 75) + to_chat(user, span_notice("You pry off the turret's exterior armor.")) + new /obj/item/stack/sheet/iron(loc, 2) + build_step = PTURRET_CLOSED + return ITEM_INTERACT_SUCCESS - to_chat(user, span_notice("You begin to weld the turret's armor down...")) - if(used.use_tool(src, user, 30, volume = 50, amount = 5)) - build_step = PTURRET_EXTERNAL_ARMOUR_ON - to_chat(user, span_notice("You weld the turret's armor down.")) + return ITEM_INTERACT_SKIP_TO_ATTACK - //The final step: create a full turret +/obj/machinery/porta_turret_construct/welder_act(mob/living/user, obj/item/tool) + switch(build_step) + if(PTURRET_START_INTERNAL_ARMOUR) + if(!tool.tool_start_check(user, amount = 5)) //uses up 5 fuel + return ITEM_INTERACT_BLOCKING - var/obj/machinery/porta_turret/turret - //fuck lasertag turrets - if(istype(installed_gun, /obj/item/gun/energy/laser/bluetag) || istype(installed_gun, /obj/item/gun/energy/laser/redtag)) - turret = new/obj/machinery/porta_turret/lasertag(loc) - else - turret = new/obj/machinery/porta_turret(loc) - turret.name = finish_name - turret.installation = installed_gun.type - turret.setup(installed_gun) - turret.locked = FALSE - qdel(src) - return + to_chat(user, span_notice("You start to remove the turret's interior metal armor...")) + if(!tool.use_tool(src, user, 20, volume = 50, amount = 5)) //uses up 5 fuel + return ITEM_INTERACT_BLOCKING + build_step = PTURRET_BOLTED + to_chat(user, span_notice("You remove the turret's interior metal armor.")) + new /obj/item/stack/sheet/iron(drop_location(), 2) + return ITEM_INTERACT_SUCCESS - else if(used.tool_behaviour == TOOL_CROWBAR) - used.play_tool_sound(src, 75) - to_chat(user, span_notice("You pry off the turret's exterior armor.")) - new /obj/item/stack/sheet/iron(loc, 2) - build_step = PTURRET_CLOSED - return + if(PTURRET_START_EXTERNAL_ARMOUR) + if(!tool.tool_start_check(user, amount = 5)) + return ITEM_INTERACT_BLOCKING - if(used.get_writing_implement_details()?["interaction_mode"] == MODE_WRITING) //you can rename turrets like bots! - var/choice = tgui_input_text(user, "Enter a new turret name", "Turret Classification", finish_name, max_length = MAX_NAME_LEN) - if(!choice) - return - if(!user.can_perform_action(src)) - return + to_chat(user, span_notice("You begin to weld the turret's armor down...")) + if(!tool.use_tool(src, user, 30, volume = 50, amount = 5)) + return ITEM_INTERACT_BLOCKING + build_step = PTURRET_EXTERNAL_ARMOUR_ON + to_chat(user, span_notice("You weld the turret's armor down.")) - finish_name = choice - return - return ..() + //The final step: create a full turret + + var/obj/machinery/porta_turret/turret + //fuck lasertag turrets + if(istype(installed_gun, /obj/item/gun/energy/laser/bluetag) || istype(installed_gun, /obj/item/gun/energy/laser/redtag)) + turret = new/obj/machinery/porta_turret/lasertag(loc) + else + turret = new/obj/machinery/porta_turret(loc) + turret.name = finish_name + turret.installation = installed_gun.type + turret.setup(installed_gun) + turret.locked = FALSE + qdel(src) + return ITEM_INTERACT_SUCCESS + + return ITEM_INTERACT_SKIP_TO_ATTACK + +/obj/machinery/porta_turret_construct/screwdriver_act(mob/living/user, obj/item/tool) + switch(build_step) + if(PTURRET_SENSORS_ON) + tool.play_tool_sound(src, 100) + build_step = PTURRET_CLOSED + to_chat(user, span_notice("You close the internal access hatch.")) + return ITEM_INTERACT_SUCCESS + + if(PTURRET_CLOSED) + tool.play_tool_sound(src, 100) + build_step = PTURRET_SENSORS_ON + to_chat(user, span_notice("You open the internal access hatch.")) + return ITEM_INTERACT_SUCCESS + + return ITEM_INTERACT_SKIP_TO_ATTACK /obj/machinery/porta_turret_construct/nameformat(input, user) finish_name = input diff --git a/code/game/machinery/porta_turret/turret_control.dm b/code/game/machinery/porta_turret/turret_control.dm index c1b436f3dcc..f08f35d477c 100644 --- a/code/game/machinery/porta_turret/turret_control.dm +++ b/code/game/machinery/porta_turret/turret_control.dm @@ -91,27 +91,30 @@ to_chat(user, span_notice("You link \the [multi_tool.buffer] with \the [src].")) return ITEM_INTERACT_SUCCESS -/obj/machinery/turretid/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) +/obj/machinery/turretid/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(machine_stat & BROKEN) - return + return NONE if (issilicon(user)) return attack_hand(user) - var/id = attacking_item.GetID() + var/card = tool.GetID() - if(isnull(id)) - return + if(isnull(card)) + return NONE - if (check_access(id)) - if(obj_flags & EMAGGED) - to_chat(user, span_warning("The turret control is unresponsive!")) - return - - locked = !locked - to_chat(user, span_notice("You [ locked ? "lock" : "unlock"] the panel.")) - else + if(!check_access(card)) to_chat(user, span_alert("Access denied.")) + return ITEM_INTERACT_BLOCKING + + if(obj_flags & EMAGGED) + to_chat(user, span_warning("The turret control is unresponsive!")) + return ITEM_INTERACT_BLOCKING + + locked = !locked + to_chat(user, span_notice("You [ locked ? "lock" : "unlock"] the panel.")) + return ITEM_INTERACT_SUCCESS + /obj/machinery/turretid/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index 544832a0327..859f8464785 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -93,6 +93,6 @@ sleep(signal.data["slow"]) // simulate the network lag if necessary signal.broadcast() -/obj/machinery/telecomms/allinone/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) - if(attacking_item.tool_behaviour == TOOL_MULTITOOL) - return attack_hand(user) +/obj/machinery/telecomms/allinone/multitool_act(mob/living/user, obj/item/tool) + attack_hand(user) + return ITEM_INTERACT_SUCCESS diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index cb34bf1e813..c22020d644d 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -34,18 +34,21 @@ to_chat(user, span_warning("It seems that the blackbox is missing...")) return -/obj/machinery/blackbox_recorder/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) - if(istype(attacking_item, /obj/item/blackbox)) - if(HAS_TRAIT(attacking_item, TRAIT_NODROP) || !user.transferItemToLoc(attacking_item, src)) - to_chat(user, span_warning("[attacking_item] is stuck to your hand!")) - return - user.visible_message(span_notice("[user] clicks [attacking_item] into [src]!"), \ - span_notice("You press the device into [src], and it clicks into place. The tapes begin spinning again.")) - playsound(src, 'sound/machines/click.ogg', 50, TRUE) - stored = attacking_item - update_appearance() - return - return ..() +/obj/machinery/blackbox_recorder/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/blackbox)) + return NONE + if(stored) + to_chat(user, span_warning("There's already a blackbox in \the [src].")) //something's gone wrong to get here, but you know, it could happen + return ITEM_INTERACT_BLOCKING + if(HAS_TRAIT(tool, TRAIT_NODROP) || !user.transferItemToLoc(tool, src)) + to_chat(user, span_warning("[tool] is stuck to your hand!")) + return ITEM_INTERACT_BLOCKING + user.visible_message(span_notice("[user] clicks [tool] into [src]!"), \ + span_notice("You press the device into [src], and it clicks into place. The tapes begin spinning again.")) + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + stored = tool + update_appearance() + return ITEM_INTERACT_SUCCESS /obj/machinery/blackbox_recorder/Destroy() if(stored) diff --git a/code/game/objects/effects/decals/cleanable/fuel.dm b/code/game/objects/effects/decals/cleanable/fuel.dm index a55ff28e10d..6dbd03ac8be 100644 --- a/code/game/objects/effects/decals/cleanable/fuel.dm +++ b/code/game/objects/effects/decals/cleanable/fuel.dm @@ -82,11 +82,12 @@ ignite() log_combat(hit_proj.firer, src, "used [hit_proj] to ignite") -/obj/effect/decal/cleanable/fuel_pool/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) - if(item.ignition_effect(src, user)) - ignite() - log_combat(user, src, "used [item] to ignite") - return ..() +/obj/effect/decal/cleanable/fuel_pool/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!tool.ignition_effect(src, user)) + return ..() + ignite() + log_combat(user, src, "used [tool] to ignite") + return ITEM_INTERACT_SUCCESS /obj/effect/decal/cleanable/fuel_pool/proc/on_entered(datum/source, atom/movable/entered_atom) SIGNAL_HANDLER diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index f35070bc2c4..b6eb8a6e6c8 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -69,10 +69,11 @@ /obj/effect/portal/newtonian_move(inertia_angle, instant = FALSE, start_delay = 0, drift_force = 0, controlled_cap = null) return TRUE -/obj/effect/portal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(user && Adjacent(user)) - teleport(user) - return TRUE +/obj/effect/portal/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!Adjacent(user)) + return ..() + teleport(user) + return ITEM_INTERACT_SUCCESS /obj/effect/portal/CanAllowThrough(atom/movable/mover, border_dir) . = ..() diff --git a/code/game/objects/effects/poster_demotivational.dm b/code/game/objects/effects/poster_demotivational.dm index ef946372dfd..bd6141f38c0 100644 --- a/code/game/objects/effects/poster_demotivational.dm +++ b/code/game/objects/effects/poster_demotivational.dm @@ -23,9 +23,8 @@ demoraliser = new(src, 7, TRUE, mood_category) return ..() -/obj/structure/sign/poster/traitor/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers) - if (tool.tool_behaviour == TOOL_WIRECUTTER) - QDEL_NULL(demoraliser) +/obj/structure/sign/poster/traitor/wirecutter_act(mob/living/user, obj/item/tool) + QDEL_NULL(demoraliser) return ..() /obj/structure/sign/poster/traitor/Destroy() diff --git a/code/game/objects/effects/poster_motivational.dm b/code/game/objects/effects/poster_motivational.dm index 702cdfdde8a..925f44ae5b9 100644 --- a/code/game/objects/effects/poster_motivational.dm +++ b/code/game/objects/effects/poster_motivational.dm @@ -17,17 +17,18 @@ department_grab.quirk_poster_department = quirk_poster_department /// You can use any spraypaint can on a quirk poster to turn it into a contraband poster from the traitor objective -/obj/item/poster/quirk/attackby(obj/item/postertool, mob/user, list/modifiers, list/attack_modifiers) - if(!user.is_antag() || !HAS_TRAIT(user, TRAIT_POSTERBOY) || !istype(postertool, /obj/item/toy/crayon)) - return ..() +/obj/item/poster/quirk/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!user.is_antag() || !HAS_TRAIT(user, TRAIT_POSTERBOY) || !istype(tool, /obj/item/toy/crayon)) + return NONE balloon_alert(user, "converting poster...") if(!do_after(user, 5 SECONDS, user)) balloon_alert(user, "interrupted!") - return + return ITEM_INTERACT_BLOCKING var/obj/item/poster/traitor/quirkspawn = new(get_turf(src)) user.put_in_hands(quirkspawn) to_chat(user, span_notice("You have converted one of your posters!")) qdel(src) + return ITEM_INTERACT_SUCCESS /// Screentip for the above @@ -50,9 +51,8 @@ mood_buff = new(_host = src, range = 7, _ignore_if_not_on_turf = TRUE, department = quirk_poster_department) return ..() -/obj/structure/sign/poster/quirk/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if (I.tool_behaviour == TOOL_WIRECUTTER) - QDEL_NULL(mood_buff) +/obj/structure/sign/poster/quirk/wirecutter_act(mob/living/user, obj/item/tool) + QDEL_NULL(mood_buff) return ..() /obj/structure/sign/poster/quirk/Destroy() diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm index 57b36f1b3e0..a8eefa88ae6 100644 --- a/code/game/objects/items/cigarettes.dm +++ b/code/game/objects/items/cigarettes.dm @@ -344,22 +344,24 @@ CIGARETTE PACKETS ARE IN FANCY.DM user.visible_message(span_suicide("[user] is huffing [src] as quickly as [user.p_they()] can! It looks like [user.p_theyre()] trying to give [user.p_them()]self cancer.")) return (TOXLOSS|OXYLOSS) -/obj/item/cigarette/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/cigarette/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(lit) - return ..() + return NONE - var/lighting_text = W.ignition_effect(src, user) + var/lighting_text = tool.ignition_effect(src, user) if(!lighting_text) - return ..() + return NONE if(!check_oxygen(user)) //cigarettes need oxygen balloon_alert(user, "no air!") - return ..() + return ITEM_INTERACT_BLOCKING - if(smoketime > 0) - light(lighting_text) - else + if(!smoketime) to_chat(user, span_warning("There is nothing to smoke!")) + return ITEM_INTERACT_BLOCKING + + light(lighting_text) + return ITEM_INTERACT_SUCCESS /// Checks that we have enough air to smoke /obj/item/cigarette/proc/check_oxygen(mob/user) @@ -971,18 +973,18 @@ CIGARETTE PACKETS ARE IN FANCY.DM STOP_PROCESSING(SSobj, src) QDEL_NULL(cig_smoke) -/obj/item/cigarette/pipe/attackby(obj/item/thing, mob/user, list/modifiers, list/attack_modifiers) - if(!(istype(thing, /obj/item/food/grown) || istype(thing, /obj/item/food/drug))) +/obj/item/cigarette/pipe/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!(istype(tool, /obj/item/food/grown) || istype(tool, /obj/item/food/drug))) return ..() if(packeditem) to_chat(user, span_warning("It is already packed!")) - return + return ITEM_INTERACT_BLOCKING - var/obj/item/to_smoke = thing + var/obj/item/to_smoke = tool if(istype(to_smoke, /obj/item/food/grown) && !HAS_TRAIT(to_smoke, TRAIT_DRIED)) to_chat(user, span_warning("It has to be dried first!")) - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_notice("You stuff [to_smoke] into [src].")) smoketime = 13 MINUTES @@ -991,6 +993,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(to_smoke.reagents) to_smoke.reagents.trans_to(src, to_smoke.reagents.total_volume, transferred_by = user) qdel(to_smoke) + return ITEM_INTERACT_SUCCESS /obj/item/cigarette/pipe/attack_self(mob/user) diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index ecc1f76247d..f24b84dc8e0 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -519,19 +519,21 @@ to_chat(user, span_notice("You overload the node announcement chip, forcing every node to be announced on the common channel.")) return TRUE -/obj/item/circuitboard/computer/rdconsole/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) - if (user.combat_mode || !isidcard(attacking_item)) - return ..() - if (check_access(attacking_item)) - locked = !locked - balloon_alert(user, locked ? "locked" : "unlocked") - user.visible_message( - message = span_notice("\The [user] unlock[user.p_s()] \the [src] with \the [attacking_item]."), - self_message = span_notice("You unlock \the [src] with \the [attacking_item]."), - blind_message = span_hear("You hear a soft beep."), - ) - else +/obj/item/circuitboard/computer/rdconsole/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if (user.combat_mode || !isidcard(tool)) + return NONE + if (!check_access(tool)) balloon_alert(user, "no access!") + return ITEM_INTERACT_BLOCKING + locked = !locked + balloon_alert(user, locked ? "locked" : "unlocked") + user.visible_message( + span_notice("\The [user] unlock[user.p_s()] \the [src] with \the [tool]."), + span_notice("You unlock \the [src] with \the [tool]."), + span_hear("You hear a soft beep."), + ) + return ITEM_INTERACT_SUCCESS + /obj/item/circuitboard/computer/rdservercontrol name = "R&D Server Control" diff --git a/code/game/objects/items/courtroom.dm b/code/game/objects/items/courtroom.dm index f053d84b540..99609766ca0 100644 --- a/code/game/objects/items/courtroom.dm +++ b/code/game/objects/items/courtroom.dm @@ -36,10 +36,10 @@ resistance_flags = FLAMMABLE custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT) -/obj/item/gavelblock/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(istype(I, /obj/item/gavelhammer)) - playsound(loc, 'sound/items/gavel.ogg', 100, TRUE) - user.visible_message(span_warning("[user] strikes [src] with [I].")) - user.changeNext_move(CLICK_CD_MELEE) - else - return ..() +/obj/item/gavelblock/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/gavelhammer)) + return NONE + playsound(loc, 'sound/items/gavel.ogg', 100, TRUE) + user.visible_message(span_warning("[user] strikes [src] with [tool].")) + user.changeNext_move(CLICK_CD_MELEE) + return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index fdb179ba55a..e3cf37392c8 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -71,32 +71,32 @@ return FALSE return TRUE -/obj/structure/checkoutmachine/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) +/obj/structure/checkoutmachine/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(!canwalk) balloon_alert(user, "not ready to accept transactions!") - return + return ITEM_INTERACT_BLOCKING if(check_if_finished()) qdel(src) - return + return ITEM_INTERACT_BLOCKING - var/obj/item/card/id/card = attacking_item.GetID() + var/obj/item/card/id/card = tool.GetID() if(!card) - balloon_alert(user, "your [attacking_item.name] gets repelled by the id card reader") + balloon_alert(user, "the reader repels your [tool.name]") var/throwtarget = get_step(user, get_dir(src, user)) user.safe_throw_at(throwtarget, 1, 1, force = MOVE_FORCE_EXTREMELY_STRONG) playsound(get_turf(src),'sound/effects/magic/repulse.ogg', 100, TRUE) - return + return ITEM_INTERACT_BLOCKING if(!card.registered_account) balloon_alert(user, "card has no registered account!") - return + return ITEM_INTERACT_BLOCKING if(!LAZYFIND(card.registered_account.being_dumped, src)) balloon_alert(user, "funds are already safe!") - return + return ITEM_INTERACT_BLOCKING to_chat(user, span_warning("You quickly cash out your funds to a more secure banking location. Funds are safu.")) // This is a reference and not a typo accounts_to_rob -= card.registered_account @@ -104,7 +104,8 @@ if(check_if_finished()) qdel(src) - return + + return ITEM_INTERACT_SUCCESS /obj/structure/checkoutmachine/Initialize(mapload, mob/living/user) . = ..() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 71509d389ce..60a4c069081 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -91,69 +91,71 @@ crystal_lens = null return ITEM_INTERACT_SUCCESS -/obj/item/laser_pointer/attackby(obj/item/attack_item, mob/user, list/modifiers, list/attack_modifiers) - if(istype(attack_item, /obj/item/stock_parts/micro_laser)) +/obj/item/laser_pointer/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/stock_parts/micro_laser)) if(diode) balloon_alert(user, "already has a diode!") - return - var/obj/item/stock_parts/attack_diode = attack_item + return ITEM_INTERACT_BLOCKING + var/obj/item/stock_parts/attack_diode = tool if(crystal_lens && attack_diode.rating < 3) //only tier 3 and up are small enough to fit - to_chat(user, span_warning("You try to jam \the [attack_item.name] in place, but \the [crystal_lens.name] is in the way!")) + to_chat(user, span_warning("You try to jam \the [tool.name] in place, but \the [crystal_lens.name] is in the way!")) playsound(src, 'sound/machines/airlock/airlock_alien_prying.ogg', 20) - if(do_after(user, 2 SECONDS, src)) - var/atom/atom_to_teleport = pick(user, attack_item) - if(atom_to_teleport == user) - to_chat(user, span_warning("You jam \the [attack_item.name] in too hard and break \the [crystal_lens.name] inside, teleporting you away!")) - user.drop_all_held_items() - else if(atom_to_teleport == attack_item) - attack_item.forceMove(drop_location()) - to_chat(user, span_warning("You jam \the [attack_item.name] in too hard and break \the [crystal_lens.name] inside, teleporting \the [attack_item.name] away!")) - do_teleport(atom_to_teleport, get_turf(src), crystal_lens.blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - qdel(crystal_lens) - return - if(!user.transferItemToLoc(attack_item, src)) - return + if(!do_after(user, 2 SECONDS, src)) + return ITEM_INTERACT_BLOCKING + var/atom/atom_to_teleport = pick(user, tool) + if(atom_to_teleport == user) + to_chat(user, span_warning("You jam \the [tool.name] in too hard and break \the [crystal_lens.name] inside, teleporting you away!")) + user.drop_all_held_items() + else if(atom_to_teleport == tool) + tool.forceMove(drop_location()) + to_chat(user, span_warning("You jam \the [tool.name] in too hard and break \the [crystal_lens.name] inside, teleporting \the [tool.name] away!")) + do_teleport(atom_to_teleport, get_turf(src), crystal_lens.blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) + qdel(crystal_lens) + return ITEM_INTERACT_SUCCESS + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING playsound(src, 'sound/items/tools/screwdriver.ogg', 30) - diode = attack_item + diode = tool balloon_alert(user, "installed \the [diode.name]") //we have a diode now, try starting a charge sequence in case the pointer was charging when we took out the diode recharging = TRUE START_PROCESSING(SSobj, src) - return TRUE + return ITEM_INTERACT_SUCCESS - if(istype(attack_item, /obj/item/stack/ore/bluespace_crystal)) + if(istype(tool, /obj/item/stack/ore/bluespace_crystal)) if(crystal_lens) balloon_alert(user, "already has a lens!") - return + return ITEM_INTERACT_BLOCKING //the crystal stack we're trying to install a crystal from - var/obj/item/stack/ore/bluespace_crystal/crystal_stack = attack_item + var/obj/item/stack/ore/bluespace_crystal/crystal_stack = tool if(diode && diode.rating < 3) //only lasers of tier 3 and up can house a lens to_chat(user, span_warning("You try to jam \the [crystal_stack.name] in front of the diode, but it's a bad fit!")) playsound(src, 'sound/machines/airlock/airlock_alien_prying.ogg', 20) - if(do_after(user, 2 SECONDS, src)) - var/atom/atom_to_teleport = pick(user, src) - if(atom_to_teleport == user) - to_chat(user, span_warning("You press on \the [crystal_stack.name] too hard and are teleported away!")) - user.drop_all_held_items() - else if(atom_to_teleport == src) - forceMove(drop_location()) - to_chat(user, span_warning("You press on \the [crystal_stack.name] too hard and \the [src] is teleported away!")) - do_teleport(atom_to_teleport, get_turf(src), crystal_stack.blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - crystal_stack.use_tool(src, user, amount = 1) //use only one if we were installing from a stack of crystals - return + if(!do_after(user, 2 SECONDS, src)) + return ITEM_INTERACT_BLOCKING + var/atom/atom_to_teleport = pick(user, src) + if(atom_to_teleport == user) + to_chat(user, span_warning("You press on \the [crystal_stack.name] too hard and are teleported away!")) + user.drop_all_held_items() + else if(atom_to_teleport == src) + forceMove(drop_location()) + to_chat(user, span_warning("You press on \the [crystal_stack.name] too hard and \the [src] is teleported away!")) + do_teleport(atom_to_teleport, get_turf(src), crystal_stack.blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) + crystal_stack.use_tool(src, user, amount = 1) //use only one if we were installing from a stack of crystals + return ITEM_INTERACT_SUCCESS //the single crystal that we actually install var/obj/item/stack/ore/bluespace_crystal/single_crystal = crystal_stack.split_stack(1) if(isnull(single_crystal)) - return + return ITEM_INTERACT_BLOCKING single_crystal.forceMove(src) crystal_lens = single_crystal playsound(src, 'sound/items/tools/screwdriver2.ogg', 30) balloon_alert(user, "installed \the [crystal_lens.name]") to_chat(user, span_notice("You install a [crystal_lens.name] in [src]. \ It can now be used to shine through obstacles at the cost of double the energy drain.")) - return TRUE + return ITEM_INTERACT_SUCCESS - return ..() + return NONE /obj/item/laser_pointer/examine(mob/user) . = ..() diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index d1bff2e7432..69a7cc018a1 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -64,17 +64,19 @@ if(istype(assembly)) assembly.activate() -/obj/item/pressure_plate/attackby(obj/item/item, mob/living/L) - if(isassembly(item) && !istype(assembly) && removable_assembly) - var/obj/item/assembly/new_assembly = item - if(!(new_assembly.assembly_behavior & ASSEMBLY_FUNCTIONAL_OUTPUT)) - to_chat(L, span_warning("\The [item] doesn't seem like it would do much of anything inside of [src]...")) - return - if(L.transferItemToLoc(item, src)) - assembly = item - SEND_SIGNAL(item, COMSIG_ASSEMBLY_ADDED_TO_PRESSURE_PLATE, src, L) - to_chat(L, span_notice("You attach [item] to [src]!")) - return ..() +/obj/item/pressure_plate/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!isassembly(tool) || assembly || !removable_assembly) + return NONE + var/obj/item/assembly/new_assembly = tool + if(!(new_assembly.assembly_behavior & ASSEMBLY_FUNCTIONAL_OUTPUT)) + to_chat(user, span_warning("\The [tool] doesn't seem like it would do much of anything inside of [src]...")) + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + assembly = tool + SEND_SIGNAL(tool, COMSIG_ASSEMBLY_ADDED_TO_PRESSURE_PLATE, src, user) + to_chat(user, span_notice("You attach [tool] to [src]!")) + return ITEM_INTERACT_SUCCESS /obj/item/pressure_plate/attack_self(mob/living/L) if(removable_assembly && istype(assembly)) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 7b3d48a69dd..d1645e98fa6 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -40,25 +40,28 @@ return return ..() -/obj/item/electropack/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(istype(W, /obj/item/clothing/head/helmet)) - var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit(user) - A.icon = 'icons/obj/devices/assemblies.dmi' +/obj/item/electropack/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/clothing/head/helmet)) + return NONE + if(!user.temporarilyRemoveItemFromInventory(tool)) + to_chat(user, span_warning("[tool] is stuck to your hand, you cannot attach it to [src]!")) + return ITEM_INTERACT_BLOCKING + var/obj/item/assembly/shock_kit/torture_device = new /obj/item/assembly/shock_kit(user) + torture_device.icon = 'icons/obj/devices/assemblies.dmi' - if(!user.transferItemToLoc(W, A)) - to_chat(user, span_warning("[W] is stuck to your hand, you cannot attach it to [src]!")) - return - W.master = A - A.helmet_part = W + tool.forceMove(torture_device) // Forcemove() because we've already seen we can move it with the check above and the check above forces us to use forceMove() next - user.transferItemToLoc(src, A, TRUE) - master = A - A.electropack_part = src + tool.master = torture_device + torture_device.helmet_part = tool - user.put_in_hands(A) - A.add_fingerprint(user) - else - return ..() + user.transferItemToLoc(src, torture_device, TRUE) + master = torture_device + torture_device.electropack_part = src + + user.put_in_hands(torture_device) + torture_device.add_fingerprint(user) + + return ITEM_INTERACT_SUCCESS /obj/item/electropack/receive_signal(datum/signal/signal) if(!signal || signal.data["code"] != code) diff --git a/code/game/objects/items/devices/swapper.dm b/code/game/objects/items/devices/swapper.dm index 01fda4b6456..642f0c80589 100644 --- a/code/game/objects/items/devices/swapper.dm +++ b/code/game/objects/items/devices/swapper.dm @@ -27,22 +27,22 @@ icon_state = "swapper[linked_swapper ? "-linked" : null]" return ..() -/obj/item/swapper/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(istype(I, /obj/item/swapper)) - var/obj/item/swapper/other_swapper = I - if(other_swapper.linked_swapper) - to_chat(user, span_warning("[other_swapper] is already linked. Break the current link to establish a new one.")) - return - if(linked_swapper) - to_chat(user, span_warning("[src] is already linked. Break the current link to establish a new one.")) - return - to_chat(user, span_notice("You establish a quantum link between the two devices.")) - linked_swapper = other_swapper - other_swapper.linked_swapper = src - update_appearance() - linked_swapper.update_appearance() - else - return ..() +/obj/item/swapper/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/swapper)) + return NONE + var/obj/item/swapper/other_swapper = tool + if(other_swapper.linked_swapper) + to_chat(user, span_warning("[other_swapper] is already linked. Break the current link to establish a new one.")) + return ITEM_INTERACT_BLOCKING + if(linked_swapper) + to_chat(user, span_warning("[src] is already linked. Break the current link to establish a new one.")) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("You establish a quantum link between the two devices.")) + linked_swapper = other_swapper + other_swapper.linked_swapper = src + update_appearance() + linked_swapper.update_appearance() + return ITEM_INTERACT_SUCCESS /obj/item/swapper/attack_self(mob/living/user) if(world.time < next_use) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 7e34b98a874..7b7286b9711 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -84,15 +84,16 @@ else soundloop.start() -/obj/item/taperecorder/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(!mytape && istype(I, /obj/item/tape)) - if(!user.transferItemToLoc(I,src)) - return - mytape = I - balloon_alert(user, "inserted [mytape]") - playsound(src, 'sound/items/taperecorder/taperecorder_close.ogg', 50, FALSE) - update_appearance() - +/obj/item/taperecorder/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(mytape || !istype(tool, /obj/item/tape)) + return NONE + if(!user.transferItemToLoc(tool,src)) + return ITEM_INTERACT_BLOCKING + mytape = tool + balloon_alert(user, "inserted [mytape]") + playsound(src, 'sound/items/taperecorder/taperecorder_close.ogg', 50, FALSE) + update_appearance() + return ITEM_INTERACT_SUCCESS /obj/item/taperecorder/proc/eject(mob/user) if(!mytape) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 0ba47962beb..4737c49dc51 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -442,35 +442,39 @@ effective or pretty fucking useless. return TRUE -/obj/machinery/porta_turret/syndicate/toolbox/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) - if(!istype(attacking_item, /obj/item/wrench/combat)) +/obj/machinery/porta_turret/syndicate/toolbox/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/wrench/combat)) return ..() - if(!attacking_item.toolspeed) - return + if(!tool.toolspeed) // This is a check for the laser wrench being off, I think + return ITEM_INTERACT_BLOCKING if(user.combat_mode) balloon_alert(user, "deconstructing...") - if(!attacking_item.use_tool(src, user, 5 SECONDS, volume = 20)) - return + if(!tool.use_tool(src, user, 5 SECONDS, volume = 20)) + return ITEM_INTERACT_BLOCKING deconstruct(TRUE) - attacking_item.play_tool_sound(src, 50) + tool.play_tool_sound(src, 50) balloon_alert(user, "deconstructed!") + return ITEM_INTERACT_SUCCESS - else - if(atom_integrity == max_integrity) - balloon_alert(user, "already repaired!") - return - balloon_alert(user, "repairing...") - while(atom_integrity != max_integrity) - if(!attacking_item.use_tool(src, user, 2 SECONDS, volume = 20)) - return + if(atom_integrity == max_integrity) + balloon_alert(user, "already repaired!") + return ITEM_INTERACT_BLOCKING - repair_damage(10) + balloon_alert(user, "repairing...") + . = ITEM_INTERACT_BLOCKING // I'm doing this such that at least one successful repair considers the interaction a success + while(atom_integrity != max_integrity) + if(!tool.use_tool(src, user, 2 SECONDS, volume = 20)) + return . - balloon_alert(user, "repaired!") + repair_damage(10) + . = ITEM_INTERACT_SUCCESS + + balloon_alert(user, "repaired!") + return ITEM_INTERACT_SUCCESS /obj/machinery/porta_turret/syndicate/toolbox/on_deconstruction(disassembled) if(disassembled) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index b90a02db9ea..7dcf6fa1061 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -118,33 +118,42 @@ return ITEM_INTERACT_FAILURE return NONE -/obj/item/transfer_valve/attackby(obj/item/item, mob/user, params) - if(istype(item, /obj/item/tank)) - try_attach_tank(item, user) -//TODO: Have this take an assemblyholder - else if(isassembly(item)) - try_attach_assembly(item, user) - else if(istype(item, /obj/item/stack/cable_coil) && !wired) - var/obj/item/stack/cable_coil/coil = item +/obj/item/transfer_valve/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/tank)) + try_attach_tank(tool, user) + return ITEM_INTERACT_SUCCESS + + //TODO: Have this take an assemblyholder <-- commit five years ago + if(isassembly(tool)) + try_attach_assembly(tool, user) + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/stack/cable_coil) && !wired) + var/obj/item/stack/cable_coil/coil = tool if (coil.get_amount() < 15) to_chat(user, span_warning("You need fifteen lengths of coil for this!")) - return + return ITEM_INTERACT_BLOCKING coil.use(15) to_chat(user, span_notice("You add some cables, not being really sure why. Looks like backpack straps.")) wired = TRUE slot_flags |= ITEM_SLOT_BACK update_appearance() + return ITEM_INTERACT_SUCCESS - else if(item.tool_behaviour == TOOL_WIRECUTTER && wired) - item.play_tool_sound(src) - to_chat(user, span_notice("You remove the cables.")) - wired = FALSE - slot_flags &= ~ITEM_SLOT_BACK - Move(drop_location()) - new /obj/item/stack/cable_coil(drop_location(), 15) - update_appearance() + return NONE + +/obj/item/transfer_valve/wirecutter_act(mob/living/user, obj/item/tool) + if(!wired) + return ITEM_INTERACT_SKIP_TO_ATTACK + tool.play_tool_sound(src) + to_chat(user, span_notice("You remove the cables.")) + wired = FALSE + slot_flags &= ~ITEM_SLOT_BACK + forceMove(drop_location()) + new /obj/item/stack/cable_coil(drop_location(), 15) + update_appearance() + return ITEM_INTERACT_SUCCESS - return /obj/item/transfer_valve/proc/try_attach_tank(obj/item/tank/new_tank, mob/user) if(!tank_one) diff --git a/code/game/objects/items/grenades/festive.dm b/code/game/objects/items/grenades/festive.dm index faa8d8da5bf..cdc651b3c38 100644 --- a/code/game/objects/items/grenades/festive.dm +++ b/code/game/objects/items/grenades/festive.dm @@ -14,12 +14,12 @@ /obj/item/sparkler/fire_act(exposed_temperature, exposed_volume) light() -/obj/item/sparkler/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) - var/ignition_msg = item.ignition_effect(src, user) - if(ignition_msg) - light(user, ignition_msg) - else - return ..() +/obj/item/sparkler/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + var/ignition_msg = tool.ignition_effect(src, user) + if(!ignition_msg) + return NONE + light(user, ignition_msg) + return ITEM_INTERACT_SUCCESS /obj/item/sparkler/proc/light(mob/user, message) if(lit) @@ -75,13 +75,15 @@ /obj/item/grenade/firecracker/attack_self(mob/user) // You need to light it manually. return -/obj/item/grenade/firecracker/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) - var/ignition_msg = item.ignition_effect(src, user) - if(ignition_msg && !active) - visible_message(ignition_msg) - arm_grenade(user) - else - return ..() +/obj/item/grenade/firecracker/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(active) + return NONE + var/ignition_msg = tool.ignition_effect(src, user) + if(!ignition_msg) + return NONE + visible_message(ignition_msg) + arm_grenade(user) + return ITEM_INTERACT_SUCCESS /obj/item/grenade/firecracker/fire_act(exposed_temperature, exposed_volume) detonate() diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm index ac1c444cbd5..779ff29f169 100644 --- a/code/game/objects/items/grenades/ghettobomb.dm +++ b/code/game/objects/items/grenades/ghettobomb.dm @@ -218,33 +218,33 @@ else . += span_notice("The wires are just dangling from it, you need some sort of activating assembly.") -/obj/item/sliced_pipe/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/sliced_pipe/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(!wires_are_in) // here we can stuff in additional objects for a cooler effect - if(is_type_in_typecache(item, allowed) && contents.len < MAX_STUFFINGS) + if(is_type_in_typecache(tool, allowed) && contents.len < MAX_STUFFINGS) balloon_alert(user, "stuffed in") - var/atom/movable/to_put = item - if(isstack(item)) - var/obj/item/stack/as_stack = item + var/atom/movable/to_put = tool + if(isstack(tool)) + var/obj/item/stack/as_stack = tool var/obj/item/stack/new_stack = as_stack.split_stack(1) new_stack.merge_type = null //prevent them from merging inside for contents.len to_put = new_stack to_put.forceMove(src) - return + return ITEM_INTERACT_SUCCESS //if the item has reagents lets allow it to transfer - if(item.reagents) - return ..() + if(tool.reagents) + return NONE if(reagents.total_volume < 5) balloon_alert(user, "add more fuel!") - return + return ITEM_INTERACT_BLOCKING - var/obj/item/stack/cable_coil/coil = item + var/obj/item/stack/cable_coil/coil = tool if(!istype(coil)) - return + return ITEM_INTERACT_BLOCKING if (coil.get_amount() < 15) balloon_alert(user, "need 15 length!") - return + return ITEM_INTERACT_BLOCKING coil.use(15) var/cur_power = 0 @@ -260,27 +260,30 @@ icon_state = "[icon_state]-cable" reagents.flags = SEALED_CONTAINER wires_are_in = TRUE - else // wires are in, lets finish this up - var/obj/item/assembly/assembly = item - if(!istype(assembly) || !(assembly.type in allowed_activators)) - return - if(assembly.secured) - balloon_alert(user, "unsecure assembly first!") - return - if(!user.transferItemToLoc(assembly, src)) - return - user.balloon_alert(user, "attached") + return ITEM_INTERACT_SUCCESS - var/obj/item/grenade/iedcasing/pipebomb = new(drop_location()) - for(var/atom/movable/item_inside as anything in contents) - item_inside.forceMove(pipebomb) + // wires are in, lets finish this up + var/obj/item/assembly/assembly = tool + if(!istype(assembly) || !(assembly.type in allowed_activators)) + return ITEM_INTERACT_BLOCKING + if(assembly.secured) + balloon_alert(user, "unsecure assembly first!") + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(assembly, src)) + return ITEM_INTERACT_BLOCKING + user.balloon_alert(user, "attached") - pipebomb.power = power - pipebomb.attach_activator(assembly) - pipebomb.setup_effects_from_contents() - var/was_in_hands = (loc == user) - qdel(src) - if(was_in_hands) - user.put_in_hands(pipebomb) + var/obj/item/grenade/iedcasing/pipebomb = new(drop_location()) + for(var/atom/movable/item_inside as anything in contents) + item_inside.forceMove(pipebomb) + + pipebomb.power = power + pipebomb.attach_activator(assembly) + pipebomb.setup_effects_from_contents() + var/was_in_hands = (loc == user) + qdel(src) + if(was_in_hands) + user.put_in_hands(pipebomb) + return ITEM_INTERACT_SUCCESS #undef MAX_STUFFINGS diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm index 094e8d51676..7faa508b760 100644 --- a/code/game/objects/items/implants/implantpad.dm +++ b/code/game/objects/items/implants/implantpad.dm @@ -40,15 +40,16 @@ inserted_case = null update_appearance(UPDATE_ICON) -/obj/item/implantpad/attackby(obj/item/implantcase/attacking_item, mob/user, list/modifiers, list/attack_modifiers) - if(inserted_case || !istype(attacking_item)) - return ..() - if(!user.transferItemToLoc(attacking_item, src)) - return +/obj/item/implantpad/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(inserted_case || !istype(tool, /obj/item/implantcase)) + return NONE + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING user.balloon_alert(user, "case inserted") - inserted_case = attacking_item + inserted_case = tool update_static_data_for_all_viewers() update_appearance(UPDATE_ICON) + return ITEM_INTERACT_SUCCESS /obj/item/implantpad/click_alt(mob/user) remove_implant(user) diff --git a/code/game/objects/items/kirby_plants/kirbyplants.dm b/code/game/objects/items/kirby_plants/kirbyplants.dm index 1f665499601..b9920ea16b6 100644 --- a/code/game/objects/items/kirby_plants/kirbyplants.dm +++ b/code/game/objects/items/kirby_plants/kirbyplants.dm @@ -50,19 +50,23 @@ . = ..() icon_state = dead ? "plant-25" : base_icon_state -/obj/item/kirbyplants/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) - . = ..() - if(!dead && trimmable && HAS_TRAIT(user,TRAIT_BONSAI) && isturf(loc) && I.get_sharpness()) +/obj/item/kirbyplants/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!dead && trimmable && HAS_TRAIT(user, TRAIT_BONSAI) && isturf(loc) && tool.get_sharpness()) to_chat(user,span_notice("You start trimming [src].")) - if(do_after(user,3 SECONDS,target=src)) - to_chat(user,span_notice("You finish trimming [src].")) - change_visual() - if(dead && istype(I, /obj/item/seeds)) + if(!do_after(user, 3 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + to_chat(user,span_notice("You finish trimming [src].")) + change_visual() + + if(dead && istype(tool, /obj/item/seeds)) to_chat(user,span_notice("You start planting a new seed into the pot.")) - if(do_after(user,3 SECONDS,target=src)) - qdel(I) - dead = FALSE - update_appearance() + if(!do_after(user, 3 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + qdel(tool) + dead = FALSE + update_appearance() + + return NONE /// Cycle basic plant visuals /obj/item/kirbyplants/proc/change_visual() diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index f9eb7b87c31..7d314b0903e 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -101,16 +101,17 @@ burst() return ..() -/obj/item/latexballoon/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) - if(istype(item, /obj/item/tank)) - var/obj/item/tank/air_tank = item +/obj/item/latexballoon/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/tank)) + var/obj/item/tank/air_tank = tool blow(air_tank, user) - return - if(item.get_sharpness() || item.get_temperature() >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - burst() - return + return ITEM_INTERACT_SUCCESS - return ..() + if(tool.get_sharpness() || tool.get_temperature() >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + burst() + return ITEM_INTERACT_SUCCESS + + return NONE #undef INFLATED #undef POPPED diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm index bebc7b4ceab..f16ae3fe5b2 100644 --- a/code/game/objects/items/mail.dm +++ b/code/game/objects/items/mail.dm @@ -98,16 +98,19 @@ postmark_image.appearance_flags |= RESET_COLOR|KEEP_APART . += postmark_image -/obj/item/mail/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/mail/item_interaction(mob/living/user, obj/item/tool, list/modifiers) // Destination tagging - if(istype(W, /obj/item/dest_tagger)) - var/obj/item/dest_tagger/destination_tag = W + if(!istype(tool, /obj/item/dest_tagger)) + return NONE + var/obj/item/dest_tagger/destination_tag = tool - if(sort_tag != destination_tag.currTag) - var/tag = uppertext(GLOB.TAGGERLOCATIONS[destination_tag.currTag]) - to_chat(user, span_notice("*[tag]*")) - sort_tag = destination_tag.currTag - playsound(loc, 'sound/machines/beep/twobeep_high.ogg', vol = 100, vary = TRUE) + if(sort_tag == destination_tag.currTag) + return ITEM_INTERACT_BLOCKING + var/tag = uppertext(GLOB.TAGGERLOCATIONS[destination_tag.currTag]) + to_chat(user, span_notice("*[tag]*")) + sort_tag = destination_tag.currTag + playsound(loc, 'sound/machines/beep/twobeep_high.ogg', vol = 100, vary = TRUE) + return ITEM_INTERACT_SUCCESS /obj/item/mail/multitool_act(mob/living/user, obj/item/tool) if(user.get_inactive_held_item() == src) diff --git a/code/game/objects/items/piggy_bank.dm b/code/game/objects/items/piggy_bank.dm index 117220a0aac..1f53e0c80cb 100644 --- a/code/game/objects/items/piggy_bank.dm +++ b/code/game/objects/items/piggy_bank.dm @@ -124,23 +124,28 @@ if(95 to INFINITY) balloon_alert(user, "brimming with cash") -/obj/item/piggy_bank/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) - var/creds_value = item.get_item_credit_value() +/obj/item/piggy_bank/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + var/creds_value = tool.get_item_credit_value() if(isnull(creds_value)) - return ..() + return NONE var/dosh_amount = calculate_dosh_amount() if(dosh_amount >= maximum_value) balloon_alert(user, "it's full!") - else if(dosh_amount + creds_value > maximum_value) + return ITEM_INTERACT_BLOCKING + + if(dosh_amount + creds_value > maximum_value) balloon_alert(user, "too much cash!") - else if(!user.transferItemToLoc(item, src)) + return ITEM_INTERACT_BLOCKING + + if(!user.transferItemToLoc(tool, src)) balloon_alert(user, "stuck in your hands!") - else - balloon_alert(user, "inserted [creds_value] creds") - sanitize_piggy_bank_contents_len() - return TRUE + return ITEM_INTERACT_BLOCKING + + balloon_alert(user, "inserted [creds_value] creds") + sanitize_piggy_bank_contents_len() + return ITEM_INTERACT_SUCCESS ///Returns the total amount of credits that its contents amount to. /obj/item/piggy_bank/proc/calculate_dosh_amount() diff --git a/code/game/objects/items/pillow.dm b/code/game/objects/items/pillow.dm index 2ccf7157b83..3eb167e25d6 100644 --- a/code/game/objects/items/pillow.dm +++ b/code/game/objects/items/pillow.dm @@ -73,29 +73,31 @@ user.visible_message("[user] starts to smother [victim]", span_notice("You begin smothering [victim]"), vision_distance = COMBAT_MESSAGE_RANGE) INVOKE_ASYNC(src, PROC_REF(smothering), user, victim) -/obj/item/pillow/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) - if(!bricked && istype(attacking_item, /obj/item/stack/sheet/mineral/sandstone)) - var/obj/item/stack/sheet/mineral/sandstone/brick = attacking_item +/obj/item/pillow/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!bricked && istype(tool, /obj/item/stack/sheet/mineral/sandstone)) + var/obj/item/stack/sheet/mineral/sandstone/brick = tool balloon_alert(user, "inserting brick...") if(!do_after(user, 2 SECONDS, src)) - return + return ITEM_INTERACT_BLOCKING if(!brick.use(1)) balloon_alert(user, "not enough bricks!") - return + return ITEM_INTERACT_BLOCKING balloon_alert(user, "bricked!") become_bricked() - return - if(istype(attacking_item, /obj/item/clothing/neck/pillow_tag)) - if(!pillow_trophy) - user.transferItemToLoc(attacking_item, src) - pillow_trophy = attacking_item - balloon_alert(user, "honor reclaimed!") - update_appearance() - return - else + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/clothing/neck/pillow_tag)) + if(pillow_trophy) balloon_alert(user, "tag is intact.") - return - return ..() + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + pillow_trophy = tool + balloon_alert(user, "honor reclaimed!") + update_appearance() + return ITEM_INTERACT_SUCCESS + + return NONE /obj/item/pillow/examine(mob/user) . = ..() diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 48e5f14d0c6..8abf3d0057e 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -131,50 +131,54 @@ else to_chat(user, span_notice("You try to pet [src], but it has no stuffing. Aww...")) -/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers) - if(I.get_sharpness()) - if(!grenade) - if(!stuffed) - to_chat(user, span_warning("You already murdered it!")) - return - if(!divine) - user.visible_message(span_notice("[user] tears out the stuffing from [src]!"), span_notice("You rip a bunch of the stuffing from [src]. Murderer.")) - I.play_tool_sound(src) - stuffed = FALSE - else - to_chat(user, span_notice("What a fool you are. [src] is a god, how can you kill a god? What a grand and intoxicating innocence.")) - user.adjust_drunk_effect(20, up_to = 50) - - var/turf/current_location = get_turf(user) - var/area/current_area = current_location.loc //copied from hand tele code - if(current_location && current_area && (current_area.area_flags & NOTELEPORT)) - to_chat(user, span_notice("There is no escape. No recall or intervention can work in this place.")) - else - to_chat(user, span_notice("There is no escape. Although recall or intervention can work in this place, attempting to flee from [src]'s immense power would be futile.")) - user.visible_message(span_notice("[user] lays down their weapons and begs for [src]'s mercy!"), span_notice("You lay down your weapons and beg for [src]'s mercy.")) - user.drop_all_held_items() - else +/obj/item/toy/plush/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(tool.get_sharpness()) + if(grenade) to_chat(user, span_notice("You remove the grenade from [src].")) user.put_in_hands(grenade) - return - if(isgrenade(I)) + return ITEM_INTERACT_SUCCESS + if(!stuffed) + to_chat(user, span_warning("You already murdered it!")) + return ITEM_INTERACT_BLOCKING + if(!divine) + user.visible_message(span_notice("[user] tears out the stuffing from [src]!"), span_notice("You rip a bunch of the stuffing from [src]. Murderer.")) + tool.play_tool_sound(src) + stuffed = FALSE + return ITEM_INTERACT_SUCCESS + + to_chat(user, span_notice("What a fool you are. [src] is a god, how can you kill a god? What a grand and intoxicating innocence.")) + user.adjust_drunk_effect(20, up_to = 50) + + var/turf/current_location = get_turf(user) + var/area/current_area = current_location.loc //copied from hand tele code + if(current_location && current_area && (current_area.area_flags & NOTELEPORT)) + to_chat(user, span_notice("There is no escape. No recall or intervention can work in this place.")) + else + to_chat(user, span_notice("There is no escape. Although recall or intervention can work in this place, attempting to flee from [src]'s immense power would be futile.")) + user.visible_message(span_notice("[user] lays down their weapons and begs for [src]'s mercy!"), span_notice("You lay down your weapons and beg for [src]'s mercy.")) + user.drop_all_held_items() + return ITEM_INTERACT_SUCCESS + + if(isgrenade(tool)) if(stuffed) to_chat(user, span_warning("You need to remove some stuffing first!")) - return + return ITEM_INTERACT_BLOCKING if(grenade) to_chat(user, span_warning("[src] already has a grenade!")) - return - if(!user.transferItemToLoc(I, src)) - return + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING user.visible_message(span_warning("[user] slides [grenade] into [src]."), \ - span_danger("You slide [I] into [src].")) - grenade = I - user.log_message("added a grenade ([I.name]) to [src]", LOG_GAME) - return - if(istype(I, /obj/item/toy/plush)) - love(I, user) - return - return ..() + span_danger("You slide [tool] into [src].")) + grenade = tool + user.log_message("added a grenade ([tool.name]) to [src]", LOG_GAME) + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/toy/plush)) + love(tool, user) + return ITEM_INTERACT_SUCCESS + + return NONE /obj/item/toy/plush/proc/love(obj/item/toy/plush/Kisser, mob/living/user) //~<3 var/chance = 100 //to steal a kiss, surely there's a 100% chance no-one would reject a plush such as I? diff --git a/code/game/objects/items/rcd/RCL.dm b/code/game/objects/items/rcd/RCL.dm index 6c48d2f691d..45768399a90 100644 --- a/code/game/objects/items/rcd/RCL.dm +++ b/code/game/objects/items/rcd/RCL.dm @@ -72,30 +72,34 @@ loaded = null update_appearance() -/obj/item/rcl/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/stack/pipe_cleaner_coil)) - var/obj/item/stack/pipe_cleaner_coil/C = W +/obj/item/rcl/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/stack/pipe_cleaner_coil)) + return NONE - if(!loaded) - if(!user.transferItemToLoc(W, src)) - to_chat(user, span_warning("[src] is stuck to your hand!")) - return - else - loaded = W //W.loc is src at this point. - loaded.set_pipecleaner_color(colors[current_color_index]) - loaded.max_amount = max_amount //We store a lot. - return - if(loaded.amount < max_amount) - var/transfer_amount = min(max_amount - loaded.amount, C.amount) - C.use(transfer_amount) - loaded.amount += transfer_amount - else - return + if(!loaded) + if(!user.transferItemToLoc(tool, src)) + to_chat(user, span_warning("[src] is stuck to your hand!")) + return ITEM_INTERACT_BLOCKING + + loaded = tool //tool.loc is src at this point. + loaded.set_pipecleaner_color(colors[current_color_index]) + loaded.max_amount = max_amount //We store a lot. update_appearance() - to_chat(user, span_notice("You add the pipe cleaners to [src]. It now contains [loaded.amount].")) - else - ..() + return ITEM_INTERACT_SUCCESS + + var/obj/item/stack/pipe_cleaner_coil/loading_coil = tool + + if(loaded.amount >= max_amount) + return ITEM_INTERACT_BLOCKING + + var/transfer_amount = min(max_amount - loaded.amount, loading_coil.amount) + loading_coil.use(transfer_amount) + loaded.amount += transfer_amount + + update_appearance() + to_chat(user, span_notice("You add the pipe cleaners to [src]. It now contains [loaded.amount].")) + return ITEM_INTERACT_SUCCESS /obj/item/rcl/examine(mob/user) . = ..() diff --git a/code/game/objects/items/rcd/RSF.dm b/code/game/objects/items/rcd/RSF.dm index 1dff040fcfd..dbde9ab8cdd 100644 --- a/code/game/objects/items/rcd/RSF.dm +++ b/code/game/objects/items/rcd/RSF.dm @@ -72,23 +72,25 @@ RSF /obj/item/rsf/cyborg matter = 30 -/obj/item/rsf/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(is_type_in_list(W,matter_by_item))//If the thing we got hit by is in our matter list - var/tempMatter = matter_by_item[W.type] + matter - if(tempMatter > max_matter) - to_chat(user, span_warning("\The [src] can't hold any more [discriptor]!")) - return - if(isstack(W)) - var/obj/item/stack/stack = W - stack.use(1) - else - qdel(W) - matter = tempMatter //We add its value - playsound(src.loc, 'sound/machines/click.ogg', 10, TRUE) - to_chat(user, span_notice("\The [src] now holds [matter]/[max_matter] [discriptor].")) - icon_state = base_icon_state//and set the icon state to the base state +/obj/item/rsf/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!is_type_in_list(tool, matter_by_item))//If the thing we got hit by is in our matter list + return NONE + + var/tempMatter = matter_by_item[tool.type] + matter + if(tempMatter > max_matter) + to_chat(user, span_warning("\The [src] can't hold any more [discriptor]!")) + return ITEM_INTERACT_BLOCKING + + if(isstack(tool)) + var/obj/item/stack/stack = tool + stack.use(1) else - return ..() + qdel(tool) + matter = tempMatter //We add its value + playsound(src.loc, 'sound/machines/click.ogg', 10, TRUE) + to_chat(user, span_notice("\The [src] now holds [matter]/[max_matter] [discriptor].")) + icon_state = base_icon_state//and set the icon state to the base state + return ITEM_INTERACT_SUCCESS /obj/item/rsf/attack_self(mob/user) playsound(src.loc, 'sound/effects/pop.ogg', 50, FALSE) diff --git a/code/game/objects/items/rcd/RWD.dm b/code/game/objects/items/rcd/RWD.dm index bafbfdc5d8d..0204e12ae2f 100644 --- a/code/game/objects/items/rcd/RWD.dm +++ b/code/game/objects/items/rcd/RWD.dm @@ -118,12 +118,11 @@ listeningTo = null /// for inserting cable into the rwd -/obj/item/rwd/attackby(obj/item/attacking_item, mob/living/user) - if(!istype(attacking_item, /obj/item/stack/cable_coil)) - return - var/obj/item/stack/cable_coil/cable = attacking_item - add_cable(user, cable) - return TRUE +/obj/item/rwd/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/stack/cable_coil)) + return NONE + add_cable(user, tool) + return ITEM_INTERACT_SUCCESS /obj/item/rwd/click_alt(mob/user) if(!radial_menu) diff --git a/code/game/objects/items/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm index 759638b6b4e..8e9f1ad6194 100644 --- a/code/game/objects/items/robot/items/storage.dm +++ b/code/game/objects/items/robot/items/storage.dm @@ -91,11 +91,11 @@ update_appearance() return NONE -/obj/item/borg/apparatus/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers) - if(stored) - item.melee_attack_chain(user, stored, modifiers) - return - return ..() +/obj/item/borg/apparatus/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!stored) + return NONE + tool.melee_attack_chain(user, stored, modifiers) + return ITEM_INTERACT_SUCCESS /obj/item/borg/apparatus/beaker name = "beaker storage apparatus" diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 5264bca98bd..dd3fe6a3073 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -165,217 +165,235 @@ chest.cell = temp_cell return TRUE -//ADD -/obj/item/robot_suit/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(istype(W, /obj/item/stack/sheet/iron)) - var/obj/item/stack/sheet/iron/M = W - if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) - if (!M.use(1)) - to_chat(user, span_warning("You need one sheet of iron to start building ED-209!")) - return - var/obj/item/bot_assembly/ed209/assembly = new(drop_location()) - to_chat(user, span_notice("You arm the robot frame.")) - var/held_index = user.is_holding(src) - qdel(src) - if (held_index) - user.put_in_hand(assembly, held_index) +//ADD <-- what is the purpose of this code comment? is it an abbreviation? +/obj/item/robot_suit/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/stack/sheet/iron)) + var/obj/item/stack/sheet/iron/iron_sheet = tool + if(l_arm || r_arm || l_leg || r_leg || chest || head) + return ITEM_INTERACT_BLOCKING + if (!iron_sheet.use(1)) + to_chat(user, span_warning("You need one sheet of iron to start building ED-209!")) + return ITEM_INTERACT_BLOCKING + var/obj/item/bot_assembly/ed209/assembly = new(drop_location()) + to_chat(user, span_notice("You arm the robot frame.")) + var/held_index = user.is_holding(src) + qdel(src) + if (held_index) + user.put_in_hand(assembly, held_index) + return ITEM_INTERACT_SUCCESS - else if(istype(W, /obj/item/bodypart/leg/left/robot)) + if(istype(tool, /obj/item/bodypart/leg/left/robot)) if(l_leg) - return - if(!user.transferItemToLoc(W, src)) - return - W.icon_state = initial(W.icon_state) - W.cut_overlays() - l_leg = W + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + tool.icon_state = initial(tool.icon_state) + tool.cut_overlays() + l_leg = tool update_appearance() + return ITEM_INTERACT_SUCCESS - else if(istype(W, /obj/item/bodypart/leg/right/robot)) - if(src.r_leg) - return - if(!user.transferItemToLoc(W, src)) - return - W.icon_state = initial(W.icon_state) - W.cut_overlays() - r_leg = W + if(istype(tool, /obj/item/bodypart/leg/right/robot)) + if(r_leg) + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + tool.icon_state = initial(tool.icon_state) + tool.cut_overlays() + r_leg = tool update_appearance() + return ITEM_INTERACT_SUCCESS - else if(istype(W, /obj/item/bodypart/arm/left/robot)) + if(istype(tool, /obj/item/bodypart/arm/left/robot)) if(l_arm) - return - if(!user.transferItemToLoc(W, src)) - return - W.icon_state = initial(W.icon_state) - W.cut_overlays() - l_arm = W + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + tool.icon_state = initial(tool.icon_state) + tool.cut_overlays() + l_arm = tool update_appearance() + return ITEM_INTERACT_SUCCESS - else if(istype(W, /obj/item/bodypart/arm/right/robot)) + if(istype(tool, /obj/item/bodypart/arm/right/robot)) if(r_arm) - return - if(!user.transferItemToLoc(W, src)) - return - W.icon_state = initial(W.icon_state)//in case it is a dismembered robotic limb - W.cut_overlays() - r_arm = W + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src)) + return ITEM_INTERACT_BLOCKING + tool.icon_state = initial(tool.icon_state)//in case it is a dismembered robotic limb + tool.cut_overlays() + r_arm = tool update_appearance() + return ITEM_INTERACT_SUCCESS - else if(istype(W, /obj/item/bodypart/chest/robot)) - var/obj/item/bodypart/chest/robot/CH = W + if(istype(tool, /obj/item/bodypart/chest/robot)) + var/obj/item/bodypart/chest/robot/new_chestpiece = tool if(chest) - return - if(CH.wired && CH.cell) - if(!user.transferItemToLoc(CH, src)) - return - CH.icon_state = initial(CH.icon_state) //in case it is a dismembered robotic limb - CH.cut_overlays() - chest = CH - update_appearance() - else if(!CH.wired) + return ITEM_INTERACT_BLOCKING + + if(!new_chestpiece.wired) to_chat(user, span_warning("You need to attach wires to it first!")) - else + return ITEM_INTERACT_BLOCKING + + if(!new_chestpiece.cell) to_chat(user, span_warning("You need to attach a cell to it first!")) + return ITEM_INTERACT_BLOCKING - else if(istype(W, /obj/item/bodypart/head/robot)) - var/obj/item/bodypart/head/robot/HD = W - if(locate(/obj/item/organ) in HD) - to_chat(user, span_warning("There are organs inside [HD]!")) - return + if(!user.transferItemToLoc(new_chestpiece, src)) + return ITEM_INTERACT_BLOCKING + + new_chestpiece.icon_state = initial(new_chestpiece.icon_state) //in case it is a dismembered robotic limb + new_chestpiece.cut_overlays() + chest = new_chestpiece + update_appearance() + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/bodypart/head/robot)) + var/obj/item/bodypart/head/robot/new_headpiece = tool + if(locate(/obj/item/organ) in new_headpiece) + to_chat(user, span_warning("There are organs inside [new_headpiece]!")) + return ITEM_INTERACT_BLOCKING if(head) - return - if(HD.flash2 && HD.flash1) - if(!user.transferItemToLoc(HD, src)) - return - HD.icon_state = initial(HD.icon_state)//in case it is a dismembered robotic limb - HD.cut_overlays() - head = HD - update_appearance() - else + return ITEM_INTERACT_BLOCKING + if(!new_headpiece.flash2 || !new_headpiece.flash1) to_chat(user, span_warning("You need to attach a flash to it first!")) + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(new_headpiece, src)) + return ITEM_INTERACT_BLOCKING + new_headpiece.icon_state = initial(new_headpiece.icon_state)//in case it is a dismembered robotic limb + new_headpiece.cut_overlays() + head = new_headpiece + update_appearance() + return ITEM_INTERACT_SUCCESS - else if (W.tool_behaviour == TOOL_MULTITOOL) - if(check_completion()) - ui_interact(user) - else - to_chat(user, span_warning("The endoskeleton must be assembled before debugging can begin!")) - - else if(istype(W, /obj/item/mmi)) - var/obj/item/mmi/M = W - if(check_completion()) - if(!chest.cell) - to_chat(user, span_warning("The endoskeleton still needs a power cell!")) - return - if(!isturf(loc)) - to_chat(user, span_warning("You can't put [M] in, the frame has to be standing on the ground to be perfectly precise!")) - return - if(!M.brain_check(user)) - return - - var/mob/living/brain/brainmob = M.brainmob - if(is_banned_from(brainmob.ckey, JOB_CYBORG) || QDELETED(src) || QDELETED(brainmob) || QDELETED(user) || QDELETED(M) || !Adjacent(user)) - if(!QDELETED(M)) - to_chat(user, span_warning("This [M.name] does not seem to fit!")) - return - if(!user.temporarilyRemoveItemFromInventory(W)) - return - - var/mob/living/silicon/robot/O = new /mob/living/silicon/robot/nocell(get_turf(loc), user) - if(!O) - return - if(M.laws && M.laws.id != DEFAULT_AI_LAWID) - aisync = FALSE - lawsync = FALSE - O.laws = M.laws - M.laws.associate(O) - - O.SetInvisibility(INVISIBILITY_NONE) - //Transfer debug settings to new mob - O.custom_name = created_name - O.locked = panel_locked - if(!aisync) - lawsync = FALSE - O.set_connected_ai(null) - else - O.notify_ai(AI_NOTIFICATION_NEW_BORG) - if(forced_ai) - O.set_connected_ai(forced_ai) - if(!lawsync) - O.lawupdate = FALSE - if(M.laws.id == DEFAULT_AI_LAWID) - O.make_laws() - O.log_current_laws() - - brainmob.mind?.remove_antags_for_borging() - O.job = JOB_CYBORG - - O.cell = chest.cell - chest.cell.forceMove(O) - - W.forceMove(O)//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. - QDEL_NULL(O.mmi) //we delete the mmi created by robot/New() - O.mmi = W //and give the real mmi to the borg. - O.updatename(brainmob.client) - // This canonizes that MMI'd cyborgs have memories of their previous life - brainmob.add_mob_memory(/datum/memory/was_cyborged, protagonist = brainmob.mind, deuteragonist = user) - brainmob.mind.transfer_to(O) - playsound(O.loc, 'sound/mobs/non-humanoids/cyborg/liveagain.ogg', 75, TRUE) - - if(O.is_antag()) - to_chat(O, span_userdanger("You have been robotized!")) - to_chat(O, span_danger("You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.")) - - SSblackbox.record_feedback("amount", "cyborg_birth", 1) - forceMove(O) - O.robot_suit = src - - user.log_message("put the MMI/posibrain of [key_name(M.brainmob)] into a cyborg shell", LOG_GAME) - M.brainmob.log_message("was put into a cyborg shell by [key_name(user)]", LOG_GAME, log_globally = FALSE) - - if(!locomotion) - O.set_lockcharge(TRUE) - to_chat(O, span_warning("Error: Servo motors unresponsive.")) - - else + if(istype(tool, /obj/item/mmi)) + var/obj/item/mmi/potential_brain = tool + if(!check_completion()) to_chat(user, span_warning("The MMI must go in after everything else!")) + return ITEM_INTERACT_BLOCKING + if(!chest.cell) + to_chat(user, span_warning("The endoskeleton still needs a power cell!")) + return ITEM_INTERACT_BLOCKING + if(!isturf(loc)) + to_chat(user, span_warning("You can't put [potential_brain] in, the frame has to be standing on the ground to be perfectly precise!")) + return ITEM_INTERACT_BLOCKING + if(!potential_brain.brain_check(user)) + return ITEM_INTERACT_BLOCKING - else if(istype(W, /obj/item/borg/upgrade/ai)) - var/obj/item/borg/upgrade/ai/M = W - if(check_completion()) - if(!isturf(loc)) - to_chat(user, span_warning("You cannot install [M], the frame has to be standing on the ground to be perfectly precise!")) - return - if(!user.temporarilyRemoveItemFromInventory(M)) - to_chat(user, span_warning("[M] is stuck to your hand!")) - return - qdel(M) - var/mob/living/silicon/robot/O = new /mob/living/silicon/robot/shell(get_turf(src)) + var/mob/living/brain/brainmob = potential_brain.brainmob + if(is_banned_from(brainmob.ckey, JOB_CYBORG) || QDELETED(src) || QDELETED(brainmob) || QDELETED(user) || QDELETED(potential_brain) || !Adjacent(user)) + if(!QDELETED(potential_brain)) + to_chat(user, span_warning("This [potential_brain.name] does not seem to fit!")) + return ITEM_INTERACT_BLOCKING + if(!user.temporarilyRemoveItemFromInventory(tool)) + return ITEM_INTERACT_BLOCKING - if(!aisync) - lawsync = FALSE - O.set_connected_ai(null) - else - if(forced_ai) - O.set_connected_ai(forced_ai) - O.notify_ai(AI_NOTIFICATION_AI_SHELL) - if(!lawsync) - O.lawupdate = FALSE - O.make_laws() - O.log_current_laws() + var/mob/living/silicon/robot/final_product = new /mob/living/silicon/robot/nocell(get_turf(loc), user) + if(!final_product) + return ITEM_INTERACT_BLOCKING + if(potential_brain.laws && potential_brain.laws.id != DEFAULT_AI_LAWID) + aisync = FALSE + lawsync = FALSE + final_product.laws = potential_brain.laws + potential_brain.laws.associate(final_product) - O.cell = chest.cell - chest.cell.forceMove(O) + final_product.SetInvisibility(INVISIBILITY_NONE) + //Transfer debug settings to new mob + final_product.custom_name = created_name + final_product.locked = panel_locked + if(!aisync) + lawsync = FALSE + final_product.set_connected_ai(null) + else + final_product.notify_ai(AI_NOTIFICATION_NEW_BORG) + if(forced_ai) + final_product.set_connected_ai(forced_ai) + if(!lawsync) + final_product.lawupdate = FALSE + if(potential_brain.laws.id == DEFAULT_AI_LAWID) + final_product.make_laws() + final_product.log_current_laws() - O.locked = panel_locked - O.job = JOB_CYBORG - forceMove(O) - O.robot_suit = src - if(!locomotion) - O.set_lockcharge(TRUE) + brainmob.mind?.remove_antags_for_borging() + final_product.job = JOB_CYBORG - else if(IS_WRITING_UTENSIL(W)) + final_product.cell = chest.cell + chest.cell.forceMove(final_product) + + tool.forceMove(final_product)//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. + QDEL_NULL(final_product.mmi) //we delete the mmi created by robot/New() + final_product.mmi = tool //and give the real mmi to the borg. + final_product.updatename(brainmob.client) + // This canonizes that MMI'd cyborgs have memories of their previous life + brainmob.add_mob_memory(/datum/memory/was_cyborged, protagonist = brainmob.mind, deuteragonist = user) + brainmob.mind.transfer_to(final_product) + playsound(final_product.loc, 'sound/mobs/non-humanoids/cyborg/liveagain.ogg', 75, TRUE) + + if(final_product.is_antag()) + to_chat(final_product, span_userdanger("You have been robotized!")) + to_chat(final_product, span_danger("You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.")) + + SSblackbox.record_feedback("amount", "cyborg_birth", 1) + forceMove(final_product) + final_product.robot_suit = src + + user.log_message("put the MMI/posibrain of [key_name(brainmob)] into a cyborg shell", LOG_GAME) + brainmob.log_message("was put into a cyborg shell by [key_name(user)]", LOG_GAME, log_globally = FALSE) + + if(!locomotion) + final_product.set_lockcharge(TRUE) + to_chat(final_product, span_warning("Error: Servo motors unresponsive.")) + return ITEM_INTERACT_SUCCESS + + + if(istype(tool, /obj/item/borg/upgrade/ai)) + var/obj/item/borg/upgrade/ai/boris_module = tool + if(!check_completion()) + return ITEM_INTERACT_BLOCKING + if(!isturf(loc)) + to_chat(user, span_warning("You cannot install [boris_module], the frame has to be standing on the ground to be perfectly precise!")) + return ITEM_INTERACT_BLOCKING + if(!user.temporarilyRemoveItemFromInventory(boris_module)) + to_chat(user, span_warning("[boris_module] is stuck to your hand!")) + return ITEM_INTERACT_BLOCKING + qdel(boris_module) + var/mob/living/silicon/robot/final_product = new /mob/living/silicon/robot/shell(get_turf(src)) + + if(!aisync) + lawsync = FALSE + final_product.set_connected_ai(null) + else + if(forced_ai) + final_product.set_connected_ai(forced_ai) + final_product.notify_ai(AI_NOTIFICATION_AI_SHELL) + if(!lawsync) + final_product.lawupdate = FALSE + final_product.make_laws() + final_product.log_current_laws() + + final_product.cell = chest.cell + chest.cell.forceMove(final_product) + + final_product.locked = panel_locked + final_product.job = JOB_CYBORG + forceMove(final_product) + final_product.robot_suit = src + if(!locomotion) + final_product.set_lockcharge(TRUE) + return ITEM_INTERACT_SUCCESS + + if(IS_WRITING_UTENSIL(tool)) to_chat(user, span_warning("You need to use a multitool to name [src]!")) - else - return ..() + return ITEM_INTERACT_BLOCKING + + return NONE + +/obj/item/robot_suit/multitool_act(mob/living/user, obj/item/tool) + if(!check_completion()) + to_chat(user, span_warning("The endoskeleton must be assembled before debugging can begin!")) + return ITEM_INTERACT_SKIP_TO_ATTACK + ui_interact(user) + return ITEM_INTERACT_SUCCESS /obj/item/robot_suit/ui_status(mob/user, datum/ui_state/state) if(isobserver(user)) diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm index f01ca917f8c..1da204615af 100644 --- a/code/game/objects/items/sharpener.dm +++ b/code/game/objects/items/sharpener.dm @@ -23,45 +23,46 @@ ///If TRUE, the whetstone will only sharpen already sharp items var/requires_sharpness = TRUE -/obj/item/sharpener/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/sharpener/item_interaction(mob/living/user, obj/item/tool, list/modifiers) if(uses == 0) to_chat(user, span_warning("The sharpening block is too worn to use again!")) - return - if(I.force >= max || I.throwforce >= max) //So the whetstone never reduces force or throw_force - to_chat(user, span_warning("[I] is much too powerful to sharpen further!")) - return - if(requires_sharpness && !I.get_sharpness()) + return ITEM_INTERACT_BLOCKING + if(tool.force >= max || tool.throwforce >= max) //So the whetstone never reduces force or throw_force + to_chat(user, span_warning("[tool] is much too powerful to sharpen further!")) + return ITEM_INTERACT_BLOCKING + if(requires_sharpness && !tool.get_sharpness()) to_chat(user, span_warning("You can only sharpen items that are already sharp, such as knives!")) - return - if(is_type_in_list(I, list(/obj/item/melee/energy, /obj/item/dualsaber))) //You can't sharpen the photons in energy meelee weapons - to_chat(user, span_warning("You don't think \the [I] will be the thing getting modified if you use it on \the [src]!")) - return + return ITEM_INTERACT_BLOCKING + if(is_type_in_list(tool, list(/obj/item/melee/energy, /obj/item/dualsaber))) //You can't sharpen the photons in energy meelee weapons + to_chat(user, span_warning("You don't think \the [tool] will be the thing getting modified if you use it on \the [src]!")) + return ITEM_INTERACT_BLOCKING //This block is used to check more things if the item has a relevant component. - var/signal_out = SEND_SIGNAL(I, COMSIG_ITEM_SHARPEN_ACT, increment, max) //Stores the bitflags returned by SEND_SIGNAL + var/signal_out = SEND_SIGNAL(tool, COMSIG_ITEM_SHARPEN_ACT, increment, max) //Stores the bitflags returned by SEND_SIGNAL if(signal_out & COMPONENT_BLOCK_SHARPEN_MAXED) //If the item's components enforce more limits on maximum power from sharpening, we fail - to_chat(user, span_warning("[I] is much too powerful to sharpen further!")) - return + to_chat(user, span_warning("[tool] is much too powerful to sharpen further!")) + return ITEM_INTERACT_BLOCKING if(signal_out & COMPONENT_BLOCK_SHARPEN_BLOCKED) - to_chat(user, span_warning("[I] is not able to be sharpened right now!")) - return - if((signal_out & COMPONENT_BLOCK_SHARPEN_ALREADY) || (I.force > initial(I.force) && !signal_out)) //No sharpening stuff twice - to_chat(user, span_warning("[I] has already been refined before. It cannot be sharpened further!")) - return + to_chat(user, span_warning("[tool] is not able to be sharpened right now!")) + return ITEM_INTERACT_BLOCKING + if((signal_out & COMPONENT_BLOCK_SHARPEN_ALREADY) || (tool.force > initial(tool.force) && !signal_out)) //No sharpening stuff twice + to_chat(user, span_warning("[tool] has already been refined before. It cannot be sharpened further!")) + return ITEM_INTERACT_BLOCKING if(!(signal_out & COMPONENT_BLOCK_SHARPEN_APPLIED)) //If the item has a relevant component and COMPONENT_BLOCK_SHARPEN_APPLIED is returned, the item only gets the throw force increase - I.force = clamp(I.force + increment, 0, max) - I.wound_bonus = I.wound_bonus + increment //wound_bonus has no cap - user.visible_message(span_notice("[user] sharpens [I] with [src]!"), span_notice("You sharpen [I], making it much more deadly than before.")) + tool.force = clamp(tool.force + increment, 0, max) + tool.wound_bonus = tool.wound_bonus + increment //wound_bonus has no cap + user.visible_message(span_notice("[user] sharpens [tool] with [src]!"), span_notice("You sharpen [tool], making it much more deadly than before.")) playsound(src, 'sound/items/unsheath.ogg', 25, TRUE) if(!(signal_out & COMPONENT_BLOCK_SHARPEN_SHARPNESS)) - I.sharpness = SHARP_EDGED //When you whetstone something, it becomes an edged weapon, even if it was previously dull or pointy - I.throwforce = clamp(I.throwforce + increment, 0, max) - I.name = "[prefix] [I.name]" //This adds a prefix and a space to the item's name regardless of what the prefix is + tool.sharpness = SHARP_EDGED //When you whetstone something, it becomes an edged weapon, even if it was previously dull or pointy + tool.throwforce = clamp(tool.throwforce + increment, 0, max) + tool.name = "[prefix] [tool.name]" //This adds a prefix and a space to the item's name regardless of what the prefix is desc = "[desc] At least, it used to." uses-- //this doesn't cause issues because we check if uses == 0 earlier in this proc if(uses == 0) name = "worn out [name]" //whetstone becomes used whetstone update_appearance() + return ITEM_INTERACT_SUCCESS /obj/item/sharpener/update_name() name = "[!uses ? "worn out " : null][initial(name)]" diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 1009aa894ef..55e67cc13bc 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -49,37 +49,42 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ . = ..() . += GLOB.glass_recipes -/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/stack/sheet/glass/item_interaction(mob/living/user, obj/item/tool, list/modifiers) add_fingerprint(user) - if(istype(W, /obj/item/lightreplacer)) - var/obj/item/lightreplacer/lightreplacer = W - lightreplacer.attackby(src, user) - if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/CC = W - if (get_amount() < 1 || CC.get_amount() < 5) + if(istype(tool, /obj/item/lightreplacer)) + var/obj/item/lightreplacer/lightreplacer = tool + lightreplacer.item_interaction(user, src, modifiers) + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = tool + if (get_amount() < 1 || coil.get_amount() < 5) to_chat(user, span_warning("You need five lengths of coil and one sheet of glass to make wired glass!")) - return - CC.use(5) + return ITEM_INTERACT_BLOCKING + coil.use(5) use(1) to_chat(user, span_notice("You attach wire to \the [src].")) var/obj/item/stack/light_w/new_tile = new(user.loc) if (!QDELETED(new_tile)) new_tile.add_fingerprint(user) - return - if(istype(W, /obj/item/stack/rods)) - var/obj/item/stack/rods/V = W - if (V.get_amount() >= 1 && get_amount() >= 1) - var/obj/item/stack/sheet/rglass/RG = new (get_turf(user)) - if(!QDELETED(RG)) - RG.add_fingerprint(user) - var/replace = user.get_inactive_held_item() == src - V.use(1) - use(1) - if(QDELETED(src) && replace && !QDELETED(RG)) - user.put_in_hands(RG) - else + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/stack/rods)) + var/obj/item/stack/rods/rods = tool + if (rods.get_amount() < 1 || get_amount() < 1) // the hell kind of check is this, how would this happen to_chat(user, span_warning("You need one rod and one sheet of glass to make reinforced glass!")) - return + return ITEM_INTERACT_BLOCKING + + var/obj/item/stack/sheet/rglass/new_glass = new (get_turf(user)) + if(!QDELETED(new_glass)) + new_glass.add_fingerprint(user) + var/replace = user.get_inactive_held_item() == src + rods.use(1) + use(1) + if(QDELETED(src) && replace && !QDELETED(new_glass)) + user.put_in_hands(new_glass) + return ITEM_INTERACT_SUCCESS + return ..() GLOBAL_LIST_INIT(pglass_recipes, list ( \ @@ -116,26 +121,28 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ . = ..() . += GLOB.pglass_recipes -/obj/item/stack/sheet/plasmaglass/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/stack/sheet/plasmaglass/item_interaction(mob/living/user, obj/item/tool, list/modifiers) add_fingerprint(user) - - if(istype(W, /obj/item/stack/rods)) - var/obj/item/stack/rods/V = W - if (V.get_amount() >= 1 && get_amount() >= 1) - var/obj/item/stack/sheet/plasmarglass/RG = new (get_turf(user)) - if (!QDELETED(RG)) - RG.add_fingerprint(user) - var/replace = user.get_inactive_held_item() == src - V.use(1) - use(1) - if(QDELETED(src) && replace) - user.put_in_hands(RG) - else - to_chat(user, span_warning("You need one rod and one sheet of plasma glass to make reinforced plasma glass!")) - return - else + if(!istype(tool, /obj/item/stack/rods)) return ..() + var/obj/item/stack/rods/rods = tool + if (rods.get_amount() < 1 || get_amount() < 1) + to_chat(user, span_warning("You need one rod and one sheet of plasma glass to make reinforced plasma glass!")) + return ITEM_INTERACT_BLOCKING + + var/obj/item/stack/sheet/plasmarglass/RG = new (get_turf(user)) + if (!QDELETED(RG)) + RG.add_fingerprint(user) + var/replace = user.get_inactive_held_item() == src + rods.use(1) + use(1) + if(QDELETED(src) && replace) + user.put_in_hands(RG) + return ITEM_INTERACT_SUCCESS + + + /* * Reinforced glass sheets */ @@ -174,9 +181,9 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ fire = 70 acid = 100 -/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/stack/sheet/rglass/item_interaction(mob/living/user, obj/item/tool, list/modifiers) add_fingerprint(user) - ..() + . = ..() /obj/item/stack/sheet/rglass/get_main_recipes() . = ..() diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 83b202bc911..c2e769c7f55 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -379,17 +379,17 @@ GLOBAL_LIST_INIT(bear_pelt_recipes, list ( \ . += GLOB.bear_pelt_recipes //Step one - dehairing. - -/obj/item/stack/sheet/animalhide/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(W.get_sharpness()) - playsound(loc, 'sound/items/weapons/slice.ogg', 50, TRUE, -1) - user.visible_message(span_notice("[user] starts cutting hair off \the [src]."), span_notice("You start cutting the hair off \the [src]..."), span_hear("You hear the sound of a knife rubbing against flesh.")) - if(do_after(user, 5 SECONDS, target = src)) - to_chat(user, span_notice("You cut the hair from [src.name].")) - new /obj/item/stack/sheet/hairlesshide(user.drop_location(), amount) - use(amount) - else +/obj/item/stack/sheet/animalhide/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!tool.get_sharpness()) return ..() + playsound(loc, 'sound/items/weapons/slice.ogg', 50, TRUE, -1) + user.visible_message(span_notice("[user] starts cutting hair off \the [src]."), span_notice("You start cutting the hair off \the [src]..."), span_hear("You hear the sound of a knife rubbing against flesh.")) + if(!do_after(user, 5 SECONDS, target = src)) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("You cut the hair from [src.name].")) + new /obj/item/stack/sheet/hairlesshide(user.drop_location(), amount) + use(amount) + return ITEM_INTERACT_SUCCESS /obj/item/stack/sheet/animalhide/examine(mob/user) . = ..() diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index 4d06e8fb3d1..7f4e589f034 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -21,19 +21,20 @@ . = ..() . += span_warning("\The [src] looks unfinished, add iron to complete it.") -/obj/item/stack/light_w/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) - if(istype(O, /obj/item/stack/sheet/iron)) - var/obj/item/stack/sheet/iron/M = O - if (M.use(1)) - var/obj/item/L = new /obj/item/stack/tile/light(user.drop_location()) - to_chat(user, span_notice("You make a light tile.")) - if (!QDELETED(L)) - L.add_fingerprint(user) - use(1) - else - to_chat(user, span_warning("You need one iron sheet to finish the light tile!")) - else +/obj/item/stack/light_w/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/stack/sheet/iron)) return ..() + var/obj/item/stack/sheet/iron/steel = tool + if(!steel.use(1)) + to_chat(user, span_warning("You need one iron sheet to finish the light tile!")) + return ITEM_INTERACT_BLOCKING + + var/obj/item/stack/tile/light/finished_tiles = new(user.drop_location()) + to_chat(user, span_notice("You make a light tile.")) + if(!QDELETED(finished_tiles)) + finished_tiles.add_fingerprint(user) + use(1) + return ITEM_INTERACT_SUCCESS /obj/item/stack/light_w/wirecutter_act(mob/living/user, obj/item/I) . = ..() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 8bd0b2b9ad8..0d05b853a9e 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -85,17 +85,17 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ icon_state = "sandbag" w_class = WEIGHT_CLASS_TINY -/obj/item/emptysandbag/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(istype(W, /obj/item/stack/ore/glass)) - var/obj/item/stack/ore/glass/G = W - to_chat(user, span_notice("You fill the sandbag.")) - var/obj/item/stack/sheet/mineral/sandbags/I = new (drop_location()) - qdel(src) - if (Adjacent(user) && !issilicon(user)) - user.put_in_hands(I) - G.use(1) - else - return ..() +/obj/item/emptysandbag/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/stack/ore/glass)) + return NONE + var/obj/item/stack/ore/glass/sand = tool + to_chat(user, span_notice("You fill the sandbag.")) + var/obj/item/stack/sheet/mineral/sandbags/filled_bag = new (drop_location()) + qdel(src) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(filled_bag) + sand.use(1) + return ITEM_INTERACT_SUCCESS /* * Diamond @@ -316,25 +316,28 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ . = ..() . += GLOB.titanium_recipes -/obj/item/stack/sheet/mineral/titanium/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/stack/sheet/mineral/titanium/item_interaction(mob/living/user, obj/item/tool, list/modifiers) add_fingerprint(user) - if(istype(W, /obj/item/stack/rods)) - var/obj/item/stack/rods/old_rods = W - if(old_rods.merge_type != /obj/item/stack/rods) - to_chat(user, span_warning("You can't craft shuttle frame rods with this type of rod!")) - if (old_rods.get_amount() >= 5 && get_amount() >= 1) - var/obj/item/stack/rods/shuttle/five/new_rods = new (get_turf(user)) - if(!QDELETED(new_rods)) - new_rods.add_fingerprint(user) - var/replace = user.get_inactive_held_item() == src - old_rods.use(5) - use(1) - if(QDELETED(src) && replace && !QDELETED(new_rods)) - user.put_in_hands(new_rods) - else - to_chat(user, span_warning("You need five rods and one sheet of titanium to make shuttle frame rods!")) - return - return ..() + if(!istype(tool, /obj/item/stack/rods)) + return ..() + var/obj/item/stack/rods/old_rods = tool + if(old_rods.merge_type != /obj/item/stack/rods) + to_chat(user, span_warning("You can't craft shuttle frame rods with this type of rod!")) + return ITEM_INTERACT_BLOCKING + + if (old_rods.get_amount() < 5 && get_amount() < 1) + to_chat(user, span_warning("You need five rods and one sheet of titanium to make shuttle frame rods!")) + return ITEM_INTERACT_BLOCKING + + var/obj/item/stack/rods/shuttle/five/new_rods = new (get_turf(user)) + if(!QDELETED(new_rods)) + new_rods.add_fingerprint(user) + var/replace = user.get_inactive_held_item() == src + old_rods.use(5) + use(1) + if(QDELETED(src) && replace && !QDELETED(new_rods)) + user.put_in_hands(new_rods) + return ITEM_INTERACT_SUCCESS /obj/item/stack/sheet/mineral/titanium/fifty amount = 50 @@ -498,15 +501,15 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ /obj/item/stack/sheet/mineral/coal/grind_results() return list(/datum/reagent/carbon = 20) -/obj/item/stack/sheet/mineral/coal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(W.get_temperature() >= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) //If the temperature of the object is hot enough to start a fire, then ignite - var/turf/T = get_turf(src) - message_admins("Coal ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]") - user.log_message("ignited coal", LOG_GAME) - fire_act(W.get_temperature()) - return TRUE - else +/obj/item/stack/sheet/mineral/coal/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(tool.get_temperature() < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) //If the temperature of the object is hot enough to start a fire, then ignite return ..() + var/turf/jumpturf = get_turf(src) + message_admins("Coal ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(jumpturf)]") + user.log_message("ignited coal", LOG_GAME) + fire_act(tool.get_temperature()) + return ITEM_INTERACT_SUCCESS + /obj/item/stack/sheet/mineral/coal/fire_act(exposed_temperature, exposed_volume) atmos_spawn_air("[GAS_CO2]=[amount*10];[TURF_TEMPERATURE(exposed_temperature)]") diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 8ec2a97520a..53f8301a2c3 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -745,22 +745,25 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ /obj/item/stack/sheet/cardboard/fifty amount = 50 -/obj/item/stack/sheet/cardboard/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(istype(I, /obj/item/stamp/clown) && !istype(loc, /obj/item/storage)) +/obj/item/stack/sheet/cardboard/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/stamp/clown) && !istype(loc, /obj/item/storage)) var/atom/droploc = drop_location() - if(use(1)) - playsound(I, 'sound/items/bikehorn.ogg', 50, TRUE, -1) - to_chat(user, span_notice("You stamp the cardboard! It's a clown box! Honk!")) - if (amount >= 0) - new/obj/item/storage/box/clown(droploc) //bugfix - if(istype(I, /obj/item/stamp/chameleon) && !istype(loc, /obj/item/storage)) + if(!use(1)) + return ITEM_INTERACT_BLOCKING + playsound(tool, 'sound/items/bikehorn.ogg', 50, TRUE, -1) + to_chat(user, span_notice("You stamp the cardboard! It's a clown box! Honk!")) + new /obj/item/storage/box/clown(droploc) //bugfix + return ITEM_INTERACT_SUCCESS + + if(istype(tool, /obj/item/stamp/chameleon) && !istype(loc, /obj/item/storage)) var/atom/droploc = drop_location() - if(use(1)) - to_chat(user, span_notice("You stamp the cardboard in a sinister way.")) - if (amount >= 0) - new/obj/item/storage/box/syndie_kit(droploc) - else - . = ..() + if(!use(1)) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("You stamp the cardboard in a sinister way.")) + new /obj/item/storage/box/syndie_kit(droploc) + return ITEM_INTERACT_SUCCESS + + return ..() /* * Bronze diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index a7b365b3e29..c49c1784e11 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -792,13 +792,14 @@ user.put_in_hands(new_stack, merge_stacks = FALSE) return new_stack -/obj/item/stack/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(can_merge(W, inhand = TRUE)) - var/obj/item/stack/S = W - if(merge(S)) - to_chat(user, span_notice("Your [S.name] stack now contains [S.get_amount()] [S.singular_name]\s.")) - else - . = ..() +/obj/item/stack/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!can_merge(tool, inhand = TRUE)) + return NONE + var/obj/item/stack/overtaking_stack = tool + if(!merge(overtaking_stack)) + return ITEM_INTERACT_BLOCKING + to_chat(user, span_notice("Your [overtaking_stack.name] stack now contains [overtaking_stack.get_amount()] [overtaking_stack.singular_name]\s.")) + return ITEM_INTERACT_SUCCESS /obj/item/stack/proc/copy_evidences(obj/item/stack/from) add_blood_DNA(GET_ATOM_BLOOD_DNA(from)) diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm index 651cf36ac1a..56b0a0653a8 100644 --- a/code/game/objects/items/stacks/tiles/light.dm +++ b/code/game/objects/items/stacks/tiles/light.dm @@ -11,15 +11,14 @@ mats_per_unit = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.05, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.05) var/state = 0 -/obj/item/stack/tile/light/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) - if(O.tool_behaviour == TOOL_CROWBAR) - new/obj/item/stack/sheet/iron(user.loc) - amount-- - new/obj/item/stack/light_w(user.loc) - if(amount <= 0) - qdel(src) - else - return ..() +/obj/item/stack/tile/light/crowbar_act(mob/living/user, obj/item/tool) + new/obj/item/stack/sheet/iron(user.loc) + amount-- + new/obj/item/stack/light_w(user.loc) + if(amount <= 0) + qdel(src) + return ITEM_INTERACT_SUCCESS + /obj/item/stack/tile/light/place_tile(turf/open/target_plating, mob/user) . = ..() diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm index 67a905b4334..6650528d012 100644 --- a/code/game/objects/items/stacks/tiles/tile_mineral.dm +++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm @@ -2,27 +2,26 @@ /// Determines what stack is gotten out of us when welded. var/mineralType = null -/obj/item/stack/tile/mineral/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(W.tool_behaviour == TOOL_WELDER) - if(get_amount() < 4) - to_chat(user, span_warning("You need at least four tiles to do this!")) - return - if(!mineralType) - to_chat(user, span_warning("You can not reform this!")) - stack_trace("A mineral tile of type [type] doesn't have its mineralType set.") - return - if(W.use_tool(src, user, 0, volume=40)) - var/sheet_type = text2path("/obj/item/stack/sheet/mineral/[mineralType]") - var/obj/item/stack/sheet/mineral/new_item = new sheet_type(user.loc) - user.visible_message(span_notice("[user] shaped [src] into [new_item] with [W]."), \ - span_notice("You shaped [src] into [new_item] with [W]."), \ - span_hear("You hear welding.")) - var/holding = user.is_holding(src) - use(4) - if(holding && QDELETED(src)) - user.put_in_hands(new_item) - else - return ..() +/obj/item/stack/tile/mineral/welder_act(mob/living/user, obj/item/tool) + if(get_amount() < 4) + to_chat(user, span_warning("You need at least four tiles to do this!")) + return ITEM_INTERACT_BLOCKING + if(!mineralType) + to_chat(user, span_warning("You can not reform this!")) + stack_trace("A mineral tile of type [type] doesn't have its mineralType set.") + return ITEM_INTERACT_BLOCKING + if(!tool.use_tool(src, user, 0, volume=40)) + return ITEM_INTERACT_BLOCKING + var/sheet_type = text2path("/obj/item/stack/sheet/mineral/[mineralType]") + var/obj/item/stack/sheet/mineral/new_item = new sheet_type(user.loc) + user.visible_message(span_notice("[user] shaped [src] into [new_item] with [tool]."), \ + span_notice("You shaped [src] into [new_item] with [tool]."), \ + span_hear("You hear welding.")) + var/holding = user.is_holding(src) + use(4) + if(holding && QDELETED(src)) + user.put_in_hands(new_item) + return ITEM_INTERACT_SUCCESS /obj/item/stack/tile/mineral/plasma name = "plasma tile" diff --git a/code/game/objects/items/tail_pin.dm b/code/game/objects/items/tail_pin.dm index 8b6aa245b3c..32a4d164bdc 100644 --- a/code/game/objects/items/tail_pin.dm +++ b/code/game/objects/items/tail_pin.dm @@ -35,16 +35,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/party_game, 32) -/obj/structure/sign/poster/party_game/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) - . = ..() - if(!istype(attacking_item, /obj/item/tail_pin))//We're using the same trick that tables use for placing objects x and y onto the click location. - return +/obj/structure/sign/poster/party_game/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/tail_pin))//We're using the same trick that tables use for placing objects x and y onto the click location. + return NONE var/x_offset = 0 var/y_offset = 0 if(LAZYACCESS(modifiers, ICON_X) && LAZYACCESS(modifiers, ICON_Y)) x_offset = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(ICON_SIZE_X/2), ICON_SIZE_X/2) y_offset = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(ICON_SIZE_Y/2), ICON_SIZE_Y/2) - if(!user.transfer_item_to_turf(attacking_item, drop_location(), x_offset, y_offset, silent = FALSE)) - return - return TRUE + if(!user.transfer_item_to_turf(tool, drop_location(), x_offset, y_offset, silent = FALSE)) + return ITEM_INTERACT_BLOCKING + return ITEM_INTERACT_SUCCESS diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 11ce2b69479..9bc4796162b 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -101,18 +101,18 @@ /obj/item/tank/internals/plasma/populate_gas() air_contents.set_gas(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) -/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) - if(istype(W, /obj/item/flamethrower)) - var/obj/item/flamethrower/F = W - if ((!F.status) || (F.ptank)) - return - if(!user.transferItemToLoc(src, F)) - return - src.master = F - F.ptank = src - F.update_appearance() - else +/obj/item/tank/internals/plasma/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/flamethrower)) return ..() + var/obj/item/flamethrower/spewer = tool + if (spewer.status || spewer.ptank) + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(src, spewer)) + return ITEM_INTERACT_BLOCKING + master = spewer // does master even do anything anymore? + spewer.ptank = src + spewer.update_appearance() + return ITEM_INTERACT_SUCCESS /obj/item/tank/internals/plasma/full/populate_gas() air_contents.set_gas(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index a878e89e975..78d6983292c 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -199,15 +199,15 @@ to_chat(user, span_warning("There isn't enough pressure in [src] to commit suicide with...")) return SHAME -/obj/item/tank/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/tank/item_interaction(mob/living/user, obj/item/tool, list/modifiers) add_fingerprint(user) - if(istype(attacking_item, /obj/item/assembly_holder)) - if(tank_assembly) - balloon_alert(user, "something already attached!") - return ITEM_INTERACT_BLOCKING - bomb_assemble(attacking_item, user) - return ITEM_INTERACT_SUCCESS - return ..() + if(!istype(tool, /obj/item/assembly_holder)) + return NONE + if(tank_assembly) + balloon_alert(user, "something already attached!") + return ITEM_INTERACT_BLOCKING + bomb_assemble(tool, user) + return ITEM_INTERACT_SUCCESS /obj/item/tank/wrench_act(mob/living/user, obj/item/tool) if(tank_assembly) diff --git a/code/game/objects/items/toy_mechs.dm b/code/game/objects/items/toy_mechs.dm index cf8b1f34128..77970efac14 100644 --- a/code/game/objects/items/toy_mechs.dm +++ b/code/game/objects/items/toy_mechs.dm @@ -144,12 +144,12 @@ /** * If you attack a mech with a mech, initiate combat between them */ -/obj/item/toy/mecha/attackby(obj/item/user_toy, mob/living/user) - if(istype(user_toy, /obj/item/toy/mecha)) - var/obj/item/toy/mecha/P = user_toy - if(check_battle_start(user, P)) - mecha_brawl(P, user) - ..() +/obj/item/toy/mecha/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/toy/mecha)) + return NONE + var/obj/item/toy/mecha/challenger = tool + if(check_battle_start(user, challenger)) + mecha_brawl(challenger, user) /** * Attack is called from the user's toy, aimed at target(another human), checking for target's toy. diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 771bacc5a8f..8cc5d16adf6 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -78,22 +78,27 @@ return ITEM_INTERACT_SUCCESS return ITEM_INTERACT_BLOCKING -/obj/item/toy/waterballoon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(istype(I, /obj/item/reagent_containers/cup)) - if(I.reagents) - if(I.reagents.total_volume <= 0) - to_chat(user, span_warning("[I] is empty.")) - else if(reagents.total_volume >= 10) - to_chat(user, span_warning("[src] is full.")) - else - desc = "A translucent balloon with some form of liquid sloshing around in it." - to_chat(user, span_notice("You fill the balloon with the contents of [I].")) - I.reagents.trans_to(src, 10, transferred_by = user) - update_appearance() - else if(I.get_sharpness()) +/obj/item/toy/waterballoon/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/reagent_containers/cup) && tool.reagents) + if(tool.reagents.total_volume <= 0) + to_chat(user, span_warning("[tool] is empty.")) + return ITEM_INTERACT_BLOCKING + + if(reagents.total_volume >= 10) + to_chat(user, span_warning("[src] is full.")) + return ITEM_INTERACT_BLOCKING + + desc = "A translucent balloon with some form of liquid sloshing around in it." + to_chat(user, span_notice("You fill the balloon with the contents of [tool].")) + tool.reagents.trans_to(src, 10, transferred_by = user) + update_appearance() + return ITEM_INTERACT_SUCCESS + + if(tool.get_sharpness()) balloon_burst() - else - return ..() + return ITEM_INTERACT_SUCCESS + + return NONE /obj/item/toy/waterballoon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(!..()) //was it caught by a mob? @@ -167,17 +172,18 @@ ) -/obj/item/toy/balloon/long/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers) - if(!istype(attacking_item, /obj/item/toy/balloon/long) || !HAS_TRAIT(user, TRAIT_BALLOON_SUTRA)) +/obj/item/toy/balloon/long/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/toy/balloon/long) || !HAS_TRAIT(user, TRAIT_BALLOON_SUTRA)) return ..() - var/obj/item/toy/balloon/long/hit_by = attacking_item + var/obj/item/toy/balloon/long/hit_by = tool if(hit_by.current_color == current_color) to_chat(user, span_warning("You must use balloons of different colours to do that!")) - return ..() - visible_message( + return ITEM_INTERACT_BLOCKING + user.visible_message( span_notice("[user.name] starts contorting up a balloon animal!"), - blind_message = span_hear("You hear balloons being contorted."), + span_notice("You start twisting together a balloon animal!"), + span_hear("You hear balloons being contorted."), vision_distance = 3, ignored_mobs = user, ) @@ -188,13 +194,13 @@ break qdel(hit_by) qdel(src) - return TRUE + return ITEM_INTERACT_SUCCESS -/obj/item/toy/balloon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) - if(istype(I, /obj/item/ammo_casing/foam_dart) && ismonkey(user)) - pop_balloon(monkey_pop = TRUE) - else - return ..() +/obj/item/toy/balloon/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/ammo_casing/foam_dart) || !ismonkey(user)) + return NONE + pop_balloon(monkey_pop = TRUE) + return ITEM_INTERACT_SUCCESS /obj/item/toy/balloon/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) var/mob/thrower = throwingdatum?.get_thrower() @@ -515,39 +521,39 @@ . = ..() . += "There [bullets == 1 ? "is" : "are"] [bullets] cap\s left." -/obj/item/toy/gun/attackby(obj/item/toy/ammo/gun/A, mob/user, list/modifiers, list/attack_modifiers) +/obj/item/toy/gun/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(istype(A, /obj/item/toy/ammo/gun)) - if (src.bullets >= 7) - to_chat(user, span_warning("It's already fully loaded!")) - return 1 - if (A.amount_left <= 0) - to_chat(user, span_warning("There are no more caps!")) - return 1 - if (A.amount_left < (7 - src.bullets)) - src.bullets += A.amount_left - to_chat(user, span_notice("You reload [A.amount_left] cap\s.")) - A.amount_left = 0 - else - to_chat(user, span_notice("You reload [7 - src.bullets] cap\s.")) - A.amount_left -= 7 - src.bullets - src.bullets = 7 - A.update_appearance() - return 1 + if(!istype(tool, /obj/item/toy/ammo/gun)) + return NONE + var/obj/item/toy/ammo/gun/ammunition = tool + if (bullets >= 7) + to_chat(user, span_warning("It's already fully loaded!")) + return ITEM_INTERACT_BLOCKING + if (ammunition.amount_left <= 0) + to_chat(user, span_warning("There are no more caps!")) + return ITEM_INTERACT_BLOCKING + if (ammunition.amount_left < (7 - bullets)) + bullets += ammunition.amount_left + to_chat(user, span_notice("You reload [ammunition.amount_left] cap\s.")) + ammunition.amount_left = 0 else - return ..() + to_chat(user, span_notice("You reload [7 - bullets] cap\s.")) + ammunition.amount_left -= 7 - bullets + bullets = 7 + tool.update_appearance() + return ITEM_INTERACT_SUCCESS /obj/item/toy/gun/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!ISADVANCEDTOOLUSER(user)) to_chat(user, span_warning("You don't have the dexterity to do this!")) return ITEM_INTERACT_BLOCKING - src.add_fingerprint(user) - if (src.bullets < 1) + add_fingerprint(user) + if (bullets < 1) user.show_message(span_warning("*click*"), MSG_AUDIBLE) playsound(src, 'sound/items/weapons/gun/revolver/dry_fire.ogg', 30, TRUE) return ITEM_INTERACT_SUCCESS playsound(user, 'sound/items/weapons/gun/revolver/shot.ogg', 100, TRUE) - src.bullets-- + bullets-- user.visible_message(span_danger("[user] fires [src] at [interacting_with]!"), \ span_danger("You fire [src] at [interacting_with]!"), \ span_hear("You hear a gunshot!")) @@ -668,28 +674,26 @@ to_chat(user, span_warning("RNBW_ENGAGE")) update_appearance(UPDATE_ICON) +/obj/item/toy/sword/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(!istype(tool, /obj/item/toy/sword)) + return NONE + var/obj/item/toy/sword/attatched_sword = tool + if(HAS_TRAIT(tool, TRAIT_NODROP)) + to_chat(user, span_warning("[tool] is stuck to your hand, you can't attach it to [src]!")) + return ITEM_INTERACT_BLOCKING + if(HAS_TRAIT(src, TRAIT_NODROP)) + to_chat(user, span_warning("[src] is stuck to your hand, you can't attach it to [tool]!")) + return ITEM_INTERACT_BLOCKING -// Copied from /obj/item/melee/energy/sword/attackby -/obj/item/toy/sword/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers) - if(istype(weapon, /obj/item/toy/sword)) - var/obj/item/toy/sword/attatched_sword = weapon - if(HAS_TRAIT(weapon, TRAIT_NODROP)) - to_chat(user, span_warning("[weapon] is stuck to your hand, you can't attach it to [src]!")) - return - else if(HAS_TRAIT(src, TRAIT_NODROP)) - to_chat(user, span_warning("[src] is stuck to your hand, you can't attach it to [weapon]!")) - return - else - to_chat(user, span_notice("You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.")) - var/obj/item/dualsaber/toy/new_saber = new /obj/item/dualsaber/toy(user.loc) - if(attatched_sword.hacked || hacked) - new_saber.hacked = TRUE - new_saber.saber_color = "rainbow" - qdel(weapon) - qdel(src) - user.put_in_hands(new_saber) - else - return ..() + to_chat(user, span_notice("You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.")) + var/obj/item/dualsaber/toy/new_saber = new /obj/item/dualsaber/toy(user.loc) + if(attatched_sword.hacked || hacked) + new_saber.hacked = TRUE + new_saber.saber_color = "rainbow" + qdel(tool) + qdel(src) + user.put_in_hands(new_saber) + return ITEM_INTERACT_SUCCESS /* * Foam armblade diff --git a/code/game/objects/items/wind_turbine.dm b/code/game/objects/items/wind_turbine.dm index 4b89a679582..cdbba2cbba0 100644 --- a/code/game/objects/items/wind_turbine.dm +++ b/code/game/objects/items/wind_turbine.dm @@ -243,31 +243,33 @@ update_appearance() return ..() -/obj/item/portable_wind_turbine/attackby(obj/item/attacking_item, mob/user, params) - if(istype(attacking_item, /obj/item/stock_parts/capacitor)) +/obj/item/portable_wind_turbine/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/stock_parts/capacitor)) if (cap) balloon_alert(user, "already has a capacitor!") - return TRUE - user.transferItemToLoc(attacking_item, src) - cap = attacking_item - balloon_alert(user, "inserted the [attacking_item]") - return TRUE - if(!is_type_in_typecache(attacking_item, allowed_devices)) - return ..() + return ITEM_INTERACT_BLOCKING + user.transferItemToLoc(tool, src) + cap = tool + balloon_alert(user, "inserted the [tool]") + return ITEM_INTERACT_SUCCESS + + if(!is_type_in_typecache(tool, allowed_devices)) + return NONE + if(isnull(cap)) balloon_alert(user, "no capacitor inserted!") - return TRUE + return ITEM_INTERACT_BLOCKING if(charging) balloon_alert(user, "already charging something!") - return TRUE - if(istype(attacking_item, /obj/item/gun/energy)) - var/obj/item/gun/energy/energy_gun = attacking_item + return ITEM_INTERACT_BLOCKING + if(istype(tool, /obj/item/gun/energy)) + var/obj/item/gun/energy/energy_gun = tool if(!energy_gun.can_charge) balloon_alert(user, "not rechargable!") - return TRUE - user.transferItemToLoc(attacking_item, src) - charging = attacking_item - return TRUE + return ITEM_INTERACT_BLOCKING + user.transferItemToLoc(tool, src) + charging = tool + return ITEM_INTERACT_SUCCESS /obj/item/portable_wind_turbine/attack_hand(mob/user, list/modifiers) if(loc == user || (istype(loc, /turf) && !isnull(charging)))