Core/Reputation: Implemented "friendship reputation"

Port From (https://github.com/TrinityCore/TrinityCore/commit/80a6347b7a0e8dfbe5e690504ed373f75c4f4c76)
This commit is contained in:
hondacrx
2021-06-04 15:03:52 -04:00
parent 32f4bf4c25
commit 9702bd9097
9 changed files with 322 additions and 91 deletions
+45 -36
View File
@@ -393,42 +393,7 @@ namespace Game.Chat
if (factionId == 0 || !int.TryParse(rankTxt, out int amount))
return false;
if ((amount == 0) && !(amount < 0) && !rankTxt.IsNumber())
{
string rankStr = rankTxt.ToLower();
int r = 0;
amount = -42000;
for (; r < (int)ReputationRank.Max; ++r)
{
string rank = handler.GetCypherString(ReputationMgr.ReputationRankStrIndex[r]);
if (string.IsNullOrEmpty(rank))
continue;
if (rank.Equals(rankStr))
{
string deltaTxt = args.NextString();
if (!string.IsNullOrEmpty(deltaTxt))
{
if (!int.TryParse(deltaTxt, out int delta) || delta < 0 || (delta > ReputationMgr.PointsInRank[r] - 1))
{
handler.SendSysMessage(CypherStrings.CommandFactionDelta, (ReputationMgr.PointsInRank[r] - 1));
return false;
}
amount += delta;
}
break;
}
amount += ReputationMgr.PointsInRank[r];
}
if (r >= (int)ReputationRank.Max)
{
handler.SendSysMessage(CypherStrings.CommandFactionInvparam, rankTxt);
return false;
}
}
FactionRecord factionEntry = CliDB.FactionStorage.LookupByKey(factionId);
var factionEntry = CliDB.FactionStorage.LookupByKey(factionId);
if (factionEntry == null)
{
handler.SendSysMessage(CypherStrings.CommandFactionUnknown, factionId);
@@ -441,6 +406,50 @@ namespace Game.Chat
return false;
}
// try to find rank by name
if ((amount == 0) && !(amount < 0) && !rankTxt.IsNumber())
{
string rankStr = rankTxt.ToLower();
int i = 0;
int r = 0;
for (; i != ReputationMgr.ReputationRankThresholds.Length - 1; ++i, ++r)
{
string rank = handler.GetCypherString(ReputationMgr.ReputationRankStrIndex[r]);
if (string.IsNullOrEmpty(rank))
continue;
if (rank.Equals(rankStr))
break;
if (i == ReputationMgr.ReputationRankThresholds.Length - 1)
{
handler.SendSysMessage(CypherStrings.CommandFactionInvparam, rankTxt);
return false;
}
amount = ReputationMgr.ReputationRankThresholds[i];
string deltaTxt = args.NextString();
if (!string.IsNullOrEmpty(deltaTxt))
{
int toNextRank = 0;
var nextThresholdIndex = i;
++nextThresholdIndex;
if (nextThresholdIndex != ReputationMgr.ReputationRankThresholds.Length - 1)
toNextRank = nextThresholdIndex - i;
if (!int.TryParse(deltaTxt, out int delta) || delta < 0 || delta >= toNextRank)
{
handler.SendSysMessage(CypherStrings.CommandFactionDelta, Math.Max(0, toNextRank - 1));
return false;
}
amount += delta;
}
}
}
target.GetReputationMgr().SetOneFactionReputation(factionEntry, amount, false);
target.GetReputationMgr().SendState(target.GetReputationMgr().GetState(factionEntry));
handler.SendSysMessage(CypherStrings.CommandModifyRep, factionEntry.Name[handler.GetSessionDbcLocale()], factionId, handler.GetNameLink(target), target.GetReputationMgr().GetReputation(factionEntry));