diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f407a82eb32..bf994aafcd8 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -380,7 +380,7 @@ var/list/blood_splatter_icons = list() /atom/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V) M.reagents.trans_to(V, M.reagents.total_volume / 10) - for(var/datum/reagent/R in reagents.reagent_list) //clears the stomach of anything that might be digested as food + for(var/datum/reagent/R in M.reagents.reagent_list) //clears the stomach of anything that might be digested as food if(istype(R, /datum/reagent/consumable)) var/datum/reagent/consumable/nutri_check = R if(nutri_check.nutriment_factor >0) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2e5fadd8916..a7702aca94a 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -340,3 +340,7 @@ dense_object_backup = AM break . = dense_object_backup + +//called when a mob resists while inside a container that is itself inside something. +/atom/movable/proc/relay_container_resist(mob/living/user, obj/O) + return diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index e3bd456eb94..a1260748a42 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -156,3 +156,15 @@ step_in = 5 for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in equipment) drill.equip_cooldown = initial(drill.equip_cooldown) + +/obj/mecha/working/ripley/relay_container_resist(mob/living/user, obj/O) + user << "You lean on the back of [O] and start pushing so it falls out of [src]." + if(do_after(user, 300, target = O)) + if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) + return + user << "You successfully pushed [O] out of [src]!" + O.loc = loc + cargo -= O + else + if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. + user << "You fail to push [O] out of [src]!" diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm new file mode 100644 index 00000000000..3e05dd05a43 --- /dev/null +++ b/code/game/objects/items/stacks/wrap.dm @@ -0,0 +1,114 @@ + + +/* + * Wrapping Paper + */ + +/obj/item/stack/wrapping_paper + name = "wrapping paper" + desc = "Wrap packages with this festive paper to make gifts." + icon = 'icons/obj/items.dmi' + icon_state = "wrap_paper" + flags = NOBLUDGEON + amount = 25 + max_amount = 25 + burn_state = FLAMMABLE + +/obj/item/stack/wrapping_paper/Destroy() + if(!amount) + new /obj/item/weapon/c_tube(get_turf(src)) + return ..() + + +/* + * Package Wrap + */ + +/obj/item/stack/packageWrap + name = "package wrapper" + desc = "You can use this to wrap items in." + icon = 'icons/obj/items.dmi' + icon_state = "deliveryPaper" + flags = NOBLUDGEON + amount = 25 + max_amount = 25 + burn_state = FLAMMABLE + +/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) + return + if(!istype(target)) + return + if(target.anchored) + return + + if(istype(target, /obj/item)) + var/obj/item/I = target + if(!I.can_be_package_wrapped()) + return + if(user.r_hand == I || user.l_hand == I) + if(!user.unEquip(I)) + return + else if(!isturf(I.loc)) + return + if(use(1)) + var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(I.loc)) + user.put_in_hands(P) + I.loc = P + var/size = round(I.w_class) + P.w_class = size + size = min(size, 5) + P.icon_state = "deliverypackage[size]" + P.add_fingerprint(user) + I.add_fingerprint(user) + + else if(istype (target, /obj/structure/closet)) + var/obj/structure/closet/O = target + if(O.opened) + return + if(!O.density) //can't wrap non dense closets (e.g. body bags) + user << "You can't wrap this!" + return + if(use(3)) + var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) + if(O.horizontal) + P.icon_state = "deliverycrate" + O.loc = P + P.add_fingerprint(user) + O.add_fingerprint(user) + else + user << "You need more paper!" + return + else + user << "The object you are trying to wrap is unsuitable for the sorting machinery!" + return + + user.visible_message("[user] wraps [target].") + user.attack_log += text("\[[time_stamp()]\] Has used [name] on [target]") + +/obj/item/stack/packageWrap/Destroy() + if(!amount) + new /obj/item/weapon/c_tube(get_turf(src)) + return ..() + +/obj/item/weapon/c_tube + name = "cardboard tube" + desc = "A tube... of cardboard." + icon = 'icons/obj/items.dmi' + icon_state = "c_tube" + throwforce = 0 + w_class = 1 + throw_speed = 3 + throw_range = 5 \ No newline at end of file diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift.dm similarity index 86% rename from code/game/objects/items/weapons/gift_wrappaper.dm rename to code/game/objects/items/weapons/gift.dm index 41809963e96..36916737b45 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift.dm @@ -80,20 +80,3 @@ I.add_fingerprint(M) qdel(src) return - - -/* - * Wrapping Paper - */ -/obj/item/stack/wrapping_paper - name = "wrapping paper" - desc = "You can use this to wrap items in." - icon = 'icons/obj/items.dmi' - icon_state = "wrap_paper" - flags = NOBLUDGEON - amount = 25 - max_amount = 25 - burn_state = FLAMMABLE - -/obj/item/stack/wrapping_paper/attack_self(mob/user) - user << "You need to use it on a package that has already been wrapped!" diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 3d4f0953cab..7b31f68f058 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -24,7 +24,7 @@ /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W, mob/user, params) playsound(src.loc, "rustle", 50, 1, -5) - ..() + return ..() /* * Backpack Types diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm index c9980e38ced..27de111170e 100644 --- a/code/game/objects/items/weapons/storage/book.dm +++ b/code/game/objects/items/weapons/storage/book.dm @@ -205,4 +205,4 @@ var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", " /obj/item/weapon/storage/book/bible/attackby(obj/item/weapon/W, mob/user, params) playsound(src.loc, "rustle", 50, 1, -5) - ..() + return ..() diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index aa0679e89b1..dbe45d3d56d 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -53,7 +53,7 @@ /obj/item/weapon/storage/box/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stack/packageWrap)) return 0 - ..() + return ..() /obj/item/weapon/storage/box/survival @@ -95,7 +95,7 @@ ..() for(var/i in 1 to 7) new /obj/item/clothing/gloves/color/latex(src) - + /obj/item/weapon/storage/box/masks name = "box of sterile masks" desc = "This box contains sterile medical masks." @@ -105,7 +105,7 @@ ..() for(var/i in 1 to 7) new /obj/item/clothing/mask/surgical(src) - + /obj/item/weapon/storage/box/syringes name = "box of syringes" desc = "A box full of syringes." @@ -116,7 +116,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/reagent_containers/syringe( src ) - + /obj/item/weapon/storage/box/medipens name = "box of medipens" desc = "A box full of epinephrine MediPens." @@ -126,7 +126,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/reagent_containers/hypospray/medipen( src ) - + /obj/item/weapon/storage/box/medipens/utility name = "stimpack value kit" desc = "A box with several stimpack medipens for the economical miner." @@ -136,7 +136,7 @@ ..() for(var/i in 1 to 5) new /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack(src) - + /obj/item/weapon/storage/box/beakers name = "box of beakers" icon_state = "beaker" @@ -145,7 +145,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/reagent_containers/glass/beaker( src ) - + /obj/item/weapon/storage/box/injectors name = "box of DNA injectors" desc = "This box contains injectors it seems." @@ -156,7 +156,7 @@ new /obj/item/weapon/dnainjector/h2m(src) for(var/i in 1 to 3) new /obj/item/weapon/dnainjector/m2h(src) - + /obj/item/weapon/storage/box/flashbangs name = "box of flashbangs (WARNING)" desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use." @@ -166,7 +166,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/grenade/flashbang(src) - + /obj/item/weapon/storage/box/flashes name = "box of flashbulbs" desc = "WARNING: Flashes can cause serious eye damage, protective eyewear is required." @@ -176,7 +176,7 @@ ..() for(var/i in 1 to 6) new /obj/item/device/assembly/flash/handheld(src) - + /obj/item/weapon/storage/box/teargas name = "box of tear gas grenades (WARNING)" desc = "WARNING: These devices are extremely dangerous and can cause blindness and skin irritation." @@ -186,7 +186,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/grenade/chem_grenade/teargas(src) - + /obj/item/weapon/storage/box/emps name = "box of emp grenades" desc = "A box with 5 emp grenades." @@ -196,7 +196,7 @@ ..() for(var/i in 1 to 5) new /obj/item/weapon/grenade/empgrenade(src) - + /obj/item/weapon/storage/box/trackimp name = "boxed tracking implant kit" desc = "Box full of scum-bag tracking utensils." @@ -242,7 +242,7 @@ ..() for(var/i in 1 to 7) new /obj/item/clothing/glasses/regular(src) - + /obj/item/weapon/storage/box/drinkingglasses name = "box of drinking glasses" desc = "It has a picture of drinking glasses on it." @@ -251,7 +251,7 @@ ..() for(var/i in 1 to 6) new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - + /obj/item/weapon/storage/box/condimentbottles name = "box of condiment bottles" desc = "It has a large ketchup smear on it." @@ -269,7 +269,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - + /obj/item/weapon/storage/box/donkpockets name = "box of donk-pockets" desc = "Instructions: Heat in microwave. Product will cool if not eaten within seven minutes." @@ -314,7 +314,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/card/id(src) - + /obj/item/weapon/storage/box/silver_ids name = "box of spare silver IDs" desc = "Shiny IDs for important people." @@ -360,7 +360,7 @@ ..() for(var/i in 1 to 7) new /obj/item/device/firing_pin(src) - + /obj/item/weapon/storage/box/handcuffs name = "box of spare handcuffs" desc = "A box full of handcuffs." @@ -370,7 +370,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/restraints/handcuffs(src) - + /obj/item/weapon/storage/box/zipties name = "box of spare zipties" desc = "A box full of zipties." @@ -380,7 +380,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/restraints/handcuffs/cable/zipties(src) - + /obj/item/weapon/storage/box/alienhandcuffs name = "box of spare handcuffs" desc = "A box full of handcuffs." @@ -390,7 +390,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/restraints/handcuffs/alien(src) - + /obj/item/weapon/storage/box/fakesyndiesuit name = "boxed space suit and helmet" desc = "A sleek, sturdy box used to hold replica spacesuits." @@ -410,7 +410,7 @@ ..() for(var/i in 1 to 6) new /obj/item/device/assembly/mousetrap( src ) - + /obj/item/weapon/storage/box/pillbottles name = "box of pill bottles" desc = "It has pictures of pill bottles on its front." @@ -420,7 +420,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/storage/pill_bottle( src ) - + /obj/item/weapon/storage/box/snappops name = "snap pop box" desc = "Eight wrappers of fun! Ages 8 and up. Not suitable for children." @@ -453,7 +453,6 @@ /obj/item/weapon/storage/box/matches/attackby(obj/item/weapon/match/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/match)) W.matchignite() - return /obj/item/weapon/storage/box/lights name = "box of replacement bulbs" @@ -501,7 +500,7 @@ ..() for(var/i in 1 to 7) new /obj/item/clothing/tie/armband/deputy(src) - + /obj/item/weapon/storage/box/metalfoam name = "box of metal foam grenades" desc = "To be used to rapidly seal hull breaches" @@ -511,7 +510,7 @@ ..() for(var/i in 1 to 7) new /obj/item/weapon/grenade/chem_grenade/metalfoam(src) - + /obj/item/weapon/storage/box/hug name = "box of hugs" desc = "A special box for sensitive people." @@ -546,7 +545,7 @@ ..() for(var/i in 1 to 7) new /obj/item/ammo_casing/shotgun/rubbershot(src) - + /obj/item/weapon/storage/box/lethalshot name = "box of lethal shotgun shots" desc = "A box full of lethal shots, designed for riot shotguns." diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index d740a80af20..d5923e7c82f 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -36,10 +36,9 @@ user << "Access Denied." return if(!locked) - ..() + return ..() else user << "It's locked!" - return /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 38c5d72b334..81c6fd0f673 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -60,7 +60,7 @@ return // -> storage/attackby() what with handle insertion, etc - ..() + return ..() /obj/item/weapon/storage/secure/emag_act(mob/user) if(locked) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 2bf43403110..74b9a5f05e5 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -266,10 +266,12 @@ return 1 /obj/structure/closet/relaymove(mob/user) - if(user.stat || !isturf(loc)) + if(user.stat || !isturf(loc) || !isliving(user)) return + var/mob/living/L = user if(!open()) - container_resist() + if(L.last_special <= world.time) + container_resist(L) if(world.time > lastbang+5) lastbang = world.time for(var/mob/M in get_hearers_in_view(src, null)) @@ -310,16 +312,25 @@ return 1 /obj/structure/closet/container_resist(mob/living/user) - if(opened || (!welded && !locked && !istype(loc, /obj/mecha))) - return //Door's open, not locked or welded or inside a mech, no point in resisting. + if(opened) + return + if(istype(loc, /atom/movable)) + user.changeNext_move(CLICK_CD_BREAKOUT) + user.last_special = world.time + CLICK_CD_BREAKOUT + var/atom/movable/AM = loc + AM.relay_container_resist(user, src) + return + if(!welded && !locked) + open() + return //okay, so the closet is either welded or locked... resist!!! user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - user.visible_message("[src] begins to shake violently!", - "You lean on the back of [src] and start pushing the door open.") + user << "You lean on the back of [src] and start pushing the door open." + visible_message("[src] begins to shake violently!") if(do_after(user,(breakout_time * 60 * 10), target = src)) //minutes * 60seconds * 10deciseconds - if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded && !istype(loc, /obj/mecha)) ) + if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) ) return //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting welded = 0 //applies to all lockers lockers @@ -327,14 +338,10 @@ broken = 1 //applies to secure lockers only user.visible_message("[user] successfully broke out of [src]!", "You successfully break out of [src]!") - if(istype(loc, /obj/structure/bigDelivery)) - var/obj/structure/bigDelivery/D = loc - qdel(D) - else if(istype(loc, /obj/mecha)) - loc = get_turf(loc) open() else - user << "You fail to break out of [src]!" + if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. + user << "You fail to break out of [src]!" /obj/structure/closet/AltClick(mob/user) ..() diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm index ee4808bbc6b..b52dead481b 100644 --- a/code/modules/mob/interactive.dm +++ b/code/modules/mob/interactive.dm @@ -123,16 +123,16 @@ set name = "Customize SNPC" set desc = "Customise the SNPC" set category = "Admin" - + if(!holder) return - + if(A) if(!istype(A,/mob/living/carbon/human/interactive)) return var/mob/living/carbon/human/interactive/T = A var/cjob = input("Choose Job") as null|anything in SSjob.occupations.Copy() - + if(cjob) T.myjob = cjob T.job = T.myjob.title @@ -142,7 +142,7 @@ T.myjob.equip(T) T.myjob.apply_fingerprints(T) T.doSetup() - + var/doTele = input("Place the SNPC in their department?") as null|anything in list("Yes","No") if(doTele) if(doTele == "Yes") @@ -451,8 +451,9 @@ update_icons() update_hands = 0 - if(grabbed_by.len > 0) - for(var/obj/item/weapon/grab/G in grabbed_by) + if(grabbed_by.len) + for(var/X in grabbed_by) + var/obj/item/weapon/grab/G = X if(Adjacent(G)) a_intent = "disarm" G.assailant.attack_hand(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5335a2240a7..e6a9073aa05 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -86,17 +86,21 @@ Sorry Giacom. Please don't be mad :( if(now_pushing) return 1 - //BubbleWrap: Should stop you pushing a restrained person out of the way - if(istype(M, /mob/living)) - for(var/mob/MM in range(1,M)) - if( ((MM.pulling == M && ( M.restrained() && !( MM.restrained() ) && MM.stat == CONSCIOUS)) || locate(/obj/item/weapon/grab, M.grabbed_by.len)) ) - if ( !(world.time % 5) ) - src << "[M] is restrained, you cannot push past." - return 1 - if( M.pulling == MM && ( MM.restrained() && !( M.restrained() ) && M.stat == CONSCIOUS) ) - if ( !(world.time % 5) ) - src << "[M] is restraining [MM], you cannot push past." - return 1 + //Should stop you pushing a restrained person out of the way + if(isliving(M)) + var/mob/living/L = M + if((L.pulledby && L.restrained()) || L.grabbed_by.len) + if(!(world.time % 5)) + src << "[L] is restrained, you cannot push past." + return 1 + + if(L.pulling) + if(ismob(L.pulling)) + var/mob/P = L.pulling + if(P.restrained()) + if(!(world.time % 5)) + src << "[L] is restraining [P], you cannot push past." + return 1 //switch our position with M //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller @@ -502,6 +506,7 @@ Sorry Giacom. Please don't be mad :( ExtinguishMob() fire_stacks = 0 updatehealth() + update_canmove() //proc called by revive(), to check if we can actually ressuscitate the mob (we don't want to revive him and have him instantly die again) @@ -570,18 +575,17 @@ Sorry Giacom. Please don't be mad :( if ((get_dist(src, pulling) > 1 || diag)) if (isliving(pulling)) var/mob/living/M = pulling - var/ok = 1 - if (locate(/obj/item/weapon/grab, M.grabbed_by)) + var/pull_ok = 1 + if (M.grabbed_by.len) if (prob(75)) var/obj/item/weapon/grab/G = pick(M.grabbed_by) - if (istype(G, /obj/item/weapon/grab)) - visible_message("[src] has pulled [G.affecting] from [G.assailant]'s grip.") - qdel(G) + visible_message("[src] has pulled [G.affecting] from [G.assailant]'s grip.") + qdel(G) else - ok = 0 - if (locate(/obj/item/weapon/grab, M.grabbed_by.len)) - ok = 0 - if (ok) + pull_ok = 0 + if (M.grabbed_by.len) + pull_ok = 0 + if (pull_ok) var/atom/movable/t = M.pulling M.stop_pulling() @@ -652,17 +656,18 @@ Sorry Giacom. Please don't be mad :( set name = "Resist" set category = "IC" - if(!isliving(src) || next_move > world.time) + if(!isliving(src) || next_move > world.time || stat || weakened || stunned || paralysis) return changeNext_move(CLICK_CD_RESIST) //resisting grabs (as if it helps anyone...) - if(!stat && canmove && !restrained()) + if(canmove && !restrained()) var/resisting = 0 for(var/obj/O in requests) qdel(O) resisting++ - for(var/obj/item/weapon/grab/G in grabbed_by) + for(var/X in grabbed_by) + var/obj/item/weapon/grab/G = X resisting++ if(G.state == GRAB_PASSIVE) qdel(G) @@ -685,10 +690,9 @@ Sorry Giacom. Please don't be mad :( resist_buckle() //Breaking out of a container (Locker, sleeper, cryo...) - else if(loc && istype(loc, /obj) && !isturf(loc)) - if(stat == CONSCIOUS && !stunned && !weakened && !paralysis) - var/obj/C = loc - C.container_resist(src) + else if(isobj(loc)) + var/obj/C = loc + C.container_resist(src) else if(canmove) if(on_fire) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index a29cc3b29fd..f088aafdcbb 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -88,7 +88,8 @@ affecting.hand = 1 affecting.drop_item() affecting.hand = h - for(var/obj/item/weapon/grab/G in affecting.grabbed_by) + for(var/X in affecting.grabbed_by) + var/obj/item/weapon/grab/G = X if(G == src) continue if(G.state == GRAB_AGGRESSIVE) allow_upgrade = 0 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index ded58659e79..87c441971e0 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -207,7 +207,7 @@ ///Called by client/Move() ///Checks to see if you are being grabbed and if so attemps to break it /client/proc/Process_Grab() - if(locate(/obj/item/weapon/grab, locate(/obj/item/weapon/grab, mob.grabbed_by.len))) + if(mob.grabbed_by.len) var/list/grabbing = list() if(istype(mob.l_hand, /obj/item/weapon/grab)) @@ -218,26 +218,29 @@ var/obj/item/weapon/grab/G = mob.r_hand grabbing += G.affecting - for(var/obj/item/weapon/grab/G in mob.grabbed_by) - if(G.state == GRAB_PASSIVE && !grabbing.Find(G.assailant)) - qdel(G) + for(var/X in mob.grabbed_by) + var/obj/item/weapon/grab/G = X + switch(G.state) - if(G.state == GRAB_AGGRESSIVE) - move_delay = world.time + 10 - if(!prob(25)) - return 1 - mob.visible_message("[mob] has broken free of [G.assailant]'s grip!") - qdel(G) + if(GRAB_PASSIVE) + if(!grabbing.Find(G.assailant)) //moving always breaks a passive grab unless we are also grabbing our grabber. + qdel(G) - if(G.state == GRAB_NECK) - move_delay = world.time + 10 - if(!prob(5)) - return 1 - mob.visible_message("[mob] has broken free of [G.assailant]'s headlock!") - qdel(G) + if(GRAB_AGGRESSIVE) + move_delay = world.time + 10 + if(!prob(25)) + return 1 + mob.visible_message("[mob] has broken free of [G.assailant]'s grip!") + qdel(G) + + if(GRAB_NECK) + move_delay = world.time + 10 + if(!prob(5)) + return 1 + mob.visible_message("[mob] has broken free of [G.assailant]'s headlock!") + qdel(G) return 0 - ///Process_Incorpmove ///Called by client/Move() ///Allows mobs to run though walls diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 28c92494304..d416f60b429 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -5,7 +5,6 @@ icon_state = "deliverycloset" density = 1 mouse_drag_pointer = MOUSE_ACTIVE_POINTER - var/obj/wrapped = null var/giftwrapped = 0 var/sortTag = 0 @@ -15,11 +14,6 @@ qdel(src) /obj/structure/bigDelivery/Destroy() - if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 - wrapped.loc = (get_turf(loc)) - if(istype(wrapped, /obj/structure/closet)) - var/obj/structure/closet/O = wrapped - O.welded = 0 var/turf/T = get_turf(src) for(var/atom/movable/AM in contents) AM.loc = T @@ -48,37 +42,46 @@ if(WP.use(3)) user.visible_message("[user] wraps the package in festive paper!") giftwrapped = 1 - if(istype(wrapped, /obj/structure/closet/crate)) - icon_state = "giftcrate" - else - icon_state = "giftcloset" - if(WP.amount <= 0 && !WP.loc) //if we used our last wrapping paper, drop a cardboard tube - new /obj/item/weapon/c_tube( get_turf(user) ) + icon_state = "gift[icon_state]" else user << "You need more paper!" +/obj/structure/bigDelivery/relay_container_resist(mob/living/user, obj/O) + if(istype(loc, /atom/movable)) + var/atom/movable/AM = loc //can't unwrap the wrapped container if it's inside something. + AM.relay_container_resist(user, O) + return + user << "You lean on the back of [O] and start pushing to rip the wrapping around it." + if(do_after(user, 50, target = O)) + if(!user || user.stat != CONSCIOUS || user.loc != src || O.loc != src ) + return + user << "You successfully removed [O]'s wrapping !" + O.loc = loc + playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + qdel(src) + else + if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. + user << "You fail to remove [O]'s wrapping!" + + /obj/item/smallDelivery name = "small parcel" desc = "A small wrapped package." icon = 'icons/obj/storage.dmi' - icon_state = "deliverycrateSmall" - var/obj/item/wrapped = null + icon_state = "deliverypackage3" var/giftwrapped = 0 var/sortTag = 0 /obj/item/smallDelivery/attack_self(mob/user) - if(wrapped && wrapped.loc) //sometimes items can disappear. For example, bombs. --rastaf0 - wrapped.loc = user.loc - if(ishuman(user)) - user.put_in_hands(wrapped) - else - wrapped.loc = get_turf(src) + user.unEquip(src) + for(var/X in contents) + var/atom/movable/AM = X + user.put_in_hands(AM) playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) qdel(src) - /obj/item/smallDelivery/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/device/destTagger)) var/obj/item/device/destTagger/O = W @@ -100,94 +103,13 @@ else if(istype(W, /obj/item/stack/wrapping_paper) && !giftwrapped) var/obj/item/stack/wrapping_paper/WP = W if(WP.use(1)) - icon_state = "giftcrate[wrapped.w_class]" + icon_state = "gift[icon_state]" giftwrapped = 1 user.visible_message("[user] wraps the package in festive paper!") - if(WP.amount <= 0 && !WP.loc) //if we used our last wrapping paper, drop a cardboard tube - new /obj/item/weapon/c_tube( get_turf(user) ) else user << "You need more paper!" - -/obj/item/stack/packageWrap - name = "package wrapper" - icon = 'icons/obj/items.dmi' - icon_state = "deliveryPaper" - flags = NOBLUDGEON - amount = 25 - max_amount = 25 - burn_state = FLAMMABLE - - -/obj/item/stack/packageWrap/afterattack(obj/target, mob/user, proximity) - if(!proximity) return - if(!istype(target)) //this really shouldn't be necessary (but it is). -Pete - return - if(istype(target, /obj/item/smallDelivery) || istype(target,/obj/structure/bigDelivery) \ - || istype(target, /obj/item/weapon/evidencebag) || istype(target, /obj/structure/closet/body_bag)) - return - if(target.anchored) - return - if(target in user) - return - - - - if(istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box))) - var/obj/item/O = target - if(use(1)) - var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up! - if(!istype(O.loc, /turf)) - if(user.client) - user.client.screen -= O - P.wrapped = O - O.loc = P - var/i = round(O.w_class) - if(i in list(1,2,3,4,5)) - P.icon_state = "deliverycrate[i]" - P.w_class = i - P.add_fingerprint(usr) - O.add_fingerprint(usr) - add_fingerprint(usr) - else - return - else if(istype(target, /obj/structure/closet/crate)) - var/obj/structure/closet/crate/O = target - if(O.opened) - return - if(use(3)) - var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) - P.icon_state = "deliverycrate" - P.wrapped = O - O.loc = P - else - user << "You need more paper!" - return - else if(istype (target, /obj/structure/closet)) - var/obj/structure/closet/O = target - if(O.opened) - return - if(use(3)) - var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc)) - P.wrapped = O - O.welded = 1 - O.loc = P - else - user << "You need more paper!" - return - else - user << "The object you are trying to wrap is unsuitable for the sorting machinery!" - return - - user.visible_message("[user] wraps [target].") - user.attack_log += text("\[[time_stamp()]\] Has used [name] on [target]") - - if(amount <= 0 && !src.loc) //if we used our last wrapping paper, drop a cardboard tube - new /obj/item/weapon/c_tube( get_turf(user) ) - return - - /obj/item/device/destTagger name = "destination tagger" desc = "Used to set the destination of properly wrapped packages." @@ -229,14 +151,3 @@ var/n = text2num(href_list["nextTag"]) currTag = n openwindow(usr) - - -/obj/item/weapon/c_tube - name = "cardboard tube" - desc = "A tube... of cardboard." - icon = 'icons/obj/items.dmi' - icon_state = "c_tube" - throwforce = 0 - w_class = 1 - throw_speed = 3 - throw_range = 5 \ No newline at end of file diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index b44f969c459..6270ce7f22f 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/tgstation.dme b/tgstation.dme index d132120802b..cbe529525b1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -579,6 +579,7 @@ #include "code\game\objects\items\stacks\medical.dm" #include "code\game\objects\items\stacks\rods.dm" #include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\wrap.dm" #include "code\game\objects\items\stacks\sheets\glass.dm" #include "code\game\objects\items\stacks\sheets\leather.dm" #include "code\game\objects\items\stacks\sheets\light.dm" @@ -602,7 +603,7 @@ #include "code\game\objects\items\weapons\explosives.dm" #include "code\game\objects\items\weapons\extinguisher.dm" #include "code\game\objects\items\weapons\flamethrower.dm" -#include "code\game\objects\items\weapons\gift_wrappaper.dm" +#include "code\game\objects\items\weapons\gift.dm" #include "code\game\objects\items\weapons\handcuffs.dm" #include "code\game\objects\items\weapons\holosign_creator.dm" #include "code\game\objects\items\weapons\holy_weapons.dm"