Add character-specific zone-based experience modifiers. (#1326)

* Add character-specific zone-based experience modifiers.

This will allow server operators to give players individual experience modifiers (regular and AA).

Zone ID 0 will server as a global modifier for players, if no rows are found the modifier defaults to 1.0 so experience is neither increased nor decreased.

Setting a zone-specific modifier will override the zone ID 0 global modifier.

Requires a SQL update: sql/git/required/2021_04_11_character_exp_modifiers.sql

- Add quest::getaaexpmodifierbycharid(character_id, zone_id) to Perl.
- Add eq.get_aa_exp_modifier_by_char_id(character_id, zone_id) to Lua.
- Add quest::getexpmodifierbycharid(character_id, zone_id) to Perl.
- Add eq.get_exp_modifier_by_char_id(character_id, zone_id) to Lua.
- Add quest::setaaexpmodifierbycharid(character_id, zone_id, aa_modifier) to Perl.
- Add eq.set_aa_exp_modifier_by_char_id(character_id, zone_id, aa_modifier) to Lua.
- Add quest::setexpmodifierbycharid(character_id, zone_id, exp_modifier) to Perl.
- Add eq.set_exp_modifier_by_char_id(character_id, zone_id, exp_modifier) to Lua.
- Add $client->GetAAEXPModifier(character_id, zone_id) to Perl.
- Add client:GetAAEXPModifier(character_id, zone_id) to Lua.
- Add $client->GetEXPModifier(character_id, zone_id) to Perl.
- Add client:GetEXPModifier(character_id, zone_id) to Lua.
- Add $client->SetAAEXPModifier(zone_id, aa_modifier) to Perl.
- Add client:SetAAEXPModifier(zone_id, aa_modifier) to Lua.
- Add $client->SetEXPModifier(zone_id, exp_modifier) to Perl.
- Add client:SetEXPModifier(zone_id, exp_modifier) to Lua.

* Removed unneeded [].

* Fix variable name,

* Fix variable name.

* Fix version.h.

* Rename 2021_04_11_character_exp_modifiers.sql to 2021_04_23_character_exp_modifiers.sql

* Update db_update_manifest.txt
This commit is contained in:
Alex
2021-04-23 08:47:39 -04:00
committed by GitHub
parent 13a50f7806
commit dd06033a58
15 changed files with 311 additions and 4 deletions
+82
View File
@@ -4893,3 +4893,85 @@ uint32 ZoneDatabase::SaveSaylinkID(const char* saylink_text)
return results.LastInsertedID();
}
double ZoneDatabase::GetAAEXPModifier(uint32 character_id, uint32 zone_id) const {
std::string query = fmt::format(
SQL(
SELECT
`aa_modifier`
FROM
`character_exp_modifiers`
WHERE
`character_id` = {}
AND
(`zone_id` = {} OR `zone_id` = 0)
ORDER BY `zone_id` DESC
LIMIT 1
),
character_id,
zone_id
);
auto results = database.QueryDatabase(query);
for (auto row = results.begin(); row != results.end(); ++row) {
return atof(row[0]);
}
return 1.0f;
}
double ZoneDatabase::GetEXPModifier(uint32 character_id, uint32 zone_id) const {
std::string query = fmt::format(
SQL(
SELECT
`exp_modifier`
FROM
`character_exp_modifiers`
WHERE
`character_id` = {}
AND
(`zone_id` = {} OR `zone_id` = 0)
ORDER BY `zone_id` DESC
LIMIT 1
),
character_id,
zone_id
);
auto results = database.QueryDatabase(query);
for (auto row = results.begin(); row != results.end(); ++row) {
return atof(row[0]);
}
return 1.0f;
}
void ZoneDatabase::SetAAEXPModifier(uint32 character_id, uint32 zone_id, double aa_modifier) {
float exp_modifier = GetEXPModifier(character_id, zone_id);
std::string query = fmt::format(
SQL(
REPLACE INTO
`character_exp_modifiers`
VALUES
({}, {}, {}, {})
),
character_id,
zone_id,
aa_modifier,
exp_modifier
);
database.QueryDatabase(query);
}
void ZoneDatabase::SetEXPModifier(uint32 character_id, uint32 zone_id, double exp_modifier) {
float aa_modifier = GetAAEXPModifier(character_id, zone_id);
std::string query = fmt::format(
SQL(
REPLACE INTO
`character_exp_modifiers`
VALUES
({}, {}, {}, {})
),
character_id,
zone_id,
aa_modifier,
exp_modifier
);
database.QueryDatabase(query);
}