diff --git a/baystation12.dme b/baystation12.dme index b4a5b034098..35b629deb00 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -835,7 +835,7 @@ #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" #include "code\modules\client\preferences.dm" -#include "code\modules\client\preferences_savefile.dm" +#include "code\modules\client\preferences_mysql.dm" #include "code\modules\client\preferences_toggles.dm" #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\glasses\glasses.dm" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 5aca93796f5..8a0dee2abc7 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -136,7 +136,7 @@ datum/preferences b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") if(istype(C)) if(!IsGuestKey(C.key)) - load_path(C.ckey) +// load_path(C.ckey) if(load_preferences()) if(load_character()) return @@ -186,10 +186,6 @@ datum/preferences dat += "
" dat += "Species: [species]
" dat += "Secondary Language:
[language]
" -/* dat += "Accent: [accent]
" - dat += "Voice: [voice]
" - dat += "Pitch: [pitch]
" - dat += "Talking Speed: [talkspeed]
"*/ dat += "Blood Type: [b_type]
" dat += "Skin Tone: [-s_tone + 35]/220
" // dat += "Skin pattern: Adjust
" @@ -316,7 +312,6 @@ datum/preferences dat += "-Alpha(transparence): [UI_style_alpha]
" dat += "Play admin midis: [(sound & SOUND_MIDI) ? "Yes" : "No"]
" dat += "Play lobby music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
" - dat += "Hear player voices: [(sound & SOUND_VOICES) ? "Yes" : "No"]
" dat += "Randomized Character Slot: [randomslot ? "Yes" : "No"]
" dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
" dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
" @@ -1124,23 +1119,6 @@ datum/preferences undershirt = undershirt_options.Find(new_undershirt) ShowChoices(user) - if("accent") - var/new_accent = input(user, "Choose your accent. en-us:American, en:British, en-sc:Scottish, mb-de4-en:German, mb-fr1-en:French", "Character Preference") as null|anything in list("en-us", "en", "en-sc","mb-de4-en","mb-fr1-en") - if(new_accent) - accent = new_accent - if("voice") - var/new_voice = input(user, "Choose your voice. f:Female, m:Male", "Character Preference") as null|anything in list("f1","m1","f2","m2","f3","m3","f4","m4","f5","m5","m6","m7") - if(new_voice) - voice = new_voice - if("pitch") - var/new_pitch = input(user, "Choose your character's voice pitch:\n(0-99) Default is 50.", "Character Preference") as num|null - if(new_pitch) - pitch = max(min( round(text2num(new_pitch)), 99),0) - if("talkspeed") - var/new_talkspeed = input(user, "Choose your character's voice talk speed:\n(140-240) Default is 175.", "Character Preference") as num|null - if(new_talkspeed) - talkspeed = max(min( round(text2num(new_talkspeed)), 240),140) - if("eyes") var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference") as color|null if(new_eyes) @@ -1329,9 +1307,6 @@ datum/preferences if("ghost_radio") toggles ^= CHAT_GHOSTRADIO - if("player_voices") - sound ^= SOUND_VOICES - if("save") save_preferences() save_character() @@ -1457,20 +1432,26 @@ datum/preferences character.gender = MALE proc/open_load_dialog(mob/user) + var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM character WHERE ckey='[user.key]' ORDER BY slot") + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") + message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n") + return + var/dat = "" dat += "
" + dat += "Select a character slot to load
" + var/name - var/savefile/S = new /savefile(path) - if(S) - dat += "Select a character slot to load
" - var/name - for(var/i=1, i<=MAX_SAVE_SLOTS, i++) - S.cd = "/character[i]" - S["real_name"] >> name - if(!name) name = "Character[i]" - if(i==default_slot) - name = "[name]" - dat += "[name]
" + for(var/i=1, i<=MAX_SAVE_SLOTS, i++) + if(i==query.item[1]) + name = query.item[2] + query.NextRow() + if(!name) name = "Character[i]" + if(i==default_slot) + name = "[name]" + dat += "[name]
" dat += "
" dat += "Close
" diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm new file mode 100644 index 00000000000..ba8c4072d81 --- /dev/null +++ b/code/modules/client/preferences_mysql.dm @@ -0,0 +1,207 @@ +/datum/preferences/proc/load_preferences() + + var/DBQuery/query = dbcon.NewQuery("SELECT ooccolor,UI_style,UI_style_color,UI_style_alpha,be_special,default_slot,toggles,sound,randomslot,volume FROM erro_player WHERE ckey='[usr.key]'") + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL ERROR during loading player preferences. Error : \[[err]\]\n") + message_admins("SQL ERROR during loading player preferences. Error : \[[err]\]\n") + return + + + //general preferences + ooccolor = query.item[1] + UI_style = query.item[2] + UI_style_color = query.item[3] + UI_style_alpha = query.item[4] + be_special = query.item[5] + default_slot = query.item[6] + toggles = query.item[7] + sound = query.item[8] + randomslot = query.item[9] + volume = query.item[10] + + //Sanitize + ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor)) + lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) + UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style)) + be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) + default_slot = sanitize_integer(default_slot, 1, MAX_SAVE_SLOTS, initial(default_slot)) + toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) + sound = sanitize_integer(sound, 0, 65535, initial(toggles)) + UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color)) + UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha)) + randomslot = sanitize_integer(randomslot, 0, 1, initial(randomslot)) + volume = sanitize_integer(volume, 0, 100, initial(volume)) + return 1 + +/datum/preferences/proc/save_preferences() + + var/DBQuery/query = dbcon.NewQuery("UPDATE error_player (ooccolor,UI_style,UI_style_color,UI_style_alpha,be_special,default_slot,toggles,sound,randomslot,volume) VALUES ('[ooccolor]','[UI_style]','[UI_style_color]','[UI_style_alpha]','[be_special]','[default_slot]','[toggles]','[sound]','[randomslot]','[volume]') WHERE ckey='[usr.key]'") + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL ERROR during saving player preferences. Error : \[[err]\]\n") + message_admins("SQL ERROR during saving player preferences. Error : \[[err]\]\n") + return + return 1 + +/datum/preferences/proc/load_character(slot) + + if(!slot) slot = default_slot + slot = sanitize_integer(slot, 1, MAX_SAVE_SLOTS, initial(default_slot)) + if(slot != default_slot) + default_slot = slot + var/DBQuery/firstquery = dbcon.NewQuery("UPDATE error_player (default_slot) VALUES ('[slot]') WHERE ckey='[usr.key]'") + firstquery.Execute() + + var/DBQuery/query = dbcon.NewQuery("SELECT * FROM character WHERE ckey='[usr.key]' AND slot='[slot]'") + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n") + message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n") + return + + //Character + metadata = query.item[4] + real_name = query.item[5] + be_random_name = query.item[6] + gender = query.item[7] + age = query.item[8] + species = query.item[9] + language = query.item[10] + + //colors to be consolidated into hex strings (requires some work with dna code) + r_hair = query.item[11] + g_hair = query.item[12] + b_hair = query.item[13] + r_facial = query.item[14] + g_facial = query.item[15] + b_facial = query.item[16] + s_tone = query.item[17] + r_skin = query.item[18] + g_skin = query.item[19] + b_skin = query.item[20] + h_style = query.item[21] + f_style = query.item[22] + r_eyes = query.item[23] + g_eyes = query.item[24] + b_eyes = query.item[25] + underwear = query.item[26] + undershirt = query.item[27] + backbag = query.item[28] + b_type = query.item[29] + + + //Jobs + alternate_option = query.item[30] + job_civilian_high = query.item[31] + job_civilian_med = query.item[32] + job_civilian_low = query.item[33] + job_medsci_high = query.item[34] + job_medsci_med = query.item[35] + job_medsci_low = query.item[36] + job_engsec_high = query.item[37] + job_engsec_med = query.item[38] + job_engsec_low = query.item[39] + job_karma_high = query.item[40] + job_karma_med = query.item[41] + job_karma_low = query.item[42] + + //Miscellaneous + flavor_text = query.item[43] + med_record = query.item[44] + sec_record = query.item[45] + gen_record = query.item[46] + be_special = query.item[47] + disabilities = query.item[48] + player_alt_titles = query.item[49] + organ_data = query.item[50] + + nanotrasen_relation = query.item[51] + + //Sanitize + metadata = sanitize_text(metadata, initial(metadata)) + real_name = reject_bad_name(real_name) + if(isnull(species)) species = "Human" + if(isnull(language)) language = "None" + if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation) + if(!real_name) real_name = random_name(gender,species) + be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) + gender = sanitize_gender(gender) + age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) + r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair)) + g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair)) + b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair)) + r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial)) + g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial)) + b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial)) + s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone)) + r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin)) + g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin)) + b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin)) + h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style)) + f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style)) + r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes)) + g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes)) + b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes)) + underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear)) + undershirt = sanitize_integer(undershirt, 1, undershirt_t.len, initial(undershirt)) + backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag)) + b_type = sanitize_text(b_type, initial(b_type)) + + alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option)) + job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) + job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) + job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) + job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high)) + job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med)) + job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low)) + job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high)) + job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) + job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) + job_karma_high = sanitize_integer(job_karma_high, 0, 65535, initial(job_karma_high)) + job_karma_med = sanitize_integer(job_karma_med, 0, 65535, initial(job_karma_med)) + job_karma_low = sanitize_integer(job_karma_low, 0, 65535, initial(job_karma_low)) + + if(isnull(disabilities)) disabilities = 0 + if(!player_alt_titles) player_alt_titles = new() + if(!organ_data) src.organ_data = list() + + return 1 + +/datum/preferences/proc/save_character() + var/DBQuery/firstquery = dbcon.NewQuery("SELECT slot FROM character WHERE ckey='[usr.key]' ORDER BY slot") + firstquery.Execute() + var/numRow = firstquery.RowsAffected() + if(numRow) + for(var/i = 1,i <= numRow, i++) + if(default_slot != firstquery.item[1]) + firstquery.NextRow() + else + var/DBQuery/query = dbcon.NewQuery("UPDATE character (OOC_Notes,real_name,name_is_always_random,gender,age,species,language,hair_red,hair_green,hair_blue,facial_red,facial_green,facial_blue,skin_tone,skin_red,skin_green,skin_blue,hair_style_name,facial_style_name,eyes_red,eyes_green,eyes_blue,underwear,undershirt,backbag,b_type,alternate_option,job_civ_high,job_civ_med,job_civ_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,flavor_text,med_record,sec_record,gen_record,player_alt_titles,be_special,disabilities,organ_data,nanotrasen_relation) VALUES ('[metadata]','[real_name]','[be_random_name]','[gender]','[age]','[species]','[language]','[r_hair]','[g_hair]','[b_hair]','[r_facial]','[g_facial]','[b_facial]','[s_tone]',[r_skin]','[g_skin]','[b_skin]','[h_style]','[f_style]','[r_eyes]','[g_eyes]','[b_eyes]','[underwear]','[undershirt]','[backbag]','[b_type]','[alternate_option]','[job_civilian_high]','[job_civilian_med]','[job_civilian_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]','[flavor_text]','[med_record]','[sec_record]','[gen_record]','[player_alt_titles]','[be_special]','[disabilities]','[organ_data]','[nanotrasen_relation]') WHERE ckey='[usr.key]' AND slot='[default_slot]'") + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL ERROR during character slot saving. Error : \[[err]\]\n") + message_admins("SQL ERROR during character slot saving. Error : \[[err]\]\n") + return + return 1 + var/DBQuery/query = dbcon.NewQuery("INSERT INTO character (ckey,slot,OOC_Notes,real_name,name_is_always_random,gender,age,species,language,hair_red,hair_green,hair_blue,facial_red,facial_green,facial_blue,skin_tone,skin_red,skin_green,skin_blue,hair_style_name,facial_style_name,eyes_red,eyes_green,eyes_blue,underwear,undershirt,backbag,b_type,alternate_option,job_civ_high,job_civ_med,job_civ_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,flavor_text,med_record,sec_record,gen_record,player_alt_titles,be_special,disabilities,organ_data,nanotrasen_relation) VALUES ('[usr.key],'[default_slot]','[metadata]','[real_name]','[be_random_name]','[gender]','[age]','[species]','[language]','[r_hair]','[g_hair]','[b_hair]','[r_facial]','[g_facial]','[b_facial]','[s_tone]',[r_skin]','[g_skin]','[b_skin]','[h_style]','[f_style]','[r_eyes]','[g_eyes]','[b_eyes]','[underwear]','[undershirt]','[backbag]','[b_type]','[alternate_option]','[job_civilian_high]','[job_civilian_med]','[job_civilian_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]','[flavor_text]','[med_record]','[sec_record]','[gen_record]','[player_alt_titles]','[be_special]','[disabilities]','[organ_data]','[nanotrasen_relation]')") + if(!query.Execute()) + var/err = query.ErrorMsg() + log_game("SQL ERROR during character slot saving. Error : \[[err]\]\n") + message_admins("SQL ERROR during character slot saving. Error : \[[err]\]\n") + return + return 1 + +/datum/preferences/proc/random_character() + var/DBQuery/query = dbcon.NewQuery("SELECT slot FROM character WHERE ckey='[usr.key]' ORDER BY slot") + + var/list/saves = list() + for(var/i=1, i<=MAX_SAVE_SLOTS, i++) + if(i==query.item[1]) + saves += i + query.NextRow() + if(!saves.len) + load_character() + return 0 + load_character(pick(saves)) + return 1 \ No newline at end of file diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index c79289fef07..367874fd8ad 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -31,6 +31,7 @@ path = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/[filename]" savefile_version = SAVEFILE_VERSION_MAX +/* /datum/preferences/proc/load_preferences() if(!path) return 0 if(!fexists(path)) return 0 @@ -95,6 +96,7 @@ S["volume"] << volume return 1 + //saving volume changes /datum/preferences/proc/save_volume() if(!path) return 0 @@ -104,6 +106,7 @@ S["volume"] << volume return 1 +*/ /datum/preferences/proc/load_save(dir) var/savefile/S = new /savefile(path) @@ -244,7 +247,7 @@ S.cd = pick(saves) load_save(S.cd) return 1 - +/* /datum/preferences/proc/load_character(slot) if(!path) return 0 if(!fexists(path)) return 0 @@ -258,7 +261,7 @@ S["default_slot"] << slot S.cd = "/character[slot]" load_save(S.cd) -/* Now loaded by proc load_save(S.cd) + Now loaded by proc load_save(S.cd) //Character S["OOC_Notes"] >> metadata S["real_name"] >> real_name @@ -360,7 +363,7 @@ if(!player_alt_titles) player_alt_titles = new() if(!organ_data) src.organ_data = list() //if(!skin_style) skin_style = "Default" -*/ + return 1 /datum/preferences/proc/save_character() @@ -430,7 +433,7 @@ //S["skin_style"] << skin_style return 1 - +*/ #undef SAVEFILE_VERSION_MAX #undef SAVEFILE_VERSION_MIN diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 45bf1f8aae5..91694e4fc47 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -85,6 +85,7 @@ src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jamsz feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/* /client/verb/togglevoices() set name = "Toggle player voices" set category = "Preferences" @@ -93,6 +94,7 @@ prefs.save_preferences() src << "You will [(prefs.sound & SOUND_VOICES) ? "now" : "no longer"] hear voices of players around you, or your own voice." feedback_add_details("admin_verb","TVoice") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +*/ /client/verb/togglemidis() set name = "Hear/Silence Midis" diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm index 925888ed0c1..b2bdfb20d7c 100644 --- a/code/modules/media/mediamanager.dm +++ b/code/modules/media/mediamanager.dm @@ -135,4 +135,4 @@ function SetMusic(url, time, volume) { media.update_volume(value) if(prefs) prefs.volume = value - prefs.save_volume() + prefs.save_preferences() diff --git a/code/setup.dm b/code/setup.dm index 5cbe6769042..bedcd606ed0 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -689,8 +689,7 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define SOUND_MIDI 2 #define SOUND_AMBIENCE 4 #define SOUND_LOBBY 8 -#define SOUND_VOICES 16 -#define SOUND_STREAMING 32 +#define SOUND_STREAMING 16 #define SOUND_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|SOUND_STREAMING) #define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC)