Implement AA timers reset on death

This is a field in the packet, live only uses this for Lay on Hands

Currently I didn't add this to the packet since it has 0 effect on the
client.

We could move this field to aa_ranks which would give more flexibility
for custom servers, but no one said they wanted it there.
This commit is contained in:
Michael Cook (mackal) 2020-02-06 14:20:18 -05:00
parent 13c2df7eb1
commit 2f5909d4cb
12 changed files with 37 additions and 8 deletions

View File

@ -4401,7 +4401,7 @@ struct SendAA_Struct {
/*0104*/ uint32 special_category; /*0104*/ uint32 special_category;
/*0108*/ uint8 shroud; /*0108*/ uint8 shroud;
/*0109*/ uint8 unknown109; /*0109*/ uint8 unknown109;
/*0110*/ uint8 layonhands; // 1 for lay on hands -- doesn't seem to matter? /*0110*/ uint8 reset_on_death; // timer is reset on death
/*0111*/ uint8 unknown111; /*0111*/ uint8 unknown111;
/*0112*/ uint32 total_abilities; /*0112*/ uint32 total_abilities;
/*0116*/ AA_Ability abilities[0]; /*0116*/ AA_Ability abilities[0];

View File

@ -4341,7 +4341,7 @@ struct SendAA_Struct {
/*0104*/ uint32 special_category; /*0104*/ uint32 special_category;
/*0108*/ uint8 shroud; /*0108*/ uint8 shroud;
/*0109*/ uint8 unknown109; /*0109*/ uint8 unknown109;
/*0110*/ uint8 layonhands; // 1 for lay on hands -- doesn't seem to matter? /*0110*/ uint8 reset_on_death; // timer is reset on death
/*0111*/ uint8 unknown111; /*0111*/ uint8 unknown111;
/*0112*/ uint32 total_abilities; /*0112*/ uint32 total_abilities;
/*0116*/ AA_Ability abilities[0]; /*0116*/ AA_Ability abilities[0];

View File

@ -3780,7 +3780,7 @@ struct SendAA_Struct {
/*0092*/ uint32 special_category; /*0092*/ uint32 special_category;
/*0096*/ uint8 shroud; /*0096*/ uint8 shroud;
/*0097*/ uint8 unknown97; /*0097*/ uint8 unknown97;
/*0098*/ uint8 layonhands; // 1 for lay on hands -- doesn't seem to matter? /*0098*/ uint8 reset_on_death; // timer is reset on death
/*0099*/ uint8 unknown99; /*0099*/ uint8 unknown99;
/*0100*/ uint32 total_abilities; /*0100*/ uint32 total_abilities;
/*0104*/ AA_Ability abilities[0]; /*0104*/ AA_Ability abilities[0];

View File

@ -3704,7 +3704,7 @@ struct SendAA_Struct {
/*0088*/ uint32 aa_expansion; /*0088*/ uint32 aa_expansion;
/*0092*/ uint32 special_category; /*0092*/ uint32 special_category;
/*0096*/ uint8 shroud; /*0096*/ uint8 shroud;
/*0097*/ uint8 unknown97; /*0097*/ uint8 reset_on_death; // timer is reset on death -- guess
/*0098*/ uint32 total_abilities; /*0098*/ uint32 total_abilities;
/*0102*/ AA_Ability abilities[0]; /*0102*/ AA_Ability abilities[0];
}; };

View File

@ -3835,7 +3835,7 @@ struct SendAA_Struct {
/*0092*/ uint32 special_category; /*0092*/ uint32 special_category;
/*0096*/ uint8 shroud; /*0096*/ uint8 shroud;
/*0097*/ uint8 unknown97; /*0097*/ uint8 unknown97;
/*0098*/ uint8 layonhands; // 1 for lay on hands -- doesn't seem to matter? /*0098*/ uint8 reset_on_death; // timer is reset on death
/*0099*/ uint8 unknown99; /*0099*/ uint8 unknown99;
/*0100*/ uint32 total_abilities; /*0100*/ uint32 total_abilities;
/*0104*/ AA_Ability abilities[0]; /*0104*/ AA_Ability abilities[0];

View File

@ -34,7 +34,7 @@
* Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt * Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
*/ */
#define CURRENT_BINARY_DATABASE_VERSION 9149 #define CURRENT_BINARY_DATABASE_VERSION 9150
#ifdef BOTS #ifdef BOTS
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9026 #define CURRENT_BINARY_BOTS_DATABASE_VERSION 9026

View File

@ -403,6 +403,7 @@
9147|2020_01_24_grid_centerpoint_wp.sql|SHOW COLUMNS FROM `grid_entries` LIKE 'centerpoint'|empty| 9147|2020_01_24_grid_centerpoint_wp.sql|SHOW COLUMNS FROM `grid_entries` LIKE 'centerpoint'|empty|
9148|2020_01_28_corpse_guild_consent_id.sql|SHOW COLUMNS FROM `character_corpses` LIKE 'guild_consent_id'|empty| 9148|2020_01_28_corpse_guild_consent_id.sql|SHOW COLUMNS FROM `character_corpses` LIKE 'guild_consent_id'|empty|
9149|2020_02_06_globalloot.sql|SHOW COLUMNS FROM `global_loot` LIKE 'hot_zone'|empty| 9149|2020_02_06_globalloot.sql|SHOW COLUMNS FROM `global_loot` LIKE 'hot_zone'|empty|
9150|2020_02_06_aa_reset_on_death.sql|SHOW COLUMNS FROM `aa_ability` LIKE 'reset_on_death'|empty|
# Upgrade conditions: # Upgrade conditions:
# This won't be needed after this system is implemented, but it is used database that are not # This won't be needed after this system is implemented, but it is used database that are not

View File

@ -0,0 +1,2 @@
ALTER TABLE `aa_ability` ADD `reset_on_death` TINYINT(4) NOT NULL DEFAULT '0';
UPDATE `aa_ability` SET `reset_on_death` = '1' WHERE `id` = 6001;

View File

@ -1023,6 +1023,24 @@ void Client::ResetAlternateAdvancementTimers() {
safe_delete(outapp); safe_delete(outapp);
} }
void Client::ResetOnDeathAlternateAdvancement() {
for (const auto &aa : aa_ranks) {
auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa.first, aa.second.first);
auto ability = ability_rank.first;
auto rank = ability_rank.second;
if (!ability)
continue;
if (!rank)
continue;
// since they're dying, we just need to clear the DB
if (ability->reset_on_death)
p_timers.Clear(&database, rank->spell_type + pTimerAAStart);
}
}
void Client::PurchaseAlternateAdvancementRank(int rank_id) { void Client::PurchaseAlternateAdvancementRank(int rank_id) {
AA::Rank *rank = zone->GetAlternateAdvancementRank(rank_id); AA::Rank *rank = zone->GetAlternateAdvancementRank(rank_id);
if(!rank) { if(!rank) {
@ -1646,7 +1664,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map<int, std
LogInfo("Loading Alternate Advancement Abilities"); LogInfo("Loading Alternate Advancement Abilities");
abilities.clear(); abilities.clear();
std::string query = "SELECT id, name, category, classes, races, deities, drakkin_heritage, status, type, charges, " std::string query = "SELECT id, name, category, classes, races, deities, drakkin_heritage, status, type, charges, "
"grant_only, first_rank_id FROM aa_ability WHERE enabled = 1"; "grant_only, reset_on_death, first_rank_id FROM aa_ability WHERE enabled = 1";
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if(results.Success()) { if(results.Success()) {
for(auto row = results.begin(); row != results.end(); ++row) { for(auto row = results.begin(); row != results.end(); ++row) {
@ -1663,7 +1681,8 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map<int, std
ability->type = atoi(row[8]); ability->type = atoi(row[8]);
ability->charges = atoi(row[9]); ability->charges = atoi(row[9]);
ability->grant_only = atoi(row[10]) != 0 ? true : false; ability->grant_only = atoi(row[10]) != 0 ? true : false;
ability->first_rank_id = atoi(row[11]); ability->reset_on_death = atoi(row[11]) != 0 ? true : false;
ability->first_rank_id = atoi(row[12]);
ability->first = nullptr; ability->first = nullptr;
abilities[ability->id] = std::unique_ptr<AA::Ability>(ability); abilities[ability->id] = std::unique_ptr<AA::Ability>(ability);

View File

@ -50,6 +50,7 @@ public:
int drakkin_heritage; int drakkin_heritage;
int status; int status;
bool grant_only; bool grant_only;
bool reset_on_death;
int type; int type;
int charges; int charges;
int first_rank_id; int first_rank_id;

View File

@ -1852,6 +1852,11 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::Sk
BuffFadeDetrimental(); BuffFadeDetrimental();
} }
/*
Reset AA reuse timers that need to be, live-like this is only Lay on Hands
*/
ResetOnDeathAlternateAdvancement();
/* /*
Finally, send em home Finally, send em home

View File

@ -838,6 +838,7 @@ public:
void SendAlternateAdvancementTimers(); void SendAlternateAdvancementTimers();
void ResetAlternateAdvancementTimer(int ability); void ResetAlternateAdvancementTimer(int ability);
void ResetAlternateAdvancementTimers(); void ResetAlternateAdvancementTimers();
void ResetOnDeathAlternateAdvancement();
void SetAAPoints(uint32 points) { m_pp.aapoints = points; SendAlternateAdvancementStats(); } void SetAAPoints(uint32 points) { m_pp.aapoints = points; SendAlternateAdvancementStats(); }
void AddAAPoints(uint32 points) { m_pp.aapoints += points; SendAlternateAdvancementStats(); } void AddAAPoints(uint32 points) { m_pp.aapoints += points; SendAlternateAdvancementStats(); }