diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-06-04 19:27:26 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-09-08 19:40:48 +0200 |
commit | ca7824c58b5a68b9f82b8354bb56b67488468050 (patch) | |
tree | d677a1d89eb1ae659ea8c88b8eb14d01cfad4e45 /src/server/scripts/Commands | |
parent | 44b1e6e0474a41d0688ae4c81d1cbdeae408a8ef (diff) |
Core/Reputation: Implemented "friendship reputation"
(cherry picked from commit 80a6347b7a0e8dfbe5e690504ed373f75c4f4c76)
Diffstat (limited to 'src/server/scripts/Commands')
-rw-r--r-- | src/server/scripts/Commands/cs_character.cpp | 3 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_lookup.cpp | 3 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_modify.cpp | 78 |
3 files changed, 47 insertions, 37 deletions
diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 2633b8313a2..9a35f6f1c68 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -557,8 +557,7 @@ public: FactionState const& faction = itr->second; FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction.ID); char const* factionName = factionEntry ? factionEntry->Name[loc] : "#Not found#"; - ReputationRank rank = target->GetReputationMgr().GetRank(factionEntry); - std::string rankName = handler->GetTrinityString(ReputationRankStrIndex[rank]); + std::string rankName = target->GetReputationMgr().GetReputationRankName(factionEntry); std::ostringstream ss; if (handler->GetSession()) ss << faction.ID << " - |cffffffff|Hfaction:" << faction.ID << "|h[" << factionName << ' ' << localeNames[loc] << "]|h|r"; diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index dfdbdc39586..d9d02aab36c 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -363,8 +363,7 @@ public: if (factionState) // and then target != NULL also { - uint32 index = target->GetReputationMgr().GetReputationRankStrIndex(factionEntry); - std::string rankName = handler->GetTrinityString(index); + std::string rankName = target->GetReputationMgr().GetReputationRankName(factionEntry); ss << ' ' << rankName << "|h|r (" << target->GetReputationMgr().GetReputation(factionEntry) << ')'; diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 8d89ec6ed40..d99c66d6c66 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -705,18 +705,39 @@ public: if (!factionId || !rankTxt) return false; + FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); + + if (!factionEntry) + { + handler->PSendSysMessage(LANG_COMMAND_FACTION_UNKNOWN, factionId); + handler->SetSentErrorMessage(true); + return false; + } + + if (factionEntry->ReputationIndex < 0) + { + handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->Name[handler->GetSessionDbcLocale()], factionId); + handler->SetSentErrorMessage(true); + return false; + } + amount = atoi(rankTxt); + // try to find rank by name if ((amount == 0) && (rankTxt[0] != '-') && !isdigit((unsigned char)rankTxt[0])) { std::string rankStr = rankTxt; std::wstring wrankStr; if (!Utf8toWStr(rankStr, wrankStr)) return false; + wstrToLower(wrankStr); - int r = 0; - amount = -42000; - for (; r < MAX_REPUTATION_RANK; ++r) + auto rankThresholdItr = ReputationMgr::ReputationRankThresholds.begin(); + auto end = ReputationMgr::ReputationRankThresholds.end(); + + int32 r = 0; + + for (; rankThresholdItr != end; ++rankThresholdItr, ++r) { std::string rank = handler->GetTrinityString(ReputationRankStrIndex[r]); if (rank.empty()) @@ -729,45 +750,36 @@ public: wstrToLower(wrank); if (wrank.substr(0, wrankStr.size()) == wrankStr) - { - char *deltaTxt = strtok(nullptr, " "); - if (deltaTxt) - { - int32 delta = atoi(deltaTxt); - if ((delta < 0) || (delta > ReputationMgr::PointsInRank[r] -1)) - { - handler->PSendSysMessage(LANG_COMMAND_FACTION_DELTA, (ReputationMgr::PointsInRank[r]-1)); - handler->SetSentErrorMessage(true); - return false; - } - amount += delta; - } break; - } - amount += ReputationMgr::PointsInRank[r]; } - if (r >= MAX_REPUTATION_RANK) + + if (rankThresholdItr == end) { handler->PSendSysMessage(LANG_COMMAND_INVALID_PARAM, rankTxt); handler->SetSentErrorMessage(true); return false; } - } - FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); - - if (!factionEntry) - { - handler->PSendSysMessage(LANG_COMMAND_FACTION_UNKNOWN, factionId); - handler->SetSentErrorMessage(true); - return false; - } + amount = *rankThresholdItr; - if (factionEntry->ReputationIndex < 0) - { - handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->Name[handler->GetSessionDbcLocale()], factionId); - handler->SetSentErrorMessage(true); - return false; + char *deltaTxt = strtok(nullptr, " "); + if (deltaTxt) + { + int32 toNextRank = 0; + auto nextThresholdItr = rankThresholdItr; + ++nextThresholdItr; + if (nextThresholdItr != end) + toNextRank = *nextThresholdItr - *rankThresholdItr; + + int32 delta = atoi(deltaTxt); + if (delta < 0 || delta >= toNextRank) + { + handler->PSendSysMessage(LANG_COMMAND_FACTION_DELTA, std::max(0, toNextRank - 1)); + handler->SetSentErrorMessage(true); + return false; + } + amount += delta; + } } target->GetReputationMgr().SetOneFactionReputation(factionEntry, amount, false); |