diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 6a603bd7235..166083b36ff 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -25,9 +25,9 @@ SUBSYSTEM_DEF(jobs) // Only fires every 5 minutes /datum/controller/subsystem/jobs/fire() if(!config.sql_enabled || !config.use_exp_tracking) - return + return update_exp(5,0) - + /datum/controller/subsystem/jobs/proc/SetupOccupations(var/list/faction = list("Station")) occupations = list() var/list/all_jobs = subtypesof(/datum/job) @@ -284,7 +284,7 @@ SUBSYSTEM_DEF(jobs) //Get the players who are ready for(var/mob/new_player/player in GLOB.player_list) - if(player.ready && player.mind && !player.mind.assigned_role) + if(player.ready && player.has_valid_preferences() && player.mind && !player.mind.assigned_role) unassigned += player if(player.client.prefs.randomslot) player.client.prefs.load_random_character_slot(player.client) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index f844bf7346b..adb3167d8e4 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1019,16 +1019,6 @@ return holder.Topic(href, list("makeai"=href_list["makeai"])) - else if(href_list["makemask"]) - if(!check_rights(R_SPAWN)) return - var/mob/currentMob = locateUID(href_list["makemask"]) - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return - if(!currentMob) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("makemask"=href_list["makemask"])) - - else if(href_list["setspecies"]) if(!check_rights(R_SPAWN)) return diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 4f583abdfed..e344c2b2029 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -228,7 +228,7 @@ // Assemble a list of active players without jobbans. for(var/mob/new_player/player in GLOB.player_list) - if(player.client && player.ready) + if(player.client && player.ready && player.has_valid_preferences()) if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, roletext)) if(player_old_enough_antag(player.client,role)) players += player diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 0c7e4a509f3..a566f208082 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -65,8 +65,8 @@ /obj/item/areaeditor/permit/create_area() - ..() - qdel(src) + if(..()) + qdel(src) //free golem blueprints, like permit but can claim as much as needed @@ -186,25 +186,26 @@ /obj/item/areaeditor/proc/create_area() + var/area_created = FALSE var/res = detect_room(get_turf(usr)) if(!istype(res,/list)) switch(res) if(ROOM_ERR_SPACE) to_chat(usr, "The new area must be completely airtight.") - return + return area_created if(ROOM_ERR_TOOLARGE) to_chat(usr, "The new area is too large.") - return + return area_created else to_chat(usr, "Error! Please notify administration.") - return + return area_created var/list/turf/turfs = res var/str = trim(stripped_input(usr,"New area name:", "Blueprint Editing", "", MAX_NAME_LEN)) if(!str || !length(str)) //cancel - return + return area_created if(length(str) > 50) to_chat(usr, "The given name is too long. The area remains undefined.") - return + return area_created var/area/A = new A.name = str A.power_equip = FALSE @@ -220,7 +221,8 @@ thing.change_area(old_area, A) interact() - return + area_created = TRUE + return area_created /obj/item/areaeditor/proc/edit_area() var/area/A = get_area() diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 0e440e12f16..134a0767024 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -39,8 +39,7 @@ return T.attackby(C, user) //hand this off to the turf instead (for building plating, catwalks, etc) /obj/structure/lattice/deconstruct(disassembled = TRUE) - if(!can_deconstruct) - new /obj/item/stack/rods(get_turf(src), number_of_rods) + new /obj/item/stack/rods(get_turf(src), number_of_rods) qdel(src) /obj/structure/lattice/blob_act() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index c9c03303f7e..a6f186dad73 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -167,7 +167,6 @@ var/global/nologevent = 0 body += "Is an AI " else if(ishuman(M)) body += {"Make AI | - Make Mask | Make Robot | Make Alien | Make Slime | diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 75e0f549a1d..9c310fc29ee 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -81,7 +81,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/lastchangelog = "" //Saved changlog filesize to detect if there was a change var/exp var/ooccolor = "#b82e00" - var/be_special = list() //Special role selection + var/list/be_special = list() //Special role selection var/UI_style = "Midnight" var/nanoui_fancy = TRUE var/toggles = TOGGLES_DEFAULT @@ -2280,3 +2280,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts /datum/preferences/proc/close_load_dialog(mob/user) user << browse(null, "window=saves") + +//Check if the user has ANY job selected. +/datum/preferences/proc/check_any_job() + return(job_support_high || job_support_med || job_support_low || job_medsci_high || job_medsci_med || job_medsci_low || job_engsec_high || job_engsec_med || job_engsec_low || job_karma_high || job_karma_med || job_karma_low) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index cc6c6115097..52f188a9d1d 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -319,6 +319,8 @@ else if(href_list["create"]) var/amount = (text2num(href_list["amount"])) + //Can't be outside these (if you change this keep a sane limit) + amount = Clamp(amount, 1, 10) var/datum/design/D = locate(href_list["create"]) create_product(D, amount) updateUsrDialog() diff --git a/code/modules/mining/explorer_gear.dm b/code/modules/mining/explorer_gear.dm index f6184e2e2b3..a9464efe959 100644 --- a/code/modules/mining/explorer_gear.dm +++ b/code/modules/mining/explorer_gear.dm @@ -13,6 +13,7 @@ armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) resistance_flags = FIRE_PROOF + hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi', diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bc0c33c233d..e46068c8a74 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1480,19 +1480,22 @@ if(usr != src) return 0 //something is terribly wrong - + if(incapacitated()) + to_chat(src, "You can't write on the floor in your current state!") + return if(!bloody_hands) verbs -= /mob/living/carbon/human/proc/bloody_doodle - if(src.gloves) - to_chat(src, "Your [src.gloves] are getting in the way.") + if(gloves) + to_chat(src, "[gloves] are preventing you from writing anything down!") return - var/turf/simulated/T = src.loc + var/turf/simulated/T = loc if(!istype(T)) //to prevent doodling out of mechs and lockers to_chat(src, "You cannot reach the floor.") return + var/turf/origin = T var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West") if(direction != "Here") T = get_step(T,text2dir(direction)) @@ -1510,7 +1513,9 @@ var/max_length = bloody_hands * 30 //tweeter style var/message = stripped_input(src,"Write a message. It cannot be longer than [max_length] characters.","Blood writing", "") - + if(origin != loc) + to_chat(src, "Stay still while writing!") + return if(message) var/used_blood_amount = round(length(message) / 30, 1) bloody_hands = max(0, bloody_hands - used_blood_amount) //use up some blood @@ -1518,7 +1523,8 @@ if(length(message) > max_length) message += "-" to_chat(src, "You ran out of blood to write with!") - + else + to_chat(src, "You daub '[message]' on [T] in shiny red lettering.") var/obj/effect/decal/cleanable/blood/writing/W = new(T) W.message = message W.add_fingerprint(src) @@ -1935,7 +1941,6 @@ Eyes need to have significantly high darksight to shine unless the mob has the X . += "---" .["Set Species"] = "?_src_=vars;setspecies=[UID()]" .["Make AI"] = "?_src_=vars;makeai=[UID()]" - .["Make Mask of Nar'sie"] = "?_src_=vars;makemask=[UID()]" .["Make cyborg"] = "?_src_=vars;makerobot=[UID()]" .["Make monkey"] = "?_src_=vars;makemonkey=[UID()]" .["Make alien"] = "?_src_=vars;makealien=[UID()]" diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 85a0f886fee..a26131b9504 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -638,5 +638,26 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) // Cast to 1/0 return !!(client.prefs.toggles & toggleflag) +// Used to make sure that a player has a valid job preference setup, used to knock players out of eligibility for anything if their prefs don't make sense. +// A "valid job preference setup" in this situation means at least having one job set to low, or not having "return to lobby" enabled +// Prevents "antag rolling" by setting antag prefs on, all jobs to never, and "return to lobby if preferences not availible" +// Doing so would previously allow you to roll for antag, then send you back to lobby if you didn't get an antag role +// This also does some admin notification and logging as well +/mob/proc/has_valid_preferences() + if(!client) + return FALSE //Not sure how this would get run without the mob having a client, but let's just be safe. + if(client.prefs.alternate_option != RETURN_TO_LOBBY) + return TRUE + // If they have antags enabled, they're potentially doing this on purpose instead of by accident. Notify admins if so. + var/has_antags = FALSE + if(client.prefs.be_special.len > 0) + has_antags = TRUE + if(!client.prefs.check_any_job()) + to_chat(src, "You have no jobs enabled, along with return to lobby if job is unavailable. This makes you ineligible for any round start role, please update your job preferences.") + if(has_antags) + log_admin("[src.ckey] just got booted back to lobby with no jobs, but antags enabled.") + message_admins("[src.ckey] just got booted back to lobby with no jobs enabled, but antag rolling enabled. Likely antag rolling abuse.") + return FALSE //This is the only case someone should actually be completely blocked from antag rolling as well + return TRUE #define isterrorspider(A) (istype((A), /mob/living/simple_animal/hostile/poison/terror_spider)) diff --git a/html/changelog.html b/html/changelog.html index 1d3eb4038b5..d98359137e3 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,262 @@ -->
+

30 June 2019

+

Crazylemon64 updated:

+ + +

28 June 2019

+

AffectedArc07 updated:

+ +

Akatos updated:

+ +

Arkatos updated:

+ +

Christasmurf updated:

+ +

Citinited updated:

+ +

Couls updated:

+ +

EmanTheAlmighty updated:

+ +

Evankhell561 updated:

+ +

Fethas updated:

+ +

Fox McCloud updated:

+ +

Improvedname updated:

+ +

Kyep updated:

+ +

Markolie updated:

+ +

Markolie and Ionward updated:

+ +

Ported by Markolie and CornMyCob. Developed by many /tg/ coders updated:

+ +

Shadeykins updated:

+ +

TDSSS updated:

+ +

Tayyyyyyy updated:

+ +

Terilia updated:

+ +

Ty-Omaha updated:

+ +

craftxbox updated:

+ +

datlo updated:

+ +

dovydas12345 updated:

+ +

farie82 updated:

+ +

iantine updated:

+ +

uc_guy updated:

+ +

10 May 2019

AffectedArc07 updated: