diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 46539d51ed3..239c3e88017 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -30,10 +30,11 @@
/proc/Centcomm_announce(var/msg, var/mob/Sender, var/iamessage)
var/msg_cciaa = "[uppertext(boss_short)][iamessage ? " IA" : ""]:[key_name(Sender, 1)] (RPLY): [msg]"
-
var/msg_admin = "[uppertext(boss_short)][iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]"
+
var/cciaa_present = 0
var/cciaa_afk = 0
+
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg_admin
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index b2374ea7cbf..236e5804eff 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -349,8 +349,6 @@
. = ..() //calls mob.Login()
- prefs.sanitize_preferences()
-
if(holder)
add_admin_verbs()
diff --git a/code/modules/client/preference_setup/antagonism/01_candidacy.dm b/code/modules/client/preference_setup/antagonism/01_candidacy.dm
index 8b8819731bb..f171a20a0c4 100644
--- a/code/modules/client/preference_setup/antagonism/01_candidacy.dm
+++ b/code/modules/client/preference_setup/antagonism/01_candidacy.dm
@@ -26,7 +26,7 @@
/datum/category_item/player_setup_item/antagonism/candidacy/sanitize_character(var/sql_load = 0)
if (sql_load)
- if (pref.be_special_role)
+ if (istext(pref.be_special_role))
pref.be_special_role = params2list(pref.be_special_role)
if (!istype(pref.be_special_role))
diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm
index c2bf024732f..570e54ea2b8 100644
--- a/code/modules/client/preference_setup/general/01_basic.dm
+++ b/code/modules/client/preference_setup/general/01_basic.dm
@@ -7,6 +7,7 @@
S["real_name"] >> pref.real_name
S["gender"] >> pref.gender
S["age"] >> pref.age
+ S["species"] >> pref.species
S["spawnpoint"] >> pref.spawnpoint
S["OOC_Notes"] >> pref.metadata
@@ -14,6 +15,7 @@
S["real_name"] << pref.real_name
S["gender"] << pref.gender
S["age"] << pref.age
+ S["species"] << pref.species
S["spawnpoint"] << pref.spawnpoint
S["OOC_Notes"] << pref.metadata
@@ -22,7 +24,8 @@
"gender",
"age",
"metadata",
- "spawnpoint",),
+ "spawnpoint",
+ "species"),
"args" = list("id")))
/datum/category_item/player_setup_item/general/basic/gather_load_parameters()
@@ -34,6 +37,7 @@
"age",
"metadata",
"spawnpoint",
+ "species",
"id" = 1,
"ckey" = 1))
@@ -43,6 +47,7 @@
"age" = pref.age,
"metadata" = pref.metadata,
"spawnpoint" = pref.spawnpoint,
+ "species" = pref.species,
"id" = pref.current_character,
"ckey" = pref.client.ckey)
@@ -66,6 +71,9 @@
log_debug("SQL CHARACTER LOAD: Logic error, general/basic/load_special() didn't return any rows when it should have. Character ID: [pref.current_character].")
/datum/category_item/player_setup_item/general/basic/sanitize_character()
+ if(!pref.species || !(pref.species in playable_species))
+ pref.species = "Human"
+
pref.age = sanitize_integer(text2num(pref.age), pref.getMinAge(), pref.getMaxAge(), initial(pref.age))
pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders))
pref.real_name = sanitize_name(pref.real_name, pref.species)
diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm
index a34fd30f3ef..388547b4539 100644
--- a/code/modules/client/preference_setup/general/02_language.dm
+++ b/code/modules/client/preference_setup/general/02_language.dm
@@ -48,12 +48,15 @@
var/list/bad_langs = pref.alternate_languages - langs
if (bad_langs.len)
- to_chat(pref.client, "[bad_langs.len] invalid languages were found in your character setup!")
+ to_chat(pref.client, "[bad_langs.len] invalid language\s were found in your character setup! Please save your character again to stop this error from repeating!")
for (var/L in bad_langs)
to_chat(pref.client, "Removing the language \"[L]\" from your character.")
pref.alternate_languages -= L
+ var/datum/category_group/player_setup_category/cat = category
+ cat.modified = TRUE
+
/datum/category_item/player_setup_item/general/language/content()
. += "Languages
"
var/datum/species/S = all_species[pref.species]
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index 8569c1707a4..4eedd68509c 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -5,7 +5,6 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
sort_order = 3
/datum/category_item/player_setup_item/general/body/load_character(var/savefile/S)
- S["species"] >> pref.species
S["hair_red"] >> pref.r_hair
S["hair_green"] >> pref.g_hair
S["hair_blue"] >> pref.b_hair
@@ -29,7 +28,6 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.preview_icon = null
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
- S["species"] << pref.species
S["hair_red"] << pref.r_hair
S["hair_green"] << pref.g_hair
S["hair_blue"] << pref.b_hair
@@ -52,27 +50,25 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["body_markings"] << pref.body_markings
/datum/category_item/player_setup_item/general/body/gather_load_query()
- return list("ss13_characters" = list("vars" = list("species",
- "hair_colour",
- "facial_colour",
- "skin_tone" = "s_tone",
- "skin_colour",
- "hair_style" = "h_style",
- "facial_style" = "f_style",
- "eyes_colour",
- "b_type",
- "disabilities",
- "organs_data" = "organ_data",
- "organs_robotic" = "rlimb_data",
- "body_markings"),
+ return list("ss13_characters" = list("vars" = list("hair_colour",
+ "facial_colour",
+ "skin_tone" = "s_tone",
+ "skin_colour",
+ "hair_style" = "h_style",
+ "facial_style" = "f_style",
+ "eyes_colour",
+ "b_type",
+ "disabilities",
+ "organs_data" = "organ_data",
+ "organs_robotic" = "rlimb_data",
+ "body_markings"),
"args" = list("id")))
/datum/category_item/player_setup_item/general/body/gather_load_parameters()
return list("id" = pref.current_character)
/datum/category_item/player_setup_item/general/body/gather_save_query()
- return list("ss13_characters" = list("species",
- "hair_colour",
+ return list("ss13_characters" = list("hair_colour",
"facial_colour",
"skin_tone",
"skin_colour",
@@ -88,8 +84,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
"ckey" = 1))
/datum/category_item/player_setup_item/general/body/gather_save_parameters()
- return list("species" = pref.species,
- "hair_colour" = "#" + num2hex(pref.r_hair, 2) + num2hex(pref.g_hair, 2) + num2hex(pref.b_hair, 2),
+ return list("hair_colour" = "#" + num2hex(pref.r_hair, 2) + num2hex(pref.g_hair, 2) + num2hex(pref.b_hair, 2),
"facial_colour" = "#" + num2hex(pref.r_facial, 2) + num2hex(pref.g_facial, 2) + num2hex(pref.b_facial, 2),
"skin_tone" = pref.s_tone,
"skin_colour" = "#" + num2hex(pref.r_skin, 2) + num2hex(pref.g_skin, 2) + num2hex(pref.b_skin, 2),
@@ -105,9 +100,6 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
"ckey" = pref.client.ckey)
/datum/category_item/player_setup_item/general/body/sanitize_character(var/sql_load = 0)
- if(!pref.species || !(pref.species in playable_species))
- pref.species = "Human"
-
if (sql_load)
pref.hair_colour = sanitize_hexcolor(pref.hair_colour)
pref.r_hair = GetRedPart(pref.hair_colour)
@@ -133,11 +125,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.disabilities = text2num(pref.disabilities)
- if (pref.organ_data)
+ if (istext(pref.organ_data))
pref.organ_data = params2list(pref.organ_data)
- if (pref.rlimb_data)
+ if (istext(pref.rlimb_data))
pref.rlimb_data = params2list(pref.rlimb_data)
- if (pref.body_markings)
+ if (istext(pref.body_markings))
var/before = pref.body_markings
try
pref.body_markings = json_decode(pref.body_markings)
@@ -530,6 +522,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if("Head")
limb = "head"
carries_organs = 1
+ else
+ to_chat(user, "Cancelled.")
+ return TOPIC_NOACTION
var/list/available_states = list("Normal","Amputated","Prosthesis")
if(carries_organs)
diff --git a/code/modules/client/preference_setup/general/05_background.dm b/code/modules/client/preference_setup/general/05_background.dm
index dfbdf60561b..00d5d1aef1a 100644
--- a/code/modules/client/preference_setup/general/05_background.dm
+++ b/code/modules/client/preference_setup/general/05_background.dm
@@ -28,7 +28,7 @@
"records_security" = "sec_record",
"records_ccia" = "ccia_record"),
"args" = list("char_id")),
- "ss13_characters" = list("vars" = list("home_system", "citizenship", "faction", "religion"), "args" = list("id")))
+ "ss13_characters" = list("vars" = list("nt_relation" = "nanotrasen_relation" ,"home_system", "citizenship", "faction", "religion"), "args" = list("id")))
/datum/category_item/player_setup_item/general/background/gather_load_parameters()
return list("id" = pref.current_character, "char_id" = pref.current_character)
@@ -38,13 +38,14 @@
"records_medical",
"records_security",
"char_id" = 1),
- "ss13_characters" = list("home_system", "citizenship", "faction", "religion", "id" = 1, "ckey" = 1))
+ "ss13_characters" = list("nt_relation", "home_system", "citizenship", "faction", "religion", "id" = 1, "ckey" = 1))
/datum/category_item/player_setup_item/general/background/gather_save_parameters()
return list("records_employment" = pref.gen_record,
"records_medical" = pref.med_record,
"records_security" = pref.sec_record,
"char_id" = pref.current_character,
+ "nt_relation" = pref.nanotrasen_relation,
"home_system" = pref.home_system,
"citizenship" = pref.citizenship,
"faction" = pref.faction,
diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm
index 3661dfc4cab..d5d1103b090 100644
--- a/code/modules/client/preference_setup/general/06_flavor.dm
+++ b/code/modules/client/preference_setup/general/06_flavor.dm
@@ -49,7 +49,7 @@
"flavour_hands" = "flavor_texts/hands",
"flavour_legs" = "flavor_texts/legs",
"flavour_feet" = "flavor_texts/feet",
- "robot_default" = "flavour_texts_robot/default",
+ "robot_default" = "flavour_texts_robot/Default",
"signature" = "signature",
"signature_font" = "signfont")
@@ -92,7 +92,7 @@
"flavour_hands" = pref.flavor_texts["hands"],
"flavour_legs" = pref.flavor_texts["legs"],
"flavour_feet" = pref.flavor_texts["feet"],
- "robot_default" = pref.flavour_texts_robot["default"],
+ "robot_default" = pref.flavour_texts_robot["Default"],
"signature" = pref.signature,
"signature_font" = pref.signfont)
diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm
index 34262a1d7ef..68d94e221f2 100644
--- a/code/modules/client/preference_setup/loadout/loadout.dm
+++ b/code/modules/client/preference_setup/loadout/loadout.dm
@@ -70,7 +70,7 @@ var/list/gear_datums = list()
/datum/category_item/player_setup_item/loadout/sanitize_character(var/sql_load = 0)
if (sql_load)
gear_reset = FALSE
- if (pref.gear && istext(pref.gear))
+ if (istext(pref.gear))
try
pref.gear = json_decode(pref.gear)
catch
@@ -78,9 +78,6 @@ var/list/gear_datums = list()
pref.gear = list()
gear_reset = TRUE
- else
- pref.gear = list()
- gear_reset = TRUE
var/mob/preference_mob = preference_mob()
if(!islist(pref.gear))
diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm
index b04284df81d..724b348e64a 100644
--- a/code/modules/client/preference_setup/preference_setup.dm
+++ b/code/modules/client/preference_setup/preference_setup.dm
@@ -34,13 +34,13 @@
/datum/category_group/player_setup_category/global_preferences
name = "Global"
- sort_order = 5
+ sort_order = 6
category_item_type = /datum/category_item/player_setup_item/player_global
sql_role = SQL_PREFERENCES
/datum/category_group/player_setup_category/other_preferences
name = "Other"
- sort_order = 6
+ sort_order = 7
category_item_type = /datum/category_item/player_setup_item/other
/****************************
@@ -61,9 +61,9 @@
selected_category = null
return ..()
-/datum/category_collection/player_setup_collection/proc/sanitize_setup()
+/datum/category_collection/player_setup_collection/proc/sanitize_setup(sql_load = FALSE)
for(var/datum/category_group/player_setup_category/PS in categories)
- PS.sanitize_setup()
+ PS.sanitize_setup(sql_load)
/datum/category_collection/player_setup_collection/proc/load_character(var/savefile/S)
for(var/datum/category_group/player_setup_category/PS in categories)
@@ -122,11 +122,11 @@
var/sql_role = SQL_CHARACTER
var/modified = 0
-/datum/category_group/player_setup_category/proc/sanitize_setup()
+/datum/category_group/player_setup_category/proc/sanitize_setup(sql_load = FALSE)
for(var/datum/category_item/player_setup_item/PI in items)
- PI.sanitize_preferences()
+ PI.sanitize_preferences(sql_load)
for(var/datum/category_item/player_setup_item/PI in items)
- PI.sanitize_character()
+ PI.sanitize_character(sql_load)
/datum/category_group/player_setup_category/proc/load_character(var/savefile/S)
// Load all data, then sanitize it.
@@ -150,11 +150,10 @@
if (!config.sql_saves || !establish_db_connection(dbcon))
for (var/datum/category_item/player_setup_item/PI in items)
PI.save_character(S)
- else
- if (modified)
- // No save here, because this is only called from the menu and needs to save /everything/.
- handle_sql_saving(SQL_CHARACTER)
- modified = 0
+ else if (modified)
+ // No save here, because this is only called from the menu and needs to save /everything/.
+ handle_sql_saving(SQL_CHARACTER)
+ modified = 0
/datum/category_group/player_setup_category/proc/load_preferences(var/savefile/S)
if (!config.sql_saves || !establish_db_connection(dbcon))
diff --git a/code/modules/client/preference_setup/preferences_sql.dm b/code/modules/client/preference_setup/preferences_sql.dm
index 429faaf5097..12177f40a46 100644
--- a/code/modules/client/preference_setup/preferences_sql.dm
+++ b/code/modules/client/preference_setup/preferences_sql.dm
@@ -235,8 +235,8 @@
query.Execute()
if (query.NextRow())
- arg_list[":id"] = text2num(query.item[1])
- arg_list[":char_id"] = text2num(query.item[1])
+ arg_list["id"] = text2num(query.item[1])
+ arg_list["char_id"] = text2num(query.item[1])
cc.preferences.current_character = text2num(query.item[1])
#ifdef SQL_PREF_DEBUG
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index f529b7e3da7..cdf77d6fa22 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -64,9 +64,8 @@
default_slot = slot
S["default_slot"] << slot
S.cd = "/character[slot]"
- else
- if (slot)
- current_character = slot
+ else if (slot)
+ current_character = slot
player_setup.load_character(S)
@@ -97,7 +96,7 @@
return S
/datum/preferences/proc/sanitize_preferences()
- player_setup.sanitize_setup()
+ player_setup.sanitize_setup(config.sql_saves)
return 1
/datum/preferences/proc/update_setup(var/savefile/preferences, var/savefile/character)
diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm
index 7ba7f2228c2..024ea6716de 100644
--- a/code/modules/multiz/movement.dm
+++ b/code/modules/multiz/movement.dm
@@ -72,7 +72,7 @@
// Actually move.
Move(destination)
return TRUE
-
+
/mob/living/zMove(direction)
if (is_ventcrawling)
var/obj/machinery/atmospherics/pipe/zpipe/P = loc
@@ -189,6 +189,9 @@
* this cycle.
*/
/atom/movable/proc/can_fall(turf/below, turf/simulated/open/dest = src.loc)
+ if (!istype(dest))
+ return FALSE
+
// Anchored things don't fall.
if(anchored)
return FALSE
diff --git a/code/world.dm b/code/world.dm
index 51a2c5bcbe7..10a658a1165 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -196,7 +196,7 @@ var/list/world_api_rate_limit = list()
// They don't provide any useful information, and as such, are being suppressed.
#ifdef UNIT_TEST
- if (findtextEx(e.name, "Invalid Timer:"))
+ if (findtextEx(e.name, "Invalid timer:") || findtextEx(e.desc, "Invalid timer:"))
inerror = 0
return
diff --git a/html/changelogs/skull132-preferences_fixes.yml b/html/changelogs/skull132-preferences_fixes.yml
new file mode 100644
index 00000000000..08ce905c019
--- /dev/null
+++ b/html/changelogs/skull132-preferences_fixes.yml
@@ -0,0 +1,8 @@
+author: Skull132
+delete-after: true
+
+changes:
+ - bugfix: "Fixes custom loadouts and role preferences not loading properly on initial character load."
+ - bugfix: "NanoTrasen relation is now properly saved and loaded."
+ - bugfix: "You can now cancel out of adjusting amputated/proshetic limbs properly."
+ - bugfix: "Default cyborg module flavour text now saves properly."