diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 3b06c0e1f..fd5ce6951 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -95,6 +95,7 @@ SET(common_sources platform.cpp json/json.hpp json/jsoncpp.cpp + zone_copy.cpp zone_store.cpp net/console_server.cpp net/console_server_connection.cpp @@ -627,6 +628,7 @@ SET(common_headers unix.h useperl.h version.h + zone_copy.h zone_store.h event/event_loop.h event/task.h diff --git a/common/zone_copy.cpp b/common/zone_copy.cpp new file mode 100644 index 000000000..b3f92ec0b --- /dev/null +++ b/common/zone_copy.cpp @@ -0,0 +1,169 @@ +#include "zone_copy.h" + + +void ZoneCopier::ZoneCopy() +{ + LogSys.log_settings[Logs::MySQLQuery].is_category_enabled = 1; + LogSys.log_settings[Logs::MySQLQuery].log_to_console = 1; + + LoadZoneToCopy(); + +} + +Database *ZoneCopier::GetDatabase() const +{ + return m_database; +} + +ZoneCopier *ZoneCopier::SetDatabase(Database *database) +{ + ZoneCopier::m_database = database; + + return this; +} + +Database *ZoneCopier::GetContentDatabase() const +{ + return m_content_database; +} + +ZoneCopier *ZoneCopier::SetContentDatabase(Database *database) +{ + ZoneCopier::m_content_database = database; + + return this; +} + +const std::string &ZoneCopier::GetShortName() const +{ + return m_source_short_name; +} + +void ZoneCopier::SetSourceShortName(const std::string &short_name) +{ + ZoneCopier::m_source_short_name = short_name; +} + +int ZoneCopier::GetSourceVersion() const +{ + return m_source_version; +} + +void ZoneCopier::SetSourceVersion(int source_version) +{ + ZoneCopier::m_source_version = source_version; +} + +int ZoneCopier::GetDestinationVersion() const +{ + return m_destination_version; +} + +void ZoneCopier::SetDestinationVersion(int destination_version) +{ + ZoneCopier::m_destination_version = destination_version; +} + +void ZoneCopier::LoadZoneToCopy() +{ + auto zones = ZoneRepository::GetWhere( + *m_content_database, + fmt::format("short_name = '{}' and version = 0", m_source_short_name) + ); + + if (zones.empty()) { + LogError("Zone [{}] not found in content database", m_source_short_name); + return; + } + + m_zone = zones.front(); + m_zone.id = 0; + m_zone.version = m_destination_version; + m_zone_id = m_zone.zoneidnumber; + + LogInfo( + "Zone [{}] copied from version [{}] to version [{}]", + m_source_short_name, + m_source_version, + m_destination_version + ); + + m_spawn2s = Spawn2Repository::GetWhere( + *m_content_database, + fmt::format("zone = '{}' and version = {}", m_source_short_name, m_source_version) + ); + + if (m_spawn2s.empty()) { + LogError("No spawn2 entries found for zone [{}] version [{}]", m_source_short_name, m_source_version); + return; + } + + std::vector spawn_group_ids; + + for (auto &spawn: m_spawn2s) { + auto id = fmt::format("{}", spawn.spawngroupID); + if (std::find(spawn_group_ids.begin(), spawn_group_ids.end(), id) == spawn_group_ids.end()) { + spawn_group_ids.push_back(id); + } + } + + m_spawngroups = SpawngroupRepository::GetWhere( + *m_content_database, + fmt::format("id IN ({})", Strings::Join(spawn_group_ids, ",")) + ); + + m_spawnentries = SpawnentryRepository::GetWhere( + *m_content_database, + fmt::format("spawngroupID IN ({})", Strings::Join(spawn_group_ids, ",")) + ); + + m_zone_points = ZonePointsRepository::GetWhere( + *m_content_database, + fmt::format("zone = '{}'", m_source_short_name) + ); + + std::vector npc_type_ids; + for (auto &e: m_spawnentries) { + auto id = fmt::format("{}", e.npcID); + if (std::find(npc_type_ids.begin(), npc_type_ids.end(), id) == npc_type_ids.end()) { + npc_type_ids.push_back(id); + } + } + + m_npc_types = NpcTypesRepository::GetWhere( + *m_content_database, + fmt::format("id IN ({})", Strings::Join(npc_type_ids, ",")) + ); + + m_doors = DoorsRepository::GetWhere( + *m_content_database, + fmt::format("LOWER(zone) = '{}' and version = {}", m_source_short_name, m_source_version) + ); + + m_ground_spawns = GroundSpawnsRepository::GetWhere( + *m_content_database, + fmt::format("zoneid = {} and version = {}", m_zone_id, m_source_version) + ); + + m_objects = ObjectRepository::GetWhere( + *m_content_database, + fmt::format("zoneid = {} and version = {}", m_zone_id, m_source_version) + ); + + LogInfo( + "Found zone short_name [{}] long_name [{}] id [{}] version [{}]", + m_zone.short_name, + m_zone.long_name, + m_zone.zoneidnumber, + m_zone.version + ); + + LogInfo("Found [{}] doors", m_doors.size()); + LogInfo("Found [{}] ground_spawns", m_ground_spawns.size()); + LogInfo("Found [{}] npc_types", m_npc_types.size()); + LogInfo("Found [{}] objects", m_objects.size()); + LogInfo("Found [{}] spawn entries", m_spawnentries.size()); + LogInfo("Found [{}] spawn groups", m_spawngroups.size()); + LogInfo("Found [{}] spawn2 entries", m_spawn2s.size()); + LogInfo("Found [{}] zone_points", m_zone_points.size()); +} diff --git a/common/zone_copy.h b/common/zone_copy.h new file mode 100644 index 000000000..4a410b5e5 --- /dev/null +++ b/common/zone_copy.h @@ -0,0 +1,56 @@ +#ifndef EQEMU_ZONECOPY_H +#define EQEMU_ZONECOPY_H + +#include "database.h" +#include "repositories/zone_repository.h" +#include "repositories/spawn2_repository.h" +#include "repositories/spawngroup_repository.h" +#include "repositories/spawnentry_repository.h" +#include "repositories/zone_points_repository.h" +#include "repositories/npc_types_repository.h" +#include "repositories/doors_repository.h" +#include "repositories/ground_spawns_repository.h" +#include "repositories/object_repository.h" + +class ZoneCopier { +public: + void ZoneCopy(); + + // setters and getters + ZoneCopier *SetDatabase(Database *database); + Database *GetDatabase() const; + ZoneCopier *SetContentDatabase(Database *database); + Database *GetContentDatabase() const; + const std::string &GetShortName() const; + void SetSourceShortName(const std::string &short_name); + int GetSourceVersion() const; + void SetSourceVersion(int source_version); + int GetDestinationVersion() const; + void SetDestinationVersion(int destination_version); +private: + void LoadZoneToCopy(); + + // reference to database + Database *m_database; + Database *m_content_database; + + // inputs + std::string m_source_short_name; + int m_source_version; + int m_destination_version; + + // hold the data + ZoneRepository::Zone m_zone; + int m_zone_id; + std::vector m_spawn2s; + std::vector m_spawngroups; + std::vector m_spawnentries; + std::vector m_zone_points; + std::vector m_npc_types; + std::vector m_doors; + std::vector m_ground_spawns; + std::vector m_objects; +}; + + +#endif //EQEMU_ZONECOPY_H diff --git a/world/cli/zone_copy.cpp b/world/cli/zone_copy.cpp new file mode 100644 index 000000000..90a1c3179 --- /dev/null +++ b/world/cli/zone_copy.cpp @@ -0,0 +1,16 @@ +#include "../../common/eqemu_logsys_log_aliases.h" +#include "../../common/zone_copy.h" +#include "../../common/database.h" + +void WorldserverCLI::ZoneCopyCmd(int argc, char **argv, argh::parser &cmd, std::string &description) +{ + description = "Copies a character into a destination account"; + + auto c = ZoneCopier(); + c.SetDatabase(&database); + c.SetContentDatabase(&content_db); + c.SetSourceShortName("soldungb"); + c.SetSourceVersion(0); + c.SetDestinationVersion(1); + c.ZoneCopy(); +} diff --git a/world/world_server_cli.cpp b/world/world_server_cli.cpp index 973374c01..b1f1e8f08 100644 --- a/world/world_server_cli.cpp +++ b/world/world_server_cli.cpp @@ -27,6 +27,7 @@ void WorldserverCLI::CommandHandler(int argc, char **argv) function_map["database:schema"] = &WorldserverCLI::DatabaseGetSchema; function_map["database:dump"] = &WorldserverCLI::DatabaseDump; function_map["database:updates"] = &WorldserverCLI::DatabaseUpdates; + function_map["zone:copy"] = &WorldserverCLI::ZoneCopyCmd; function_map["test:test"] = &WorldserverCLI::TestCommand; function_map["test:colors"] = &WorldserverCLI::TestColors; function_map["test:expansion"] = &WorldserverCLI::ExpansionTestCommand; @@ -56,3 +57,4 @@ void WorldserverCLI::CommandHandler(int argc, char **argv) #include "cli/test_repository_2.cpp" #include "cli/test_string_benchmark.cpp" #include "cli/version.cpp" +#include "cli/zone_copy.cpp" diff --git a/world/world_server_cli.h b/world/world_server_cli.h index 0edebd261..44551244a 100644 --- a/world/world_server_cli.h +++ b/world/world_server_cli.h @@ -18,6 +18,7 @@ public: static void DatabaseGetSchema(int argc, char **argv, argh::parser &cmd, std::string &description); static void DatabaseDump(int argc, char **argv, argh::parser &cmd, std::string &description); static void DatabaseUpdates(int argc, char **argv, argh::parser &cmd, std::string &description); + static void ZoneCopyCmd(int argc, char **argv, argh::parser &cmd, std::string &description); static void TestCommand(int argc, char **argv, argh::parser &cmd, std::string &description); static void TestColors(int argc, char **argv, argh::parser &cmd, std::string &description); static void ExpansionTestCommand(int argc, char **argv, argh::parser &cmd, std::string &description);