diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index e77ed1a08..d1f242c7f 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -166,6 +166,7 @@ SET(repositories repositories/base/base_char_create_point_allocations_repository.h repositories/base/base_char_recipe_list_repository.h repositories/base/base_completed_tasks_repository.h + repositories/base/base_content_flags_repository.h repositories/base/base_data_buckets_repository.h repositories/base/base_db_str_repository.h repositories/base/base_discovered_items_repository.h @@ -323,6 +324,7 @@ SET(repositories repositories/char_create_point_allocations_repository.h repositories/char_recipe_list_repository.h repositories/completed_tasks_repository.h + repositories/content_flags_repository.h repositories/data_buckets_repository.h repositories/db_str_repository.h repositories/discovered_items_repository.h diff --git a/common/content/world_content_service.cpp b/common/content/world_content_service.cpp index 6ff504ebd..64f6a1230 100644 --- a/common/content/world_content_service.cpp +++ b/common/content/world_content_service.cpp @@ -19,6 +19,10 @@ */ #include "world_content_service.h" +#include "../database.h" +#include "../rulesys.h" +#include "../eqemu_logsys.h" + WorldContentService::WorldContentService() { @@ -30,6 +34,20 @@ int WorldContentService::GetCurrentExpansion() const return current_expansion; } +void WorldContentService::SetExpansionContext() +{ + int expansion = RuleI(Expansion, CurrentExpansion); + if (expansion >= Expansion::Classic && expansion <= Expansion::MaxId) { + content_service.SetCurrentExpansion(expansion); + } + + LogInfo( + "Current expansion is [{}] ({})", + GetCurrentExpansion(), + GetCurrentExpansionName() + ); +} + void WorldContentService::SetCurrentExpansion(int current_expansion) { WorldContentService::current_expansion = current_expansion; diff --git a/common/content/world_content_service.h b/common/content/world_content_service.h index a1b6438cd..bfed118c9 100644 --- a/common/content/world_content_service.h +++ b/common/content/world_content_service.h @@ -163,6 +163,7 @@ private: public: const std::vector &GetContentFlags() const; void SetContentFlags(std::vector content_flags); + void SetExpansionContext(); }; extern WorldContentService content_service; diff --git a/common/database.cpp b/common/database.cpp index 4a554c2ac..caec5c3ce 100644 --- a/common/database.cpp +++ b/common/database.cpp @@ -339,7 +339,7 @@ bool Database::ReserveName(uint32 account_id, char* name) { query = StringFormat("INSERT INTO `character_data` SET `account_id` = %i, `name` = '%s'", account_id, name); results = QueryDatabase(query); if (!results.Success() || results.ErrorMessage() != ""){ return false; } - + // Put character into the default guild if rule is being used. int guild_id = RuleI(Character, DefaultGuild); @@ -353,7 +353,7 @@ bool Database::ReserveName(uint32 account_id, char* name) { } } } - + return true; } @@ -512,96 +512,96 @@ bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, Playe "guild_auto_consent," "RestTimer) " "VALUES (" - "%u," // id - "%u," // account_id - "'%s'," // `name` - "'%s'," // last_name - "%u," // gender - "%u," // race - "%u," // class - "%u," // `level` - "%u," // deity - "%u," // birthday - "%u," // last_login - "%u," // time_played - "%u," // pvp_status - "%u," // level2 - "%u," // anon - "%u," // gm - "%u," // intoxication - "%u," // hair_color - "%u," // beard_color - "%u," // eye_color_1 - "%u," // eye_color_2 - "%u," // hair_style - "%u," // beard - "%u," // ability_time_seconds - "%u," // ability_number - "%u," // ability_time_minutes - "%u," // ability_time_hours - "'%s'," // title - "'%s'," // suffix - "%u," // exp - "%u," // points - "%u," // mana - "%u," // cur_hp - "%u," // str - "%u," // sta - "%u," // cha - "%u," // dex - "%u," // `int` - "%u," // agi - "%u," // wis - "%u," // face - "%f," // y - "%f," // x - "%f," // z - "%f," // heading - "%u," // pvp2 - "%u," // pvp_type - "%u," // autosplit_enabled - "%u," // zone_change_count - "%u," // drakkin_heritage - "%u," // drakkin_tattoo - "%u," // drakkin_details - "%i," // toxicity - "%i," // hunger_level - "%i," // thirst_level - "%u," // ability_up - "%u," // zone_id - "%u," // zone_instance - "%u," // leadership_exp_on - "%u," // ldon_points_guk - "%u," // ldon_points_mir - "%u," // ldon_points_mmc - "%u," // ldon_points_ruj - "%u," // ldon_points_tak - "%u," // ldon_points_available + "%u," // id + "%u," // account_id + "'%s'," // `name` + "'%s'," // last_name + "%u," // gender + "%u," // race + "%u," // class + "%u," // `level` + "%u," // deity + "%u," // birthday + "%u," // last_login + "%u," // time_played + "%u," // pvp_status + "%u," // level2 + "%u," // anon + "%u," // gm + "%u," // intoxication + "%u," // hair_color + "%u," // beard_color + "%u," // eye_color_1 + "%u," // eye_color_2 + "%u," // hair_style + "%u," // beard + "%u," // ability_time_seconds + "%u," // ability_number + "%u," // ability_time_minutes + "%u," // ability_time_hours + "'%s'," // title + "'%s'," // suffix + "%u," // exp + "%u," // points + "%u," // mana + "%u," // cur_hp + "%u," // str + "%u," // sta + "%u," // cha + "%u," // dex + "%u," // `int` + "%u," // agi + "%u," // wis + "%u," // face + "%f," // y + "%f," // x + "%f," // z + "%f," // heading + "%u," // pvp2 + "%u," // pvp_type + "%u," // autosplit_enabled + "%u," // zone_change_count + "%u," // drakkin_heritage + "%u," // drakkin_tattoo + "%u," // drakkin_details + "%i," // toxicity + "%i," // hunger_level + "%i," // thirst_level + "%u," // ability_up + "%u," // zone_id + "%u," // zone_instance + "%u," // leadership_exp_on + "%u," // ldon_points_guk + "%u," // ldon_points_mir + "%u," // ldon_points_mmc + "%u," // ldon_points_ruj + "%u," // ldon_points_tak + "%u," // ldon_points_available "%u," // tribute_time_remaining - "%u," // show_helm - "%u," // career_tribute_points - "%u," // tribute_points - "%u," // tribute_active - "%u," // endurance - "%u," // group_leadership_exp - "%u," // raid_leadership_exp + "%u," // show_helm + "%u," // career_tribute_points + "%u," // tribute_points + "%u," // tribute_active + "%u," // endurance + "%u," // group_leadership_exp + "%u," // raid_leadership_exp "%u," // group_leadership_point "%u," // raid_leadership_points - "%u," // air_remaining - "%u," // pvp_kills - "%u," // pvp_deaths - "%u," // pvp_current_points - "%u," // pvp_career_points - "%u," // pvp_best_kill_streak + "%u," // air_remaining + "%u," // pvp_kills + "%u," // pvp_deaths + "%u," // pvp_current_points + "%u," // pvp_career_points + "%u," // pvp_best_kill_streak "%u," // pvp_worst_death_streak "%u," // pvp_current_kill_strea - "%u," // aa_points_spent - "%u," // aa_exp - "%u," // aa_points - "%u," // group_auto_consent - "%u," // raid_auto_consent - "%u," // guild_auto_consent - "%u" // RestTimer + "%u," // aa_points_spent + "%u," // aa_exp + "%u," // aa_points + "%u," // group_auto_consent + "%u," // raid_auto_consent + "%u," // guild_auto_consent + "%u" // RestTimer ")", character_id, // " id, " account_id, // " account_id, " @@ -2178,6 +2178,9 @@ uint32 Database::GetRaidIDByCharID(uint32 character_id) { */ void Database::LoadLogSettings(EQEmuLogSys::LogSettings *log_settings) { + + std::cout << "We're hitting this eh " << std::endl; + std::string query = "SELECT " "log_category_id, " diff --git a/common/database_schema.h b/common/database_schema.h index 6a7ccf612..bd8e89b6c 100644 --- a/common/database_schema.h +++ b/common/database_schema.h @@ -248,6 +248,7 @@ namespace DatabaseSchema { return { "chatchannels", "command_settings", + "content_flags", "db_str", "eqtime", "launcher", diff --git a/common/repositories/base/base_content_flags_repository.h b/common/repositories/base/base_content_flags_repository.h new file mode 100644 index 000000000..d86b2e572 --- /dev/null +++ b/common/repositories/base/base_content_flags_repository.h @@ -0,0 +1,327 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + */ + +/** + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to + * the repository extending the base. Any modifications to base repositories are to + * be made by the generator only + */ + +#ifndef EQEMU_BASE_CONTENT_FLAGS_REPOSITORY_H +#define EQEMU_BASE_CONTENT_FLAGS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseContentFlagsRepository { +public: + struct ContentFlags { + int id; + std::string flag_name; + int8 enabled; + std::string notes; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "flag_name", + "enabled", + "notes", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("content_flags"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static ContentFlags NewEntity() + { + ContentFlags entry{}; + + entry.id = 0; + entry.flag_name = ""; + entry.enabled = 0; + entry.notes = ""; + + return entry; + } + + static ContentFlags GetContentFlagsEntry( + const std::vector &content_flagss, + int content_flags_id + ) + { + for (auto &content_flags : content_flagss) { + if (content_flags.id == content_flags_id) { + return content_flags; + } + } + + return NewEntity(); + } + + static ContentFlags FindOne( + int content_flags_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + content_flags_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + ContentFlags entry{}; + + entry.id = atoi(row[0]); + entry.flag_name = row[1] ? row[1] : ""; + entry.enabled = atoi(row[2]); + entry.notes = row[3] ? row[3] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int content_flags_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + content_flags_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + ContentFlags content_flags_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(content_flags_entry.id)); + update_values.push_back(columns[1] + " = '" + EscapeString(content_flags_entry.flag_name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(content_flags_entry.enabled)); + update_values.push_back(columns[3] + " = '" + EscapeString(content_flags_entry.notes) + "'"); + + auto results = database.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + content_flags_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static ContentFlags InsertOne( + ContentFlags content_flags_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(content_flags_entry.id)); + insert_values.push_back("'" + EscapeString(content_flags_entry.flag_name) + "'"); + insert_values.push_back(std::to_string(content_flags_entry.enabled)); + insert_values.push_back("'" + EscapeString(content_flags_entry.notes) + "'"); + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + content_flags_entry.id = results.LastInsertedID(); + return content_flags_entry; + } + + content_flags_entry = NewEntity(); + + return content_flags_entry; + } + + static int InsertMany( + std::vector content_flags_entries + ) + { + std::vector insert_chunks; + + for (auto &content_flags_entry: content_flags_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(content_flags_entry.id)); + insert_values.push_back("'" + EscapeString(content_flags_entry.flag_name) + "'"); + insert_values.push_back(std::to_string(content_flags_entry.enabled)); + insert_values.push_back("'" + EscapeString(content_flags_entry.notes) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ContentFlags entry{}; + + entry.id = atoi(row[0]); + entry.flag_name = row[1] ? row[1] : ""; + entry.enabled = atoi(row[2]); + entry.notes = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(std::string where_filter) + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ContentFlags entry{}; + + entry.id = atoi(row[0]); + entry.flag_name = row[1] ? row[1] : ""; + entry.enabled = atoi(row[2]); + entry.notes = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(std::string where_filter) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + PrimaryKey(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CONTENT_FLAGS_REPOSITORY_H diff --git a/common/repositories/content_flags_repository.h b/common/repositories/content_flags_repository.h new file mode 100644 index 000000000..d9bf0098c --- /dev/null +++ b/common/repositories/content_flags_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CONTENT_FLAGS_REPOSITORY_H +#define EQEMU_CONTENT_FLAGS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_content_flags_repository.h" + +class ContentFlagsRepository: public BaseContentFlagsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ContentFlagsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ContentFlagsRepository::GetWhereNeverExpires() + * ContentFlagsRepository::GetWhereXAndY() + * ContentFlagsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CONTENT_FLAGS_REPOSITORY_H diff --git a/utils/scripts/generators/repository-generator.pl b/utils/scripts/generators/repository-generator.pl index 710e91ae4..c57edddf6 100644 --- a/utils/scripts/generators/repository-generator.pl +++ b/utils/scripts/generators/repository-generator.pl @@ -100,6 +100,10 @@ if ($requested_table_to_generate eq "all" || !$requested_table_to_generate) { } } +if ($requested_table_to_generate ne "all") { + @tables = ($requested_table_to_generate); +} + my $generated_base_repository_files = ""; my $generated_repository_files = ""; diff --git a/utils/sql/git/required/2020_04_11_expansions_content_filters.sql b/utils/sql/git/required/2020_04_11_expansions_content_filters.sql index d26dbe793..0456d157b 100644 --- a/utils/sql/git/required/2020_04_11_expansions_content_filters.sql +++ b/utils/sql/git/required/2020_04_11_expansions_content_filters.sql @@ -80,3 +80,6 @@ ALTER TABLE `zone_points` ADD `content_flags` varchar(100) NULL; -- pok books update doors set min_expansion = 4 where name like '%POKTELE%'; + +-- content flags +CREATE TABLE `content_flags` (`id` int AUTO_INCREMENT,`flag_name` varchar(75),`enabled` tinyint,`notes` text, PRIMARY KEY (id)); diff --git a/world/main.cpp b/world/main.cpp index c8800187c..f4707e43f 100644 --- a/world/main.cpp +++ b/world/main.cpp @@ -18,6 +18,8 @@ * */ +#define PLATFORM_WORLD 1 + #include "../common/global_define.h" #include @@ -221,7 +223,7 @@ void RegisterLoginservers() /** * World process entrypoint - * + * * @param argc * @param argv * @return diff --git a/zone/main.cpp b/zone/main.cpp index ad520bf35..166332a69 100644 --- a/zone/main.cpp +++ b/zone/main.cpp @@ -53,6 +53,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #ifdef BOTS #include "bot_command.h" #endif +#include "zonedb.h" #include "zone_config.h" #include "titles.h" #include "guild_mgr.h" @@ -68,6 +69,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "../common/net/eqstream.h" #include "../common/net/servertalk_server.h" #include "../common/content/world_content_service.h" +#include "../common/repositories/content_flags_repository.h" #include #include @@ -395,16 +397,22 @@ int main(int argc, char** argv) { LogInfo("Initialized dynamic dictionary entries"); } - int current_expansion = RuleI(Expansion, CurrentExpansion); - if (current_expansion >= Expansion::Classic && current_expansion <= Expansion::MaxId) { - content_service.SetCurrentExpansion(current_expansion); + content_service.SetExpansionContext(); + + std::vector set_content_flags; + auto content_flags = ContentFlagsRepository::GetWhere("enabled = 1"); + set_content_flags.reserve(content_flags.size()); + + for (auto &flags: content_flags) { + set_content_flags.push_back(flags.flag_name); + + LogInfo( + "Enabling content-flag [{}]", + flags.flag_name + ); } - LogInfo( - "Current expansion is [{}] ({})", - content_service.GetCurrentExpansion(), - content_service.GetCurrentExpansionName() - ); + content_service.SetContentFlags(set_content_flags); #ifdef BOTS LogInfo("Loading bot commands");