mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-29 02:21:44 +00:00
## About The Pull Request ports https://github.com/DaedalusDock/daedalusdock/pull/1144 ports https://github.com/DaedalusDock/daedalusdock/pull/1147 full credit to @Kapu1178 for the juice instead of `reacher.CanReach(target)` we now do `target.CanBeReachedBy(reacher)`, this allows us to give special behavior to atoms which we want to reach, which is exactly what I need for a feature I'm working on. ## Why It's Good For The Game allows us to be more flexible with reachability ## Changelog 🆑 refactor: refactored how reaching items works, report any oddities with being unable to reach something you should be able to! /🆑
162 lines
5.5 KiB
Plaintext
162 lines
5.5 KiB
Plaintext
/obj/item/storage/toolbox
|
|
name = "toolbox"
|
|
desc = "Danger. Very robust."
|
|
icon = 'icons/obj/storage/toolbox.dmi'
|
|
icon_state = "toolbox_default"
|
|
inhand_icon_state = "toolbox_default"
|
|
lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
|
|
obj_flags = CONDUCTS_ELECTRICITY
|
|
force = 13
|
|
throwforce = 13
|
|
throw_speed = 2
|
|
throw_range = 7
|
|
demolition_mod = 1.25
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*5)
|
|
attack_verb_continuous = list("robusts")
|
|
attack_verb_simple = list("robust")
|
|
hitsound = 'sound/items/weapons/smash.ogg'
|
|
drop_sound = 'sound/items/handling/toolbox/toolbox_drop.ogg'
|
|
pickup_sound = 'sound/items/handling/toolbox/toolbox_pickup.ogg'
|
|
material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
|
|
wound_bonus = 5
|
|
storage_type = /datum/storage/toolbox
|
|
|
|
var/latches = "single_latch"
|
|
var/has_latches = TRUE
|
|
/// How many interactions are we currently performing
|
|
var/current_interactions = 0
|
|
/// Items we should not interact with when left clicking
|
|
var/static/list/lmb_exception_typecache = typecacheof(list(
|
|
/obj/structure/table,
|
|
/obj/structure/rack,
|
|
/obj/structure/closet,
|
|
/obj/machinery/disposal,
|
|
))
|
|
|
|
/obj/item/storage/toolbox/Initialize(mapload)
|
|
. = ..()
|
|
if(has_latches)
|
|
if(prob(10))
|
|
latches = "double_latch"
|
|
if(prob(1))
|
|
latches = "triple_latch"
|
|
if(prob(0.1))
|
|
latches = "quad_latch" // like winning the lottery, but worse
|
|
update_appearance()
|
|
AddElement(/datum/element/falling_hazard, damage = force, wound_bonus = wound_bonus, hardhat_safety = TRUE, crushes = FALSE, impact_sound = hitsound)
|
|
AddElement(/datum/element/cuffable_item)
|
|
|
|
/obj/item/storage/toolbox/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
|
|
if (user.combat_mode || !user.has_hand_for_held_index(user.get_inactive_hand_index()))
|
|
return NONE
|
|
|
|
if (is_type_in_typecache(interacting_with, lmb_exception_typecache) && !LAZYACCESS(modifiers, RIGHT_CLICK))
|
|
return NONE
|
|
|
|
if (current_interactions)
|
|
var/obj/item/other_tool = user.get_inactive_held_item()
|
|
if (!istype(other_tool)) // what even
|
|
return NONE
|
|
INVOKE_ASYNC(src, PROC_REF(use_tool_on), interacting_with, user, modifiers, other_tool)
|
|
return ITEM_INTERACT_SUCCESS
|
|
|
|
if (user.get_inactive_held_item())
|
|
user.balloon_alert(user, "hands busy!")
|
|
return ITEM_INTERACT_BLOCKING
|
|
|
|
var/list/item_radial = list()
|
|
for (var/obj/item/tool in atom_storage.real_location)
|
|
if(is_type_in_list(tool, GLOB.tool_items))
|
|
item_radial[tool] = tool.appearance
|
|
|
|
if (!length(item_radial))
|
|
return NONE
|
|
|
|
playsound(user, 'sound/items/handling/toolbox/toolbox_open.ogg', 50)
|
|
var/obj/item/picked_item = show_radial_menu(user, interacting_with, item_radial, require_near = TRUE)
|
|
if (!picked_item)
|
|
return ITEM_INTERACT_BLOCKING
|
|
|
|
playsound(user, 'sound/items/handling/toolbox/toolbox_rustle.ogg', 50)
|
|
if (!user.put_in_inactive_hand(picked_item))
|
|
return ITEM_INTERACT_BLOCKING
|
|
|
|
atom_storage.animate_parent()
|
|
if (istype(picked_item, /obj/item/weldingtool))
|
|
var/obj/item/weldingtool/welder = picked_item
|
|
if (!welder.welding)
|
|
welder.attack_self(user)
|
|
|
|
if (istype(picked_item, /obj/item/spess_knife))
|
|
picked_item.attack_self(user)
|
|
|
|
INVOKE_ASYNC(src, PROC_REF(use_tool_on), interacting_with, user, modifiers, picked_item)
|
|
return ITEM_INTERACT_SUCCESS
|
|
|
|
/obj/item/storage/toolbox/proc/use_tool_on(atom/interacting_with, mob/living/user, list/modifiers, obj/item/picked_tool)
|
|
current_interactions += 1
|
|
picked_tool.melee_attack_chain(user, interacting_with, modifiers)
|
|
current_interactions -= 1
|
|
|
|
if (QDELETED(picked_tool) || picked_tool.loc != user || !picked_tool.IsReachableBy(user))
|
|
current_interactions = 0
|
|
return
|
|
|
|
if (current_interactions)
|
|
return
|
|
|
|
if (istype(picked_tool, /obj/item/weldingtool))
|
|
var/obj/item/weldingtool/welder = picked_tool
|
|
if (welder.welding)
|
|
welder.attack_self(user)
|
|
|
|
atom_storage.attempt_insert(picked_tool, user)
|
|
|
|
/obj/item/storage/toolbox/update_overlays()
|
|
. = ..()
|
|
if(has_latches)
|
|
. += latches
|
|
|
|
/obj/item/storage/toolbox/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] robusts [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
return BRUTELOSS
|
|
|
|
//repairbot assembly
|
|
/obj/item/storage/toolbox/tool_act(mob/living/user, obj/item/tool, list/modifiers)
|
|
if(!istype(tool, /obj/item/assembly/prox_sensor))
|
|
return ..()
|
|
var/static/list/allowed_toolbox = list(
|
|
/obj/item/storage/toolbox/artistic,
|
|
/obj/item/storage/toolbox/crafter,
|
|
/obj/item/storage/toolbox/electrical,
|
|
/obj/item/storage/toolbox/emergency,
|
|
/obj/item/storage/toolbox/mechanical,
|
|
/obj/item/storage/toolbox/syndicate,
|
|
)
|
|
|
|
if(!is_type_in_list(src, allowed_toolbox) && (type != /obj/item/storage/toolbox))
|
|
return ITEM_INTERACT_BLOCKING
|
|
if(contents.len >= 1)
|
|
balloon_alert(user, "not empty!")
|
|
return ITEM_INTERACT_BLOCKING
|
|
var/static/list/toolbox_colors = list(
|
|
/obj/item/storage/toolbox = "#445eb3",
|
|
/obj/item/storage/toolbox/emergency = "#445eb3",
|
|
/obj/item/storage/toolbox/electrical = "#b77931",
|
|
/obj/item/storage/toolbox/artistic = "#378752",
|
|
/obj/item/storage/toolbox/crafter = "#9D3282",
|
|
/obj/item/storage/toolbox/syndicate = "#3d3d3d",
|
|
)
|
|
var/obj/item/bot_assembly/repairbot/repair = new
|
|
repair.toolbox = type
|
|
var/new_color = toolbox_colors[type] || "#445eb3"
|
|
repair.set_color(new_color)
|
|
user.put_in_hands(repair)
|
|
repair.update_appearance()
|
|
repair.balloon_alert(user, "sensor added!")
|
|
qdel(tool)
|
|
qdel(src)
|
|
return ITEM_INTERACT_SUCCESS
|