From 6389876c6e28eb3276e8cad8875676fcdc04d6e1 Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Thu, 18 Sep 2025 23:12:23 -0700 Subject: [PATCH] feat: convert character ids to 64 bits (#1878) * feat: convert character ids to 64 bits remove all usages of the PERSISTENT bit with regards to storing of playerIDs on the server. the bit does not exist and was a phantom in the first place. Tested that a full playthrough of ag, ns and gf was still doable. slash commands work, ugc works, friends works, ignore list works, properties work and have names, teaming works. migrating an old mysql database works . need to test an old sqlite database * fix sqlite migration * remove nd specific column migration --- dChatServer/ChatIgnoreList.cpp | 8 +-- dChatServer/ChatPacketHandler.cpp | 4 -- dDatabase/GameDatabase/GameDatabase.h | 2 +- dDatabase/GameDatabase/ITables/IActivityLog.h | 2 +- dDatabase/GameDatabase/ITables/IBehaviors.h | 2 +- dDatabase/GameDatabase/ITables/IBugReports.h | 2 +- dDatabase/GameDatabase/ITables/ICharInfo.h | 12 ++-- dDatabase/GameDatabase/ITables/ICharXml.h | 6 +- dDatabase/GameDatabase/ITables/ICommandLog.h | 2 +- dDatabase/GameDatabase/ITables/IFriends.h | 14 ++-- dDatabase/GameDatabase/ITables/IIgnoreList.h | 8 +-- dDatabase/GameDatabase/ITables/ILeaderboard.h | 13 ++-- dDatabase/GameDatabase/ITables/IMail.h | 4 +- dDatabase/GameDatabase/ITables/IProperty.h | 4 +- .../GameDatabase/ITables/IPropertyContents.h | 2 +- .../GameDatabase/ITables/IUgcModularBuild.h | 2 +- .../GameDatabase/MySQL/MySQLDatabase.cpp | 2 +- dDatabase/GameDatabase/MySQL/MySQLDatabase.h | 67 +++++++++++-------- .../GameDatabase/MySQL/Tables/ActivityLog.cpp | 2 +- .../GameDatabase/MySQL/Tables/CharInfo.cpp | 16 ++--- .../GameDatabase/MySQL/Tables/CharXml.cpp | 6 +- .../GameDatabase/MySQL/Tables/CommandLog.cpp | 2 +- .../GameDatabase/MySQL/Tables/Friends.cpp | 16 ++--- .../GameDatabase/MySQL/Tables/IgnoreList.cpp | 8 +-- .../GameDatabase/MySQL/Tables/Leaderboard.cpp | 12 ++-- dDatabase/GameDatabase/MySQL/Tables/Mail.cpp | 4 +- .../GameDatabase/MySQL/Tables/Property.cpp | 4 +- dDatabase/GameDatabase/MySQL/Tables/Ugc.cpp | 2 +- .../MySQL/Tables/UgcModularBuild.cpp | 2 +- .../GameDatabase/SQLite/SQLiteDatabase.cpp | 2 +- .../GameDatabase/SQLite/SQLiteDatabase.h | 67 +++++++++++-------- .../SQLite/Tables/ActivityLog.cpp | 2 +- .../GameDatabase/SQLite/Tables/CharInfo.cpp | 16 ++--- .../GameDatabase/SQLite/Tables/CharXml.cpp | 6 +- .../GameDatabase/SQLite/Tables/CommandLog.cpp | 2 +- .../GameDatabase/SQLite/Tables/Friends.cpp | 16 ++--- .../GameDatabase/SQLite/Tables/IgnoreList.cpp | 8 +-- .../SQLite/Tables/Leaderboard.cpp | 12 ++-- dDatabase/GameDatabase/SQLite/Tables/Mail.cpp | 4 +- dDatabase/GameDatabase/SQLite/Tables/Ugc.cpp | 2 +- .../SQLite/Tables/UgcModularBuild.cpp | 2 +- .../GameDatabase/TestSQL/TestSQLDatabase.cpp | 44 ++++++------ .../GameDatabase/TestSQL/TestSQLDatabase.h | 56 ++++++++-------- dGame/Character.cpp | 15 +++-- dGame/Character.h | 8 +-- dGame/LeaderboardManager.cpp | 6 +- dGame/User.cpp | 4 +- dGame/UserManager.cpp | 24 +++---- dGame/UserManager.h | 2 +- .../PropertyManagementComponent.cpp | 1 - dGame/dUtilities/CheatDetection.cpp | 6 +- .../GMGreaterThanZeroCommands.cpp | 1 - dNet/MailInfo.h | 4 +- dWorldServer/WorldServer.cpp | 13 ++-- .../23_store_character_id_as_objectid.sql | 22 ++++++ .../6_store_character_id_as_objectid.sql | 22 ++++++ 56 files changed, 327 insertions(+), 270 deletions(-) create mode 100644 migrations/dlu/mysql/23_store_character_id_as_objectid.sql create mode 100644 migrations/dlu/sqlite/6_store_character_id_as_objectid.sql diff --git a/dChatServer/ChatIgnoreList.cpp b/dChatServer/ChatIgnoreList.cpp index 025d56dc..6433da70 100644 --- a/dChatServer/ChatIgnoreList.cpp +++ b/dChatServer/ChatIgnoreList.cpp @@ -34,7 +34,7 @@ void ChatIgnoreList::GetIgnoreList(Packet* packet) { if (!receiver.ignoredPlayers.empty()) { LOG_DEBUG("Player %llu already has an ignore list, but is requesting it again.", playerId); } else { - auto ignoreList = Database::Get()->GetIgnoreList(static_cast(playerId)); + auto ignoreList = Database::Get()->GetIgnoreList(playerId); if (ignoreList.empty()) { LOG_DEBUG("Player %llu has no ignores", playerId); return; @@ -43,7 +43,6 @@ void ChatIgnoreList::GetIgnoreList(Packet* packet) { for (auto& ignoredPlayer : ignoreList) { receiver.ignoredPlayers.emplace_back(ignoredPlayer.name, ignoredPlayer.id); GeneralUtils::SetBit(receiver.ignoredPlayers.back().playerId, eObjectBits::CHARACTER); - GeneralUtils::SetBit(receiver.ignoredPlayers.back().playerId, eObjectBits::PERSISTENT); } } @@ -114,9 +113,8 @@ void ChatIgnoreList::AddIgnore(Packet* packet) { } if (ignoredPlayerId != LWOOBJID_EMPTY) { - Database::Get()->AddIgnore(static_cast(playerId), static_cast(ignoredPlayerId)); + Database::Get()->AddIgnore(playerId, ignoredPlayerId); GeneralUtils::SetBit(ignoredPlayerId, eObjectBits::CHARACTER); - GeneralUtils::SetBit(ignoredPlayerId, eObjectBits::PERSISTENT); receiver.ignoredPlayers.emplace_back(toIgnoreStr, ignoredPlayerId); LOG_DEBUG("Player %llu is ignoring %s", playerId, toIgnoreStr.c_str()); @@ -157,7 +155,7 @@ void ChatIgnoreList::RemoveIgnore(Packet* packet) { return; } - Database::Get()->RemoveIgnore(static_cast(playerId), static_cast(toRemove->playerId)); + Database::Get()->RemoveIgnore(playerId, toRemove->playerId); receiver.ignoredPlayers.erase(toRemove, receiver.ignoredPlayers.end()); CBITSTREAM; diff --git a/dChatServer/ChatPacketHandler.cpp b/dChatServer/ChatPacketHandler.cpp index 80d1a26f..844631b4 100644 --- a/dChatServer/ChatPacketHandler.cpp +++ b/dChatServer/ChatPacketHandler.cpp @@ -35,7 +35,6 @@ void ChatPacketHandler::HandleFriendlistRequest(Packet* packet) { FriendData fd; fd.isFTP = false; // not a thing in DLU fd.friendID = friendData.friendID; - GeneralUtils::SetBit(fd.friendID, eObjectBits::PERSISTENT); GeneralUtils::SetBit(fd.friendID, eObjectBits::CHARACTER); fd.isBestFriend = friendData.isBestFriend; //0 = friends, 1 = left_requested, 2 = right_requested, 3 = both_accepted - are now bffs @@ -161,9 +160,7 @@ void ChatPacketHandler::HandleFriendRequest(Packet* packet) { // Set the bits GeneralUtils::SetBit(queryPlayerID, eObjectBits::CHARACTER); - GeneralUtils::SetBit(queryPlayerID, eObjectBits::PERSISTENT); GeneralUtils::SetBit(queryFriendID, eObjectBits::CHARACTER); - GeneralUtils::SetBit(queryFriendID, eObjectBits::PERSISTENT); // Since this player can either be the friend of someone else or be friends with someone else // their column in the database determines what bit gets set. When the value hits 3, they @@ -318,7 +315,6 @@ void ChatPacketHandler::HandleRemoveFriend(Packet* packet) { } // Convert friendID to LWOOBJID - GeneralUtils::SetBit(friendID, eObjectBits::PERSISTENT); GeneralUtils::SetBit(friendID, eObjectBits::CHARACTER); Database::Get()->RemoveFriend(playerID, friendID); diff --git a/dDatabase/GameDatabase/GameDatabase.h b/dDatabase/GameDatabase/GameDatabase.h index d0b5c866..2126b9be 100644 --- a/dDatabase/GameDatabase/GameDatabase.h +++ b/dDatabase/GameDatabase/GameDatabase.h @@ -48,7 +48,7 @@ public: virtual void Commit() = 0; virtual bool GetAutoCommit() = 0; virtual void SetAutoCommit(bool value) = 0; - virtual void DeleteCharacter(const uint32_t characterId) = 0; + virtual void DeleteCharacter(const LWOOBJID characterId) = 0; }; #endif //!__GAMEDATABASE__H__ diff --git a/dDatabase/GameDatabase/ITables/IActivityLog.h b/dDatabase/GameDatabase/ITables/IActivityLog.h index 10a97e97..19022e2b 100644 --- a/dDatabase/GameDatabase/ITables/IActivityLog.h +++ b/dDatabase/GameDatabase/ITables/IActivityLog.h @@ -14,7 +14,7 @@ enum class eActivityType : uint32_t { class IActivityLog { public: // Update the activity log for the given account. - virtual void UpdateActivityLog(const uint32_t characterId, const eActivityType activityType, const LWOMAPID mapId) = 0; + virtual void UpdateActivityLog(const LWOOBJID characterId, const eActivityType activityType, const LWOMAPID mapId) = 0; }; #endif //!__IACTIVITYLOG__H__ diff --git a/dDatabase/GameDatabase/ITables/IBehaviors.h b/dDatabase/GameDatabase/ITables/IBehaviors.h index e791ebef..e3f087f3 100644 --- a/dDatabase/GameDatabase/ITables/IBehaviors.h +++ b/dDatabase/GameDatabase/ITables/IBehaviors.h @@ -9,7 +9,7 @@ class IBehaviors { public: struct Info { LWOOBJID behaviorId{}; - uint32_t characterId{}; + LWOOBJID characterId{}; std::string behaviorInfo; }; diff --git a/dDatabase/GameDatabase/ITables/IBugReports.h b/dDatabase/GameDatabase/ITables/IBugReports.h index 29a6180f..083b58aa 100644 --- a/dDatabase/GameDatabase/ITables/IBugReports.h +++ b/dDatabase/GameDatabase/ITables/IBugReports.h @@ -11,7 +11,7 @@ public: std::string clientVersion; std::string otherPlayer; std::string selection; - uint32_t characterId{}; + LWOOBJID characterId{}; }; // Add a new bug report to the database. diff --git a/dDatabase/GameDatabase/ITables/ICharInfo.h b/dDatabase/GameDatabase/ITables/ICharInfo.h index d908d993..d28017f3 100644 --- a/dDatabase/GameDatabase/ITables/ICharInfo.h +++ b/dDatabase/GameDatabase/ITables/ICharInfo.h @@ -14,7 +14,7 @@ public: struct Info { std::string name; std::string pendingName; - uint32_t id{}; + LWOOBJID id{}; uint32_t accountId{}; bool needsRename{}; LWOCLONEID cloneId{}; @@ -25,25 +25,25 @@ public: virtual std::vector GetApprovedCharacterNames() = 0; // Get the character info for the given character id. - virtual std::optional GetCharacterInfo(const uint32_t charId) = 0; + virtual std::optional GetCharacterInfo(const LWOOBJID charId) = 0; // Get the character info for the given character name. virtual std::optional GetCharacterInfo(const std::string_view name) = 0; // Get the character ids for the given account. - virtual std::vector GetAccountCharacterIds(const uint32_t accountId) = 0; + virtual std::vector GetAccountCharacterIds(const LWOOBJID accountId) = 0; // Insert a new character into the database. virtual void InsertNewCharacter(const ICharInfo::Info info) = 0; // Set the name of the given character. - virtual void SetCharacterName(const uint32_t characterId, const std::string_view name) = 0; + virtual void SetCharacterName(const LWOOBJID characterId, const std::string_view name) = 0; // Set the pending name of the given character. - virtual void SetPendingCharacterName(const uint32_t characterId, const std::string_view name) = 0; + virtual void SetPendingCharacterName(const LWOOBJID characterId, const std::string_view name) = 0; // Updates the given character ids last login to be right now. - virtual void UpdateLastLoggedInCharacter(const uint32_t characterId) = 0; + virtual void UpdateLastLoggedInCharacter(const LWOOBJID characterId) = 0; virtual bool IsNameInUse(const std::string_view name) = 0; }; diff --git a/dDatabase/GameDatabase/ITables/ICharXml.h b/dDatabase/GameDatabase/ITables/ICharXml.h index c7ada075..498d964b 100644 --- a/dDatabase/GameDatabase/ITables/ICharXml.h +++ b/dDatabase/GameDatabase/ITables/ICharXml.h @@ -8,13 +8,13 @@ class ICharXml { public: // Get the character xml for the given character id. - virtual std::string GetCharacterXml(const uint32_t charId) = 0; + virtual std::string GetCharacterXml(const LWOOBJID charId) = 0; // Update the character xml for the given character id. - virtual void UpdateCharacterXml(const uint32_t charId, const std::string_view lxfml) = 0; + virtual void UpdateCharacterXml(const LWOOBJID charId, const std::string_view lxfml) = 0; // Insert the character xml for the given character id. - virtual void InsertCharacterXml(const uint32_t characterId, const std::string_view lxfml) = 0; + virtual void InsertCharacterXml(const LWOOBJID characterId, const std::string_view lxfml) = 0; }; #endif //!__ICHARXML__H__ diff --git a/dDatabase/GameDatabase/ITables/ICommandLog.h b/dDatabase/GameDatabase/ITables/ICommandLog.h index 63595360..a466d4f6 100644 --- a/dDatabase/GameDatabase/ITables/ICommandLog.h +++ b/dDatabase/GameDatabase/ITables/ICommandLog.h @@ -8,7 +8,7 @@ class ICommandLog { public: // Insert a new slash command log entry. - virtual void InsertSlashCommandUsage(const uint32_t characterId, const std::string_view command) = 0; + virtual void InsertSlashCommandUsage(const LWOOBJID characterId, const std::string_view command) = 0; }; #endif //!__ICOMMANDLOG__H__ diff --git a/dDatabase/GameDatabase/ITables/IFriends.h b/dDatabase/GameDatabase/ITables/IFriends.h index 6f96f441..7179bb8b 100644 --- a/dDatabase/GameDatabase/ITables/IFriends.h +++ b/dDatabase/GameDatabase/ITables/IFriends.h @@ -8,25 +8,25 @@ class IFriends { public: struct BestFriendStatus { - uint32_t playerCharacterId{}; - uint32_t friendCharacterId{}; + LWOOBJID playerCharacterId{}; + LWOOBJID friendCharacterId{}; uint32_t bestFriendStatus{}; }; // Get the friends list for the given character id. - virtual std::vector GetFriendsList(const uint32_t charId) = 0; + virtual std::vector GetFriendsList(const LWOOBJID charId) = 0; // Get the best friend status for the given player and friend character ids. - virtual std::optional GetBestFriendStatus(const uint32_t playerCharacterId, const uint32_t friendCharacterId) = 0; + virtual std::optional GetBestFriendStatus(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) = 0; // Set the best friend status for the given player and friend character ids. - virtual void SetBestFriendStatus(const uint32_t playerCharacterId, const uint32_t friendCharacterId, const uint32_t bestFriendStatus) = 0; + virtual void SetBestFriendStatus(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId, const uint32_t bestFriendStatus) = 0; // Add a friend to the given character id. - virtual void AddFriend(const uint32_t playerCharacterId, const uint32_t friendCharacterId) = 0; + virtual void AddFriend(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) = 0; // Remove a friend from the given character id. - virtual void RemoveFriend(const uint32_t playerCharacterId, const uint32_t friendCharacterId) = 0; + virtual void RemoveFriend(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) = 0; }; #endif //!__IFRIENDS__H__ diff --git a/dDatabase/GameDatabase/ITables/IIgnoreList.h b/dDatabase/GameDatabase/ITables/IIgnoreList.h index cf831203..02da9276 100644 --- a/dDatabase/GameDatabase/ITables/IIgnoreList.h +++ b/dDatabase/GameDatabase/ITables/IIgnoreList.h @@ -9,12 +9,12 @@ class IIgnoreList { public: struct Info { std::string name; - uint32_t id; + LWOOBJID id; }; - virtual std::vector GetIgnoreList(const uint32_t playerId) = 0; - virtual void AddIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) = 0; - virtual void RemoveIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) = 0; + virtual std::vector GetIgnoreList(const LWOOBJID playerId) = 0; + virtual void AddIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) = 0; + virtual void RemoveIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) = 0; }; #endif //!__IIGNORELIST__H__ diff --git a/dDatabase/GameDatabase/ITables/ILeaderboard.h b/dDatabase/GameDatabase/ITables/ILeaderboard.h index 0a7922e4..90e9260d 100644 --- a/dDatabase/GameDatabase/ITables/ILeaderboard.h +++ b/dDatabase/GameDatabase/ITables/ILeaderboard.h @@ -5,12 +5,13 @@ #include #include #include +#include "dCommonVars.h" class ILeaderboard { public: struct Entry { - uint32_t charId{}; + LWOOBJID charId{}; uint32_t lastPlayedTimestamp{}; float primaryScore{}; float secondaryScore{}; @@ -36,12 +37,12 @@ public: virtual std::vector GetAscendingLeaderboard(const uint32_t activityId) = 0; virtual std::vector GetNsLeaderboard(const uint32_t activityId) = 0; virtual std::vector GetAgsLeaderboard(const uint32_t activityId) = 0; - virtual std::optional GetPlayerScore(const uint32_t playerId, const uint32_t gameId) = 0; + virtual std::optional GetPlayerScore(const LWOOBJID playerId, const uint32_t gameId) = 0; - virtual void SaveScore(const uint32_t playerId, const uint32_t gameId, const Score& score) = 0; - virtual void UpdateScore(const uint32_t playerId, const uint32_t gameId, const Score& score) = 0; - virtual void IncrementNumWins(const uint32_t playerId, const uint32_t gameId) = 0; - virtual void IncrementTimesPlayed(const uint32_t playerId, const uint32_t gameId) = 0; + virtual void SaveScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) = 0; + virtual void UpdateScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) = 0; + virtual void IncrementNumWins(const LWOOBJID playerId, const uint32_t gameId) = 0; + virtual void IncrementTimesPlayed(const LWOOBJID playerId, const uint32_t gameId) = 0; }; #endif //!__ILEADERBOARD__H__ diff --git a/dDatabase/GameDatabase/ITables/IMail.h b/dDatabase/GameDatabase/ITables/IMail.h index 239f3cf2..6fb657c9 100644 --- a/dDatabase/GameDatabase/ITables/IMail.h +++ b/dDatabase/GameDatabase/ITables/IMail.h @@ -16,13 +16,13 @@ public: virtual void InsertNewMail(const MailInfo& mail) = 0; // Get the mail for the given character id. - virtual std::vector GetMailForPlayer(const uint32_t characterId, const uint32_t numberOfMail) = 0; + virtual std::vector GetMailForPlayer(const LWOOBJID characterId, const uint32_t numberOfMail) = 0; // Get the mail for the given mail id. virtual std::optional GetMail(const uint64_t mailId) = 0; // Get the number of unread mail for the given character id. - virtual uint32_t GetUnreadMailCount(const uint32_t characterId) = 0; + virtual uint32_t GetUnreadMailCount(const LWOOBJID characterId) = 0; // Mark the given mail as read. virtual void MarkMailRead(const uint64_t mailId) = 0; diff --git a/dDatabase/GameDatabase/ITables/IProperty.h b/dDatabase/GameDatabase/ITables/IProperty.h index 9019c176..78f58284 100644 --- a/dDatabase/GameDatabase/ITables/IProperty.h +++ b/dDatabase/GameDatabase/ITables/IProperty.h @@ -13,7 +13,7 @@ public: std::string description; std::string rejectionReason; LWOOBJID id{}; - uint32_t ownerId{}; + LWOOBJID ownerId{}; LWOCLONEID cloneId{}; int32_t privacyOption{}; uint32_t modApproved{}; @@ -27,7 +27,7 @@ public: uint32_t mapId{}; std::string searchString; ePropertySortType sortChoice{}; - uint32_t playerId{}; + LWOOBJID playerId{}; uint32_t numResults{}; uint32_t startIndex{}; uint32_t playerSort{}; diff --git a/dDatabase/GameDatabase/ITables/IPropertyContents.h b/dDatabase/GameDatabase/ITables/IPropertyContents.h index 1c51d00c..52f1a672 100644 --- a/dDatabase/GameDatabase/ITables/IPropertyContents.h +++ b/dDatabase/GameDatabase/ITables/IPropertyContents.h @@ -25,7 +25,7 @@ public: std::stringstream& sd0Data, const uint32_t blueprintId, const uint32_t accountId, - const uint32_t characterId) = 0; + const LWOOBJID characterId) = 0; // Get the property models for the given property id. virtual std::vector GetPropertyModels(const LWOOBJID& propertyId) = 0; diff --git a/dDatabase/GameDatabase/ITables/IUgcModularBuild.h b/dDatabase/GameDatabase/ITables/IUgcModularBuild.h index 4aa2e312..7ac69fe3 100644 --- a/dDatabase/GameDatabase/ITables/IUgcModularBuild.h +++ b/dDatabase/GameDatabase/ITables/IUgcModularBuild.h @@ -7,7 +7,7 @@ class IUgcModularBuild { public: - virtual void InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) = 0; + virtual void InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) = 0; virtual void DeleteUgcBuild(const LWOOBJID bigId) = 0; }; diff --git a/dDatabase/GameDatabase/MySQL/MySQLDatabase.cpp b/dDatabase/GameDatabase/MySQL/MySQLDatabase.cpp index 26693631..7bbd2812 100644 --- a/dDatabase/GameDatabase/MySQL/MySQLDatabase.cpp +++ b/dDatabase/GameDatabase/MySQL/MySQLDatabase.cpp @@ -100,7 +100,7 @@ void MySQLDatabase::SetAutoCommit(bool value) { con->setAutoCommit(value); } -void MySQLDatabase::DeleteCharacter(const uint32_t characterId) { +void MySQLDatabase::DeleteCharacter(const LWOOBJID characterId) { ExecuteDelete("DELETE FROM charxml WHERE id=? LIMIT 1;", characterId); ExecuteDelete("DELETE FROM command_log WHERE character_id=?;", characterId); ExecuteDelete("DELETE FROM friends WHERE player_id=? OR friend_id=?;", characterId, characterId); diff --git a/dDatabase/GameDatabase/MySQL/MySQLDatabase.h b/dDatabase/GameDatabase/MySQL/MySQLDatabase.h index 13f84e9a..7a3a53b5 100644 --- a/dDatabase/GameDatabase/MySQL/MySQLDatabase.h +++ b/dDatabase/GameDatabase/MySQL/MySQLDatabase.h @@ -40,31 +40,31 @@ public: std::vector GetApprovedCharacterNames() override; - std::vector GetFriendsList(uint32_t charID) override; + std::vector GetFriendsList(LWOOBJID charID) override; - std::optional GetBestFriendStatus(const uint32_t playerCharacterId, const uint32_t friendCharacterId) override; - void SetBestFriendStatus(const uint32_t playerAccountId, const uint32_t friendAccountId, const uint32_t bestFriendStatus) override; - void AddFriend(const uint32_t playerAccountId, const uint32_t friendAccountId) override; - void RemoveFriend(const uint32_t playerAccountId, const uint32_t friendAccountId) override; - void UpdateActivityLog(const uint32_t characterId, const eActivityType activityType, const LWOMAPID mapId) override; + std::optional GetBestFriendStatus(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) override; + void SetBestFriendStatus(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId, const uint32_t bestFriendStatus) override; + void AddFriend(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId) override; + void RemoveFriend(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId) override; + void UpdateActivityLog(const LWOOBJID characterId, const eActivityType activityType, const LWOMAPID mapId) override; void DeleteUgcModelData(const LWOOBJID& modelId) override; void UpdateUgcModelData(const LWOOBJID& modelId, std::stringstream& lxfml) override; std::vector GetAllUgcModels() override; void CreateMigrationHistoryTable() override; bool IsMigrationRun(const std::string_view str) override; void InsertMigration(const std::string_view str) override; - std::optional GetCharacterInfo(const uint32_t charId) override; + std::optional GetCharacterInfo(const LWOOBJID charId) override; std::optional GetCharacterInfo(const std::string_view charId) override; - std::string GetCharacterXml(const uint32_t accountId) override; - void UpdateCharacterXml(const uint32_t characterId, const std::string_view lxfml) override; + std::string GetCharacterXml(const LWOOBJID accountId) override; + void UpdateCharacterXml(const LWOOBJID characterId, const std::string_view lxfml) override; std::optional GetAccountInfo(const std::string_view username) override; void InsertNewCharacter(const ICharInfo::Info info) override; - void InsertCharacterXml(const uint32_t accountId, const std::string_view lxfml) override; - std::vector GetAccountCharacterIds(uint32_t accountId) override; - void DeleteCharacter(const uint32_t characterId) override; - void SetCharacterName(const uint32_t characterId, const std::string_view name) override; - void SetPendingCharacterName(const uint32_t characterId, const std::string_view name) override; - void UpdateLastLoggedInCharacter(const uint32_t characterId) override; + void InsertCharacterXml(const LWOOBJID accountId, const std::string_view lxfml) override; + std::vector GetAccountCharacterIds(LWOOBJID accountId) override; + void DeleteCharacter(const LWOOBJID characterId) override; + void SetCharacterName(const LWOOBJID characterId, const std::string_view name) override; + void SetPendingCharacterName(const LWOOBJID characterId, const std::string_view name) override; + void UpdateLastLoggedInCharacter(const LWOOBJID characterId) override; void SetPetNameModerationStatus(const LWOOBJID& petId, const IPetNames::Info& info) override; std::optional GetPetNameInfo(const LWOOBJID& petId) override; std::optional GetPropertyInfo(const LWOMAPID mapId, const LWOCLONEID cloneId) override; @@ -85,14 +85,14 @@ public: std::stringstream& sd0Data, const uint32_t blueprintId, const uint32_t accountId, - const uint32_t characterId) override; - std::vector GetMailForPlayer(const uint32_t characterId, const uint32_t numberOfMail) override; + const LWOOBJID characterId) override; + std::vector GetMailForPlayer(const LWOOBJID characterId, const uint32_t numberOfMail) override; std::optional GetMail(const uint64_t mailId) override; - uint32_t GetUnreadMailCount(const uint32_t characterId) override; + uint32_t GetUnreadMailCount(const LWOOBJID characterId) override; void MarkMailRead(const uint64_t mailId) override; void DeleteMail(const uint64_t mailId) override; void ClaimMailItem(const uint64_t mailId) override; - void InsertSlashCommandUsage(const uint32_t characterId, const std::string_view command) override; + void InsertSlashCommandUsage(const LWOOBJID characterId, const std::string_view command) override; void UpdateAccountUnmuteTime(const uint32_t accountId, const uint64_t timeToUnmute) override; void UpdateAccountBan(const uint32_t accountId, const bool banned) override; void UpdateAccountPassword(const uint32_t accountId, const std::string_view bcryptpassword) override; @@ -104,9 +104,9 @@ public: std::optional GetDonationTotal(const uint32_t activityId) override; std::optional IsPlaykeyActive(const int32_t playkeyId) override; std::vector GetUgcModels(const LWOOBJID& propertyId) override; - void AddIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) override; - void RemoveIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) override; - std::vector GetIgnoreList(const uint32_t playerId) override; + void AddIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) override; + void RemoveIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) override; + std::vector GetIgnoreList(const LWOOBJID playerId) override; void InsertRewardCode(const uint32_t account_id, const uint32_t reward_code) override; std::vector GetRewardCodesByAccountID(const uint32_t account_id) override; void AddBehavior(const IBehaviors::Info& info) override; @@ -118,12 +118,12 @@ public: std::vector GetAscendingLeaderboard(const uint32_t activityId) override; std::vector GetNsLeaderboard(const uint32_t activityId) override; std::vector GetAgsLeaderboard(const uint32_t activityId) override; - void SaveScore(const uint32_t playerId, const uint32_t gameId, const Score& score) override; - void UpdateScore(const uint32_t playerId, const uint32_t gameId, const Score& score) override; - std::optional GetPlayerScore(const uint32_t playerId, const uint32_t gameId) override; - void IncrementNumWins(const uint32_t playerId, const uint32_t gameId) override; - void IncrementTimesPlayed(const uint32_t playerId, const uint32_t gameId) override; - void InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) override; + void SaveScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) override; + void UpdateScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) override; + std::optional GetPlayerScore(const LWOOBJID playerId, const uint32_t gameId) override; + void IncrementNumWins(const LWOOBJID playerId, const uint32_t gameId) override; + void IncrementTimesPlayed(const LWOOBJID playerId, const uint32_t gameId) override; + void InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) override; void DeleteUgcBuild(const LWOOBJID bigId) override; uint32_t GetAccountCount() override; bool IsNameInUse(const std::string_view name) override; @@ -268,4 +268,15 @@ inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::opti } } +template<> +inline void SetParam(UniquePreppedStmtRef stmt, const int index, const std::optional param) { + if (param) { + // LOG("%d", param.value()); + stmt->setInt64(index, param.value()); + } else { + // LOG("Null"); + stmt->setNull(index, sql::DataType::SQLNULL); + } +} + #endif //!__MYSQLDATABASE__H__ diff --git a/dDatabase/GameDatabase/MySQL/Tables/ActivityLog.cpp b/dDatabase/GameDatabase/MySQL/Tables/ActivityLog.cpp index 50fd6b79..a84be699 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/ActivityLog.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/ActivityLog.cpp @@ -1,6 +1,6 @@ #include "MySQLDatabase.h" -void MySQLDatabase::UpdateActivityLog(const uint32_t characterId, const eActivityType activityType, const LWOMAPID mapId) { +void MySQLDatabase::UpdateActivityLog(const LWOOBJID characterId, const eActivityType activityType, const LWOMAPID mapId) { ExecuteInsert("INSERT INTO activity_log (character_id, activity, time, map_id) VALUES (?, ?, ?, ?);", characterId, static_cast(activityType), static_cast(time(NULL)), mapId); } diff --git a/dDatabase/GameDatabase/MySQL/Tables/CharInfo.cpp b/dDatabase/GameDatabase/MySQL/Tables/CharInfo.cpp index ca8103d6..5d744b3d 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/CharInfo.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/CharInfo.cpp @@ -19,7 +19,7 @@ std::optional CharInfoFromQueryResult(std::unique_ptrgetUInt("id"); + toReturn.id = stmt->getInt64("id"); toReturn.name = stmt->getString("name").c_str(); toReturn.pendingName = stmt->getString("pending_name").c_str(); toReturn.needsRename = stmt->getBoolean("needs_rename"); @@ -30,7 +30,7 @@ std::optional CharInfoFromQueryResult(std::unique_ptr MySQLDatabase::GetCharacterInfo(const uint32_t charId) { +std::optional MySQLDatabase::GetCharacterInfo(const LWOOBJID charId) { return CharInfoFromQueryResult( ExecuteSelect("SELECT name, pending_name, needs_rename, prop_clone_id, permission_map, id, account_id FROM charinfo WHERE id = ? LIMIT 1;", charId) ); @@ -42,13 +42,13 @@ std::optional MySQLDatabase::GetCharacterInfo(const std::string ); } -std::vector MySQLDatabase::GetAccountCharacterIds(const uint32_t accountId) { +std::vector MySQLDatabase::GetAccountCharacterIds(const LWOOBJID accountId) { auto result = ExecuteSelect("SELECT id FROM charinfo WHERE account_id = ? ORDER BY last_login DESC LIMIT 4;", accountId); - std::vector toReturn; + std::vector toReturn; toReturn.reserve(result->rowsCount()); while (result->next()) { - toReturn.push_back(result->getUInt("id")); + toReturn.push_back(result->getInt64("id")); } return toReturn; @@ -65,15 +65,15 @@ void MySQLDatabase::InsertNewCharacter(const ICharInfo::Info info) { static_cast(time(NULL))); } -void MySQLDatabase::SetCharacterName(const uint32_t characterId, const std::string_view name) { +void MySQLDatabase::SetCharacterName(const LWOOBJID characterId, const std::string_view name) { ExecuteUpdate("UPDATE charinfo SET name = ?, pending_name = '', needs_rename = 0, last_login = ? WHERE id = ? LIMIT 1;", name, static_cast(time(NULL)), characterId); } -void MySQLDatabase::SetPendingCharacterName(const uint32_t characterId, const std::string_view name) { +void MySQLDatabase::SetPendingCharacterName(const LWOOBJID characterId, const std::string_view name) { ExecuteUpdate("UPDATE charinfo SET pending_name = ?, needs_rename = 0, last_login = ? WHERE id = ? LIMIT 1", name, static_cast(time(NULL)), characterId); } -void MySQLDatabase::UpdateLastLoggedInCharacter(const uint32_t characterId) { +void MySQLDatabase::UpdateLastLoggedInCharacter(const LWOOBJID characterId) { ExecuteUpdate("UPDATE charinfo SET last_login = ? WHERE id = ? LIMIT 1", static_cast(time(NULL)), characterId); } diff --git a/dDatabase/GameDatabase/MySQL/Tables/CharXml.cpp b/dDatabase/GameDatabase/MySQL/Tables/CharXml.cpp index 91a6351e..1de69166 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/CharXml.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/CharXml.cpp @@ -1,6 +1,6 @@ #include "MySQLDatabase.h" -std::string MySQLDatabase::GetCharacterXml(const uint32_t charId) { +std::string MySQLDatabase::GetCharacterXml(const LWOOBJID charId) { auto result = ExecuteSelect("SELECT xml_data FROM charxml WHERE id = ? LIMIT 1;", charId); if (!result->next()) { @@ -10,10 +10,10 @@ std::string MySQLDatabase::GetCharacterXml(const uint32_t charId) { return result->getString("xml_data").c_str(); } -void MySQLDatabase::UpdateCharacterXml(const uint32_t charId, const std::string_view lxfml) { +void MySQLDatabase::UpdateCharacterXml(const LWOOBJID charId, const std::string_view lxfml) { ExecuteUpdate("UPDATE charxml SET xml_data = ? WHERE id = ?;", lxfml, charId); } -void MySQLDatabase::InsertCharacterXml(const uint32_t characterId, const std::string_view lxfml) { +void MySQLDatabase::InsertCharacterXml(const LWOOBJID characterId, const std::string_view lxfml) { ExecuteInsert("INSERT INTO `charxml` (`id`, `xml_data`) VALUES (?,?)", characterId, lxfml); } diff --git a/dDatabase/GameDatabase/MySQL/Tables/CommandLog.cpp b/dDatabase/GameDatabase/MySQL/Tables/CommandLog.cpp index c8ae365a..10d83b2e 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/CommandLog.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/CommandLog.cpp @@ -1,5 +1,5 @@ #include "MySQLDatabase.h" -void MySQLDatabase::InsertSlashCommandUsage(const uint32_t characterId, const std::string_view command) { +void MySQLDatabase::InsertSlashCommandUsage(const LWOOBJID characterId, const std::string_view command) { ExecuteInsert("INSERT INTO command_log (character_id, command) VALUES (?, ?);", characterId, command); } diff --git a/dDatabase/GameDatabase/MySQL/Tables/Friends.cpp b/dDatabase/GameDatabase/MySQL/Tables/Friends.cpp index da9b34a3..7355ecde 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/Friends.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/Friends.cpp @@ -1,6 +1,6 @@ #include "MySQLDatabase.h" -std::vector MySQLDatabase::GetFriendsList(const uint32_t charId) { +std::vector MySQLDatabase::GetFriendsList(const LWOOBJID charId) { auto friendsList = ExecuteSelect( R"QUERY( SELECT fr.requested_player AS player, best_friend AS bff, ci.name AS name FROM @@ -19,7 +19,7 @@ std::vector MySQLDatabase::GetFriendsList(const uint32_t charId) { while (friendsList->next()) { FriendData fd; - fd.friendID = friendsList->getUInt("player"); + fd.friendID = friendsList->getUInt64("player"); fd.isBestFriend = friendsList->getInt("bff") == 3; // 0 = friends, 1 = left_requested, 2 = right_requested, 3 = both_accepted - are now bffs fd.friendName = friendsList->getString("name").c_str(); @@ -29,7 +29,7 @@ std::vector MySQLDatabase::GetFriendsList(const uint32_t charId) { return toReturn; } -std::optional MySQLDatabase::GetBestFriendStatus(const uint32_t playerCharacterId, const uint32_t friendCharacterId) { +std::optional MySQLDatabase::GetBestFriendStatus(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) { auto result = ExecuteSelect("SELECT * FROM friends WHERE (player_id = ? AND friend_id = ?) OR (player_id = ? AND friend_id = ?) LIMIT 1;", playerCharacterId, friendCharacterId, @@ -42,14 +42,14 @@ std::optional MySQLDatabase::GetBestFriendStatus(con } IFriends::BestFriendStatus toReturn; - toReturn.playerCharacterId = result->getUInt("player_id"); - toReturn.friendCharacterId = result->getUInt("friend_id"); + toReturn.playerCharacterId = result->getUInt64("player_id"); + toReturn.friendCharacterId = result->getUInt64("friend_id"); toReturn.bestFriendStatus = result->getUInt("best_friend"); return toReturn; } -void MySQLDatabase::SetBestFriendStatus(const uint32_t playerCharacterId, const uint32_t friendCharacterId, const uint32_t bestFriendStatus) { +void MySQLDatabase::SetBestFriendStatus(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId, const uint32_t bestFriendStatus) { ExecuteUpdate("UPDATE friends SET best_friend = ? WHERE (player_id = ? AND friend_id = ?) OR (player_id = ? AND friend_id = ?) LIMIT 1;", bestFriendStatus, playerCharacterId, @@ -59,11 +59,11 @@ void MySQLDatabase::SetBestFriendStatus(const uint32_t playerCharacterId, const ); } -void MySQLDatabase::AddFriend(const uint32_t playerCharacterId, const uint32_t friendCharacterId) { +void MySQLDatabase::AddFriend(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) { ExecuteInsert("INSERT IGNORE INTO friends (player_id, friend_id, best_friend) VALUES (?, ?, 0);", playerCharacterId, friendCharacterId); } -void MySQLDatabase::RemoveFriend(const uint32_t playerCharacterId, const uint32_t friendCharacterId) { +void MySQLDatabase::RemoveFriend(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) { ExecuteDelete("DELETE FROM friends WHERE (player_id = ? AND friend_id = ?) OR (player_id = ? AND friend_id = ?) LIMIT 1;", playerCharacterId, friendCharacterId, diff --git a/dDatabase/GameDatabase/MySQL/Tables/IgnoreList.cpp b/dDatabase/GameDatabase/MySQL/Tables/IgnoreList.cpp index 283df324..ec1f378c 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/IgnoreList.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/IgnoreList.cpp @@ -1,22 +1,22 @@ #include "MySQLDatabase.h" -std::vector MySQLDatabase::GetIgnoreList(const uint32_t playerId) { +std::vector MySQLDatabase::GetIgnoreList(const LWOOBJID playerId) { auto result = ExecuteSelect("SELECT ci.name AS name, il.ignored_player_id AS ignore_id FROM ignore_list AS il JOIN charinfo AS ci ON il.ignored_player_id = ci.id WHERE il.player_id = ?", playerId); std::vector ignoreList; ignoreList.reserve(result->rowsCount()); while (result->next()) { - ignoreList.push_back(IIgnoreList::Info{ result->getString("name").c_str(), result->getUInt("ignore_id") }); + ignoreList.push_back(IIgnoreList::Info{ result->getString("name").c_str(), result->getInt64("ignore_id") }); } return ignoreList; } -void MySQLDatabase::AddIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) { +void MySQLDatabase::AddIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) { ExecuteInsert("INSERT IGNORE INTO ignore_list (player_id, ignored_player_id) VALUES (?, ?)", playerId, ignoredPlayerId); } -void MySQLDatabase::RemoveIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) { +void MySQLDatabase::RemoveIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) { ExecuteDelete("DELETE FROM ignore_list WHERE player_id = ? AND ignored_player_id = ?", playerId, ignoredPlayerId); } diff --git a/dDatabase/GameDatabase/MySQL/Tables/Leaderboard.cpp b/dDatabase/GameDatabase/MySQL/Tables/Leaderboard.cpp index 14ac121a..eb60bf08 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/Leaderboard.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/Leaderboard.cpp @@ -21,7 +21,7 @@ std::vector ProcessQuery(UniqueResultSet& rows) { while (rows->next()) { auto& entry = entries.emplace_back(); - entry.charId = rows->getUInt("character_id"); + entry.charId = rows->getUInt64("character_id"); entry.lastPlayedTimestamp = rows->getUInt("lp_unix"); entry.primaryScore = rows->getFloat("primaryScore"); entry.secondaryScore = rows->getFloat("secondaryScore"); @@ -58,21 +58,21 @@ std::vector MySQLDatabase::GetNsLeaderboard(const uint32_t return ProcessQuery(leaderboard); } -void MySQLDatabase::SaveScore(const uint32_t playerId, const uint32_t gameId, const Score& score) { +void MySQLDatabase::SaveScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) { ExecuteInsert("INSERT leaderboard SET primaryScore = ?, secondaryScore = ?, tertiaryScore = ?, character_id = ?, game_id = ?;", score.primaryScore, score.secondaryScore, score.tertiaryScore, playerId, gameId); } -void MySQLDatabase::UpdateScore(const uint32_t playerId, const uint32_t gameId, const Score& score) { +void MySQLDatabase::UpdateScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) { ExecuteInsert("UPDATE leaderboard SET primaryScore = ?, secondaryScore = ?, tertiaryScore = ?, timesPlayed = timesPlayed + 1 WHERE character_id = ? AND game_id = ?;", score.primaryScore, score.secondaryScore, score.tertiaryScore, playerId, gameId); } -void MySQLDatabase::IncrementTimesPlayed(const uint32_t playerId, const uint32_t gameId) { +void MySQLDatabase::IncrementTimesPlayed(const LWOOBJID playerId, const uint32_t gameId) { ExecuteUpdate("UPDATE leaderboard SET timesPlayed = timesPlayed + 1 WHERE character_id = ? AND game_id = ?;", playerId, gameId); } -std::optional MySQLDatabase::GetPlayerScore(const uint32_t playerId, const uint32_t gameId) { +std::optional MySQLDatabase::GetPlayerScore(const LWOOBJID playerId, const uint32_t gameId) { std::optional toReturn = std::nullopt; auto res = ExecuteSelect("SELECT * FROM leaderboard WHERE character_id = ? AND game_id = ?;", playerId, gameId); if (res->next()) { @@ -86,6 +86,6 @@ std::optional MySQLDatabase::GetPlayerScore(const uint32_t return toReturn; } -void MySQLDatabase::IncrementNumWins(const uint32_t playerId, const uint32_t gameId) { +void MySQLDatabase::IncrementNumWins(const LWOOBJID playerId, const uint32_t gameId) { ExecuteUpdate("UPDATE leaderboard SET numWins = numWins + 1 WHERE character_id = ? AND game_id = ?;", playerId, gameId); } diff --git a/dDatabase/GameDatabase/MySQL/Tables/Mail.cpp b/dDatabase/GameDatabase/MySQL/Tables/Mail.cpp index 74acb54f..27d76899 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/Mail.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/Mail.cpp @@ -19,7 +19,7 @@ void MySQLDatabase::InsertNewMail(const MailInfo& mail) { mail.itemCount); } -std::vector MySQLDatabase::GetMailForPlayer(const uint32_t characterId, const uint32_t numberOfMail) { +std::vector MySQLDatabase::GetMailForPlayer(const LWOOBJID characterId, const uint32_t numberOfMail) { auto res = ExecuteSelect( "SELECT id, subject, body, sender_name, attachment_id, attachment_lot, attachment_subkey, attachment_count, was_read, time_sent" " FROM mail WHERE receiver_id=? limit ?;", @@ -61,7 +61,7 @@ std::optional MySQLDatabase::GetMail(const uint64_t mailId) { return toReturn; } -uint32_t MySQLDatabase::GetUnreadMailCount(const uint32_t characterId) { +uint32_t MySQLDatabase::GetUnreadMailCount(const LWOOBJID characterId) { auto res = ExecuteSelect("SELECT COUNT(*) AS number_unread FROM mail WHERE receiver_id=? AND was_read=0;", characterId); if (!res->next()) { diff --git a/dDatabase/GameDatabase/MySQL/Tables/Property.cpp b/dDatabase/GameDatabase/MySQL/Tables/Property.cpp index fcb35751..662070df 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/Property.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/Property.cpp @@ -119,7 +119,7 @@ std::optional MySQLDatabase::GetProperties(co if (!result) result = IProperty::PropertyEntranceResult(); auto& entry = result->entries.emplace_back(); entry.id = properties->getUInt64("id"); - entry.ownerId = properties->getUInt64("owner_id"); + entry.ownerId = properties->getInt64("owner_id"); entry.cloneId = properties->getUInt64("clone_id"); entry.name = properties->getString("name").c_str(); entry.description = properties->getString("description").c_str(); @@ -146,7 +146,7 @@ std::optional MySQLDatabase::GetPropertyInfo(const LWOMAPID map IProperty::Info toReturn; toReturn.id = propertyEntry->getUInt64("id"); - toReturn.ownerId = propertyEntry->getUInt64("owner_id"); + toReturn.ownerId = propertyEntry->getInt64("owner_id"); toReturn.cloneId = propertyEntry->getUInt64("clone_id"); toReturn.name = propertyEntry->getString("name").c_str(); toReturn.description = propertyEntry->getString("description").c_str(); diff --git a/dDatabase/GameDatabase/MySQL/Tables/Ugc.cpp b/dDatabase/GameDatabase/MySQL/Tables/Ugc.cpp index 2d2655f4..a7570adb 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/Ugc.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/Ugc.cpp @@ -48,7 +48,7 @@ void MySQLDatabase::InsertNewUgcModel( std:: stringstream& sd0Data, // cant be const sad const uint32_t blueprintId, const uint32_t accountId, - const uint32_t characterId) { + const LWOOBJID characterId) { const std::istream stream(sd0Data.rdbuf()); ExecuteInsert( "INSERT INTO `ugc`(`id`, `account_id`, `character_id`, `is_optimized`, `lxfml`, `bake_ao`, `filename`) VALUES (?,?,?,?,?,?,?)", diff --git a/dDatabase/GameDatabase/MySQL/Tables/UgcModularBuild.cpp b/dDatabase/GameDatabase/MySQL/Tables/UgcModularBuild.cpp index a9573515..6336a32f 100644 --- a/dDatabase/GameDatabase/MySQL/Tables/UgcModularBuild.cpp +++ b/dDatabase/GameDatabase/MySQL/Tables/UgcModularBuild.cpp @@ -1,6 +1,6 @@ #include "MySQLDatabase.h" -void MySQLDatabase::InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) { +void MySQLDatabase::InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) { ExecuteInsert("INSERT INTO ugc_modular_build (ugc_id, ldf_config, character_id) VALUES (?,?,?)", bigId, modules, characterId); } diff --git a/dDatabase/GameDatabase/SQLite/SQLiteDatabase.cpp b/dDatabase/GameDatabase/SQLite/SQLiteDatabase.cpp index 0f2b97a2..00726be5 100644 --- a/dDatabase/GameDatabase/SQLite/SQLiteDatabase.cpp +++ b/dDatabase/GameDatabase/SQLite/SQLiteDatabase.cpp @@ -67,7 +67,7 @@ void SQLiteDatabase::SetAutoCommit(bool value) { } } -void SQLiteDatabase::DeleteCharacter(const uint32_t characterId) { +void SQLiteDatabase::DeleteCharacter(const LWOOBJID characterId) { ExecuteDelete("DELETE FROM charxml WHERE id=?;", characterId); ExecuteDelete("DELETE FROM command_log WHERE character_id=?;", characterId); ExecuteDelete("DELETE FROM friends WHERE player_id=? OR friend_id=?;", characterId, characterId); diff --git a/dDatabase/GameDatabase/SQLite/SQLiteDatabase.h b/dDatabase/GameDatabase/SQLite/SQLiteDatabase.h index 4112f87d..f46b7bc2 100644 --- a/dDatabase/GameDatabase/SQLite/SQLiteDatabase.h +++ b/dDatabase/GameDatabase/SQLite/SQLiteDatabase.h @@ -38,31 +38,31 @@ public: std::vector GetApprovedCharacterNames() override; - std::vector GetFriendsList(uint32_t charID) override; + std::vector GetFriendsList(LWOOBJID charID) override; - std::optional GetBestFriendStatus(const uint32_t playerCharacterId, const uint32_t friendCharacterId) override; - void SetBestFriendStatus(const uint32_t playerAccountId, const uint32_t friendAccountId, const uint32_t bestFriendStatus) override; - void AddFriend(const uint32_t playerAccountId, const uint32_t friendAccountId) override; - void RemoveFriend(const uint32_t playerAccountId, const uint32_t friendAccountId) override; - void UpdateActivityLog(const uint32_t characterId, const eActivityType activityType, const LWOMAPID mapId) override; + std::optional GetBestFriendStatus(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) override; + void SetBestFriendStatus(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId, const uint32_t bestFriendStatus) override; + void AddFriend(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId) override; + void RemoveFriend(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId) override; + void UpdateActivityLog(const LWOOBJID characterId, const eActivityType activityType, const LWOMAPID mapId) override; void DeleteUgcModelData(const LWOOBJID& modelId) override; void UpdateUgcModelData(const LWOOBJID& modelId, std::stringstream& lxfml) override; std::vector GetAllUgcModels() override; void CreateMigrationHistoryTable() override; bool IsMigrationRun(const std::string_view str) override; void InsertMigration(const std::string_view str) override; - std::optional GetCharacterInfo(const uint32_t charId) override; + std::optional GetCharacterInfo(const LWOOBJID charId) override; std::optional GetCharacterInfo(const std::string_view charId) override; - std::string GetCharacterXml(const uint32_t accountId) override; - void UpdateCharacterXml(const uint32_t characterId, const std::string_view lxfml) override; + std::string GetCharacterXml(const LWOOBJID accountId) override; + void UpdateCharacterXml(const LWOOBJID characterId, const std::string_view lxfml) override; std::optional GetAccountInfo(const std::string_view username) override; void InsertNewCharacter(const ICharInfo::Info info) override; - void InsertCharacterXml(const uint32_t accountId, const std::string_view lxfml) override; - std::vector GetAccountCharacterIds(uint32_t accountId) override; - void DeleteCharacter(const uint32_t characterId) override; - void SetCharacterName(const uint32_t characterId, const std::string_view name) override; - void SetPendingCharacterName(const uint32_t characterId, const std::string_view name) override; - void UpdateLastLoggedInCharacter(const uint32_t characterId) override; + void InsertCharacterXml(const LWOOBJID accountId, const std::string_view lxfml) override; + std::vector GetAccountCharacterIds(LWOOBJID accountId) override; + void DeleteCharacter(const LWOOBJID characterId) override; + void SetCharacterName(const LWOOBJID characterId, const std::string_view name) override; + void SetPendingCharacterName(const LWOOBJID characterId, const std::string_view name) override; + void UpdateLastLoggedInCharacter(const LWOOBJID characterId) override; void SetPetNameModerationStatus(const LWOOBJID& petId, const IPetNames::Info& info) override; std::optional GetPetNameInfo(const LWOOBJID& petId) override; std::optional GetPropertyInfo(const LWOMAPID mapId, const LWOCLONEID cloneId) override; @@ -83,14 +83,14 @@ public: std::stringstream& sd0Data, const uint32_t blueprintId, const uint32_t accountId, - const uint32_t characterId) override; - std::vector GetMailForPlayer(const uint32_t characterId, const uint32_t numberOfMail) override; + const LWOOBJID characterId) override; + std::vector GetMailForPlayer(const LWOOBJID characterId, const uint32_t numberOfMail) override; std::optional GetMail(const uint64_t mailId) override; - uint32_t GetUnreadMailCount(const uint32_t characterId) override; + uint32_t GetUnreadMailCount(const LWOOBJID characterId) override; void MarkMailRead(const uint64_t mailId) override; void DeleteMail(const uint64_t mailId) override; void ClaimMailItem(const uint64_t mailId) override; - void InsertSlashCommandUsage(const uint32_t characterId, const std::string_view command) override; + void InsertSlashCommandUsage(const LWOOBJID characterId, const std::string_view command) override; void UpdateAccountUnmuteTime(const uint32_t accountId, const uint64_t timeToUnmute) override; void UpdateAccountBan(const uint32_t accountId, const bool banned) override; void UpdateAccountPassword(const uint32_t accountId, const std::string_view bcryptpassword) override; @@ -102,9 +102,9 @@ public: std::optional GetDonationTotal(const uint32_t activityId) override; std::optional IsPlaykeyActive(const int32_t playkeyId) override; std::vector GetUgcModels(const LWOOBJID& propertyId) override; - void AddIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) override; - void RemoveIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) override; - std::vector GetIgnoreList(const uint32_t playerId) override; + void AddIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) override; + void RemoveIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) override; + std::vector GetIgnoreList(const LWOOBJID playerId) override; void InsertRewardCode(const uint32_t account_id, const uint32_t reward_code) override; std::vector GetRewardCodesByAccountID(const uint32_t account_id) override; void AddBehavior(const IBehaviors::Info& info) override; @@ -116,12 +116,12 @@ public: std::vector GetAscendingLeaderboard(const uint32_t activityId) override; std::vector GetNsLeaderboard(const uint32_t activityId) override; std::vector GetAgsLeaderboard(const uint32_t activityId) override; - void SaveScore(const uint32_t playerId, const uint32_t gameId, const Score& score) override; - void UpdateScore(const uint32_t playerId, const uint32_t gameId, const Score& score) override; - std::optional GetPlayerScore(const uint32_t playerId, const uint32_t gameId) override; - void IncrementNumWins(const uint32_t playerId, const uint32_t gameId) override; - void IncrementTimesPlayed(const uint32_t playerId, const uint32_t gameId) override; - void InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) override; + void SaveScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) override; + void UpdateScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) override; + std::optional GetPlayerScore(const LWOOBJID playerId, const uint32_t gameId) override; + void IncrementNumWins(const LWOOBJID playerId, const uint32_t gameId) override; + void IncrementTimesPlayed(const LWOOBJID playerId, const uint32_t gameId) override; + void InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) override; void DeleteUgcBuild(const LWOOBJID bigId) override; uint32_t GetAccountCount() override; bool IsNameInUse(const std::string_view name) override; @@ -270,4 +270,15 @@ inline void SetParam(PreppedStmtRef stmt, const int index, const std::optional +inline void SetParam(PreppedStmtRef stmt, const int index, const std::optional param) { + if (param) { + LOG("%d", param.value()); + stmt.bind(index, static_cast(param.value())); + } else { + LOG("Null"); + stmt.bindNull(index); + } +} + #endif //!SQLITEDATABASE_H diff --git a/dDatabase/GameDatabase/SQLite/Tables/ActivityLog.cpp b/dDatabase/GameDatabase/SQLite/Tables/ActivityLog.cpp index 33f81429..e5953925 100644 --- a/dDatabase/GameDatabase/SQLite/Tables/ActivityLog.cpp +++ b/dDatabase/GameDatabase/SQLite/Tables/ActivityLog.cpp @@ -1,6 +1,6 @@ #include "SQLiteDatabase.h" -void SQLiteDatabase::UpdateActivityLog(const uint32_t characterId, const eActivityType activityType, const LWOMAPID mapId) { +void SQLiteDatabase::UpdateActivityLog(const LWOOBJID characterId, const eActivityType activityType, const LWOMAPID mapId) { ExecuteInsert("INSERT INTO activity_log (character_id, activity, time, map_id) VALUES (?, ?, ?, ?);", characterId, static_cast(activityType), static_cast(time(NULL)), mapId); } diff --git a/dDatabase/GameDatabase/SQLite/Tables/CharInfo.cpp b/dDatabase/GameDatabase/SQLite/Tables/CharInfo.cpp index efe5e1ab..6b3dab3b 100644 --- a/dDatabase/GameDatabase/SQLite/Tables/CharInfo.cpp +++ b/dDatabase/GameDatabase/SQLite/Tables/CharInfo.cpp @@ -20,7 +20,7 @@ std::optional CharInfoFromQueryResult(CppSQLite3Query stmt) { ICharInfo::Info toReturn; - toReturn.id = stmt.getIntField("id"); + toReturn.id = stmt.getInt64Field("id"); toReturn.name = stmt.getStringField("name"); toReturn.pendingName = stmt.getStringField("pending_name"); toReturn.needsRename = stmt.getIntField("needs_rename"); @@ -31,7 +31,7 @@ std::optional CharInfoFromQueryResult(CppSQLite3Query stmt) { return toReturn; } -std::optional SQLiteDatabase::GetCharacterInfo(const uint32_t charId) { +std::optional SQLiteDatabase::GetCharacterInfo(const LWOOBJID charId) { return CharInfoFromQueryResult( ExecuteSelect("SELECT name, pending_name, needs_rename, prop_clone_id, permission_map, id, account_id FROM charinfo WHERE id = ? LIMIT 1;", charId).second ); @@ -43,12 +43,12 @@ std::optional SQLiteDatabase::GetCharacterInfo(const std::strin ); } -std::vector SQLiteDatabase::GetAccountCharacterIds(const uint32_t accountId) { +std::vector SQLiteDatabase::GetAccountCharacterIds(const LWOOBJID accountId) { auto [_, result] = ExecuteSelect("SELECT id FROM charinfo WHERE account_id = ? ORDER BY last_login DESC LIMIT 4;", accountId); - std::vector toReturn; + std::vector toReturn; while (!result.eof()) { - toReturn.push_back(result.getIntField("id")); + toReturn.push_back(result.getInt64Field("id")); result.nextRow(); } @@ -66,15 +66,15 @@ void SQLiteDatabase::InsertNewCharacter(const ICharInfo::Info info) { static_cast(time(NULL))); } -void SQLiteDatabase::SetCharacterName(const uint32_t characterId, const std::string_view name) { +void SQLiteDatabase::SetCharacterName(const LWOOBJID characterId, const std::string_view name) { ExecuteUpdate("UPDATE charinfo SET name = ?, pending_name = '', needs_rename = 0, last_login = ? WHERE id = ?;", name, static_cast(time(NULL)), characterId); } -void SQLiteDatabase::SetPendingCharacterName(const uint32_t characterId, const std::string_view name) { +void SQLiteDatabase::SetPendingCharacterName(const LWOOBJID characterId, const std::string_view name) { ExecuteUpdate("UPDATE charinfo SET pending_name = ?, needs_rename = 0, last_login = ? WHERE id = ?;", name, static_cast(time(NULL)), characterId); } -void SQLiteDatabase::UpdateLastLoggedInCharacter(const uint32_t characterId) { +void SQLiteDatabase::UpdateLastLoggedInCharacter(const LWOOBJID characterId) { ExecuteUpdate("UPDATE charinfo SET last_login = ? WHERE id = ?;", static_cast(time(NULL)), characterId); } diff --git a/dDatabase/GameDatabase/SQLite/Tables/CharXml.cpp b/dDatabase/GameDatabase/SQLite/Tables/CharXml.cpp index 56085101..2fcbdc84 100644 --- a/dDatabase/GameDatabase/SQLite/Tables/CharXml.cpp +++ b/dDatabase/GameDatabase/SQLite/Tables/CharXml.cpp @@ -1,6 +1,6 @@ #include "SQLiteDatabase.h" -std::string SQLiteDatabase::GetCharacterXml(const uint32_t charId) { +std::string SQLiteDatabase::GetCharacterXml(const LWOOBJID charId) { auto [_, result] = ExecuteSelect("SELECT xml_data FROM charxml WHERE id = ? LIMIT 1;", charId); if (result.eof()) { @@ -10,10 +10,10 @@ std::string SQLiteDatabase::GetCharacterXml(const uint32_t charId) { return result.getStringField("xml_data"); } -void SQLiteDatabase::UpdateCharacterXml(const uint32_t charId, const std::string_view lxfml) { +void SQLiteDatabase::UpdateCharacterXml(const LWOOBJID charId, const std::string_view lxfml) { ExecuteUpdate("UPDATE charxml SET xml_data = ? WHERE id = ?;", lxfml, charId); } -void SQLiteDatabase::InsertCharacterXml(const uint32_t characterId, const std::string_view lxfml) { +void SQLiteDatabase::InsertCharacterXml(const LWOOBJID characterId, const std::string_view lxfml) { ExecuteInsert("INSERT INTO `charxml` (`id`, `xml_data`) VALUES (?,?)", characterId, lxfml); } diff --git a/dDatabase/GameDatabase/SQLite/Tables/CommandLog.cpp b/dDatabase/GameDatabase/SQLite/Tables/CommandLog.cpp index db39046f..e644e55b 100644 --- a/dDatabase/GameDatabase/SQLite/Tables/CommandLog.cpp +++ b/dDatabase/GameDatabase/SQLite/Tables/CommandLog.cpp @@ -1,5 +1,5 @@ #include "SQLiteDatabase.h" -void SQLiteDatabase::InsertSlashCommandUsage(const uint32_t characterId, const std::string_view command) { +void SQLiteDatabase::InsertSlashCommandUsage(const LWOOBJID characterId, const std::string_view command) { ExecuteInsert("INSERT INTO command_log (character_id, command) VALUES (?, ?);", characterId, command); } diff --git a/dDatabase/GameDatabase/SQLite/Tables/Friends.cpp b/dDatabase/GameDatabase/SQLite/Tables/Friends.cpp index 7ac41459..f3d11ace 100644 --- a/dDatabase/GameDatabase/SQLite/Tables/Friends.cpp +++ b/dDatabase/GameDatabase/SQLite/Tables/Friends.cpp @@ -1,6 +1,6 @@ #include "SQLiteDatabase.h" -std::vector SQLiteDatabase::GetFriendsList(const uint32_t charId) { +std::vector SQLiteDatabase::GetFriendsList(const LWOOBJID charId) { auto [_, friendsList] = ExecuteSelect( R"QUERY( SELECT fr.requested_player AS player, best_friend AS bff, ci.name AS name FROM @@ -18,7 +18,7 @@ std::vector SQLiteDatabase::GetFriendsList(const uint32_t charId) { while (!friendsList.eof()) { FriendData fd; - fd.friendID = friendsList.getIntField("player"); + fd.friendID = friendsList.getInt64Field("player"); fd.isBestFriend = friendsList.getIntField("bff") == 3; // 0 = friends, 1 = left_requested, 2 = right_requested, 3 = both_accepted - are now bffs fd.friendName = friendsList.getStringField("name"); @@ -29,7 +29,7 @@ std::vector SQLiteDatabase::GetFriendsList(const uint32_t charId) { return toReturn; } -std::optional SQLiteDatabase::GetBestFriendStatus(const uint32_t playerCharacterId, const uint32_t friendCharacterId) { +std::optional SQLiteDatabase::GetBestFriendStatus(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) { auto [_, result] = ExecuteSelect("SELECT * FROM friends WHERE (player_id = ? AND friend_id = ?) OR (player_id = ? AND friend_id = ?) LIMIT 1;", playerCharacterId, friendCharacterId, @@ -42,14 +42,14 @@ std::optional SQLiteDatabase::GetBestFriendStatus(co } IFriends::BestFriendStatus toReturn; - toReturn.playerCharacterId = result.getIntField("player_id"); - toReturn.friendCharacterId = result.getIntField("friend_id"); + toReturn.playerCharacterId = result.getInt64Field("player_id"); + toReturn.friendCharacterId = result.getInt64Field("friend_id"); toReturn.bestFriendStatus = result.getIntField("best_friend"); return toReturn; } -void SQLiteDatabase::SetBestFriendStatus(const uint32_t playerCharacterId, const uint32_t friendCharacterId, const uint32_t bestFriendStatus) { +void SQLiteDatabase::SetBestFriendStatus(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId, const uint32_t bestFriendStatus) { ExecuteUpdate("UPDATE friends SET best_friend = ? WHERE (player_id = ? AND friend_id = ?) OR (player_id = ? AND friend_id = ?);", bestFriendStatus, playerCharacterId, @@ -59,11 +59,11 @@ void SQLiteDatabase::SetBestFriendStatus(const uint32_t playerCharacterId, const ); } -void SQLiteDatabase::AddFriend(const uint32_t playerCharacterId, const uint32_t friendCharacterId) { +void SQLiteDatabase::AddFriend(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) { ExecuteInsert("INSERT OR IGNORE INTO friends (player_id, friend_id, best_friend) VALUES (?, ?, 0);", playerCharacterId, friendCharacterId); } -void SQLiteDatabase::RemoveFriend(const uint32_t playerCharacterId, const uint32_t friendCharacterId) { +void SQLiteDatabase::RemoveFriend(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) { ExecuteDelete("DELETE FROM friends WHERE (player_id = ? AND friend_id = ?) OR (player_id = ? AND friend_id = ?);", playerCharacterId, friendCharacterId, diff --git a/dDatabase/GameDatabase/SQLite/Tables/IgnoreList.cpp b/dDatabase/GameDatabase/SQLite/Tables/IgnoreList.cpp index e7f5a3e0..e7fd7a14 100644 --- a/dDatabase/GameDatabase/SQLite/Tables/IgnoreList.cpp +++ b/dDatabase/GameDatabase/SQLite/Tables/IgnoreList.cpp @@ -1,22 +1,22 @@ #include "SQLiteDatabase.h" -std::vector SQLiteDatabase::GetIgnoreList(const uint32_t playerId) { +std::vector SQLiteDatabase::GetIgnoreList(const LWOOBJID playerId) { auto [_, result] = ExecuteSelect("SELECT ci.name AS name, il.ignored_player_id AS ignore_id FROM ignore_list AS il JOIN charinfo AS ci ON il.ignored_player_id = ci.id WHERE il.player_id = ?", playerId); std::vector ignoreList; while (!result.eof()) { - ignoreList.push_back(IIgnoreList::Info{ result.getStringField("name"), static_cast(result.getIntField("ignore_id")) }); + ignoreList.push_back(IIgnoreList::Info{ result.getStringField("name"), result.getInt64Field("ignore_id") }); result.nextRow(); } return ignoreList; } -void SQLiteDatabase::AddIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) { +void SQLiteDatabase::AddIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) { ExecuteInsert("INSERT OR IGNORE INTO ignore_list (player_id, ignored_player_id) VALUES (?, ?)", playerId, ignoredPlayerId); } -void SQLiteDatabase::RemoveIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) { +void SQLiteDatabase::RemoveIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) { ExecuteDelete("DELETE FROM ignore_list WHERE player_id = ? AND ignored_player_id = ?", playerId, ignoredPlayerId); } diff --git a/dDatabase/GameDatabase/SQLite/Tables/Leaderboard.cpp b/dDatabase/GameDatabase/SQLite/Tables/Leaderboard.cpp index ee0423dd..a03e62a3 100644 --- a/dDatabase/GameDatabase/SQLite/Tables/Leaderboard.cpp +++ b/dDatabase/GameDatabase/SQLite/Tables/Leaderboard.cpp @@ -20,7 +20,7 @@ std::vector ProcessQuery(CppSQLite3Query& rows) { while (!rows.eof()) { auto& entry = entries.emplace_back(); - entry.charId = rows.getIntField("character_id"); + entry.charId = rows.getInt64Field("character_id"); entry.lastPlayedTimestamp = rows.getIntField("lp_unix"); entry.primaryScore = rows.getFloatField("primaryScore"); entry.secondaryScore = rows.getFloatField("secondaryScore"); @@ -58,17 +58,17 @@ std::vector SQLiteDatabase::GetNsLeaderboard(const uint32_t return ProcessQuery(result); } -void SQLiteDatabase::SaveScore(const uint32_t playerId, const uint32_t gameId, const Score& score) { +void SQLiteDatabase::SaveScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) { ExecuteInsert("INSERT INTO leaderboard (primaryScore, secondaryScore, tertiaryScore, character_id, game_id, last_played) VALUES (?,?,?,?,?,CURRENT_TIMESTAMP) ;", score.primaryScore, score.secondaryScore, score.tertiaryScore, playerId, gameId); } -void SQLiteDatabase::UpdateScore(const uint32_t playerId, const uint32_t gameId, const Score& score) { +void SQLiteDatabase::UpdateScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) { ExecuteInsert("UPDATE leaderboard SET primaryScore = ?, secondaryScore = ?, tertiaryScore = ?, timesPlayed = timesPlayed + 1, last_played = CURRENT_TIMESTAMP WHERE character_id = ? AND game_id = ?;", score.primaryScore, score.secondaryScore, score.tertiaryScore, playerId, gameId); } -std::optional SQLiteDatabase::GetPlayerScore(const uint32_t playerId, const uint32_t gameId) { +std::optional SQLiteDatabase::GetPlayerScore(const LWOOBJID playerId, const uint32_t gameId) { std::optional toReturn = std::nullopt; auto [_, res] = ExecuteSelect("SELECT * FROM leaderboard WHERE character_id = ? AND game_id = ?;", playerId, gameId); if (!res.eof()) { @@ -82,10 +82,10 @@ std::optional SQLiteDatabase::GetPlayerScore(const uint32_t return toReturn; } -void SQLiteDatabase::IncrementNumWins(const uint32_t playerId, const uint32_t gameId) { +void SQLiteDatabase::IncrementNumWins(const LWOOBJID playerId, const uint32_t gameId) { ExecuteUpdate("UPDATE leaderboard SET numWins = numWins + 1, last_played = CURRENT_TIMESTAMP WHERE character_id = ? AND game_id = ?;", playerId, gameId); } -void SQLiteDatabase::IncrementTimesPlayed(const uint32_t playerId, const uint32_t gameId) { +void SQLiteDatabase::IncrementTimesPlayed(const LWOOBJID playerId, const uint32_t gameId) { ExecuteUpdate("UPDATE leaderboard SET timesPlayed = timesPlayed + 1, last_played = CURRENT_TIMESTAMP WHERE character_id = ? AND game_id = ?;", playerId, gameId); } diff --git a/dDatabase/GameDatabase/SQLite/Tables/Mail.cpp b/dDatabase/GameDatabase/SQLite/Tables/Mail.cpp index edd4b672..7b0a4860 100644 --- a/dDatabase/GameDatabase/SQLite/Tables/Mail.cpp +++ b/dDatabase/GameDatabase/SQLite/Tables/Mail.cpp @@ -18,7 +18,7 @@ void SQLiteDatabase::InsertNewMail(const MailInfo& mail) { mail.itemCount); } -std::vector SQLiteDatabase::GetMailForPlayer(const uint32_t characterId, const uint32_t numberOfMail) { +std::vector SQLiteDatabase::GetMailForPlayer(const LWOOBJID characterId, const uint32_t numberOfMail) { auto [_, res] = ExecuteSelect( "SELECT id, subject, body, sender_name, attachment_id, attachment_lot, attachment_subkey, attachment_count, was_read, time_sent" " FROM mail WHERE receiver_id=? limit ?;", @@ -60,7 +60,7 @@ std::optional SQLiteDatabase::GetMail(const uint64_t mailId) { return toReturn; } -uint32_t SQLiteDatabase::GetUnreadMailCount(const uint32_t characterId) { +uint32_t SQLiteDatabase::GetUnreadMailCount(const LWOOBJID characterId) { auto [_, res] = ExecuteSelect("SELECT COUNT(*) AS number_unread FROM mail WHERE receiver_id=? AND was_read=0;", characterId); if (res.eof()) { diff --git a/dDatabase/GameDatabase/SQLite/Tables/Ugc.cpp b/dDatabase/GameDatabase/SQLite/Tables/Ugc.cpp index c6410a42..df0b3d43 100644 --- a/dDatabase/GameDatabase/SQLite/Tables/Ugc.cpp +++ b/dDatabase/GameDatabase/SQLite/Tables/Ugc.cpp @@ -49,7 +49,7 @@ void SQLiteDatabase::InsertNewUgcModel( std::stringstream& sd0Data, // cant be const sad const uint32_t blueprintId, const uint32_t accountId, - const uint32_t characterId) { + const LWOOBJID characterId) { const std::istream stream(sd0Data.rdbuf()); ExecuteInsert( "INSERT INTO `ugc`(`id`, `account_id`, `character_id`, `is_optimized`, `lxfml`, `bake_ao`, `filename`) VALUES (?,?,?,?,?,?,?)", diff --git a/dDatabase/GameDatabase/SQLite/Tables/UgcModularBuild.cpp b/dDatabase/GameDatabase/SQLite/Tables/UgcModularBuild.cpp index 4e806384..f501d0e0 100644 --- a/dDatabase/GameDatabase/SQLite/Tables/UgcModularBuild.cpp +++ b/dDatabase/GameDatabase/SQLite/Tables/UgcModularBuild.cpp @@ -1,6 +1,6 @@ #include "SQLiteDatabase.h" -void SQLiteDatabase::InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) { +void SQLiteDatabase::InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) { ExecuteInsert("INSERT INTO ugc_modular_build (ugc_id, ldf_config, character_id) VALUES (?,?,?)", bigId, modules, characterId); } diff --git a/dDatabase/GameDatabase/TestSQL/TestSQLDatabase.cpp b/dDatabase/GameDatabase/TestSQL/TestSQLDatabase.cpp index 8dd03f27..9381c07b 100644 --- a/dDatabase/GameDatabase/TestSQL/TestSQLDatabase.cpp +++ b/dDatabase/GameDatabase/TestSQL/TestSQLDatabase.cpp @@ -32,27 +32,27 @@ std::vector TestSQLDatabase::GetApprovedCharacterNames() { return {}; } -std::vector TestSQLDatabase::GetFriendsList(uint32_t charID) { +std::vector TestSQLDatabase::GetFriendsList(LWOOBJID charID) { return {}; } -std::optional TestSQLDatabase::GetBestFriendStatus(const uint32_t playerCharacterId, const uint32_t friendCharacterId) { +std::optional TestSQLDatabase::GetBestFriendStatus(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) { return {}; } -void TestSQLDatabase::SetBestFriendStatus(const uint32_t playerAccountId, const uint32_t friendAccountId, const uint32_t bestFriendStatus) { +void TestSQLDatabase::SetBestFriendStatus(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId, const uint32_t bestFriendStatus) { } -void TestSQLDatabase::AddFriend(const uint32_t playerAccountId, const uint32_t friendAccountId) { +void TestSQLDatabase::AddFriend(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId) { } -void TestSQLDatabase::RemoveFriend(const uint32_t playerAccountId, const uint32_t friendAccountId) { +void TestSQLDatabase::RemoveFriend(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId) { } -void TestSQLDatabase::UpdateActivityLog(const uint32_t characterId, const eActivityType activityType, const LWOMAPID mapId) { +void TestSQLDatabase::UpdateActivityLog(const LWOOBJID characterId, const eActivityType activityType, const LWOMAPID mapId) { } @@ -80,7 +80,7 @@ void TestSQLDatabase::InsertMigration(const std::string_view str) { } -std::optional TestSQLDatabase::GetCharacterInfo(const uint32_t charId) { +std::optional TestSQLDatabase::GetCharacterInfo(const LWOOBJID charId) { return {}; } @@ -88,11 +88,11 @@ std::optional TestSQLDatabase::GetCharacterInfo(const std::stri return {}; } -std::string TestSQLDatabase::GetCharacterXml(const uint32_t accountId) { +std::string TestSQLDatabase::GetCharacterXml(const LWOOBJID accountId) { return {}; } -void TestSQLDatabase::UpdateCharacterXml(const uint32_t characterId, const std::string_view lxfml) { +void TestSQLDatabase::UpdateCharacterXml(const LWOOBJID characterId, const std::string_view lxfml) { } @@ -104,27 +104,27 @@ void TestSQLDatabase::InsertNewCharacter(const ICharInfo::Info info) { } -void TestSQLDatabase::InsertCharacterXml(const uint32_t accountId, const std::string_view lxfml) { +void TestSQLDatabase::InsertCharacterXml(const LWOOBJID accountId, const std::string_view lxfml) { } -std::vector TestSQLDatabase::GetAccountCharacterIds(uint32_t accountId) { +std::vector TestSQLDatabase::GetAccountCharacterIds(LWOOBJID accountId) { return {}; } -void TestSQLDatabase::DeleteCharacter(const uint32_t characterId) { +void TestSQLDatabase::DeleteCharacter(const LWOOBJID characterId) { } -void TestSQLDatabase::SetCharacterName(const uint32_t characterId, const std::string_view name) { +void TestSQLDatabase::SetCharacterName(const LWOOBJID characterId, const std::string_view name) { } -void TestSQLDatabase::SetPendingCharacterName(const uint32_t characterId, const std::string_view name) { +void TestSQLDatabase::SetPendingCharacterName(const LWOOBJID characterId, const std::string_view name) { } -void TestSQLDatabase::UpdateLastLoggedInCharacter(const uint32_t characterId) { +void TestSQLDatabase::UpdateLastLoggedInCharacter(const LWOOBJID characterId) { } @@ -192,11 +192,11 @@ void TestSQLDatabase::InsertNewMail(const MailInfo& mail) { } -void TestSQLDatabase::InsertNewUgcModel(std::stringstream& sd0Data, const uint32_t blueprintId, const uint32_t accountId, const uint32_t characterId) { +void TestSQLDatabase::InsertNewUgcModel(std::stringstream& sd0Data, const uint32_t blueprintId, const uint32_t accountId, const LWOOBJID characterId) { } -std::vector TestSQLDatabase::GetMailForPlayer(const uint32_t characterId, const uint32_t numberOfMail) { +std::vector TestSQLDatabase::GetMailForPlayer(const LWOOBJID characterId, const uint32_t numberOfMail) { return {}; } @@ -204,7 +204,7 @@ std::optional TestSQLDatabase::GetMail(const uint64_t mailId) { return {}; } -uint32_t TestSQLDatabase::GetUnreadMailCount(const uint32_t characterId) { +uint32_t TestSQLDatabase::GetUnreadMailCount(const LWOOBJID characterId) { return {}; } @@ -220,7 +220,7 @@ void TestSQLDatabase::ClaimMailItem(const uint64_t mailId) { } -void TestSQLDatabase::InsertSlashCommandUsage(const uint32_t characterId, const std::string_view command) { +void TestSQLDatabase::InsertSlashCommandUsage(const LWOOBJID characterId, const std::string_view command) { } @@ -268,15 +268,15 @@ std::vector TestSQLDatabase::GetUgcModels(const LWOOBJID& propertyI return {}; } -void TestSQLDatabase::AddIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) { +void TestSQLDatabase::AddIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) { } -void TestSQLDatabase::RemoveIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) { +void TestSQLDatabase::RemoveIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) { } -std::vector TestSQLDatabase::GetIgnoreList(const uint32_t playerId) { +std::vector TestSQLDatabase::GetIgnoreList(const LWOOBJID playerId) { return {}; } diff --git a/dDatabase/GameDatabase/TestSQL/TestSQLDatabase.h b/dDatabase/GameDatabase/TestSQL/TestSQLDatabase.h index 59f7fe08..8d808e42 100644 --- a/dDatabase/GameDatabase/TestSQL/TestSQLDatabase.h +++ b/dDatabase/GameDatabase/TestSQL/TestSQLDatabase.h @@ -17,31 +17,31 @@ class TestSQLDatabase : public GameDatabase { std::vector GetApprovedCharacterNames() override; - std::vector GetFriendsList(uint32_t charID) override; + std::vector GetFriendsList(LWOOBJID charID) override; - std::optional GetBestFriendStatus(const uint32_t playerCharacterId, const uint32_t friendCharacterId) override; - void SetBestFriendStatus(const uint32_t playerAccountId, const uint32_t friendAccountId, const uint32_t bestFriendStatus) override; - void AddFriend(const uint32_t playerAccountId, const uint32_t friendAccountId) override; - void RemoveFriend(const uint32_t playerAccountId, const uint32_t friendAccountId) override; - void UpdateActivityLog(const uint32_t characterId, const eActivityType activityType, const LWOMAPID mapId) override; + std::optional GetBestFriendStatus(const LWOOBJID playerCharacterId, const LWOOBJID friendCharacterId) override; + void SetBestFriendStatus(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId, const uint32_t bestFriendStatus) override; + void AddFriend(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId) override; + void RemoveFriend(const LWOOBJID playerAccountId, const LWOOBJID friendAccountId) override; + void UpdateActivityLog(const LWOOBJID characterId, const eActivityType activityType, const LWOMAPID mapId) override; void DeleteUgcModelData(const LWOOBJID& modelId) override; void UpdateUgcModelData(const LWOOBJID& modelId, std::stringstream& lxfml) override; std::vector GetAllUgcModels() override; void CreateMigrationHistoryTable() override; bool IsMigrationRun(const std::string_view str) override; void InsertMigration(const std::string_view str) override; - std::optional GetCharacterInfo(const uint32_t charId) override; + std::optional GetCharacterInfo(const LWOOBJID charId) override; std::optional GetCharacterInfo(const std::string_view charId) override; - std::string GetCharacterXml(const uint32_t accountId) override; - void UpdateCharacterXml(const uint32_t characterId, const std::string_view lxfml) override; + std::string GetCharacterXml(const LWOOBJID accountId) override; + void UpdateCharacterXml(const LWOOBJID characterId, const std::string_view lxfml) override; std::optional GetAccountInfo(const std::string_view username) override; void InsertNewCharacter(const ICharInfo::Info info) override; - void InsertCharacterXml(const uint32_t accountId, const std::string_view lxfml) override; - std::vector GetAccountCharacterIds(uint32_t accountId) override; - void DeleteCharacter(const uint32_t characterId) override; - void SetCharacterName(const uint32_t characterId, const std::string_view name) override; - void SetPendingCharacterName(const uint32_t characterId, const std::string_view name) override; - void UpdateLastLoggedInCharacter(const uint32_t characterId) override; + void InsertCharacterXml(const LWOOBJID accountId, const std::string_view lxfml) override; + std::vector GetAccountCharacterIds(LWOOBJID accountId) override; + void DeleteCharacter(const LWOOBJID characterId) override; + void SetCharacterName(const LWOOBJID characterId, const std::string_view name) override; + void SetPendingCharacterName(const LWOOBJID characterId, const std::string_view name) override; + void UpdateLastLoggedInCharacter(const LWOOBJID characterId) override; void SetPetNameModerationStatus(const LWOOBJID& petId, const IPetNames::Info& info) override; std::optional GetPetNameInfo(const LWOOBJID& petId) override; std::optional GetPropertyInfo(const LWOMAPID mapId, const LWOCLONEID cloneId) override; @@ -62,14 +62,14 @@ class TestSQLDatabase : public GameDatabase { std::stringstream& sd0Data, const uint32_t blueprintId, const uint32_t accountId, - const uint32_t characterId) override; - std::vector GetMailForPlayer(const uint32_t characterId, const uint32_t numberOfMail) override; + const LWOOBJID characterId) override; + std::vector GetMailForPlayer(const LWOOBJID characterId, const uint32_t numberOfMail) override; std::optional GetMail(const uint64_t mailId) override; - uint32_t GetUnreadMailCount(const uint32_t characterId) override; + uint32_t GetUnreadMailCount(const LWOOBJID characterId) override; void MarkMailRead(const uint64_t mailId) override; void DeleteMail(const uint64_t mailId) override; void ClaimMailItem(const uint64_t mailId) override; - void InsertSlashCommandUsage(const uint32_t characterId, const std::string_view command) override; + void InsertSlashCommandUsage(const LWOOBJID characterId, const std::string_view command) override; void UpdateAccountUnmuteTime(const uint32_t accountId, const uint64_t timeToUnmute) override; void UpdateAccountBan(const uint32_t accountId, const bool banned) override; void UpdateAccountPassword(const uint32_t accountId, const std::string_view bcryptpassword) override; @@ -81,9 +81,9 @@ class TestSQLDatabase : public GameDatabase { std::optional GetDonationTotal(const uint32_t activityId) override; std::optional IsPlaykeyActive(const int32_t playkeyId) override; std::vector GetUgcModels(const LWOOBJID& propertyId) override; - void AddIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) override; - void RemoveIgnore(const uint32_t playerId, const uint32_t ignoredPlayerId) override; - std::vector GetIgnoreList(const uint32_t playerId) override; + void AddIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) override; + void RemoveIgnore(const LWOOBJID playerId, const LWOOBJID ignoredPlayerId) override; + std::vector GetIgnoreList(const LWOOBJID playerId) override; void InsertRewardCode(const uint32_t account_id, const uint32_t reward_code) override; std::vector GetRewardCodesByAccountID(const uint32_t account_id) override; void AddBehavior(const IBehaviors::Info& info) override; @@ -95,12 +95,12 @@ class TestSQLDatabase : public GameDatabase { std::vector GetAscendingLeaderboard(const uint32_t activityId) override { return {}; }; std::vector GetNsLeaderboard(const uint32_t activityId) override { return {}; }; std::vector GetAgsLeaderboard(const uint32_t activityId) override { return {}; }; - void SaveScore(const uint32_t playerId, const uint32_t gameId, const Score& score) override {}; - void UpdateScore(const uint32_t playerId, const uint32_t gameId, const Score& score) override {}; - std::optional GetPlayerScore(const uint32_t playerId, const uint32_t gameId) override { return {}; }; - void IncrementNumWins(const uint32_t playerId, const uint32_t gameId) override {}; - void IncrementTimesPlayed(const uint32_t playerId, const uint32_t gameId) override {}; - void InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) override {}; + void SaveScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) override {}; + void UpdateScore(const LWOOBJID playerId, const uint32_t gameId, const Score& score) override {}; + std::optional GetPlayerScore(const LWOOBJID playerId, const uint32_t gameId) override { return {}; }; + void IncrementNumWins(const LWOOBJID playerId, const uint32_t gameId) override {}; + void IncrementTimesPlayed(const LWOOBJID playerId, const uint32_t gameId) override {}; + void InsertUgcBuild(const std::string& modules, const LWOOBJID bigId, const std::optional characterId) override {}; void DeleteUgcBuild(const LWOOBJID bigId) override {}; uint32_t GetAccountCount() override { return 0; }; diff --git a/dGame/Character.cpp b/dGame/Character.cpp index 0af51a1c..250466a9 100644 --- a/dGame/Character.cpp +++ b/dGame/Character.cpp @@ -23,7 +23,7 @@ #include "ePlayerFlag.h" #include "CDPlayerFlagsTable.h" -Character::Character(uint32_t id, User* parentUser) { +Character::Character(LWOOBJID id, User* parentUser) { //First load the name, etc: m_ID = id; m_ParentUser = parentUser; @@ -50,6 +50,10 @@ void Character::UpdateInfoFromDatabase() { //Load the xmlData now: m_XMLData = Database::Get()->GetCharacterXml(m_ID); + if (m_XMLData.empty()) { + LOG("Character %s (%llu) has no xml data!", m_Name.c_str(), m_ID); + return; + } m_ZoneID = 0; //TEMP! Set back to 0 when done. This is so we can see loading screen progress for testing. m_ZoneInstanceID = 0; //These values don't really matter, these are only used on the char select screen and seem unused. @@ -61,7 +65,6 @@ void Character::UpdateInfoFromDatabase() { //Set our objectID: m_ObjectID = m_ID; GeneralUtils::SetBit(m_ObjectID, eObjectBits::CHARACTER); - GeneralUtils::SetBit(m_ObjectID, eObjectBits::PERSISTENT); m_OurEntity = nullptr; m_BuildMode = false; @@ -75,7 +78,7 @@ void Character::DoQuickXMLDataParse() { if (m_XMLData.size() == 0) return; if (m_Doc.Parse(m_XMLData.c_str(), m_XMLData.size()) == 0) { - LOG("Loaded xmlData for character %s (%i)!", m_Name.c_str(), m_ID); + LOG("Loaded xmlData for character %s (%llu)!", m_Name.c_str(), m_ID); } else { LOG("Failed to load xmlData (%i) (%s) (%s)!", m_Doc.ErrorID(), m_Doc.ErrorIDToName(m_Doc.ErrorID()), m_Doc.ErrorStr()); //Server::rakServer->CloseConnection(m_ParentUser->GetSystemAddress(), true); @@ -238,7 +241,7 @@ void Character::SetBuildMode(bool buildMode) { void Character::SaveXMLToDatabase() { // Check that we can actually _save_ before saving if (!m_OurEntity) { - LOG("%i:%s didn't have an entity set while saving! CHARACTER WILL NOT BE SAVED!", this->GetID(), this->GetName().c_str()); + LOG("%llu:%s didn't have an entity set while saving! CHARACTER WILL NOT BE SAVED!", this->GetID(), this->GetName().c_str()); return; } @@ -308,7 +311,7 @@ void Character::SaveXMLToDatabase() { //For metrics, log the time it took to save: auto end = std::chrono::system_clock::now(); std::chrono::duration elapsed = end - start; - LOG("%i:%s Saved character to Database in: %fs", this->GetID(), this->GetName().c_str(), elapsed.count()); + LOG("%llu:%s Saved character to Database in: %fs", this->GetID(), this->GetName().c_str(), elapsed.count()); } void Character::SetIsNewLogin() { @@ -320,7 +323,7 @@ void Character::SetIsNewLogin() { while (currentChild) { auto* nextChild = currentChild->NextSiblingElement(); if (currentChild->Attribute("si")) { - LOG("Removed session flag (%s) from character %i:%s, saving character to database", currentChild->Attribute("si"), GetID(), GetName().c_str()); + LOG("Removed session flag (%s) from character %llu:%s, saving character to database", currentChild->Attribute("si"), GetID(), GetName().c_str()); flags->DeleteChild(currentChild); WriteToDatabase(); } diff --git a/dGame/Character.h b/dGame/Character.h index bcddfd3e..2c88fd0d 100644 --- a/dGame/Character.h +++ b/dGame/Character.h @@ -23,7 +23,7 @@ enum class eLootSourceType : uint32_t; */ class Character { public: - Character(uint32_t id, User* parentUser); + Character(LWOOBJID id, User* parentUser); ~Character(); /** @@ -53,7 +53,7 @@ public: * Gets the database ID of the character * @return the database ID of the character */ - uint32_t GetID() const { return m_ID; } + LWOOBJID GetID() const { return m_ID; } /** * Gets the (custom) name of the character @@ -467,9 +467,9 @@ public: private: void UpdateInfoFromDatabase(); /** - * The ID of this character. First 32 bits of the ObjectID. + * The ID of this character. */ - uint32_t m_ID{}; + LWOOBJID m_ID{}; /** * The 64-bit unique ID used in the game. diff --git a/dGame/LeaderboardManager.cpp b/dGame/LeaderboardManager.cpp index b08bbd70..488bc2b0 100644 --- a/dGame/LeaderboardManager.cpp +++ b/dGame/LeaderboardManager.cpp @@ -145,7 +145,7 @@ void QueryToLdf(Leaderboard& leaderboard, const std::vector } } -std::vector FilterToNumResults(const std::vector& leaderboard, const uint32_t relatedPlayer, const Leaderboard::InfoType infoType, const uint32_t numResults) { +std::vector FilterToNumResults(const std::vector& leaderboard, const LWOOBJID relatedPlayer, const Leaderboard::InfoType infoType, const uint32_t numResults) { std::vector toReturn; int32_t index = 0; @@ -197,7 +197,7 @@ std::vector FilterWeeklies(const std::vector FilterFriends(const std::vector& leaderboard, const uint32_t relatedPlayer) { +std::vector FilterFriends(const std::vector& leaderboard, const LWOOBJID relatedPlayer) { // Filter the leaderboard to only include friends of the player auto friendOfPlayer = Database::Get()->GetFriendsList(relatedPlayer); std::vector friendsLeaderboard; @@ -217,7 +217,7 @@ std::vector ProcessLeaderboard( const std::vector& leaderboard, const bool weekly, const Leaderboard::InfoType infoType, - const uint32_t relatedPlayer, + const LWOOBJID relatedPlayer, const uint32_t numResults) { std::vector toReturn; diff --git a/dGame/User.cpp b/dGame/User.cpp index 7c03daa8..1f8a41fa 100644 --- a/dGame/User.cpp +++ b/dGame/User.cpp @@ -39,11 +39,11 @@ User::User(const SystemAddress& sysAddr, const std::string& username, const std: if (Game::server->GetZoneID() != 0) { auto characterList = Database::Get()->GetAccountCharacterIds(m_AccountID); if (!characterList.empty()) { - const uint32_t lastUsedCharacterId = characterList.front(); + const auto lastUsedCharacterId = characterList.front(); Character* character = new Character(lastUsedCharacterId, this); character->UpdateFromDatabase(); m_Characters.push_back(character); - LOG("Loaded %i as it is the last used char", lastUsedCharacterId); + LOG("Loaded %llu as it is the last used char", lastUsedCharacterId); } } } diff --git a/dGame/UserManager.cpp b/dGame/UserManager.cpp index 6b742b27..9bd6d844 100644 --- a/dGame/UserManager.cpp +++ b/dGame/UserManager.cpp @@ -325,7 +325,9 @@ void UserManager::CreateCharacter(const SystemAddress& sysAddr, Packet* packet) } //Now that the name is ok, we can get an objectID from Master: - ObjectIDManager::RequestPersistentID([=, this](uint32_t objectID) { + ObjectIDManager::RequestPersistentID([=, this](uint32_t persistentID) { + LWOOBJID objectID = persistentID; + GeneralUtils::SetBit(objectID, eObjectBits::CHARACTER); if (Database::Get()->GetCharacterInfo(objectID)) { LOG("Character object id unavailable, check object_id_tracker!"); WorldPackets::SendCharacterCreationResponse(sysAddr, eCharacterCreationResponse::OBJECT_ID_UNAVAILABLE); @@ -409,9 +411,8 @@ void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet) CINSTREAM_SKIP_HEADER; LWOOBJID objectID; inStream.Read(objectID); - uint32_t charID = static_cast(objectID); - LOG("Received char delete req for ID: %llu (%u)", objectID, charID); + LOG("Received char delete req for ID: %llu", objectID); bool hasCharacter = CheatDetection::VerifyLwoobjidIsSender( objectID, @@ -423,8 +424,8 @@ void UserManager::DeleteCharacter(const SystemAddress& sysAddr, Packet* packet) if (!hasCharacter) { WorldPackets::SendCharacterDeleteResponse(sysAddr, false); } else { - LOG("Deleting character %i", charID); - Database::Get()->DeleteCharacter(charID); + LOG("Deleting character %llu", objectID); + Database::Get()->DeleteCharacter(objectID); CBITSTREAM; BitStreamUtils::WriteHeader(bitStream, ServiceType::CHAT, MessageType::Chat::UNEXPECTED_DISCONNECT); @@ -445,11 +446,8 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet) CINSTREAM_SKIP_HEADER; LWOOBJID objectID; inStream.Read(objectID); - GeneralUtils::ClearBit(objectID, eObjectBits::CHARACTER); - GeneralUtils::ClearBit(objectID, eObjectBits::PERSISTENT); - uint32_t charID = static_cast(objectID); - LOG("Received char rename request for ID: %llu (%u)", objectID, charID); + LOG("Received char rename request for ID: %llu", objectID); LUWString LUWStringName; inStream.Read(LUWStringName); @@ -466,7 +464,7 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet) u->GetAccountID()); auto unusedItr = std::find_if(u->GetCharacters().begin(), u->GetCharacters().end(), [&](Character* c) { - if (c->GetID() == charID) { + if (c->GetID() == objectID) { character = c; return true; } @@ -483,12 +481,12 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet) if (!Database::Get()->GetCharacterInfo(newName)) { if (IsNamePreapproved(newName)) { - Database::Get()->SetCharacterName(charID, newName); + Database::Get()->SetCharacterName(objectID, newName); LOG("Character %s now known as %s", character->GetName().c_str(), newName.c_str()); WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::SUCCESS); UserManager::RequestCharacterList(sysAddr); } else { - Database::Get()->SetPendingCharacterName(charID, newName); + Database::Get()->SetPendingCharacterName(objectID, newName); LOG("Character %s has been renamed to %s and is pending approval by a moderator.", character->GetName().c_str(), newName.c_str()); WorldPackets::SendCharacterRenameResponse(sysAddr, eRenameResponse::SUCCESS); UserManager::RequestCharacterList(sysAddr); @@ -502,7 +500,7 @@ void UserManager::RenameCharacter(const SystemAddress& sysAddr, Packet* packet) } } -void UserManager::LoginCharacter(const SystemAddress& sysAddr, uint32_t playerID) { +void UserManager::LoginCharacter(const SystemAddress& sysAddr, LWOOBJID playerID) { User* u = GetUser(sysAddr); if (!u) { LOG("Couldn't get user to log in character"); diff --git a/dGame/UserManager.h b/dGame/UserManager.h index 94bf5e95..9b4af26e 100644 --- a/dGame/UserManager.h +++ b/dGame/UserManager.h @@ -35,7 +35,7 @@ public: void CreateCharacter(const SystemAddress& sysAddr, Packet* packet); void DeleteCharacter(const SystemAddress& sysAddr, Packet* packet); void RenameCharacter(const SystemAddress& sysAddr, Packet* packet); - void LoginCharacter(const SystemAddress& sysAddr, uint32_t playerID); + void LoginCharacter(const SystemAddress& sysAddr, LWOOBJID playerID); void SaveAllActiveCharacters(); diff --git a/dGame/dComponents/PropertyManagementComponent.cpp b/dGame/dComponents/PropertyManagementComponent.cpp index ccef695f..d8d00787 100644 --- a/dGame/dComponents/PropertyManagementComponent.cpp +++ b/dGame/dComponents/PropertyManagementComponent.cpp @@ -64,7 +64,6 @@ PropertyManagementComponent::PropertyManagementComponent(Entity* parent) : Compo this->propertyId = propertyInfo->id; this->owner = propertyInfo->ownerId; GeneralUtils::SetBit(this->owner, eObjectBits::CHARACTER); - GeneralUtils::SetBit(this->owner, eObjectBits::PERSISTENT); this->clone_Id = propertyInfo->cloneId; this->propertyName = propertyInfo->name; this->propertyDescription = propertyInfo->description; diff --git a/dGame/dUtilities/CheatDetection.cpp b/dGame/dUtilities/CheatDetection.cpp index 504b3d53..a0f8c53a 100644 --- a/dGame/dUtilities/CheatDetection.cpp +++ b/dGame/dUtilities/CheatDetection.cpp @@ -76,8 +76,8 @@ void LogAndSaveFailedAntiCheatCheck(const LWOOBJID& id, const SystemAddress& sys auto* user = UserManager::Instance()->GetUser(sysAddr); if (user) { - LOG("User at system address (%s) (%s) (%llu) sent a packet as (%i) which is not an id they own.", - sysAddr.ToString(), user->GetLastUsedChar()->GetName().c_str(), user->GetLastUsedChar()->GetObjectID(), static_cast(id)); + LOG("User at system address (%s) (%s) (%llu) sent a packet as (%llu) which is not an id they own.", + sysAddr.ToString(), user->GetLastUsedChar()->GetName().c_str(), user->GetLastUsedChar()->GetObjectID(), id); // Can't know sending player. Just log system address for IP banning. } else { LOG("No user found for system address (%s).", sysAddr.ToString()); @@ -117,7 +117,7 @@ bool CheatDetection::VerifyLwoobjidIsSender(const LWOOBJID& id, const SystemAddr return false; } invalidPacket = true; - const uint32_t characterId = static_cast(id); + const auto characterId = id; // Check to make sure the ID provided is one of the user's characters. for (const auto& character : sendingUser->GetCharacters()) { if (character && character->GetID() == characterId) { diff --git a/dGame/dUtilities/SlashCommands/GMGreaterThanZeroCommands.cpp b/dGame/dUtilities/SlashCommands/GMGreaterThanZeroCommands.cpp index b31291fe..7d017cf0 100644 --- a/dGame/dUtilities/SlashCommands/GMGreaterThanZeroCommands.cpp +++ b/dGame/dUtilities/SlashCommands/GMGreaterThanZeroCommands.cpp @@ -141,7 +141,6 @@ namespace GMGreaterThanZeroCommands { characterId = characterInfo->id; GeneralUtils::SetBit(characterId, eObjectBits::CHARACTER); - GeneralUtils::SetBit(characterId, eObjectBits::PERSISTENT); } if (accountId == 0) { diff --git a/dNet/MailInfo.h b/dNet/MailInfo.h index c74eee87..ac8edb06 100644 --- a/dNet/MailInfo.h +++ b/dNet/MailInfo.h @@ -15,8 +15,8 @@ struct MailInfo { std::string subject; std::string body; uint64_t id{}; - uint32_t senderId{}; - uint32_t receiverId{}; + LWOOBJID senderId{}; + LWOOBJID receiverId{}; uint64_t timeSent{}; bool wasRead{}; uint16_t languageCode{}; diff --git a/dWorldServer/WorldServer.cpp b/dWorldServer/WorldServer.cpp index cb7fedd5..ec3ca128 100644 --- a/dWorldServer/WorldServer.cpp +++ b/dWorldServer/WorldServer.cpp @@ -861,7 +861,7 @@ void HandlePacket(Packet* packet) { } if (luBitStream.connectionType != ServiceType::WORLD) return; - + LOG_DEBUG("Got world packet %s", StringifiedEnum::ToString(static_cast(luBitStream.internalPacketID)).data()); switch (static_cast(luBitStream.internalPacketID)) { case MessageType::World::VALIDATION: { CINSTREAM_SKIP_HEADER; @@ -983,7 +983,7 @@ void HandlePacket(Packet* packet) { LWOOBJID playerID = 0; inStream.Read(playerID); - + LOG("User is requesting to login with character %llu", playerID); bool valid = CheatDetection::VerifyLwoobjidIsSender( playerID, packet->systemAddress, @@ -991,18 +991,15 @@ void HandlePacket(Packet* packet) { "Sending login request with a sending player that does not match their own. Player ID: %llu", playerID ); - + LOG("Login request for player %llu is %s", playerID, valid ? "valid" : "invalid"); if (!valid) return; - GeneralUtils::ClearBit(playerID, eObjectBits::CHARACTER); - GeneralUtils::ClearBit(playerID, eObjectBits::PERSISTENT); - auto user = UserManager::Instance()->GetUser(packet->systemAddress); if (user) { auto lastCharacter = user->GetLoggedInChar(); // This means we swapped characters and we need to remove the previous player from the container. - if (static_cast(lastCharacter) != playerID) { + if (lastCharacter != playerID) { CBITSTREAM; BitStreamUtils::WriteHeader(bitStream, ServiceType::CHAT, MessageType::Chat::UNEXPECTED_DISCONNECT); bitStream.Write(lastCharacter); @@ -1010,7 +1007,7 @@ void HandlePacket(Packet* packet) { } } - UserManager::Instance()->LoginCharacter(packet->systemAddress, static_cast(playerID)); + UserManager::Instance()->LoginCharacter(packet->systemAddress, playerID); break; } diff --git a/migrations/dlu/mysql/23_store_character_id_as_objectid.sql b/migrations/dlu/mysql/23_store_character_id_as_objectid.sql new file mode 100644 index 00000000..a05003ef --- /dev/null +++ b/migrations/dlu/mysql/23_store_character_id_as_objectid.sql @@ -0,0 +1,22 @@ +START TRANSACTION; +ALTER TABLE mail MODIFY COLUMN sender_id BIGINT NOT NULL; +ALTER TABLE bug_reports MODIFY COLUMN reporter_id BIGINT; +/* This is done to prevent all entries on the leaderboard from updating */ +ALTER TABLE leaderboard CHANGE last_played last_played TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(); +SET foreign_key_checks = 0; +UPDATE activity_log SET character_id = character_id | 0x1000000000000000; +UPDATE behaviors SET character_id = character_id | 0x1000000000000000; +UPDATE bug_reports SET reporter_id = reporter_id | 0x1000000000000000; +UPDATE charinfo SET id = id | 0x1000000000000000; +UPDATE charxml SET id = id | 0x1000000000000000; +UPDATE command_log SET character_id = character_id | 0x1000000000000000; +UPDATE friends SET player_id = player_id | 0x1000000000000000, friend_id = friend_id | 0x1000000000000000; +UPDATE ignore_list SET player_id = player_id | 0x1000000000000000, ignored_player_id = ignored_player_id | 0x1000000000000000; +UPDATE leaderboard SET character_id = character_id | 0x1000000000000000; +UPDATE mail SET sender_id = sender_id | 0x1000000000000000, receiver_id = receiver_id | 0x1000000000000000; +UPDATE properties SET owner_id = owner_id | 0x1000000000000000; +UPDATE ugc SET character_id = character_id | 0x1000000000000000; +UPDATE ugc_modular_build SET character_id = character_id | 0x1000000000000000; +SET foreign_key_checks = 1; +ALTER TABLE leaderboard CHANGE last_played last_played TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(); +COMMIT; diff --git a/migrations/dlu/sqlite/6_store_character_id_as_objectid.sql b/migrations/dlu/sqlite/6_store_character_id_as_objectid.sql new file mode 100644 index 00000000..8db89ee6 --- /dev/null +++ b/migrations/dlu/sqlite/6_store_character_id_as_objectid.sql @@ -0,0 +1,22 @@ +ALTER TABLE mail ADD COLUMN sender_id_1 BIGINT DEFAULT 0; +ALTER TABLE bug_reports ADD COLUMN reporter_id_1 BIGINT DEFAULT 0; +/* The leaderboard last_played change is not needed here since sqlite does not have ON UPDATE */ +UPDATE activity_log SET character_id = character_id | 0x1000000000000000; +UPDATE behaviors SET character_id = character_id | 0x1000000000000000; +UPDATE bug_reports SET reporter_id_1 = reporter_id | 0x1000000000000000; +UPDATE charinfo SET id = id | 0x1000000000000000; +UPDATE charxml SET id = id | 0x1000000000000000; +UPDATE command_log SET character_id = character_id | 0x1000000000000000; +UPDATE friends SET player_id = player_id | 0x1000000000000000, friend_id = friend_id | 0x1000000000000000; +UPDATE ignore_list SET player_id = player_id | 0x1000000000000000, ignored_player_id = ignored_player_id | 0x1000000000000000; +UPDATE leaderboard SET character_id = character_id | 0x1000000000000000; +UPDATE mail SET sender_id_1 = sender_id | 0x1000000000000000, receiver_id = receiver_id | 0x1000000000000000; +UPDATE properties SET owner_id = owner_id | 0x1000000000000000; +UPDATE ugc SET character_id = character_id | 0x1000000000000000; +UPDATE ugc_modular_build SET character_id = character_id | 0x1000000000000000; + +ALTER TABLE mail DROP COLUMN sender_id; +ALTER TABLE mail RENAME COLUMN sender_id_1 TO sender_id; + +ALTER TABLE bug_reports DROP COLUMN reporter_id; +ALTER TABLE bug_reports RENAME COLUMN reporter_id_1 TO reporter_id;