From 515d422b6687daf231efeac34dd6ea42a94822b3 Mon Sep 17 00:00:00 2001 From: "elly1989@rocketmail.com" Date: Thu, 26 Apr 2012 00:50:18 +0000 Subject: [PATCH] Fixed dust() and gib() leaving invisible overlays everywhere Fixed deaths at the end of nuke rounds, optimised the code a little gib() is now hgib() (ie it's specific to humans). gibs.dm() now only spawns generic gibs that could be from any mob. Likewise for dust. Awaiting generic dust() and gib() animations. Fixed (hopefully, depends if firewalls block this method) getruntimelog. GameMasters no longer have the getruntimelog verb. Instead they have .giverutimelog . This allows them to grant a specific client access to the server's runtime logs. (they can grant themself access this way too). NOTE: runtime logs can be used to meta, only grant access to coders or people you trust. It may also be wise to ensure they do not play in the current round. Introducing .getserverlog . It allows any admin above moderator to access ANY archived server/attack logs. Should mkae processing forum ban requests a lot easier since all admins with ban capabilities now have access. getruntimelog renamed to .getruntimelog . File-request spam prevention increased to 60seconds to discourage access serverlogs too much! They can reach sizes of 4Mb sometimes so please be responsible with them admins. runtime logs should now be saved to /data/logs/runtime/ (you may have to create this folder yourself) ummm... fixed gibs appearing below shuttle turfs. Trimmed some uneeded fluff text from the logs. PHEW git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3509 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/global.dm | 2 +- code/defines/turf.dm | 2 +- code/game/algorithm.dm | 7 - code/game/gamemodes/gameticker.dm | 34 +++-- code/game/magic/cultist/runes.dm | 2 +- code/game/objects/gibs.dm | 13 +- code/modules/admin/admin.dm | 42 ----- code/modules/admin/admin_verbs.dm | 8 +- code/modules/admin/verbs/deadsay.dm | 1 - code/modules/admin/verbs/getlogs.dm | 143 ++++++++++++++++++ code/modules/admin/verbs/getruntimelog.dm | 53 ------- code/modules/mob/dead/death.dm | 5 + code/modules/mob/death.dm | 76 ++++++++++ code/modules/mob/living/carbon/alien/death.dm | 39 +++++ code/modules/mob/living/carbon/human/death.dm | 41 +++++ .../mob/living/carbon/metroid/powers.dm | 10 +- .../modules/mob/living/carbon/monkey/death.dm | 43 +++++- code/modules/mob/living/silicon/death.dm | 39 +++++ .../modules/mob/living/silicon/robot/death.dm | 42 +++++ code/modules/mob/mob.dm | 130 ---------------- tgstation.dme | 6 +- 21 files changed, 475 insertions(+), 263 deletions(-) create mode 100644 code/modules/admin/verbs/getlogs.dm delete mode 100644 code/modules/admin/verbs/getruntimelog.dm create mode 100644 code/modules/mob/dead/death.dm create mode 100644 code/modules/mob/death.dm create mode 100644 code/modules/mob/living/carbon/alien/death.dm create mode 100644 code/modules/mob/living/silicon/death.dm 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 = {" - - [time2text(world.realtime,"Day, MMM DD, YYYY")] - Log - - -
-						[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 = {" - - [time2text(world.realtime,"Day, MMM DD, YYYY")] - Attack Log - - -
-						[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"