aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Commands
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-06-04 19:27:26 +0200
committerShauren <shauren.trinity@gmail.com>2025-09-08 19:40:48 +0200
commitca7824c58b5a68b9f82b8354bb56b67488468050 (patch)
treed677a1d89eb1ae659ea8c88b8eb14d01cfad4e45 /src/server/scripts/Commands
parent44b1e6e0474a41d0688ae4c81d1cbdeae408a8ef (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.cpp3
-rw-r--r--src/server/scripts/Commands/cs_lookup.cpp3
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp78
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);