diff --git a/Scopes Files/gravitygenerator.dm b/Scopes Files/gravitygenerator.dm index 1fbbd055..edc866e3 100644 --- a/Scopes Files/gravitygenerator.dm +++ b/Scopes Files/gravitygenerator.dm @@ -55,6 +55,29 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi feedback_add_details("admin_verb","RSG") +/client/proc/cmd_dev_reset_floating() + set category = "Debug" + set name = "Reset floating mobs" + set desc = "Stops all mobs floating instantly." + + if(!check_rights(R_DEBUG|R_DEV)) return + + if(!holder) + return //how did they get here? + + if(!ticker) + alert("Wait until the game starts") + return + + if(ticker.current_state < GAME_STATE_PLAYING) + src << "\red The game hasn't started yet!" + return + + for(var/mob/living/M in world) + M.float(0) + + feedback_add_details("admin_verb","RSF") + /obj/machinery/gravity_field_generator name = "gravitational generator" desc = "A device which produces a graviton field when set up." @@ -345,6 +368,7 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi if(gravity_in_level() == 1) alert = 1 gravity_is_on = 0 + captain_announce("Gravity generator: shutdown successful.") investigate_log("was brought offline and there is now no gravity for this level.", "gravity") message_admins("The gravity generator was brought offline with no backup generator. ([area.name])") message_mods("The gravity generator was brought offline with no backup generator. ([area.name])") @@ -354,8 +378,6 @@ var/list/gravity_field_generators = list() // We will keep track of this by addi update_list() src.updateUsrDialog() if(alert) - if(!(stat & BROKEN)) - captain_announce("Gravity generator: shutdown successful.") shake_everyone() // Charge/Discharge and turn on/off gravity when you reach 0/100 percent. diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm index 9a53f3db..971c187a 100644 --- a/code/__HELPERS/logging.dm +++ b/code/__HELPERS/logging.dm @@ -9,15 +9,18 @@ /proc/error(msg) + msg_scopes("## ERROR: [msg]") world.log << "## ERROR: [msg][log_end]" #define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].") //print a warning message to world.log /proc/warning(msg) + msg_scopes("## WARNING: [msg]") world.log << "## WARNING: [msg][log_end]" //print a testing-mode debug message to world.log /proc/testing(msg) + msg_scopes("## TESTING: [msg]") world.log << "## TESTING: [msg][log_end]" /proc/log_admin(text) @@ -85,7 +88,7 @@ //SoundScopes extra stuffs //I'm sending debug messages through here for when an admin log is made at the same time. //What's the point in making 2 recorded logs for one thing. -/proc/msg_scopes(var/msg, tell_devs = 0) +/proc/msg_scopes(var/msg, tell_devs = 0, override = 0) if(tell_devs) msg = "DEBUG: [msg]" else @@ -94,7 +97,7 @@ for(var/client/C in admins) if(R_DEV & C.holder.rights) if(tell_devs) - if((C.prefs.toggles & CHAT_DEBUGLOGS) && !(R_ADMIN & C.holder.rights)) + if(((C.prefs.toggles & CHAT_DEBUGLOGS) || (override)) && !(C.holder.rights & R_ADMIN)) C << msg if(R_ADMIN & C.holder.rights) if(C.prefs.toggles & CHAT_SCOPES_DEBUG) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 41ec3faf..93ac4ecd 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -63,6 +63,7 @@ var/kick_inactive = 0 //force disconnect for inactive players var/load_jobs_from_txt = 0 var/ToRban = 0 + var/ip_blacklist_enabled = 0 var/automute_on = 0 //enables automuting/spam prevention var/jobs_have_minimal_access = 1 //determines whether jobs use minimal access or expanded access. diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index acb9f645..0df76ccc 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1255,7 +1255,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee cost = 40 containertype = /obj/structure/closet/crate/secure containername = "engineer hardsuit kit" - access_engine_equip + access = access_engine_equip group = "Engineering" /datum/supply_packs/hardsuitcrate_s diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 328dc566..01102fa6 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -353,7 +353,7 @@ mob:AdjustStunned(2) mob:AdjustWeakened(2) - mob:float(0) +// mob:float(0) mob << "Gravity!" /proc/has_gravity(atom/AT, turf/T) diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index f344e144..ed49a995 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -209,6 +209,7 @@ //var/r = rand(5) //var/target_traitors = 1 + var/max_traitors = 2 var/traitor_prob = 0 max_traitors = round(playercount / 10) + 1 @@ -222,6 +223,9 @@ //message_admins("Number of Traitors is below maximum. Rolling for New Arrival Traitor.") //message_admins("The probability of a new traitor is [traitor_prob]%") if(prob(traitor_prob)) + if(character.mind.assigned_role in restricted_jobs) + msg_scopes("Retricted job almost made a bad guy") + return message_admins("New traitor roll passed. Making a new Traitor.") if (!config.objectives_disabled) forge_traitor_objectives(character.mind) diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm index 88ca9af0..bc645585 100644 --- a/code/game/gamemodes/revolution/rp_revolution.dm +++ b/code/game/gamemodes/revolution/rp_revolution.dm @@ -211,12 +211,13 @@ var/added_heads = 0 for(var/mob/living/carbon/human/H in world) if(H.client && H.mind && H.client.inactivity <= 10*60*20 && H.mind in revolutionaries) head_revolutionaries += H.mind - for(var/datum/mind/head_mind in heads) - var/datum/objective/mutiny/rp/rev_obj = new - rev_obj.owner = H.mind - rev_obj.target = head_mind - rev_obj.explanation_text = "Assassinate or capture [head_mind.name], the [head_mind.assigned_role]." - H.mind.objectives += rev_obj + if(!config.objectives_disabled) + for(var/datum/mind/head_mind in heads) + var/datum/objective/mutiny/rp/rev_obj = new + rev_obj.owner = H.mind + rev_obj.target = head_mind + rev_obj.explanation_text = "Assassinate or capture [head_mind.name], the [head_mind.assigned_role]." + H.mind.objectives += rev_obj update_rev_icons_added(H.mind) H.verbs += /mob/living/carbon/human/proc/RevConvert @@ -258,13 +259,15 @@ /datum/game_mode/revolution/rp_revolution/latespawn(mob/M) if(M.mind.assigned_role in command_positions) - log_debug("Adding head kill/capture/convert objective for [M.name]") + log_debug("Adding to head list for [M.name]") heads += M - for(var/datum/mind/rev_mind in head_revolutionaries) - var/datum/objective/mutiny/rp/rev_obj = new - rev_obj.owner = rev_mind - rev_obj.target = M.mind - rev_obj.explanation_text = "Assassinate, convert or capture [M.real_name], the [M.mind.assigned_role]." - rev_mind.objectives += rev_obj - rev_mind.current << "\red A new Head of Staff, [M.real_name], the [M.mind.assigned_role] has appeared. Your objectives have been updated." + if(!config.objectives_disabled) + log_debug("Adding head kill/capture/convert objective for [M.name]") + for(var/datum/mind/rev_mind in head_revolutionaries) + var/datum/objective/mutiny/rp/rev_obj = new + rev_obj.owner = rev_mind + rev_obj.target = M.mind + rev_obj.explanation_text = "Assassinate, convert or capture [M.real_name], the [M.mind.assigned_role]." + rev_mind.objectives += rev_obj + rev_mind.current << "\red A new Head of Staff, [M.real_name], the [M.mind.assigned_role] has appeared. Your objectives have been updated." diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 0939375c..b44d580c 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -109,7 +109,14 @@ if(C==usr) M.current << "\red You can't do that to yourself" return - M.current.visible_message("[M]'s eyes flash briefly as he stares into [C.name]'s eyes") + + var/vampgender + if(M.current.gender == "male") + vampgender = "he" + else + vampgender = "she" + + M.current.visible_message("[M]'s eyes flash briefly as [vampgender] stares into [C.name]'s eyes") // M.current.remove_vampire_blood(20) Moved to remove if it works only. if(M.current.vampire_power(0, 0)) //if(M.current.vampire_power(20, 0)) M.current.verbs -= /client/vampire/proc/vampire_hypnotise diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 48321f9f..b6a1cd18 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -339,6 +339,7 @@ var/global/list/frozen_items = list() var/turf/location = get_turf(src) log_admin("[key_name_admin(M)] has entered a stasis pod. (JMP)") message_admins("\blue [key_name_admin(M)] has entered a stasis pod.") + message_mods("\blue [key_name_admin(M)] has entered a stasis pod.(JMP)") //Despawning occurs when process() is called with an occupant without a client. src.add_fingerprint(M) diff --git a/code/game/machinery/kitchen/deep_fryer.dm b/code/game/machinery/kitchen/deep_fryer.dm index 4a9691b4..79237b8f 100644 --- a/code/game/machinery/kitchen/deep_fryer.dm +++ b/code/game/machinery/kitchen/deep_fryer.dm @@ -17,13 +17,28 @@ usr << "You can make out [frying] in the oil." /obj/machinery/deepfryer/attackby(obj/item/I, mob/user) - if(on) + if(istype(I, /obj/item/weapon/card/emag)) + if(emagged) + user << "[src] is already emagged!" + else + user << "Override the safety on [src]." + emagged = 1 + return + + if(on || emagged) var/obj/item/weapon/grab/G = I if(istype(G)) // handle grabbed mob if(ismob(G.affecting)) var/mob/living/GM = G.affecting user.visible_message("[user] starts pushing [GM.name] into the fryer.", "You try to force [GM.name] towards the fryer.", "You hear a struggle.") + if(emagged) + icon_state = "fryer_on" + on = TRUE + spawn(30) + icon_state = "fryer_off" + on = TRUE + if(do_after(usr, 20)) var/body_part = fry_mob_by_limb(GM, user.zone_sel.selecting) if(!body_part) //If you fry a valid part this will be set diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 7c7a7153..468d7730 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -51,8 +51,8 @@ A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). bombers += "[key_name(user)] attached a [item] to a transfer valve." - message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.") - message_mods("[key_name_admin(user)] attached a [item] to a transfer valve.") + message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.") + message_mods("[key_name_admin(user)] attached a [item] to a transfer valve.") log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") attacher = user nanomanager.update_uis(src) // update all UIs attached to src diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 1a75ae17..20b65d12 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -50,6 +50,9 @@ log_str += " Last touched by: [src.fingerprintslast][last_touch_info]" bombers += log_str + message_admins("C4 Explosion: Last touched by: [src.fingerprintslast][last_touch_info]([user.ckey])(JMP)") + message_admins("C4 Explosion: Last touched by: [src.fingerprintslast][last_touch_info]([user.ckey])(JMP)") + explosion(location, -1, -1, 2, 3) if (istype(target, /turf/simulated/wall)) target:dismantle_wall(1) else target.ex_act(1) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 61d791ac..4082dacf 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -100,4 +100,14 @@ new /obj/item/weapon/implantcase/loyalty(src) new /obj/item/weapon/implanter/loyalty(src) new /obj/item/clothing/tie/holster/waist(src) - new /obj/item/weapon/gun/energy/gun/pistol(src) \ No newline at end of file + new /obj/item/weapon/gun/energy/gun/pistol(src) + +/obj/item/weapon/storage/lockbox/lawgiver + name = "Weapons lockbox" + desc = "A high security weapons lockbox" + req_access = list(access_armory) + storage_slots = 1 + + New() + ..() + new /obj/item/weapon/gun/energy/lawgiver(src) \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 4f90e965..77a6e26b 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -109,8 +109,6 @@ M.loc = src.loc M.dir = src.dir M.update_canmove() - if(!M.mob_has_gravity(M.loc)) - M.float(0) src.buckled_mob = M src.add_fingerprint(user) afterbuckle(M) diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index dc42bac3..fd167b74 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -142,8 +142,8 @@ M.loc = src.loc M.dir = src.dir M.update_canmove() - if(!M.mob_has_gravity(M.loc)) - M.float(0) +// if(!M.mob_has_gravity(M.loc)) +// M.float(0) src.buckled_mob = M src.add_fingerprint(user) return \ No newline at end of file diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index a756ca4d..5649d051 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -39,17 +39,27 @@ var/global/normal_ooc_colour = "#002eb8" message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return + if(holder) + if(holder.rights & R_DEV && !(holder.rights & R_ADMIN)) + if(!ooc_allowed && !ooc_dev_allowed) + src << "\red OOC is muted for developers" + return + if(holder.rights & R_MOD && !(holder.rights & R_ADMIN)) + if(!ooc_allowed && !ooc_mod_allowed) + src << "\red OOC is muted for moderators" + return + log_ooc("[mob.name]/[key] : [msg]") var/display_colour = normal_ooc_colour if(holder && !holder.fakekey) display_colour = "#0099cc" //light blue if(holder.rights & R_MOD && !(holder.rights & R_ADMIN)) - display_colour = "#184880" //dark blue - if(holder.rights & R_DEBUG && !(holder.rights & R_ADMIN)) display_colour = "#1b521f" //dark green + if(holder.rights & R_DEBUG && !(holder.rights & R_ADMIN)) + display_colour = "#184880" //dark blue if(holder.rights & R_DEV && !(holder.rights & R_ADMIN)) - display_colour = "#1b521f" + display_colour = "#184880" //dark blue else if(holder.rights & R_ADMIN) if(config.allow_admin_ooccolor) display_colour = src.prefs.ooccolor @@ -132,6 +142,16 @@ var/global/normal_ooc_colour = "#002eb8" message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return + if(holder) + if(holder.rights & R_DEV && !(holder.rights & R_ADMIN)) + if(!looc_allowed && !looc_dev_allowed) + src << "\red LOOC is muted for developers" + return + if(holder.rights & R_MOD && !(holder.rights & R_ADMIN)) + if(!looc_allowed && !looc_mod_allowed) + src << "\red LOOC is muted for moderators" + return + log_ooc("(LOCAL) [mob.name]/[key] : [msg]") var/list/heard = get_mobs_in_view(7, src.mob) diff --git a/code/global.dm b/code/global.dm index 47816187..953cbfdc 100644 --- a/code/global.dm +++ b/code/global.dm @@ -91,10 +91,21 @@ var/secret_force_mode = "secret" // if this is anything but "secret", the secret var/datum/engine_eject/engine_eject_control = null var/host = null var/aliens_allowed = 0 + + var/ooc_allowed = 1 +var/ooc_mod_allowed = 1 +var/ooc_dev_allowed = 1 + var/looc_allowed = 1 +var/looc_mod_allowed = 1 +var/looc_dev_allowed = 1 + var/dsay_allowed = 1 var/dooc_allowed = 1 + + + var/traitor_scaling = 1 //var/goonsay_allowed = 0 var/dna_ident = 1 diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 9548c279..164db030 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -17,6 +17,27 @@ world/IsBanned(key,address,computer_id) AddBan(ckey(key), computer_id, "Use of ToR", "Automated Ban", 0, 0) return list("reason"="Using ToR", "desc"="\nReason: The network you are using to connect has been banned.\nIf you believe this is a mistake, please request help at [config.banappeals]") + if(config && config.ip_blacklist_enabled) + testing("Loading Blacklist") + var/text = file2text("data/ip_blacklist.txt") + if (!text) + error("Failed to load data/ip_blacklist.txt") + else + var/list/lines = text2list(text, "\n") + for(var/line in lines) + if (!line) + continue + + if (copytext(line, 1, 2) == ";") + continue + + var/banned_address = copytext(line, 1, length(line)+1) + testing("Blacklist: address:[address] - banned_address:[banned_address]") + if(banned_address == address) + log_access("Failed Login: [src] - Blacklisted IP") + message_admins("\blue Failed Login: [src] - Blacklisted IP") + AddBan(ckey(key), computer_id, "Bad IP", "Automated Ban", 0, 0) + return list("reason"="IP Blacklisted", "desc"="\nReason: This IP has been blacklisted from the server.\nIf you believe this is a mistake, please request help at [config.banappeals]") if(config.ban_legacy_system) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 50845eef..dc6aa228 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -740,12 +740,50 @@ var/global/floorIsLava = 0 ooc_allowed = !( ooc_allowed ) if (ooc_allowed) world << "The OOC channel has been globally enabled!" + ooc_dev_allowed = 1 + ooc_mod_allowed = 1 else world << "The OOC channel has been globally disabled!" log_admin("[key_name(usr)] toggled OOC.") message_admins("[key_name_admin(usr)] toggled OOC.", 1) feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/admins/proc/toggledevooc() + set category = "Server" + set desc="Toggles Developer OOC" + set name="Toggle Dev OOC" + if(ooc_allowed) + usr << "OOC needs to be muted first" + return + ooc_dev_allowed = !( ooc_dev_allowed ) + var/looc_status + if (ooc_dev_allowed) + looc_status = "Enabled" + else + looc_status = "Disabled" + log_admin("[key_name(usr)] [looc_status] Developer OOC.") + message_admins("[key_name_admin(usr)] [looc_status] Developer OOC.", 1) + msg_scopes("Developer OOC has been [looc_status]",1,1) + feedback_add_details("admin_verb","TDOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/datum/admins/proc/togglemodooc() + set category = "Server" + set desc="Toggles Moderators OOC" + set name="Toggle Mod OOC" + if(ooc_allowed) + usr << "OOC needs to be muted first" + return + ooc_mod_allowed = !( ooc_mod_allowed ) + var/looc_status + if (ooc_mod_allowed) + looc_status = "Enabled" + else + looc_status = "Disabled" + log_admin("[key_name(usr)] toggled Mod OOC.") + message_admins("[key_name_admin(usr)] [looc_status] Moderator OOC.", 1) + message_mods("Moderator OOC has been [looc_status]") + feedback_add_details("admin_verb","TMOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /datum/admins/proc/togglelooc() set category = "Server" set desc="Globally Toggles LOOC" @@ -753,14 +791,49 @@ var/global/floorIsLava = 0 looc_allowed = !( looc_allowed ) if (looc_allowed) world << "The LOOC channel has been globally enabled!" + looc_dev_allowed = 1 + looc_mod_allowed = 1 else world << "The LOOC channel has been globally disabled!" log_admin("[key_name(usr)] toggled LOOC.") message_admins("[key_name_admin(usr)] toggled LOOC.", 1) feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/admins/proc/toggledevlooc() + set category = "Server" + set desc="Toggles Developer LOOC" + set name="Toggle Dev LOOC" + if(looc_allowed) + usr << "Looc needs to be muted first" + return + looc_dev_allowed = !( looc_dev_allowed ) + var/looc_status + if (looc_dev_allowed) + looc_status = "Enabled" + else + looc_status = "Disabled" + log_admin("[key_name(usr)] [looc_status] Developer LOOC.") + message_admins("[key_name_admin(usr)] [looc_status] Developer LOOC.", 1) + msg_scopes("Developer LOOC has been [looc_status]",1,1) + feedback_add_details("admin_verb","TDLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - +/datum/admins/proc/togglemodlooc() + set category = "Server" + set desc="Toggles Moderator LOOC" + set name="Toggle Mod LOOC" + if(looc_allowed) + usr << "Looc needs to be muted first" + return + looc_mod_allowed = !( looc_mod_allowed ) + var/looc_status + if (looc_mod_allowed) + looc_status = "Enabled" + else + looc_status = "Disabled" + log_admin("[key_name(usr)] [looc_status] Moderator LOOC.") + message_admins("[key_name_admin(usr)] [looc_status] Moderator LOOC.", 1) + message_mods("Moderator LOOC has been [looc_status]") + feedback_add_details("admin_verb","TMLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggledsay() set category = "Server" @@ -879,8 +952,8 @@ var/global/floorIsLava = 0 if (!ticker || ticker.current_state != GAME_STATE_PREGAME) ticker.delay_end = !ticker.delay_end log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) - message_mods("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + message_admins("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + message_mods("\blue [key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) return //alert("Round end delayed", null, null, null, null, null) going = !( going ) if (!( going )) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 4b129c56..efbecb0a 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -59,7 +59,11 @@ var/list/admin_verbs_admin = list( /client/proc/secrets, /client/proc/toggleprayers, /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ + /datum/admins/proc/toggledevooc, + /datum/admins/proc/togglemodooc, /datum/admins/proc/togglelooc, + /datum/admins/proc/togglemodlooc, + /datum/admins/proc/toggledevlooc, /datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/ /datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/ /client/proc/game_panel, /*game panel, allows to change game-mode etc*/ @@ -138,6 +142,7 @@ var/list/admin_verbs_dev = list( /client/proc/cmd_dev_say, /client/proc/cmd_dev_bst, /client/proc/cmd_dev_reset_gravity, + /client/proc/cmd_dev_reset_floating, /client/proc/togglescopeslogs ) var/list/admin_verbs_spawn = list( @@ -188,7 +193,10 @@ var/list/admin_verbs_debug = list( /client/proc/toggledebuglogs, /client/proc/SDQL_query, /client/proc/SDQL2_query, - /client/proc/cmd_dev_reset_gravity + /client/proc/cmd_dev_reset_gravity, + /client/proc/cmd_dev_reset_floating, + /client/proc/cleartox, + /client/proc/fillspace ) var/list/admin_verbs_possess = list( /proc/possess, @@ -330,6 +338,7 @@ var/list/admin_verbs_mod = list( admin_verbs_rejuv, admin_verbs_sounds, admin_verbs_spawn, + admin_verbs_dev, /*Debug verbs added by "show debug verbs"*/ /client/proc/Cell, /client/proc/do_not_use_these, @@ -961,3 +970,42 @@ var/list/admin_verbs_mod = list( usr << "You now will get advanced debug logs" else usr << "You now won't get advanced debug logs" + +/client/proc/cleartox() + set category = "Special Verbs" + set name = "Clear Toxin/Fire in Zone" + if(!check_rights(R_DEBUG)) + return + + var/datum/gas_mixture/environment = usr.loc.return_air() + environment.toxins_archived = null + environment.toxins = 0 + environment.carbon_dioxide = 0 + environment.carbon_dioxide_archived = null + environment.oxygen = 21.8366 + environment.oxygen_archived = null + environment.nitrogen = 82.1472 + environment.nitrogen_archived = null + environment.temperature_archived = null + environment.temperature = 293.15 + environment.update_values() + var/turf/simulated/location = get_turf(usr) + if(location.zone) + for(var/turf/T in location.zone.contents) + for(var/obj/fire/F in T.contents) + del(F) + for(var/obj/fire/FF in world) + del(FF) + +/client/proc/fillspace() + set category = "Special Verbs" + set name = "Fill Space with floor" + if(!check_rights(R_DEBUG)) + return + var/area/location = usr.loc.loc + if(location.name != "Space") + for(var/turf/space/S in location) + S.ChangeTurf(/turf/simulated/floor/plating) + if(location.name == "Space") + for(var/turf/space/S in range(2,usr.loc)) + S.ChangeTurf(/turf/simulated/floor/plating) \ No newline at end of file diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 4dab57e7..b5bc3b1c 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -81,7 +81,9 @@ body += "TP - " body += "PM - " body += "SM - " - body += "JMP
" + body += "JMP - " + body += "WIND
" + if(antagonist > 0) body += "Antagonist"; diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index cfa1663e..2d0b72b0 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2768,3 +2768,20 @@ if("list") PlayerNotesPage(text2num(href_list["index"])) return + + if(href_list["admin_wind_player"]) + + var/mob/M = locate(href_list["admin_wind_player"]) + if(!ismob(M)) + usr << "This can only be used on instances of type /mob" + return + + if(!M.ckey) //sanity + usr << "This mob has no ckey" + return + + if(alert("Wind [M]?",,"Yes","No")!="Yes") + return + + M.weakened = 500 + return diff --git a/code/modules/aurora/bluespacetech.dm b/code/modules/aurora/bluespacetech.dm index 16d663fb..03356b8b 100644 --- a/code/modules/aurora/bluespacetech.dm +++ b/code/modules/aurora/bluespacetech.dm @@ -40,8 +40,7 @@ bst.name = "Bluespace Technician" bst.real_name = "Bluespace Technician" bst.voice_name = "Bluespace Technician" -// bst.h_style = "hair_crewcut" -// bst.update_hair() + bst.h_style = "Crewcut" //Items var/obj/item/clothing/under/U = new /obj/item/clothing/under/rank/centcom_officer/bst(bst) @@ -77,9 +76,11 @@ id.name = "[id.assignment]" bst.equip_to_slot_or_del(id, slot_wear_id) bst.update_inv_wear_id() + bst.regenerate_icons() //Add the rest of the languages //Because universal speak doesn't work right. + bst.add_language("Sol Common") bst.add_language("Sinta'unathi") bst.add_language("Siik'Maas") bst.add_language("Skrellian") @@ -98,7 +99,10 @@ spawn(5) s.start() bst.anchored = 0 + spawn(10) + del(s) log_debug("Bluespace Tech Spawned: X:[bst.x] Y:[bst.y] Z:[bst.z] User:[src]") + feedback_add_details("admin_verb","BST") return 1 @@ -119,14 +123,108 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() - var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc. - ghost.key = key - ghost.mind.name = "[ghost.key] BSTech" - ghost.name = "[ghost.key] BSTech" - ghost.real_name = "[ghost.key] BSTech" - ghost.voice_name = "[ghost.key] BSTech" + spawn(5) + del(s) + + if(key && species.name != "Human") + switch(species.name) + if("Tajaran") + bsc() + if("Machine") + bsb() + if("Diona") + bsd() + if("Unathi") + bsu() + if("Skrell") + bss() + +/* if(species.name != "Tajaran") + if(species.name == "Machine" && key) + h_style = "blue IPC screen" + regenerate_icons() +*/ + if(key) + var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc. + ghost.key = key +/* if(species.name == "Machine") + ghost.mind.name = "Bluespace Bot" + ghost.name = "Bluespace Bot" + ghost.real_name = "Bluespace Bot" + ghost.voice_name = "Bluespace Bot" + else +*/ + ghost.mind.name = "[ghost.key] BSTech" + ghost.name = "[ghost.key] BSTech" + ghost.real_name = "[ghost.key] BSTech" + ghost.voice_name = "[ghost.key] BSTech" + del(src) + proc/bsc() //because we all have our unrealistic snowflakes right? + if(set_species("Tajaran")) + h_style = "Tajaran Ears" + name = "Bluespace Cat" + voice_name = "Bluespace Cat" + real_name = "Bluespace Cat" + mind.name = "Bluespace Cat" + regenerate_icons() + else + ghostize(0) + key = null + suicide() + + proc/bsb() + if(set_species("Machine")) + h_style = "blue IPC screen" + name = "Bluespace Bot" + voice_name = "Bluespace Bot" + real_name = "Bluespace Bot" + mind.name = "Bluespace Bot" + regenerate_icons() + else + ghostize(0) + key = null + suicide() + + proc/bsd() + if(set_species("Diona")) + name = "Bluespace Tree" + voice_name = "Bluespace Tree" + real_name = "Bluespace Tree" + mind.name = "Bluespace Tree" + regenerate_icons() + else + ghostize(0) + key = null + suicide() + + proc/bsu() + if(set_species("Unathi")) + h_style = "Unathi Horns" + name = "Bluespace Snake" + voice_name = "Bluespace Snake" + real_name = "Bluespace Snake" + mind.name = "Bluespace Snake" + regenerate_icons() + else + ghostize(0) + key = null + suicide() + + proc/bss() + if(set_species("Skrell")) + h_style = "Skrell Male Tentacles" + name = "Bluespace Squid" + voice_name = "Bluespace Squid" + real_name = "Bluespace Squid" + mind.name = "Bluespace Squid" + regenerate_icons() + else + ghostize(0) + key = null + suicide() + say(var/message) var/verb = "says in a subdued tone" ..(message, verb) @@ -156,6 +254,8 @@ translate_binary = 1 translate_hive = 1 canremove = 0 + keyslot1 = new /obj/item/device/encryptionkey/binary + keyslot2 = new /obj/item/device/encryptionkey/ert attack_hand() if(!usr) @@ -173,6 +273,9 @@ has_sensor = 0 sensor_mode = 0 canremove = 0 + siemens_coefficient = 0 + cold_protection = FULL_BODY + heat_protection = FULL_BODY attack_hand() if(!usr) @@ -188,7 +291,7 @@ name = "Bluespace Technician's gloves" desc = "A pair of modified gloves, 'BST' marked on the side." siemens_coefficient = 0 - permeability_coefficient = 0.05 + permeability_coefficient = 0 canremove = 0 attack_hand() diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 8c68b807..db08554d 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -67,20 +67,65 @@ icon_state = "watch" item_state = "watchgloves" w_class = 1 - var/time = 1 + wired = 1 +// var/time = 1 verb/checktime() set category = "Object" set name = "Check Time" set src in usr - if(time == 1) + if(wired && !clipped) usr << "You check your watch, spotting a digital collection of numbers reading '[worldtime2text()]'" + else if(wired && clipped) + usr << "You check your watch realising it's still open" + else + usr << "You check your watch as it dawns on you that it's broken" verb/pointatwatch() set category = "Object" set name = "Point at watch" set src in usr - if(time == 1) + if(wired && !clipped) usr.visible_message ("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes.", "You point down at the [src], an arrogant look about your eyes.") + else if(wired && clipped) + usr.visible_message ("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's open", "You point down at the [src], an arrogant look about your eyes.") + else + usr.visible_message ("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's broken", "You point down at the [src], an arrogant look about your eyes.") + + attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/weapon/screwdriver)) + if (clipped) //Using clipped because adding a new var for something is dumb + user.visible_message("\blue [user] screws the cover of the [src] closed.","\blue You screw the cover of the [src] closed..") + clipped = 0 + return +// playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + user.visible_message("\blue [user] unscrew the cover of the [src].","\blue You unscrew the cover of the [src].") + clipped = 1 + return + if(wired) + return + if(istype(W, /obj/item/weapon/cable_coil)) + var/obj/item/weapon/cable_coil/C = W + if (!clipped) + user << "The [src] is not open." + return + + if(wired) + user << "The [src] are already wired." + return + + if(C.amount < 2) + user << "There is not enough wire to cover the [src]." + return + + C.use(2) + wired = 1 + user << "You repair some wires in the [src]." + return + + emp_act(severity) + if(prob(50/severity)) + wired = 0 + ..() \ No newline at end of file diff --git a/code/modules/customitems/baystation_fluff.dm b/code/modules/customitems/baystation_fluff.dm index e83ef9ea..e2945dc8 100644 --- a/code/modules/customitems/baystation_fluff.dm +++ b/code/modules/customitems/baystation_fluff.dm @@ -248,8 +248,13 @@ attack_self(mob/user) if(user.r_hand == src || user.l_hand == src) + var/mobgender + if(user.gender == "male") + mobgender = "guy" + else + mobgender = "gal" for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [] uses [] to comb their hair with incredible style and sophistication. What a guy.", user, src), 1) + O.show_message(text("\red [] uses [] to comb their hair with incredible style and sophistication. What a [mobgender].", user, src), 1) return /obj/item/weapon/fluff/hugo_cinderbacth_1 //thatoneguy: Hugo Cinderbatch diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm index 3a25292f..3e3c62de 100644 --- a/code/modules/detectivework/forensics.dm +++ b/code/modules/detectivework/forensics.dm @@ -52,7 +52,7 @@ return else if(user.zone_sel.selecting == "mouth") user.visible_message("[user] swabs [M]'s mouth for a saliva sample.", "You swab [M]'s mouth for a saliva sample.") - dna = M.dna.unique_enzymes + dna += M.dna.unique_enzymes used = 1 name = "swab of [M]'s DNA" desc = "[initial(desc)]
\blue The label on the vial reads 'Sample of [M]'s DNA'." diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index caf8add0..fdd61959 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -44,6 +44,7 @@ /mob/living/simple_animal/hostile/giant_spider/death() total_spiders -= 1 + lying = 1 if(total_spiders <= (MAX_SPIDERS - 2) && !spider_can_spawn) spider_can_spawn = 1 if(total_spiders < 0) //Admin mess around protection @@ -53,6 +54,7 @@ /mob/living/simple_animal/hostile/giant_spider/Life() //Checks to see if spider has been respawned from var edits if(stat == DEAD) if(health > 0) + lying = 0 total_spiders += 1 ..() diff --git a/code/modules/projectiles/guns/energy/lawgiver.dm b/code/modules/projectiles/guns/energy/lawgiver.dm index 95dcf444..75a6f69e 100644 --- a/code/modules/projectiles/guns/energy/lawgiver.dm +++ b/code/modules/projectiles/guns/energy/lawgiver.dm @@ -24,6 +24,7 @@ else src.dna = user.dna.unique_enzymes user << "\blue You feel your palm heat up as the gun reads your DNA profile." + desc += "
Linked to: [user.real_name]" Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0) if(src.dna != user.dna.unique_enzymes) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 861c8f58..cd98d474 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -153,15 +153,17 @@ /obj/structure/reagent_dispensers/fueltank/attack_ghost(mob/user as mob) if(user.client && user.client.inquisitive_ghost) examine() - if(!src.defuse && user.client.holder) + if(!user.client.holder) + return + if(!src.defuse && ((user.client.holder.rights & R_ADMIN) || (user.client.holder.rights & R_MOD))) src.defuse = 1 - message_admins("[key_name_admin(user)] defused fueltank at ([loc.x],[loc.y],[loc.z]).") - message_mods("[key_name_admin(user)] defused fueltank at ([loc.x],[loc.y],[loc.z]).") + message_admins("[key_name_admin(user)] defused fueltank at ([loc.x],[loc.y],[loc.z]).") + message_mods("[key_name_admin(user)] defused fueltank at ([loc.x],[loc.y],[loc.z]).") else - if(!src.armed && user.client.holder) + if(!src.armed && ((user.client.holder.rights & R_ADMIN) || (user.client.holder.rights & R_MOD))) src.defuse = 0 - message_admins("[key_name_admin(user)] reset fuse on fueltank at ([loc.x],[loc.y],[loc.z]).") - message_mods("[key_name_admin(user)] reset fuse on fueltank at ([loc.x],[loc.y],[loc.z]).") + message_admins("[key_name_admin(user)] reset fuse on fueltank at ([loc.x],[loc.y],[loc.z]).") + message_mods("[key_name_admin(user)] reset fuse on fueltank at ([loc.x],[loc.y],[loc.z]).") /obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 69dd0019..3b6eba4b 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -154,13 +154,13 @@ if(damage > explosion_point) for(var/mob/living/mob in living_mob_list) - if(loc.z == mob.loc.z) - if(istype(mob, /mob/living/carbon/human)) - //Hilariously enough, running into a closet should make you get hit the hardest. - var/mob/living/carbon/human/H = mob - H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) - var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) - mob.apply_effect(rads, IRRADIATE) + if(istype(mob, /mob/living/carbon/human)) + if(mob.loc.z != src.z) + continue + //Hilariously enough, running into a closet should make you get hit the hardest. + mob:hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) + var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) + mob.apply_effect(rads, IRRADIATE) explode() else @@ -204,8 +204,16 @@ equilibrium_power = 250 icon_state = base_icon_state +<<<<<<< HEAD temp_factor = ( (equilibrium_power/DECAY_FACTOR)**3 )/800 power = max( (removed.temperature * temp_factor) * oxygen + power, 0) +======= + //Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock + //is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall. + + var/thermal_power = THERMAL_RELEASE_MODIFIER + if(removed.total_moles < 35) thermal_power += 750 //If you don't add coolant, you are going to have a bad time. +>>>>>>> master //We've generated power, now let's transfer it to the collectors for storing/usage transfer_energy() @@ -368,4 +376,4 @@ return /obj/machinery/power/supermatter/RepelAirflowDest(n) - return \ No newline at end of file + return diff --git a/html/changelog.html b/html/changelog.html index d62ad193..ebe6cc0f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,42 @@ should be listed in the changelog upon commit though. Thanks. --> +
+

4 November 2014

+

updated:

+ +
+ +

08 October 2014

SoundScopes updated: