diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index 830257ebbcb..cf5c2f126fb 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -38,6 +38,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/smoke_amt = 0 //cropped at 10
var/critfailchance = 0
+ var/centcomm_cancast = 1 //Whether or not the spell should be allowed on z2
/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
@@ -45,6 +46,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
usr << "\red You shouldn't have this spell! Something's wrong."
return 0
+ if(usr.z == 2 && !centcomm_cancast) //Certain spells are not allowed on the centcomm zlevel
+ return 0
+
if(!skipcharge)
switch(charge_type)
if("recharge")
diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm
index f47732af871..1865efd4c37 100644
--- a/code/datums/spells/ethereal_jaunt.dm
+++ b/code/datums/spells/ethereal_jaunt.dm
@@ -9,7 +9,7 @@
invocation_type = "none"
range = -1
include_user = 1
-
+ centcomm_cancast = 0 //Prevent people from getting to centcomm
var phaseshift = 0
var/jaunt_duration = 50 //in deciseconds
diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm
index 33d99d9a110..8c45de37a9d 100644
--- a/code/datums/spells/wizard.dm
+++ b/code/datums/spells/wizard.dm
@@ -105,6 +105,8 @@
inner_tele_radius = 0
outer_tele_radius = 6
+ centcomm_cancast = 0 //prevent people from getting to centcomm
+
/obj/effect/proc_holder/spell/targeted/area_teleport/teleport
name = "Teleport"
desc = "This spell teleports you to a type of area of your selection."
@@ -250,6 +252,7 @@
invocation_type = "none"
range = 0
summon_type = list("/turf/simulated/floor/engine/cult")
+ centcomm_cancast = 0 //Stop crashing the server by spawning turfs on transit tiles
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall
name = "Leser Construction"
@@ -262,6 +265,7 @@
invocation_type = "none"
range = 0
summon_type = list("/turf/simulated/wall/cult")
+ centcomm_cancast = 0 //Stop crashing the server by spawning turfs on transit tiles
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced
name = "Greater Construction"
@@ -273,6 +277,7 @@
invocation = "none"
invocation_type = "none"
range = 0
+ centcomm_cancast = 0 //Stop crashing the server by spawning turfs on transit tiles
summon_type = list("/turf/simulated/wall/r_wall")
@@ -304,8 +309,6 @@
summon_lifespan = 50
-
-
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift
name = "Phase Shift"
desc = "This spell allows you to pass through walls"
@@ -319,3 +322,4 @@
include_user = 1
phaseshift = 1
jaunt_duration = 50 //in deciseconds
+ centcomm_cancast = 0 //Stop people from getting to centcomm
\ No newline at end of file
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 16011a9b5cc..622cefa423f 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -360,10 +360,6 @@ datum/objective/steal
for(var/obj/item/I in all_items) //Check for plasma tanks
if(istype(I, steal_target))
found_amount += (target_name=="28 moles of plasma (full tank)" ? (I:air_contents:toxins) : (I:amount))
-
- for(var/obj/item/smallDelivery/J in all_items) //Check to see plasma tank is wrapped
- if(istype(J.wrapped, steal_target))
- found_amount += (target_name=="28 moles of plasma (full tank)" ? (J.wrapped:air_contents:toxins) : (J.wrapped:amount))
return found_amount>=target_amount
if("50 coins (in bag)")
@@ -381,21 +377,11 @@ datum/objective/steal
for(var/mob/living/silicon/ai/M in C)
if(istype(M, /mob/living/silicon/ai) && M.stat != 2) //See if any AI's are alive inside that card.
return 1
-
- for(var/obj/item/smallDelivery/D in all_items) //Check for AI card desguised as packages
- for(var/mob/living/silicon/ai/N in D.wrapped)
- if(istype(N, /mob/living/silicon/ai) && N.stat != 2) //No idea why I have to check the type of a mob that I JUST created but ok.
- return 1
-
else
for(var/obj/I in all_items) //Check for items
if(istype(I, steal_target))
return 1
-
- for(var/obj/item/smallDelivery/J in all_items) //Check for items desguised as packages
- if(istype(J.wrapped, steal_target))
- return 1
return 0
diff --git a/code/game/objects/items/weapons/wrappingpaper.dm b/code/game/objects/items/weapons/wrappingpaper.dm
index 6584b63128a..c9f3b1781a6 100644
--- a/code/game/objects/items/weapons/wrappingpaper.dm
+++ b/code/game/objects/items/weapons/wrappingpaper.dm
@@ -19,6 +19,9 @@ PHOTOGRAPHS
user << "\blue You need more paper!"
return
else
+ if(istype(W, /obj/item/smallDelivery) || istype(W, /obj/item/weapon/gift)) //No gift wrapping gifts!
+ return
+
src.amount -= a_used
user.drop_item()
var/obj/item/weapon/gift/G = new /obj/item/weapon/gift( src.loc )
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index cec328a1bfb..c3978fd33dc 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -153,26 +153,51 @@
/mob/proc/get_contents()
-/mob/living/get_contents()
+/mob/verb/getthecontents()
+ for(var/obj/O in src.get_contents())
+ world << "[O]"
+
+//Recursive function to find everything a mob is holding.
+/mob/living/get_contents(var/obj/item/weapon/storage/Storage = null)
var/list/L = list()
- L += src.contents
- for(var/obj/item/weapon/storage/S in src.contents)
- L += S.return_inv()
- for(var/obj/item/weapon/gift/G in src.contents)
- L += G.gift
- if (istype(G.gift, /obj/item/weapon/storage))
- L += G.gift:return_inv()
- return L
+
+ if(Storage) //If it called itself
+ L += Storage.return_inv()
+
+ //Leave this commented out, it will cause storage items to exponentially add duplicate to the list
+ //for(var/obj/item/weapon/storage/S in Storage.return_inv()) //Check for storage items
+ // L += get_contents(S)
+
+ for(var/obj/item/weapon/gift/G in Storage.return_inv()) //Check for gift-wrapped items
+ L += G.gift
+ if(istype(G.gift, /obj/item/weapon/storage))
+ L += get_contents(G.gift)
+
+ for(var/obj/item/smallDelivery/D in Storage.return_inv()) //Check for package wrapped items
+ L += D.wrapped
+ if(istype(D.wrapped, /obj/item/weapon/storage)) //this should never happen
+ L += get_contents(D.wrapped)
+ return L
+
+ else
+
+ L += src.contents
+ for(var/obj/item/weapon/storage/S in src.contents) //Check for storage items
+ L += get_contents(S)
+
+ for(var/obj/item/weapon/gift/G in src.contents) //Check for gift-wrapped items
+ L += G.gift
+ if(istype(G.gift, /obj/item/weapon/storage))
+ L += get_contents(G.gift)
+
+ for(var/obj/item/smallDelivery/D in src.contents) //Check for package wrapped items
+ L += D.wrapped
+ if(istype(D.wrapped, /obj/item/weapon/storage)) //this should never happen
+ L += get_contents(D.wrapped)
+ return L
/mob/living/proc/check_contents_for(A)
- var/list/L = list()
- L += src.contents
- for(var/obj/item/weapon/storage/S in src.contents)
- L += S.return_inv()
- for(var/obj/item/weapon/gift/G in src.contents)
- L += G.gift
- if (istype(G.gift, /obj/item/weapon/storage))
- L += G.gift:return_inv()
+ var/list/L = src.get_contents()
for(var/obj/B in L)
if(B.type == A)
diff --git a/code/modules/mob/screen.dm b/code/modules/mob/screen.dm
index 75f4dd54ba5..e2125f69410 100644
--- a/code/modules/mob/screen.dm
+++ b/code/modules/mob/screen.dm
@@ -578,7 +578,7 @@
//unbuckling yourself
- if( L.buckled && (L.last_special <= world.time) )
+ if(L.buckled && (L.last_special <= world.time) )
if( L.handcuffed )
L.next_move = world.time + 100
L.last_special = world.time + 100
@@ -598,6 +598,8 @@
//Breaking out of a locker?
else if( src.loc && (istype(src.loc, /obj/structure/closet)) )
+ var/breakout_time = 2 //2 minutes by default
+
var/obj/structure/closet/C = L.loc
if(C.opened)
return //Door's open... wait, why are you in it's contents then?
@@ -608,16 +610,20 @@
else
if(!C.welded)
return //closed but not welded...
+ // else Meh, lets just keep it at 2 minutes for now
+ // breakout_time++ //Harder to get out of welded lockers than locked lockers
//okay, so the closet is either welded or locked... resist!!!
usr.next_move = world.time + 100
L.last_special = world.time + 100
- L << "\red You lean on the back of \the [C] and start pushing the door open. (this will take about 2 minutes)"
+ L << "\red You lean on the back of \the [C] and start pushing the door open. (this will take about [breakout_time] minutes)"
for(var/mob/O in viewers(usr.loc))
O.show_message("\red The [L.loc] begins to shake violently!", 1)
+
+
spawn(0)
- if(do_after(usr, 50))
- if(!C || !L || L.loc != C || C.opened) //User, closet destroyed OR user no longer in closet OR closet opened
+ if(do_after(usr,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds
+ if(!C || !L || L.stat != CONSCIOUS || L.loc != C || C.opened) //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened
return
//Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'...
@@ -643,12 +649,18 @@
usr << "\red You successfully break out!"
for(var/mob/O in viewers(L.loc))
O.show_message("\red \the [usr] successfully broke out of \the [SC]!", 1)
+ if(istype(SC.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace)
+ var/obj/structure/bigDelivery/BD = SC.loc
+ BD.attack_hand(usr)
SC.open()
else
C.welded = 0
usr << "\red You successfully break out!"
for(var/mob/O in viewers(L.loc))
O.show_message("\red \the [usr] successfully broke out of \the [C]!", 1)
+ if(istype(C.loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above
+ var/obj/structure/bigDelivery/BD = C.loc
+ BD.attack_hand(usr)
C.open()
//breaking out of handcuffs
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 886e2cc57da..096bd88239c 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -496,8 +496,8 @@
var/mob/living/carbon/human/H = AM
if(FAT in H.mutations) // is a human and fat?
has_fat_guy = 1 // set flag on holder
- if(istype(AM, /obj/effect/bigDelivery) && !hasmob)
- var/obj/effect/bigDelivery/T = AM
+ if(istype(AM, /obj/structure/bigDelivery) && !hasmob)
+ var/obj/structure/bigDelivery/T = AM
src.destinationTag = T.sortTag
if(istype(AM, /obj/item/smallDelivery) && !hasmob)
var/obj/item/smallDelivery/T = AM
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 96ad4192dab..798b1579676 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -1,4 +1,4 @@
-/obj/effect/bigDelivery //Why is this an effect? 0.o --SkyMarshal
+/obj/structure/bigDelivery
desc = "A big wrapped package."
name = "large parcel"
icon = 'storage.dmi'
@@ -81,7 +81,9 @@
afterattack(var/obj/target as obj, mob/user as mob)
if(!(istype(target, /obj))) //this really shouldn't be necessary (but it is). -Pete
return
- if(istype(target, /obj/structure/table) || istype(target, /obj/structure/rack) || istype(target,/obj/item/smallDelivery))
+ if(istype(target, /obj/structure/table) || istype(target, /obj/structure/rack) \
+ || istype(target, /obj/item/smallDelivery) || istype(target,/obj/structure/bigDelivery) \
+ || istype(target, /obj/item/weapon/gift))
return
if(target.anchored)
return
@@ -99,11 +101,14 @@
user.client.screen -= O
P.wrapped = O
O.loc = P
+ P.add_fingerprint(usr)
+ O.add_fingerprint(usr)
+ src.add_fingerprint(usr)
src.amount -= 1
else if (istype(target, /obj/structure/closet/crate))
var/obj/structure/closet/crate/O = target
if (src.amount > 3 && !O.opened)
- var/obj/effect/bigDelivery/P = new /obj/effect/bigDelivery(get_turf(O.loc))
+ var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
P.icon_state = "deliverycrate"
P.wrapped = O
O.loc = P
@@ -113,7 +118,7 @@
else if (istype (target, /obj/structure/closet))
var/obj/structure/closet/O = target
if (src.amount > 3 && !O.opened)
- var/obj/effect/bigDelivery/P = new /obj/effect/bigDelivery(get_turf(O.loc))
+ var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
P.wrapped = O
O.welded = 1
O.loc = P
@@ -190,9 +195,9 @@
user << "/blue You can only tag properly wrapped delivery packages!"
*/
attack(target as obj, mob/user as mob)
- if (istype(target, /obj/effect/bigDelivery))
+ if (istype(target, /obj/structure/bigDelivery))
user << "\blue *TAGGED*"
- var/obj/effect/bigDelivery/O = target
+ var/obj/structure/bigDelivery/O = target
O.sortTag = src.currTag
else if (istype(target, /obj/item/smallDelivery))
user << "\blue *TAGGED*"
@@ -238,7 +243,7 @@
var/deliveryCheck = 0
var/obj/structure/disposalholder/H = new() // virtual holder object which actually
// travels through the pipes.
- for(var/obj/effect/bigDelivery/O in src)
+ for(var/obj/structure/bigDelivery/O in src)
deliveryCheck = 1
if(O.sortTag == 0)
O.sortTag = 1
@@ -300,4 +305,4 @@
return
else
user << "You need more welding fuel to complete this task."
- return
\ No newline at end of file
+ return