mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 07:32:02 +00:00
Characters are no longer hard deleted from the database. This makes it so that persistent records about characters can't be fucked up.
708 lines
27 KiB
Plaintext
708 lines
27 KiB
Plaintext
/datum/preferences/proc/load_preferences_sql(var/client/C)
|
|
if (!C)
|
|
return 0
|
|
|
|
var/DBQuery/query = dbcon.NewQuery({"SELECT
|
|
ooccolor,
|
|
lastchangelog,
|
|
UI_style,
|
|
current_character,
|
|
toggles,
|
|
UI_style_color,
|
|
UI_style_alpha,
|
|
be_special,
|
|
asfx_togs,
|
|
motd_hash,
|
|
memo_hash
|
|
FROM ss13_player_preferences
|
|
WHERE ckey = :ckey"})
|
|
query.Execute(list(":ckey" = C.ckey))
|
|
|
|
if (!query.NextRow())
|
|
return insert_preferences_sql(C)
|
|
|
|
ooccolor = query.item[1]
|
|
lastchangelog = query.item[2]
|
|
UI_style = query.item[3]
|
|
current_character = text2num(query.item[4])
|
|
toggles = text2num(query.item[5])
|
|
UI_style_color = query.item[6]
|
|
UI_style_alpha = text2num(query.item[7])
|
|
be_special = text2num(query.item[8])
|
|
asfx_togs = text2num(query.item[9])
|
|
motd_hash = query.item[10]
|
|
memo_hash = query.item[11]
|
|
|
|
//Sanitize
|
|
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
|
|
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
|
|
motd_hash = sanitize_text(motd_hash, initial(motd_hash))
|
|
memo_hash = sanitize_text(memo_hash, initial(memo_hash))
|
|
UI_style = sanitize_inlist(UI_style, list("White", "Midnight","Orange","old"), initial(UI_style))
|
|
be_special = sanitize_integer(be_special, 0, 65535, initial(be_special))
|
|
default_slot = sanitize_integer(default_slot, 1, config.character_slots, initial(default_slot))
|
|
toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
|
|
asfx_togs = sanitize_integer(asfx_togs, 0, 65535, initial(asfx_togs))
|
|
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))
|
|
|
|
return 1
|
|
|
|
/datum/preferences/proc/save_preferences_sql(var/client/C)
|
|
if (!C)
|
|
return 0
|
|
|
|
var/DBQuery/initial_query = dbcon.NewQuery("SELECT COUNT(*) AS rowsFound FROM ss13_player_preferences WHERE ckey = :ckey")
|
|
initial_query.Execute(list(":ckey" = C.ckey))
|
|
|
|
if (!initial_query.NextRow())
|
|
return insert_preferences_sql(C)
|
|
|
|
var/DBQuery/update_query = dbcon.NewQuery({"UPDATE ss13_player_preferences SET
|
|
ooccolor = :ooccolor,
|
|
lastchangelog = :lastchangelog,
|
|
UI_style = :ui_style,
|
|
current_character = :current_character,
|
|
toggles = :toggles,
|
|
UI_style_color = :ui_color,
|
|
UI_style_alpha = :ui_alpha,
|
|
be_special = :be_special,
|
|
asfx_togs = :asfx_togs,
|
|
motd_hash = :motd_hash,
|
|
memo_hash = :memo_hash
|
|
WHERE ckey = :ckey"})
|
|
update_query.Execute(get_prefs_update_insert_params(C))
|
|
|
|
return 1
|
|
|
|
/datum/preferences/proc/insert_preferences_sql(var/client/C)
|
|
if (!C)
|
|
return 0
|
|
|
|
var/DBQuery/query = dbcon.NewQuery({"INSERT INTO ss13_player_preferences (ckey, ooccolor, lastchangelog, UI_style, current_character, toggles, UI_style_color, UI_style_alpha, be_special, asfx_togs, motd_hash, memo_hash)
|
|
VALUES (:ckey, :ooccolor, :lastchangelog, :ui_style, :current_character, :toggles, :ui_color, :ui_alpha, :be_special, :asfx_togs, :motd_hash, :memo_hash);"})
|
|
query.Execute(get_prefs_update_insert_params(C))
|
|
|
|
return 1
|
|
|
|
//Helper function.
|
|
/datum/preferences/proc/get_prefs_update_insert_params(var/client/C)
|
|
var/params[] = list()
|
|
|
|
params[":ckey"] = C.ckey
|
|
|
|
params[":ooccolor"] = ooccolor
|
|
params[":lastchangelog"] = lastchangelog
|
|
params[":ui_style"] = UI_style
|
|
params[":current_character"] = current_character
|
|
params[":toggles"] = toggles
|
|
params[":ui_color"] = UI_style_color
|
|
params[":ui_alpha"] = UI_style_alpha
|
|
params[":be_special"] = be_special
|
|
params[":asfx_togs"] = asfx_togs
|
|
params[":motd_hash"] = motd_hash
|
|
params[":memo_hash"] = memo_hash
|
|
|
|
return params
|
|
|
|
/datum/preferences/proc/load_character_sql(slot, var/client/C)
|
|
if (!C)
|
|
return 0
|
|
|
|
if (!slot || slot == 0)
|
|
return new_character_sql(C)
|
|
|
|
current_character = slot
|
|
|
|
establish_db_connection(dbcon)
|
|
if (!dbcon.IsConnected())
|
|
error("Error attempting to connect to MySQL server while loading a character.")
|
|
return 0
|
|
|
|
var/DBQuery/initial_query = dbcon.NewQuery("SELECT name FROM ss13_characters WHERE id = :character_id AND ckey = :ckey")
|
|
initial_query.Execute(list(":character_id" = current_character, ":ckey" = C.ckey))
|
|
|
|
// In case someone got themselves an invalid character ID.
|
|
if (!initial_query.NextRow())
|
|
error("[C.ckey] attempted to load character #[current_character] and failed. No such character found.")
|
|
new_character_sql(C)
|
|
return 0
|
|
|
|
var/DBQuery/character_query = dbcon.NewQuery({"SELECT
|
|
dat.name,
|
|
dat.metadata,
|
|
dat.random_name,
|
|
dat.gender,
|
|
dat.age,
|
|
dat.species,
|
|
dat.language,
|
|
dat.spawnpoint,
|
|
dat.hair_colour,
|
|
dat.facial_colour,
|
|
dat.skin_tone,
|
|
dat.skin_colour,
|
|
dat.hair_style,
|
|
dat.facial_style,
|
|
dat.eyes_colour,
|
|
dat.underwear,
|
|
dat.undershirt,
|
|
dat.backbag,
|
|
dat.b_type,
|
|
dat.jobs,
|
|
dat.alternate_option,
|
|
dat.alternate_titles,
|
|
flv.flavour_general,
|
|
flv.flavour_head,
|
|
flv.flavour_face,
|
|
flv.flavour_eyes,
|
|
flv.flavour_torso,
|
|
flv.flavour_arms,
|
|
flv.flavour_hands,
|
|
flv.flavour_legs,
|
|
flv.flavour_feet,
|
|
flv.robot_default,
|
|
flv.robot_standard,
|
|
flv.robot_engineering,
|
|
flv.robot_construction,
|
|
flv.robot_surgeon,
|
|
flv.robot_crisis,
|
|
flv.robot_miner,
|
|
flv.robot_janitor,
|
|
flv.robot_service,
|
|
flv.robot_clerical,
|
|
flv.robot_security,
|
|
flv.robot_research,
|
|
flv.records_employment,
|
|
flv.records_medical,
|
|
flv.records_security,
|
|
flv.records_exploit,
|
|
dat.disabilities,
|
|
dat.skills,
|
|
dat.skills_specialization,
|
|
dat.home_system,
|
|
dat.citizenship,
|
|
dat.faction,
|
|
dat.religion,
|
|
dat.nt_relation,
|
|
dat.uplink_location,
|
|
dat.organs_data,
|
|
dat.organs_robotic,
|
|
dat.gear,
|
|
flv.records_ccia
|
|
FROM ss13_characters dat
|
|
JOIN ss13_characters_flavour flv ON dat.id = flv.char_id
|
|
WHERE dat.id = :char_id"})
|
|
if (!character_query.Execute(list(":char_id" = current_character)))
|
|
error("Error loading character #[current_character]. SQL error message: '[character_query.ErrorMsg()]'.")
|
|
new_character_sql(C)
|
|
return 0
|
|
|
|
if (!character_query.NextRow())
|
|
error("Error loading character #[current_character]. No such character exists.")
|
|
new_character_sql(C)
|
|
return 0
|
|
|
|
var/DBQuery/ccia_action_query = dbcon.NewQuery({"SELECT
|
|
act.title,
|
|
act.type,
|
|
act.issuedby,
|
|
act.details,
|
|
act.url,
|
|
act.expires_at
|
|
FROM ss13_ccia_action_char act_chr
|
|
JOIN ss13_characters chr ON act_chr.char_id = chr.id
|
|
JOIN ss13_ccia_actions act ON act_chr.action_id = act.id
|
|
WHERE
|
|
act_chr.char_id = ':char_id' AND
|
|
(act.expires_at IS NULL OR act.expires_at >= CURRENT_DATE()) AND
|
|
act.deleted_at IS NULL;
|
|
"})
|
|
if (!ccia_action_query.Execute(list(":char_id" = current_character)))
|
|
error("Error CCIA Actions for character #[current_character]. SQL error message: '[character_query.ErrorMsg()]'.")
|
|
|
|
while(ccia_action_query.NextRow())
|
|
var/list/action = list(
|
|
ccia_action_query.item[1],
|
|
ccia_action_query.item[2],
|
|
ccia_action_query.item[3],
|
|
ccia_action_query.item[4],
|
|
ccia_action_query.item[5],
|
|
ccia_action_query.item[6]
|
|
)
|
|
ccia_actions.Add(list(action))
|
|
|
|
var/DBQuery/char_id_update = dbcon.NewQuery("UPDATE ss13_player_preferences SET current_character = :char_id WHERE ckey = :ckey")
|
|
char_id_update.Execute(list(":char_id" = current_character, ":ckey" = C.ckey))
|
|
|
|
// Character
|
|
real_name = character_query.item[1]
|
|
metadata = character_query.item[2]
|
|
be_random_name = text2num(character_query.item[3])
|
|
gender = character_query.item[4]
|
|
age = text2num(character_query.item[5])
|
|
species = character_query.item[6]
|
|
language = character_query.item[7]
|
|
spawnpoint = character_query.item[8]
|
|
|
|
// Other customization data
|
|
var/list/hair_rgb = length(character_query.item[9]) == 7 ? GetHexColors(character_query.item[9]) : null
|
|
if (hair_rgb)
|
|
r_hair = hair_rgb[1]
|
|
g_hair = hair_rgb[2]
|
|
b_hair = hair_rgb[3]
|
|
var/list/facial_rgb = length(character_query.item[10]) == 7 ? GetHexColors(character_query.item[10]) : null
|
|
if (facial_rgb)
|
|
r_facial = facial_rgb[1]
|
|
g_facial = facial_rgb[2]
|
|
b_facial = facial_rgb[3]
|
|
s_tone = text2num(character_query.item[11])
|
|
var/list/skin_rgb = length(character_query.item[12]) == 7 ? GetHexColors(character_query.item[12]) : null
|
|
if (skin_rgb)
|
|
r_skin = skin_rgb[1]
|
|
g_skin = skin_rgb[2]
|
|
b_skin = skin_rgb[3]
|
|
h_style = character_query.item[13]
|
|
f_style = character_query.item[14]
|
|
var/list/eyes_rgb = length(character_query.item[15]) == 7 ? GetHexColors(character_query.item[15]) : null
|
|
if (eyes_rgb)
|
|
r_eyes = eyes_rgb[1]
|
|
g_eyes = eyes_rgb[2]
|
|
b_eyes = eyes_rgb[3]
|
|
underwear = character_query.item[16]
|
|
undershirt = character_query.item[17]
|
|
backbag = text2num(character_query.item[18])
|
|
b_type = character_query.item[19]
|
|
|
|
var/list/jobs_list = params2list(character_query.item[20])
|
|
|
|
// Job preferences + alt titles and options
|
|
if (jobs_list.len == 9)
|
|
job_civilian_high = text2num(jobs_list["civ_high"])
|
|
job_civilian_med = text2num(jobs_list["civ_med"])
|
|
job_civilian_low = text2num(jobs_list["civ_low"])
|
|
job_medsci_high = text2num(jobs_list["medsci_high"])
|
|
job_medsci_med = text2num(jobs_list["medsci_med"])
|
|
job_medsci_low = text2num(jobs_list["medsci_low"])
|
|
job_engsec_high = text2num(jobs_list["engsec_high"])
|
|
job_engsec_med = text2num(jobs_list["engsec_med"])
|
|
job_engsec_low = text2num(jobs_list["engsec_low"])
|
|
|
|
alternate_option = text2num(character_query.item[21])
|
|
player_alt_titles = params2list(character_query.item[22])
|
|
|
|
// Flavour texts
|
|
flavor_texts["general"] = character_query.item[23]
|
|
flavor_texts["head"] = character_query.item[24]
|
|
flavor_texts["face"] = character_query.item[25]
|
|
flavor_texts["eyes"] = character_query.item[26]
|
|
flavor_texts["torso"] = character_query.item[27]
|
|
flavor_texts["arms"] = character_query.item[28]
|
|
flavor_texts["hands"] = character_query.item[29]
|
|
flavor_texts["legs"] = character_query.item[30]
|
|
flavor_texts["feet"] = character_query.item[31]
|
|
|
|
flavour_texts_robot["Default"] = character_query.item[32]
|
|
flavour_texts_robot["Standard"] = character_query.item[33]
|
|
flavour_texts_robot["Engineering"] = character_query.item[34]
|
|
flavour_texts_robot["Construction"] = character_query.item[35]
|
|
flavour_texts_robot["Surgeon"] = character_query.item[36]
|
|
flavour_texts_robot["Crisis"] = character_query.item[37]
|
|
flavour_texts_robot["Miner"] = character_query.item[38]
|
|
flavour_texts_robot["Janitor"] = character_query.item[39]
|
|
flavour_texts_robot["Service"] = character_query.item[40]
|
|
flavour_texts_robot["Clerical"] = character_query.item[41]
|
|
flavour_texts_robot["Security"] = character_query.item[42]
|
|
flavour_texts_robot["Research"] = character_query.item[43]
|
|
|
|
// Records
|
|
gen_record = character_query.item[44]
|
|
med_record = character_query.item[45]
|
|
sec_record = character_query.item[46]
|
|
exploit_record = character_query.item[47]
|
|
ccia_record = character_query.item[60]
|
|
|
|
// Miscellaneous
|
|
disabilities = text2num(character_query.item[48])
|
|
skills = params2list(character_query.item[49])
|
|
|
|
for (var/skill in skills)
|
|
if (skills[skill])
|
|
skills[skill] = text2num(skills[skill])
|
|
|
|
skill_specialization = character_query.item[50]
|
|
home_system = character_query.item[51]
|
|
citizenship = character_query.item[52]
|
|
faction = character_query.item[53]
|
|
religion = character_query.item[54]
|
|
nanotrasen_relation = character_query.item[55]
|
|
|
|
uplinklocation = character_query.item[56]
|
|
|
|
organ_data = params2list(character_query.item[57])
|
|
rlimb_data = params2list(character_query.item[58])
|
|
gear = params2list(character_query.item[59])
|
|
|
|
// Sanitization
|
|
metadata = sanitize_text(metadata, initial(metadata))
|
|
real_name = sanitizeName(real_name)
|
|
|
|
if (isnull(species) || !(species in playable_species))
|
|
species = "Human"
|
|
|
|
if (isnum(underwear))
|
|
var/list/undies = gender == MALE ? underwear_m : underwear_f
|
|
underwear = undies[undies[underwear]]
|
|
|
|
if (isnum(undershirt))
|
|
undershirt = undershirt_t[undershirt_t[undershirt]]
|
|
|
|
if (isnull(language)) language = "None"
|
|
if (isnull(spawnpoint)) spawnpoint = "Arrivals Shuttle"
|
|
if (isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation)
|
|
if (!real_name) real_name = random_name(gender)
|
|
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
|
|
gender = sanitize_gender(gender)
|
|
age = sanitize_integer(age, getMinAge(), getMaxAge(), 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))
|
|
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))
|
|
|
|
if (!skills) ZeroSkills(1)
|
|
if (skills.len) CalculateSkillPoints()
|
|
if (!used_skillpoints) used_skillpoints = 0
|
|
if (isnull(disabilities)) disabilities = 0
|
|
if (!player_alt_titles) player_alt_titles = new()
|
|
if (!organ_data) organ_data = list()
|
|
if (!rlimb_data) rlimb_data = list()
|
|
if (!gear) gear = list()
|
|
|
|
if (!home_system) home_system = "Unset"
|
|
if (!citizenship) citizenship = "None"
|
|
if (!faction) faction = "None"
|
|
if (!religion) religion = "None"
|
|
|
|
return 1
|
|
|
|
/datum/preferences/proc/save_character_sql(var/client/C)
|
|
if (!C)
|
|
return 0
|
|
|
|
if (!current_character)
|
|
return insert_character_sql(C)
|
|
|
|
establish_db_connection(dbcon)
|
|
if (!dbcon.IsConnected())
|
|
error("Error attempting to connect to MySQL server while saving a character.")
|
|
return 0
|
|
|
|
var/DBQuery/initial_query = dbcon.NewQuery("SELECT COUNT(*) AS rowCount FROM ss13_characters WHERE id = :char_id")
|
|
initial_query.Execute(list(":char_id" = current_character))
|
|
|
|
if (!initial_query.NextRow())
|
|
current_character = 0
|
|
return insert_character_sql(C)
|
|
|
|
var/DBQuery/update_query = dbcon.NewQuery({"UPDATE ss13_characters dat
|
|
JOIN ss13_characters_flavour flv ON dat.id = flv.char_id
|
|
SET
|
|
dat.name = :real_name,
|
|
dat.metadata = :metadata,
|
|
dat.random_name = :is_random,
|
|
dat.gender = :gender,
|
|
dat.age = :age,
|
|
dat.species = :species,
|
|
dat.language = :language,
|
|
dat.spawnpoint = :spawnpoint,
|
|
dat.hair_colour = :hair_colour,
|
|
dat.facial_colour = :facial_colour,
|
|
dat.skin_tone = :skin_tone,
|
|
dat.skin_colour = :skin_colour,
|
|
dat.hair_style = :hair_style,
|
|
dat.facial_style = :facial_style,
|
|
dat.eyes_colour = :eyes_colour,
|
|
dat.underwear = :underwear,
|
|
dat.undershirt = :undershirt,
|
|
dat.backbag = :backbag,
|
|
dat.b_type = :b_type,
|
|
dat.jobs = :jobs,
|
|
dat.alternate_option = :alternate_option,
|
|
dat.alternate_titles = :alternate_titles,
|
|
dat.disabilities = :disabilities,
|
|
dat.skills = :skills,
|
|
dat.skills_specialization = :specialization,
|
|
dat.home_system = :home_system,
|
|
dat.citizenship = :citizenship,
|
|
dat.faction = :faction,
|
|
dat.religion = :religion,
|
|
dat.nt_relation = :nt_relation,
|
|
dat.uplink_location = :uplink_loc,
|
|
dat.organs_data = :organ_data,
|
|
dat.organs_robotic = :organs_robotic,
|
|
dat.gear = :gear,
|
|
flv.flavour_general = :flv_general,
|
|
flv.flavour_head = :flv_head,
|
|
flv.flavour_face = :flv_face,
|
|
flv.flavour_eyes = :flv_eyes,
|
|
flv.flavour_torso = :flv_torso,
|
|
flv.flavour_arms = :flv_arms,
|
|
flv.flavour_hands = :flv_hands,
|
|
flv.flavour_legs = :flv_legs,
|
|
flv.flavour_feet = :flv_feet,
|
|
flv.robot_default = :robot_default,
|
|
flv.robot_standard = :robot_standard,
|
|
flv.robot_engineering = :robot_engineering,
|
|
flv.robot_construction = :robot_construction,
|
|
flv.robot_surgeon = :robot_surgeon,
|
|
flv.robot_crisis = :robot_crisis,
|
|
flv.robot_miner = :robot_miner,
|
|
flv.robot_janitor = :robot_janitor,
|
|
flv.robot_service = :robot_service,
|
|
flv.robot_clerical = :robot_clerical,
|
|
flv.robot_security = :robot_security,
|
|
flv.robot_research = :robot_research,
|
|
flv.records_medical = :med_rec,
|
|
flv.records_security = :sec_rec,
|
|
flv.records_employment = :gen_rec,
|
|
flv.records_exploit = :exploit_record
|
|
WHERE dat.id = :char_id"})
|
|
|
|
update_query.Execute(get_update_insert_params())
|
|
|
|
if (update_query.ErrorMsg())
|
|
error("Error updating character #[current_character]: [update_query.ErrorMsg()]")
|
|
return 0
|
|
|
|
return 1
|
|
|
|
/datum/preferences/proc/insert_character_sql(var/client/C)
|
|
if (!C)
|
|
return 0
|
|
|
|
establish_db_connection(dbcon)
|
|
if (!dbcon.IsConnected())
|
|
error("Error attempting to connect to MySQL server while inserting a character.")
|
|
return 0
|
|
|
|
var/params[] = get_update_insert_params(0, C)
|
|
|
|
var/DBQuery/insert_query = dbcon.NewQuery({"INSERT INTO ss13_characters (id, ckey, name, metadata, random_name, gender, age, species, language, hair_colour, facial_colour, skin_tone, skin_colour, hair_style, facial_style, eyes_colour, underwear, undershirt, backbag, b_type, spawnpoint, jobs, alternate_option, alternate_titles, disabilities, skills, skills_specialization, home_system, citizenship, faction, religion, nt_relation, uplink_location, organs_data, organs_robotic, gear)
|
|
VALUES (NULL, :ckey, :real_name, :metadata, :is_random, :gender, :age, :species, :language, :hair_colour, :facial_colour, :skin_tone, :skin_colour, :hair_style, :facial_style, :eyes_colour, :underwear, :undershirt, :backbag, :b_type, :spawnpoint, :jobs, :alternate_option, :alternate_titles, :disabilities, :skills, :specialization, :home_system, :citizenship, :faction, :religion, :nt_relation, :uplink_loc, :organ_data, :organs_robotic, :gear);"})
|
|
insert_query.Execute(params, 1)
|
|
|
|
if (insert_query.ErrorMsg())
|
|
return 0
|
|
|
|
var/DBQuery/get_query = dbcon.NewQuery("SELECT id FROM ss13_characters WHERE ckey = :ckey AND name = :real_name ORDER BY id DESC LIMIT 1;")
|
|
get_query.Execute(list(":ckey" = C.ckey, ":real_name" = real_name))
|
|
|
|
if (get_query.NextRow())
|
|
current_character = text2num(get_query.item[1])
|
|
params[":char_id"] = current_character
|
|
|
|
insert_query = dbcon.NewQuery({"INSERT INTO ss13_characters_flavour (char_id, records_employment, records_medical, records_security, records_exploit, flavour_general, flavour_head, flavour_face, flavour_eyes, flavour_torso, flavour_arms, flavour_hands, flavour_legs, flavour_feet, robot_default, robot_standard, robot_engineering, robot_construction, robot_surgeon, robot_crisis, robot_miner, robot_janitor, robot_service, robot_clerical, robot_security, robot_research)
|
|
VALUES (:char_id, :gen_rec, :med_rec, :sec_rec, :exploit_record, :flv_general, :flv_head, :flv_face, :flv_eyes, :flv_torso, :flv_arms, :flv_hands, :flv_legs, :flv_feet, :robot_default, :robot_standard, :robot_engineering, :robot_construction, :robot_surgeon, :robot_crisis, :robot_miner, :robot_janitor, :robot_service, :robot_clerical, :robot_security, :robot_research);"})
|
|
insert_query.Execute(params, 1)
|
|
|
|
if (insert_query.ErrorMsg())
|
|
return 0
|
|
|
|
return 1
|
|
|
|
// Helper function.
|
|
// Returns an array to be used in save_character_sql and insert_character_sql.
|
|
/datum/preferences/proc/get_update_insert_params(var/include_id = 1, var/client/C = null)
|
|
var/hair_hex = "#" + num2hex(r_hair) + num2hex(g_hair) + num2hex(b_hair)
|
|
var/facial_hex = "#" + num2hex(r_facial) + num2hex(g_facial) + num2hex(b_facial)
|
|
var/eyes_hex = "#" + num2hex(r_eyes) + num2hex(g_eyes) + num2hex(b_eyes)
|
|
var/skin_hex = "#" + num2hex(r_skin) + num2hex(g_skin) + num2hex(b_skin)
|
|
|
|
var/language_string = "None"
|
|
if (!istext(language))
|
|
if (istype(language, /datum/language))
|
|
for (var/L in all_languages)
|
|
if (language == all_languages[L])
|
|
language_string = L
|
|
break
|
|
else
|
|
language_string = language
|
|
|
|
var/jobs_list[] = list()
|
|
jobs_list["civ_high"] = job_civilian_high
|
|
jobs_list["civ_med"] = job_civilian_med
|
|
jobs_list["civ_low"] = job_civilian_low
|
|
jobs_list["medsci_high"] = job_medsci_high
|
|
jobs_list["medsci_med"] = job_medsci_med
|
|
jobs_list["medsci_low"] = job_medsci_low
|
|
jobs_list["engsec_high"] = job_engsec_high
|
|
jobs_list["engsec_med"] = job_engsec_med
|
|
jobs_list["engsec_low"] = job_engsec_low
|
|
|
|
var/params[] = list()
|
|
|
|
params[":real_name"] = real_name
|
|
params[":metadata"] = metadata
|
|
params[":is_random"] = be_random_name
|
|
params[":gender"] = gender
|
|
params[":age"] = age
|
|
params[":species"] = species
|
|
params[":language"] = language_string
|
|
params[":spawnpoint"] = spawnpoint
|
|
params[":hair_colour"] = hair_hex
|
|
params[":facial_colour"] = facial_hex
|
|
params[":skin_tone"] = s_tone
|
|
params[":skin_colour"] = skin_hex
|
|
|
|
if (istext(h_style))
|
|
params[":hair_style"] = h_style
|
|
else if (istype(h_style, /datum/sprite_accessory/hair))
|
|
var/datum/sprite_accessory/hair/current_h = h_style
|
|
params[":hair_style"] = current_h.name
|
|
else
|
|
params[":hair_style"] = "Bald"
|
|
|
|
if (istext(f_style))
|
|
params[":facial_style"] = f_style
|
|
else if (istype(h_style, /datum/sprite_accessory/facial_hair))
|
|
var/datum/sprite_accessory/facial_hair/current_f = f_style
|
|
params[":facial_style"] = current_f.name
|
|
else
|
|
params[":facial_style"] = "Shaved"
|
|
|
|
params[":eyes_colour"] = eyes_hex
|
|
params[":underwear"] = underwear
|
|
params[":undershirt"] = undershirt
|
|
params[":backbag"] = backbag
|
|
params[":b_type"] = b_type
|
|
|
|
params[":alternate_option"] = alternate_option
|
|
params[":jobs"] = list2params(jobs_list)
|
|
params[":alternate_titles"] = list2params(player_alt_titles)
|
|
|
|
params[":flv_general"] = flavor_texts["general"]
|
|
params[":flv_head"] = flavor_texts["head"]
|
|
params[":flv_face"] = flavor_texts["face"]
|
|
params[":flv_eyes"] = flavor_texts["eyes"]
|
|
params[":flv_torso"] = flavor_texts["torso"]
|
|
params[":flv_arms"] = flavor_texts["arms"]
|
|
params[":flv_hands"] = flavor_texts["hands"]
|
|
params[":flv_legs"] = flavor_texts["legs"]
|
|
params[":flv_feet"] = flavor_texts["feet"]
|
|
params[":robot_default"] = flavour_texts_robot["Default"]
|
|
params[":robot_standard"] = flavour_texts_robot["Standard"]
|
|
params[":robot_engineering"] = flavour_texts_robot["Engineering"]
|
|
params[":robot_construction"] = flavour_texts_robot["Construction"]
|
|
params[":robot_surgeon"] = flavour_texts_robot["Surgeon"]
|
|
params[":robot_crisis"] = flavour_texts_robot["Crisis"]
|
|
params[":robot_miner"] = flavour_texts_robot["Miner"]
|
|
params[":robot_janitor"] = flavour_texts_robot["Janitor"]
|
|
params[":robot_service"] = flavour_texts_robot["Service"]
|
|
params[":robot_clerical"] = flavour_texts_robot["Clerical"]
|
|
params[":robot_security"] = flavour_texts_robot["Security"]
|
|
params[":robot_research"] = flavour_texts_robot["Research"]
|
|
|
|
params[":med_rec"] = med_record
|
|
params[":sec_rec"] = sec_record
|
|
params[":gen_rec"] = gen_record
|
|
params[":disabilities"] = disabilities
|
|
params[":skills"] = list2params(skills)
|
|
params[":specialization"] = skill_specialization
|
|
params[":home_system"] = home_system
|
|
params[":citizenship"] = citizenship
|
|
params[":faction"] = faction
|
|
params[":religion"] = religion
|
|
params[":nt_relation"] = nanotrasen_relation
|
|
params[":uplink_loc"] = uplinklocation
|
|
params[":exploit_record"] = exploit_record
|
|
params[":organ_data"] = list2params(organ_data)
|
|
params[":organs_robotic"] = list2params(rlimb_data)
|
|
params[":gear"] = list2params(gear)
|
|
|
|
if (include_id)
|
|
params[":char_id"] = current_character
|
|
|
|
if (C)
|
|
params[":ckey"] = C.ckey
|
|
|
|
return params
|
|
|
|
/datum/preferences/proc/new_character_sql(var/client/C)
|
|
if (!C)
|
|
return 0
|
|
|
|
current_character = 0
|
|
|
|
var/DBQuery/char_id_update = dbcon.NewQuery("UPDATE ss13_player_preferences SET current_character = '0' WHERE ckey = :ckey")
|
|
char_id_update.Execute(list(":ckey" = C.ckey))
|
|
|
|
species = "Human"
|
|
language = "None"
|
|
spawnpoint = "Arrivals Shuttle"
|
|
nanotrasen_relation = initial(nanotrasen_relation)
|
|
|
|
gender = pick(MALE, FEMALE)
|
|
real_name = random_name(gender, species)
|
|
gear = list()
|
|
|
|
b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
|
|
return 1
|
|
|
|
/datum/preferences/proc/delete_character_sql(var/client/C)
|
|
if (!C)
|
|
return 0
|
|
|
|
if (!current_character)
|
|
return 0
|
|
|
|
if (alert(C.mob, "This will permanently delete the character. Are you sure you wish to do this?", "Delete Character" ,"Yes", "No") == "No")
|
|
return 0
|
|
|
|
establish_db_connection(dbcon)
|
|
if (!dbcon.IsConnected())
|
|
error("Error attempting to connect to MySQL server while deleting a character.")
|
|
return 0
|
|
|
|
var/DBQuery/query = dbcon.NewQuery("SELECT COUNT(*) AS rowCount FROM ss13_characters WHERE id = :char_id AND ckey = :ckey")
|
|
query.Execute(list(":char_id" = current_character, ":ckey" = C.ckey))
|
|
|
|
if (!query.NextRow())
|
|
return 0
|
|
|
|
var/DBQuery/delete_query = dbcon.NewQuery("UPDATE ss13_characters SET deleted_at = NOW() WHERE id = :id")
|
|
delete_query.Execute(list(":id" = current_character))
|
|
|
|
var/DBQuery/select_query = dbcon.NewQuery("SELECT id FROM ss13_characters WHERE ckey = :ckey AND deleted_at IS NULL ORDER BY id ASC LIMIT 1")
|
|
select_query.Execute(list(":ckey" = C.ckey))
|
|
|
|
if (select_query.NextRow())
|
|
load_character_sql(text2num(select_query.item[1]), C)
|
|
else
|
|
new_character_sql(C)
|
|
|
|
C << "<span class='notice'>Your character has been deleted from the database.</span>"
|
|
return 1
|