diff --git a/code/defines/global.dm b/code/defines/global.dm index 39a5b5d98f..ad0687c052 100644 --- a/code/defines/global.dm +++ b/code/defines/global.dm @@ -202,4 +202,4 @@ var // For FTP requests. (i.e. downloading runtime logs.) // However it'd be ok to use for accessing attack logs and such too, which are even laggier. - fileaccess_timer = 600 //Cannot access files by ftp until the game is finished setting up and stuff. \ No newline at end of file + fileaccess_timer = 1800 //Cannot access files by ftp until the game is finished setting up and stuff. diff --git a/code/defines/turf.dm b/code/defines/turf.dm index 78510c87bd..e91b8c1c43 100644 --- a/code/defines/turf.dm +++ b/code/defines/turf.dm @@ -127,7 +127,7 @@ icon = 'shuttle.dmi' thermal_conductivity = 0.05 heat_capacity = 0 - layer = 2.1 + layer = 2 /turf/simulated/shuttle/wall name = "wall" diff --git a/code/game/algorithm.dm b/code/game/algorithm.dm index 0c15164b16..7fcccd573f 100644 --- a/code/game/algorithm.dm +++ b/code/game/algorithm.dm @@ -6,8 +6,6 @@ Starting up. [time2text(world.timeofday, "hh:mm.ss")] --------------------- -Dear Diary.... - "} diaryofmeanpeople = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")] Attack.log") @@ -16,13 +14,8 @@ Dear Diary.... Starting up. [time2text(world.timeofday, "hh:mm.ss")] --------------------- -Dear Diary.... -Today, these people were mean: - "} - - jobban_loadbanfile() jobban_updatelegacybans() LoadBans() diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 1ee4214d15..9ee06ba491 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -145,17 +145,27 @@ var/global/datum/controller/gameticker/ticker cinematic.mouse_opacity = 0 cinematic.screen_loc = "1,3" //TODO resize them - var/obj/structure/stool/bed/temp_buckle = new(src) //Incredibly hackish - //...creates a bed within the gameticker (lol) - //to stop mobs running around - for(var/mob/M) - if(M.client) - M.client.screen += cinematic //show every client the cinematic - M.buckled = temp_buckle //buckle everybody to our pseudo-bed - if(!station_missed) - M.stat = DEAD - //TODO: impliment dust() instead of this (gotta fix it first, dust() is buggy as hell) - + var/obj/structure/stool/bed/temp_buckle = new(src) + //Incredibly hackish. It creates a bed within the gameticker (lol) to stop mobs running around + if(station_missed) + for(var/mob/M in world) + M.buckled = temp_buckle //buckles the mob so it can't do anything + if(M.client) + M.client.screen += cinematic //show every client the cinematic + else //nuke kills everyone on z-level 1 to prevent "hurr-durr I survived" + for(var/mob/M in world) + M.buckled = temp_buckle + if(M.client) + M.client.screen += cinematic + switch(M.z) + if(0) //inside a crate or something + var/turf/T = get_turf(M) + if(T && T.z==1) //we don't use M.death(0) because it calls a for(/mob) loop and + M.health = 0 + M.stat = DEAD + if(1) //on a z-level 1 turf. + M.health = 0 + M.stat = DEAD //Now animate the cinematic switch(station_missed) @@ -216,7 +226,7 @@ var/global/datum/controller/gameticker/ticker sleep(100) //Tidy-up time! - if(cinematic) del(cinematic) + if(cinematic) del(cinematic) //end the cinematic if(temp_buckle) del(temp_buckle) //release everybody return diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm index f5d5387cd9..68e023d2fe 100644 --- a/code/game/magic/cultist/runes.dm +++ b/code/game/magic/cultist/runes.dm @@ -412,7 +412,7 @@ var/list/sacrificed = list() "\red You hear faint rustle.") ghost.invisibility = 10 ghost.key = D.key - D.dust(1) + D.dust() return diff --git a/code/game/objects/gibs.dm b/code/game/objects/gibs.dm index 21194af2c3..807358696b 100644 --- a/code/game/objects/gibs.dm +++ b/code/game/objects/gibs.dm @@ -1,6 +1,7 @@ -//HUMANS +/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) //CARN MARKER + new /obj/effect/gibspawner/generic(get_turf(location),viruses,MobDNA) -/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) +/proc/hgibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) new /obj/effect/gibspawner/human(get_turf(location),viruses,MobDNA) /proc/xgibs(atom/location, var/list/viruses) @@ -63,6 +64,14 @@ del(src) /obj/effect/gibspawner + generic + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core) + gibamounts = list(2,2,1) + + New() + gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) + ..() + human gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood/gibs/core) gibamounts = list(1,1,1,1,1,1,1) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 54787ad225..b64fbd9600 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -2934,48 +2934,6 @@ var/global/BSACooldown = 0 message_admins("\blue [key_name_admin(usr)] toggled guests game entering [guests_allowed?"":"dis"]allowed.", 1) feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/obj/admins/proc/view_txt_log() - set category = "Admin" - set desc="Shows todays server log in new window" - set name="Show Server Log" - var/path = "data/logs/[time2text(world.realtime,"YYYY")]/[time2text(world.realtime,"MM")]-[time2text(world.realtime,"Month")]/[time2text(world.realtime,"DD")]-[time2text(world.realtime,"Day")].log" - var/output = {" -
-- [file2text(path)] -- - "} - usr << browse(output,"window=server_logfile") - onclose(usr,"server_logfile") - feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return - -/obj/admins/proc/view_atk_log() - set category = "Admin" - set desc="Shows todays server attack log in new window" - set name="Show Server Attack Log" - var/path = "data/logs/[time2text(world.realtime,"YYYY")]/[time2text(world.realtime,"MM")]-[time2text(world.realtime,"Month")]/[time2text(world.realtime,"DD")]-[time2text(world.realtime,"Day")] Attack.log" - var/output = {" - -
- [file2text(path)] -- - "} - usr << browse(output,"window=server_logfile") - onclose(usr,"server_logfile") - feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return - /client/proc/unjobban_panel() set name = "Unjobban Panel" set category = "Admin" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index de84bb7dbe..9d125456b6 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -175,6 +175,7 @@ verbs += /obj/admins/proc/view_atk_log verbs += /obj/admins/proc/toggleaban //abandon mob verbs += /obj/admins/proc/show_traitor_panel + verbs += /client/proc/getserverlog //fetch an old serverlog to look at verbs += /client/proc/cmd_admin_remove_plasma verbs += /client/proc/admin_call_shuttle verbs += /client/proc/admin_cancel_shuttle @@ -271,7 +272,7 @@ verbs += /client/proc/everyone_random verbs += /client/proc/only_one verbs += /client/proc/deadmin_self - verbs += /client/proc/getruntimelog //used by coders to retrieve runtime logs + verbs += /client/proc/giveruntimelog //used by coders to retrieve runtime logs verbs += /client/proc/cinematic //show a cinematic sequence else return return @@ -397,8 +398,9 @@ verbs -= /client/proc/jumptocoord verbs -= /client/proc/everyone_random verbs -= /client/proc/Set_Holiday - verbs -= /client/proc/getruntimelog //used by coders to retrieve runtime logs - verbs += /client/proc/cinematic //show a cinematic sequence + verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs + verbs -= /client/proc/getserverlog + verbs -= /client/proc/cinematic //show a cinematic sequence verbs -= /proc/possess verbs -= /proc/release //verbs -= /client/proc/give_spell --Merged with view variables diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 6eeb9ed33b..4ef4d3e72c 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -2,7 +2,6 @@ set category = "Special Verbs" set name = "Dsay" //Gave this shit a shorter name so you only have to time out "dsay" rather than "dead say" to use it --NeoFite set hidden = 1 - // All admins should be authenticated, but... what if? if(!src.holder) src << "Only administrators may use this command." return diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm new file mode 100644 index 0000000000..6a3cf6f570 --- /dev/null +++ b/code/modules/admin/verbs/getlogs.dm @@ -0,0 +1,143 @@ +/* + HOW DO I LOG RUNTIMES? + Firstly, start dreamdeamon if it isn't already running. Then select "world>Log Session" (or press the F3 key) + navigate the popup window to the data/logs/runtime/ folder from where your tgstation .dmb is located. + (you may have to make this folder yourself) + + OPTIONAL: you can select the little checkbox down the bottom to make dreamdeamon save the log everytime you + start a world. Just remember to repeat these steps with a new name when you update to a new revision! + + Save it with the name of the revision your server uses (e.g. r3459.txt). + Game Masters will now be able to grant access any runtime logs you have archived this way! + This will allow us to gather information on bugs across multiple servers and make maintaining the TG + codebase for the entire /TG/station commuity a TONNE easier :3 Thanks for your help! +*/ + +#define FTPDELAY 60 //60 tick delay to discourage spam +/* + These procs have failsafes built in to prevent spamming of file requests. As such it can only be used once every + [FTPDELAY] ticks. This can be changed by modifying FTPDELAY's value above. + + PLEASE USE RESPONSIBLY, only download from the server if the log isn't already available elsewhere! + Bandwidth is expensive and lags are lame. Some log files canr each sizes of 4MB! +*/ + +//This proc allows Game Masters to grant a client access to the .getruntimelog verb +//Permissions expire at the end of each round. +//Runtimes can be used to meta or spot game-crashing exploits so it's advised to only grant coders that +//you trust access. Also, it may be wise to ensure that they are not going to play in the current round. +/client/proc/giveruntimelog() + set name = ".giveruntimelog" + set desc = "Give somebody access to any session logfiles saved to the /log/runtime/ folder." + set category = null + + if( !src.holder || holder.rank != "Game Master" ) + src << "Only Game Masters may use this command." + return + + var/list/clients = list() + for(var/client/C) + clients += C + + var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in clients + if( !target || !istype(target,/client) ) + src << "Error: giveruntimelog(): Client not found." + return + + target.verbs |= /client/proc/getruntimelog + target << "You have been granted access to runtime logs. Please use them responsibly or risk being banned." + return + +//This proc allows download of runtime logs saved within the data/logs/ folder by dreamdeamon. +//It works similarly to show-server-log. +/client/proc/getruntimelog() + set name = ".getruntimelog" + set desc = "Retrieve any session logfiles saved by dreamdeamon." + set category = null + + var/time_to_wait = fileaccess_timer - world.time + if(time_to_wait > 0) + src << "Error: getruntimelog(): spam prevention. Please wait [round(time_to_wait/10)] seconds." + return + fileaccess_timer = world.time + FTPDELAY + + var/path = "data/logs/runtime/" + + var/list/path_list = flist(path) + var/choice = input(src,"Choose a runtime-log to download:","Download",null) as null|anything in path_list + if(!choice) return + + path += "[choice]" + if(!fexists(path)) + src << "Error: getruntimelog(): Files not found/Invalid file([path])." + return + + message_admins("[src] accessed runtime log: [path]") + src << run( file(path) ) + return + +//This proc allows download of past server logs saved within the data/logs/ folder. +//It works similarly to show-server-log. +/client/proc/getserverlog() + set name = ".getserverlog" + set desc = "Like 'Show Server Log' but it fetches old logs if there are any." + set category = null + + var/time_to_wait = fileaccess_timer - world.time + if(time_to_wait > 0) + src << "Error: getserverlog(): spam prevention. Please wait [round(time_to_wait/10)] seconds." + return + fileaccess_timer = world.time + FTPDELAY + + var/path = "data/logs/" + for(var/i=0, i<4, i++) //only bother searching up to 4 sub-directories. If we don't find it by then: give up. + var/list/path_list = flist(path) + if(path_list.len) path_list -= "runtime/" + else break + + var/choice = input(src,"Choose a directory to access:","Download",null) as null|anything in path_list + if(!choice) return + + path += "[choice]" + + if( text2ascii(choice,length(choice)) != 47 ) //not a directory, finish up + if(!fexists(path)) + src << "Error: getserverlog(): File not found/Invalid file([path])." + return + src << run( file(path) ) + return + return + + +//Other log stuff put here for the sake of organisation + +//Shows today's server log +/obj/admins/proc/view_txt_log() + set category = "Admin" + set name = "Show Server Log" + set desc = "Shows today's server log." + + var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")].log" + if( fexists(path) ) + src << run( file(path) ) + else + src << "Error: view_txt_log(): File not found/Invalid path([path])." + return + feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return + +//Shows today's attack log +/obj/admins/proc/view_atk_log() + set category = "Admin" + set name = "Show Server Attack Log" + set desc = "Shows today's server attack log." + + var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")] Attack.log" + if( fexists(path) ) + src << run( file(path) ) + else + src << "Error: view_atk_log(): File not found/Invalid path([path])." + return + usr << run( file(path) ) + feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return diff --git a/code/modules/admin/verbs/getruntimelog.dm b/code/modules/admin/verbs/getruntimelog.dm deleted file mode 100644 index 695327376b..0000000000 --- a/code/modules/admin/verbs/getruntimelog.dm +++ /dev/null @@ -1,53 +0,0 @@ -/* - HOW DO I LOG RUNTIMES? - Firstly, start dreamdeamon if it isn't already running. Then select "world>Log Session" (or press the F3 key) - navigate the popup window to the log/runtime/ folder from where your tgstation .dmb is located. - - OPTIONAL: you can select the little checkbox down the bottom to make dreamdeamon save the log everytime you - start a world. Just remember to repeat these steps with a new name when you update to a new revision! - - Save it with the name of the revision your server uses (e.g. r3459.txt). - Coders with the Game Master rank will now be able to access any runtime logs you have archived this way! - This will allow us to gather information on bugs across multiple servers and make maintaining the TG - codebase for the entire /TG/station commuity a TONNE easier :3 Thanks for your help! -*/ -#define FTPDELAY 200 //20 second delay to prevent spam - -//This proc allows GameMasters to download txt files saved to the log/runtime/ folder on the server. -//In effect this means the server owner can log game sessions through DreamDeamon to that folder and -//Coders (with access) can download logs (old and current). -//To make life easier on everyone please name logfiles according to the revision number in use! - -//This proc has a failsafe built in to prevent spamming of ftp requests. As such it can only be used once every -//20 seconds. This can be changed by modifying FTPDELAY's value. - -//PLEASE USE RESPONSIBLY, only download from the server if the log isn't already available elsewhere! -//Bandwidth is expensive and lags are lame. Although txt files of a few kB shouldn't cause problems really ~Carn - -/client/proc/getruntimelog() - set name = "getruntimelog" - set desc = "Retrieve any session logfiles saved by dreamdeamon" - set category = "Debug" - set hidden = 1 - - if( !src.holder || holder.rank != "Game Master" ) - src << "Only Game Masters may use this command." - return - - var/time_to_wait = fileaccess_timer - world.time - if(time_to_wait > 0) - src << "Error: getruntimelog(): FTP-request spam prevention. Please wait [round(time_to_wait/10)] seconds." - return - fileaccess_timer = world.time + FTPDELAY - - var/list/list_of_runtimelogs = flist("log/runtime/") - var/choice = input(src,"Choose a runtime-log to download:","Download",null) in list_of_runtimelogs - - if(!choice || !fexists("log/runtime/[choice]")) - src << "Error: getruntimelog(): Files not found/Invalid file([choice])." - return - - src << ftp("log/runtime/[choice]") - - return - diff --git a/code/modules/mob/dead/death.dm b/code/modules/mob/dead/death.dm new file mode 100644 index 0000000000..7c827e55ff --- /dev/null +++ b/code/modules/mob/dead/death.dm @@ -0,0 +1,5 @@ +/mob/dead/dust() //ghosts can't be vaporised. + return + +/mob/dead/gib() //ghosts can't be gibbed. + return diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm new file mode 100644 index 0000000000..9a3e164ff1 --- /dev/null +++ b/code/modules/mob/death.dm @@ -0,0 +1,76 @@ +//This is the proc for gibbing a mob. Cannot gib ghosts. +//added different sort of gibs and animations. N +/mob/proc/gib() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + +// flick("gibbed-m", animation) + gibs(loc, viruses, dna) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + + +//This is the proc for turning a mob into ash. Mostly a copy of gib code (above). +//Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here. +//Dusting robots does not eject the MMI, so it's a bit more powerful than gib() /N +/mob/proc/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + +// flick("dust-m", animation) + new /obj/effect/decal/ash(loc) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + + +/mob/proc/death(gibbed) + timeofdeath = world.time + + var/cancel = 0 + for(var/mob/M in world) + if(M.client && (M.stat != DEAD)) + cancel = 1 + break + if(!cancel) + world << "Everyone is dead! Resetting in 30 seconds!" + + spawn(300) + for(var/mob/M in world) + if(M.client && (M.stat != DEAD)) + world << "Aborting world restart!" + return + + feedback_set_details("end_error","no live players") + + if(blackbox) + blackbox.save_all_data_to_sql() + + sleep(50) + + log_game("Rebooting because of no live players") + world.Reboot() + return + + return ..(gibbed) diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm new file mode 100644 index 0000000000..fc2beba83a --- /dev/null +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -0,0 +1,39 @@ +/mob/living/carbon/alien/gib() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("gibbed-a", animation) + xgibs(loc, viruses) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + +/mob/living/carbon/alien/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("dust-a", animation) + new /obj/effect/decal/remains/xeno(loc) + + spawn(15) + if(animation) del(animation) + if(src) del(src) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 1c73eef2a6..d7eeb6c75f 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -1,3 +1,44 @@ +/mob/living/carbon/human/gib() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("gibbed-h", animation) + hgibs(loc, viruses, dna) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + +/mob/living/carbon/human/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("dust-h", animation) + new /obj/effect/decal/remains/human(loc) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + + /mob/living/carbon/human/death(gibbed) if(halloss > 0 && (!gibbed)) //hallucination = 0 diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm index 7c83615845..63169dedad 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/metroid/powers.dm @@ -110,7 +110,7 @@ src << "\red [pick("This subject is incompatable", \ "This subject does not have a life energy", "This subject is empty", \ "I am not satisified", "I can not feed from this subject", \ - "I do not feel nurished", "This subject is not food")]..." + "I do not feel nourished", "This subject is not food")]..." sleep(rand(15,45)) @@ -136,13 +136,7 @@ if(Victim && !rabid && !attacked) if(Victim.LAssailant && Victim.LAssailant != Victim) if(prob(50)) - var/Found = 0 - for(var/mob/F in Friends) - if(F == Victim.LAssailant) - Found = 1 - - if(!Found) - Friends += Victim.LAssailant + Friends |= Victim.LAssailant if(M.client && istype(src, /mob/living/carbon/human)) if(prob(85)) diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm index a20b53d203..a150d7c2bf 100644 --- a/code/modules/mob/living/carbon/monkey/death.dm +++ b/code/modules/mob/living/carbon/monkey/death.dm @@ -1,5 +1,46 @@ +/mob/living/carbon/monkey/gib() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("gibbed-m", animation) + gibs(loc, viruses, dna) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + +/mob/living/carbon/monkey/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("dust-m", animation) + new /obj/effect/decal/ash(loc) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + + /mob/living/carbon/monkey/death(gibbed) - if(src.stat == 2) + if(src.stat == DEAD) return if (src.healths) diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm new file mode 100644 index 0000000000..93c8e3db5d --- /dev/null +++ b/code/modules/mob/living/silicon/death.dm @@ -0,0 +1,39 @@ +/mob/living/silicon/gib() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + +// flick("gibbed-r", animation) + robogibs(loc, viruses) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + +/mob/living/silicon/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + +// flick("dust-r", animation) + new /obj/effect/decal/remains/robot(loc) + + spawn(15) + if(animation) del(animation) + if(src) del(src) diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 9a677ac60a..fefedcfe59 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -1,3 +1,45 @@ +/mob/living/silicon/robot/gib() + //robots don't die when gibbed. instead they drop their MMI'd brain + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("gibbed-r", animation) + robogibs(loc, viruses) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + +/mob/living/silicon/robot/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("dust-r", animation) + new /obj/effect/decal/remains/robot(loc) + if(mmi) del(mmi) //Delete the MMI first so that it won't go popping out. + + spawn(15) + if(animation) del(animation) + if(src) del(src) + + /mob/living/silicon/robot/death(gibbed) if (!gibbed) src.emote("deathgasp") diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c4d0a6ac81..680a85db31 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -103,38 +103,6 @@ /mob/proc/update_clothing() return -/mob/proc/death(gibbed) - timeofdeath = world.time - - var/cancel = 0 - for(var/mob/M in world) - if(M.client && (M.stat != DEAD)) - cancel = 1 - break - if(!cancel) - world << "Everyone is dead! Resetting in 30 seconds!" - - - - spawn(300) - for(var/mob/M in world) - if(M.client && (M.stat != DEAD)) - world << "Aborting world restart!" - return - - feedback_set_details("end_error","no live players") - - if(blackbox) - blackbox.save_all_data_to_sql() - - sleep(50) - - log_game("Rebooting because of no live players") - world.Reboot() - return - - return ..(gibbed) - /mob/proc/restrained() if (handcuffed) return 1 @@ -747,104 +715,6 @@ for(var/mob/M in viewers()) M.see(message) -//This is the proc for gibbing a mob. Cannot gib ghosts. -//added different sort of gibs and animations. N -/mob/proc/gib() - - if (istype(src, /mob/dead/observer)) - gibs(loc, viruses) - return - if(!isrobot(src))//Cyborgs no-longer "die" when gibbed. - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'mob.dmi' - animation.master = src - if(ishuman(src)) - flick("gibbed-h", animation) - else if(ismonkey(src)) - flick("gibbed-m", animation) - else if(ismetroid(src)) - flick("gibbed-m", animation) - else if(iscrab(src)) - flick("gibbed-m", animation) - else if(iscorgi(src)) - flick("gibbed-m", animation) - else if(iscat(src)) - flick("gibbed-m", animation) //New-has monkey gib effect versus robogib - else if(isalien(src)) - flick("gibbed-a", animation) - else - flick("gibbed-r", animation) - - spawn() - if(key) - if(istype(src, /mob/living/silicon)) - robogibs(loc, viruses) - else if (istype(src, /mob/living/carbon/alien)) - xgibs(loc, viruses) - else - gibs(loc, viruses, dna) - -/* else if(key) - if(istype(src, /mob/living/simple_animals)) //Should gib all simple_animals like a monkey - gibs(loc, viruses) - else if (istype(src, /mob/living/simple_animals)) - gibs(loc, viruses) -Currently doesn't work, but should be useful later or at least as a template -*/ - - else - if(istype(src, /mob/living/silicon)) - robogibs(loc, viruses) - else if(istype(src, /mob/living/carbon/alien)) - xgibs(loc, viruses) - else - gibs(loc, viruses, dna) - sleep(15) - del(src) - -/* -This is the proc for turning a mob into ash. Mostly a copy of gib code (above). -Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here. -Dusting robots does not eject the MMI, so it's a bit more powerful than gib() /N -*/ -/mob/proc/dust() - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'mob.dmi' - animation.master = src - if(ishuman(src)) - flick("dust-h", animation) - new /obj/effect/decal/remains/human(loc) - else if(ismonkey(src)) - flick("dust-m", animation) - new /obj/effect/decal/remains/human(loc) - else if(isalien(src)) - flick("dust-a", animation) - new /obj/effect/decal/remains/xeno(loc) - else - flick("dust-r", animation) - new /obj/effect/decal/remains/robot(loc) - - sleep(15) - if(isrobot(src)&&src:mmi)//Is a robot and it has an mmi. - del(src:mmi)//Delete the MMI first so that it won't go popping out. - del(src) - /* adds a dizziness amount to a mob use this rather than directly changing var/dizziness diff --git a/tgstation.dme b/tgstation.dme index 89ed45dfae..d7ca822591 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -753,7 +753,7 @@ #include "code\modules\admin\verbs\deadsay.dm" #include "code\modules\admin\verbs\debug.dm" #include "code\modules\admin\verbs\diagnostics.dm" -#include "code\modules\admin\verbs\getruntimelog.dm" +#include "code\modules\admin\verbs\getlogs.dm" #include "code\modules\admin\verbs\mapping.dm" #include "code\modules\admin\verbs\massmodvar.dm" #include "code\modules\admin\verbs\MC.dm" @@ -825,6 +825,7 @@ #include "code\modules\mining\money_bag.dm" #include "code\modules\mining\ores_materials_coins.dm" #include "code\modules\mining\satchel_ore_boxdm.dm" +#include "code\modules\mob\death.dm" #include "code\modules\mob\login.dm" #include "code\modules\mob\logout.dm" #include "code\modules\mob\mob.dm" @@ -836,6 +837,7 @@ #include "code\modules\mob\say.dm" #include "code\modules\mob\screen.dm" #include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\dead\death.dm" #include "code\modules\mob\dead\observer\hud.dm" #include "code\modules\mob\dead\observer\login.dm" #include "code\modules\mob\dead\observer\observer.dm" @@ -847,6 +849,7 @@ #include "code\modules\mob\living\blob\blob.dm" #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" +#include "code\modules\mob\living\carbon\alien\death.dm" #include "code\modules\mob\living\carbon\alien\say.dm" #include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" #include "code\modules\mob\living\carbon\alien\humanoid\death.dm" @@ -905,6 +908,7 @@ #include "code\modules\mob\living\carbon\monkey\monkey.dm" #include "code\modules\mob\living\carbon\monkey\powers.dm" #include "code\modules\mob\living\carbon\monkey\say.dm" +#include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\say.dm" #include "code\modules\mob\living\silicon\silicon.dm" #include "code\modules\mob\living\silicon\ai\ai.dm"