From 9dc4705ba51a56fc5aea85a359377db23e72a2fa Mon Sep 17 00:00:00 2001 From: Aokromes Date: Wed, 8 Nov 2017 01:41:09 +0100 Subject: [PATCH] Core/Commands: Fix some commands still using phasemask --- .../world/4.3.4/2017_11_08_02_world.sql | 4 ++++ src/common/Utilities/Util.h | 17 ++++++++++++++++ src/server/game/Miscellaneous/Language.h | 4 ++-- src/server/scripts/Commands/cs_misc.cpp | 20 ++++++++----------- src/server/scripts/Commands/cs_modify.cpp | 13 +++++++++--- src/server/scripts/Commands/cs_npc.cpp | 12 ++++++++--- 6 files changed, 50 insertions(+), 20 deletions(-) create mode 100644 sql/updates/world/4.3.4/2017_11_08_02_world.sql diff --git a/sql/updates/world/4.3.4/2017_11_08_02_world.sql b/sql/updates/world/4.3.4/2017_11_08_02_world.sql new file mode 100644 index 00000000000..366009635f5 --- /dev/null +++ b/sql/updates/world/4.3.4/2017_11_08_02_world.sql @@ -0,0 +1,4 @@ +UPDATE `trinity_string` SET `content_default`='│ Phases: %s' WHERE `entry`=846; +DELETE FROM `trinity_string` WHERE `entry`=5083; +INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES +(5083,"Uses invalid phaseID."); diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index 17e934e34a6..70d7c97ef20 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -325,6 +326,22 @@ TC_COMMON_API void HexStrToByteArray(std::string const& str, uint8* out, bool re TC_COMMON_API bool StringToBool(std::string const& str); TC_COMMON_API float DegToRad(float degrees); +template +std::string StringJoin(Container const& c, std::string delimiter) +{ + if (c.empty()) + return ""; + + std::ostringstream os; + auto itr = c.begin(); + os << *itr++; + + for (; itr != c.end(); ++itr) + os << delimiter << *itr; + + return os.str(); +} + // simple class for not-modifyable list template class HookList final diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 8a62f3222b4..53813a782a8 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -830,7 +830,7 @@ enum TrinityStrings LANG_PINFO_CHR_LEVEL_LOW = 843, LANG_PINFO_CHR_RACE = 844, LANG_PINFO_CHR_ALIVE = 845, - LANG_PINFO_CHR_PHASE = 846, + LANG_PINFO_CHR_PHASES = 846, LANG_PINFO_CHR_MONEY = 847, LANG_PINFO_CHR_MAP = 848, LANG_PINFO_CHR_GUILD = 849, @@ -1146,7 +1146,7 @@ enum TrinityStrings LANG_COMMAND_MUTEHISTORY = 5059, LANG_COMMAND_MUTEHISTORY_EMPTY = 5060, LANG_COMMAND_MUTEHISTORY_OUTPUT = 5061, - + LANG_PHASE_NOTFOUND = 5083, // Room for more Trinity strings 5062-9999 // Level requirement notifications diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index b9d1e63cc66..726e65b6ae0 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -262,15 +262,11 @@ public: char const* unknown = handler->GetTrinityString(LANG_UNKNOWN); - std::ostringstream phases; - for (uint32 phaseId : object->GetPhases()) - phases << phaseId << ", "; - handler->PSendSysMessage(LANG_MAP_POSITION, mapId, (mapEntry ? mapEntry->name : unknown), zoneId, (zoneEntry ? zoneEntry->area_name : unknown), areaId, (areaEntry ? areaEntry->area_name : unknown), - object->GetPhaseMask(), phases.str().c_str(), + object->GetPhaseMask(), StringJoin(object->GetPhases(), ", ").c_str(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation()); if (Transport* transport = object->GetTransport()) handler->PSendSysMessage(LANG_TRANSPORT_POSITION, @@ -1559,7 +1555,7 @@ public: * * Level: %u (%u/%u XP (%u XP left) - X. LANG_PINFO_CHR_LEVEL * * Race: %s %s, Class %s - XI. LANG_PINFO_CHR_RACE * * Alive ?: %s - XII. LANG_PINFO_CHR_ALIVE - * * Phase: %s - XIII. LANG_PINFO_CHR_PHASE (if not GM) + * * Phases: %s - XIII. LANG_PINFO_CHR_PHASE (if not GM) * * Money: %ug%us%uc - XIV. LANG_PINFO_CHR_MONEY * * Map: %s, Area: %s - XV. LANG_PINFO_CHR_MAP * * Guild: %s (Id: %u) - XVI. LANG_PINFO_CHR_GUILD (if in guild) @@ -1615,7 +1611,7 @@ public: // Position data print uint32 mapId; uint32 areaId; - uint32 phase = 0; + std::set phases; std::string areaName = handler->GetTrinityString(LANG_UNKNOWN); std::string zoneName = handler->GetTrinityString(LANG_UNKNOWN); @@ -1647,7 +1643,7 @@ public: areaId = target->GetAreaId(); alive = target->IsAlive() ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO); gender = target->getGender(); - phase = target->GetPhaseMask(); + phases = target->GetPhases(); } // get additional information from DB else @@ -1834,10 +1830,10 @@ public: // Output XII. LANG_PINFO_CHR_ALIVE handler->PSendSysMessage(LANG_PINFO_CHR_ALIVE, alive.c_str()); - // Output XIII. LANG_PINFO_CHR_PHASE if player is not in GM mode (GM is in every phase) - if (target && !target->IsGameMaster()) // IsInWorld() returns false on loadingscreen, so it's more - handler->PSendSysMessage(LANG_PINFO_CHR_PHASE, phase); // precise than just target (safer ?). - // However, as we usually just require a target here, we use target instead. + // Output XIII. LANG_PINFO_CHR_PHASES + if (target && !phases.empty()) + handler->PSendSysMessage(LANG_PINFO_CHR_PHASES, StringJoin(phases, ", ").c_str()); + // Output XIV. LANG_PINFO_CHR_MONEY uint32 gold = money / GOLD; uint32 silv = (money % GOLD) / SILVER; diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 5521ff3b833..2221e1327c4 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1044,13 +1044,20 @@ public: if (!*args) return false; - uint32 phase = (uint32)atoi((char*)args); + uint32 phaseId = uint32(atoul(args)); + + if (!sPhaseStore.LookupEntry(phaseId)) + { + handler->SendSysMessage(LANG_PHASE_NOTFOUND); + handler->SetSentErrorMessage(true); + return false; + } Unit* target = handler->getSelectedUnit(); if (!target) target = handler->GetSession()->GetPlayer(); - - target->SetInPhase(phase, true, !target->IsInPhase(phase)); + + target->SetInPhase(phaseId, true, !target->IsInPhase(phaseId)); if (target->GetTypeId() == TYPEID_PLAYER) target->ToPlayer()->SendUpdatePhasing(); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index b69f6309d7c..3e6a50b4556 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -1097,7 +1097,13 @@ public: if (!*args) return false; - uint32 phase = atoul(args); + uint32 phaseID = uint32(atoi((char*)args)); + if (!sPhaseStore.LookupEntry(phaseID)) + { + handler->SendSysMessage(LANG_PHASE_NOTFOUND); + handler->SetSentErrorMessage(true); + return false; + } Creature* creature = handler->getSelectedCreature(); if (!creature || creature->IsPet()) @@ -1108,8 +1114,8 @@ public: } creature->ClearPhases(); - creature->SetInPhase(phase, true, true); - creature->SetDBPhase(phase); + creature->SetInPhase(phaseID, true, true); + creature->SetDBPhase(phaseID); creature->SaveToDB();