diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index f7c45b1d766..409884ea627 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -162,6 +162,7 @@ var/list/gamemode_cache = list() var/animal_delay = 0 + var/auto_local_admin = FALSE var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database @@ -365,6 +366,9 @@ var/list/gamemode_cache = list() if(type == "config") switch (name) + if ("auto_local_admin") + config.auto_local_admin = TRUE + if ("admin_legacy_system") config.admin_legacy_system = 1 diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 822bcf5af5a..82d32b9a959 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -108,7 +108,7 @@ /obj/item/device/encryptionkey/heads/captain name = "captain's encryption key" icon_state = "cap_cypherkey" - channels = list(CHANNEL_COMMAND = TRUE, CHANNEL_SECURITY = TRUE, CHANNEL_PENAL = TRUE, CHANNEL_ENGINEERING = FALSE, CHANNEL_SCIENCE = FALSE, CHANNEL_MEDICAL = FALSE, CHANNEL_SUPPLY = FALSE, CHANNEL_SERVICE = FALSE) + channels = list(CHANNEL_COMMAND = TRUE, CHANNEL_SECURITY = TRUE, CHANNEL_PENAL = TRUE, CHANNEL_ENGINEERING = TRUE, CHANNEL_SCIENCE = TRUE, CHANNEL_MEDICAL = TRUE, CHANNEL_SUPPLY = TRUE, CHANNEL_SERVICE = TRUE) /obj/item/device/encryptionkey/heads/ai_integrated name = "ai integrated encryption key" @@ -139,7 +139,7 @@ /obj/item/device/encryptionkey/heads/hop name = "head of personnel's encryption key" icon_state = "hop_cypherkey" - channels = list(CHANNEL_SUPPLY = TRUE, CHANNEL_SERVICE = TRUE, CHANNEL_COMMAND = TRUE, CHANNEL_SECURITY = FALSE, CHANNEL_PENAL = FALSE) + channels = list(CHANNEL_SUPPLY = TRUE, CHANNEL_SERVICE = TRUE, CHANNEL_COMMAND = TRUE, CHANNEL_SECURITY = TRUE, CHANNEL_PENAL = TRUE) /obj/item/device/encryptionkey/headset_cargo name = "supply radio encryption key" diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index 8ad81e92e26..cbc1411ec33 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -100,6 +100,16 @@ update_icon() return +/obj/item/glass_jar/MouseDrop(atom/over) + if(usr != over || use_check_and_message(usr)) + return + if(length(contained)) + switch(contains) + if(JAR_GUMBALL) + release(contained[1], usr) + usr.put_in_hands(contained[1]) + contained -= contained[1] + /obj/item/glass_jar/attackby(var/atom/A, var/mob/user, var/proximity) if(istype(A, /obj/item/spacecash)) var/obj/item/spacecash/S = A diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 57a230d40b4..30a06fe2cad 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -188,7 +188,7 @@ L.visible_message("[L] has been prodded with \the [src] by [user]!") //stun effects - L.stun_effect_act(stun, agony, target_zone, src) + L.stun_effect_act(stun, agony, used_weapon = src, damage_flags = DAM_DISPERSED) playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 26f23e5d5a1..b5ed07b7244 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -1,3 +1,8 @@ +var/list/localhost_addresses = list( + "127.0.0.1" = TRUE, + "::1" = TRUE +) + //////////// //SECURITY// //////////// @@ -392,6 +397,13 @@ /client/proc/InitClient() to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") + var/local_connection = (config.auto_local_admin && !config.use_forumuser_api && (isnull(address) || localhost_addresses[address])) + // Automatic admin rights for people connecting locally. + // Concept stolen from /tg/ with deepest gratitude. + // And ported from Nebula with love. + if(local_connection && !admin_datums[ckey]) + new /datum/admins("Local Host", R_ALL, ckey) + //Admin Authorisation holder = admin_datums[ckey] if(holder) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index c16b6dd6dda..e2572c43e6a 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -347,7 +347,7 @@ /obj/item/rig_module/chem_dispenser/injector/paramedic //downgraded version charges = list( list("tricordrazine", "tricordrazine", /decl/reagent/tricordrazine, 40), - list("mortaphenyl", "mortaphenyl", /decl/reagent/mortaphenyl, 40), + list("perconol", "perconol", /decl/reagent/perconol, 40), list("dexalin", "dexalin", /decl/reagent/dexalin, 40), list("inaprovaline", "inaprovaline", /decl/reagent/inaprovaline, 40) ) diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index bc805048277..bdb37b80da1 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -1,6 +1,5 @@ // Interface for humans. /obj/item/rig/verb/hardsuit_interface() - set name = "Open Hardsuit Interface" set desc = "Open the hardsuit system interface." set category = "Hardsuit" @@ -10,28 +9,27 @@ ui_interact(usr) /obj/item/rig/verb/toggle_vision() - set name = "Toggle Visor" set desc = "Turns your rig visor off or on." set category = "Hardsuit" set src = usr.contents if(!istype(wearer) || !wearer.back == src) - to_chat(usr, "The hardsuit is not being worn.") + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) return if(!check_power_cost(usr)) return if(canremove) - to_chat(usr, "The suit is not active.") + to_chat(usr, SPAN_WARNING("The suit is not active.")) return if(!check_suit_access(usr)) return if(!visor) - to_chat(usr, "The hardsuit does not have a configurable visor.") + to_chat(usr, SPAN_WARNING("The hardsuit does not have a configurable visor.")) return if(!visor.active) @@ -40,14 +38,16 @@ visor.deactivate(usr) /obj/item/rig/proc/toggle_helmet() - set name = "Toggle Helmet" set desc = "Deploys or retracts your helmet." set category = "Hardsuit" set src = usr.contents if(!istype(wearer) || !wearer.back == src) - to_chat(usr, "The hardsuit is not being worn.") + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) + return + + if(use_check_and_message(usr)) return if(!check_suit_access(usr)) @@ -56,26 +56,34 @@ toggle_piece("helmet",wearer) /obj/item/rig/proc/toggle_chest() - set name = "Toggle Chestpiece" set desc = "Deploys or retracts your chestpiece." set category = "Hardsuit" set src = usr.contents + if(!istype(wearer) || !wearer.back == src) + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) + return + + if(use_check_and_message(usr)) + return + if(!check_suit_access(usr)) return toggle_piece(BP_CHEST,wearer) /obj/item/rig/proc/toggle_gauntlets() - set name = "Toggle Gauntlets" set desc = "Deploys or retracts your gauntlets." set category = "Hardsuit" set src = usr.contents if(!istype(wearer) || !wearer.back == src) - to_chat(usr, "The hardsuit is not being worn.") + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) + return + + if(use_check_and_message(usr)) return if(!check_suit_access(usr)) @@ -84,14 +92,16 @@ toggle_piece("gauntlets",wearer) /obj/item/rig/proc/toggle_boots() - set name = "Toggle Boots" set desc = "Deploys or retracts your boots." set category = "Hardsuit" set src = usr.contents if(!istype(wearer) || !wearer.back == src) - to_chat(usr, "The hardsuit is not being worn.") + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) + return + + if(use_check_and_message(usr)) return if(!check_suit_access(usr)) @@ -100,14 +110,16 @@ toggle_piece("boots",wearer) /obj/item/rig/verb/deploy_suit() - set name = "Deploy Hardsuit" set desc = "Deploys helmet, gloves and boots." set category = "Hardsuit" set src = usr.contents if(!istype(wearer) || !wearer.back == src) - to_chat(usr, "The hardsuit is not being worn.") + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) + return + + if(use_check_and_message(usr)) return if(!check_suit_access(usr)) @@ -119,14 +131,16 @@ deploy(wearer) /obj/item/rig/verb/toggle_seals_verb() - set name = "Toggle Hardsuit" set desc = "Activates or deactivates your rig." set category = "Hardsuit" set src = usr.contents if(!istype(wearer) || !wearer.back == src) - to_chat(usr, "The hardsuit is not being worn.") + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) + return + + if(use_check_and_message(usr)) return if(!check_suit_access(usr)) @@ -135,7 +149,6 @@ toggle_seals(wearer) /obj/item/rig/verb/switch_vision_mode() - set name = "Switch Vision Mode" set desc = "Switches between available vision modes." set category = "Hardsuit" @@ -148,24 +161,23 @@ return if(canremove) - to_chat(usr, "The suit is not active.") + to_chat(usr, SPAN_WARNING("The suit is not active.")) return if(!visor) - to_chat(usr, "The hardsuit does not have a configurable visor.") + to_chat(usr, SPAN_WARNING("The hardsuit does not have a configurable visor.")) return if(!visor.active) visor.activate(usr) if(!visor.active) - to_chat(usr, "The visor is suffering a hardware fault and cannot be configured.") + to_chat(usr, SPAN_WARNING("The visor is suffering a hardware fault and cannot be configured.")) return visor.engage(null, usr) /obj/item/rig/verb/alter_voice() - set name = "Configure Voice Synthesiser" set desc = "Toggles or configures your voice synthesizer." set category = "Hardsuit" @@ -175,21 +187,20 @@ return if(canremove) - to_chat(usr, "The suit is not active.") + to_chat(usr, SPAN_WARNING("The suit is not active.")) return if(!istype(wearer) || !wearer.back == src) - to_chat(usr, "The hardsuit is not being worn.") + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) return if(!speech) - to_chat(usr, "The hardsuit does not have a speech synthesiser.") + to_chat(usr, SPAN_WARNING("The hardsuit does not have a speech synthesiser.")) return speech.engage(null, usr) /obj/item/rig/verb/select_module() - set name = "Select Module" set desc = "Selects a module as your primary system." set category = "Hardsuit" @@ -202,11 +213,11 @@ return if(canremove) - to_chat(usr, "The suit is not active.") + to_chat(usr, SPAN_WARNING("The suit is not active.")) return if(!istype(wearer) || !wearer.back == src) - to_chat(usr, "The hardsuit is not being worn.") + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) return var/list/selectable = list() @@ -218,14 +229,13 @@ if(!istype(module)) selected_module = null - to_chat(usr, "Primary system is now: deselected.") + to_chat(usr, SPAN_NOTICE("Primary system is now: deselected.")) return selected_module = module - to_chat(usr, "Primary system is now: [selected_module.interface_name].") + to_chat(usr, SPAN_NOTICE("Primary system is now: [selected_module.interface_name].")) /obj/item/rig/verb/toggle_module() - set name = "Toggle Module" set desc = "Toggle a system module." set category = "Hardsuit" @@ -238,11 +248,11 @@ return if(canremove) - to_chat(usr, "The suit is not active.") + to_chat(usr, SPAN_WARNING("The suit is not active.")) return if(!istype(wearer) || !wearer.back == src) - to_chat(usr, "The hardsuit is not being worn.") + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) return var/list/selectable = list() @@ -263,7 +273,6 @@ module.activate(usr) /obj/item/rig/verb/engage_module() - set name = "Engage Module" set desc = "Engages a system module." set category = "Hardsuit" @@ -273,11 +282,11 @@ return if(canremove) - to_chat(usr, "The suit is not active.") + to_chat(usr, SPAN_WARNING("The suit is not active.")) return if(!istype(wearer) || !wearer.back == src) - to_chat(usr, "The hardsuit is not being worn.") + to_chat(usr, SPAN_WARNING("The hardsuit is not being worn.")) return if(!check_power_cost(usr, 0, 0, 0, 0)) diff --git a/code/modules/clothing/spacesuits/rig/suits/combat.dm b/code/modules/clothing/spacesuits/rig/suits/combat.dm index 84e3bb893dd..5c4006ad900 100644 --- a/code/modules/clothing/spacesuits/rig/suits/combat.dm +++ b/code/modules/clothing/spacesuits/rig/suits/combat.dm @@ -1,6 +1,6 @@ /obj/item/rig/combat name = "combat hardsuit control module" - desc = "A sleek and dangerous hardsuit for active combat." + desc = "A sleek and dangerous hardsuit for active combat. This one is a Stellar Corporate Conglomerate design in color scheme and make." icon_state = "combat_rig" suit_type = "combat hardsuit" armor = list( @@ -40,7 +40,7 @@ /obj/item/rig/military name = "military hardsuit control module" - desc = "A powerful hardsuit designed for military operations." + desc = "A powerful hardsuit designed for military operations. This is coated in Solarian military colors." icon_state = "military_rig" suit_type = "military hardsuit" armor = list( diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index 9ec99723b72..1ee53080951 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -10,6 +10,7 @@ emp_protection = 35 helm_type = /obj/item/clothing/head/helmet/space/rig/ert req_access = list(access_cent_specops) + species_restricted = list(BODYTYPE_SKRELL,BODYTYPE_HUMAN) armor = list( melee = ARMOR_MELEE_MAJOR, bullet = ARMOR_BALLISTIC_PISTOL, @@ -112,30 +113,6 @@ ) allowed_module_types = MODULE_GENERAL | MODULE_LIGHT_COMBAT | MODULE_HEAVY_COMBAT | MODULE_SPECIAL -/obj/item/rig/ert/janitor - name = "ERT-J suit control module" - desc = "A suit worn by the janitoral division of an Emergency Response Team. Has purple highlights. Less armored than security the variant, but offers full radiation protection." - suit_type = "ERT janitor" - icon_state = "ert_janitor_rig" - initial_modules = list( - /obj/item/rig_module/ai_container, - /obj/item/rig_module/maneuvering_jets, - /obj/item/rig_module/fabricator/sign, - /obj/item/rig_module/grenade_launcher/cleaner, - /obj/item/rig_module/device/decompiler, - /obj/item/rig_module/actuators - ) - armor = list( - melee = ARMOR_MELEE_MAJOR, - bullet = ARMOR_BALLISTIC_PISTOL, - laser = ARMOR_LASER_SMALL, - energy = ARMOR_ENERGY_SMALL, - bomb = ARMOR_BOMB_PADDED, - bio = ARMOR_BIO_SHIELDED, - rad = ARMOR_RAD_SHIELDED - ) - allowed_module_types = MODULE_GENERAL | MODULE_LIGHT_COMBAT | MODULE_HEAVY_COMBAT | MODULE_SPECIAL - /obj/item/rig/ert/assetprotection name = "heavy asset protection suit control module" desc = "A heavy suit worn by the highest level of Asset Protection, don't mess with the person wearing this. Armored and space ready." diff --git a/code/modules/ghostroles/spawner/human/responseteams/nt_ert.dm b/code/modules/ghostroles/spawner/human/responseteams/nt_ert.dm index 1e6e0b1ac30..ef28ac6951d 100644 --- a/code/modules/ghostroles/spawner/human/responseteams/nt_ert.dm +++ b/code/modules/ghostroles/spawner/human/responseteams/nt_ert.dm @@ -6,6 +6,7 @@ max_count = 2 outfit = /datum/outfit/admin/ert/nanotrasen mob_name_prefix = "Tpr. " + possible_species = list(SPECIES_HUMAN, SPECIES_SKRELL) spawnpoints = list("NTERTSpawn") /datum/ghostspawner/human/ert/nanotrasen/specialist @@ -27,5 +28,4 @@ short_name = "ntlead" desc = "The leader of the Nanotrasen Phoenix ERT." max_count = 1 - mob_name_prefix = "L/Tpr. " - possible_species = list(SPECIES_HUMAN, SPECIES_SKRELL) \ No newline at end of file + mob_name_prefix = "L/Tpr. " \ No newline at end of file diff --git a/code/modules/heavy_vehicle/interface/screen_objects.dm b/code/modules/heavy_vehicle/interface/screen_objects.dm index 89a8ad697ad..4c37074d9f9 100644 --- a/code/modules/heavy_vehicle/interface/screen_objects.dm +++ b/code/modules/heavy_vehicle/interface/screen_objects.dm @@ -270,15 +270,19 @@ maptext = "CLOSE" maptext_x = 3 -/obj/screen/mecha/toggle/hatch_open/toggled() +/obj/screen/mecha/toggle/hatch_open/update_icon() + maptext = "[owner.hatch_closed ? "OPEN" : "CLOSE"]" + maptext_x = owner.hatch_closed ? 4 : 3 + +/obj/screen/mecha/toggle/hatch_open/toggled(var/notify_user = TRUE) if(owner.hatch_locked && owner.hatch_closed) notify_user(usr, SPAN_WARNING("You cannot open the hatch while it is locked.")) return toggled = !toggled owner.hatch_closed = toggled - maptext = "[owner.hatch_closed ? "OPEN" : "CLOSE"]" - maptext_x = owner.hatch_closed ? 4 : 3 - notify_user(usr, SPAN_NOTICE("The [owner.body.hatch_descriptor] is now [owner.hatch_closed ? "closed" : "open" ].")) + if(notify_user) + notify_user(usr, SPAN_NOTICE("The [owner.body.hatch_descriptor] is now [owner.hatch_closed ? "closed" : "open" ].")) + update_icon() owner.update_icon() // This is basically just a holder for the updates the mech does. diff --git a/code/modules/heavy_vehicle/mech_helpers.dm b/code/modules/heavy_vehicle/mech_helpers.dm index deb71d6aa0c..02956750f46 100644 --- a/code/modules/heavy_vehicle/mech_helpers.dm +++ b/code/modules/heavy_vehicle/mech_helpers.dm @@ -33,6 +33,9 @@ return TRUE +/mob/living/heavy_vehicle/get_standard_pixel_x() + return offset_x + /mob/living/heavy_vehicle/proc/toggle_maintenance_protocols() var/obj/screen/mecha/toggle/maint/M = locate() in hud_elements M.toggled() diff --git a/code/modules/heavy_vehicle/mech_interaction.dm b/code/modules/heavy_vehicle/mech_interaction.dm index c4474a7ab68..7a81c3824b1 100644 --- a/code/modules/heavy_vehicle/mech_interaction.dm +++ b/code/modules/heavy_vehicle/mech_interaction.dm @@ -165,12 +165,14 @@ return /mob/living/heavy_vehicle/setClickCooldown(var/timeout) + var/old_next_move = next_move next_move = max(world.time + timeout, next_move) for(var/hardpoint in hardpoint_hud_elements) var/obj/screen/mecha/hardpoint/H = hardpoint_hud_elements[hardpoint] if(H) H.color = "#FF0000" - addtimer(CALLBACK(src, .proc/reset_hardpoint_color), timeout) + if(next_move > old_next_move) // TIMER_OVERRIDE would not work here, because the smaller delays tend to be called after the longer ones + addtimer(CALLBACK(src, .proc/reset_hardpoint_color), timeout) /mob/living/heavy_vehicle/proc/reset_hardpoint_color() for(var/hardpoint in hardpoint_hud_elements) @@ -256,9 +258,7 @@ if(hatch_locked) if(!silent) to_chat(user, "The [body.hatch_descriptor] is locked.") return - hatch_closed = 0 - hud_open.update_icon() - update_icon() + hud_open.toggled(FALSE) if(!silent) to_chat(user, "You open the hatch and climb out of \the [src].") else @@ -609,7 +609,7 @@ say("Error, leader not found. Unassigning...") unassign_leader() return - if(speaker != resolved_leader || (speaker in pilots)) + if(speaker != resolved_leader && !(speaker in pilots)) return found_text = findtext(text, "set nickname to") diff --git a/code/modules/mining/ore_detector.dm b/code/modules/mining/ore_detector.dm index be8fdc39a64..3cdbd154702 100644 --- a/code/modules/mining/ore_detector.dm +++ b/code/modules/mining/ore_detector.dm @@ -1,3 +1,6 @@ +#define MINOR_ARTIFACTS "Minor Artifacts" // defined solely so someone doesn't typo it +#define MAJOR_ARTIFACTS "Major Artifacts" + /obj/item/ore_detector name = "ore detector" desc = "A device capable of locating and displaying ores to the average untrained hole explorer." @@ -45,6 +48,8 @@ var/ore/O = ore_data[ore_n] var/ore_name = O.display_name ore_names += ore_name + ore_names += MINOR_ARTIFACTS + ore_names += MAJOR_ARTIFACTS if(loc == user) var/datum/vueui/ui = SSvueui.get_open_ui(user, src) if(!ui) @@ -86,7 +91,7 @@ for(var/turf/simulated/mineral/mine_turf in RANGE_TURFS(7, our_turf)) if(isnull(our_user)) // in the event it's dropped midsweep return - if(mine_turf.mineral && (mine_turf.mineral.display_name in search_ores)) + if((length(mine_turf.finds) && (MINOR_ARTIFACTS in search_ores)) || (mine_turf.artifact_find && (MAJOR_ARTIFACTS in search_ores)) || (mine_turf.mineral && (mine_turf.mineral.display_name in search_ores))) var/image/ore_ping = image(icon = 'icons/obj/contained_items/tools/ore_scanner.dmi', icon_state = "signal_overlay", loc = our_turf, layer = OBFUSCATION_LAYER + 0.1) pixel_shift_to_turf(ore_ping, our_turf, mine_turf) M << ore_ping @@ -116,4 +121,7 @@ deactivate() /obj/item/ore_detector/on_give() - deactivate() \ No newline at end of file + deactivate() + +#undef MINOR_ARTIFACTS +#undef MAJOR_ARTIFACTS \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index faec9a7c33a..d046d426c88 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -377,9 +377,12 @@ This function restores all organs. return -/mob/living/carbon/human/proc/get_organ(var/zone) +/mob/living/carbon/human/proc/get_organ(var/zone, var/allow_no_result = FALSE) if(!zone) - zone = BP_CHEST + if(allow_no_result) + return + else + zone = BP_CHEST if (zone in list(BP_EYES, BP_MOUTH)) zone = BP_HEAD return organs_by_name[zone] @@ -390,7 +393,7 @@ This function restores all organs. to_chat(src, "You are now visible.") src.invisibility = 0 - var/obj/item/organ/external/organ = get_organ(def_zone) + var/obj/item/organ/external/organ = get_organ(def_zone, TRUE) if(!organ) if(isorgan(def_zone)) organ = def_zone @@ -430,7 +433,8 @@ This function restores all organs. return FALSE if(damage > 15 && prob(damage*4) && organ.can_feel_pain()) - make_adrenaline(round(damage/10)) + if(REAGENT_VOLUME(reagents, /decl/reagent/adrenaline) < 15) + make_adrenaline(round(damage/10)) switch(damagetype) if(BRUTE) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index fc43aba7691..59faf268fec 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -51,7 +51,7 @@ emp_act return blocked -/mob/living/carbon/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone) +/mob/living/carbon/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone, var/used_weapon, var/damage_flags) var/obj/item/organ/external/affected = get_organ(check_zone(def_zone)) var/siemens_coeff = get_siemens_coefficient_organ(affected) stun_amount *= siemens_coeff @@ -78,7 +78,7 @@ emp_act var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") visible_message("[src] [(!can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [affected.name]!") - ..(stun_amount, agony_amount, def_zone) + ..(stun_amount, agony_amount, def_zone, used_weapon, damage_flags) /mob/living/carbon/human/get_blocked_ratio(def_zone, damage_type, damage_flags, armor_pen, damage) if(!def_zone && (damage_flags & DAM_DISPERSED)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 92aa0b797c6..44185c04e11 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -87,7 +87,7 @@ return BULLET_IMPACT_MEAT //Handles the effects of "stun" weapons -/mob/living/proc/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone, var/used_weapon=null) +/mob/living/proc/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone, var/used_weapon, var/damage_flags) flash_pain(stun_amount) if(stun_amount) @@ -97,7 +97,7 @@ apply_effect(stun_amount, EYE_BLUR) if(agony_amount) - apply_damage(agony_amount, PAIN, def_zone, 0, used_weapon = used_weapon) + apply_damage(agony_amount, PAIN, def_zone, used_weapon, damage_flags) apply_effect(agony_amount / 10, STUTTER) apply_effect(agony_amount / 10, EYE_BLUR) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 15f690f0b77..c6716c4ec1e 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -260,7 +260,8 @@ var/list/global/organ_rel_size = list( ) /proc/check_zone(zone) - if(!zone) return BP_CHEST + if(!zone) + return BP_CHEST switch(zone) if(BP_EYES) zone = BP_HEAD diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 6492b5da40a..d0fffe3a961 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -981,59 +981,43 @@ obj/structure/cable/proc/cableColor(var/colorC) ////////////////////////////// // Nooses. ///////////////////////////// -/obj/item/stack/cable_coil/verb/make_noose(mob/user) +/obj/item/stack/cable_coil/verb/make_noose() set name = "Make Noose" set category = "Object" - var/mob/M = user - if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) - if(!istype(user.loc,/turf)) return - if(!(locate(/obj/item/stool) in user.loc) && !(locate(/obj/structure/bed) in user.loc) && !(locate(/obj/structure/table) in user.loc) && !(locate(/obj/structure/toilet) in user.loc)) - to_chat(user, SPAN_WARNING("You have to be standing on top of a chair/table/bed to make a noose!")) - return FALSE - if(src.amount <= 24) - to_chat(user, SPAN_WARNING("You need at least 25 lengths to make a noose!")) - return - user.visible_message(SPAN_WARNING("[user] starts winding some cable together to make a noose, tying it to the ceiling!"), - SPAN_NOTICE("You start to wind some cable together to make a noose, tying it to the ceiling.")) - if(do_after(user, 250)) - new/obj/structure/noose(user.loc, color) - to_chat(user, SPAN_NOTICE("You wind some cable together to make a noose, tying it to the ceiling.")) - playsound(user.loc, 'sound/effects/noose_idle.ogg', 50, 1, -3) - src.use(25) - else - to_chat(user, SPAN_WARNING("You cannot do that.")) + if(use_check_and_message(usr, USE_DISALLOW_SILICONS)) + return + + if(!isturf(usr.loc)) + return + if(!(locate(/obj/item/stool) in usr.loc) && !(locate(/obj/structure/bed) in usr.loc) && !(locate(/obj/structure/table) in usr.loc) && !(locate(/obj/structure/toilet) in usr.loc)) + to_chat(usr, SPAN_WARNING("You have to be standing on top of a chair/table/bed to make a noose!")) + return FALSE + if(amount < 25) + to_chat(usr, SPAN_WARNING("You need at least 25 lengths to make a noose!")) + return + usr.visible_message(SPAN_WARNING("[usr] starts winding some cable together to make a noose, tying it to the ceiling!"), + SPAN_NOTICE("You start to wind some cable together to make a noose, tying it to the ceiling.")) + if(do_after(usr, 250)) + new /obj/structure/noose(usr.loc, color) + to_chat(usr, SPAN_NOTICE("You wind some cable together to make a noose, tying it to the ceiling.")) + playsound(usr.loc, 'sound/effects/noose_idle.ogg', 50, 1, -3) + use(25) /obj/structure/noose name = "noose" desc = "A morbid apparatus." icon_state = "noose" - buckle_lying = 0 + buckle_lying = FALSE icon = 'icons/obj/noose.dmi' - anchored = 1 - can_buckle = 1 + anchored = TRUE layer = 5 - color = null var/image/over = null var/ticks = 0 -/obj/structure/noose/attackby(obj/item/I, mob/user, params) - if(I.iswirecutter()) - user.visible_message("[user] cuts the noose.", - SPAN_NOTICE("You cut the noose.")) - playsound(src.loc, 'sound/items/wirecutter.ogg', 50, 1) - if(istype(buckled, /mob/living)) - var/mob/living/M = buckled - M.visible_message(SPAN_DANGER("[M] falls over and hits the ground!"),\ - SPAN_DANGER("You fall over and hit the ground!")) - M.adjustBruteLoss(10) - new/obj/item/stack/cable_coil(get_turf(src), 25, color) - qdel(src) - return - ..() - /obj/structure/noose/Initialize(mapload, param_color = null) . = ..() + can_buckle = list(/mob/living/carbon/human) pixel_y += 16 //Noose looks like it's "hanging" in the air over = image(icon, "noose_overlay") over.layer = MOB_LAYER + 0.1 @@ -1046,6 +1030,20 @@ obj/structure/cable/proc/cableColor(var/colorC) STOP_PROCESSING(SSprocessing, src) return ..() +/obj/structure/noose/attackby(obj/item/I, mob/user, params) + if(I.iswirecutter()) + user.visible_message("[user] cuts \the [src].", SPAN_NOTICE("You cut \the [src].")) + playsound(src.loc, 'sound/items/wirecutter.ogg', 50, 1) + if(istype(buckled, /mob/living)) + var/mob/living/M = buckled + M.visible_message(SPAN_DANGER("[M] falls over and hits the ground!"),\ + SPAN_DANGER("You fall over and hit the ground!")) + M.adjustBruteLoss(10) + new /obj/item/stack/cable_coil(get_turf(src), 25, color) + qdel(src) + return + ..() + /obj/structure/noose/post_buckle(mob/living/M) if(M == buckled) layer = MOB_LAYER diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 6691d6de353..b8d3c53d3a1 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -640,14 +640,14 @@ message = "Your face and throat burn!" if(prob(25)) M.visible_message("[M] [pick("coughs!","coughs hysterically!","splutters!")]") - M.apply_effect(40, PAIN, 0) + M.apply_effect(30, PAIN) /decl/reagent/capsaicin/condensed/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) if(ishuman(M)) var/mob/living/carbon/human/H = M if(!H.can_feel_pain()) return - M.apply_effect(4, PAIN, 0) + M.apply_effect(10, PAIN) if(prob(5)) M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]", "You feel like your insides are burning!") if(istype(M, /mob/living/carbon/slime)) diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/research/xenoarchaeology/misc.dm index 774f5f8378a..8c8ca46034a 100644 --- a/code/modules/research/xenoarchaeology/misc.dm +++ b/code/modules/research/xenoarchaeology/misc.dm @@ -87,24 +87,22 @@ icon_closed = "toolcloset" icon_opened = "toolclosetopen" - New() - ..() - sleep(2) - new /obj/item/storage/belt/archaeology(src) - new /obj/item/storage/box/excavation(src) - new /obj/item/device/flashlight/lantern(src) - new /obj/item/device/ano_scanner(src) - new /obj/item/device/depth_scanner(src) - new /obj/item/device/core_sampler(src) - new /obj/item/device/gps(src) - new /obj/item/device/beacon_locator(src) - new /obj/item/device/radio/beacon(src) - new /obj/item/pickaxe(src) - new /obj/item/device/measuring_tape(src) - new /obj/item/pickaxe/hand(src) - new /obj/item/storage/bag/fossils(src) - new /obj/item/device/hand_labeler(src) - return +/obj/structure/closet/excavation/fill() + new /obj/item/storage/belt/archaeology(src) + new /obj/item/storage/box/excavation(src) + new /obj/item/device/flashlight/lantern(src) + new /obj/item/device/ano_scanner(src) + new /obj/item/device/depth_scanner(src) + new /obj/item/device/core_sampler(src) + new /obj/item/device/gps(src) + new /obj/item/device/beacon_locator(src) + new /obj/item/device/radio/beacon(src) + new /obj/item/pickaxe(src) + new /obj/item/device/measuring_tape(src) + new /obj/item/pickaxe/hand(src) + new /obj/item/storage/bag/fossils(src) + new /obj/item/device/hand_labeler(src) + new /obj/item/ore_detector(src) //---- Isolation room air alarms diff --git a/config/example/config.txt b/config/example/config.txt index 1540417b577..0209196b205 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -10,6 +10,9 @@ ALERT_RED_UPTO There is an immediate serious threat to the station. Security may ALERT_RED_DOWNTO The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised. ALERT_DELTA The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill. +## Add a # in front of this to disable automatic admin rights for users connecting from the host the server is running on. +AUTO_LOCAL_ADMIN + ## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. ADMIN_LEGACY_SYSTEM diff --git a/html/changelog.html b/html/changelog.html index 780358863f9..4a5b199ed46 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,6 +35,36 @@ -->
+

23 February 2021

+

Geeves updated:

+ +

MattAtlas updated:

+ +

WickedCybs updated:

+ + +

22 February 2021

+

Geeves updated:

+ +

21 February 2021

Geeves updated:

+

Kyres1 updated:

+

MattAtlas updated:

WickedCybs updated: