mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-07 11:22:24 +00:00
Initial character creation escape sequences
Added initial skill/language/bind saves to character creation
This commit is contained in:
parent
d7dc733480
commit
e390531dcd
@ -573,8 +573,8 @@ bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, Playe
|
|||||||
")",
|
")",
|
||||||
character_id, // " id, "
|
character_id, // " id, "
|
||||||
account_id, // " account_id, "
|
account_id, // " account_id, "
|
||||||
pp->name, // " `name`, "
|
EscapeString(pp->name).c_str(), // " `name`, "
|
||||||
pp->last_name, // " last_name, "
|
EscapeString(pp->last_name).c_str(), // " last_name, "
|
||||||
pp->gender, // " gender, "
|
pp->gender, // " gender, "
|
||||||
pp->race, // " race, "
|
pp->race, // " race, "
|
||||||
pp->class_, // " class, "
|
pp->class_, // " class, "
|
||||||
@ -598,8 +598,8 @@ bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, Playe
|
|||||||
pp->ability_number, // " ability_number, "
|
pp->ability_number, // " ability_number, "
|
||||||
pp->ability_time_minutes, // " ability_time_minutes, "
|
pp->ability_time_minutes, // " ability_time_minutes, "
|
||||||
pp->ability_time_hours, // " ability_time_hours, "
|
pp->ability_time_hours, // " ability_time_hours, "
|
||||||
pp->title, // " title, "
|
EscapeString(pp->title).c_str(), // " title, "
|
||||||
pp->suffix, // " suffix, "
|
EscapeString(pp->suffix).c_str(), // " suffix, "
|
||||||
pp->exp, // " exp, "
|
pp->exp, // " exp, "
|
||||||
pp->points, // " points, "
|
pp->points, // " points, "
|
||||||
pp->mana, // " mana, "
|
pp->mana, // " mana, "
|
||||||
@ -661,13 +661,50 @@ bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, Playe
|
|||||||
pp->raidAutoconsent, // " raid_auto_consent, "
|
pp->raidAutoconsent, // " raid_auto_consent, "
|
||||||
pp->guildAutoconsent, // " guild_auto_consent, "
|
pp->guildAutoconsent, // " guild_auto_consent, "
|
||||||
pp->RestTimer // " RestTimer) "
|
pp->RestTimer // " RestTimer) "
|
||||||
);
|
);
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
ThrowDBError(results.ErrorMessage(), "Database::SaveCharacterCreate", query);
|
ThrowDBError(results.ErrorMessage(), "Database::SaveCharacterCreate Character Data", query);
|
||||||
|
/* Save Bind Points */
|
||||||
|
query = StringFormat("REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, is_home)"
|
||||||
|
" VALUES (%u, %u, %u, %f, %f, %f, %f, %i), "
|
||||||
|
"(%u, %u, %u, %f, %f, %f, %f, %i)",
|
||||||
|
character_id, pp->binds[0].zoneId, 0, pp->binds[0].x, pp->binds[0].y, pp->binds[0].z, pp->binds[0].heading, 0,
|
||||||
|
character_id, pp->binds[4].zoneId, 0, pp->binds[4].x, pp->binds[4].y, pp->binds[4].z, pp->binds[4].heading, 1
|
||||||
|
); results = QueryDatabase(query); ThrowDBError(results.ErrorMessage(), "Database::SaveCharacterCreate Bind Point", query);
|
||||||
|
|
||||||
|
/* Save Skills */
|
||||||
|
int firstquery = 0;
|
||||||
|
for (int i = 0; i < MAX_PP_SKILL; i++){
|
||||||
|
if (pp->skills[i] > 0){
|
||||||
|
if (firstquery != 1){
|
||||||
|
firstquery = 1;
|
||||||
|
query = StringFormat("REPLACE INTO `character_skills` (id, skill_id, value) VALUES (%u, %u, %u)", character_id, i, pp->skills[i]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
query = query + StringFormat(", (%u, %u, %u)", character_id, i, pp->skills[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
results = QueryDatabase(query); ThrowDBError(results.ErrorMessage(), "Database::SaveCharacterCreate Starting Skills", query);
|
||||||
|
|
||||||
|
/* Save Language */
|
||||||
|
firstquery = 0;
|
||||||
|
for (int i = 0; i < MAX_PP_LANGUAGE; i++){
|
||||||
|
if (pp->languages[i] > 0){
|
||||||
|
if (firstquery != 1){
|
||||||
|
firstquery = 1;
|
||||||
|
query = StringFormat("REPLACE INTO `character_languages` (id, lang_id, value) VALUES (%u, %u, %u)", character_id, i, pp->languages[i]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
query = query + StringFormat(", (%u, %u, %u)", character_id, i, pp->languages[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
results = QueryDatabase(query); ThrowDBError(results.ErrorMessage(), "Database::SaveCharacterCreate Starting Languages", query);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* This only for new Character creation storing */
|
/* This only for new Character creation storing */
|
||||||
bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, Inventory* inv) {
|
bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, Inventory* inv) {
|
||||||
uint32 charid = 0; char zone[50]; float x, y, z;
|
uint32 charid = 0; char zone[50]; float x, y, z;
|
||||||
@ -690,7 +727,7 @@ bool Database::StoreCharacter(uint32 account_id, PlayerProfile_Struct* pp, Inven
|
|||||||
y = pp->y;
|
y = pp->y;
|
||||||
z = pp->z;
|
z = pp->z;
|
||||||
|
|
||||||
/* Saves Player Profile Data to `character_data` */
|
/* Saves Player Profile Data */
|
||||||
SaveCharacterCreate(charid, account_id, pp);
|
SaveCharacterCreate(charid, account_id, pp);
|
||||||
|
|
||||||
/* Insert starting inventory... */
|
/* Insert starting inventory... */
|
||||||
|
|||||||
@ -171,7 +171,7 @@ void Client::SendCharInfo() {
|
|||||||
EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendCharInfo, sizeof(CharacterSelect_Struct));
|
EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendCharInfo, sizeof(CharacterSelect_Struct));
|
||||||
CharacterSelect_Struct* cs = (CharacterSelect_Struct*)outapp->pBuffer;
|
CharacterSelect_Struct* cs = (CharacterSelect_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
database.GetCharSelectInfo(GetAccountID(), cs);
|
database.GetCharSelectInfo(GetAccountID(), cs, ClientVersionBit);
|
||||||
|
|
||||||
QueuePacket(outapp);
|
QueuePacket(outapp);
|
||||||
safe_delete(outapp);
|
safe_delete(outapp);
|
||||||
@ -699,7 +699,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) {
|
|||||||
if(!pZoning && ew->return_home && !ew->tutorial) {
|
if(!pZoning && ew->return_home && !ew->tutorial) {
|
||||||
CharacterSelect_Struct* cs = new CharacterSelect_Struct;
|
CharacterSelect_Struct* cs = new CharacterSelect_Struct;
|
||||||
memset(cs, 0, sizeof(CharacterSelect_Struct));
|
memset(cs, 0, sizeof(CharacterSelect_Struct));
|
||||||
database.GetCharSelectInfo(GetAccountID(), cs);
|
database.GetCharSelectInfo(GetAccountID(), cs, ClientVersionBit);
|
||||||
bool home_enabled = false;
|
bool home_enabled = false;
|
||||||
|
|
||||||
for(int x = 0; x < 10; ++x)
|
for(int x = 0; x < 10; ++x)
|
||||||
@ -729,7 +729,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) {
|
|||||||
if(!pZoning && (RuleB(World, EnableTutorialButton) && (ew->tutorial || StartInTutorial))) {
|
if(!pZoning && (RuleB(World, EnableTutorialButton) && (ew->tutorial || StartInTutorial))) {
|
||||||
CharacterSelect_Struct* cs = new CharacterSelect_Struct;
|
CharacterSelect_Struct* cs = new CharacterSelect_Struct;
|
||||||
memset(cs, 0, sizeof(CharacterSelect_Struct));
|
memset(cs, 0, sizeof(CharacterSelect_Struct));
|
||||||
database.GetCharSelectInfo(GetAccountID(), cs);
|
database.GetCharSelectInfo(GetAccountID(), cs, ClientVersionBit);
|
||||||
bool tutorial_enabled = false;
|
bool tutorial_enabled = false;
|
||||||
|
|
||||||
for(int x = 0; x < 10; ++x)
|
for(int x = 0; x < 10; ++x)
|
||||||
|
|||||||
@ -33,8 +33,10 @@ extern std::vector<RaceClassCombos> character_create_race_class_combos;
|
|||||||
|
|
||||||
|
|
||||||
// solar: the current stuff is at the bottom of this function
|
// solar: the current stuff is at the bottom of this function
|
||||||
void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct* cs) {
|
void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct* cs, uint32 ClientVersion) {
|
||||||
Inventory *inv;
|
Inventory *inv;
|
||||||
|
uint8 has_home = 0;
|
||||||
|
uint8 has_bind = 0;
|
||||||
|
|
||||||
/* Initialize Variables */
|
/* Initialize Variables */
|
||||||
for (int i=0; i<10; i++) {
|
for (int i=0; i<10; i++) {
|
||||||
@ -105,24 +107,53 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct*
|
|||||||
cs->gohome[char_num] = 1;
|
cs->gohome[char_num] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Set Bind Point Data for any character that may possibly be missing it for any reason */
|
||||||
This part creates home city entries for characters created before the home bind point was tracked.
|
cquery = StringFormat("SELECT `zone_id`, `instance_id`, `x`, `y`, `z`, `heading`, `is_home` FROM `character_bind` WHERE `id` = %i LIMIT 2", character_id);
|
||||||
Do it here because the player profile is already loaded and it's as good a spot as any. This whole block should
|
auto results_bind = database.QueryDatabase(cquery); has_home = 0; has_bind = 0;
|
||||||
probably be removed at some point, when most accounts are safely converted.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Load Character Bind Data */
|
|
||||||
cquery = StringFormat("SELECT zone_id, instance_id, x, y, z, heading FROM character_bind_home WHERE `id` = %i LIMIT 1", character_id);
|
|
||||||
auto results_bind = database.QueryDatabase(cquery); int r = 0;
|
|
||||||
for (auto row_b = results_bind.begin(); row_b != results_bind.end(); ++row_b) {
|
for (auto row_b = results_bind.begin(); row_b != results_bind.end(); ++row_b) {
|
||||||
uint8 bind_zone_id = atoi(row_b[r]); r++;
|
if (row_b[6] && atoi(row_b[6]) == 1){ has_home = 1; }
|
||||||
uint8 bind_instance_id = atoi(row_b[r]); r++;
|
if (row_b[6] && atoi(row_b[6]) == 0){ has_bind = 1; }
|
||||||
uint8 bind_x_id = atoi(row_b[r]); r++;
|
|
||||||
uint8 bind_y_id = atoi(row_b[r]); r++;
|
|
||||||
uint8 bind_z_id = atoi(row_b[r]); r++;
|
|
||||||
uint8 bind_heading_id = atoi(row_b[r]); r++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (has_home == 0 || has_bind == 0){
|
||||||
|
cquery = StringFormat("SELECT `zone_id`, `bind_id`, `x`, `y`, `z` FROM `start_zones` WHERE `player_class` = %i AND `player_deity` = %i AND `player_race` = %i",
|
||||||
|
cs->class_[char_num], cs->deity[char_num], cs->race[char_num]);
|
||||||
|
auto results_bind = database.QueryDatabase(cquery);
|
||||||
|
for (auto row_d = results_bind.begin(); row_d != results_bind.end(); ++row_d) {
|
||||||
|
/* If a bind_id is specified, make them start there */
|
||||||
|
if (atoi(row_d[1]) != 0) {
|
||||||
|
pp.binds[4].zoneId = (uint32)atoi(row_d[1]);
|
||||||
|
GetSafePoints(pp.binds[4].zoneId, 0, &pp.binds[4].x, &pp.binds[4].y, &pp.binds[4].z);
|
||||||
|
}
|
||||||
|
/* Otherwise, use the zone and coordinates given */
|
||||||
|
else {
|
||||||
|
pp.binds[4].zoneId = (uint32)atoi(row_d[0]);
|
||||||
|
float x = atof(row_d[2]);
|
||||||
|
float y = atof(row_d[3]);
|
||||||
|
float z = atof(row_d[4]);
|
||||||
|
if (x == 0 && y == 0 && z == 0){ GetSafePoints(pp.binds[4].zoneId, 0, &x, &y, &z); }
|
||||||
|
pp.binds[4].x = x; pp.binds[4].y = y; pp.binds[4].z = z;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pp.binds[0] = pp.binds[4];
|
||||||
|
/* If no home bind set, set it */
|
||||||
|
if (has_home == 0){
|
||||||
|
std::string query = StringFormat("REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, is_home)"
|
||||||
|
" VALUES (%u, %u, %u, %f, %f, %f, %f, %i)",
|
||||||
|
character_id, pp.binds[4].zoneId, 0, pp.binds[4].x, pp.binds[4].y, pp.binds[4].z, pp.binds[4].heading, 1);
|
||||||
|
auto results_bset = QueryDatabase(query); ThrowDBError(results_bset.ErrorMessage(), "WorldDatabase::GetCharSelectInfo Set Home Point", query);
|
||||||
|
}
|
||||||
|
/* If no regular bind set, set it */
|
||||||
|
if (has_bind == 0){
|
||||||
|
std::string query = StringFormat("REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, is_home)"
|
||||||
|
" VALUES (%u, %u, %u, %f, %f, %f, %f, %i)",
|
||||||
|
character_id, pp.binds[0].zoneId, 0, pp.binds[0].x, pp.binds[0].y, pp.binds[0].z, pp.binds[0].heading, 0);
|
||||||
|
auto results_bset = QueryDatabase(query); ThrowDBError(results_bset.ErrorMessage(), "WorldDatabase::GetCharSelectInfo Set Bind Point", query);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Bind End */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Character's equipped items
|
Character's equipped items
|
||||||
@merth: Haven't done bracer01/bracer02 yet.
|
@merth: Haven't done bracer01/bracer02 yet.
|
||||||
|
|||||||
@ -31,7 +31,7 @@ public:
|
|||||||
bool GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc);
|
bool GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc);
|
||||||
bool GetStartZoneSoF(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc);
|
bool GetStartZoneSoF(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc);
|
||||||
|
|
||||||
void GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct*);
|
void GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct*, uint32 ClientVersion);
|
||||||
int MoveCharacterToBind(int CharID, uint8 bindnum = 0);
|
int MoveCharacterToBind(int CharID, uint8 bindnum = 0);
|
||||||
|
|
||||||
void GetLauncherList(std::vector<std::string> &result);
|
void GetLauncherList(std::vector<std::string> &result);
|
||||||
|
|||||||
@ -571,7 +571,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) {
|
|||||||
results = database.QueryDatabase(query);
|
results = database.QueryDatabase(query);
|
||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
m_pp.lastlogin = time(nullptr);
|
m_pp.lastlogin = time(nullptr);
|
||||||
if (atoi(row[4]) > 0){
|
if (row[4] && atoi(row[4]) > 0){
|
||||||
guild_id = atoi(row[4]);
|
guild_id = atoi(row[4]);
|
||||||
if (row[5] != nullptr){ guildrank = atoi(row[5]); }
|
if (row[5] != nullptr){ guildrank = atoi(row[5]); }
|
||||||
else{ guildrank = GUILD_RANK_NONE; }
|
else{ guildrank = GUILD_RANK_NONE; }
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user