ModernUO/Projects/UOContent/Engines/Harvest/Core/HarvestBank.cs
Kamron Batman dba3ec2db5
fix: Use built-in RNG (#1599)
### Summary

.NET 8 supports Xoroshiro 256** off the shelf and added Shuffle. Switching to that implementation.

### Developer Notes

* Removed many convenience methods that weren't used.
2023-11-17 17:45:18 -08:00

100 lines
2.4 KiB
C#

using System;
namespace Server.Engines.Harvest
{
public class HarvestBank
{
private readonly int m_Maximum;
private int m_Current;
private DateTime m_NextRespawn;
private HarvestVein m_Vein, m_DefaultVein;
public HarvestBank(HarvestDefinition def, HarvestVein defaultVein)
{
m_Maximum = Utility.RandomMinMax(def.MinTotal, def.MaxTotal);
m_Current = m_Maximum;
m_DefaultVein = defaultVein;
m_Vein = m_DefaultVein;
Definition = def;
}
public HarvestDefinition Definition { get; }
public int Current
{
get
{
CheckRespawn();
return m_Current;
}
}
public HarvestVein Vein
{
get
{
CheckRespawn();
return m_Vein;
}
set => m_Vein = value;
}
public HarvestVein DefaultVein
{
get
{
CheckRespawn();
return m_DefaultVein;
}
}
public void CheckRespawn()
{
if (m_Current == m_Maximum || m_NextRespawn > Core.Now)
{
return;
}
m_Current = m_Maximum;
if (Definition.RandomizeVeins)
{
m_DefaultVein = Definition.GetVeinFrom((uint)Utility.Random(Definition.VeinWeights));
}
m_Vein = m_DefaultVein;
}
public void Consume(int amount, Mobile from)
{
CheckRespawn();
if (m_Current == m_Maximum)
{
var min = Definition.MinRespawn.TotalMinutes;
var max = Definition.MaxRespawn.TotalMinutes;
var rnd = Utility.RandomDouble();
m_Current = m_Maximum - amount;
var minutes = min + rnd * (max - min);
if (Definition.RaceBonus && from.Race == Race.Elf) // def.RaceBonus = Core.ML
{
minutes *= .75; // 25% off the time.
}
m_NextRespawn = Core.Now + TimeSpan.FromMinutes(minutes);
}
else
{
m_Current -= amount;
}
if (m_Current < 0)
{
m_Current = 0;
}
}
}
}