mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-22 16:28:28 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9f984c6b41 | |||
| 0eb7667779 | |||
| d545e1ba04 | |||
| 9404ecc382 | |||
| c32150d2cc | |||
| 8195a57b44 | |||
| 297599a779 | |||
| aac73c6558 |
+6
-2
@@ -931,9 +931,9 @@ uint32 Database::GetMiniLoginAccount(char* ip)
|
||||
}
|
||||
|
||||
// Get zone starting points from DB
|
||||
bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe_x, float* safe_y, float* safe_z, int16* minstatus, uint8* minlevel, char *flag_needed) {
|
||||
bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe_x, float* safe_y, float* safe_z, int16* minstatus, uint8* minlevel, uint32* minexpansion, uint32* maxexpansion, char *flag_needed) {
|
||||
|
||||
std::string query = StringFormat("SELECT safe_x, safe_y, safe_z, min_status, min_level, flag_needed FROM zone "
|
||||
std::string query = StringFormat("SELECT safe_x, safe_y, safe_z, min_status, min_level, flag_needed, min_expansion, max_expansion FROM zone "
|
||||
" WHERE short_name='%s' AND (version=%i OR version=0) ORDER BY version DESC", short_name, version);
|
||||
auto results = QueryDatabase(query);
|
||||
|
||||
@@ -957,6 +957,10 @@ bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe
|
||||
*minlevel = atoi(row[4]);
|
||||
if (flag_needed != nullptr)
|
||||
strcpy(flag_needed, row[5]);
|
||||
if (minexpansion != nullptr)
|
||||
*minexpansion = atoi(row[6]);
|
||||
if (maxexpansion != nullptr)
|
||||
*maxexpansion = atoi(row[7]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+2
-2
@@ -237,8 +237,8 @@ public:
|
||||
|
||||
/* General Queries */
|
||||
|
||||
bool GetSafePoints(const char* short_name, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr);
|
||||
bool GetSafePoints(uint32 zoneID, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr) { return GetSafePoints(GetZoneName(zoneID), version, safe_x, safe_y, safe_z, minstatus, minlevel, flag_needed); }
|
||||
bool GetSafePoints(const char* short_name, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, uint32* minexpansion = 0, uint32* maxexpansion = 0, char *flag_needed = nullptr);
|
||||
bool GetSafePoints(uint32 zoneID, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, uint32* minexpansion = 0, uint32* maxexpansion = 0, char *flag_needed = nullptr) { return GetSafePoints(GetZoneName(zoneID), version, safe_x, safe_y, safe_z, minstatus, minlevel, minexpansion, maxexpansion, flag_needed); }
|
||||
bool GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zoneid = 0, float* graveyard_x = 0, float* graveyard_y = 0, float* graveyard_z = 0, float* graveyard_heading = 0);
|
||||
bool GetZoneLongName(const char* short_name, char** long_name, char* file_name = 0, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, uint32* graveyard_id = 0, uint32* maxclients = 0);
|
||||
bool LoadPTimers(uint32 charid, PTimerList &into);
|
||||
|
||||
@@ -556,3 +556,28 @@ uint32 EQEmu::expansions::ConvertClientVersionToExpansionsMask(versions::ClientV
|
||||
{
|
||||
return EQEmu::constants::StaticLookup(client_version)->ExpansionsMask;
|
||||
}
|
||||
|
||||
uint32 EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(uint32 expansion_mask)
|
||||
{
|
||||
if ((expansion_mask & bitRoK) == bitRoK) return static_cast<uint32>(Expansion::RoK);
|
||||
if ((expansion_mask & bitSoV) == bitSoV) return static_cast<uint32>(Expansion::SoV);
|
||||
if ((expansion_mask & bitSoL) == bitSoL) return static_cast<uint32>(Expansion::SoL);
|
||||
if ((expansion_mask & bitPoP) == bitPoP) return static_cast<uint32>(Expansion::PoP);
|
||||
if ((expansion_mask & bitLoY) == bitLoY) return static_cast<uint32>(Expansion::LoY);
|
||||
if ((expansion_mask & bitLDoN) == bitLDoN) return static_cast<uint32>(Expansion::LDoN);
|
||||
if ((expansion_mask & bitGoD) == bitGoD) return static_cast<uint32>(Expansion::GoD);
|
||||
if ((expansion_mask & bitOoW) == bitOoW) return static_cast<uint32>(Expansion::OoW);
|
||||
if ((expansion_mask & bitDoN) == bitDoN) return static_cast<uint32>(Expansion::DoN);
|
||||
if ((expansion_mask & bitDoD) == bitDoD) return static_cast<uint32>(Expansion::DoD);
|
||||
if ((expansion_mask & bitPoR) == bitPoR) return static_cast<uint32>(Expansion::PoR);
|
||||
if ((expansion_mask & bitTSS) == bitTSS) return static_cast<uint32>(Expansion::TSS);
|
||||
if ((expansion_mask & bitTBS) == bitTBS) return static_cast<uint32>(Expansion::TBS);
|
||||
if ((expansion_mask & bitSoF) == bitSoF) return static_cast<uint32>(Expansion::SoF);
|
||||
if ((expansion_mask & bitSoD) == bitSoD) return static_cast<uint32>(Expansion::SoD);
|
||||
if ((expansion_mask & bitUF) == bitUF) return static_cast<uint32>(Expansion::UF);
|
||||
if ((expansion_mask & bitHoT) == bitHoT) return static_cast<uint32>(Expansion::HoT);
|
||||
if ((expansion_mask & bitVoA) == bitVoA) return static_cast<uint32>(Expansion::VoA);
|
||||
if ((expansion_mask & bitRoF) == bitRoF) return static_cast<uint32>(Expansion::RoF);
|
||||
if ((expansion_mask & bitCotF) == bitCotF) return static_cast<uint32>(Expansion::CotF);
|
||||
return static_cast<uint32>(Expansion::EverQuest);
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@ namespace EQEmu
|
||||
Expansion ConvertClientVersionToExpansion(versions::ClientVersion client_version);
|
||||
uint32 ConvertClientVersionToExpansionBit(versions::ClientVersion client_version);
|
||||
uint32 ConvertClientVersionToExpansionsMask(versions::ClientVersion client_version);
|
||||
|
||||
uint32 ConvertExpansionMaskToLatestExpansion(uint32 expansion_mask);
|
||||
} /*expansions*/
|
||||
|
||||
} /*EQEmu*/
|
||||
|
||||
+13
-10
@@ -413,17 +413,16 @@ bool SharedDatabase::SetSharedPlatinum(uint32 account_id, int32 amount_to_add) {
|
||||
bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, EQEmu::InventoryProfile* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin_level) {
|
||||
|
||||
const EQEmu::ItemData* myitem;
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT itemid, item_charges, slot FROM starting_items "
|
||||
"WHERE (race = %i or race = 0) AND (class = %i or class = 0) AND "
|
||||
"(deityid = %i or deityid = 0) AND (zoneid = %i or zoneid = 0) AND "
|
||||
"gm <= %i ORDER BY id",
|
||||
si_race, si_class, si_deity, si_current_zone, admin_level);
|
||||
"gm <= %i AND min_expansion <= %i AND max_expansion >= %i ORDER BY id",
|
||||
si_race, si_class, si_deity, si_current_zone, admin_level, latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success())
|
||||
return false;
|
||||
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
int32 itemid = atoi(row[0]);
|
||||
int32 charges = atoi(row[1]);
|
||||
@@ -1937,7 +1936,8 @@ void SharedDatabase::GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot
|
||||
loot_table_count = 0;
|
||||
max_loot_table = 0;
|
||||
loot_table_entries = 0;
|
||||
const std::string query = "SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM loottable_entries) FROM loottable";
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
const std::string query = StringFormat("SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM loottable_entries) FROM loottable WHERE min_expansion <= %i AND max_expansion >= %i", latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return;
|
||||
@@ -1957,8 +1957,9 @@ void SharedDatabase::GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_d
|
||||
loot_drop_count = 0;
|
||||
max_loot_drop = 0;
|
||||
loot_drop_entries = 0;
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
|
||||
const std::string query = "SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM lootdrop_entries) FROM lootdrop";
|
||||
const std::string query = StringFormat("SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM lootdrop_entries) FROM lootdrop WHERE min_expansion <= %i AND max_expansion >= %i", latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return;
|
||||
@@ -1980,10 +1981,11 @@ void SharedDatabase::LoadLootTables(void *data, uint32 size) {
|
||||
uint8 loot_table[sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * 128)];
|
||||
LootTable_Struct *lt = reinterpret_cast<LootTable_Struct*>(loot_table);
|
||||
|
||||
const std::string query = "SELECT loottable.id, loottable.mincash, loottable.maxcash, loottable.avgcoin, "
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
const std::string query = StringFormat("SELECT loottable.id, loottable.mincash, loottable.maxcash, loottable.avgcoin, "
|
||||
"loottable_entries.lootdrop_id, loottable_entries.multiplier, loottable_entries.droplimit, "
|
||||
"loottable_entries.mindrop, loottable_entries.probability FROM loottable LEFT JOIN loottable_entries "
|
||||
"ON loottable.id = loottable_entries.loottable_id ORDER BY id";
|
||||
"ON loottable.id = loottable_entries.loottable_id WHERE min_expansion <= %i AND max_expansion >= %i ORDER BY id", latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return;
|
||||
@@ -2033,10 +2035,11 @@ void SharedDatabase::LoadLootDrops(void *data, uint32 size) {
|
||||
uint8 loot_drop[sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * 1260)];
|
||||
LootDrop_Struct *ld = reinterpret_cast<LootDrop_Struct*>(loot_drop);
|
||||
|
||||
const std::string query = "SELECT lootdrop.id, lootdrop_entries.item_id, lootdrop_entries.item_charges, "
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
const std::string query = StringFormat("SELECT lootdrop.id, lootdrop_entries.item_id, lootdrop_entries.item_charges, "
|
||||
"lootdrop_entries.equip_item, lootdrop_entries.chance, lootdrop_entries.minlevel, "
|
||||
"lootdrop_entries.maxlevel, lootdrop_entries.multiplier FROM lootdrop JOIN lootdrop_entries "
|
||||
"ON lootdrop.id = lootdrop_entries.lootdrop_id ORDER BY lootdrop_id";
|
||||
"ON lootdrop.id = lootdrop_entries.lootdrop_id WHERE min_expansion <= %i AND max_expansion >= %i ORDER BY lootdrop_id", latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return;
|
||||
|
||||
@@ -146,9 +146,10 @@ bool load_spawns_from_db(MYSQL *m, const char *zone, list<PathNode*> &db_spawns)
|
||||
bool load_doors_from_db(MYSQL *m, const char *zone, list<PathNode*> &db_spawns) {
|
||||
char query[512];
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
sprintf(query,
|
||||
"SELECT pos_x,pos_y,pos_z FROM doors "
|
||||
"WHERE zone='%s'", zone);
|
||||
"WHERE zone='%s' AND min_expansion <= %i AND max_expansion >= %i", zone, latest_expansion, latest_expansion);
|
||||
if(mysql_query(m, query) != 0) {
|
||||
printf("Unable to query: %s\n", mysql_error(m));
|
||||
return(false);
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
ALTER TABLE `adventure_template` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `graveyard_radius`;
|
||||
ALTER TABLE `adventure_template` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `doors` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `is_ldon_door`;
|
||||
ALTER TABLE `doors` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `fishing` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `npc_chance`;
|
||||
ALTER TABLE `fishing` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `forage` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `chance`;
|
||||
ALTER TABLE `forage` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `global_loot` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `zone`;
|
||||
ALTER TABLE `global_loot` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `ground_spawns` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `respawn_timer`;
|
||||
ALTER TABLE `ground_spawns` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `loottable` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `done`;
|
||||
ALTER TABLE `loottable` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `lootdrop` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `name`;
|
||||
ALTER TABLE `lootdrop` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `merchantlist` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `probability`;
|
||||
ALTER TABLE `merchantlist` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `object` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `display_name`;
|
||||
ALTER TABLE `object` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `spawn2` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `animation`;
|
||||
ALTER TABLE `spawn2` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `starting_items` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `slot`;
|
||||
ALTER TABLE `starting_items` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `start_zones` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `select_rank`;
|
||||
ALTER TABLE `start_zones` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `titles` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `title_set`;
|
||||
ALTER TABLE `titles` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `tradeskill_recipe` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '4' AFTER `enabled`;
|
||||
ALTER TABLE `tradeskill_recipe` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `traps` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `undetectable`;
|
||||
ALTER TABLE `traps` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `tributes` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `isguild`;
|
||||
ALTER TABLE `tributes` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `zone` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `npc_max_aggro_dist`;
|
||||
ALTER TABLE `zone` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
ALTER TABLE `zone_points` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `client_version_mask`;
|
||||
ALTER TABLE `zone_points` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '99' AFTER `min_expansion`;
|
||||
@@ -637,13 +637,20 @@ bool AdventureManager::LoadAdventureTemplates()
|
||||
"assa_y, assa_z, assa_h, text, duration, zone_in_time, win_points, lose_points, "
|
||||
"theme, zone_in_zone_id, zone_in_x, zone_in_y, zone_in_object_id, dest_x, dest_y, "
|
||||
"dest_z, dest_h, graveyard_zone_id, graveyard_x, graveyard_y, graveyard_z, "
|
||||
"graveyard_radius FROM adventure_template";
|
||||
"graveyard_radius, min_expansion, max_expansion FROM adventure_template";
|
||||
auto results = database.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
uint32 min_expansion = atoi(row[32]);
|
||||
uint32 max_expansion = atoi(row[33]);
|
||||
|
||||
if (latest_expansion < min_expansion || latest_expansion > max_expansion) {
|
||||
continue;
|
||||
}
|
||||
auto aTemplate = new AdventureTemplate;
|
||||
aTemplate->id = atoi(row[0]);
|
||||
strcpy(aTemplate->zone, row[1]);
|
||||
@@ -678,7 +685,7 @@ bool AdventureManager::LoadAdventureTemplates()
|
||||
aTemplate->graveyard_z = atof(row[30]);
|
||||
aTemplate->graveyard_radius = atof(row[31]);
|
||||
adventure_templates[aTemplate->id] = aTemplate;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+6
-4
@@ -183,8 +183,9 @@ void WorldDatabase::GetCharSelectInfo(uint32 accountID, EQApplicationPacket **ou
|
||||
}
|
||||
|
||||
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",
|
||||
cse->Class, cse->Deity, cse->Race);
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings));
|
||||
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 AND min_expansion <= %i AND max_expansion >= %i",
|
||||
cse->Class, cse->Deity, cse->Race, latest_expansion, latest_expansion);
|
||||
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 */
|
||||
@@ -357,10 +358,11 @@ bool WorldDatabase::GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct*
|
||||
|
||||
in_pp->x = in_pp->y = in_pp->z = in_pp->heading = in_pp->zone_id = 0;
|
||||
in_pp->binds[0].x = in_pp->binds[0].y = in_pp->binds[0].z = in_pp->binds[0].zoneId = in_pp->binds[0].instance_id = 0;
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings));
|
||||
// see if we have an entry for start_zone. We can support both titanium & SOF+ by having two entries per class/race/deity combo with different zone_ids
|
||||
std::string query = StringFormat("SELECT x, y, z, heading, start_zone, bind_id, bind_x, bind_y, bind_z FROM start_zones WHERE zone_id = %i "
|
||||
"AND player_class = %i AND player_deity = %i AND player_race = %i",
|
||||
in_cc->start_zone, in_cc->class_, in_cc->deity, in_cc->race);
|
||||
"AND player_class = %i AND player_deity = %i AND player_race = %i AND min_expansion <= %i AND max_expansion >= %i",
|
||||
in_cc->start_zone, in_cc->class_, in_cc->deity, in_cc->race, latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if(!results.Success()) {
|
||||
return false;
|
||||
|
||||
+10
-9
@@ -11763,13 +11763,13 @@ void Client::Handle_OP_RecipesFavorite(const EQApplicationPacket *app)
|
||||
"LEFT JOIN (SELECT recipe_id, madecount "
|
||||
"FROM char_recipe_list "
|
||||
"WHERE char_id = %u) AS crl ON tr.id=crl.recipe_id "
|
||||
"WHERE tr.enabled <> 0 AND tr.id IN (%s) "
|
||||
"WHERE tr.enabled <> 0 AND %i & tr.expansions = tr.expansions AND tr.id IN (%s) "
|
||||
"AND tr.must_learn & 0x20 <> 0x20 AND "
|
||||
"((tr.must_learn & 0x3 <> 0 AND crl.madecount IS NOT NULL) "
|
||||
"OR (tr.must_learn & 0x3 = 0)) "
|
||||
"GROUP BY tr.id "
|
||||
"HAVING sum(if(tre.item_id %s AND tre.iscontainer > 0,1,0)) > 0 AND SUM(tre.componentcount) <= %u "
|
||||
"LIMIT 100 ", CharacterID(), favoriteIDs.c_str(), containers.c_str(), combineObjectSlots);
|
||||
"LIMIT 100 ", CharacterID(), RuleI(World, ExpansionSettings), favoriteIDs.c_str(), containers.c_str(), combineObjectSlots);
|
||||
|
||||
TradeskillSearchResults(query, tsf->object_type, tsf->some_id);
|
||||
return;
|
||||
@@ -11828,15 +11828,15 @@ void Client::Handle_OP_RecipesSearch(const EQApplicationPacket *app)
|
||||
"LEFT JOIN tradeskill_recipe_entries AS tre ON tr.id = tre.recipe_id "
|
||||
"LEFT JOIN (SELECT recipe_id, madecount "
|
||||
"FROM char_recipe_list WHERE char_id = %u) AS crl ON tr.id=crl.recipe_id "
|
||||
"WHERE %s tr.trivial >= %u AND tr.trivial <= %u AND tr.enabled <> 0 "
|
||||
"AND tr.must_learn & 0x20 <> 0x20 "
|
||||
"WHERE %s tr.trivial >= %u AND tr.trivial <= %u AND tr.enabled <> 0"
|
||||
"AND %i & tr.expansions = tr.expansions AND tr.must_learn & 0x20 <> 0x20 "
|
||||
"AND ((tr.must_learn & 0x3 <> 0 "
|
||||
"AND crl.madecount IS NOT NULL) "
|
||||
"OR (tr.must_learn & 0x3 = 0)) "
|
||||
"GROUP BY tr.id "
|
||||
"HAVING sum(if(tre.item_id %s AND tre.iscontainer > 0,1,0)) > 0 AND SUM(tre.componentcount) <= %u "
|
||||
"LIMIT 200 ",
|
||||
CharacterID(), searchClause.c_str(),
|
||||
CharacterID(), RuleI(World, ExpansionSettings), searchClause.c_str(),
|
||||
rss->mintrivial, rss->maxtrivial, containers, combineObjectSlots);
|
||||
TradeskillSearchResults(query, rss->object_type, rss->some_id);
|
||||
return;
|
||||
@@ -12305,9 +12305,10 @@ void Client::Handle_OP_SetStartCity(const EQApplicationPacket *app)
|
||||
uint32 zoneid = 0;
|
||||
uint32 startCity = (uint32)strtol((const char*)app->pBuffer, nullptr, 10);
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT zone_id, bind_id, x, y, z FROM start_zones "
|
||||
"WHERE player_class=%i AND player_deity=%i AND player_race=%i",
|
||||
m_pp.class_, m_pp.deity, m_pp.race);
|
||||
"WHERE player_class=%i AND player_deity=%i AND player_race=%i AND auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings));",
|
||||
m_pp.class_, m_pp.deity, m_pp.race, latest_expansion, latest_expansion);
|
||||
auto results = database.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
Log(Logs::General, Logs::Error, "No valid start zones found for /setstartcity");
|
||||
@@ -12337,8 +12338,8 @@ void Client::Handle_OP_SetStartCity(const EQApplicationPacket *app)
|
||||
}
|
||||
|
||||
query = StringFormat("SELECT zone_id, bind_id FROM start_zones "
|
||||
"WHERE player_class=%i AND player_deity=%i AND player_race=%i",
|
||||
m_pp.class_, m_pp.deity, m_pp.race);
|
||||
"WHERE player_class=%i AND player_deity=%i AND player_race=%i AND min_expansion <= %i AND max_expansion >= %i",
|
||||
m_pp.class_, m_pp.deity, m_pp.race, latest_expansion, latest_expansion);
|
||||
results = database.QueryDatabase(query);
|
||||
if (!results.Success())
|
||||
return;
|
||||
|
||||
+16
-10
@@ -3723,20 +3723,22 @@ void command_findzone(Client *c, const Seperator *sep)
|
||||
return;
|
||||
}
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query;
|
||||
int id = atoi((const char *)sep->arg[1]);
|
||||
if (id == 0) { // If id evaluates to 0, then search as if user entered a string.
|
||||
auto escName = new char[strlen(sep->arg[1]) * 2 + 1];
|
||||
database.DoEscapeString(escName, sep->arg[1], strlen(sep->arg[1]));
|
||||
|
||||
|
||||
query = StringFormat("SELECT zoneidnumber, short_name, long_name FROM zone "
|
||||
"WHERE long_name RLIKE '%s' AND version = 0",
|
||||
escName);
|
||||
"WHERE long_name RLIKE '%s' AND version = 0 AND min_expansion <= %i AND max_expansion >= %i",
|
||||
escName, latest_expansion, latest_expansion);
|
||||
safe_delete_array(escName);
|
||||
}
|
||||
else // Otherwise, look for just that zoneidnumber.
|
||||
query = StringFormat("SELECT zoneidnumber, short_name, long_name FROM zone "
|
||||
"WHERE zoneidnumber = %i AND version = 0", id);
|
||||
"WHERE zoneidnumber = %i AND version = 0 AND min_expansion <= %i AND max_expansion >= %i", id, latest_expansion, latest_expansion);
|
||||
|
||||
auto results = database.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
@@ -9595,6 +9597,7 @@ void command_object(Client *c, const Seperator *sep)
|
||||
uint32 newid = 0;
|
||||
uint16 radius;
|
||||
EQApplicationPacket *app;
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
|
||||
bool bNewObject = false;
|
||||
|
||||
@@ -9626,8 +9629,10 @@ void command_object(Client *c, const Seperator *sep)
|
||||
else
|
||||
c->Message(0, "Objects within %u units of your current location:", radius);
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query;
|
||||
if (radius)
|
||||
|
||||
query = StringFormat(
|
||||
"SELECT id, xpos, ypos, zpos, heading, itemid, "
|
||||
"objectname, type, icon, unknown08, unknown10, unknown20 "
|
||||
@@ -9635,17 +9640,18 @@ void command_object(Client *c, const Seperator *sep)
|
||||
"AND (xpos BETWEEN %.1f AND %.1f) "
|
||||
"AND (ypos BETWEEN %.1f AND %.1f) "
|
||||
"AND (zpos BETWEEN %.1f AND %.1f) "
|
||||
"AND min_expansion <= %i AND max_expansion >= %i "
|
||||
"ORDER BY id",
|
||||
zone->GetZoneID(), zone->GetInstanceVersion(),
|
||||
c->GetX() - radius, // Yes, we're actually using a bounding box instead of a radius.
|
||||
c->GetX() + radius, // Much less processing power used this way.
|
||||
c->GetY() - radius, c->GetY() + radius, c->GetZ() - radius, c->GetZ() + radius);
|
||||
c->GetY() - radius, c->GetY() + radius, c->GetZ() - radius, c->GetZ() + radius, latest_expansion, latest_expansion);
|
||||
else
|
||||
query = StringFormat("SELECT id, xpos, ypos, zpos, heading, itemid, "
|
||||
"objectname, type, icon, unknown08, unknown10, unknown20 "
|
||||
"FROM object WHERE zoneid = %u AND version = %u "
|
||||
"FROM object WHERE zoneid = %u AND version = %u AND min_expansion <= %i AND max_expansion >= %i"
|
||||
"ORDER BY id",
|
||||
zone->GetZoneID(), zone->GetInstanceVersion());
|
||||
zone->GetZoneID(), zone->GetInstanceVersion(), latest_expansion, latest_expansion);
|
||||
|
||||
auto results = database.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
@@ -10499,9 +10505,9 @@ void command_object(Client *c, const Seperator *sep)
|
||||
std::string query =
|
||||
StringFormat("INSERT INTO object "
|
||||
"(zoneid, version, xpos, ypos, zpos, heading, itemid, "
|
||||
"objectname, type, icon, unknown08, unknown10, unknown20) "
|
||||
"objectname, type, icon, unknown08, unknown10, unknown20, expansions) "
|
||||
"SELECT zoneid, %u, xpos, ypos, zpos, heading, itemid, "
|
||||
"objectname, type, icon, unknown08, unknown10, unknown20 "
|
||||
"objectname, type, icon, unknown08, unknown10, unknown20, expansions "
|
||||
"FROM object WHERE zoneid = %u) AND version = %u",
|
||||
od.zone_instance, zone->GetZoneID(), zone->GetInstanceVersion());
|
||||
auto results = database.QueryDatabase(query);
|
||||
@@ -10519,9 +10525,9 @@ void command_object(Client *c, const Seperator *sep)
|
||||
|
||||
std::string query = StringFormat("INSERT INTO object "
|
||||
"(zoneid, version, xpos, ypos, zpos, heading, itemid, "
|
||||
"objectname, type, icon, unknown08, unknown10, unknown20) "
|
||||
"objectname, type, icon, unknown08, unknown10, unknown20, expansions) "
|
||||
"SELECT zoneid, %u, xpos, ypos, zpos, heading, itemid, "
|
||||
"objectname, type, icon, unknown08, unknown10, unknown20 "
|
||||
"objectname, type, icon, unknown08, unknown10, unknown20, expansions "
|
||||
"FROM object WHERE id = %u AND zoneid = %u AND version = %u",
|
||||
od.zone_instance, id, zone->GetZoneID(), zone->GetInstanceVersion());
|
||||
auto results = database.QueryDatabase(query);
|
||||
|
||||
+6
-4
@@ -54,9 +54,10 @@ uint32 ZoneDatabase::GetZoneForage(uint32 ZoneID, uint8 skill) {
|
||||
}
|
||||
|
||||
uint32 chancepool = 0;
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT itemid, chance FROM "
|
||||
"forage WHERE zoneid = '%i' and level <= '%i' "
|
||||
"LIMIT %i", ZoneID, skill, FORAGE_ITEM_LIMIT);
|
||||
"forage WHERE zoneid = '%i' AND level <= '%i' AND min_expansion <= %i AND max_expansion >= %i "
|
||||
"LIMIT %i", ZoneID, skill, latest_expansion, latest_expansion, FORAGE_ITEM_LIMIT);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return 0;
|
||||
@@ -109,9 +110,10 @@ uint32 ZoneDatabase::GetZoneFishing(uint32 ZoneID, uint8 skill, uint32 &npc_id,
|
||||
chance[c]=0;
|
||||
}
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT itemid, chance, npc_id, npc_chance "
|
||||
"FROM fishing WHERE (zoneid = '%i' || zoneid = 0) AND skill_level <= '%i'",
|
||||
ZoneID, skill);
|
||||
"FROM fishing WHERE (zoneid = '%i' || zoneid = 0) AND skill_level <= '%i' AND min_expansion <= %i AND max_expansion >= %i",
|
||||
ZoneID, skill, latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return 0;
|
||||
|
||||
+2
-1
@@ -463,8 +463,9 @@ void NPC::CheckGlobalLootTables()
|
||||
|
||||
void ZoneDatabase::LoadGlobalLoot()
|
||||
{
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
auto query = StringFormat("SELECT id, loottable_id, description, min_level, max_level, rare, raid, race, "
|
||||
"class, bodytype, zone FROM global_loot WHERE enabled = 1");
|
||||
"class, bodytype, zone FROM global_loot WHERE enabled = 1 AND min_expansion <= %i AND max_expansion >= %i", latest_expansion, latest_expansion);
|
||||
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success() || results.RowCount() == 0)
|
||||
|
||||
+3
-3
@@ -694,13 +694,13 @@ void ZoneDatabase::UpdateObject(uint32 id, uint32 type, uint32 icon, const Objec
|
||||
}
|
||||
|
||||
Ground_Spawns* ZoneDatabase::LoadGroundSpawns(uint32 zone_id, int16 version, Ground_Spawns* gs) {
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT max_x, max_y, max_z, "
|
||||
"min_x, min_y, heading, name, "
|
||||
"item, max_allowed, respawn_timer "
|
||||
"FROM ground_spawns "
|
||||
"WHERE zoneid = %i AND (version = %u OR version = -1) "
|
||||
"LIMIT 50", zone_id, version);
|
||||
"WHERE zoneid = %i AND (version = %u OR version = -1) AND min_expansion <= %i AND max_expansion >= %i "
|
||||
"LIMIT 50", zone_id, version, latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return gs;
|
||||
|
||||
+9
-3
@@ -575,6 +575,7 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList<Spawn2*> &spa
|
||||
}
|
||||
|
||||
const char *zone_name = database.GetZoneName(zoneid);
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat(
|
||||
"SELECT "
|
||||
"id, "
|
||||
@@ -592,11 +593,15 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList<Spawn2*> &spa
|
||||
"animation "
|
||||
"FROM "
|
||||
"spawn2 "
|
||||
"WHERE zone = '%s' AND (version = %u OR version = -1)",
|
||||
"WHERE zone = '%s' AND (version = %u OR version = -1) AND min_expansion <= %i AND max_expansion >= %i",
|
||||
zone_name,
|
||||
version
|
||||
version,
|
||||
latest_expansion,
|
||||
latest_expansion
|
||||
);
|
||||
results = QueryDatabase(query);
|
||||
Log(Logs::General, Logs::Status, "%s", query.c_str());
|
||||
|
||||
|
||||
if (!results.Success()) {
|
||||
return false;
|
||||
@@ -639,10 +644,11 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList<Spawn2*> &spa
|
||||
|
||||
Spawn2* ZoneDatabase::LoadSpawn2(LinkedList<Spawn2*> &spawn2_list, uint32 spawn2id, uint32 timeleft) {
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT id, spawngroupID, x, y, z, heading, "
|
||||
"respawntime, variance, pathgrid, _condition, "
|
||||
"cond_value, enabled, animation FROM spawn2 "
|
||||
"WHERE id = %i", spawn2id);
|
||||
"WHERE id = %i AND min_expansion <= %i AND max_expansion >= %i", spawn2id, latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return nullptr;
|
||||
|
||||
+3
-2
@@ -141,13 +141,14 @@ bool SpawnGroupList::RemoveSpawnGroup(uint32 in_id) {
|
||||
|
||||
bool ZoneDatabase::LoadSpawnGroups(const char *zone_name, uint16 version, SpawnGroupList *spawn_group_list)
|
||||
{
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT DISTINCT(spawngroupID), spawngroup.name, spawngroup.spawn_limit, "
|
||||
"spawngroup.dist, spawngroup.max_x, spawngroup.min_x, "
|
||||
"spawngroup.max_y, spawngroup.min_y, spawngroup.delay, "
|
||||
"spawngroup.despawn, spawngroup.despawn_timer, spawngroup.mindelay "
|
||||
"FROM spawn2, spawngroup WHERE spawn2.spawngroupID = spawngroup.ID "
|
||||
"AND spawn2.version = %u and zone = '%s'",
|
||||
version, zone_name);
|
||||
"AND spawn2.version = %u and zone = '%s' AND spawn2.min_expansion <= %i AND spawn2.max_expansion >= %i",
|
||||
version, zone_name, latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return false;
|
||||
|
||||
+3
-3
@@ -35,10 +35,10 @@ TitleManager::TitleManager() {
|
||||
bool TitleManager::LoadTitles()
|
||||
{
|
||||
Titles.clear();
|
||||
|
||||
std::string query = "SELECT `id`, `skill_id`, `min_skill_value`, `max_skill_value`, "
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT `id`, `skill_id`, `min_skill_value`, `max_skill_value`, "
|
||||
"`min_aa_points`, `max_aa_points`, `class`, `gender`, `char_id`, "
|
||||
"`status`, `item_id`, `prefix`, `suffix`, `title_set` FROM titles";
|
||||
"`status`, `item_id`, `prefix`, `suffix`, `title_set` FROM titles WHERE `min_expansion` <= %i AND `max_expansion` >= %i", latest_expansion, latest_expansion);
|
||||
auto results = database.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return false;
|
||||
|
||||
@@ -1283,9 +1283,9 @@ bool ZoneDatabase::GetTradeRecipe(uint32 recipe_id, uint8 c_type, uint32 some_id
|
||||
"LEFT JOIN (SELECT recipe_id, madecount "
|
||||
"FROM char_recipe_list WHERE char_id = %u) AS crl "
|
||||
"ON tr.id = crl.recipe_id "
|
||||
"WHERE tr.id = %lu AND tre.item_id %s AND tr.enabled "
|
||||
"WHERE tr.id = %lu AND tre.item_id %s AND tr.enabled AND %i & tr.expansions = tr.expansions "
|
||||
"GROUP BY tr.id",
|
||||
char_id, (unsigned long)recipe_id, containers.c_str());
|
||||
char_id, (unsigned long)recipe_id, containers.c_str(), RuleI(World, ExpansionSettings));
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
Log(Logs::General, Logs::Error, "Error in GetTradeRecipe, query: %s", query.c_str());
|
||||
|
||||
+5
-3
@@ -399,9 +399,10 @@ void EntityList::ClearTrapPointers()
|
||||
|
||||
bool ZoneDatabase::LoadTraps(const char* zonename, int16 version) {
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT id, x, y, z, effect, effectvalue, effectvalue2, skill, "
|
||||
"maxzdiff, radius, chance, message, respawn_time, respawn_var, level, "
|
||||
"`group`, triggered_number, despawn_when_triggered, undetectable FROM traps WHERE zone='%s' AND version=%u", zonename, version);
|
||||
"`group`, triggered_number, despawn_when_triggered, undetectable FROM traps WHERE zone='%s' AND version=%u AND min_expansion <= %i AND max_expansion >= %i", zonename, version, latest_expansion, latest_expansion);
|
||||
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
@@ -481,18 +482,19 @@ bool ZoneDatabase::SetTrapData(Trap* trap, bool repopnow) {
|
||||
uint32 dbid = trap->db_id;
|
||||
std::string query;
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionBitToExpansion(RuleI(World, ExpansionSettings));
|
||||
if (trap->group > 0)
|
||||
{
|
||||
query = StringFormat("SELECT id, x, y, z, effect, effectvalue, effectvalue2, skill, "
|
||||
"maxzdiff, radius, chance, message, respawn_time, respawn_var, level, "
|
||||
"triggered_number, despawn_when_triggered, undetectable FROM traps WHERE zone='%s' AND `group`=%d AND id != %d ORDER BY RAND() LIMIT 1", zone->GetShortName(), trap->group, dbid);
|
||||
"triggered_number, despawn_when_triggered, undetectable FROM traps WHERE zone='%s' AND `group`=%d AND id != %d AND min_expansion <= %i AND max_expansion >= %i ORDER BY RAND() LIMIT 1", zone->GetShortName(), trap->group, dbid, latest_expansion, latest_expansion);
|
||||
}
|
||||
else
|
||||
{
|
||||
// We could just use the existing data here, but querying the DB is not expensive, and allows content developers to change traps without rebooting.
|
||||
query = StringFormat("SELECT id, x, y, z, effect, effectvalue, effectvalue2, skill, "
|
||||
"maxzdiff, radius, chance, message, respawn_time, respawn_var, level, "
|
||||
"triggered_number, despawn_when_triggered, undetectable FROM traps WHERE zone='%s' AND id = %d", zone->GetShortName(), dbid);
|
||||
"triggered_number, despawn_when_triggered, undetectable FROM traps WHERE zone='%s' AND id = %d AND min_expansion <= %i AND max_expansion >= %i", zone->GetShortName(), dbid, latest_expansion, latest_expansion);
|
||||
}
|
||||
|
||||
auto results = QueryDatabase(query);
|
||||
|
||||
+2
-1
@@ -387,7 +387,8 @@ bool ZoneDatabase::LoadTributes() {
|
||||
|
||||
tribute_list.clear();
|
||||
|
||||
const std::string query = "SELECT id, name, descr, unknown, isguild FROM tributes";
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
const std::string query = StringFormat("SELECT id, name, descr, unknown, isguild FROM tributes WHERE min_expansion <= %i AND max_expansion >= %i", latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return false;
|
||||
|
||||
+9
-6
@@ -164,15 +164,16 @@ bool Zone::Bootup(uint32 iZoneID, uint32 iInstanceID, bool iStaticZone) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//this really loads the objects into entity_list
|
||||
bool Zone::LoadZoneObjects()
|
||||
{
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query =
|
||||
StringFormat("SELECT id, zoneid, xpos, ypos, zpos, heading, itemid, charges, objectname, type, icon, "
|
||||
"unknown08, unknown10, unknown20, unknown24, unknown76, size, tilt_x, tilt_y, display_name "
|
||||
"FROM object WHERE zoneid = %i AND (version = %u OR version = -1)",
|
||||
zoneid, instanceversion);
|
||||
"FROM object WHERE zoneid = %i AND (version = %u OR version = -1) AND min_expansion <= %i AND max_expansion >= %i",
|
||||
zoneid, instanceversion, latest_expansion, latest_expansion);
|
||||
auto results = database.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
Log(Logs::General, Logs::Error, "Error Loading Objects from DB: %s",
|
||||
@@ -464,8 +465,9 @@ void Zone::LoadTempMerchantData() {
|
||||
void Zone::LoadNewMerchantData(uint32 merchantid) {
|
||||
|
||||
std::list<MerchantList> merlist;
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT item, slot, faction_required, level_required, alt_currency_cost, "
|
||||
"classes_required, probability FROM merchantlist WHERE merchantid=%d ORDER BY slot", merchantid);
|
||||
"classes_required, probability FROM merchantlist WHERE merchantid=%d AND min_expansion <= %i AND max_expansion >= %i ORDER BY slot", merchantid, latest_expansion, latest_expansion);
|
||||
auto results = database.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return;
|
||||
@@ -1703,12 +1705,13 @@ bool ZoneDatabase::LoadStaticZonePoints(LinkedList<ZonePoint*>* zone_point_list,
|
||||
{
|
||||
zone_point_list->Clear();
|
||||
zone->numzonepoints = 0;
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
std::string query = StringFormat("SELECT x, y, z, target_x, target_y, "
|
||||
"target_z, target_zone_id, heading, target_heading, "
|
||||
"number, target_instance, client_version_mask "
|
||||
"FROM zone_points WHERE zone='%s' AND (version=%i OR version=-1) "
|
||||
"FROM zone_points WHERE zone='%s' AND (version=%i OR version=-1) AND min_expansion <= %i AND max_expansion >= %i "
|
||||
"ORDER BY number",
|
||||
zonename, version);
|
||||
zonename, version, latest_expansion, latest_expansion);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return false;
|
||||
|
||||
+17
-4
@@ -169,8 +169,10 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {
|
||||
float safe_x, safe_y, safe_z;
|
||||
int16 minstatus = 0;
|
||||
uint8 minlevel = 0;
|
||||
uint32 minexpansion = 0;
|
||||
uint32 maxexpansion = 0;
|
||||
char flag_needed[128];
|
||||
if(!database.GetSafePoints(target_zone_name, database.GetInstanceVersion(target_instance_id), &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, flag_needed)) {
|
||||
if(!database.GetSafePoints(target_zone_name, database.GetInstanceVersion(target_instance_id), &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, &minexpansion, &maxexpansion, flag_needed)) {
|
||||
//invalid zone...
|
||||
Message(13, "Invalid target zone while getting safe points.");
|
||||
Log(Logs::General, Logs::Error, "Zoning %s: Unable to get safe coordinates for zone '%s'.", GetName(), target_zone_name);
|
||||
@@ -267,8 +269,10 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {
|
||||
|
||||
//not sure when we would use ZONE_ERROR_NOTREADY
|
||||
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
|
||||
//enforce min status and level
|
||||
if (!ignorerestrictions && (Admin() < minstatus || GetLevel() < minlevel))
|
||||
if (!ignorerestrictions && (Admin() < minstatus || GetLevel() < minlevel || (uint32)latest_expansion <= minexpansion || (uint32)latest_expansion >= maxexpansion))
|
||||
{
|
||||
myerror = ZONE_ERROR_NOEXPERIENCE;
|
||||
}
|
||||
@@ -838,8 +842,10 @@ void Client::SendZoneFlagInfo(Client *to) const {
|
||||
float safe_x, safe_y, safe_z;
|
||||
int16 minstatus = 0;
|
||||
uint8 minlevel = 0;
|
||||
uint32 minexpansion = 0;
|
||||
uint32 maxexpansion = 0;
|
||||
char flag_name[128];
|
||||
if(!database.GetSafePoints(short_name, 0, &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, flag_name)) {
|
||||
if(!database.GetSafePoints(short_name, 0, &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, &minexpansion, &maxexpansion, flag_name)) {
|
||||
strcpy(flag_name, "(ERROR GETTING NAME)");
|
||||
}
|
||||
|
||||
@@ -860,8 +866,10 @@ bool Client::CanBeInZone() {
|
||||
float safe_x, safe_y, safe_z;
|
||||
int16 minstatus = 0;
|
||||
uint8 minlevel = 0;
|
||||
uint32 minexpansion = 0;
|
||||
uint32 maxexpansion = 0;
|
||||
char flag_needed[128];
|
||||
if(!database.GetSafePoints(zone->GetShortName(), zone->GetInstanceVersion(), &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, flag_needed)) {
|
||||
if(!database.GetSafePoints(zone->GetShortName(), zone->GetInstanceVersion(), &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, &minexpansion, &maxexpansion, flag_needed)) {
|
||||
//this should not happen...
|
||||
Log(Logs::Detail, Logs::None, "[CLIENT] Unable to query zone info for ourself '%s'", zone->GetShortName());
|
||||
return(false);
|
||||
@@ -875,6 +883,11 @@ bool Client::CanBeInZone() {
|
||||
Log(Logs::Detail, Logs::None, "[CLIENT] Character does not meet min status requirement (%d < %d)!", Admin(), minstatus);
|
||||
return(false);
|
||||
}
|
||||
auto latest_expansion = EQEmu::expansions::ConvertExpansionMaskToLatestExpansion(RuleI(World, ExpansionSettings));
|
||||
if(Admin() < 150 && (uint32)latest_expansion < minexpansion && (uint32)latest_expansion > maxexpansion) {
|
||||
Log(Logs::Detail, Logs::None, "[CLIENT] Character does not have expansion");
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(flag_needed[0] != '\0') {
|
||||
//the flag needed string is not empty, meaning a flag is required.
|
||||
|
||||
Reference in New Issue
Block a user