2022-05-09 00:57:36 +00:00
|
|
|
#include "PropertyEntranceComponent.h"
|
2022-03-31 03:33:50 +00:00
|
|
|
|
2024-01-05 12:33:52 +00:00
|
|
|
#include "CDPropertyEntranceComponentTable.h"
|
2022-03-31 03:33:50 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
#include "Character.h"
|
|
|
|
#include "Database.h"
|
2022-03-31 03:33:50 +00:00
|
|
|
#include "GameMessages.h"
|
2021-12-05 17:54:36 +00:00
|
|
|
#include "PropertyManagementComponent.h"
|
2022-03-31 03:33:50 +00:00
|
|
|
#include "PropertySelectQueryProperty.h"
|
|
|
|
#include "RocketLaunchpadControlComponent.h"
|
2022-05-09 00:57:36 +00:00
|
|
|
#include "CharacterComponent.h"
|
2022-03-28 03:04:45 +00:00
|
|
|
#include "UserManager.h"
|
2023-10-21 23:31:55 +00:00
|
|
|
#include "Logger.h"
|
2023-05-13 22:22:00 +00:00
|
|
|
#include "Amf3.h"
|
2023-04-25 18:17:40 +00:00
|
|
|
#include "eObjectBits.h"
|
2023-03-24 23:16:45 +00:00
|
|
|
#include "eGameMasterLevel.h"
|
2024-11-23 21:56:31 +00:00
|
|
|
#include "ePropertySortType.h"
|
|
|
|
#include "User.h"
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2023-10-23 01:08:49 +00:00
|
|
|
PropertyEntranceComponent::PropertyEntranceComponent(Entity* parent, uint32_t componentID) : Component(parent) {
|
2022-07-28 13:39:57 +00:00
|
|
|
this->propertyQueries = {};
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2024-02-09 05:40:43 +00:00
|
|
|
auto table = CDClientManager::GetTable<CDPropertyEntranceComponentTable>();
|
2022-07-28 13:39:57 +00:00
|
|
|
const auto& entry = table->GetByID(componentID);
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
this->m_MapID = entry.mapID;
|
|
|
|
this->m_PropertyName = entry.propertyName;
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
|
|
|
|
2022-05-09 00:57:36 +00:00
|
|
|
void PropertyEntranceComponent::OnUse(Entity* entity) {
|
|
|
|
auto* characterComponent = entity->GetComponent<CharacterComponent>();
|
|
|
|
if (!characterComponent) return;
|
|
|
|
|
|
|
|
auto* rocket = entity->GetComponent<CharacterComponent>()->RocketEquip(entity);
|
|
|
|
if (!rocket) return;
|
|
|
|
|
|
|
|
GameMessages::SendPropertyEntranceBegin(m_Parent->GetObjectID(), entity->GetSystemAddress());
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-05-09 00:57:36 +00:00
|
|
|
AMFArrayValue args;
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2023-05-13 22:22:00 +00:00
|
|
|
args.Insert("state", "property_menu");
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2023-05-13 22:22:00 +00:00
|
|
|
GameMessages::SendUIMessageServerToSingleClient(entity, entity->GetSystemAddress(), "pushGameState", args);
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
void PropertyEntranceComponent::OnEnterProperty(Entity* entity, uint32_t index, bool returnToZone, const SystemAddress& sysAddr) {
|
|
|
|
LWOCLONEID cloneId = 0;
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
if (index == -1 && !returnToZone) {
|
|
|
|
cloneId = entity->GetCharacter()->GetPropertyCloneID();
|
|
|
|
} else if (index == -1 && returnToZone) {
|
|
|
|
cloneId = 0;
|
|
|
|
} else if (index >= 0) {
|
|
|
|
// Increment index once here because the first index of other player properties is 2 in the propertyQueries cache.
|
|
|
|
index++;
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
const auto& pair = propertyQueries.find(entity->GetObjectID());
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
if (pair == propertyQueries.end()) return;
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
const auto& query = pair->second;
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
if (index >= query.size()) return;
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
cloneId = query[index].CloneId;
|
|
|
|
}
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
auto* launcher = m_Parent->GetComponent<RocketLaunchpadControlComponent>();
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
if (launcher == nullptr) {
|
|
|
|
return;
|
|
|
|
}
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
launcher->SetSelectedCloneId(entity->GetObjectID(), cloneId);
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
launcher->Launch(entity, launcher->GetTargetZone(), cloneId);
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
void PropertyEntranceComponent::OnPropertyEntranceSync(Entity* entity, bool includeNullAddress, bool includeNullDescription, bool playerOwn, bool updateUi, int32_t numResults, int32_t lReputationTime, int32_t sortMethod, int32_t startIndex, std::string filterText, const SystemAddress& sysAddr) {
|
2024-11-23 21:56:31 +00:00
|
|
|
const auto* const character = entity->GetCharacter();
|
2022-07-28 13:39:57 +00:00
|
|
|
if (!character) return;
|
2024-11-23 21:56:31 +00:00
|
|
|
const auto* const user = character->GetParentUser();
|
|
|
|
if (!user) return;
|
2022-03-29 03:51:15 +00:00
|
|
|
|
2024-11-23 21:56:31 +00:00
|
|
|
auto& entries = propertyQueries[entity->GetObjectID()];
|
|
|
|
entries.clear();
|
2022-07-28 13:39:57 +00:00
|
|
|
// Player property goes in index 1 of the vector. This is how the client expects it.
|
2024-11-23 21:56:31 +00:00
|
|
|
const auto playerProperty = Database::Get()->GetPropertyInfo(m_MapID, character->GetPropertyCloneID());
|
2022-03-29 02:58:50 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
// If the player has a property this query will have a single result.
|
2024-11-23 21:56:31 +00:00
|
|
|
auto& playerEntry = entries.emplace_back();
|
|
|
|
if (playerProperty.has_value()) {
|
|
|
|
playerEntry.OwnerName = character->GetName();
|
|
|
|
playerEntry.IsBestFriend = true;
|
|
|
|
playerEntry.IsFriend = true;
|
|
|
|
playerEntry.IsAlt = true;
|
|
|
|
playerEntry.IsOwned = true;
|
|
|
|
playerEntry.CloneId = playerProperty->cloneId;
|
|
|
|
playerEntry.Name = playerProperty->name;
|
|
|
|
playerEntry.Description = playerProperty->description;
|
|
|
|
playerEntry.AccessType = playerProperty->privacyOption;
|
|
|
|
playerEntry.IsModeratorApproved = playerProperty->modApproved;
|
|
|
|
playerEntry.DateLastPublished = playerProperty->lastUpdatedTime;
|
|
|
|
playerEntry.Reputation = playerProperty->reputation;
|
|
|
|
playerEntry.PerformanceCost = playerProperty->performanceCost;
|
|
|
|
auto& entry = playerEntry;
|
2022-07-28 13:39:57 +00:00
|
|
|
} else {
|
2024-11-23 21:56:31 +00:00
|
|
|
playerEntry.OwnerName = character->GetName();
|
|
|
|
playerEntry.IsBestFriend = true;
|
|
|
|
playerEntry.IsFriend = true;
|
|
|
|
playerEntry.IsAlt = false;
|
|
|
|
playerEntry.IsOwned = false;
|
|
|
|
playerEntry.CloneId = character->GetPropertyCloneID();
|
|
|
|
playerEntry.Name = "";
|
|
|
|
playerEntry.Description = "";
|
|
|
|
playerEntry.AccessType = 0;
|
|
|
|
playerEntry.IsModeratorApproved = false;
|
|
|
|
playerEntry.DateLastPublished = 0;
|
|
|
|
playerEntry.Reputation = 0;
|
|
|
|
playerEntry.PerformanceCost = 0.0f;
|
2022-07-28 13:39:57 +00:00
|
|
|
}
|
2022-03-29 02:58:50 +00:00
|
|
|
|
2024-11-23 21:56:31 +00:00
|
|
|
IProperty::PropertyLookup propertyLookup;
|
|
|
|
propertyLookup.mapId = m_MapID;
|
|
|
|
propertyLookup.searchString = filterText;
|
|
|
|
propertyLookup.sortChoice = static_cast<ePropertySortType>(sortMethod);
|
|
|
|
propertyLookup.playerSort = static_cast<uint32_t>(sortMethod == SORT_TYPE_FEATURED || sortMethod == SORT_TYPE_FRIENDS ? PropertyPrivacyOption::Friends : PropertyPrivacyOption::Public);
|
|
|
|
propertyLookup.playerId = character->GetID();
|
|
|
|
propertyLookup.numResults = numResults;
|
|
|
|
propertyLookup.startIndex = startIndex;
|
|
|
|
|
|
|
|
const auto lookupResult = Database::Get()->GetProperties(propertyLookup);
|
|
|
|
|
|
|
|
for (const auto& propertyEntry : lookupResult->entries) {
|
|
|
|
const auto owner = propertyEntry.ownerId;
|
|
|
|
const auto otherCharacter = Database::Get()->GetCharacterInfo(owner);
|
|
|
|
if (!otherCharacter.has_value()) {
|
|
|
|
LOG("Failed to find property owner name for %u!", owner);
|
2022-07-28 13:39:57 +00:00
|
|
|
continue;
|
|
|
|
}
|
2024-11-23 21:56:31 +00:00
|
|
|
auto& entry = entries.emplace_back();
|
|
|
|
|
|
|
|
entry.IsOwned = entry.CloneId == otherCharacter->cloneId;
|
|
|
|
entry.OwnerName = otherCharacter->name;
|
|
|
|
entry.CloneId = propertyEntry.cloneId;
|
|
|
|
entry.Name = propertyEntry.name;
|
|
|
|
entry.Description = propertyEntry.description;
|
|
|
|
entry.AccessType = propertyEntry.privacyOption;
|
|
|
|
entry.IsModeratorApproved = propertyEntry.modApproved;
|
|
|
|
entry.DateLastPublished = propertyEntry.lastUpdatedTime;
|
|
|
|
entry.Reputation = propertyEntry.reputation;
|
|
|
|
entry.PerformanceCost = propertyEntry.performanceCost;
|
|
|
|
entry.IsBestFriend = false;
|
|
|
|
entry.IsFriend = false;
|
2022-07-28 13:39:57 +00:00
|
|
|
// Query to get friend and best friend fields
|
2024-11-23 21:56:31 +00:00
|
|
|
const auto friendCheck = Database::Get()->GetBestFriendStatus(character->GetID(), owner);
|
2022-07-28 13:39:57 +00:00
|
|
|
// If we got a result than the two players are friends.
|
2024-11-23 21:56:31 +00:00
|
|
|
if (friendCheck.has_value()) {
|
|
|
|
entry.IsFriend = true;
|
|
|
|
entry.IsBestFriend = friendCheck->bestFriendStatus == 3;
|
2022-07-28 13:39:57 +00:00
|
|
|
}
|
2022-03-29 03:51:15 +00:00
|
|
|
|
2024-11-23 21:56:31 +00:00
|
|
|
if (!entry.IsModeratorApproved && entity->GetGMLevel() >= eGameMasterLevel::LEAD_MODERATOR) {
|
|
|
|
entry.Name = "[AWAITING APPROVAL]";
|
|
|
|
entry.Description = "[AWAITING APPROVAL]";
|
|
|
|
entry.IsModeratorApproved = true;
|
2022-07-28 13:39:57 +00:00
|
|
|
}
|
2022-03-28 06:46:43 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
// Query to determine whether this property is an alt character of the entity.
|
2024-11-23 21:56:31 +00:00
|
|
|
for (const auto charid : Database::Get()->GetAccountCharacterIds(user->GetAccountID())) {
|
|
|
|
entry.IsAlt = charid == owner;
|
|
|
|
if (entry.IsAlt) break;
|
2022-07-28 13:39:57 +00:00
|
|
|
}
|
|
|
|
}
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-28 13:39:57 +00:00
|
|
|
// Query here is to figure out whether or not to display the button to go to the next page or not.
|
2024-11-23 21:56:31 +00:00
|
|
|
GameMessages::SendPropertySelectQuery(m_Parent->GetObjectID(), startIndex, lookupResult->totalEntriesMatchingQuery - (startIndex + numResults) > 0, character->GetPropertyCloneID(), false, true, entries, sysAddr);
|
Add Aarch64 support (#231)
* added mariadb-connector-cpp submodule
* raknet aarch64 support
* fix compile errors
* mariadb connector swap (in progress)
* update CMakeLists, add preprocessor definition to switch between mysql and mariadb connectors
* update types with missing aarch64 check
* corrected adding extra flag to properly compile mariadbconn in CMakeLists
* updated readme with arm builds section
* fix build failure if test folder does not exist
* Remove mysql connector from all builds, add mariadbconnector to windows build
* readd Linux check for backtrace lib to CMakeLists.txt
* Separate system specific mariadbconncpp extra compile flags
* Copy dlls to exes directory once built
* fetch prebuilt binaries on windows so that ClangCL can be used
* Delay load dll so that plugin directory is set correctly
* Fixed typo in glibcxx compile flag
* whitespacing, spaces -> tabs
* Updated README.md, included instructions to update
* Updated README.md
added libssl-dev requirement and removed mysql connector references from macOS builds section
* apple compile fixes for zlib and shared library name
* add windows arm64 checks to raknet
* remove extra . in shared library location
* Setup plugins directory for the connector to search in, pass openssl_root_dir on for apple
* Fix copy paths for single config generators and non windows
* change plugin folder location, another single config generator fix
* GENERATOR_IS_MULTI_CONFIG is a property not a variable
* Fixed a few errors after merge
* Fix plugin directory path, force windows to look at the right folder
* fixed directory name for make_directory command
* Update README.md
Updated MacOS, Windows build instructions.
* set INSTALL_PLUGINDIR so that the right directory is used
* Support for relative rpath for docker build
* added mariadb-connector-cpp submodule
* raknet aarch64 support
* fix compile errors
* mariadb connector swap (in progress)
* update CMakeLists, add preprocessor definition to switch between mysql and mariadb connectors
* update types with missing aarch64 check
* corrected adding extra flag to properly compile mariadbconn in CMakeLists
* updated readme with arm builds section
* fix build failure if test folder does not exist
* Remove mysql connector from all builds, add mariadbconnector to windows build
* readd Linux check for backtrace lib to CMakeLists.txt
* Separate system specific mariadbconncpp extra compile flags
* Copy dlls to exes directory once built
* fetch prebuilt binaries on windows so that ClangCL can be used
* Delay load dll so that plugin directory is set correctly
* Fixed typo in glibcxx compile flag
* whitespacing, spaces -> tabs
* Updated README.md, included instructions to update
* Updated README.md
added libssl-dev requirement and removed mysql connector references from macOS builds section
* apple compile fixes for zlib and shared library name
* add windows arm64 checks to raknet
* Setup plugins directory for the connector to search in, pass openssl_root_dir on for apple
* Fix copy paths for single config generators and non windows
* change plugin folder location, another single config generator fix
* GENERATOR_IS_MULTI_CONFIG is a property not a variable
* Fixed a few errors after merge
* Fix plugin directory path, force windows to look at the right folder
* fixed directory name for make_directory command
* Update README.md
Updated MacOS, Windows build instructions.
* set INSTALL_PLUGINDIR so that the right directory is used
* Support for relative rpath for docker build
* Rebase on main
* Remove extra git submodule
* Update CMakeLists.txt
* Remove CMakeLists.txt file from mariadb
Remove the CMakeLists.txt file from the mariaDBConnector so we dont build the tests. Also add a config option to the CMakeVariables.txt so you can build the connector with multiple jobs
* Compile on windows
Specify the mariadbcpp.dll file location with a defined absolute path so windows knows it actually exists.
* default to 1 job
Default mariadb jobs running in parallel to 1 instead of 4
* Move mariadbcpp.dll file to the expected directory on windows
* Changed plugin
Updated the plugin location from the project binary directory to the expected location, the mariadb binary directory.
* Addressed windows dll issues by moving files to the expected directory instead of a directory that wouldnt get created
* Update README
Co-authored-by: Aaron Kimbrell <aronwk.aaron@gmail.com>
Co-authored-by: EmosewaMC <39972741+EmosewaMC@users.noreply.github.com>
2022-07-04 04:33:05 +00:00
|
|
|
}
|