mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-18 13:04:45 +00:00
## About The Pull Request Folded bluespace bodybags had no prior checks to see if the person picking the item up was the one inside of the bag. This naturally broke things, because BYOND doesn't like it when you have an infinite cycle of locs, so it refuses to move the folded bluespace item onto your mob. This then leads to the bluespace bodybag duping bug, as the item is still in your hand even though it really isn't. ## Why It's Good For The Game Fixes #44902 ## Changelog 🆑 fix: Fixed a rare bug that let you spam bluespace bodybags everywhere. /🆑
140 lines
6.0 KiB
Plaintext
140 lines
6.0 KiB
Plaintext
|
|
/obj/item/bodybag
|
|
name = "body bag"
|
|
desc = "A folded bag designed for the storage and transportation of cadavers."
|
|
icon = 'icons/obj/medical/bodybag.dmi'
|
|
icon_state = "bodybag_folded"
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
///Stored path we use for spawning a new body bag entity when unfolded.
|
|
var/unfoldedbag_path = /obj/structure/closet/body_bag
|
|
|
|
/obj/item/bodybag/attack_self(mob/user)
|
|
if(user.is_holding(src))
|
|
deploy_bodybag(user, get_turf(user))
|
|
else
|
|
deploy_bodybag(user, get_turf(src))
|
|
|
|
/obj/item/bodybag/afterattack(atom/target, mob/user, proximity)
|
|
. = ..()
|
|
if(proximity)
|
|
if(isopenturf(target))
|
|
deploy_bodybag(user, target)
|
|
|
|
/obj/item/bodybag/attempt_pickup(mob/user)
|
|
// can't pick ourselves up if we are inside of the bodybag, else very weird things may happen
|
|
if(contains(user))
|
|
return TRUE
|
|
return ..()
|
|
|
|
/**
|
|
* Creates a new body bag item when unfolded, at the provided location, replacing the body bag item.
|
|
* * mob/user: User opening the body bag.
|
|
* * atom/location: the place/entity/mob where the body bag is being deployed from.
|
|
*/
|
|
/obj/item/bodybag/proc/deploy_bodybag(mob/user, atom/location)
|
|
var/obj/structure/closet/body_bag/item_bag = new unfoldedbag_path(location)
|
|
item_bag.open(user)
|
|
item_bag.add_fingerprint(user)
|
|
item_bag.foldedbag_instance = src
|
|
moveToNullspace()
|
|
return item_bag
|
|
|
|
/obj/item/bodybag/suicide_act(mob/living/user)
|
|
if(isopenturf(user.loc))
|
|
user.visible_message(span_suicide("[user] is crawling into [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
var/obj/structure/closet/body_bag/R = new unfoldedbag_path(user.loc)
|
|
R.add_fingerprint(user)
|
|
qdel(src)
|
|
user.forceMove(R)
|
|
playsound(src, 'sound/items/zip.ogg', 15, TRUE, -3)
|
|
return OXYLOSS
|
|
|
|
// Bluespace bodybag
|
|
|
|
/obj/item/bodybag/bluespace
|
|
name = "bluespace body bag"
|
|
desc = "A folded bluespace body bag designed for the storage and transportation of cadavers."
|
|
icon = 'icons/obj/medical/bodybag.dmi'
|
|
icon_state = "bluebodybag_folded"
|
|
unfoldedbag_path = /obj/structure/closet/body_bag/bluespace
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
item_flags = NO_MAT_REDEMPTION
|
|
|
|
/obj/item/bodybag/bluespace/examine(mob/user)
|
|
. = ..()
|
|
if(contents.len)
|
|
var/s = contents.len == 1 ? "" : "s"
|
|
. += span_notice("You can make out the shape[s] of [contents.len] object[s] through the fabric.")
|
|
|
|
/obj/item/bodybag/bluespace/Destroy()
|
|
for(var/atom/movable/A in contents)
|
|
A.forceMove(get_turf(src))
|
|
if(isliving(A))
|
|
to_chat(A, span_notice("You suddenly feel the space around you torn apart! You're free!"))
|
|
return ..()
|
|
|
|
/obj/item/bodybag/bluespace/deploy_bodybag(mob/user, atom/location)
|
|
var/obj/structure/closet/body_bag/item_bag = new unfoldedbag_path(location)
|
|
for(var/atom/movable/inside in contents)
|
|
inside.forceMove(item_bag)
|
|
if(isliving(inside))
|
|
to_chat(inside, span_notice("You suddenly feel air around you! You're free!"))
|
|
item_bag.open(user)
|
|
item_bag.add_fingerprint(user)
|
|
item_bag.foldedbag_instance = src
|
|
moveToNullspace()
|
|
return item_bag
|
|
|
|
/obj/item/bodybag/bluespace/container_resist_act(mob/living/user)
|
|
if(user.incapacitated())
|
|
to_chat(user, span_warning("You can't get out while you're restrained like this!"))
|
|
return
|
|
user.changeNext_move(CLICK_CD_BREAKOUT)
|
|
user.last_special = world.time + CLICK_CD_BREAKOUT
|
|
to_chat(user, span_notice("You claw at the fabric of [src], trying to tear it open..."))
|
|
to_chat(loc, span_warning("Someone starts trying to break free of [src]!"))
|
|
if(!do_after(user, 12 SECONDS, src, timed_action_flags = (IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM)))
|
|
return
|
|
// you are still in the bag? time to go unless you KO'd, honey!
|
|
// if they escape during this time and you rebag them the timer is still clocking down and does NOT reset so they can very easily get out.
|
|
if(user.incapacitated())
|
|
to_chat(loc, span_warning("The pressure subsides. It seems that they've stopped resisting..."))
|
|
return
|
|
loc.visible_message(span_warning("[user] suddenly appears in front of [loc]!"), span_userdanger("[user] breaks free of [src]!"))
|
|
qdel(src)
|
|
|
|
/obj/item/bodybag/environmental
|
|
name = "environmental protection bag"
|
|
desc = "A folded, reinforced bag designed to protect against exoplanetary environmental storms."
|
|
icon = 'icons/obj/medical/bodybag.dmi'
|
|
icon_state = "envirobag_folded"
|
|
unfoldedbag_path = /obj/structure/closet/body_bag/environmental
|
|
w_class = WEIGHT_CLASS_NORMAL //It's reinforced and insulated, like a beefed-up sleeping bag, so it has a higher bulkiness than regular bodybag
|
|
resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF
|
|
|
|
/obj/item/bodybag/environmental/nanotrasen
|
|
name = "elite environmental protection bag"
|
|
desc = "A folded, heavily reinforced, and insulated bag, capable of fully isolating its contents from external factors."
|
|
icon_state = "ntenvirobag_folded"
|
|
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/nanotrasen
|
|
resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF | LAVA_PROOF
|
|
|
|
/obj/item/bodybag/environmental/prisoner
|
|
name = "prisoner transport bag"
|
|
desc = "Intended for transport of prisoners through hazardous environments, this folded environmental protection bag comes with straps to keep an occupant secure."
|
|
icon = 'icons/obj/medical/bodybag.dmi'
|
|
icon_state = "prisonerenvirobag_folded"
|
|
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner
|
|
|
|
/obj/item/bodybag/environmental/prisoner/pressurized
|
|
name = "pressurized prisoner transport bag"
|
|
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner/pressurized
|
|
|
|
/obj/item/bodybag/environmental/prisoner/syndicate
|
|
name = "syndicate prisoner transport bag"
|
|
desc = "An alteration of Nanotrasen's environmental protection bag which has been used in several high-profile kidnappings. Designed to keep a victim unconscious, alive, and secured until they are transported to a required location."
|
|
icon = 'icons/obj/medical/bodybag.dmi'
|
|
icon_state = "syndieenvirobag_folded"
|
|
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner/pressurized/syndicate
|
|
resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF | LAVA_PROOF
|