diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 13e9444175c..a9fc34690a5 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -93,7 +93,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s // Needs to be in /obj/item because corgis can wear a lot of // non-clothing items var/datum/dog_fashion/dog_fashion = null - var/no_direct_insertion = 0 //items that require MouseDrop() to be inserted in a storage item. e.g. packageWrap /obj/item/proc/check_allowed_items(atom/target, not_inside, target_self) @@ -296,7 +295,37 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s // Due to storage type consolidation this should get used more now. // I have cleaned it up a little, but it could probably use more. -Sayu /obj/item/attackby(obj/item/weapon/W, mob/user, params) - return 0 //always call afterattack + if(istype(W,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = W + if(S.use_to_pickup) + if(S.collection_mode) //Mode is set to collect multiple items on a tile and we clicked on a valid one. + if(isturf(src.loc)) + var/list/rejections = list() + var/success = 0 + var/failure = 0 + + for(var/obj/item/I in src.loc) + if(S.collection_mode == 2 && !istype(I,src.type)) // We're only picking up items of the target type + failure = 1 + continue + if(I.type in rejections) // To limit bag spamming: any given type only complains once + continue + if(!S.can_be_inserted(I)) // Note can_be_inserted still makes noise when the answer is no + rejections += I.type // therefore full bags are still a little spammy + failure = 1 + continue + + success = 1 + S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. + if(success && !failure) + user << "You put everything [S.preposition] [S]." + else if(success) + user << "You put some things [S.preposition] [S]." + else + user << "You fail to pick anything up with [S]!" + + else if(S.can_be_inserted(src)) + S.handle_item_insertion(src) // afterattack() and attack() prototypes moved to _onclick/item_attack.dm for consistency diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 010498a77d8..bf601df4ccc 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -33,7 +33,18 @@ amount = 25 max_amount = 25 burn_state = FLAMMABLE - no_direct_insertion = 1 + +/obj/item/proc/can_be_package_wrapped() //can the item be wrapped with package wrapper into a delivery package + return 1 + +/obj/item/weapon/storage/can_be_package_wrapped() + return 0 + +/obj/item/weapon/storage/box/can_be_package_wrapped() + return 1 + +/obj/item/smallDelivery/can_be_package_wrapped() + return 0 /obj/item/stack/packageWrap/afterattack(obj/target, mob/user, proximity) if(!proximity) @@ -45,7 +56,7 @@ if(istype(target, /obj/item)) var/obj/item/I = target - if(istype(I, /obj/item/smallDelivery)) + if(!I.can_be_package_wrapped()) return if(user.r_hand == I || user.l_hand == I) if(!user.unEquip(I)) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 3377d64852f..0fbd8d72b33 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -23,9 +23,8 @@ burntime = 20 /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W, mob/user, params) - . = ..() - if(.) - playsound(src.loc, "rustle", 50, 1, -5) + playsound(src.loc, "rustle", 50, 1, -5) + return ..() /* * Backpack Types diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index e152d35746c..9216f54280d 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -39,7 +39,6 @@ storage_slots = 30 can_hold = list() // any cant_hold = list(/obj/item/weapon/disk/nuclear) - no_direct_insertion = 1 /obj/item/weapon/storage/bag/trash/suicide_act(mob/user) user.visible_message("[user] puts the [src.name] over their head and starts chomping at the insides! Disgusting!") diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index f90aa71930e..89c72afd8b0 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -28,15 +28,18 @@ icon_state = icon_locked user << "You lock the [src.name]!" close_all() + return else icon_state = icon_closed user << "You unlock the [src.name]!" + return else user << "Access Denied." - else if(locked && !W.no_direct_insertion) - user << "It's locked!" - else + return + if(!locked) return ..() + else + user << "It's locked!" /obj/item/weapon/storage/lockbox/MouseDrop(over_object, src_location, over_location) if (locked) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index a2f9fd908fe..14af6140cad 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -36,30 +36,31 @@ if (istype(W, /obj/item/weapon/screwdriver)) if (do_after(user, 20/W.toolspeed, target = src)) src.open =! src.open - user << "You [open ? "open" : "close"] the service panel." + user.show_message("You [open ? "open" : "close"] the service panel.", 1) return - else if ((istype(W, /obj/item/device/multitool)) && open && (!l_hacking)) - user << "Now attempting to reset internal memory, please hold." - l_hacking = 1 + if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) + user.show_message("Now attempting to reset internal memory, please hold.", 1) + src.l_hacking = 1 if (do_after(usr, 100/W.toolspeed, target = src)) if (prob(40)) src.l_setshort = 1 src.l_set = 0 user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1) sleep(80) - l_setshort = 0 - l_hacking = 0 + src.l_setshort = 0 + src.l_hacking = 0 else - user << "Unable to reset internal memory." - l_hacking = 0 + user.show_message("Unable to reset internal memory.", 1) + src.l_hacking = 0 else - l_hacking = 0 - else if(!W.no_direct_insertion) - user << "It's locked!" + src.l_hacking = 0 + return + //At this point you have exhausted all the special things to do when locked + // ... but it's still locked. + return - else - // -> storage/attackby() what with handle insertion, etc - return ..() + // -> storage/attackby() what with handle insertion, etc + return ..() /obj/item/weapon/storage/secure/emag_act(mob/user) if(locked) @@ -97,7 +98,7 @@ /obj/item/weapon/storage/secure/Topic(href, href_list) ..() - if (usr.incapacitated() || get_dist(src, usr) > 1) + if ((usr.stat || usr.restrained()) || (get_dist(src, usr) > 1)) return if (href_list["type"]) if (href_list["type"] == "E") diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 73869507264..dc1e70d9cbb 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -37,19 +37,16 @@ return // this must come before the screen objects only block, dunno why it wasn't before - if(over_object == M && (ClickAccessible(M, depth=STORAGE_VIEW_DEPTH) || Adjacent(M))) + if(over_object == M && (src.ClickAccessible(M, depth=STORAGE_VIEW_DEPTH) || Adjacent(M))) orient2hud(M) if(M.s_active) M.s_active.close(M) show_to(M) return - if(!M.incapacitated()) + if(!M.restrained() && !M.stat) if(!istype(over_object, /obj/screen)) - if(no_direct_insertion && istype(over_object, /obj/item/weapon/storage)) - return ..() - else - return content_can_dump(over_object, M) + return content_can_dump(over_object, M) if(loc != usr || (loc && loc.loc == usr)) return @@ -69,17 +66,6 @@ add_fingerprint(usr) - -/obj/item/weapon/storage/MouseDrop_T(atom/movable/O, mob/user) - if(istype(O, /obj/item)) - var/obj/item/I = O - if(iscarbon(user) || isdrone(user)) - var/mob/living/L = user - if(!L.incapacitated() && I == L.get_active_hand()) - if(can_be_inserted(I, 0)) - handle_item_insertion(I, 0 , L) - - //Check if this storage can dump the items /obj/item/weapon/storage/proc/content_can_dump(atom/dest_object, mob/user) if(Adjacent(user) && dest_object.Adjacent(user)) @@ -386,47 +372,20 @@ remove_from_storage(Item, src.loc, burn) //This proc is called when you want to place an item into the storage item. -/obj/item/weapon/storage/attackby(obj/item/I, mob/user, params) - if(I.no_direct_insertion) - return 0 - if(can_be_inserted(I, 0)) - handle_item_insertion(I, 0, user) - return 1 //no afterattack +/obj/item/weapon/storage/attackby(obj/item/W, mob/user, params) + ..() + if(istype(W, /obj/item/weapon/hand_labeler)) + var/obj/item/weapon/hand_labeler/labeler = W + if(labeler.mode) + return 0 + . = 1 //no afterattack + if(isrobot(user)) + return //Robots can't interact with storage items. - -/obj/item/weapon/storage/afterattack(atom/A, mob/user, proximity, params) - if(!proximity || !istype(A, /obj/item)) + if(!can_be_inserted(W, 0 , user)) return - var/obj/item/W = A - if(use_to_pickup) - if(collection_mode) //Mode is set to collect multiple items on a tile and we clicked on a valid one. - if(isturf(W.loc)) - var/list/rejections = list() - var/success = 0 - var/failure = 0 - for(var/obj/item/I in W.loc) - if(collection_mode == 2 && !istype(I, W.type)) // We're only picking up items of the target type - failure = 1 - continue - if(I.type in rejections) // To limit bag spamming: any given type only complains once - continue - if(!can_be_inserted(I, 0)) - rejections += I.type // therefore full bags are still a little spammy - failure = 1 - continue - - success = 1 - handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. - if(success && !failure) - user << "You put everything [preposition] [src]." - else if(success) - user << "You put some things [preposition] [src]." - else - user << "You fail to pick anything up with [src]!" - - else if(can_be_inserted(W, 0)) - handle_item_insertion(W) + handle_item_insertion(W, 0 , user) /obj/item/weapon/storage/attack_hand(mob/user) @@ -467,7 +426,7 @@ set name = "Switch Gathering Method" set category = "Object" - if(usr.incapacitated()) + if(usr.stat || !usr.canmove || usr.restrained()) return collection_mode = (collection_mode+1)%3 @@ -484,7 +443,7 @@ set name = "Empty Contents" set category = "Object" - if((!ishuman(usr) && (loc != usr)) || usr.incapacitated()) + if((!ishuman(usr) && (loc != usr)) || usr.stat || usr.restrained() ||!usr.canmove) return do_quick_empty() diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 64237d14f1d..c6f3b7831c4 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -142,7 +142,7 @@ R.user_unbuckle_mob(R.buckled_mobs[1],user) loaded = target - target.forceMove(src) + target.loc = src user.visible_message("[user] collects [loaded].", "You collect [loaded].") ..() diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 706048c6985..100eeacf175 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -14,8 +14,6 @@ evidencebagEquip(I, user) /obj/item/weapon/evidencebag/attackby(obj/item/I, mob/user, params) - if(I.no_direct_insertion) - return ..() if(evidencebagEquip(I, user)) return 1 @@ -62,7 +60,7 @@ add_overlay("evidence") //should look nicer for transparent stuff. not really that important, but hey. desc = "An evidence bag containing [I]. [I.desc]" - I.forceMove(src) + I.loc = src w_class = I.w_class return 1 diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index fe8b0a5a948..963e094e845 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -4,8 +4,6 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "labeler0" item_state = "flight" - no_direct_insertion = 0 - flags = NOBLUDGEON var/label = null var/labels_left = 30 var/mode = 0 @@ -70,7 +68,6 @@ user << "You don't have the dexterity to use [src]!" return mode = !mode - no_direct_insertion = !no_direct_insertion icon_state = "labeler[mode]" if(mode) user << "You turn on [src]."