diff --git a/code/defines/obj/decal.dm b/code/defines/obj/decal.dm
index 2bf96c3a30..506c46ddd2 100644
--- a/code/defines/obj/decal.dm
+++ b/code/defines/obj/decal.dm
@@ -1,11 +1,3 @@
-/obj/effect/decal/ash
- name = "ashes"
- desc = "Ashes to ashes, dust to dust, and into space."
- gender = PLURAL
- icon = 'objects.dmi'
- icon_state = "ash"
- anchored = 1
-
/obj/effect/decal/remains/human
name = "remains"
desc = "They look like human remains. They have a strange aura about them."
@@ -43,6 +35,14 @@
//HUMANS
+/obj/effect/decal/cleanable/ash
+ name = "ashes"
+ desc = "Ashes to ashes, dust to dust, and into space."
+ gender = PLURAL
+ icon = 'objects.dmi'
+ icon_state = "ash"
+ anchored = 1
+
/obj/effect/decal/cleanable/blood
name = "blood"
desc = "It's red and gooey. Perhaps it's the chef's cooking?"
diff --git a/code/defines/obj/toy.dm b/code/defines/obj/toy.dm
index 6ca899f802..7797812474 100644
--- a/code/defines/obj/toy.dm
+++ b/code/defines/obj/toy.dm
@@ -336,7 +336,7 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- new /obj/effect/decal/ash(src.loc)
+ new /obj/effect/decal/cleanable/ash(src.loc)
src.visible_message("\red The [src.name] explodes!","\red You hear a snap!")
playsound(src, 'snap.ogg', 50, 1)
del(src)
@@ -350,7 +350,7 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 0, src)
s.start()
- new /obj/effect/decal/ash(src.loc)
+ new /obj/effect/decal/cleanable/ash(src.loc)
src.visible_message("\red The [src.name] explodes!","\red You hear a snap!")
playsound(src, 'snap.ogg', 50, 1)
del(src)
diff --git a/code/game/machinery/morgue.dm b/code/game/machinery/morgue.dm
index dfe83add05..7262f036c0 100644
--- a/code/game/machinery/morgue.dm
+++ b/code/game/machinery/morgue.dm
@@ -250,50 +250,41 @@
if(cremating)
return //don't let you cremate something twice or w/e
- if(length(contents) == 0)
+ if(contents.len <= 0)
for (var/mob/M in viewers(src))
M.show_message("\red You hear a hollow crackle.", 1)
return
- else if(contents)
+
+ else
+ if(!isemptylist(src.search_contents_for(/obj/item/weapon/disk/nuclear)))
+ usr << "You get the feeling that you shouldn't cremate one of the items in the cremator."
+ return
+
for (var/mob/M in viewers(src))
M.show_message("\red You hear a roar as the crematorium activates.", 1)
+
cremating = 1
locked = 1
- if(locate(/mob/living/, src))
- for (var/obj/item/I in contents)
- del(I)
- for (var/mob/living/M in contents)
- M.Stun(100) //You really dont want to place this inside the loop.
- spawn(1)
- for(var/i=1 to 10)
- sleep(10)
- if(M)
- M.take_overall_damage(0,30)
- if (M.stat!=2 && prob(30))
- M.emote("scream")
- new /obj/effect/decal/ash(src)
- for (var/obj/item/W in M)
- if (prob(10))
- W.loc = src
- //Logging for this runtimes and causes the cremator to lock up
- //M.attack_log += "\[[time_stamp()]\] Has been cremated by [user]/[user.ckey]" //No point when the mob's about to be deleted
- //user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]"
- //log_attack("\[[time_stamp()]\] [user]/[user.ckey] gibbed [M]/[M.ckey]")
- M.death(1)
- M.ghostize()
- del(M)
- cremating = 0
- locked = 0
- playsound(src.loc, 'ding.ogg', 50, 1)
- else
- for(var/obj/item/I in contents)
- if(!istype(I, /obj/item/weapon/disk/nuclear))
- del(I)
- new /obj/effect/decal/ash(src)
- sleep(30)
- cremating = 0
- locked = 0
- playsound(src.loc, 'ding.ogg', 50, 1)
+
+ for(var/mob/living/M in contents)
+ if (M.stat!=2)
+ M.emote("scream")
+ //Logging for this causes runtimes resulting in the cremator locking up. Commenting it out until that's figured out.
+ //M.attack_log += "\[[time_stamp()]\] Has been cremated by [user]/[user.ckey]" //No point in this when the mob's about to be deleted
+ //user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]"
+ //log_attack("\[[time_stamp()]\] [user]/[user.ckey] cremated [M]/[M.ckey]")
+ M.death(1)
+ M.ghostize()
+ del(M)
+
+ for(var/obj/O in contents) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up
+ del(O)
+
+ new /obj/effect/decal/cleanable/ash(src)
+ sleep(30)
+ cremating = 0
+ locked = 0
+ playsound(src.loc, 'ding.ogg', 50, 1)
return
/obj/structure/c_tray/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index f0dfcf80c3..8c37ab76e0 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -342,7 +342,7 @@ ZIPPO
var/turf/location = get_turf(src)
src.smoketime--
if(src.smoketime < 1)
- new /obj/effect/decal/ash(location)
+ new /obj/effect/decal/cleanable/ash(location)
if(ismob(src.loc))
var/mob/living/M = src.loc
M << "\red Your [src.name] goes out, and you empty the ash."
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index c16132329f..dd06771631 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -1703,10 +1703,6 @@
return 0
- attackby(obj/item/I as obj, mob/user as mob)
-
- return
-
afterattack(obj/target, mob/user , flag)
if(target.is_open_container() == 1 && target.reagents)
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index 9a3e164ff1..11bd835059 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -38,7 +38,7 @@
animation.master = src
// flick("dust-m", animation)
- new /obj/effect/decal/ash(loc)
+ new /obj/effect/decal/cleanable/ash(loc)
spawn(15)
if(animation) del(animation)
diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm
index 884ec840df..99337c7fc9 100644
--- a/code/modules/mob/living/carbon/monkey/death.dm
+++ b/code/modules/mob/living/carbon/monkey/death.dm
@@ -32,7 +32,7 @@
animation.master = src
flick("dust-m", animation)
- new /obj/effect/decal/ash(loc)
+ new /obj/effect/decal/cleanable/ash(loc)
spawn(15)
if(animation) del(animation)
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 02cf5a6a8d..d2be5fb244 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -306,7 +306,7 @@
if(mob.restrained())//Why being pulled while cuffed prevents you from moving
for(var/mob/M in range(mob, 1))
- if(((M.pulling == mob && (!( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, mob.grabbed_by.len)))
+ if(M.pulling == mob && !M.restrained() && M.stat == 0 && M.canmove)
src << "\blue You're restrained! You can't move!"
return 0
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 61e4ced3c9..3d1b000fd5 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -38,6 +38,7 @@
var/nodamage = 0 //Determines if the projectile will skip any damage inflictions
var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb
var/projectile_type = "/obj/item/projectile"
+ var/kill_count = 50 //This will de-increment every process(). When 0, it will delete the projectile.
//Effects
var/stun = 0
var/weaken = 0
@@ -127,6 +128,9 @@
process()
+ if(kill_count < 1)
+ del(src)
+ kill_count--
spawn while(src)
if((!( current ) || loc == current))
current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z)