Core/Players: Several currency fixes and improvements

Port From (https://github.com/TrinityCore/TrinityCore/commit/03918978c166c9fb191117a0cae9ba1285bf0e37)
This commit is contained in:
hondacrx
2023-02-11 23:28:57 -05:00
parent 90cc620c11
commit 4b798e7cab
25 changed files with 603 additions and 347 deletions
+46
View File
@@ -997,6 +997,52 @@ namespace Framework.Constants
Max Max
} }
[Flags]
public enum CurrencyTypesFlags : uint
{
Tradable = 0x00000001, // NYI
AppearsInLootWindow = 0x00000002, // NYI
ComputedWeeklyMaximum = 0x00000004, // NYI
_100_Scaler = 0x00000008,
NoLowLevelDrop = 0x00000010, // NYI
IgnoreMaxQtyOnLoad = 0x00000020,
LogOnWorldChange = 0x00000040, // NYI
TrackQuantity = 0x00000080,
ResetTrackedQuantity = 0x00000100, // NYI
UpdateVersionIgnoreMax = 0x00000200,
SuppressChatMessageOnVersionChange = 0x00000400,
SingleDropInLoot = 0x00000800, // NYI
HasWeeklyCatchup = 0x00001000, // NYI
DoNotCompressChat = 0x00002000, // NYI
DoNotLogAcquisitionToBi = 0x00004000, // NYI
NoRaidDrop = 0x00008000, // NYI
NotPersistent = 0x00010000, // NYI
Deprecated = 0x00020000, // NYI
DynamicMaximum = 0x00040000,
SuppressChatMessages = 0x00080000,
DoNotToast = 0x00100000, // NYI
DestroyExtraOnLoot = 0x00200000, // NYI
DontShowTotalInTooltip = 0x00400000, // NYI
DontCoalesceInLootWindow = 0x00800000, // NYI
AccountWide = 0x01000000, // NYI
AllowOverflowMailer = 0x02000000, // NYI
HideAsReward = 0x04000000, // NYI
HasWarmodeBonus = 0x08000000, // NYI
IsAllianceOnly = 0x10000000,
IsHordeOnly = 0x20000000,
LimitWarmodeBonusOncePerTooltip = 0x40000000, // NYI
DeprecatedCurrencyFlag = 0x80000000 // this flag itself is deprecated, not currency that has it
}
[Flags]
public enum CurrencyTypesFlagsB
{
UseTotalEarnedForEarned = 0x01,
ShowQuestXPGainInTooltip = 0x02, // NYI
NoNotificationMailOnOfflineProgress = 0x04, // NYI
BattlenetVirtualCurrency = 0x08 // NYI
}
[Flags] [Flags]
public enum BattlemasterListFlags : int public enum BattlemasterListFlags : int
{ {
+2 -9
View File
@@ -1282,20 +1282,13 @@ namespace Framework.Constants
MawPower = 4 MawPower = 4
} }
public enum CurrencyFlags
{
Tradeable = 0x01,
// ...
HighPrecision = 0x08,
// ...
}
public enum CurrencyTypes public enum CurrencyTypes
{ {
JusticePoints = 395, JusticePoints = 395,
ValorPoints = 396, ValorPoints = 396,
ApexisCrystals = 823, ApexisCrystals = 823,
Azerite = 1553 Azerite = 1553,
AncientMana = 1155
} }
public enum PlayerCurrencyState public enum PlayerCurrencyState
+108
View File
@@ -60,6 +60,8 @@ namespace Framework.Constants
public const uint WarmodeEnlistedSpellOutside = 269083; public const uint WarmodeEnlistedSpellOutside = 269083;
public const uint SpellExperienceEliminated = 206662; public const uint SpellExperienceEliminated = 206662;
public const uint CurrencyMaxCapAncientMana = 2000;
} }
public struct MoneyConstants public struct MoneyConstants
@@ -818,4 +820,110 @@ namespace Framework.Constants
RatedPvPReward = 17, RatedPvPReward = 17,
CorruptedLoot = 19 CorruptedLoot = 19
} }
[Flags]
public enum CurrencyDbFlags
{
None = 0x00,
IgnoreMaxQtyOnload = 0x01,
Reuse1 = 0x02,
InBackpack = 0x04,
UnusedInUI = 0x08,
Reuse2 = 0x10,
UnusedFlags = (IgnoreMaxQtyOnload | Reuse1 | Reuse2),
ClientFlags = (0x1F & ~UnusedFlags)
}
public enum CurrencyDestroyReason
{
Cheat = 0,
Spell = 1,
VersionUpdate = 2,
QuestTurnin = 3,
Vendor = 4,
Trade = 5,
Capped = 6,
Garrison = 7,
DroppedToCorpse = 8,
BonusRoll = 9,
FactionConversion = 10,
FulfillCraftingOrder = 11,
Last = 12
}
public enum CurrencyGainSource
{
ConvertOldItem = 0,
ConvertOldPvPCurrency = 1,
ItemRefund = 2,
QuestReward = 3,
Cheat = 4,
Vendor = 5,
PvPKillCredit = 6,
PvPMetaCredit = 7,
PvPScriptedAward = 8,
Loot = 9,
UpdatingVersion = 10,
LFGReward = 11,
Trade = 12,
Spell = 13,
ItemDeletion = 14,
RatedBattleground = 15,
RandomBattleground = 16,
Arena = 17,
ExceededMaxQty = 18,
PvPCompletionBonus = 19,
Script = 20,
GuildBankWithdrawal = 21,
Pushloot = 22,
GarrisonBuilding = 23,
PvPDrop = 24,
GarrisonFollowerActivation = 25,
GarrisonBuildingRefund = 26,
GarrisonMissionReward = 27,
GarrisonResourceOverTime = 28,
QuestRewardIgnoreCaps = 29,
GarrisonTalent = 30,
GarrisonWorldQuestBonus = 31,
PvPHonorReward = 32,
BonusRoll = 33,
AzeriteRespec = 34,
WorldQuestReward = 35,
WorldQuestRewardIgnoreCaps = 36,
FactionConversion = 37,
DailyQuestReward = 38,
DailyQuestWarModeReward = 39,
WeeklyQuestReward = 40,
WeeklyQuestWarModeReward = 41,
AccountCopy = 42,
WeeklyRewardChest = 43,
GarrisonTalentTreeReset = 44,
DailyReset = 45,
AddConduitToCollection = 46,
Barbershop = 47,
ConvertItemsToCurrencyValue = 48,
PvPTeamContribution = 49,
Transmogrify = 50,
AuctionDeposit = 51,
PlayerTrait = 52,
PhBuffer_53 = 53,
PhBuffer_54 = 54,
RenownRepGain = 55,
CraftingOrder = 56,
CatalystBalancing = 57,
CatalystCraft = 58,
ProfessionInitialAward = 59,
PlayerTraitRefund = 60,
Last = 61
}
[Flags]
public enum CurrencyGainFlags
{
None = 0x00,
BonusAward = 0x01,
DroppedFromDeath = 0x02,
FromAccountServer = 0x04
}
} }
@@ -1635,13 +1635,9 @@ namespace Framework.Constants
CreatureFamilyFleeDelay, CreatureFamilyFleeDelay,
CreaturePickpocketRefill, CreaturePickpocketRefill,
CreatureStopForPlayer, CreatureStopForPlayer,
CurrencyMaxApexisCrystals,
CurrencyMaxJusticePoints,
CurrencyResetDay, CurrencyResetDay,
CurrencyResetHour, CurrencyResetHour,
CurrencyResetInterval, CurrencyResetInterval,
CurrencyStartApexisCrystals,
CurrencyStartJusticePoints,
DailyQuestResetTimeHour, DailyQuestResetTimeHour,
DbcEnforceItemAttributes, DbcEnforceItemAttributes,
DeathBonesBgOrArena, DeathBonesBgOrArena,
@@ -358,7 +358,7 @@ namespace Framework.Constants
ModMoneyGain = 348, // Modifies gold gains from source: [Misc = 0, Quests][Misc = 1, Loot] ModMoneyGain = 348, // Modifies gold gains from source: [Misc = 0, Quests][Misc = 1, Loot]
ModCurrencyGain = 349, ModCurrencyGain = 349,
Unk350 = 350, Unk350 = 350,
ModCurrencyCategoryGainPct = 351, //NYI ModCurrencyCategoryGainPct = 351,
Unk352 = 352, Unk352 = 352,
ModCamouflage = 353, // Nyi ModCamouflage = 353, // Nyi
ModHealingDonePctVersusTargetHealth = 354, // Restoration Shaman Mastery - Mod Healing Based On Target'S Health (Less = More Healing) ModHealingDonePctVersusTargetHealth = 354, // Restoration Shaman Mastery - Mod Healing Based On Target'S Health (Less = More Healing)
@@ -333,9 +333,9 @@ namespace Framework.Database
"VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); "VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
// Currency // Currency
PrepareStatement(CharStatements.SEL_PLAYER_CURRENCY, "SELECT Currency, Quantity, WeeklyQuantity, TrackedQuantity, Flags FROM character_currency WHERE CharacterGuid = ?"); PrepareStatement(CharStatements.SEL_PLAYER_CURRENCY, "SELECT Currency, Quantity, WeeklyQuantity, TrackedQuantity, IncreasedCapQuantity, EarnedQuantity, Flags FROM character_currency WHERE CharacterGuid = ?");
PrepareStatement(CharStatements.UPD_PLAYER_CURRENCY, "UPDATE character_currency SET Quantity = ?, WeeklyQuantity = ?, TrackedQuantity = ?, Flags = ? WHERE CharacterGuid = ? AND Currency = ?"); PrepareStatement(CharStatements.UPD_PLAYER_CURRENCY, "UPDATE character_currency SET Quantity = ?, WeeklyQuantity = ?, TrackedQuantity = ?, IncreasedCapQuantity = ?, EarnedQuantity = ?, Flags = ? WHERE CharacterGuid = ? AND Currency = ?");
PrepareStatement(CharStatements.REP_PLAYER_CURRENCY, "REPLACE INTO character_currency (CharacterGuid, Currency, Quantity, WeeklyQuantity, TrackedQuantity, Flags) VALUES (?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.REP_PLAYER_CURRENCY, "REPLACE INTO character_currency (CharacterGuid, Currency, Quantity, WeeklyQuantity, TrackedQuantity, IncreasedCapQuantity, EarnedQuantity, Flags) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_PLAYER_CURRENCY, "DELETE FROM character_currency WHERE CharacterGuid = ?"); PrepareStatement(CharStatements.DEL_PLAYER_CURRENCY, "DELETE FROM character_currency WHERE CharacterGuid = ?");
// Account data // Account data
+2 -2
View File
@@ -1904,7 +1904,7 @@ namespace Game.Achievements
break; break;
} }
case ModifierTreeType.PlayerHasTrackedCurrencyEqualOrGreaterThan: // 121 case ModifierTreeType.PlayerHasTrackedCurrencyEqualOrGreaterThan: // 121
if (referencePlayer.GetTrackedCurrencyCount(reqValue) < secondaryAsset) if (referencePlayer.GetCurrencyTrackedQuantity(reqValue) < secondaryAsset)
return false; return false;
break; break;
case ModifierTreeType.PlayerMapInstanceType: // 122 case ModifierTreeType.PlayerMapInstanceType: // 122
@@ -2665,7 +2665,7 @@ namespace Game.Achievements
return false; return false;
} }
case ModifierTreeType.PlayerHasCurrencyEqual: // 209 case ModifierTreeType.PlayerHasCurrencyEqual: // 209
if (referencePlayer.GetCurrency(reqValue) != secondaryAsset) if (referencePlayer.GetCurrencyQuantity(reqValue) != secondaryAsset)
return false; return false;
break; break;
case ModifierTreeType.MinimumAverageItemHighWaterMarkForSpec: // 210 NYI case ModifierTreeType.MinimumAverageItemHighWaterMarkForSpec: // 210 NYI
+1 -1
View File
@@ -655,7 +655,7 @@ namespace Game.Chat
if (amount == 0) if (amount == 0)
return false; return false;
target.ModifyCurrency(currencyId, (int)amount, true, true); target.ModifyCurrency(currencyId, (int)amount, CurrencyGainSource.Cheat, CurrencyDestroyReason.Cheat);
return true; return true;
} }
+1 -1
View File
@@ -2258,7 +2258,7 @@ namespace Game
for (var i = 0; i < condition.CurrencyID.Length; ++i) for (var i = 0; i < condition.CurrencyID.Length; ++i)
{ {
if (condition.CurrencyID[i] != 0) if (condition.CurrencyID[i] != 0)
results[i] = player.GetCurrency(condition.CurrencyID[i]) >= condition.CurrencyCount[i]; results[i] = player.GetCurrencyQuantity(condition.CurrencyID[i]) >= condition.CurrencyCount[i];
} }
if (!PlayerConditionLogic(condition.CurrencyLogic, results)) if (!PlayerConditionLogic(condition.CurrencyLogic, results))
@@ -538,6 +538,60 @@ namespace Game.DataStorage
public uint RechargingAmountPerCycle; public uint RechargingAmountPerCycle;
public uint RechargingCycleDurationMS; public uint RechargingCycleDurationMS;
public int[] Flags = new int[2]; public int[] Flags = new int[2];
public CurrencyTypesFlags GetFlags() { return (CurrencyTypesFlags)Flags[0]; }
public CurrencyTypesFlagsB GetFlagsB() { return (CurrencyTypesFlagsB)Flags[1]; }
// Helpers
public int GetScaler()
{
return GetFlags().HasFlag(CurrencyTypesFlags._100_Scaler) ? 100 : 1;
}
public bool HasMaxEarnablePerWeek()
{
return MaxEarnablePerWeek != 0 || GetFlags().HasFlag(CurrencyTypesFlags.ComputedWeeklyMaximum);
}
public bool HasMaxQuantity(bool onLoad = false, bool onUpdateVersion = false)
{
if (onLoad && GetFlags().HasFlag(CurrencyTypesFlags.IgnoreMaxQtyOnLoad))
return false;
if (onUpdateVersion && GetFlags().HasFlag(CurrencyTypesFlags.UpdateVersionIgnoreMax))
return false;
return MaxQty != 0 || MaxQtyWorldStateID != 0 || GetFlags().HasFlag(CurrencyTypesFlags.DynamicMaximum);
}
public bool HasTotalEarned()
{
return GetFlagsB().HasFlag(CurrencyTypesFlagsB.UseTotalEarnedForEarned);
}
public bool IsAlliance()
{
return GetFlags().HasFlag(CurrencyTypesFlags.IsAllianceOnly);
}
public bool IsHorde()
{
return GetFlags().HasFlag(CurrencyTypesFlags.IsHordeOnly);
}
public bool IsSuppressingChatLog(bool onUpdateVersion = false)
{
if ((onUpdateVersion && GetFlags().HasFlag(CurrencyTypesFlags.SuppressChatMessageOnVersionChange)) ||
GetFlags().HasFlag(CurrencyTypesFlags.SuppressChatMessages))
return true;
return false;
}
public bool IsTrackingQuantity()
{
return GetFlags().HasFlag(CurrencyTypesFlags.TrackQuantity);
}
} }
public sealed class CurveRecord public sealed class CurveRecord
+22 -16
View File
@@ -653,7 +653,9 @@ namespace Game.Entities
cur.Quantity = result.Read<uint>(1); cur.Quantity = result.Read<uint>(1);
cur.WeeklyQuantity = result.Read<uint>(2); cur.WeeklyQuantity = result.Read<uint>(2);
cur.TrackedQuantity = result.Read<uint>(3); cur.TrackedQuantity = result.Read<uint>(3);
cur.Flags = result.Read<byte>(4); cur.IncreasedCapQuantity = result.Read<uint>(4);
cur.EarnedQuantity = result.Read<uint>(5);
cur.Flags = (CurrencyDbFlags)result.Read<byte>(6);
_currencyStorage.Add(currencyID, cur); _currencyStorage.Add(currencyID, cur);
} while (result.NextRow()); } while (result.NextRow());
@@ -1946,39 +1948,43 @@ namespace Game.Entities
void _SaveCurrency(SQLTransaction trans) void _SaveCurrency(SQLTransaction trans)
{ {
PreparedStatement stmt; PreparedStatement stmt;
foreach (var pair in _currencyStorage) foreach (var (id, currency) in _currencyStorage)
{ {
CurrencyTypesRecord entry = CliDB.CurrencyTypesStorage.LookupByKey(pair.Key); CurrencyTypesRecord entry = CliDB.CurrencyTypesStorage.LookupByKey(id);
if (entry == null) // should never happen if (entry == null) // should never happen
continue; continue;
switch (pair.Value.state) switch (currency.state)
{ {
case PlayerCurrencyState.New: case PlayerCurrencyState.New:
stmt = CharacterDatabase.GetPreparedStatement(CharStatements.REP_PLAYER_CURRENCY); stmt = CharacterDatabase.GetPreparedStatement(CharStatements.REP_PLAYER_CURRENCY);
stmt.AddValue(0, GetGUID().GetCounter()); stmt.AddValue(0, GetGUID().GetCounter());
stmt.AddValue(1, pair.Key); stmt.AddValue(1, id);
stmt.AddValue(2, pair.Value.Quantity); stmt.AddValue(2, currency.Quantity);
stmt.AddValue(3, pair.Value.WeeklyQuantity); stmt.AddValue(3, currency.WeeklyQuantity);
stmt.AddValue(4, pair.Value.TrackedQuantity); stmt.AddValue(4, currency.TrackedQuantity);
stmt.AddValue(5, pair.Value.Flags); stmt.AddValue(5, currency.IncreasedCapQuantity);
stmt.AddValue(6, currency.EarnedQuantity);
stmt.AddValue(7, (byte)currency.Flags);
trans.Append(stmt); trans.Append(stmt);
break; break;
case PlayerCurrencyState.Changed: case PlayerCurrencyState.Changed:
stmt = CharacterDatabase.GetPreparedStatement(CharStatements.UPD_PLAYER_CURRENCY); stmt = CharacterDatabase.GetPreparedStatement(CharStatements.UPD_PLAYER_CURRENCY);
stmt.AddValue(0, pair.Value.Quantity); stmt.AddValue(0, currency.Quantity);
stmt.AddValue(1, pair.Value.WeeklyQuantity); stmt.AddValue(1, currency.WeeklyQuantity);
stmt.AddValue(2, pair.Value.TrackedQuantity); stmt.AddValue(2, currency.TrackedQuantity);
stmt.AddValue(3, pair.Value.Flags); stmt.AddValue(3, currency.IncreasedCapQuantity);
stmt.AddValue(4, GetGUID().GetCounter()); stmt.AddValue(4, currency.EarnedQuantity);
stmt.AddValue(5, pair.Key); stmt.AddValue(5, (byte)currency.Flags);
stmt.AddValue(6, GetGUID().GetCounter());
stmt.AddValue(7, id);
trans.Append(stmt); trans.Append(stmt);
break; break;
default: default:
break; break;
} }
pair.Value.state = PlayerCurrencyState.Unchanged; currency.state = PlayerCurrencyState.Unchanged;
} }
} }
+3 -1
View File
@@ -346,7 +346,9 @@ namespace Game.Entities
public uint Quantity; public uint Quantity;
public uint WeeklyQuantity; public uint WeeklyQuantity;
public uint TrackedQuantity; public uint TrackedQuantity;
public byte Flags; public uint IncreasedCapQuantity;
public uint EarnedQuantity;
public CurrencyDbFlags Flags;
} }
public class SpecializationInfo public class SpecializationInfo
+4 -4
View File
@@ -122,7 +122,7 @@ namespace Game.Entities
uint count = iece.CurrencyCount[i]; uint count = iece.CurrencyCount[i];
uint currencyid = iece.CurrencyID[i]; uint currencyid = iece.CurrencyID[i];
if (count != 0 && currencyid != 0) if (count != 0 && currencyid != 0)
ModifyCurrency(currencyid, (int)count, true, true); AddCurrency(currencyid, count, CurrencyGainSource.ItemRefund);
} }
// Grant back money // Grant back money
@@ -2452,7 +2452,7 @@ namespace Game.Entities
continue; continue;
if (iece.CurrencyID[i] != 0) if (iece.CurrencyID[i] != 0)
ModifyCurrency(iece.CurrencyID[i], -(int)(iece.CurrencyCount[i] * stacks), true, true); RemoveCurrency(iece.CurrencyID[i], (int)(iece.CurrencyCount[i] * stacks), CurrencyDestroyReason.Vendor);
} }
} }
@@ -3178,7 +3178,7 @@ namespace Game.Entities
return false; return false;
} }
ModifyCurrency(currency, (int)count, true, true); AddCurrency(currency, count, CurrencyGainSource.Vendor);
if (iece != null) if (iece != null)
{ {
for (byte i = 0; i < ItemConst.MaxItemExtCostItems; ++i) for (byte i = 0; i < ItemConst.MaxItemExtCostItems; ++i)
@@ -3197,7 +3197,7 @@ namespace Game.Entities
if (iece.Flags.HasAnyFlag((byte)((uint)ItemExtendedCostFlags.RequireSeasonEarned1 << i))) if (iece.Flags.HasAnyFlag((byte)((uint)ItemExtendedCostFlags.RequireSeasonEarned1 << i)))
continue; continue;
ModifyCurrency(iece.CurrencyID[i], -(int)(iece.CurrencyCount[i] * stacks), false, true); RemoveCurrency(iece.CurrencyID[i], (int)(iece.CurrencyCount[i] * stacks), CurrencyDestroyReason.Vendor);
} }
} }
+1 -1
View File
@@ -235,7 +235,7 @@ namespace Game.Entities
var rewardCurrencyTypes = Global.DB2Mgr.GetRewardPackCurrencyTypesByRewardID(rewardPackEntry.Id); var rewardCurrencyTypes = Global.DB2Mgr.GetRewardPackCurrencyTypesByRewardID(rewardPackEntry.Id);
foreach (RewardPackXCurrencyTypeRecord currency in rewardCurrencyTypes) foreach (RewardPackXCurrencyTypeRecord currency in rewardCurrencyTypes)
ModifyCurrency(currency.CurrencyTypeID, currency.Quantity); AddCurrency(currency.CurrencyTypeID, (uint)currency.Quantity/* TODO: CurrencyGainSource */);
var rewardPackXItems = Global.DB2Mgr.GetRewardPackItemsByRewardID(rewardPackEntry.Id); var rewardPackXItems = Global.DB2Mgr.GetRewardPackItemsByRewardID(rewardPackEntry.Id);
foreach (RewardPackXItemRecord rewardPackXItem in rewardPackXItems) foreach (RewardPackXItemRecord rewardPackXItem in rewardPackXItems)
+13 -5
View File
@@ -968,7 +968,7 @@ namespace Game.Entities
DestroyItemCount((uint)obj.ObjectID, (uint)obj.Amount, true); DestroyItemCount((uint)obj.ObjectID, (uint)obj.Amount, true);
break; break;
case QuestObjectiveType.Currency: case QuestObjectiveType.Currency:
ModifyCurrency((uint)obj.ObjectID, -obj.Amount, false, true); RemoveCurrency((uint)obj.ObjectID, obj.Amount, CurrencyDestroyReason.QuestTurnin);
break; break;
} }
} }
@@ -1006,6 +1006,14 @@ namespace Game.Entities
} }
} }
CurrencyGainSource currencyGainSource = CurrencyGainSource.QuestReward;
if (quest.IsDaily())
currencyGainSource = CurrencyGainSource.DailyQuestReward;
else if (quest.IsWeekly())
currencyGainSource = CurrencyGainSource.WeeklyQuestReward;
else if (quest.IsWorldQuest())
currencyGainSource = CurrencyGainSource.WorldQuestReward;
switch (rewardType) switch (rewardType)
{ {
case LootItemType.Item: case LootItemType.Item:
@@ -1036,7 +1044,7 @@ namespace Game.Entities
{ {
for (uint i = 0; i < SharedConst.QuestRewardChoicesCount; ++i) for (uint i = 0; i < SharedConst.QuestRewardChoicesCount; ++i)
if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemType[i] == LootItemType.Currency && quest.RewardChoiceItemId[i] == rewardId) if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemType[i] == LootItemType.Currency && quest.RewardChoiceItemId[i] == rewardId)
ModifyCurrency(quest.RewardChoiceItemId[i], (int)quest.RewardChoiceItemCount[i]); AddCurrency(quest.RewardChoiceItemId[i], quest.RewardChoiceItemCount[i], currencyGainSource);
} }
break; break;
} }
@@ -1044,7 +1052,7 @@ namespace Game.Entities
for (byte i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i) for (byte i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
{ {
if (quest.RewardCurrencyId[i] != 0) if (quest.RewardCurrencyId[i] != 0)
ModifyCurrency(quest.RewardCurrencyId[i], (int)quest.RewardCurrencyCount[i]); AddCurrency(quest.RewardCurrencyId[i], quest.RewardCurrencyCount[i], currencyGainSource);
} }
uint skill = quest.RewardSkillId; uint skill = quest.RewardSkillId;
@@ -2139,7 +2147,7 @@ namespace Game.Entities
else if (obj.Type == QuestObjectiveType.HaveCurrency) else if (obj.Type == QuestObjectiveType.HaveCurrency)
{ {
uint reqCurrencyCount = (uint)obj.Amount; uint reqCurrencyCount = (uint)obj.Amount;
uint curCurrencyCount = GetCurrency((uint)obj.ObjectID); uint curCurrencyCount = GetCurrencyQuantity((uint)obj.ObjectID);
SetQuestObjectiveData(obj, (int)Math.Min(reqCurrencyCount, curCurrencyCount)); SetQuestObjectiveData(obj, (int)Math.Min(reqCurrencyCount, curCurrencyCount));
} }
} }
@@ -2489,7 +2497,7 @@ namespace Game.Entities
switch (objectiveType) switch (objectiveType)
{ {
case QuestObjectiveType.Currency: case QuestObjectiveType.Currency:
objectiveIsNowComplete = GetCurrency((uint)objectId) + addCount >= objective.Amount; objectiveIsNowComplete = GetCurrencyQuantity((uint)objectId) + addCount >= objective.Amount;
break; break;
case QuestObjectiveType.LearnSpell: case QuestObjectiveType.LearnSpell:
objectiveIsNowComplete = addCount != 0; objectiveIsNowComplete = addCount != 0;
@@ -1043,7 +1043,7 @@ namespace Game.Entities
ModifyMoney(-amount); ModifyMoney(-amount);
break; break;
case TraitCurrencyType.CurrencyTypesBased: case TraitCurrencyType.CurrencyTypesBased:
ModifyCurrency((uint)traitCurrency.CurrencyTypesID, -amount); RemoveCurrency((uint)traitCurrency.CurrencyTypesID, amount /* TODO: CurrencyDestroyReason */);
break; break;
default: default:
break; break;
+300 -215
View File
@@ -243,8 +243,6 @@ namespace Game.Entities
InitRunes(); InitRunes();
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Coinage), (ulong)WorldConfig.GetIntValue(WorldCfg.StartPlayerMoney)); SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.Coinage), (ulong)WorldConfig.GetIntValue(WorldCfg.StartPlayerMoney));
SetCreateCurrency(CurrencyTypes.ApexisCrystals, WorldConfig.GetUIntValue(WorldCfg.CurrencyStartApexisCrystals));
SetCreateCurrency(CurrencyTypes.JusticePoints, WorldConfig.GetUIntValue(WorldCfg.CurrencyStartJusticePoints));
// Played time // Played time
m_Last_tick = GameTime.GetGameTime(); m_Last_tick = GameTime.GetGameTime();
@@ -1083,23 +1081,223 @@ namespace Game.Entities
SendPacket(petSpells); SendPacket(petSpells);
} }
//Currency - Money //Currency
void SetCreateCurrency(CurrencyTypes id, uint count, bool printLog = true) void SetCreateCurrency(CurrencyTypes id, uint amount)
{ {
var playerCurrency = _currencyStorage.LookupByKey(id); SetCreateCurrency((uint)id, amount);
if (playerCurrency == null) }
void SetCreateCurrency(uint id, uint amount)
{
if (!_currencyStorage.ContainsKey(id))
{ {
PlayerCurrency cur = new(); PlayerCurrency playerCurrency = new();
cur.state = PlayerCurrencyState.New; playerCurrency.state = PlayerCurrencyState.New;
cur.Quantity = count; playerCurrency.Quantity = amount;
cur.WeeklyQuantity = 0; _currencyStorage.Add(id, playerCurrency);
cur.TrackedQuantity = 0;
cur.Flags = 0;
_currencyStorage[(uint)id] = cur;
} }
} }
public uint GetCurrency(uint id) public void ModifyCurrency(uint id, int amount, CurrencyGainSource gainSource = CurrencyGainSource.Cheat, CurrencyDestroyReason destroyReason = CurrencyDestroyReason.Cheat)
{
if (amount == 0)
return;
CurrencyTypesRecord currency = CliDB.CurrencyTypesStorage.LookupByKey(id);
Cypher.Assert(currency != null);
// Check faction
if ((currency.IsAlliance() && GetTeam() != Team.Alliance) ||
(currency.IsHorde() && GetTeam() != Team.Horde))
return;
// Check award condition
if (currency.AwardConditionID != 0)
{
PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(currency.AwardConditionID);
if (playerCondition != null && !ConditionManager.IsPlayerMeetingCondition(this, playerCondition))
return;
}
bool isGainOnRefund = false;
if (gainSource == CurrencyGainSource.ItemRefund ||
gainSource == CurrencyGainSource.GarrisonBuildingRefund ||
gainSource == CurrencyGainSource.PlayerTraitRefund)
isGainOnRefund = true;
if (amount > 0 && !isGainOnRefund && gainSource != CurrencyGainSource.Vendor)
{
amount = (int)(amount * GetTotalAuraMultiplierByMiscValue(AuraType.ModCurrencyGain, (int)id));
amount = (int)(amount * GetTotalAuraMultiplierByMiscValue(AuraType.ModCurrencyCategoryGainPct, currency.CategoryID));
}
int scaler = currency.GetScaler();
// Currency that is immediately converted into reputation with that faction instead
FactionRecord factionEntry = CliDB.FactionStorage.LookupByKey(currency.FactionID);
if (factionEntry != null)
{
amount /= scaler;
GetReputationMgr().ModifyReputation(factionEntry, amount, false, true);
return;
}
// Azerite
if (id == (uint)CurrencyTypes.Azerite)
{
if (amount > 0)
{
Item heartOfAzeroth = GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere);
if (heartOfAzeroth != null)
heartOfAzeroth.ToAzeriteItem().GiveXP((ulong)amount);
}
return;
}
var playerCurrency = _currencyStorage.LookupByKey(id);
if (playerCurrency == null)
{
playerCurrency = new();
playerCurrency.state = PlayerCurrencyState.New;
_currencyStorage.Add(id, playerCurrency);
}
// Weekly cap
uint weeklyCap = GetCurrencyWeeklyCap(currency);
if (weeklyCap != 0 && amount > 0 && (playerCurrency.WeeklyQuantity + amount) > weeklyCap)
if (!isGainOnRefund) // Ignore weekly cap for refund
amount = (int)(weeklyCap - playerCurrency.WeeklyQuantity);
// Max cap
uint maxCap = GetCurrencyMaxQuantity(currency, false, gainSource == CurrencyGainSource.UpdatingVersion);
if (maxCap != 0 && amount > 0 && (playerCurrency.Quantity + amount) > maxCap)
amount = (int)(maxCap - playerCurrency.Quantity);
// Underflow protection
if (amount < 0 && Math.Abs(amount) > playerCurrency.Quantity)
amount = (int)(playerCurrency.Quantity * -1);
if (amount == 0)
return;
if (playerCurrency.state != PlayerCurrencyState.New)
playerCurrency.state = PlayerCurrencyState.Changed;
playerCurrency.Quantity += (uint)amount;
if (amount > 0 && !isGainOnRefund) // Ignore total values update for refund
{
if (weeklyCap != 0)
playerCurrency.WeeklyQuantity += (uint)amount;
if (currency.IsTrackingQuantity())
playerCurrency.TrackedQuantity += (uint)amount;
if (currency.HasTotalEarned())
playerCurrency.EarnedQuantity += (uint)amount;
UpdateCriteria(CriteriaType.CurrencyGained, id, (ulong)amount);
}
CurrencyChanged(id, amount);
SetCurrency packet = new();
packet.Type = currency.Id;
packet.Quantity = (int)playerCurrency.Quantity;
packet.Flags = CurrencyGainFlags.None; // TODO: Check when flags are applied
if ((playerCurrency.WeeklyQuantity / currency.GetScaler()) > 0)
packet.WeeklyQuantity = (int)playerCurrency.WeeklyQuantity;
if (currency.HasMaxQuantity(false, gainSource == CurrencyGainSource.UpdatingVersion))
packet.MaxQuantity = (int)GetCurrencyMaxQuantity(currency);
if (currency.HasTotalEarned())
packet.TotalEarned = (int)playerCurrency.EarnedQuantity;
packet.SuppressChatLog = currency.IsSuppressingChatLog(gainSource == CurrencyGainSource.UpdatingVersion);
packet.QuantityChange = amount;
if (amount > 0)
packet.QuantityGainSource = gainSource;
else
packet.QuantityLostSource = destroyReason;
// TODO: FirstCraftOperationID, LastSpendTime & Toasts
SendPacket(packet);
}
public void AddCurrency(uint id, uint amount, CurrencyGainSource gainSource = CurrencyGainSource.Cheat)
{
ModifyCurrency(id, (int)amount, gainSource);
}
public void RemoveCurrency(uint id, int amount, CurrencyDestroyReason destroyReason = CurrencyDestroyReason.Cheat)
{
ModifyCurrency(id, -amount, default, destroyReason);
}
public void IncreaseCurrencyCap(uint id, uint amount)
{
if (amount == 0)
return;
CurrencyTypesRecord currency = CliDB.CurrencyTypesStorage.LookupByKey(id);
Cypher.Assert(currency != null);
// Check faction
if ((currency.IsAlliance() && GetTeam() != Team.Alliance) ||
(currency.IsHorde() && GetTeam() != Team.Horde))
return;
// Check dynamic maximum flag
if (!currency.GetFlags().HasFlag(CurrencyTypesFlags.DynamicMaximum))
return;
// Ancient mana maximum cap
if (id == (uint)CurrencyTypes.AncientMana)
{
uint maxQuantity = GetCurrencyMaxQuantity(currency);
if ((maxQuantity + amount) > PlayerConst.CurrencyMaxCapAncientMana)
amount = PlayerConst.CurrencyMaxCapAncientMana - maxQuantity;
}
var playerCurrency = _currencyStorage.LookupByKey(id);
if (playerCurrency == null)
{
playerCurrency = new();
playerCurrency.state = PlayerCurrencyState.New;
playerCurrency.IncreasedCapQuantity = amount;
_currencyStorage[id] = playerCurrency;
}
else
{
playerCurrency.IncreasedCapQuantity += amount;
}
if (playerCurrency.state != PlayerCurrencyState.New)
playerCurrency.state = PlayerCurrencyState.Changed;
SetCurrency packet = new();
packet.Type = currency.Id;
packet.Quantity = (int)playerCurrency.Quantity;
packet.Flags = CurrencyGainFlags.None;
if ((playerCurrency.WeeklyQuantity / currency.GetScaler()) > 0)
packet.WeeklyQuantity = (int)playerCurrency.WeeklyQuantity;
if (currency.IsTrackingQuantity())
packet.TrackedQuantity = (int)playerCurrency.TrackedQuantity;
packet.MaxQuantity = (int)GetCurrencyMaxQuantity(currency);
packet.SuppressChatLog = currency.IsSuppressingChatLog();
SendPacket(packet);
}
public uint GetCurrencyQuantity(uint id)
{ {
var playerCurrency = _currencyStorage.LookupByKey(id); var playerCurrency = _currencyStorage.LookupByKey(id);
if (playerCurrency == null) if (playerCurrency == null)
@@ -1108,169 +1306,7 @@ namespace Game.Entities
return playerCurrency.Quantity; return playerCurrency.Quantity;
} }
public void ModifyCurrency(uint id, int count, bool printLog = true, bool ignoreMultipliers = false) public uint GetCurrencyWeeklyQuantity(uint id)
{
if (count == 0)
return;
CurrencyTypesRecord currency = CliDB.CurrencyTypesStorage.LookupByKey(id);
Cypher.Assert(currency != null);
if (!ignoreMultipliers)
count *= (int)GetTotalAuraMultiplierByMiscValue(AuraType.ModCurrencyGain, (int)id);
// Currency that is immediately converted into reputation with that faction instead
FactionRecord factionEntry = CliDB.FactionStorage.LookupByKey(currency.FactionID);
if (factionEntry != null)
{
if (currency.Flags[0].HasAnyFlag((int)CurrencyFlags.HighPrecision))
count /= 100;
GetReputationMgr().ModifyReputation(factionEntry, count, false, true);
return;
}
if (id == (uint)CurrencyTypes.Azerite)
{
if (count > 0)
{
Item heartOfAzeroth = GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere);
if (heartOfAzeroth != null)
heartOfAzeroth.ToAzeriteItem().GiveXP((ulong)count);
}
return;
}
uint oldTotalCount = 0;
uint oldWeekCount = 0;
uint oldTrackedCount = 0;
var playerCurrency = _currencyStorage.LookupByKey(id);
if (playerCurrency == null)
{
PlayerCurrency cur = new();
cur.state = PlayerCurrencyState.New;
cur.Quantity = 0;
cur.WeeklyQuantity = 0;
cur.TrackedQuantity = 0;
cur.Flags = 0;
_currencyStorage[id] = cur;
playerCurrency = _currencyStorage.LookupByKey(id);
}
else
{
oldTotalCount = playerCurrency.Quantity;
oldWeekCount = playerCurrency.WeeklyQuantity;
oldTrackedCount = playerCurrency.TrackedQuantity;
}
// count can't be more then weekCap if used (weekCap > 0)
uint weekCap = GetCurrencyWeekCap(currency);
if (weekCap != 0 && count > weekCap)
count = (int)weekCap;
// count can't be more then totalCap if used (totalCap > 0)
uint totalCap = GetCurrencyTotalCap(currency);
if (totalCap != 0 && count > totalCap)
count = (int)totalCap;
int newTrackedCount = (int)(oldTrackedCount) + (count > 0 ? count : 0);
if (newTrackedCount < 0)
newTrackedCount = 0;
int newTotalCount = (int)oldTotalCount + count;
if (newTotalCount < 0)
newTotalCount = 0;
int newWeekCount = (int)oldWeekCount + (count > 0 ? count : 0);
if (newWeekCount < 0)
newWeekCount = 0;
// if we get more then weekCap just set to limit
if (weekCap != 0 && weekCap < newWeekCount)
{
newWeekCount = (int)weekCap;
// weekCap - oldWeekCount always >= 0 as we set limit before!
newTotalCount = (int)(oldTotalCount + (weekCap - oldWeekCount));
}
// if we get more then totalCap set to maximum;
if (totalCap != 0 && totalCap < newTotalCount)
{
newTotalCount = (int)totalCap;
newWeekCount = (int)weekCap;
}
if (newTotalCount != oldTotalCount)
{
if (playerCurrency.state != PlayerCurrencyState.New)
playerCurrency.state = PlayerCurrencyState.Changed;
CurrencyChanged(id, count);
playerCurrency.Quantity = (uint)newTotalCount;
playerCurrency.WeeklyQuantity = (uint)newWeekCount;
playerCurrency.TrackedQuantity = (uint)newTrackedCount;
if (count > 0)
UpdateCriteria(CriteriaType.CurrencyGained, id, (uint)count);
_currencyStorage[id] = playerCurrency;
SetCurrency packet = new();
packet.Type = id;
packet.Quantity = newTotalCount;
packet.SuppressChatLog = !printLog;
packet.WeeklyQuantity = newWeekCount;
packet.TrackedQuantity = newTrackedCount;
packet.Flags = playerCurrency.Flags;
packet.QuantityChange = count;
SendPacket(packet);
}
}
public bool HasCurrency(uint id, uint count)
{
var playerCurrency = _currencyStorage.LookupByKey(id);
return playerCurrency != null && playerCurrency.Quantity >= count;
}
public uint GetCurrencyWeekCap(CurrencyTypes id)
{
CurrencyTypesRecord entry = CliDB.CurrencyTypesStorage.LookupByKey((uint)id);
if (entry == null)
return 0;
return GetCurrencyWeekCap(entry);
}
public uint GetCurrencyWeekCap(CurrencyTypesRecord currency)
{
return currency.MaxEarnablePerWeek;
}
uint GetCurrencyTotalCap(CurrencyTypesRecord currency)
{
uint cap = currency.MaxQty;
switch ((CurrencyTypes)currency.Id)
{
case CurrencyTypes.ApexisCrystals:
{
uint apexiscap = WorldConfig.GetUIntValue(WorldCfg.CurrencyMaxApexisCrystals);
if (apexiscap > 0)
cap = apexiscap;
break;
}
case CurrencyTypes.JusticePoints:
{
uint justicecap = WorldConfig.GetUIntValue(WorldCfg.CurrencyMaxJusticePoints);
if (justicecap > 0)
cap = justicecap;
break;
}
}
return cap;
}
uint GetCurrencyOnWeek(CurrencyTypes id)
{ {
var playerCurrency = _currencyStorage.LookupByKey(id); var playerCurrency = _currencyStorage.LookupByKey(id);
if (playerCurrency == null) if (playerCurrency == null)
@@ -1278,12 +1314,60 @@ namespace Game.Entities
return playerCurrency.WeeklyQuantity; return playerCurrency.WeeklyQuantity;
} }
public uint GetTrackedCurrencyCount(uint id)
public uint GetCurrencyTrackedQuantity(uint id)
{ {
if (!_currencyStorage.ContainsKey(id)) var playerCurrency = _currencyStorage.LookupByKey(id);
if (playerCurrency == null)
return 0; return 0;
return _currencyStorage[id].TrackedQuantity; return playerCurrency.TrackedQuantity;
}
uint GetCurrencyIncreasedCapQuantity(uint id)
{
var playerCurrency = _currencyStorage.LookupByKey(id);
if (playerCurrency == null)
return 0;
return playerCurrency.IncreasedCapQuantity;
}
public uint GetCurrencyMaxQuantity(CurrencyTypesRecord currency, bool onLoad = false, bool onUpdateVersion = false)
{
if (!currency.HasMaxQuantity(onLoad, onUpdateVersion))
return 0;
uint maxQuantity = currency.MaxQty;
if (currency.MaxQtyWorldStateID != 0)
maxQuantity = (uint)Global.WorldStateMgr.GetValue(currency.MaxQtyWorldStateID, GetMap());
uint increasedCap = 0;
if (currency.GetFlags().HasFlag(CurrencyTypesFlags.DynamicMaximum))
increasedCap = GetCurrencyIncreasedCapQuantity(currency.Id);
return maxQuantity + increasedCap;
}
uint GetCurrencyWeeklyCap(uint id)
{
CurrencyTypesRecord currency = CliDB.CurrencyTypesStorage.LookupByKey(id);
if (currency == null)
return 0;
return GetCurrencyWeeklyCap(currency);
}
uint GetCurrencyWeeklyCap(CurrencyTypesRecord currency)
{
// TODO: CurrencyTypeFlags::ComputedWeeklyMaximum
return currency.MaxEarnablePerWeek;
}
public bool HasCurrency(uint id, uint amount)
{
var playerCurrency = _currencyStorage.LookupByKey(id);
return playerCurrency != null && playerCurrency.Quantity >= amount;
} }
//Action Buttons - CUF Profile //Action Buttons - CUF Profile
@@ -5796,49 +5880,50 @@ namespace Game.Entities
return true; return true;
} }
void SendNewCurrency(uint id)
{
var Curr = _currencyStorage.LookupByKey(id);
if (Curr == null)
return;
CurrencyTypesRecord entry = CliDB.CurrencyTypesStorage.LookupByKey(id);
if (entry == null) // should never happen
return;
SetupCurrency packet = new();
SetupCurrency.Record record = new();
record.Type = entry.Id;
record.Quantity = Curr.Quantity;
record.WeeklyQuantity = Curr.WeeklyQuantity;
record.MaxWeeklyQuantity = GetCurrencyWeekCap(entry);
record.TrackedQuantity = Curr.TrackedQuantity;
record.Flags = Curr.Flags;
packet.Data.Add(record);
SendPacket(packet);
}
void SendCurrencies() void SendCurrencies()
{ {
SetupCurrency packet = new(); SetupCurrency packet = new();
foreach (var pair in _currencyStorage) foreach (var (id, currency) in _currencyStorage)
{ {
CurrencyTypesRecord entry = CliDB.CurrencyTypesStorage.LookupByKey(pair.Key); CurrencyTypesRecord currencyRecord = CliDB.CurrencyTypesStorage.LookupByKey(id);
if (currencyRecord == null)
// not send init meta currencies.
if (entry == null || entry.CategoryID == 89) //CURRENCY_CATEGORY_META_CONQUEST
continue; continue;
// Check faction
if ((currencyRecord.IsAlliance() && GetTeam() != Team.Alliance) ||
(currencyRecord.IsHorde() && GetTeam() != Team.Horde))
continue;
// Check award condition
if (currencyRecord.AwardConditionID != 0)
{
PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(currencyRecord.AwardConditionID);
if (playerCondition != null && !ConditionManager.IsPlayerMeetingCondition(this, playerCondition))
continue;
}
SetupCurrency.Record record = new(); SetupCurrency.Record record = new();
record.Type = entry.Id; record.Type = currencyRecord.Id;
record.Quantity = pair.Value.Quantity; record.Quantity = currency.Quantity;
record.WeeklyQuantity = pair.Value.WeeklyQuantity;
record.MaxWeeklyQuantity = GetCurrencyWeekCap(entry); if ((currency.WeeklyQuantity / currencyRecord.GetScaler()) > 0)
record.TrackedQuantity = pair.Value.TrackedQuantity; record.WeeklyQuantity = currency.WeeklyQuantity;
record.Flags = pair.Value.Flags;
if (currencyRecord.HasMaxEarnablePerWeek())
record.MaxWeeklyQuantity = GetCurrencyWeeklyCap(currencyRecord);
if (currencyRecord.IsTrackingQuantity())
record.TrackedQuantity = currency.TrackedQuantity;
if (currencyRecord.HasTotalEarned())
record.TotalEarned = (int)currency.EarnedQuantity;
if (currencyRecord.HasMaxQuantity(true))
record.MaxQuantity = (int)GetCurrencyMaxQuantity(currencyRecord, true);
record.Flags = (byte)currency.Flags;
record.Flags = (byte)(record.Flags & ~(int)CurrencyDbFlags.UnusedFlags);
packet.Data.Add(record); packet.Data.Add(record);
} }
+2 -2
View File
@@ -369,7 +369,7 @@ namespace Game.Garrisons
map.AddToMap(go); map.AddToMap(go);
} }
_owner.ModifyCurrency(building.CurrencyTypeID, -building.CurrencyQty, false, true); _owner.RemoveCurrency(building.CurrencyTypeID, building.CurrencyQty, CurrencyDestroyReason.Garrison);
_owner.ModifyMoney(-building.GoldCost * MoneyConstants.Gold, false); _owner.ModifyMoney(-building.GoldCost * MoneyConstants.Gold, false);
if (oldBuildingId != 0) if (oldBuildingId != 0)
@@ -409,7 +409,7 @@ namespace Game.Garrisons
GarrBuildingRecord constructing = CliDB.GarrBuildingStorage.LookupByKey(buildingRemoved.GarrBuildingID); GarrBuildingRecord constructing = CliDB.GarrBuildingStorage.LookupByKey(buildingRemoved.GarrBuildingID);
// Refund construction/upgrade cost // Refund construction/upgrade cost
_owner.ModifyCurrency(constructing.CurrencyTypeID, constructing.CurrencyQty, false, true); _owner.AddCurrency(constructing.CurrencyTypeID, (uint)constructing.CurrencyQty, CurrencyGainSource.GarrisonBuildingRefund);
_owner.ModifyMoney(constructing.GoldCost * MoneyConstants.Gold, false); _owner.ModifyMoney(constructing.GoldCost * MoneyConstants.Gold, false);
if (constructing.UpgradeLevel > 1) if (constructing.UpgradeLevel > 1)
+15 -10
View File
@@ -91,15 +91,20 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WriteUInt32(Type); _worldPacket.WriteUInt32(Type);
_worldPacket.WriteInt32(Quantity); _worldPacket.WriteInt32(Quantity);
_worldPacket.WriteUInt32(Flags); _worldPacket.WriteUInt32((uint)Flags);
_worldPacket.WriteInt32(Toasts.Count);
foreach (var toast in Toasts)
toast.Write(_worldPacket);
_worldPacket.WriteBit(WeeklyQuantity.HasValue); _worldPacket.WriteBit(WeeklyQuantity.HasValue);
_worldPacket.WriteBit(TrackedQuantity.HasValue); _worldPacket.WriteBit(TrackedQuantity.HasValue);
_worldPacket.WriteBit(MaxQuantity.HasValue); _worldPacket.WriteBit(MaxQuantity.HasValue);
_worldPacket.WriteBit(TotalEarned.HasValue); _worldPacket.WriteBit(TotalEarned.HasValue);
_worldPacket.WriteBit(SuppressChatLog); _worldPacket.WriteBit(SuppressChatLog);
_worldPacket.WriteBit(QuantityChange.HasValue); _worldPacket.WriteBit(QuantityChange.HasValue);
_worldPacket.WriteBit(QuantityLostSource.HasValue);
_worldPacket.WriteBit(QuantityGainSource.HasValue); _worldPacket.WriteBit(QuantityGainSource.HasValue);
_worldPacket.WriteBit(QuantityLostSource.HasValue);
_worldPacket.WriteBit(FirstCraftOperationID.HasValue); _worldPacket.WriteBit(FirstCraftOperationID.HasValue);
_worldPacket.WriteBit(LastSpendTime.HasValue); _worldPacket.WriteBit(LastSpendTime.HasValue);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
@@ -119,11 +124,11 @@ namespace Game.Networking.Packets
if (QuantityChange.HasValue) if (QuantityChange.HasValue)
_worldPacket.WriteInt32(QuantityChange.Value); _worldPacket.WriteInt32(QuantityChange.Value);
if (QuantityLostSource.HasValue)
_worldPacket.WriteInt32(QuantityLostSource.Value);
if (QuantityGainSource.HasValue) if (QuantityGainSource.HasValue)
_worldPacket.WriteInt32(QuantityGainSource.Value); _worldPacket.WriteInt32((int)QuantityGainSource.Value);
if (QuantityLostSource.HasValue)
_worldPacket.WriteInt32((int)QuantityLostSource.Value);
if (FirstCraftOperationID.HasValue) if (FirstCraftOperationID.HasValue)
_worldPacket.WriteUInt32(FirstCraftOperationID.Value); _worldPacket.WriteUInt32(FirstCraftOperationID.Value);
@@ -134,15 +139,15 @@ namespace Game.Networking.Packets
public uint Type; public uint Type;
public int Quantity; public int Quantity;
public uint Flags; public CurrencyGainFlags Flags;
public List<UiEventToast> Toasts = new(); public List<UiEventToast> Toasts = new();
public int? WeeklyQuantity; public int? WeeklyQuantity;
public int? TrackedQuantity; public int? TrackedQuantity;
public int? MaxQuantity; public int? MaxQuantity;
public int? TotalEarned; public int? TotalEarned;
public int? QuantityChange; public int? QuantityChange;
public int? QuantityGainSource; public CurrencyGainSource? QuantityGainSource;
public int? QuantityLostSource; public CurrencyDestroyReason? QuantityLostSource;
public uint? FirstCraftOperationID; public uint? FirstCraftOperationID;
public long? LastSpendTime; public long? LastSpendTime;
public bool SuppressChatLog; public bool SuppressChatLog;
@@ -223,7 +228,7 @@ namespace Game.Networking.Packets
public int? MaxQuantity; public int? MaxQuantity;
public int? TotalEarned; public int? TotalEarned;
public long? LastSpendTime; public long? LastSpendTime;
public byte Flags; // 0 = none, public byte Flags;
} }
} }
+5 -4
View File
@@ -221,7 +221,7 @@ namespace Game
CurrencyTypesRecord currency = CliDB.CurrencyTypesStorage.LookupByKey(renownFactionEntry.RenownCurrencyID); CurrencyTypesRecord currency = CliDB.CurrencyTypesStorage.LookupByKey(renownFactionEntry.RenownCurrencyID);
if (currency != null) if (currency != null)
return (int)_player.GetCurrency(currency.Id); return (int)_player.GetCurrencyQuantity(currency.Id);
return 0; return 0;
} }
@@ -245,7 +245,7 @@ namespace Game
CurrencyTypesRecord currency = CliDB.CurrencyTypesStorage.LookupByKey(renownFactionEntry.RenownCurrencyID); CurrencyTypesRecord currency = CliDB.CurrencyTypesStorage.LookupByKey(renownFactionEntry.RenownCurrencyID);
if (currency != null) if (currency != null)
return (int)currency.MaxQty; return (int)_player.GetCurrencyMaxQuantity(currency);
return 0; return 0;
} }
@@ -481,7 +481,7 @@ namespace Game
if (factionState != null) if (factionState != null)
{ {
// Ignore renown reputation already raised to the maximum level // Ignore renown reputation already raised to the maximum level
if (HasMaximumRenownReputation(factionEntry)) if (HasMaximumRenownReputation(factionEntry) && standing > 0)
{ {
factionState.needSend = false; factionState.needSend = false;
factionState.needSave = false; factionState.needSave = false;
@@ -547,8 +547,9 @@ namespace Game
factionState.VisualStandingIncrease = reputationChange; factionState.VisualStandingIncrease = reputationChange;
// If the reputation is decreased by command, we will send CurrencyDestroyReason::Cheat
if (oldRenownLevel != newRenownLevel) if (oldRenownLevel != newRenownLevel)
_player.ModifyCurrency(currency.Id, newRenownLevel - oldRenownLevel, false); _player.ModifyCurrency(currency.Id, newRenownLevel - oldRenownLevel, CurrencyGainSource.RenownRepGain, CurrencyDestroyReason.Cheat);
} }
} }
-28
View File
@@ -503,34 +503,6 @@ namespace Game
Values[WorldCfg.CurrencyResetInterval] = 7; Values[WorldCfg.CurrencyResetInterval] = 7;
} }
Values[WorldCfg.CurrencyStartApexisCrystals] = GetDefaultValue("Currency.StartApexisCrystals", 0);
if ((int)Values[WorldCfg.CurrencyStartApexisCrystals] < 0)
{
Log.outError(LogFilter.ServerLoading, "Currency.StartApexisCrystals ({0}) must be >= 0, set to default 0.", Values[WorldCfg.CurrencyStartApexisCrystals]);
Values[WorldCfg.CurrencyStartApexisCrystals] = 0;
}
Values[WorldCfg.CurrencyMaxApexisCrystals] = GetDefaultValue("Currency.MaxApexisCrystals", 20000);
if ((int)Values[WorldCfg.CurrencyMaxApexisCrystals] < 0)
{
Log.outError(LogFilter.ServerLoading, "Currency.MaxApexisCrystals ({0}) can't be negative. Set to default 20000.", Values[WorldCfg.CurrencyMaxApexisCrystals]);
Values[WorldCfg.CurrencyMaxApexisCrystals] = 20000;
}
Values[WorldCfg.CurrencyMaxApexisCrystals] = (int)Values[WorldCfg.CurrencyMaxApexisCrystals] * 100; //precision mod
Values[WorldCfg.CurrencyStartJusticePoints] = GetDefaultValue("Currency.StartJusticePoints", 0);
if ((int)Values[WorldCfg.CurrencyStartJusticePoints] < 0)
{
Log.outError(LogFilter.ServerLoading, "Currency.StartJusticePoints ({0}) must be >= 0, set to default 0.", Values[WorldCfg.CurrencyStartJusticePoints]);
Values[WorldCfg.CurrencyStartJusticePoints] = 0;
}
Values[WorldCfg.CurrencyMaxJusticePoints] = GetDefaultValue("Currency.MaxJusticePoints", 4000);
if ((int)Values[WorldCfg.CurrencyMaxJusticePoints] < 0)
{
Log.outError(LogFilter.ServerLoading, "Currency.MaxJusticePoints ({0}) can't be negative. Set to default 4000.", Values[WorldCfg.CurrencyMaxJusticePoints]);
Values[WorldCfg.CurrencyMaxJusticePoints] = 4000;
}
Values[WorldCfg.CurrencyMaxJusticePoints] = (int)Values[WorldCfg.CurrencyMaxJusticePoints] * 100; //precision mod
Values[WorldCfg.MaxRecruitAFriendBonusPlayerLevel] = GetDefaultValue("RecruitAFriend.MaxLevel", 60); Values[WorldCfg.MaxRecruitAFriendBonusPlayerLevel] = GetDefaultValue("RecruitAFriend.MaxLevel", 60);
if ((int)Values[WorldCfg.MaxRecruitAFriendBonusPlayerLevel] > (int)Values[WorldCfg.MaxPlayerLevel]) if ((int)Values[WorldCfg.MaxRecruitAFriendBonusPlayerLevel] > (int)Values[WorldCfg.MaxPlayerLevel])
{ {
+1 -1
View File
@@ -4495,7 +4495,7 @@ namespace Game.Spells
} }
foreach (var reagentsCurrency in m_spellInfo.ReagentsCurrency) foreach (var reagentsCurrency in m_spellInfo.ReagentsCurrency)
p_caster.ModifyCurrency(reagentsCurrency.CurrencyTypesID, -reagentsCurrency.CurrencyCount, false, true); p_caster.RemoveCurrency(reagentsCurrency.CurrencyTypesID, -reagentsCurrency.CurrencyCount, CurrencyDestroyReason.Spell);
} }
void HandleThreatSpells() void HandleThreatSpells()
+13 -1
View File
@@ -4729,7 +4729,7 @@ namespace Game.Spells
if (!CliDB.CurrencyTypesStorage.ContainsKey(effectInfo.MiscValue)) if (!CliDB.CurrencyTypesStorage.ContainsKey(effectInfo.MiscValue))
return; return;
unitTarget.ToPlayer().ModifyCurrency((uint)effectInfo.MiscValue, damage); unitTarget.ToPlayer().ModifyCurrency((uint)effectInfo.MiscValue, damage, CurrencyGainSource.Spell, CurrencyDestroyReason.Spell);
} }
[SpellEffectHandler(SpellEffectName.CastButton)] [SpellEffectHandler(SpellEffectName.CastButton)]
@@ -4847,6 +4847,18 @@ namespace Game.Spells
} }
} }
[SpellEffectHandler(SpellEffectName.IncreseCurrencyCap)]
void EffectIncreaseCurrencyCap()
{
if (effectHandleMode != SpellEffectHandleMode.HitTarget)
return;
if (damage <= 0)
return;
unitTarget.ToPlayer()?.IncreaseCurrencyCap((uint)effectInfo.MiscValue, (uint)damage);
}
[SpellEffectHandler(SpellEffectName.SummonRafFriend)] [SpellEffectHandler(SpellEffectName.SummonRafFriend)]
void EffectSummonRaFFriend() void EffectSummonRaFFriend()
{ {
+1 -1
View File
@@ -384,7 +384,7 @@ namespace Game
if (!currencies.ContainsKey((int)currency.Id)) if (!currencies.ContainsKey((int)currency.Id))
currencies[(int)currency.Id] = 0; currencies[(int)currency.Id] = 0;
currencies[(int)currency.Id] += (int)player.GetCurrency((uint)currency.CurrencyTypesID); currencies[(int)currency.Id] += (int)player.GetCurrencyQuantity((uint)currency.CurrencyTypesID);
break; break;
case TraitCurrencyType.TraitSourced: case TraitCurrencyType.TraitSourced:
var currencySources = _traitCurrencySourcesByCurrency.LookupByKey(currency.Id); var currencySources = _traitCurrencySourcesByCurrency.LookupByKey(currency.Id);
-32
View File
@@ -3904,38 +3904,6 @@ Currency.ResetDay = 3
Currency.ResetHour = 6 Currency.ResetHour = 6
#
# Currency.StartApexisCrystals
# Amount of Apexis Crystals that new players will start with
# Default: 0 (with precision)
#
Currency.StartApexisCrystals = 0
#
# Currency.MaxApexisCrystals
# Amount Apexis Crystals a player can have
# Default: 20000
#
Currency.MaxApexisCrystals = 20000
#
# Currency.StartJusticePoints
# Amount of justice points that new players will start with
# Default: 0 (with precision)
#
Currency.StartJusticePoints = 0
#
# Currency.MaxJusticePoints
# Amount justice points a player can have
# Default: 4000
#
Currency.MaxJusticePoints = 4000
# #
################################################################################################### ###################################################################################################