From 7f2c01be8499d0abc546fb50e75f5c04b29b9e38 Mon Sep 17 00:00:00 2001 From: AzuleUtama <44248086+AzuleUtama@users.noreply.github.com> Date: Wed, 22 Apr 2020 22:46:12 +0100 Subject: [PATCH 01/37] Lowers staff stats --- code/modules/projectiles/guns/magic/staff.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 9196596c8b5..72d128178a6 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -58,8 +58,6 @@ ammo_type = /obj/item/ammo_casing/magic/slipping icon_state = "staffofslipping" item_state = "staffofslipping" - max_charges = 10 - recharge_rate = 2 fire_sound = 'sound/items/bikehorn.ogg' /obj/item/gun/magic/staff/slipping/honkmother From 344226b2b4490d1bf8e1c925625570b1c4c9fe0f Mon Sep 17 00:00:00 2001 From: trololiver112 <59520813+trololiver112@users.noreply.github.com> Date: Mon, 8 Jun 2020 20:51:43 +0200 Subject: [PATCH 02/37] Gives the Chef the CQC manual as a traitor item --- code/datums/uplink_item.dm | 8 ++++++++ code/modules/martial_arts/martial.dm | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a0c9a19e4b0..bd5950c0469 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -247,6 +247,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 2 job = list("Chef") +/datum/uplink_item/jobspecific/Chef_CQC + name = " A chefs manual to CQC" + desc = "An old manual teaching you how to bring your home advantage outside the kitchen." + reference = "CCQC" + item = /obj/item/CQC_manual/chef + cost = 12 + job = list("Chef") + //Chaplain /datum/uplink_item/jobspecific/voodoo diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm index 478438c47cb..3bdc63a670f 100644 --- a/code/modules/martial_arts/martial.dm +++ b/code/modules/martial_arts/martial.dm @@ -195,12 +195,17 @@ icon = 'icons/obj/library.dmi' icon_state = "cqcmanual" +/obj/item/CQC_manual/chef + desc = "A small, black manual. Written on the back it says: Bringing the home advantage with you." + /obj/item/CQC_manual/attack_self(mob/living/carbon/human/user) if(!istype(user) || !user) return to_chat(user, "You remember the basics of CQC.") var/datum/martial_art/cqc/CQC = new(null) + var/datum/martial_art/cqc/under_siege/CCQC = new(null) + CCQC.remove(user) CQC.teach(user) user.drop_item() visible_message("[src] beeps ominously, and a moment later it bursts up in flames.") From 34bfd891e7d2f412bfd47d5f227e0acf3d66860c Mon Sep 17 00:00:00 2001 From: trololiver112 <59520813+trololiver112@users.noreply.github.com> Date: Mon, 8 Jun 2020 22:03:15 +0200 Subject: [PATCH 03/37] Removes CCQC.remove --- code/modules/martial_arts/martial.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm index 3bdc63a670f..924cc7b7d69 100644 --- a/code/modules/martial_arts/martial.dm +++ b/code/modules/martial_arts/martial.dm @@ -204,8 +204,6 @@ to_chat(user, "You remember the basics of CQC.") var/datum/martial_art/cqc/CQC = new(null) - var/datum/martial_art/cqc/under_siege/CCQC = new(null) - CCQC.remove(user) CQC.teach(user) user.drop_item() visible_message("[src] beeps ominously, and a moment later it bursts up in flames.") From 1c6234cf31cc62690cdcd487787b16cafa2904e9 Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Sun, 14 Jun 2020 19:55:23 +0200 Subject: [PATCH 04/37] change tech requirement for xray implant --- code/modules/research/designs/medical_designs.dm | 2 +- code/modules/surgery/organs/augments_eyes.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index e3bbb2f4aec..3dabea7dc6b 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -371,7 +371,7 @@ name = "X-Ray implant" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." id = "ci-xray" - req_tech = list("materials" = 7, "programming" = 5, "biotech" = 7, "magnets" = 5,"plasmatech" = 6) + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 8, "magnets" = 5,"plasmatech" = 6) build_type = PROTOLATHE | MECHFAB construction_time = 60 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_URANIUM = 1000, MAT_DIAMOND = 1000, MAT_BLUESPACE = 1000) diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 53907e86d79..042e911fae9 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -62,7 +62,7 @@ name = "X-ray implant" desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile." implant_color = "#000000" - origin_tech = "materials=4;programming=4;biotech=6;magnets=4" + origin_tech = "materials=4;programming=4;biotech=7;magnets=4" vision_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE From b9205b0e8ec7ebafcbe40caebf899ae108c9b782 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 14 Jun 2020 22:00:25 +0200 Subject: [PATCH 05/37] Add the random option to new objective admin tool --- code/datums/mind.dm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 7d3a73abf24..c0bacbbd90e 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -545,11 +545,20 @@ if(objective&&(objective.type in objective_list) && objective:target) def_target = objective.target.current possible_targets = sortAtom(possible_targets) - possible_targets += "Free objective" - var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets - if(!new_target) - return + var/new_target + if(LAZYLEN(possible_targets) > 0) + if(alert(usr, "Do you want to pick the objective yourself? No will randomise it", "Pick objective", "Yes", "No") == "Yes") + possible_targets += "Free objective" + new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets + else + new_target = pick(possible_targets) + + if(!new_target) + return + else + to_chat(usr, "No possible target found. Defaulting to a Free objective.") + new_target = "Free objective" var/objective_path = text2path("/datum/objective/[new_obj_type]") if(new_target == "Free objective") From 8e8d3dbe939bdfa60ec91a6d43050fd3188efa00 Mon Sep 17 00:00:00 2001 From: farie82 Date: Wed, 24 Jun 2020 12:13:34 +0200 Subject: [PATCH 06/37] Update mind.dm --- code/datums/mind.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index c0bacbbd90e..9fc7cd0e302 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -547,7 +547,7 @@ possible_targets = sortAtom(possible_targets) var/new_target - if(LAZYLEN(possible_targets) > 0) + if(length(possible_targets) > 0) if(alert(usr, "Do you want to pick the objective yourself? No will randomise it", "Pick objective", "Yes", "No") == "Yes") possible_targets += "Free objective" new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets From e5dc7e5591a95c17a95737a71cd67a0984b02d68 Mon Sep 17 00:00:00 2001 From: mochi Date: Fri, 26 Jun 2020 14:48:41 +0200 Subject: [PATCH 07/37] Fix off-center observer HUD --- code/_onclick/hud/_defines.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 58e82733abe..56275c50274 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -161,10 +161,10 @@ #define ui_bot_pull "EAST-2:26,SOUTH:7" //Ghosts -#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:24" -#define ui_ghost_orbit "SOUTH:6,CENTER-1:24" -#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24" -#define ui_ghost_teleport "SOUTH:6,CENTER+1:24" +#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:17" +#define ui_ghost_orbit "SOUTH:6,CENTER-1:17" +#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:17" +#define ui_ghost_teleport "SOUTH:6,CENTER+1:17" //HUD styles. Please ensure HUD_VERSIONS is the same as the maximum index. Index order defines how they are cycled in F12. #define HUD_STYLE_STANDARD 1 From 73b577c516756338f75710891b87baee9046553f Mon Sep 17 00:00:00 2001 From: mochi Date: Fri, 26 Jun 2020 20:11:39 +0200 Subject: [PATCH 08/37] Add mob spawner and pAI button in toggleable list, re-center --- code/_onclick/hud/_defines.dm | 11 +++--- code/_onclick/hud/ghost.dm | 62 ++++++++++++++++++++++++++++++++++ icons/mob/screen_ghost.dmi | Bin 20940 -> 23609 bytes 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 56275c50274..93786e50c76 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -161,10 +161,13 @@ #define ui_bot_pull "EAST-2:26,SOUTH:7" //Ghosts -#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:17" -#define ui_ghost_orbit "SOUTH:6,CENTER-1:17" -#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:17" -#define ui_ghost_teleport "SOUTH:6,CENTER+1:17" +#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:1" +#define ui_ghost_orbit "SOUTH:6,CENTER-1:1" +#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:1" +#define ui_ghost_teleport "SOUTH:6,CENTER+1:1" +#define ui_ghost_respawn_list "SOUTH:6,CENTER+2:1" +#define ui_ghost_respawn_mob "SOUTH:6+1,CENTER+2:1" +#define ui_ghost_respawn_pai "SOUTH:6+2,CENTER+2:1" //HUD styles. Please ensure HUD_VERSIONS is the same as the maximum index. Index order defines how they are cycled in F12. #define HUD_STYLE_STANDARD 1 diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 600c1105e8e..a291120fb85 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -40,6 +40,52 @@ var/mob/dead/observer/G = usr G.dead_tele() +/obj/screen/ghost/respawn_list + name = "Ghost spawns" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "template" + +/obj/screen/ghost/respawn_list/Initialize(mapload) + . = ..() + update_hidden_state() + +/obj/screen/ghost/respawn_list/Click() + var/client/C = hud.mymob.client + hud.inventory_shown = !hud.inventory_shown + if(hud.inventory_shown) + C.screen += hud.toggleable_inventory + else + C.screen -= hud.toggleable_inventory + update_hidden_state() + +/obj/screen/ghost/respawn_list/proc/update_hidden_state() + var/matrix/M = matrix(transform) + M.Turn(-90) + + overlays.Cut() + var/image/img = image('icons/mob/actions/actions.dmi', src, (hud && hud.inventory_shown) ? "hide" : "show") + img.transform = M + overlays += img + +/obj/screen/ghost/respawn_mob + name = "Mob spawners" + icon_state = "mob_spawner" + +/obj/screen/ghost/respawn_mob/Click() + var/mob/dead/observer/G = usr + G.open_spawners_menu() + +/obj/screen/ghost/respawn_pai + name = "Configure pAI" + icon_state = "pai" + +/obj/screen/ghost/respawn_pai/Click() + var/mob/dead/observer/G = usr + GLOB.paiController.recruitWindow(G) + +/datum/hud/ghost + inventory_shown = FALSE + /datum/hud/ghost/New(mob/owner) ..() var/obj/screen/using @@ -59,6 +105,22 @@ using = new /obj/screen/ghost/teleport() using.screen_loc = ui_ghost_teleport static_inventory += using + static_inventory += using + + using = new /obj/screen/ghost/respawn_list() + using.screen_loc = ui_ghost_respawn_list + static_inventory += using + + using = new /obj/screen/ghost/respawn_mob() + using.screen_loc = ui_ghost_respawn_mob + toggleable_inventory += using + + using = new /obj/screen/ghost/respawn_pai() + using.screen_loc = ui_ghost_respawn_pai + toggleable_inventory += using + + for(var/obj/screen/S in (static_inventory + toggleable_inventory)) + S.hud = src /datum/hud/ghost/show_hud() mymob.client.screen = list() diff --git a/icons/mob/screen_ghost.dmi b/icons/mob/screen_ghost.dmi index 6519d00aa978e24b65fe47dc5cde86aa5b0d3780..e0e85a6939c4d96ed45c08b9e6f76e51af20d89f 100644 GIT binary patch literal 23609 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 literal 20940 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 Date: Fri, 26 Jun 2020 20:19:42 +0200 Subject: [PATCH 09/37] Remove 1px offset --- code/_onclick/hud/_defines.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 93786e50c76..b069ff31eb7 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -161,13 +161,13 @@ #define ui_bot_pull "EAST-2:26,SOUTH:7" //Ghosts -#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:1" -#define ui_ghost_orbit "SOUTH:6,CENTER-1:1" -#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:1" -#define ui_ghost_teleport "SOUTH:6,CENTER+1:1" -#define ui_ghost_respawn_list "SOUTH:6,CENTER+2:1" -#define ui_ghost_respawn_mob "SOUTH:6+1,CENTER+2:1" -#define ui_ghost_respawn_pai "SOUTH:6+2,CENTER+2:1" +#define ui_ghost_jumptomob "SOUTH:6,CENTER-2" +#define ui_ghost_orbit "SOUTH:6,CENTER-1" +#define ui_ghost_reenter_corpse "SOUTH:6,CENTER" +#define ui_ghost_teleport "SOUTH:6,CENTER+1" +#define ui_ghost_respawn_list "SOUTH:6,CENTER+2" +#define ui_ghost_respawn_mob "SOUTH:6+1,CENTER+2" +#define ui_ghost_respawn_pai "SOUTH:6+2,CENTER+2" //HUD styles. Please ensure HUD_VERSIONS is the same as the maximum index. Index order defines how they are cycled in F12. #define HUD_STYLE_STANDARD 1 From a572022c64ca96685b71b222092706205a5d24ae Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 28 Jun 2020 00:55:45 +0200 Subject: [PATCH 10/37] Makes maint drones not have a camera --- code/modules/mob/living/silicon/robot/drone/drone.dm | 1 + code/modules/mob/living/silicon/robot/robot.dm | 3 ++- code/modules/mob/living/silicon/robot/syndicate.dm | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 39bedc78c77..4bc585fa2a1 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -13,6 +13,7 @@ braintype = "Robot" lawupdate = 0 density = 0 + has_camera = FALSE req_one_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS) ventcrawler = 2 magpulse = 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 2eb1e4669ab..11b2536a40c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -82,6 +82,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( var/lockcharge //Used when locking down a borg to preserve cell charge var/speed = 0 //Cause sec borgs gotta go fast //No they dont! var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them. + var/has_camera = TRUE var/pdahide = 0 //Used to hide the borg from the messenger list var/tracking_entities = 0 //The number of known entities currently accessing the internal camera var/braintype = "Cyborg" @@ -132,7 +133,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( init() - if(!scrambledcodes && !camera) + if(has_camera && !camera) camera = new /obj/machinery/camera(src) camera.c_tag = real_name camera.network = list("SS13","Robots") diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm index f5ac3e5532b..8e3f660ae98 100644 --- a/code/modules/mob/living/silicon/robot/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -3,6 +3,7 @@ icon_state = "syndie_bloodhound" lawupdate = 0 scrambledcodes = 1 + has_camera = FALSE pdahide = 1 faction = list("syndicate") designation = "Syndicate Assault" From 29a16d31167bdbf2f08e4dd652162ec3a05aed96 Mon Sep 17 00:00:00 2001 From: Kyep Date: Mon, 29 Jun 2020 18:14:19 -0700 Subject: [PATCH 11/37] Fixes dnamodifier bugs --- code/game/dna/dna_modifier.dm | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index eae6edd3bd4..2df4a929ceb 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -124,11 +124,11 @@ add_fingerprint(usr) /obj/machinery/dna_scannernew/Destroy() - eject_occupant() + eject_occupant(TRUE) return ..() -/obj/machinery/dna_scannernew/proc/eject_occupant() - go_out() +/obj/machinery/dna_scannernew/proc/eject_occupant(force) + go_out(force) for(var/obj/O in src) if(!istype(O,/obj/item/circuitboard/clonescanner) && \ !istype(O,/obj/item/stock_parts) && \ @@ -271,15 +271,16 @@ occupant.notify_ghost_cloning(source = src) -/obj/machinery/dna_scannernew/proc/go_out() +/obj/machinery/dna_scannernew/proc/go_out(force) if(!occupant) - to_chat(usr, "The scanner is empty!") + if(usr) + to_chat(usr, "The scanner is empty!") return - if(locked) - to_chat(usr, "The scanner is locked!") - return - + if(usr) + to_chat(usr, "The scanner is locked!") + if(!force) + return occupant.forceMove(loc) occupant = null icon_state = "scanner_open" From 359b26a811fade0613dcbb337644ac72af0a19f7 Mon Sep 17 00:00:00 2001 From: Kyep Date: Mon, 29 Jun 2020 20:05:20 -0700 Subject: [PATCH 12/37] Fox request, pass in the usr as arg to go_out()/eject_occupant() --- code/game/dna/dna_modifier.dm | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 2df4a929ceb..53e72fe3137 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -118,17 +118,15 @@ if(usr.incapacitated()) return - - eject_occupant() - + eject_occupant(usr) add_fingerprint(usr) /obj/machinery/dna_scannernew/Destroy() - eject_occupant(TRUE) + eject_occupant(null, TRUE) return ..() -/obj/machinery/dna_scannernew/proc/eject_occupant(force) - go_out(force) +/obj/machinery/dna_scannernew/proc/eject_occupant(user = null, force = FALSE) + go_out(user, force) for(var/obj/O in src) if(!istype(O,/obj/item/circuitboard/clonescanner) && \ !istype(O,/obj/item/stock_parts) && \ @@ -271,14 +269,14 @@ occupant.notify_ghost_cloning(source = src) -/obj/machinery/dna_scannernew/proc/go_out(force) +/obj/machinery/dna_scannernew/proc/go_out(mob/user, force) if(!occupant) - if(usr) - to_chat(usr, "The scanner is empty!") + if(user) + to_chat(user, "The scanner is empty!") return if(locked) - if(usr) - to_chat(usr, "The scanner is locked!") + if(user) + to_chat(user, "The scanner is locked!") if(!force) return occupant.forceMove(loc) @@ -752,7 +750,7 @@ return TRUE if(href_list["ejectOccupant"]) - connected.eject_occupant() + connected.eject_occupant(usr) return TRUE // Transfer Buffer Management From 5393a840e0dbd1b396fa8d2451acd039b8c9f491 Mon Sep 17 00:00:00 2001 From: Kyep Date: Mon, 29 Jun 2020 23:01:13 -0700 Subject: [PATCH 13/37] Fox requests --- code/game/dna/dna_modifier.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 53e72fe3137..2f9cc98f164 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -125,7 +125,7 @@ eject_occupant(null, TRUE) return ..() -/obj/machinery/dna_scannernew/proc/eject_occupant(user = null, force = FALSE) +/obj/machinery/dna_scannernew/proc/eject_occupant(user, force) go_out(user, force) for(var/obj/O in src) if(!istype(O,/obj/item/circuitboard/clonescanner) && \ @@ -274,11 +274,10 @@ if(user) to_chat(user, "The scanner is empty!") return - if(locked) + if(locked && !force) if(user) to_chat(user, "The scanner is locked!") - if(!force) - return + return occupant.forceMove(loc) occupant = null icon_state = "scanner_open" From 20772d2899fa64a0c2470305c087d97897e1e186 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 30 Jun 2020 22:30:08 -0400 Subject: [PATCH 14/37] Fixes Mob Init Arguments and Returned Values --- code/modules/mob/living/carbon/human/human.dm | 54 +++++++++---------- code/modules/mob/living/carbon/human/npcs.dm | 2 +- .../mob/living/simple_animal/bot/honkbot.dm | 2 +- .../mob/living/simple_animal/corpse.dm | 4 +- .../simple_animal/hostile/megafauna/drake.dm | 2 +- .../mob/living/simple_animal/hostile/mimic.dm | 4 +- .../simple_animal/hostile/netherworld.dm | 2 +- .../living/simple_animal/hostile/syndicate.dm | 2 +- code/modules/mob/mob.dm | 4 +- 9 files changed, 38 insertions(+), 38 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e58ba518780..a7d603f7acd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -18,7 +18,7 @@ dna = new /datum/dna(null) // Species name is handled by set_species() - ..() + . = ..() set_species(new_species, 1, delay_icon_update = 1, skip_same_check = TRUE) @@ -68,55 +68,55 @@ status_flags = GODMODE|CANPUSH /mob/living/carbon/human/skrell/Initialize(mapload) - ..(mapload, /datum/species/skrell) + . = ..(mapload, /datum/species/skrell) /mob/living/carbon/human/tajaran/Initialize(mapload) - ..(mapload, /datum/species/tajaran) + . = ..(mapload, /datum/species/tajaran) /mob/living/carbon/human/vulpkanin/Initialize(mapload) - ..(mapload, /datum/species/vulpkanin) + . = ..(mapload, /datum/species/vulpkanin) /mob/living/carbon/human/unathi/Initialize(mapload) - ..(mapload, /datum/species/unathi) + . = ..(mapload, /datum/species/unathi) /mob/living/carbon/human/vox/Initialize(mapload) - ..(mapload, /datum/species/vox) + . = ..(mapload, /datum/species/vox) /mob/living/carbon/human/voxarmalis/Initialize(mapload) - ..(mapload, /datum/species/vox/armalis) + . = ..(mapload, /datum/species/vox/armalis) /mob/living/carbon/human/skeleton/Initialize(mapload) - ..(mapload, /datum/species/skeleton) + . = ..(mapload, /datum/species/skeleton) /mob/living/carbon/human/kidan/Initialize(mapload) - ..(mapload, /datum/species/kidan) + . = ..(mapload, /datum/species/kidan) /mob/living/carbon/human/plasma/Initialize(mapload) - ..(mapload, /datum/species/plasmaman) + . = ..(mapload, /datum/species/plasmaman) /mob/living/carbon/human/slime/Initialize(mapload) - ..(mapload, /datum/species/slime) + . = ..(mapload, /datum/species/slime) /mob/living/carbon/human/grey/Initialize(mapload) - ..(mapload, /datum/species/grey) + . = ..(mapload, /datum/species/grey) /mob/living/carbon/human/abductor/Initialize(mapload) - ..(mapload, /datum/species/abductor) + . = ..(mapload, /datum/species/abductor) /mob/living/carbon/human/diona/Initialize(mapload) - ..(mapload, /datum/species/diona) + . = ..(mapload, /datum/species/diona) /mob/living/carbon/human/pod_diona/Initialize(mapload) - ..(mapload, /datum/species/diona/pod) + . = ..(mapload, /datum/species/diona/pod) /mob/living/carbon/human/machine/Initialize(mapload) - ..(mapload, /datum/species/machine) + . = ..(mapload, /datum/species/machine) /mob/living/carbon/human/machine/created name = "Integrated Robotic Chassis" /mob/living/carbon/human/machine/created/Initialize(mapload) - ..() + . = ..() rename_character(null, "Integrated Robotic Chassis ([rand(1, 9999)])") update_dna() for(var/obj/item/organ/external/E in bodyparts) @@ -129,34 +129,34 @@ death() /mob/living/carbon/human/shadow/Initialize(mapload) - ..(mapload, /datum/species/shadow) + . = ..(mapload, /datum/species/shadow) /mob/living/carbon/human/golem/Initialize(mapload) - ..(mapload, /datum/species/golem) + . = ..(mapload, /datum/species/golem) /mob/living/carbon/human/wryn/Initialize(mapload) - ..(mapload, /datum/species/wryn) + . = ..(mapload, /datum/species/wryn) /mob/living/carbon/human/nucleation/Initialize(mapload) - ..(mapload, /datum/species/nucleation) + . = ..(mapload, /datum/species/nucleation) /mob/living/carbon/human/drask/Initialize(mapload) - ..(mapload, /datum/species/drask) + . = ..(mapload, /datum/species/drask) /mob/living/carbon/human/monkey/Initialize(mapload) - ..(mapload, /datum/species/monkey) + . = ..(mapload, /datum/species/monkey) /mob/living/carbon/human/farwa/Initialize(mapload) - ..(mapload, /datum/species/monkey/tajaran) + . = ..(mapload, /datum/species/monkey/tajaran) /mob/living/carbon/human/wolpin/Initialize(mapload) - ..(mapload, /datum/species/monkey/vulpkanin) + . = ..(mapload, /datum/species/monkey/vulpkanin) /mob/living/carbon/human/neara/Initialize(mapload) - ..(mapload, /datum/species/monkey/skrell) + . = ..(mapload, /datum/species/monkey/skrell) /mob/living/carbon/human/stok/Initialize(mapload) - ..(mapload, /datum/species/monkey/unathi) + . = ..(mapload, /datum/species/monkey/unathi) /mob/living/carbon/human/Stat() ..() diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm index 41c108dadb9..9dcf83f2e9a 100644 --- a/code/modules/mob/living/carbon/human/npcs.dm +++ b/code/modules/mob/living/carbon/human/npcs.dm @@ -7,7 +7,7 @@ species_exception = list(/datum/species/monkey) /mob/living/carbon/human/monkey/punpun/Initialize(mapload) - ..() + . = ..() name = "Pun Pun" real_name = name equip_to_slot(new /obj/item/clothing/under/punpun(src), slot_w_uniform) diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index d9097a82d2e..62c133fffd7 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -33,7 +33,7 @@ /obj/machinery/bot_core/honkbot req_one_access = list(ACCESS_CLOWN, ACCESS_ROBOTICS, ACCESS_MIME) -/mob/living/simple_animal/bot/honkbot/Initialize() +/mob/living/simple_animal/bot/honkbot/Initialize(mapload) . = ..() update_icon() auto_patrol = TRUE diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 10460d11e65..8d0ad5d0e2b 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -103,9 +103,9 @@ name = "Space Wizard Corpse" outfit = /datum/outfit/wizardcorpse -/obj/effect/mob_spawn/human/corpse/clownoff/Initialize() +/obj/effect/mob_spawn/human/corpse/clownoff/Initialize(mapload) mob_name = "[pick(GLOB.wizard_first)], [pick(GLOB.wizard_second)]" - ..() + . = ..() /datum/outfit/wizardcorpse name = "Space Wizard Corpse" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 6dca834169b..50531f976e9 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -534,7 +534,7 @@ obj/effect/temp_visual/fireball duration = 9 pixel_z = 270 -/obj/effect/temp_visual/fireball/Initialize() +/obj/effect/temp_visual/fireball/Initialize(mapload) . = ..() animate(src, pixel_z = 0, time = duration) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 848a285abf4..fbf65ccfa9b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -48,8 +48,8 @@ var/attempt_open = 0 // Pickup loot -/mob/living/simple_animal/hostile/mimic/crate/Initialize() - ..() +/mob/living/simple_animal/hostile/mimic/crate/Initialize(mapload) + . = ..() for(var/obj/item/I in loc) I.loc = src diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index e8ce4027b4e..0f0c52b78e3 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -31,7 +31,7 @@ deathmessage = "wails as its form turns into a pulpy mush." death_sound = 'sound/voice/hiss6.ogg' -/mob/living/simple_animal/hostile/netherworld/migo/Initialize() +/mob/living/simple_animal/hostile/netherworld/migo/Initialize(mapload) . = ..() migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/voice/bcreep.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/mpatchedup.ogg', 'sound/voice/mfeelbetter.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heartbeat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/goonstation/effects/screech.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/goonstation/misc/airraid_loop.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/chainsaw.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshots/gunshot_silenced.ogg', 'sound/weapons/gunshots/gunshot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlock_close.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlock_open.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/poweroff.ogg', 'sound/ai/radiation.ogg', 'sound/ai/shuttlecalled.ogg', 'sound/ai/shuttledock.ogg', 'sound/ai/shuttlerecalled.ogg', 'sound/ai/aimalf.ogg', 'sound/ambience/ambigen1.ogg', 'sound/ambience/ambigen3.ogg', 'sound/ambience/ambigen4.ogg', 'sound/ambience/ambigen5.ogg', 'sound/ambience/ambigen6.ogg', 'sound/ambience/ambigen10.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg') //hahahaha fuck you code divers diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 7ebddfeec12..decfc7146cf 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -260,7 +260,7 @@ alert_on_shield_breach = TRUE /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize(mapload) - ..() + . = ..() if(prob(50)) // 50% chance of switching to extremely dangerous ranged variant melee_damage_lower = 10 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d6a86d3e3cd..f10e2c88859 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -23,7 +23,7 @@ LAssailant = null return ..() -/mob/Initialize() +/mob/Initialize(mapload) GLOB.mob_list += src if(stat == DEAD) GLOB.dead_mob_list += src @@ -31,7 +31,7 @@ GLOB.alive_mob_list += src set_focus(src) prepare_huds() - ..() + . = ..() /atom/proc/prepare_huds() hud_list = list() From 6d6091c0e20f8b387b42694efd30109bab596ca6 Mon Sep 17 00:00:00 2001 From: denghis1 <63977635+denghis1@users.noreply.github.com> Date: Wed, 1 Jul 2020 09:29:10 +0200 Subject: [PATCH 15/37] Added wrench_act to slot machines, so that they can be moved by the crew Added the section of code that is used on pretty much every wrenchable machinery to the slot machines, so that they can now be moved and wrenched down again. Wrench time set to 120 to make it take a tad longer than most things to unwrench/wrench. --- code/game/machinery/slotmachine.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index d0cf38a272d..bdadb1b0da9 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -20,6 +20,12 @@ account = null ui_interact(user) +/obj/machinery/slot_machine/wrench_act(mob/user, obj/item/I) + . = TRUE + if(!I.tool_use_check(user, 0)) + return + default_unfasten_wrench(user, I, 120) + /obj/machinery/slot_machine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) From 71501580dda4a3f1b8f57855aec6fc8ff6e3923c Mon Sep 17 00:00:00 2001 From: denghis1 <63977635+denghis1@users.noreply.github.com> Date: Wed, 1 Jul 2020 13:20:49 +0200 Subject: [PATCH 16/37] Timer set to use default value Timer for wrenching changed from 120 the use the proc default instead of 20, this brings it in line with most other wrenchable objects --- code/game/machinery/slotmachine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index bdadb1b0da9..5952108b6a9 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -24,7 +24,7 @@ . = TRUE if(!I.tool_use_check(user, 0)) return - default_unfasten_wrench(user, I, 120) + default_unfasten_wrench(user, I) /obj/machinery/slot_machine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) From c709b133452b07b85ef8e3f51218c6765f834348 Mon Sep 17 00:00:00 2001 From: denghis1 <63977635+denghis1@users.noreply.github.com> Date: Wed, 1 Jul 2020 15:54:10 +0200 Subject: [PATCH 17/37] Prevent swarmers from eating the green podbay door energy barrier Prevents swarmers from eating the spacepoddoor, green energy field. This could be eaten to open up a way into space for swarmers --- code/game/gamemodes/miniantags/bot_swarm/swarmer.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 27097d64913..8da5b4468d7 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -363,6 +363,10 @@ to_chat(S, "This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting.") return FALSE +/obj/structure/spacepoddoor/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + to_chat(S, "Disrupting this energy field would overload us. Aborting.") + return FALSE + /turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) var/isonshuttle = istype(loc, /area/shuttle) for(var/turf/T in range(1, src)) From 8852a9de587a83b92ff700b50ebda0a2221da960 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 1 Jul 2020 10:45:42 -0400 Subject: [PATCH 18/37] Makes New Players GC --- code/ATMOSPHERICS/atmospherics.dm | 2 +- code/__HELPERS/game.dm | 2 +- code/__HELPERS/unique_ids.dm | 6 +----- code/_globalvars/misc.dm | 2 +- code/controllers/configuration.dm | 2 +- code/controllers/subsystem/ticker.dm | 2 +- code/game/atoms_movable.dm | 1 + code/game/machinery/tcomms/_base.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/verbs/who.dm | 6 +++--- code/game/world.dm | 2 +- code/modules/admin/DB ban/functions.dm | 2 +- code/modules/admin/admin.dm | 8 ++++---- code/modules/admin/admin_verbs.dm | 4 ++-- code/modules/admin/player_panel.dm | 4 ++-- code/modules/admin/topic.dm | 10 ++++------ code/modules/admin/verbs/adminpm.dm | 4 ++-- code/modules/admin/verbs/debug.dm | 4 ++-- code/modules/client/client procs.dm | 11 +++++++++-- code/modules/events/dust.dm | 2 +- code/modules/food_and_drinks/drinks/drinks/bottle.dm | 2 +- code/modules/mob/emote.dm | 2 +- code/modules/mob/mob.dm | 2 +- code/modules/mob/mob_grab.dm | 2 +- code/modules/mob/mob_helpers.dm | 2 +- code/modules/mob/mob_transformation_simple.dm | 2 +- code/modules/mob/new_player/new_player.dm | 7 ++++++- 27 files changed, 52 insertions(+), 45 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 002b3ecc691..8dd95119aff 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -59,7 +59,7 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) for(var/mob/living/L in src) //ventcrawling is serious business L.remove_ventcrawl() L.forceMove(get_turf(src)) - QDEL_NULL(pipe_image) //we have to del it, or it might keep a ref somewhere else + QDEL_NULL(pipe_image) //we have to qdel it, or it might keep a ref somewhere else return ..() // Icons/overlays/underlays diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index b519130bb4f..bd077204f00 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -344,7 +344,7 @@ for(var/i = 1; i <= GLOB.player_list.len; i++) var/mob/M = GLOB.player_list[i] if(M && M.client) - if(istype(M, /mob/new_player)) // exclude people in the lobby + if(isnewplayer(M)) // exclude people in the lobby continue else if(isobserver(M)) // Ghosts are fine if they were playing once (didn't start as observers) var/mob/dead/observer/O = M diff --git a/code/__HELPERS/unique_ids.dm b/code/__HELPERS/unique_ids.dm index 549f5c71016..b66b1a11b90 100644 --- a/code/__HELPERS/unique_ids.dm +++ b/code/__HELPERS/unique_ids.dm @@ -16,8 +16,6 @@ GLOBAL_VAR_INIT(next_unique_datum_id, 1) -// /client/var/tmp/unique_datum_id = null - /datum/proc/UID() if(!unique_datum_id) var/tag_backup = tag @@ -37,8 +35,6 @@ GLOBAL_VAR_INIT(next_unique_datum_id, 1) var/datum/D = locate(copytext(uid, 1, splitat)) - // We might locate a client instead of a datum, but just using : is easier - // than actually checking and typecasting - if(D && D:unique_datum_id == uid) + if(D && D.unique_datum_id == uid) return D return null diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 74591eb8070..c541e40768a 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -4,7 +4,7 @@ GLOBAL_DATUM(slmaster, /obj/effect/overlay) GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) -// Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it. +// Announcer intercom, because too much stuff creates an intercom for one message then qdel()s it. GLOBAL_DATUM_INIT(global_announcer, /obj/item/radio/intercom, create_global_announcer()) GLOBAL_DATUM_INIT(command_announcer, /obj/item/radio/intercom/command, create_command_announcer()) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index d348747fb80..083b347e52c 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -36,7 +36,7 @@ var/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) var/vote_no_dead = 0 // dead people can't vote (tbi) // var/enable_authentication = 0 // goon authentication - var/del_new_on_log = 1 // del's new players if they log before they spawn in + var/del_new_on_log = 1 // qdel's new players if they log before they spawn in var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard var/traitor_scaling = 0 //if amount of traitors scales based on amount of players var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 475bdaccb3c..6f8dd85b79b 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -407,7 +407,7 @@ SUBSYSTEM_DEF(ticker) EquipCustomItems(player) if(captainless) for(var/mob/M in GLOB.player_list) - if(!istype(M,/mob/new_player)) + if(!isnewplayer(M)) to_chat(M, "Captainship not forced on anyone.") /datum/controller/subsystem/ticker/proc/send_tip_of_the_round() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index aed4a4c5c2d..ab5ff19462a 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -50,6 +50,7 @@ loc.handle_atom_del(src) for(var/atom/movable/AM in contents) qdel(AM) + LAZYCLEARLIST(client_mobs_in_contents) loc = null if(pulledby) pulledby.stop_pulling() diff --git a/code/game/machinery/tcomms/_base.dm b/code/game/machinery/tcomms/_base.dm index 7e468a548bf..dc933099faa 100644 --- a/code/game/machinery/tcomms/_base.dm +++ b/code/game/machinery/tcomms/_base.dm @@ -306,7 +306,7 @@ GLOBAL_LIST_EMPTY(tcomms_machines) if(is_admin(R) && !R.get_preference(CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. continue - if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes. + if(isnewplayer(R)) // we don't want new players to hear messages. rare but generates runtimes. continue // --- Can understand the speech --- diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 14ccc103ab1..ab592cc0402 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -204,7 +204,7 @@ if(amount < 1) // Just in case a stack's amount ends up fractional somehow var/oldsrc = src - src = null //dont kill proc after del() + src = null //dont kill proc after qdel() usr.unEquip(oldsrc, 1) qdel(oldsrc) if(istype(O, /obj/item)) diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 2683e236269..95b11353b86 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -27,7 +27,7 @@ entry += " - Observing" else entry += " - DEAD" - else if(istype(C.mob, /mob/new_player)) + else if(isnewplayer(C.mob)) entry += " - New Player" else entry += " - DEAD" @@ -90,7 +90,7 @@ if(isobserver(C.mob)) msg += " - Observing" - else if(istype(C.mob,/mob/new_player)) + else if(isnewplayer(C.mob)) msg += " - Lobby" else msg += " - Playing" @@ -106,7 +106,7 @@ if(isobserver(C.mob)) modmsg += " - Observing" - else if(istype(C.mob,/mob/new_player)) + else if(isnewplayer(C.mob)) modmsg += " - Lobby" else modmsg += " - Playing" diff --git a/code/game/world.dm b/code/game/world.dm index daeab8fbe4c..355c6280aaf 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -232,7 +232,7 @@ GLOBAL_VAR_INIT(world_topic_spam_protect_time, world.timeofday) if(!C) return "No client with that name on server" - del(C) + qdel(C) return "Kick Successful" diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index 21b59586bfd..25693b58f47 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -146,7 +146,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = if(kickbannedckey) if(banned_mob && banned_mob.client && banned_mob.client.ckey == banckey) - del(banned_mob.client) + qdel(banned_mob.client) if(isjobban) jobban_client_fullban(ckey, job) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index df156c5b0df..1eed8083a97 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -72,7 +72,7 @@ GLOBAL_VAR_INIT(nologevent, 0) body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\] " body += "\[" + M.client.get_exp_type(EXP_TYPE_CREW) + " as [EXP_TYPE_CREW]\]" - if(istype(M, /mob/new_player)) + if(isnewplayer(M)) body += " Hasn't Entered Game " else body += " \[Heal\] " @@ -147,7 +147,7 @@ GLOBAL_VAR_INIT(nologevent, 0) body += {" | Cryo "} if(M.client) - if(!istype(M, /mob/new_player)) + if(!isnewplayer(M)) body += "

" body += "Transformation:" body += "
" @@ -1004,13 +1004,13 @@ GLOBAL_VAR_INIT(gamma_ship_location, 1) // 0 = station , 1 = space /proc/kick_clients_in_lobby(message, kick_only_afk = 0) var/list/kicked_client_names = list() for(var/client/C in GLOB.clients) - if(istype(C.mob, /mob/new_player)) + if(isnewplayer(C.mob)) if(kick_only_afk && !C.is_afk()) //Ignore clients who are not afk continue if(message) to_chat(C, message) kicked_client_names.Add("[C.ckey]") - del(C) + qdel(C) return kicked_client_names //returns 1 to let the dragdrop code know we are trapping this event diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 4e3d2d65f30..80a60957c75 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -337,7 +337,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( ghost.reenter_corpse() log_admin("[key_name(usr)] re-entered their body") feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - else if(istype(mob,/mob/new_player)) + else if(isnewplayer(mob)) to_chat(src, "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or observe first.") else //ghostize @@ -542,7 +542,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban") log_admin("[key_name(src)] has warned [key_name(C)] resulting in a [AUTOBANTIME] minute ban") to_chat(C, "You have been autobanned due to a warning by [ckey].
This is a temporary ban, it will be removed in [AUTOBANTIME] minutes.") - del(C) + qdel(C) else message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban") log_admin("[key_name(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban") diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index efb5ac32f97..e89b829f421 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -268,7 +268,7 @@ else M_job = "Living" - else if(istype(M,/mob/new_player)) + else if(isnewplayer(M)) M_job = "New player" else if(isobserver(M)) @@ -356,7 +356,7 @@ dat += "[M.real_name]" else if(istype(M, /mob/living/silicon/pai)) dat += "pAI" - else if(istype(M, /mob/new_player)) + else if(isnewplayer(M)) dat += "New Player" else if(isobserver(M)) dat += "Ghost" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1a040d46e90..ac8adc5fdf0 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -909,7 +909,7 @@ log_admin("[key_name(usr)] booted [key_name(M)].") message_admins("[key_name_admin(usr)] booted [key_name_admin(M)].", 1) //M.client = null - del(M.client) + qdel(M.client) //Player Notes else if(href_list["addnote"]) @@ -1011,8 +1011,7 @@ log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") - del(M.client) - //qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends. + qdel(M.client) if("No") var/reason = input(usr,"Please state the reason","Reason") as message|null if(!reason) @@ -1032,8 +1031,7 @@ feedback_inc("ban_perma",1) DB_ban_record(BANTYPE_PERMA, M, -1, reason) - del(M.client) - //qdel(M) + qdel(M.client) if("Cancel") return @@ -1507,7 +1505,7 @@ if(!check_rights(R_SPAWN)) return var/mob/M = locateUID(href_list["makeanimal"]) - if(istype(M, /mob/new_player)) + if(isnewplayer(M)) to_chat(usr, "This cannot be used on instances of type /mob/new_player") return if(alert(usr, "Confirm make animal?",, "Yes", "No") != "Yes") diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 164d499e04a..dba9a5c26aa 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -19,7 +19,7 @@ var/list/client/targets[0] for(var/client/T) if(T.mob) - if(istype(T.mob, /mob/new_player)) + if(isnewplayer(T.mob)) targets["(New Player) - [T]"] = T else if(istype(T.mob, /mob/dead/observer)) targets["[T.mob.name](Ghost) - [T]"] = T @@ -42,7 +42,7 @@ var/list/client/targets[0] for(var/client/T) if(T.mob) - if(istype(T.mob, /mob/new_player)) + if(isnewplayer(T.mob)) targets["[T] - (New Player)"] = T else if(istype(T.mob, /mob/dead/observer)) targets["[T] - [T.mob.name](Ghost)"] = T diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 329efb8e067..496292c919b 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -251,7 +251,7 @@ GLOBAL_PROTECT(AdminProcCaller) alert("That mob doesn't seem to exist, close the panel and try again.") return - if(istype(M, /mob/new_player)) + if(isnewplayer(M)) alert("The mob must not be a new_player.") return @@ -382,7 +382,7 @@ GLOBAL_PROTECT(AdminProcCaller) if(!check_rights(R_DEBUG)) return - //This gets a confirmation check because it's way easier to accidentally hit this and delete things than it is with del-all + //This gets a confirmation check because it's way easier to accidentally hit this and delete things than it is with qdel-all var/confirm = alert("This will delete ALL Singularities and Tesla orbs except for any that are on away mission z-levels or the centcomm z-level. Are you sure you want to delete them?", "Confirm Panic Button", "Yes", "No") if(confirm != "Yes") return diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 561b0b48149..c4604fcf9ab 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -432,7 +432,13 @@ ////////////// //DISCONNECT// ////////////// + /client/Del() + if(!gc_destroyed) + Destroy() //Clean up signals and timers. + return ..() + +/client/Destroy() if(holder) holder.owner = null GLOB.admins -= src @@ -442,7 +448,8 @@ movingmob.client_mobs_in_contents -= mob UNSETEMPTY(movingmob.client_mobs_in_contents) Master.UpdateTickRate() - return ..() + ..() //Even though we're going to be hard deleted there are still some things that want to know the destroy is happening + return QDEL_HINT_HARDDEL_NOW /client/proc/donator_check() @@ -556,7 +563,7 @@ if(GLOB.panic_bunker_enabled) var/threshold = config.panic_bunker_threshold src << "Server is not accepting connections from never-before-seen players until player count is less than [threshold]. Please try again later." - del(src) + qdel(src) return // Dont insert or they can just go in again var/DBQuery/query_insert = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')") diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 563ef98697d..a11ef107a8f 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -16,7 +16,7 @@ density = 1 anchored = 1 var/strength = 2 //ex_act severity number - var/life = 2 //how many things we hit before del(src) + var/life = 2 //how many things we hit before qdel(src) var/atom/goal = null /obj/effect/space_dust/weak diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index d6395bf3d43..4515a62d86b 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -115,7 +115,7 @@ //The reagents in the bottle splash all over the target, thanks for the idea Nodrak SplashReagents(target) - //Finally, smash the bottle. This kills (del) the bottle. + //Finally, smash the bottle. This kills (qdel) the bottle. smash(target, user) /obj/item/reagent_containers/food/drinks/bottle/proc/SplashReagents(mob/M) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 5f18a27adc9..99e0af0ca6a 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -135,7 +135,7 @@ if(message) for(var/mob/M in GLOB.player_list) - if(istype(M, /mob/new_player)) + if(isnewplayer(M)) continue if(check_rights(R_ADMIN|R_MOD, 0, M) && M.get_preference(CHAT_DEAD)) // Show the emote to admins/mods diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d6a86d3e3cd..0b56391d79a 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -752,7 +752,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ if(client.holder && (client.holder.rights & R_ADMIN)) is_admin = 1 - else if(stat != DEAD || istype(src, /mob/new_player)) + else if(stat != DEAD || isnewplayer(src)) to_chat(usr, "You must be observing to use this!") return diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 64444864804..37e116b4376 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -434,7 +434,7 @@ if(affecting) if(!affecting.buckled) affecting.pixel_x = 0 - affecting.pixel_y = 0 //used to be an animate, not quick enough for del'ing + affecting.pixel_y = 0 //used to be an animate, not quick enough for qdel'ing affecting.layer = initial(affecting.layer) affecting.grabbed_by -= src affecting = null diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 63175a68024..5fb5bcb06c8 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -459,7 +459,7 @@ GLOBAL_LIST_INIT(intents, list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM name = realname for(var/mob/M in GLOB.player_list) - if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || check_rights(R_ADMIN|R_MOD,0,M)) && M.get_preference(CHAT_DEAD)) + if(M.client && ((!isnewplayer(M) && M.stat == DEAD) || check_rights(R_ADMIN|R_MOD,0,M)) && M.get_preference(CHAT_DEAD)) var/follow var/lname if(subject) diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index c3ec68c9793..1e704ea3449 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -4,7 +4,7 @@ //Note that this proc does NOT do MMI related stuff! /mob/proc/change_mob_type(var/new_type = null, var/turf/location = null, var/new_name = null as text, var/delete_old_mob = 0 as num, var/forcekey = 0) - if(istype(src,/mob/new_player)) + if(isnewplayer(src)) to_chat(usr, "cannot convert players who have not entered yet.") return diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index af3d439df59..9107d7d09ae 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -12,8 +12,13 @@ stat = 2 canmove = 0 -/mob/new_player/New() +/mob/new_player/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) + if(initialized) + stack_trace("Warning: [src]([type]) initialized multiple times!") + initialized = TRUE GLOB.mob_list += src + return INITIALIZE_HINT_NORMAL /mob/new_player/verb/new_player_panel() set src = usr From b94c07b79771a4c94cd1b27c0b2a5b2b1957600b Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 1 Jul 2020 13:33:46 -0400 Subject: [PATCH 19/37] No Destroying Things Directly --- code/datums/components/ducttape.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/components/ducttape.dm b/code/datums/components/ducttape.dm index 98512589a46..49931db8edc 100644 --- a/code/datums/components/ducttape.dm +++ b/code/datums/components/ducttape.dm @@ -37,10 +37,10 @@ I.anchored = initial(I.anchored) for(var/datum/action/item_action/remove_tape/RT in I.actions) RT.Remove(user) - RT.Destroy() + qdel(RT) I.overlays.Cut(tape_overlay) user.transfer_fingerprints_to(I) - Destroy() + qdel(src) /datum/component/ducttape/proc/afterattack(obj/item/I, atom/target, mob/user, proximity, params) if(!proximity) From f1f7610c4d515f942d1b34cea1627f2aaa754cd6 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 1 Jul 2020 13:46:09 -0400 Subject: [PATCH 20/37] client cleanup --- code/modules/client/client defines.dm | 7 ------- 1 file changed, 7 deletions(-) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 3cd6458afdf..9a3a1215df3 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -59,10 +59,6 @@ var/karma = 0 var/karma_spent = 0 var/karma_tab = 0 - ///////////////////////////////////////////// - // /vg/: MEDIAAAAAAAA - // Set on login. - var/datum/media_manager/media = null var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier @@ -85,9 +81,6 @@ // If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction var/advanced_admin_interaction = FALSE - // Has the client been varedited by an admin? [Inherits from datum now] - // var/var_edited = FALSE - var/client_keysend_amount = 0 var/next_keysend_reset = 0 var/next_keysend_trip_reset = 0 From 79cc1e24e4daaac4fd3736802b66d84ccfefc2a5 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Thu, 2 Jul 2020 09:59:27 +0100 Subject: [PATCH 21/37] Fixes typo in TGUI tutorial docs --- tgui/docs/tutorial-and-examples.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tgui/docs/tutorial-and-examples.md b/tgui/docs/tutorial-and-examples.md index b50d980157c..08bb6f92321 100644 --- a/tgui/docs/tutorial-and-examples.md +++ b/tgui/docs/tutorial-and-examples.md @@ -37,7 +37,7 @@ powerful interactions for embedded objects or remote access. Let's start with a very basic hello world. ```dm -/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = default_state) +/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "my_machine", name, 300, 300, master_ui, state) @@ -294,7 +294,7 @@ here's what you need (note that you'll probably be forced to clean your shit up upon code review): ```dm -/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state) // Remember to use the appropriate state. +/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) // Remember to use the appropriate state. ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "copypasta", name, 300, 300, master_ui, state) From e305530d59b9bb8169191a4c60feb30c8d33f3a8 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Thu, 2 Jul 2020 21:22:55 +0100 Subject: [PATCH 22/37] Obliterates Zombies --- code/__DEFINES/genetics.dm | 1 - code/__DEFINES/is_helpers.dm | 1 - code/_globalvars/lists/objects.dm | 1 - code/datums/uplink_item.dm | 9 -- code/game/gamemodes/objective.dm | 10 +- .../items/weapons/storage/uplink_kits.dm | 13 --- code/modules/mob/language.dm | 11 -- .../living/carbon/human/species/_species.dm | 1 - .../living/carbon/human/species/zombies.dm | 102 ------------------ .../simple_animal/hostile/netherworld.dm | 4 +- .../sprite_accessories/sprite_accessories.dm | 2 +- .../reagents/chemistry/reagents/toxins.dm | 31 ------ .../reagents/reagent_containers/bottle.dm | 5 - code/modules/shuttle/emergency.dm | 2 - code/modules/zombie/items.dm | 69 ------------ code/modules/zombie/organs.dm | 99 ----------------- icons/mob/human_races/r_def_zombie.dmi | Bin 2032 -> 0 bytes icons/mob/human_races/r_zombie.dmi | Bin 2032 -> 0 bytes paradise.dme | 3 - 19 files changed, 8 insertions(+), 356 deletions(-) delete mode 100644 code/modules/mob/living/carbon/human/species/zombies.dm delete mode 100644 code/modules/zombie/items.dm delete mode 100644 code/modules/zombie/organs.dm delete mode 100644 icons/mob/human_races/r_def_zombie.dmi delete mode 100644 icons/mob/human_races/r_zombie.dmi diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 58571e8b1ca..5fd85513501 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -145,7 +145,6 @@ #define RESISTCOLD "resist_cold" #define NO_EXAMINE "no_examine" #define CAN_WINGDINGS "can_wingdings" -#define NOZOMBIE "no_zombie" #define NO_GERMS "no_germs" #define NO_DECAY "no_decay" #define PIERCEIMMUNE "pierce_immunity" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index b52d08c1d23..2b8c515e81a 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -3,7 +3,6 @@ // Mobs #define ismegafauna(A) istype(A, /mob/living/simple_animal/hostile/megafauna) -#define iszombie(A) (is_species(A, /datum/species/zombie)) //Simple animals #define isshade(A) (istype(A, /mob/living/simple_animal/shade)) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 931a0e394e8..21af95cab48 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -16,7 +16,6 @@ GLOBAL_LIST_INIT(prisoncomputer_list, list()) GLOBAL_LIST_INIT(celltimers_list, list()) // list of all cell timers GLOBAL_LIST_INIT(cell_logs, list()) GLOBAL_LIST_INIT(navigation_computers, list()) -GLOBAL_LIST_INIT(zombie_infection_list, list()) GLOBAL_LIST_INIT(all_areas, list()) GLOBAL_LIST_INIT(machines, list()) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a0c9a19e4b0..8dbdfd95420 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -188,15 +188,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/storage/box/syndie_kit/fake_revolver cost = 1 job = list("Clown") -/* -/datum/uplink_item/stealthy_weapons/romerol_kit - name = "Romerol" - reference = "ROM" - desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. On death, these nodules take control of the dead body, causing limited revivification, along with slurred speech, aggression, and the ability to infect others with this agent." - item = /obj/item/storage/box/syndie_kit/romerol - cost = 25 - cant_discount = TRUE -*/ //mime /datum/uplink_item/jobspecific/caneshotgun name = "Cane Shotgun and Assassination Shells" diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index c6f6218e969..0b46264cb33 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -67,7 +67,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) /datum/objective/assassinate/check_completion() if(target && target.current) - if(target.current.stat == DEAD || iszombie(target)) + if(target.current.stat == DEAD) return 1 if(issilicon(target.current) || isbrain(target.current)) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite return 1 @@ -111,7 +111,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) /datum/objective/maroon/check_completion() if(target && target.current) - if(target.current.stat == DEAD || iszombie(target)) + if(target.current.stat == DEAD) return 1 if(!target.current.ckey) return 1 @@ -168,7 +168,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) if(!target) //If it's a free objective. return 1 if(target.current) - if(target.current.stat == DEAD || iszombie(target)) + if(target.current.stat == DEAD) return 0 if(issilicon(target.current)) return 0 @@ -262,7 +262,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) return 0 if(isbrain(owner.current)) return 0 - if(!owner.current || owner.current.stat == DEAD || iszombie(owner)) + if(!owner.current || owner.current.stat == DEAD) return 0 if(SSticker.force_ending) //This one isn't their fault, so lets just assume good faith return 1 @@ -317,7 +317,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) explanation_text = "Die a glorious death." /datum/objective/die/check_completion() - if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current) || iszombie(owner)) + if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current)) return 1 if(issilicon(owner.current) && owner.current != owner.original) return 1 diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index f965907c5ba..6cf011bc2c3 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -121,19 +121,6 @@ desc = "A sleek, sturdy box" icon_state = "box_of_doom" -/obj/item/storage/box/syndie_kit/romerol - name = "Romerol Kit" - desc = "A box containing a deadly virus capable of reanimating dead as zombies." - max_w_class = WEIGHT_CLASS_NORMAL - can_hold = list(/obj/item/reagent_containers/glass/bottle/romerol,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/dropper) - -/obj/item/storage/box/syndie_kit/romerol/New() - ..() - new /obj/item/reagent_containers/glass/bottle/romerol(src) - new /obj/item/reagent_containers/syringe(src) - new /obj/item/reagent_containers/dropper(src) - return - /obj/item/storage/box/syndie_kit/space name = "Boxed Space Suit and Helmet" can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red, /obj/item/tank/emergency_oxygen/syndi, /obj/item/clothing/mask/gas/syndicate) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 92d936227cc..a46268daf50 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -767,17 +767,6 @@ desc = "Bark bark bark." key = "vu" -/datum/language/zombie - name = "Zombie" - desc = "BRAAAAAAINS!" - speech_verb = "moans" - whisper_verb = "mutters" - exclaim_verb = "wails" - colour = "zombie" - key = "zom" - flags = RESTRICTED - syllables = list("BRAAAAAAAAAAAAAAAAINS", "BRAAINS", "BRAINS") - /mob/proc/grant_all_babel_languages() for(var/la in GLOB.all_languages) var/datum/language/new_language = GLOB.all_languages[la] diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 2114299f939..f65cefff49d 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -53,7 +53,6 @@ var/stun_mod = 1 // If a species is more/less impacated by stuns/weakens/paralysis var/speed_mod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster var/blood_damage_type = OXY //What type of damage does this species take if it's low on blood? - var/obj/item/mutanthands var/total_health = 100 var/punchdamagelow = 0 //lowest possible punch damage var/punchdamagehigh = 9 //highest possible punch damage diff --git a/code/modules/mob/living/carbon/human/species/zombies.dm b/code/modules/mob/living/carbon/human/species/zombies.dm deleted file mode 100644 index 1f1c4d979b7..00000000000 --- a/code/modules/mob/living/carbon/human/species/zombies.dm +++ /dev/null @@ -1,102 +0,0 @@ -#define REGENERATION_DELAY 60 // After taking damage, how long it takes for automatic regeneration to begin - -/datum/species/zombie - // 1spooky - name = "High-Functioning Zombie" - name_plural = "High-Functioning Zombies" - icobase = 'icons/mob/human_races/r_zombie.dmi' - deform = 'icons/mob/human_races/r_def_zombie.dmi' - dies_at_threshold = TRUE - language = "Zombie" - species_traits = list(NO_BLOOD, NOZOMBIE, NOTRANSSTING, NO_BREATHE, RADIMMUNE, NO_SCAN) - var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg') - warning_low_pressure = -1 - hazard_low_pressure = -1 - hazard_high_pressure = 999999999 - warning_high_pressure = 999999999 - cold_level_1 = -1 - cold_level_2 = -1 - cold_level_3 = -1 - tox_mod = 0 - flesh_color = "#00FF00" // for green examine text - bodyflags = HAS_SKIN_COLOR - dietflags = DIET_CARN - has_organ = list( - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, - "liver" = /obj/item/organ/internal/liver, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, - "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes, - "ears" = /obj/item/organ/internal/ears) - - -/datum/species/zombie/infectious - name = "Infectious Zombie" - mutanthands = /obj/item/zombie_hand - icobase = 'icons/mob/human_races/r_zombie.dmi' - deform = 'icons/mob/human_races/r_def_zombie.dmi' - brute_mod = 0.8 // 120 damage to KO a zombie, which kills it - burn_mod = 0.8 - clone_mod = 0.8 - brain_mod = 0.8 - stamina_mod = 0.8 - speed_mod = 1.6 - default_language = "Zombie" - var/heal_rate = 1 - var/regen_cooldown = 0 - -/datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H, amount) - . = min(20, amount) - -/datum/species/zombie/infectious/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, sharp = 0, obj/used_weapon = null) - . = ..() - if(damage) - regen_cooldown = world.time + REGENERATION_DELAY - -/datum/species/zombie/infectious/handle_life(mob/living/carbon/human/H) - . = ..() - H.a_intent = INTENT_HARM // THE SUFFERING MUST FLOW - - //Zombies never actually die, they just fall down until they regenerate enough to rise back up. - //They must be restrained, beheaded or gibbed to stop being a threat. - if(regen_cooldown < world.time) - var/heal_amt = heal_rate - if(H.InCritical()) - heal_amt *= 2 - H.heal_overall_damage(heal_amt,heal_amt) - H.adjustToxLoss(-heal_amt) - if(!H.InCritical() && prob(4)) - playsound(H, pick(spooks), 50, TRUE, 10) - -//Congrats you somehow died so hard you stopped being a zombie -/datum/species/zombie/infectious/handle_death(gibbed, mob/living/carbon/C) - . = ..() - var/obj/item/organ/internal/zombie_infection/infection - infection = C.get_organ_slot("zombie_infection") - if(infection) - qdel(infection) - -/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) - . = ..() - // Deal with the source of this zombie corruption - // Infection organ needs to be handled separately from mutant_organs - // because it persists through species transitions - if(mutanthands) - H.drop_l_hand() - H.drop_r_hand() - H.put_in_hands(new mutanthands()) - H.put_in_hands(new mutanthands()) - var/obj/item/organ/internal/zombie_infection/infection - infection = H.get_organ_slot("zombie_infection") - if(!infection) - infection = new() - infection.insert(H) - -/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/human/C, datum/species/old_species) - QDEL_NULL(C.r_hand) - QDEL_NULL(C.l_hand) - return ..() - -#undef REGENERATION_DELAY diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index e8ce4027b4e..346583205e5 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -82,14 +82,14 @@ /obj/structure/spawner/nether/examine(mob/user) . = ..() - if(isskeleton(user) || iszombie(user)) + if(isskeleton(user)) . += "A direct link to another dimension full of creatures very happy to see you. You can see your house from here!" else . += "A direct link to another dimension full of creatures not very happy to see you. Entering the link would be a very bad idea." /obj/structure/spawner/nether/attack_hand(mob/user) . = ..() - if(isskeleton(user) || iszombie(user)) + if(isskeleton(user)) to_chat(user, "You don't feel like going home yet...") else user.visible_message("[user] is violently pulled into the link!", \ diff --git a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm index 476861861a3..d4834eccc80 100644 --- a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm @@ -48,7 +48,7 @@ var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations // Restrict some styles to specific species - var/list/species_allowed = list("Human", "Slime People", "Infectious Zombie", "High-Functioning Zombie") + var/list/species_allowed = list("Human", "Slime People") var/list/sprite_sheets = list() //For accessories common across species but need to use 'fitted' sprites (like underwear). e.g. list("Vox" = 'icons/mob/species/vox/iconfile.dmi') var/list/models_allowed = list() //Specifies which, if any, hairstyles or markings can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm. var/list/heads_allowed = null //Specifies which, if any, alt heads a head marking, hairstyle or facial hair style is compatible with. diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index dec256ac455..c6ff39aaead 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -226,37 +226,6 @@ if(B && islist(B.data) && !data) data = B.data.Copy() -/datum/reagent/romerol - name = "romerol" - // the REAL zombie powder - id = "romerol" - description = "Romerol is a highly experimental bioterror agent \ - which causes dormant nodules to be etched into the grey matter of \ - the subject. These nodules only become active upon death of the \ - host, upon which, the secondary structures activate and take control \ - of the host body." - color = "#123524" // RGB (18, 53, 36) - metabolization_rate = INFINITY - can_synth = FALSE - taste_description = "CAAAARL" - -/datum/reagent/romerol/reaction_mob(mob/living/carbon/human/H, method = REAGENT_TOUCH, volume) - if(!istype(H)) - return - // Silently add the zombie infection organ to be activated upon death - if(!H.get_organ_slot("zombie_infection")) - var/obj/item/organ/internal/zombie_infection/nodamage/ZI = new() - ZI.insert(H) - ..() - -/datum/reagent/romerol/on_mob_life(mob/living/M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.get_organ_slot("zombie_infection")) - var/obj/item/organ/internal/zombie_infection/nodamage/ZI = new() - ZI.insert(H) - return ..() - /datum/reagent/uranium name ="Uranium" id = "uranium" diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 61552eae789..6c836988e8b 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -12,11 +12,6 @@ container_type = OPENCONTAINER volume = 30 -/obj/item/reagent_containers/glass/bottle/romerol - name = "romerol bottle" - desc = "A small bottle of Romerol. The REAL zombie powder." - list_reagents = list("romerol" = 30) - /obj/item/reagent_containers/glass/bottle/on_reagent_change() update_icon() diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index f82598b1e14..de08d5cdf82 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -178,8 +178,6 @@ continue if(player.stat == DEAD) // Corpses continue - if(iszombie(player)) // Walking corpses - continue if(issilicon(player)) //Borgs are technically dead anyways continue if(isanimal(player)) //Poly does not own the shuttle diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm deleted file mode 100644 index 0f0f85b088b..00000000000 --- a/code/modules/zombie/items.dm +++ /dev/null @@ -1,69 +0,0 @@ -/obj/item/zombie_hand - name = "zombie claw" - desc = "A zombie's claw is its primary tool, capable of infecting \ - unconscious or dead humans, butchering all other living things to \ - sustain the zombie, forcing open airlock doors and opening \ - child-safe caps on bottles." - flags = NODROP|ABSTRACT|DROPDEL - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - icon = 'icons/effects/blood.dmi' - icon_state = "bloodhand_left" - var/icon_left = "bloodhand_left" - var/icon_right = "bloodhand_right" - hitsound = 'sound/hallucinations/growl1.ogg' - force = 21 // Just enough to break airlocks with melee attacks - damtype = "brute" - -/obj/item/zombie_hand/equipped(mob/user, slot) - . = ..() - switch(slot) - // Yes, these intentionally don't match - if(slot_l_hand) - icon_state = icon_right - if(slot_r_hand) - icon_state = icon_left - -/obj/item/zombie_hand/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(!proximity_flag) - return - - else if(isliving(target)) - if(ishuman(target)) - try_to_zombie_infect(target) - else - check_feast(target, user) - -/proc/try_to_zombie_infect(mob/living/carbon/human/target) - CHECK_DNA_AND_SPECIES(target) - - if(NOZOMBIE in target.dna.species.species_traits) - // cannot infect any NOZOMBIE subspecies (such as high functioning - // zombies) - return - - var/obj/item/organ/internal/zombie_infection/infection - infection = target.get_organ_slot("zombie_infection") - if(!infection) - infection = new() - infection.insert(target) - -/obj/item/zombie_hand/proc/check_feast(mob/living/target, mob/living/user) - if(target.stat == DEAD) - var/hp_gained = target.maxHealth - target.gib() - user.adjustBruteLoss(-hp_gained, FALSE) - user.adjustToxLoss(-hp_gained, FALSE) - user.adjustFireLoss(-hp_gained, FALSE) - user.adjustCloneLoss(-hp_gained, FALSE) - user.adjustBrainLoss(-hp_gained, FALSE) // Zom Bee gibbers "BRAAAAISNSs!1!" - user.updatehealth() - -/obj/item/zombie_hand/suicide_act(mob/living/carbon/human/user) - user.visible_message("[user] is ripping [user.p_their()] brains out! It looks like [user.p_theyre()] trying to commit suicide!") - if(ishuman(user)) - var/mob/living/carbon/human/L = user - var/obj/item/organ/external/O = L.get_organ("head") - if(O) - O.droplimb() - return (BRUTELOSS) diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm deleted file mode 100644 index 6ea40c90e96..00000000000 --- a/code/modules/zombie/organs.dm +++ /dev/null @@ -1,99 +0,0 @@ -/obj/item/organ/internal/zombie_infection - name = "festering ooze" - desc = "A black web of pus and viscera." - parent_organ = "head" - slot = "zombie_infection" - icon_state = "blacktumor" - var/causes_damage = TRUE - var/datum/species/old_species = /datum/species/human - var/living_transformation_time = 30 - var/converts_living = FALSE - - var/revive_time_min = 450 - var/revive_time_max = 700 - var/timer_id - -/obj/item/organ/internal/zombie_infection/New(mob/living/carbon/holder) - ..() - GLOB.zombie_infection_list += src - -/obj/item/organ/internal/zombie_infection/Destroy() - GLOB.zombie_infection_list -= src - . = ..() - -/obj/item/organ/internal/zombie_infection/insert(mob/living/carbon/human/M, special = 0) - ..() - START_PROCESSING(SSobj, src) - -/obj/item/organ/internal/zombie_infection/remove(mob/living/carbon/human/M, special = 0) - STOP_PROCESSING(SSobj, src) - if(iszombie(M) && old_species) - M.set_species(old_species, retain_damage = TRUE) - if(timer_id) - deltimer(timer_id) - . = ..() - -/obj/item/organ/internal/zombie_infection/on_find(mob/living/finder) - to_chat(finder, "Inside the head is a disgusting black \ - web of pus and viscera, bound tightly around the brain like some \ - biological harness.") - -/obj/item/organ/internal/zombie_infection/process() - if(!owner) - return - if(!(src in owner.internal_organs)) - remove(owner) - if(causes_damage && !iszombie(owner) && owner.stat != DEAD) - owner.adjustToxLoss(1) - if (prob(10)) - to_chat(owner, "You feel sick...") - if(timer_id) - return - if(owner.suiciding) - return - if(owner.stat != DEAD && !converts_living) - return - if(!owner.get_int_organ(/obj/item/organ/internal/brain)) - return - if(!iszombie(owner)) - to_chat(owner, "You can feel your heart stopping, but something isn't right... \ - life has not abandoned your broken form. You can only feel a deep and immutable hunger that \ - not even death can stop, you will rise again!") - var/revive_time = rand(revive_time_min, revive_time_max) - var/flags = TIMER_STOPPABLE - timer_id = addtimer(CALLBACK(src, .proc/zombify), revive_time, flags) - -/obj/item/organ/internal/zombie_infection/proc/zombify() - timer_id = null - - if(!converts_living && owner.stat != DEAD) - return - - if(!iszombie(owner)) - old_species = owner.dna.species.type - owner.set_species(/datum/species/zombie/infectious) - for(var/datum/disease/critical/crit in owner.viruses) // cure any new crit viruses - crit.cure(0) - - var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS) - //Fully heal the zombie's damage the first time they rise - owner.setToxLoss(0) - owner.setOxyLoss(0) - owner.setBrainLoss(0) - owner.setCloneLoss(0) - owner.SetLoseBreath(0) - owner.heal_overall_damage(INFINITY, INFINITY, TRUE, TRUE, FALSE) - owner.setStaminaLoss(0) - - if(!owner.update_revive()) - return - - owner.grab_ghost() - owner.visible_message("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!", "You HUNGER!") - playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, TRUE) - owner.do_jitter_animation(living_transformation_time) - owner.Stun(living_transformation_time * 0.05) - to_chat(owner, "You are now a zombie! Do not seek to be cured, do not help any non-zombies in any way, do not harm your zombie brethren and spread the disease by killing others. You are a creature of hunger and violence.") - -/obj/item/organ/internal/zombie_infection/nodamage - causes_damage = FALSE diff --git a/icons/mob/human_races/r_def_zombie.dmi b/icons/mob/human_races/r_def_zombie.dmi deleted file mode 100644 index 007eb3f31f3ab8651f9294fe6c3339ac10682af7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2032 zcmX|Bdpy(s8vkz0hM$9wB<1qUh|t9?GItv`tYK-*Etf?usaV!FYUX}Tix%nRnno0U zQdZ*SL@DXwvWYO|pr&%0?QqVo^ZfHX@6Yr4JkR^{yr0)6!yDtKAh%Nv000FP(isZ? zpv@2jz@#=^R6QQI>GHijaV}ggHzL#9_llL%Wi8u84Fbd2CUp<#f>dY>;N}I8&I1vt zT9_*)AplSW06qo)nN0Tg_qW{*SldBeJ>|{Jfv^m;ud+UYX-`aZKEZGxraL<`w1`X> zQnrsD!y3;x8pK3~rh5?6T#qvl!Az7>sum&L-j`t&vUTXa1#l`?Y5<92xkzAMAA1)E=MxITqC+|)6 z>YR$CKHVX@gOP3;9qep)YkV^E;g@G`)SyF|QHboK*%&?APEXMGcx3^vtl9tdFe~oJ z*%@@4U93)6FYKK-Lt19{JlMx^&Bp~@rql0k%U*}{N_$QaDsR;||GXwHSn#zf zJgke>8$7Iw>e8&NtPK8X!BpCQ&>wLFq@uKDu@D<*v{t(=9*2@|x22eVY+3>U8E=%c z11^a@e=|P$hJ{j3fwb)Q?!6@BwJOrwz4`Wsean(0o8Z_>Ewh-QMr-rM0WUG~4vd$T zuawBn0&l+lZ=?H~z0cvy)n|wwKX5&LhyAg#c``c8&A+PM#|Z`07G%}lJOby`>1P8~ zXGz_`S9gI->>9;+R{gm>Xj1WA!mGJb73gaO?1RS5lDfhl@%lqn8FUYOp2zY_)OKuz ztsPqBfOo4GiTyjN{3_eo2cRwL=H=y*J3SecUvOBB1QGM=!u!2G- z&wBfXQ#8M}v0sxzO+slVXI_DaR7Cq<4c$k;376aB!w)&o(L;lS;i8V0=p*FsBPDrs zmI-${+;RS8*bsKyljN*^WA;H0RuE;l)r0OhHVeq=U@*DLSS{VD{u&rZ3D&b!b=V(vEku#Rp%RA{k z4Tn>qkSTF>zlWa^{|P#ob2jM`!d$9;AGhrbY39#sE6aa@`}+dTdRqP}S}}ycn(1ug zYIYI#ld;hX0hDdbHBhwb+vc%?63|P)*%pgQT0i*GYDHy&-o$6agC=iRv(^5uGys?u zA~?vhTQS}eaR3ETy;kOGCQuB#`H_Jsu@wr=~S z40xI8cRCzIA`#KlRG(FaG-;W-POOpajnp6<^>PJ<4+g&7CMSIE7HW>CPv@|zW#_Fu z`RS<0%-fbt;3uT#GSA#^lS?`dxZ=3Hoq9P1Rm+nB*2ecU)ov{%xb3mS{$Rb9Bojdq zmp2kSfW+b$(7rdoWI+`z*_=k7{C3mI4d}63=Dv5U&HOiS*tt#Ax8u0kAfANwo1+ zD9JiwDa`eU4hWaM`X!3LM@y&BX}iVb6~RO~lU8QR+yW()qRk&;(>^hRne$fVH9D%L zmCt_SLR{9J?yDK8G8#+v@{c~D*|x+A9CEws>d(LTb7VYUmhVWGAb0T|C1@{RwX+h~ zv1{SK+W>&zsd`AhU!ZCRtFkgrzsO z*Yh0HbDCXoz2-TSD_3+*1awbh<)?q<%F#A*@+ReUFoh`-@^F92piiz6B0+mCh6Hn{ ze+kzqY^eWA%y!h&O+VE+3dN@+Ss78Z8OP#qs7< z1-~$>GPM#~z9Zo~k&fO^1eZeMpr9)#zR2+TL;>IclH}NMElWYYVm4$&{2?(|LvOSu zgV-)D>JcV9|9YpR)9bRmS2WogrcD69ADRU4!-(=-Ag`|P<#?&S2@7|k%$$3>0{#PH zQHER|(YV?wild-_)s+c9AJw3f5(>ISBVu@icycjs!1bT-yv5WFM@iQCjivKPDS432 ziTN%Yw~C$eC&81{5At_wz%%gE-zoLtUb*3-i@W2>h`&|omHVIWe=k79X)Z!hVk=tu zHqeEjVI`s$2Hyr6vScKpx|+>Eb}L~D{C78m6R|ue8!CrWWW7}k<$`hMI0mKu2Mi9T AbpQYW diff --git a/icons/mob/human_races/r_zombie.dmi b/icons/mob/human_races/r_zombie.dmi deleted file mode 100644 index 007eb3f31f3ab8651f9294fe6c3339ac10682af7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2032 zcmX|Bdpy(s8vkz0hM$9wB<1qUh|t9?GItv`tYK-*Etf?usaV!FYUX}Tix%nRnno0U zQdZ*SL@DXwvWYO|pr&%0?QqVo^ZfHX@6Yr4JkR^{yr0)6!yDtKAh%Nv000FP(isZ? zpv@2jz@#=^R6QQI>GHijaV}ggHzL#9_llL%Wi8u84Fbd2CUp<#f>dY>;N}I8&I1vt zT9_*)AplSW06qo)nN0Tg_qW{*SldBeJ>|{Jfv^m;ud+UYX-`aZKEZGxraL<`w1`X> zQnrsD!y3;x8pK3~rh5?6T#qvl!Az7>sum&L-j`t&vUTXa1#l`?Y5<92xkzAMAA1)E=MxITqC+|)6 z>YR$CKHVX@gOP3;9qep)YkV^E;g@G`)SyF|QHboK*%&?APEXMGcx3^vtl9tdFe~oJ z*%@@4U93)6FYKK-Lt19{JlMx^&Bp~@rql0k%U*}{N_$QaDsR;||GXwHSn#zf zJgke>8$7Iw>e8&NtPK8X!BpCQ&>wLFq@uKDu@D<*v{t(=9*2@|x22eVY+3>U8E=%c z11^a@e=|P$hJ{j3fwb)Q?!6@BwJOrwz4`Wsean(0o8Z_>Ewh-QMr-rM0WUG~4vd$T zuawBn0&l+lZ=?H~z0cvy)n|wwKX5&LhyAg#c``c8&A+PM#|Z`07G%}lJOby`>1P8~ zXGz_`S9gI->>9;+R{gm>Xj1WA!mGJb73gaO?1RS5lDfhl@%lqn8FUYOp2zY_)OKuz ztsPqBfOo4GiTyjN{3_eo2cRwL=H=y*J3SecUvOBB1QGM=!u!2G- z&wBfXQ#8M}v0sxzO+slVXI_DaR7Cq<4c$k;376aB!w)&o(L;lS;i8V0=p*FsBPDrs zmI-${+;RS8*bsKyljN*^WA;H0RuE;l)r0OhHVeq=U@*DLSS{VD{u&rZ3D&b!b=V(vEku#Rp%RA{k z4Tn>qkSTF>zlWa^{|P#ob2jM`!d$9;AGhrbY39#sE6aa@`}+dTdRqP}S}}ycn(1ug zYIYI#ld;hX0hDdbHBhwb+vc%?63|P)*%pgQT0i*GYDHy&-o$6agC=iRv(^5uGys?u zA~?vhTQS}eaR3ETy;kOGCQuB#`H_Jsu@wr=~S z40xI8cRCzIA`#KlRG(FaG-;W-POOpajnp6<^>PJ<4+g&7CMSIE7HW>CPv@|zW#_Fu z`RS<0%-fbt;3uT#GSA#^lS?`dxZ=3Hoq9P1Rm+nB*2ecU)ov{%xb3mS{$Rb9Bojdq zmp2kSfW+b$(7rdoWI+`z*_=k7{C3mI4d}63=Dv5U&HOiS*tt#Ax8u0kAfANwo1+ zD9JiwDa`eU4hWaM`X!3LM@y&BX}iVb6~RO~lU8QR+yW()qRk&;(>^hRne$fVH9D%L zmCt_SLR{9J?yDK8G8#+v@{c~D*|x+A9CEws>d(LTb7VYUmhVWGAb0T|C1@{RwX+h~ zv1{SK+W>&zsd`AhU!ZCRtFkgrzsO z*Yh0HbDCXoz2-TSD_3+*1awbh<)?q<%F#A*@+ReUFoh`-@^F92piiz6B0+mCh6Hn{ ze+kzqY^eWA%y!h&O+VE+3dN@+Ss78Z8OP#qs7< z1-~$>GPM#~z9Zo~k&fO^1eZeMpr9)#zR2+TL;>IclH}NMElWYYVm4$&{2?(|LvOSu zgV-)D>JcV9|9YpR)9bRmS2WogrcD69ADRU4!-(=-Ag`|P<#?&S2@7|k%$$3>0{#PH zQHER|(YV?wild-_)s+c9AJw3f5(>ISBVu@icycjs!1bT-yv5WFM@iQCjivKPDS432 ziTN%Yw~C$eC&81{5At_wz%%gE-zoLtUb*3-i@W2>h`&|omHVIWe=k79X)Z!hVk=tu zHqeEjVI`s$2Hyr6vScKpx|+>Eb}L~D{C78m6R|ue8!CrWWW7}k<$`hMI0mKu2Mi9T AbpQYW diff --git a/paradise.dme b/paradise.dme index b687e6c9db2..21029f96bfc 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1850,7 +1850,6 @@ #include "code\modules\mob\living\carbon\human\species\vox.dm" #include "code\modules\mob\living\carbon\human\species\vulpkanin.dm" #include "code\modules\mob\living\carbon\human\species\wryn.dm" -#include "code\modules\mob\living\carbon\human\species\zombies.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\emote.dm" #include "code\modules\mob\living\silicon\laws.dm" @@ -2503,8 +2502,6 @@ #include "code\modules\vehicle\speedbike.dm" #include "code\modules\vehicle\sportscar.dm" #include "code\modules\vehicle\vehicle.dm" -#include "code\modules\zombie\items.dm" -#include "code\modules\zombie\organs.dm" #include "goon\code\datums\browserOutput.dm" #include "interface\interface.dm" #include "interface\skin.dmf" From 846b4796862fc03052f37f60268c1b18e0bbe948 Mon Sep 17 00:00:00 2001 From: denghis1 <63977635+denghis1@users.noreply.github.com> Date: Thu, 2 Jul 2020 22:48:52 +0200 Subject: [PATCH 23/37] bugfix, scopes lawyers_badge/attack_self properly Scopes the attack_self of the lawyers_badge to that accessory, instead of setting it on every single accessory, thus preventing everyone from being able to pretend that they are an attorney --- code/modules/clothing/under/accessories/accessory.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 63fd1fa26b5..76bcd87921d 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -330,7 +330,7 @@ item_color = "lawyerbadge" var/cached_bubble_icon = null -/obj/item/clothing/accessory/attack_self(mob/user) +/obj/item/clothing/accessory/lawyers_badge/attack_self(mob/user) if(prob(1)) user.say("The testimony contradicts the evidence!") user.visible_message("[user] shows [user.p_their()] attorney's badge.", "You show your attorney's badge.") From e2bd9164259bc552d265325738a97b111e5845b4 Mon Sep 17 00:00:00 2001 From: Deelite34 Date: Thu, 2 Jul 2020 23:09:40 +0200 Subject: [PATCH 24/37] Fix typos Fixes typos in baseball cap and searching for items under seat in space pod. --- code/modules/clothing/head/soft_caps.dm | 2 +- code/modules/spacepods/spacepod.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index d34584ff425..7ac87e5d5bc 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -113,7 +113,7 @@ /obj/item/clothing/head/soft/sec/corp name = "corporate security cap" - desc = "It's baseball hat in corpotate colours." + desc = "It's a baseball hat in corporate colours." icon_state = "corpsoft" item_color = "corp" diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index 2e3c89017ef..56e7f8f96ba 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -973,7 +973,7 @@ var/obj/I = pick(true_contents) if(user.put_in_any_hand_if_possible(I)) src.contents -= I - to_chat(user, "You find a [I] [pick("under the seat", "under the console", "in the mainenance access")]!") + to_chat(user, "You find a [I] [pick("under the seat", "under the console", "in the maintenance access")]!") else to_chat(user, "You think you saw something shiny, but you can't reach it!") else From 29045e16dc4f4798b84c08656510037292274188 Mon Sep 17 00:00:00 2001 From: denghis1 <63977635+denghis1@users.noreply.github.com> Date: Fri, 3 Jul 2020 11:09:56 +0200 Subject: [PATCH 25/37] closet attack_ai check for user.loc /obj/machinery/atmospherics Checks if the user.loc type is part of/obj/machinery/atmospherics machines (pipes, vents etc) this prevents a ventcrawling maintenance drone from opening lockers. --- code/game/objects/structures/crates_lockers/closets.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 553cfda4d59..04373502832 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -230,7 +230,7 @@ add_fingerprint(user) /obj/structure/closet/attack_ai(mob/user) - if(isrobot(user) && Adjacent(user)) //Robots can open/close it, but not the AI + if(isrobot(user) && Adjacent(user) && !istype(user.loc, /obj/machinery/atmospherics)) //Robots can open/close it, but not the AI attack_hand(user) /obj/structure/closet/relaymove(mob/user) From 8dda2766c6a51eaec55de3ec549c84734d862c7b Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 3 Jul 2020 20:57:37 +0200 Subject: [PATCH 26/37] fixes show_borg_info and select_active_ai_with_fewest_borgs --- code/__HELPERS/unsorted.dm | 5 +++-- code/modules/mob/living/silicon/ai/ai.dm | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a022851e45f..63d9f7c85ef 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -329,8 +329,9 @@ Turf and target are seperate in case you want to teleport some distance from a t /proc/select_active_ai_with_fewest_borgs() var/mob/living/silicon/ai/selected var/list/active = active_ais() - for(var/mob/living/silicon/ai/A in active) - if(!selected || (selected.connected_robots > A.connected_robots)) + for(var/thing in active) + var/mob/living/silicon/ai/A = thing + if(!selected || (length(selected.connected_robots) > length(A.connected_robots))) selected = A return selected diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 85c4ceac427..1c232f9f43c 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -243,7 +243,8 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( /mob/living/silicon/ai/proc/show_borg_info() stat(null, text("Connected cyborgs: [connected_robots.len]")) - for(var/mob/living/silicon/robot/R in connected_robots) + for(var/thing in connected_robots) + var/mob/living/silicon/robot/R = thing var/robot_status = "Nominal" if(R.stat || !R.client) robot_status = "OFFLINE" @@ -251,8 +252,9 @@ GLOBAL_LIST_INIT(ai_verbs_default, list( robot_status = "DEPOWERED" // Name, Health, Battery, Module, Area, and Status! Everything an AI wants to know about its borgies! var/area/A = get_area(R) + var/area_name = A ? sanitize(A.name) : "Unknown" stat(null, text("[R.name] | S.Integrity: [R.health]% | Cell: [R.cell ? "[R.cell.charge] / [R.cell.maxcharge]" : "Empty"] | \ - Module: [R.designation] | Loc: [sanitize(A.name)] | Status: [robot_status]")) + Module: [R.designation] | Loc: [area_name] | Status: [robot_status]")) /mob/living/silicon/ai/rename_character(oldname, newname) if(!..(oldname, newname)) From ae778d3810dd02a034409a9e9fdd76a8d511d64e Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 3 Jul 2020 22:25:43 +0200 Subject: [PATCH 27/37] Makes blobs not add new_players to the HUD list --- code/game/gamemodes/blob/blob.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index a11e5d922ba..641167c768c 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -46,7 +46,6 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/datum/mind/blob = pick(possible_blobs) infected_crew += blob blob.special_role = SPECIAL_ROLE_BLOB - update_blob_icons_added(blob) blob.restricted_roles = restricted_jobs log_game("[key_name(blob)] has been selected as a Blob") possible_blobs -= blob @@ -152,6 +151,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) for(var/datum/mind/blob in infected_crew) greet_blob(blob) + update_blob_icons_added(blob) if(SSshuttle) SSshuttle.emergencyNoEscape = 1 From dbdd1f098778174c9b4986e211a9f817b5e8ee6a Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sat, 4 Jul 2020 21:23:38 +0100 Subject: [PATCH 28/37] Allows clients to reload their UI assets --- code/datums/datumvars.dm | 16 ----------- code/modules/admin/verbs/debug.dm | 15 ---------- code/modules/admin/verbs/toggledebugverbs.dm | 1 - code/modules/client/client defines.dm | 3 ++ code/modules/client/client procs.dm | 30 ++++++++++++++++++++ code/modules/mob/mob.dm | 2 -- 6 files changed, 33 insertions(+), 34 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index e8d0b881ccb..4076a8e891e 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1232,22 +1232,6 @@ log_admin("[key_name(usr)] has removed the organ [rem_organ] from [key_name(M)]") qdel(rem_organ) - else if(href_list["fix_nano"]) - if(!check_rights(R_DEBUG)) return - - var/mob/H = locateUID(href_list["fix_nano"]) - - if(!istype(H) || !H.client) - to_chat(usr, "This can only be done on mobs with clients") - return - - H.client.reload_nanoui_resources() - - to_chat(usr, "Resource files sent") - to_chat(H, "Your NanoUI Resource files have been refreshed") - - log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)]") - else if(href_list["regenerateicons"]) if(!check_rights(0)) return diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 329efb8e067..f2e0171317e 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -816,21 +816,6 @@ GLOBAL_PROTECT(AdminProcCaller) else alert("Invalid mob") -/client/proc/reload_nanoui_resources() - set category = "Debug" - set name = "Reload NanoUI Resources" - set desc = "Force the client to redownload NanoUI Resources" - - // Close open NanoUIs. - SSnanoui.close_user_uis(usr) - - // Re-load the assets. - var/datum/asset/assets = get_asset_datum(/datum/asset/nanoui) - assets.register() - - // Clear the user's cache so they get resent. - usr.client.cache = list() - /client/proc/view_runtimes() set category = "Debug" set name = "View Runtimes" diff --git a/code/modules/admin/verbs/toggledebugverbs.dm b/code/modules/admin/verbs/toggledebugverbs.dm index 216f5c3e4b0..328b5176e9a 100644 --- a/code/modules/admin/verbs/toggledebugverbs.dm +++ b/code/modules/admin/verbs/toggledebugverbs.dm @@ -18,7 +18,6 @@ GLOBAL_LIST_INIT(admin_verbs_show_debug_verbs, list( /client/proc/print_jobban_old_filter, /client/proc/forceEvent, /client/proc/nanomapgen_DumpImage, - /client/proc/reload_nanoui_resources, /client/proc/admin_redo_space_transitions, /client/proc/make_turf_space_map, /client/proc/vv_by_ref diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 3cd6458afdf..5cd4bf25f8a 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -92,3 +92,6 @@ var/next_keysend_reset = 0 var/next_keysend_trip_reset = 0 var/keysend_tripped = FALSE + + // Last world.time that the player tried to request their resources. + var/last_ui_resource_send = 0 diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 561b0b48149..8a119bb97ce 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -906,3 +906,33 @@ return TRUE #undef SSD_WARNING_TIMER + +/client/verb/resend_ui_resources() + set name = "Reload UI Resources" + set desc = "Reload your UI assets if they are not working" + set category = "Special Verbs" + + var/choice = alert(usr, "This will reload your NanoUI and TGUI resources. If you have any open UIs this may break them. Are you sure?", "Resource Reloading", "Yes", "No") + if(choice == "Yes") + // 600 deciseconds = 1 minute + if((last_ui_resource_send) < world.time) + last_ui_resource_send = world.time + 600 + + // Close their open UIs + SSnanoui.close_user_uis(usr) + SStgui.close_user_uis(usr) + + // Resend the resources + var/datum/asset/nano_assets = get_asset_datum(/datum/asset/nanoui) + nano_assets.register() + + var/datum/asset/tgui_assets = get_asset_datum(/datum/asset/simple/tgui) + tgui_assets.register() + + // Clear the user's cache so they get resent. + // This is not fully clearing their BYOND cache, just their assets sent from the server this round + cache = list() + + to_chat(usr, "UI resource files resent successfully") + else + to_chat(usr, "You requested your UI resource files too quickly. Please try again in [(last_ui_resource_send - world.time)/10] seconds.") diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d6a86d3e3cd..d060c70e8d8 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1297,8 +1297,6 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ .["Add Organ"] = "?_src_=vars;addorgan=[UID()]" .["Remove Organ"] = "?_src_=vars;remorgan=[UID()]" - .["Fix NanoUI"] = "?_src_=vars;fix_nano=[UID()]" - .["Add Verb"] = "?_src_=vars;addverb=[UID()]" .["Remove Verb"] = "?_src_=vars;remverb=[UID()]" From f8c74b95f98c7f8e14b7f59fcdec23ffa0c4db82 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sat, 4 Jul 2020 21:37:29 +0100 Subject: [PATCH 29/37] Mochi Tweaks --- code/modules/client/client procs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 8a119bb97ce..603d1fae61f 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -915,8 +915,8 @@ var/choice = alert(usr, "This will reload your NanoUI and TGUI resources. If you have any open UIs this may break them. Are you sure?", "Resource Reloading", "Yes", "No") if(choice == "Yes") // 600 deciseconds = 1 minute - if((last_ui_resource_send) < world.time) - last_ui_resource_send = world.time + 600 + if(last_ui_resource_send < world.time) + last_ui_resource_send = world.time + 60 SECONDS // Close their open UIs SSnanoui.close_user_uis(usr) From e3793a14ee8e653360e31148d29c0089fd9f4223 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sun, 5 Jul 2020 01:21:09 -0400 Subject: [PATCH 30/37] Further New Player GC Fixes --- code/datums/mind.dm | 3 +++ code/modules/mob/new_player/new_player.dm | 1 + 2 files changed, 4 insertions(+) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index dadc8bc6e31..54635f01b0a 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -89,6 +89,9 @@ if(antag_datum.delete_on_mind_deletion) qdel(i) antag_datums = null + current = null + original = null + soulOwner = null return ..() /datum/mind/proc/transfer_to(mob/living/new_character) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 9107d7d09ae..f53daba6626 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -210,6 +210,7 @@ if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. observer.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! observer.key = key + QDEL_NULL(mind) GLOB.respawnable_list += observer qdel(src) return 1 From 1283bc9022a367877ae4a4e702ec2814dbd039b0 Mon Sep 17 00:00:00 2001 From: AffectedArc07 Date: Sun, 5 Jul 2020 08:35:45 +0100 Subject: [PATCH 31/37] Message Tweaks --- code/controllers/subsystem/tickets/tickets.dm | 20 +++++------ code/modules/client/client procs.dm | 34 ++++++++++--------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm index 058569250ec..3aa0a8846c3 100644 --- a/code/controllers/subsystem/tickets/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -20,16 +20,16 @@ SUBSYSTEM_DEF(tickets) init_order = INIT_ORDER_TICKETS wait = 300 priority = FIRE_PRIORITY_TICKETS - + flags = SS_BACKGROUND - + var/list/allTickets = list() //make it here because someone might ahelp before the system has initialized var/ticketCounter = 1 /datum/controller/subsystem/tickets/Initialize() close_messages = list("- [ticket_name] Rejected! -", - "Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.", + "Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.", "Your [ticket_name] has now been closed.") return ..() @@ -112,7 +112,7 @@ SUBSYSTEM_DEF(tickets) message_staff("[usr.client] / ([usr]) resolved [ticket_name] number [N]") to_chat_safe(returnClient(N), "Your [ticket_name] has now been resolved.") return TRUE - + /datum/controller/subsystem/tickets/proc/autoRespond(N) if(!check_rights(R_ADMIN|R_MOD)) @@ -124,19 +124,19 @@ SUBSYSTEM_DEF(tickets) if(alert(usr, "[T.ticketState == TICKET_OPEN ? "Another admin appears to already be handling this." : "This ticket is already marked as closed or resolved"] Are you sure you want to continue?", "Confirmation", "Yes", "No") != "Yes") return T.assignStaff(C) - - var/response_phrases = list("Thanks" = "Thanks, have a Paradise day!", + + var/response_phrases = list("Thanks" = "Thanks, have a Paradise day!", "Handling It" = "The issue is being looked into, thanks.", "Already Resolved" = "The problem has been resolved already.", "Mentorhelp" = "Please redirect your question to Mentorhelp, as they are better experienced with these types of questions.", "Happens Again" = "Thanks, let us know if it continues to happen.", - "Clear Cache" = "To fix a blank screen, please leave the game and clear your Byond Cache. To clear your Byond Cache, there is a Settings icon in the top right of the launcher. After you click that, go into the Games tab and hit the Clear Cache button. If the issue persists a few minutes after rejoining and doing this, please adminhelp again and state you cleared your cache." , + "Clear Cache" = "To fix a blank screen, go to the 'Special Verbs' tab and press 'Reload UI Resources'. If that fails, clear your BYOND cache (instructions provided with 'Reload UI Resources'). If that still fails, please adminhelp again, stating you have already done the following." , "IC Issue" = "This is an In Character (IC) issue and will not be handled by admins. You could speak to Security, Internal Affairs, a Departmental Head, Nanotrasen Representetive, or any other relevant authority currently on station.", "Reject" = "Reject", "Man Up" = "Man Up", "Appeal on the Forums" = "Appealing a ban must occur on the forums. Privately messaging, or adminhelping about your ban will not resolve it. To appeal your ban, please head to [config.banappeals]" ) - + var/sorted_responses = list() for(var/key in response_phrases) //build a new list based on the short descriptive keys of the master list so we can send this as the input instead of the full paragraphs to the admin choosing which autoresponse sorted_responses += key @@ -351,7 +351,7 @@ UI STUFF dat += "[T.content[i]]" dat += "

" - dat += "Re-Open[check_rights(R_ADMIN|R_MOD, 0) ? "Auto": ""]Resolve

" + dat += "Re-Open[check_rights(R_ADMIN|R_MOD, 0) ? "Auto": ""]Resolve

" if(!T.staffAssigned) dat += "No staff member assigned to this [ticket_name] - Take Ticket
" @@ -447,7 +447,7 @@ UI STUFF return if(closeTicket(indexNum)) showDetailUI(usr, indexNum) - + if(href_list["detailreopen"]) var/indexNum = text2num(href_list["detailreopen"]) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 603d1fae61f..036ca465755 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -912,27 +912,29 @@ set desc = "Reload your UI assets if they are not working" set category = "Special Verbs" + if(last_ui_resource_send > world.time) + to_chat(usr, "You requested your UI resource files too quickly. Please try again in [(last_ui_resource_send - world.time)/10] seconds.") + return + var/choice = alert(usr, "This will reload your NanoUI and TGUI resources. If you have any open UIs this may break them. Are you sure?", "Resource Reloading", "Yes", "No") if(choice == "Yes") // 600 deciseconds = 1 minute - if(last_ui_resource_send < world.time) - last_ui_resource_send = world.time + 60 SECONDS + last_ui_resource_send = world.time + 60 SECONDS - // Close their open UIs - SSnanoui.close_user_uis(usr) - SStgui.close_user_uis(usr) + // Close their open UIs + SSnanoui.close_user_uis(usr) + SStgui.close_user_uis(usr) - // Resend the resources - var/datum/asset/nano_assets = get_asset_datum(/datum/asset/nanoui) - nano_assets.register() + // Resend the resources + var/datum/asset/nano_assets = get_asset_datum(/datum/asset/nanoui) + nano_assets.register() - var/datum/asset/tgui_assets = get_asset_datum(/datum/asset/simple/tgui) - tgui_assets.register() + var/datum/asset/tgui_assets = get_asset_datum(/datum/asset/simple/tgui) + tgui_assets.register() - // Clear the user's cache so they get resent. - // This is not fully clearing their BYOND cache, just their assets sent from the server this round - cache = list() + // Clear the user's cache so they get resent. + // This is not fully clearing their BYOND cache, just their assets sent from the server this round + cache = list() + + to_chat(usr, "UI resource files resent successfully. If you are still having issues, please try manually clearing your BYOND cache. This can be achieved by opening your BYOND launcher, pressing the cog in the top right, selecting preferences, going to the Games tab, and pressing 'Clear Cache'.") - to_chat(usr, "UI resource files resent successfully") - else - to_chat(usr, "You requested your UI resource files too quickly. Please try again in [(last_ui_resource_send - world.time)/10] seconds.") From 4fd4a949aaba57e5556ec4b478a8ceab59fb4dae Mon Sep 17 00:00:00 2001 From: Gatchapod Date: Sun, 5 Jul 2020 15:06:04 +0200 Subject: [PATCH 32/37] no more nullspace tomatoes and trees --- code/modules/hydroponics/hydroponics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 5bc63d4bace..f8bb13acb14 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -978,7 +978,7 @@ /obj/machinery/hydroponics/proc/spawnplant() // why would you put strange reagent in a hydro tray you monster I bet you also feed them blood var/list/livingplants = list(/mob/living/simple_animal/hostile/tree, /mob/living/simple_animal/hostile/killertomato) var/chosen = pick(livingplants) - var/mob/living/simple_animal/hostile/C = new chosen + var/mob/living/simple_animal/hostile/C = new chosen(src.loc) C.faction = list("plants") /obj/machinery/hydroponics/proc/become_self_sufficient() // Ambrosia Gaia effect From 5cfc0e1e8509664fe07cdeeee085eaf0d13b0756 Mon Sep 17 00:00:00 2001 From: Gatchapod Date: Sun, 5 Jul 2020 20:01:06 +0200 Subject: [PATCH 33/37] this is objectively a superior way of doing it --- code/modules/hydroponics/hydroponics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index f8bb13acb14..1be8f11527d 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -978,7 +978,7 @@ /obj/machinery/hydroponics/proc/spawnplant() // why would you put strange reagent in a hydro tray you monster I bet you also feed them blood var/list/livingplants = list(/mob/living/simple_animal/hostile/tree, /mob/living/simple_animal/hostile/killertomato) var/chosen = pick(livingplants) - var/mob/living/simple_animal/hostile/C = new chosen(src.loc) + var/mob/living/simple_animal/hostile/C = new chosen(get_turf(src)) C.faction = list("plants") /obj/machinery/hydroponics/proc/become_self_sufficient() // Ambrosia Gaia effect From 4305d1daea151e860b4767960e7e52089fb0170a Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Mon, 6 Jul 2020 18:29:29 -0500 Subject: [PATCH 34/37] Fixes incorrect APC terminal orientation --- code/modules/power/apc.dm | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index f613f34a8fd..56e38d31935 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -70,7 +70,6 @@ var/locked = 1 var/coverlocked = 1 var/aidisabled = 0 - var/tdir = null var/obj/machinery/power/terminal/terminal = null var/lastused_light = 0 var/lastused_equip = 0 @@ -155,15 +154,12 @@ GLOB.apcs = sortAtom(GLOB.apcs) wires = new(src) - // offset 24 pixels in direction of dir - // this allows the APC to be embedded in a wall, yet still inside an area - if(building) - setDir(direction) // We set this to direction only for pixel location determination. - - set_pixel_offsets_from_dir(24, -24, 24, -24) // Set pixel offsets based on `dir` - setDir(SOUTH) // APC's should always appear to *face* south. if(building) + // Offset 24 pixels in direction of dir. This allows the APC to be embedded in a wall, yet still inside an area + setDir(direction) // This is only used for pixel offsets, and later terminal placement. APC dir doesn't affect its sprite since it only has one orientation. + set_pixel_offsets_from_dir(24, -24, 24, -24) + area = get_area(src) area.apc |= src opened = 1 @@ -193,8 +189,8 @@ /obj/machinery/power/apc/proc/make_terminal() // create a terminal object at the same position as original turf loc // wires will attach to this - terminal = new/obj/machinery/power/terminal(src.loc) - terminal.setDir(tdir) + terminal = new/obj/machinery/power/terminal(get_turf(src)) + terminal.setDir(dir) terminal.master = src /obj/machinery/power/apc/Initialize(mapload) From 38c9c508e6e89b4e38bf782d390ae2c6320abbbc Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Thu, 9 Jul 2020 11:03:12 -0400 Subject: [PATCH 35/37] Makes Ice Cream GC --- _maps/map_files/Delta/delta.dmm | 2 +- .../MetaStation/MetaStation.v41A.II.dmm | 2 +- _maps/map_files/RandomZLevels/centcomAway.dmm | 2 +- .../food_and_drinks/food/foods/desserts.dm | 8 +- .../kitchen_machinery/icecream_vat.dm | 7 +- .../kitchen_machinery/icecream_vat_2.dm | 256 ------------------ icons/obj/kitchen.dmi | Bin 32683 -> 32707 bytes paradise.dme | 1 - 8 files changed, 10 insertions(+), 268 deletions(-) delete mode 100644 code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index 93815774e61..f4202c2aea3 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -33633,7 +33633,7 @@ dir = 4; level = 1 }, -/obj/machinery/icecream_vat, +/obj/machinery/icemachine, /obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel, /area/crew_quarters/kitchen) diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index f7eda3fe8ee..f8ee23f3f7e 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -58653,7 +58653,7 @@ }, /area/crew_quarters/kitchen) "bXn" = ( -/obj/machinery/icecream_vat, +/obj/machinery/icemachine, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm index 84515f06d49..1614171fabd 100644 --- a/_maps/map_files/RandomZLevels/centcomAway.dmm +++ b/_maps/map_files/RandomZLevels/centcomAway.dmm @@ -6142,7 +6142,7 @@ }, /area/awaymission/centcomAway/thunderdome) "oN" = ( -/obj/machinery/icecream_vat, +/obj/machinery/icemachine, /turf/simulated/floor/plasteel{ tag = "icon-barber (WEST)"; icon_state = "barber"; diff --git a/code/modules/food_and_drinks/food/foods/desserts.dm b/code/modules/food_and_drinks/food/foods/desserts.dm index 9e8ded0bd1b..67034e164ce 100644 --- a/code/modules/food_and_drinks/food/foods/desserts.dm +++ b/code/modules/food_and_drinks/food/foods/desserts.dm @@ -17,10 +17,10 @@ update_icon() /obj/item/reagent_containers/food/snacks/icecream/update_icon() - overlays.Cut() - var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color") - filling.icon += mix_color_from_reagents(reagents.reagent_list) - overlays += filling + cut_overlays() + var/mutable_appearance/filling = mutable_appearance('icons/obj/kitchen.dmi', "icecream_color") + filling.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(filling) /obj/item/reagent_containers/food/snacks/icecream/icecreamcone name = "ice cream cone" diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 69eda1e4269..0e9ecbaa7e4 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -43,10 +43,9 @@ return if(istype(I, /obj/item/reagent_containers/food/snacks/icecream)) if(!I.reagents.has_reagent("sprinkles")) - if(I.reagents.total_volume > 29) I.reagents.remove_any(1) - I.reagents.add_reagent("sprinkles",1) - var/image/sprinkles = image('icons/obj/kitchen.dmi', src, "sprinkles") - I.overlays += sprinkles + if(I.reagents.total_volume > 29) + I.reagents.remove_any(1) + I.reagents.add_reagent("sprinkles", 1) I.name += " with sprinkles" I.desc += ". This also has sprinkles." else diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm deleted file mode 100644 index c1602a14251..00000000000 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat_2.dm +++ /dev/null @@ -1,256 +0,0 @@ -#define ICECREAM_VANILLA 1 -#define FLAVOUR_CHOCOLATE 2 -#define FLAVOUR_STRAWBERRY 3 -#define FLAVOUR_BLUE 4 -#define CONE_WAFFLE 5 -#define CONE_CHOC 6 -#define INGR_MILK 7 -#define INGR_FLOUR 8 -#define INGR_SUGAR 9 -#define INGR_ICE 10 -#define MUCK 11 - -GLOBAL_LIST_INIT(ingredients_source, list( -"berryjuice" = FLAVOUR_STRAWBERRY,\ -"cocoa" = FLAVOUR_CHOCOLATE,\ -"singulo" = FLAVOUR_BLUE,\ -"milk" = INGR_MILK,\ -"soymilk" = INGR_MILK,\ -"ice" = INGR_ICE,\ -"flour" = INGR_FLOUR,\ -"sugar" = INGR_SUGAR,\ -)) - -/proc/get_icecream_flavour_string(var/flavour_type) - switch(flavour_type) - if(FLAVOUR_CHOCOLATE) - return "chocolate" - if(FLAVOUR_STRAWBERRY) - return "strawberry" - if(FLAVOUR_BLUE) - return "blue" - if(CONE_WAFFLE) - return "waffle" - if(CONE_CHOC) - return "chocolate" - if(INGR_MILK) - return "milk" - if(INGR_FLOUR) - return "flour" - if(INGR_SUGAR) - return "sugar" - if(INGR_ICE) - return "ice" - if(MUCK) - return "muck" - else - return "vanilla" - -/obj/machinery/icecream_vat - name = "icecream vat" - desc = "Ding-aling ding dong. Get your Nanotrasen-approved ice cream!" - icon = 'icons/obj/kitchen.dmi' - icon_state = "icecream_vat" - density = 1 - anchored = 0 - max_integrity = 300 - var/list/ingredients = list() - var/dispense_flavour = 1 - var/obj/item/reagent_containers/glass/held_container - -/obj/machinery/icecream_vat/New() - ..() - create_reagents(50) - while(ingredients.len < 11) - ingredients.Add(5) - -/obj/machinery/icecream_vat/attack_hand(mob/user) - user.set_machine(src) - interact(user) - -/obj/machinery/icecream_vat/interact(mob/user) - var/dat - dat += "Dispense vanilla icecream There is [ingredients[ICECREAM_VANILLA]] scoops of vanilla icecream left (made from milk and ice).
" - dat += "Dispense strawberry icecream There is [ingredients[FLAVOUR_STRAWBERRY]] dollops of strawberry flavouring left (obtained from berry juice.
" - dat += "Dispense chocolate icecream There is [ingredients[FLAVOUR_CHOCOLATE]] dollops of chocolate flavouring left (obtained from cocoa powder).
" - dat += "Dispense blue icecream There is [ingredients[FLAVOUR_BLUE]] dollops of blue flavouring left (obtained from bluespace tomato singulo).
" - dat += "
" - dat += "Dispense waffle cones There are [ingredients[CONE_WAFFLE]] waffle cones left.
" - dat += "Dispense chocolate cones There are [ingredients[CONE_CHOC]] chocolate cones left.
" - dat += "
" - dat += "Make waffle cones There is [ingredients[INGR_FLOUR]]/[ingredients[INGR_SUGAR]] of flour and sugar left.
" - dat += "Make chocolate cones There is [ingredients[FLAVOUR_CHOCOLATE]]/[ingredients[CONE_WAFFLE]] of chocolate flavouring and waffle cones left.
" - dat += "Make vanilla icecream There is [ingredients[INGR_MILK]]/[ingredients[INGR_ICE]] of milk and ice left.
" - dat += "
" - if(held_container) - dat += "Eject [held_container] " - else - dat += "No beaker inserted. " - dat += "Refresh Close" - - var/datum/browser/popup = new(user, "icecreamvat", name, 600, 400) - popup.set_content(dat) - popup.open(0) - -/obj/machinery/icecream_vat/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/reagent_containers)) - if(istype(O, /obj/item/reagent_containers/food/snacks/icecream)) - var/obj/item/reagent_containers/food/snacks/icecream/I = O - if(!I.ice_creamed) - if(ingredients[ICECREAM_VANILLA] > 0) - var/flavour_name = get_icecream_flavour_string(dispense_flavour) - if(dispense_flavour < 11 && ingredients[dispense_flavour] > 0) - visible_message("[bicon(src)] [user] scoops delicious [flavour_name] flavoured icecream into [I].") - ingredients[dispense_flavour] -= 1 - ingredients[ICECREAM_VANILLA] -= 1 - - I.add_ice_cream(dispense_flavour) - if(held_container) - held_container.reagents.trans_to(I, 10) - if(I.reagents.total_volume < 10) - I.reagents.add_reagent("sugar", 10 - I.reagents.total_volume) - else - to_chat(user, "There is not enough [flavour_name] flavouring left! Insert more of the required ingredients.") - else - to_chat(user, "There is not enough icecream left! Insert more milk and ice.") - else - to_chat(user, "[O] already has icecream in it.") - else if(istype(O, /obj/item/reagent_containers/glass)) - if(held_container) - to_chat(user, "You must remove [held_container] from [src] first.") - else - if(!user.drop_item()) - to_chat(user, "\The [O] is stuck to your hand!") - return - O.forceMove(src) - to_chat(user, "You insert [O] into [src].") - held_container = O - else - var/obj/item/reagent_containers/R = O - if(R.reagents) - visible_message("[user] has emptied all of [R] into [src].") - for(var/datum/reagent/current_reagent in R.reagents.reagent_list) - if(GLOB.ingredients_source[current_reagent.id]) - add(GLOB.ingredients_source[current_reagent.id], current_reagent.volume / 2) - else - add(MUCK, current_reagent.volume / 5) - R.reagents.clear_reagents() - return 1 - else - return ..() - -/obj/machinery/icecream_vat/proc/add(var/add_type, var/amount) - if(add_type <= ingredients.len) - ingredients[add_type] += amount - updateDialog() - -/obj/machinery/icecream_vat/proc/make(var/mob/user, var/make_type) - switch(make_type) - if(CONE_WAFFLE) - if(ingredients[INGR_FLOUR] > 0 && ingredients[INGR_SUGAR] > 0) - var/amount = max( min(ingredients[INGR_FLOUR], ingredients[INGR_SUGAR]), 5) - ingredients[INGR_FLOUR] -= amount - ingredients[INGR_SUGAR] -= amount - ingredients[CONE_WAFFLE] += amount - visible_message("[user] cooks up some waffle cones.") - else - to_chat(user, "You require sugar and flour to make waffle cones.") - if(CONE_CHOC) - if(ingredients[FLAVOUR_CHOCOLATE] > 0 && ingredients[CONE_WAFFLE] > 0) - var/amount = min(ingredients[CONE_WAFFLE], ingredients[FLAVOUR_CHOCOLATE]) - ingredients[CONE_WAFFLE] -= amount - ingredients[FLAVOUR_CHOCOLATE] -= amount - ingredients[CONE_CHOC] += amount - visible_message("[user] cooks up some chocolate cones.") - else - to_chat(user, "You require waffle cones and chocolate flavouring to make chocolate cones.") - if(ICECREAM_VANILLA) - if(ingredients[INGR_ICE] > 0 && ingredients[INGR_MILK] > 0) - var/amount = min(ingredients[INGR_ICE], ingredients[INGR_MILK]) - ingredients[INGR_ICE] -= amount - ingredients[INGR_MILK] -= amount - ingredients[ICECREAM_VANILLA] += amount - visible_message("[user] whips up some vanilla icecream.") - else - to_chat(user, "You require milk and ice to make vanilla icecream.") - updateDialog() - -/obj/machinery/icecream_vat/Topic(href, href_list) - if(..()) - return - if(href_list["dispense"]) - dispense_flavour = text2num(href_list["dispense"]) - visible_message("[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.") - - if(href_list["cone"]) - var/dispense_cone = text2num(href_list["cone"]) - if(ingredients[dispense_cone] <= ingredients.len) - var/cone_name = get_icecream_flavour_string(dispense_cone) - if(ingredients[dispense_cone] >= 1) - ingredients[dispense_cone] -= 1 - var/obj/item/reagent_containers/food/snacks/icecream/I = new(loc) - I.cone_type = cone_name - I.icon_state = "icecream_cone_[cone_name]" - I.desc = "Delicious [cone_name] cone, but no ice cream." - visible_message("[usr] dispenses a crunchy [cone_name] cone from [src].") - else - to_chat(usr, "There are no [cone_name] cones left!") - updateDialog() - - if(href_list["make"]) - make( usr, text2num(href_list["make"]) ) - updateDialog() - - if(href_list["eject"]) - if(held_container) - held_container.forceMove(loc) - held_container = null - updateDialog() - - if(href_list["refresh"]) - updateDialog() - - if(href_list["close"]) - usr.unset_machine() - usr << browse(null,"window=icecreamvat") - return - -/obj/machinery/icecream_vat/deconstruct(disassembled = TRUE) - if(!(flags & NODECONSTRUCT)) - new /obj/item/stack/sheet/metal(loc, 4) - qdel(src) - - -/obj/item/reagent_containers/food/snacks/icecream - name = "ice cream cone" - desc = "Delicious waffle cone, but no ice cream." - icon = 'icons/obj/kitchen.dmi' - icon_state = "icecream_cone" - layer = 3.1 - var/ice_creamed = 0 - var/cone_type - bitesize = 3 - -/obj/item/reagent_containers/food/snacks/icecream/New() - ..() - create_reagents(20) - reagents.add_reagent("nutriment", 5) - -/obj/item/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour) - var/flavour_name = get_icecream_flavour_string(flavour) - name = "[flavour_name] icecream" - overlays += "icecream_[flavour_name]" - desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream." - ice_creamed = 1 - -#undef ICECREAM_VANILLA -#undef FLAVOUR_CHOCOLATE -#undef FLAVOUR_STRAWBERRY -#undef FLAVOUR_BLUE -#undef CONE_WAFFLE -#undef CONE_CHOC -#undef INGR_MILK -#undef INGR_FLOUR -#undef INGR_SUGAR -#undef INGR_ICE -#undef MUCK diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 0e9ee4649ac3d207147a91ffb94dd2ddc453234c..40a8d2f745207510464a22a6cb16191a887762a4 100644 GIT binary patch literal 32707 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 KN|CNj*#84labgMmnVSrZ#mK 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 Ya!U3L=0(V8A@I3-N9T6IO`EX)3;q#KG5`Po diff --git a/paradise.dme b/paradise.dme index 21029f96bfc..f7740ff7334 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1570,7 +1570,6 @@ #include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" #include "code\modules\food_and_drinks\kitchen_machinery\grill_new.dm" #include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat_2.dm" #include "code\modules\food_and_drinks\kitchen_machinery\juicer.dm" #include "code\modules\food_and_drinks\kitchen_machinery\kitchen_machine.dm" #include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" From 523b4c681b8edc199f5ca9567f876efe67c9d417 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Thu, 9 Jul 2020 20:52:37 -0400 Subject: [PATCH 36/37] Fixes Cable GC Issues (#13793) --- code/controllers/subsystem/machinery.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm index 7e78e2b9df1..cebc6a5f768 100644 --- a/code/controllers/subsystem/machinery.dm +++ b/code/controllers/subsystem/machinery.dm @@ -42,7 +42,7 @@ SUBSYSTEM_DEF(machines) while(currentrun.len) var/obj/O = currentrun[currentrun.len] currentrun.len-- - if(O) + if(O && !QDELETED(O)) var/datum/powernet/newPN = new() // create a new powernet... propagate_network(O, newPN)//... and propagate it to the other side of the cable From 37d30a9057cbbf5d82805371d793aa0578bbab97 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Fri, 10 Jul 2020 03:04:35 -0400 Subject: [PATCH 37/37] Optimizes Smoking --- code/game/objects/items/weapons/cigs.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm index 98a7b769642..8c2c3e85917 100644 --- a/code/game/objects/items/weapons/cigs.dm +++ b/code/game/objects/items/weapons/cigs.dm @@ -31,6 +31,7 @@ LIGHTERS ARE IN LIGHTERS.DM var/smoketime = 150 var/chem_volume = 60 var/list/list_reagents = list("nicotine" = 40) + var/first_puff = TRUE // the first puff is a bit more reagents ingested sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -194,8 +195,9 @@ LIGHTERS ARE IN LIGHTERS.DM if(reagents && reagents.total_volume) // check if it has any reagents at all if(is_being_smoked) // if it's being smoked, transfer reagents to the mob var/mob/living/carbon/C = loc - for (var/datum/reagent/R in reagents.reagent_list) - reagents.trans_id_to(C, R.id, max(REAGENTS_METABOLISM / reagents.reagent_list.len, 0.1)) //transfer at least .1 of each chem + for(var/datum/reagent/R in reagents.reagent_list) + reagents.trans_id_to(C, R.id, first_puff ? 1 : max(REAGENTS_METABOLISM / reagents.reagent_list.len, 0.1)) //transfer at least .1 of each chem + first_puff = FALSE if(!reagents.total_volume) // There were reagents, but now they're gone to_chat(C, "Your [name] loses its flavor.") else // else just remove some of the reagents @@ -377,6 +379,7 @@ LIGHTERS ARE IN LIGHTERS.DM to_chat(user, "You refill the pipe with tobacco.") reagents.add_reagent("nicotine", chem_volume) smoketime = initial(smoketime) + first_puff = TRUE /obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers))