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. -->
+