From 78d8c5775249bfeafdb1c15532ac452024f522f5 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Wed, 15 Nov 2023 19:30:46 -0600 Subject: [PATCH] feat: make the help menu top 5 issues work and configurable (#1293) * feat: make make the help menu questions work * address feedback * typo * update defaults * fix and address feedback * newline --- dCommon/dConfig.cpp | 8 +++---- dCommon/dEnums/eWorldMessageType.h | 3 ++- dNet/ClientPackets.cpp | 38 ++++++++++++++++++++++++++++++ dNet/ClientPackets.h | 1 + dWorldServer/WorldServer.cpp | 6 +++++ resources/worldconfig.ini | 12 ++++++++++ 6 files changed, 62 insertions(+), 6 deletions(-) diff --git a/dCommon/dConfig.cpp b/dCommon/dConfig.cpp index f09a44c1f..35048d644 100644 --- a/dCommon/dConfig.cpp +++ b/dCommon/dConfig.cpp @@ -38,13 +38,11 @@ const std::string& dConfig::GetValue(std::string key) { } void dConfig::ProcessLine(const std::string& line) { - auto splitLine = GeneralUtils::SplitString(line, '='); - - if (splitLine.size() != 2) return; + auto splitLoc = line.find('='); + auto key = line.substr(0, splitLoc); + auto value = line.substr(splitLoc + 1); //Make sure that on Linux, we remove special characters: - auto& key = splitLine.at(0); - auto& value = splitLine.at(1); if (!value.empty() && value.at(value.size() - 1) == '\r') value.erase(value.size() - 1); if (this->m_ConfigValues.find(key) != this->m_ConfigValues.end()) return; diff --git a/dCommon/dEnums/eWorldMessageType.h b/dCommon/dEnums/eWorldMessageType.h index 2a65fd987..4b3e2a03f 100644 --- a/dCommon/dEnums/eWorldMessageType.h +++ b/dCommon/dEnums/eWorldMessageType.h @@ -36,7 +36,8 @@ enum class eWorldMessageType : uint32_t { HANDLE_FUNNESS, FAKE_PRG_CSR_MESSAGE, REQUEST_FREE_TRIAL_REFRESH, - GM_SET_FREE_TRIAL_STATUS + GM_SET_FREE_TRIAL_STATUS, + UI_HELP_TOP_5 = 91 }; #endif //!__EWORLDMESSAGETYPE__H__ diff --git a/dNet/ClientPackets.cpp b/dNet/ClientPackets.cpp index 8059b7af6..daf0221ab 100644 --- a/dNet/ClientPackets.cpp +++ b/dNet/ClientPackets.cpp @@ -34,6 +34,7 @@ #include "eGameMasterLevel.h" #include "eReplicaComponentType.h" #include "CheatDetection.h" +#include "Amf3.h" void ClientPackets::HandleChatMessage(const SystemAddress& sysAddr, Packet* packet) { User* user = UserManager::Instance()->GetUser(sysAddr); @@ -402,3 +403,40 @@ void ClientPackets::HandleChatModerationRequest(const SystemAddress& sysAddr, Pa user->SetLastChatMessageApproved(bAllClean); WorldPackets::SendChatModerationResponse(sysAddr, bAllClean, requestID, receiver, segments); } + +void ClientPackets::SendTop5HelpIssues(Packet* packet) { + auto* user = UserManager::Instance()->GetUser(packet->systemAddress); + if (!user) return; + auto* character = user->GetLastUsedChar(); + if (!character) return; + auto * entity = character->GetEntity(); + if (!entity) return; + + CINSTREAM_SKIP_HEADER; + int32_t language = 0; + inStream.Read(language); + + // TODO: Handle different languages in a nice way + // 0: en_US + // 1: pl_US + // 2: de_DE + // 3: en_GB + + AMFArrayValue data; + // Summaries + data.Insert("Summary0", Game::config->GetValue("help_0_summary")); + data.Insert("Summary1", Game::config->GetValue("help_1_summary")); + data.Insert("Summary2", Game::config->GetValue("help_2_summary")); + data.Insert("Summary3", Game::config->GetValue("help_3_summary")); + data.Insert("Summary4", Game::config->GetValue("help_4_summary")); + + // Descriptions + data.Insert("Description0", Game::config->GetValue("help_0_description")); + data.Insert("Description1", Game::config->GetValue("help_1_description")); + data.Insert("Description2", Game::config->GetValue("help_2_description")); + data.Insert("Description3", Game::config->GetValue("help_3_description")); + data.Insert("Description4", Game::config->GetValue("help_4_description")); + + GameMessages::SendUIMessageServerToSingleClient(entity, packet->systemAddress, "UIHelpTop5", data); + +} diff --git a/dNet/ClientPackets.h b/dNet/ClientPackets.h index a36384e2f..5b9fd76d2 100644 --- a/dNet/ClientPackets.h +++ b/dNet/ClientPackets.h @@ -12,6 +12,7 @@ namespace ClientPackets { void HandleChatMessage(const SystemAddress& sysAddr, Packet* packet); void HandleClientPositionUpdate(const SystemAddress& sysAddr, Packet* packet); void HandleChatModerationRequest(const SystemAddress& sysAddr, Packet* packet); + void SendTop5HelpIssues(Packet* packet); }; #endif // CLIENTPACKETS_H diff --git a/dWorldServer/WorldServer.cpp b/dWorldServer/WorldServer.cpp index 79dce1bf4..e8f5915d5 100644 --- a/dWorldServer/WorldServer.cpp +++ b/dWorldServer/WorldServer.cpp @@ -1297,6 +1297,12 @@ void HandlePacket(Packet* packet) { break; } + + case eWorldMessageType::UI_HELP_TOP_5: { + ClientPackets::SendTop5HelpIssues(packet); + break; + } + default: LOG("Unknown world packet received: %i", int(packet->data[3])); } diff --git a/resources/worldconfig.ini b/resources/worldconfig.ini index c0a0a10aa..0072fc51f 100644 --- a/resources/worldconfig.ini +++ b/resources/worldconfig.ini @@ -64,3 +64,15 @@ allow_nameplate_off=0 # Turn logging of IP addresses for anti-cheat reporting on (1) or off(0) log_ip_addresses_for_anti_cheat=1 + +help_0_summary=Got an issue? +help_1_summary=Stuck loading? +help_2_summary=Missing features? +help_3_summary=Get smashed? +help_4_summary=Want to contribute? + +help_0_description=Go to the DarkflameServer repository on GitHub to view issues and discussions about the server emulator!

Click Here to go there!

+help_1_description=Try switching networks, using a VPN, or using your phone's hotspot to resolve the issue.

+help_2_description=While DarkflameServer is a mostly complete emulator, there are still some features that aren't implemented. You can track these on the GitHub issues page.

+help_3_description=Skill issue!

+help_4_description=Visit Discussions on the DarkflameServer GitHub page
to ask questions and collaborate with other devs!