Changes to new Gold Ledger system (#3)

Changes new gold system to use separate gold/platinum with DivRem instead of relying on doubles.
This commit is contained in:
Kamron Batman 2018-02-20 22:47:16 -08:00 committed by GitHub
parent 1030bb7675
commit d8ed7c1da9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 68 additions and 438 deletions

View file

@ -25,136 +25,6 @@ namespace Server.Accounting
public static readonly TimeSpan EmptyInactiveDuration = TimeSpan.FromDays(30.0);
public static void Configure()
{
CommandSystem.Register("ConvertCurrency", AccessLevel.Owner, ConvertCurrency);
}
private static void ConvertCurrency(CommandEventArgs e)
{
e.Mobile.SendMessage(
"Converting All Banked Gold from {0} to {1}. Please wait...",
AccountGold.Enabled ? "checks and coins" : "account treasury",
AccountGold.Enabled ? "account treasury" : "checks and coins");
NetState.Pause();
double found = 0.0, converted = 0.0;
try
{
BankBox box;
List<Gold> gold;
List<BankCheck> checks;
long share = 0, shared;
int diff;
foreach (var a in Accounts.GetAccounts().OfType<Account>().Where(a => a.Count > 0))
{
try
{
if (!AccountGold.Enabled)
{
share = (int)Math.Truncate((a.TotalCurrency / a.Count) * CurrencyThreshold);
found += a.TotalCurrency * CurrencyThreshold;
}
foreach (var m in a.m_Mobiles.Where(m => m != null))
{
box = m.FindBankNoCreate();
if (box == null)
{
continue;
}
if (AccountGold.Enabled)
{
foreach (var o in checks = box.FindItemsByType<BankCheck>())
{
found += o.Worth;
if (!a.DepositGold(o.Worth))
{
break;
}
converted += o.Worth;
o.Delete();
}
checks.Clear();
checks.TrimExcess();
foreach (var o in gold = box.FindItemsByType<Gold>())
{
found += o.Amount;
if (!a.DepositGold(o.Amount))
{
break;
}
converted += o.Amount;
o.Delete();
}
gold.Clear();
gold.TrimExcess();
}
else
{
shared = share;
while (shared > 0)
{
if (shared > 60000)
{
diff = (int)Math.Min(10000000, shared);
if (a.WithdrawGold(diff))
{
box.DropItem(new BankCheck(diff));
}
else
{
break;
}
}
else
{
diff = (int)Math.Min(60000, shared);
if (a.WithdrawGold(diff))
{
box.DropItem(new Gold(diff));
}
else
{
break;
}
}
converted += diff;
shared -= diff;
}
}
box.UpdateTotals();
}
}
catch
{ }
}
}
catch
{ }
NetState.Resume();
e.Mobile.SendMessage("Operation complete: {0:#,0} of {1:#,0} Gold has been converted in total.", converted, found);
}
private string m_Username, m_Email, m_PlainPassword, m_CryptPassword, m_NewCryptPassword;
private AccessLevel m_AccessLevel;
private int m_Flags;
@ -816,7 +686,8 @@ namespace Server.Accounting
m_Created = Utility.GetXMLDateTime( Utility.GetText( node["created"], null ), DateTime.UtcNow );
m_LastLogin = Utility.GetXMLDateTime( Utility.GetText( node["lastLogin"], null ), DateTime.UtcNow );
TotalCurrency = Utility.GetXMLDouble( Utility.GetText(node["totalCurrency"], "0" ), 0 );
TotalGold = Utility.GetXMLInt32( Utility.GetText(node["totalGold"], "0" ), 0 );
TotalPlat = Utility.GetXMLInt32(Utility.GetText(node["totalPlat"], "0"), 0);
m_Mobiles = LoadMobiles( node );
m_Comments = LoadComments( node );
@ -1244,8 +1115,12 @@ namespace Server.Accounting
xml.WriteEndElement();
}
xml.WriteStartElement("totalCurrency");
xml.WriteString(XmlConvert.ToString(TotalCurrency));
xml.WriteStartElement("totalGold");
xml.WriteString(XmlConvert.ToString(TotalGold));
xml.WriteEndElement();
xml.WriteStartElement("totalPlat");
xml.WriteString(XmlConvert.ToString(TotalPlat));
xml.WriteEndElement();
xml.WriteEndElement();
@ -1353,36 +1228,13 @@ namespace Server.Accounting
}
#region Gold Account
/// <summary>
/// This amount specifies the value at which point Gold turns to Platinum.
/// By default, when 1,000,000,000 Gold is accumulated, it will transform
/// into 1 Platinum.
/// </summary>
public static int CurrencyThreshold
{
get { return AccountGold.CurrencyThreshold; }
set { AccountGold.CurrencyThreshold = value; }
}
/// <summary>
/// This amount represents the total amount of currency owned by the player.
/// It is cumulative of both Gold and Platinum, the absolute total amount of
/// Gold owned by the player can be found by multiplying this value by the
/// CurrencyThreshold value.
/// </summary>
[CommandProperty(AccessLevel.Administrator, true)]
public double TotalCurrency { get; private set; }
/// <summary>
/// This amount represents the current amount of Gold owned by the player.
/// The value does not include the value of Platinum and ranges from
/// 0 to 999,999,999 by default.
/// </summary>
[CommandProperty(AccessLevel.Administrator)]
public int TotalGold
{
get { return (int)Math.Floor((TotalCurrency - Math.Truncate(TotalCurrency)) * Math.Max(1.0, CurrencyThreshold)); }
}
public int TotalGold { get; private set; }
/// <summary>
/// This amount represents the current amount of Platinum owned by the player.
@ -1391,23 +1243,7 @@ namespace Server.Accounting
/// One Platinum represents the value of CurrencyThreshold in Gold.
/// </summary>
[CommandProperty(AccessLevel.Administrator)]
public int TotalPlat { get { return (int)Math.Truncate(TotalCurrency); } }
/// <summary>
/// Attempts to deposit the given amount of Gold and Platinum into this account.
/// </summary>
/// <param name="amount">Amount to deposit.</param>
/// <returns>True if successful, false if amount given is less than or equal to zero.</returns>
public bool DepositCurrency(double amount)
{
if (amount <= 0)
{
return false;
}
TotalCurrency += amount;
return true;
}
public int TotalPlat { get; private set; }
/// <summary>
/// Attempts to deposit the given amount of Gold into this account.
@ -1418,19 +1254,14 @@ namespace Server.Accounting
/// <returns>True if successful, false if amount given is less than or equal to zero.</returns>
public bool DepositGold(int amount)
{
return DepositCurrency(amount / Math.Max(1.0, CurrencyThreshold));
}
if (amount <= 0) { return false; }
/// <summary>
/// Attempts to deposit the given amount of Gold into this account.
/// If the given amount is greater than the CurrencyThreshold,
/// Platinum will be deposited to offset the difference.
/// </summary>
/// <param name="amount">Amount to deposit.</param>
/// <returns>True if successful, false if amount given is less than or equal to zero.</returns>
public bool DepositGold(long amount)
{
return DepositCurrency(amount / Math.Max(1.0, CurrencyThreshold));
int gold;
int plat = Math.DivRem(amount, AccountGold.CurrencyThreshold, out gold);
TotalPlat += plat;
TotalGold += gold;
return true;
}
/// <summary>
@ -1440,37 +1271,9 @@ namespace Server.Accounting
/// <returns>True if successful, false if amount given is less than or equal to zero.</returns>
public bool DepositPlat(int amount)
{
return DepositCurrency(amount);
}
if (amount <= 0) { return false; }
/// <summary>
/// Attempts to deposit the given amount of Platinum into this account.
/// </summary>
/// <param name="amount">Amount to deposit.</param>
/// <returns>True if successful, false if amount given is less than or equal to zero.</returns>
public bool DepositPlat(long amount)
{
return DepositCurrency(amount);
}
/// <summary>
/// Attempts to withdraw the given amount of Platinum and Gold from this account.
/// </summary>
/// <param name="amount">Amount to withdraw.</param>
/// <returns>True if successful, false if balance was too low.</returns>
public bool WithdrawCurrency(double amount)
{
if (amount <= 0)
{
return true;
}
if (amount > TotalCurrency)
{
return false;
}
TotalCurrency -= amount;
TotalPlat += amount;
return true;
}
@ -1483,19 +1286,12 @@ namespace Server.Accounting
/// <returns>True if successful, false if balance was too low.</returns>
public bool WithdrawGold(int amount)
{
return WithdrawCurrency(amount / Math.Max(1.0, CurrencyThreshold));
}
if (amount <= 0) { return true; }
if (amount > TotalGold) { return false; }
/// <summary>
/// Attempts to withdraw the given amount of Gold from this account.
/// If the given amount is greater than the CurrencyThreshold,
/// Platinum will be withdrawn to offset the difference.
/// </summary>
/// <param name="amount">Amount to withdraw.</param>
/// <returns>True if successful, false if balance was too low.</returns>
public bool WithdrawGold(long amount)
{
return WithdrawCurrency(amount / Math.Max(1.0, CurrencyThreshold));
TotalGold -= amount;
return true;
}
/// <summary>
@ -1505,87 +1301,22 @@ namespace Server.Accounting
/// <returns>True if successful, false if balance was too low.</returns>
public bool WithdrawPlat(int amount)
{
return WithdrawCurrency(amount);
if (amount <= 0) { return true; }
if (amount > TotalPlat) { return false; }
TotalPlat -= amount;
return true;
}
/// <summary>
/// Attempts to withdraw the given amount of Platinum from this account.
/// Returns total gold inclusive of platinum.
/// This is strictly for backwards compatibility
/// </summary>
/// <param name="amount">Amount to withdraw.</param>
/// <returns>True if successful, false if balance was too low.</returns>
public bool WithdrawPlat(long amount)
/// <returns>Total gold, capped at Int32.MaxValue</returns>
public long GetTotalGold()
{
return WithdrawCurrency(amount);
}
/// <summary>
/// Gets the total balance of Gold for this account.
/// </summary>
/// <param name="gold">Gold value, Platinum exclusive</param>
/// <param name="totalGold">Gold value, Platinum inclusive</param>
public void GetGoldBalance(out int gold, out double totalGold)
{
gold = TotalGold;
totalGold = TotalCurrency * Math.Max(1.0, CurrencyThreshold);
}
/// <summary>
/// Gets the total balance of Gold for this account.
/// </summary>
/// <param name="gold">Gold value, Platinum exclusive</param>
/// <param name="totalGold">Gold value, Platinum inclusive</param>
public void GetGoldBalance(out long gold, out double totalGold)
{
gold = TotalGold;
totalGold = TotalCurrency * Math.Max(1.0, CurrencyThreshold);
}
/// <summary>
/// Gets the total balance of Platinum for this account.
/// </summary>
/// <param name="plat">Platinum value, Gold exclusive</param>
/// <param name="totalPlat">Platinum value, Gold inclusive</param>
public void GetPlatBalance(out int plat, out double totalPlat)
{
plat = TotalPlat;
totalPlat = TotalCurrency;
}
/// <summary>
/// Gets the total balance of Platinum for this account.
/// </summary>
/// <param name="plat">Platinum value, Gold exclusive</param>
/// <param name="totalPlat">Platinum value, Gold inclusive</param>
public void GetPlatBalance(out long plat, out double totalPlat)
{
plat = TotalPlat;
totalPlat = TotalCurrency;
}
/// <summary>
/// Gets the total balance of Gold and Platinum for this account.
/// </summary>
/// <param name="gold">Gold value, Platinum exclusive</param>
/// <param name="totalGold">Gold value, Platinum inclusive</param>
/// <param name="plat">Platinum value, Gold exclusive</param>
/// <param name="totalPlat">Platinum value, Gold inclusive</param>
public void GetBalance(out int gold, out double totalGold, out int plat, out double totalPlat)
{
GetGoldBalance(out gold, out totalGold);
GetPlatBalance(out plat, out totalPlat);
}
/// <summary>
/// Gets the total balance of Gold and Platinum for this account.
/// </summary>
/// <param name="gold">Gold value, Platinum exclusive</param>
/// <param name="totalGold">Gold value, Platinum inclusive</param>
/// <param name="plat">Platinum value, Gold exclusive</param>
/// <param name="totalPlat">Platinum value, Gold inclusive</param>
public void GetBalance(out long gold, out double totalGold, out long plat, out double totalPlat)
{
GetGoldBalance(out gold, out totalGold);
GetPlatBalance(out plat, out totalPlat);
return TotalGold + TotalPlat * AccountGold.CurrencyThreshold;
}
#endregion
}