This commit is contained in:
mark 2007-12-17 20:41:34 +00:00
parent 7ad00dceac
commit 0b4c3b15d9
41 changed files with 976 additions and 144 deletions

View file

@ -0,0 +1,31 @@
using System;
namespace Server.Engines.Harvest
{
public class BonusHarvestResource
{
private Type m_Type;
private double m_ReqSkill, m_Chance;
private TextDefinition m_SuccessMessage;
public Type Type { get { return m_Type; } set { m_Type = value; } }
public double ReqSkill { get { return m_ReqSkill; } set { m_ReqSkill = value; } }
public double Chance { get { return m_Chance; } set { m_Chance = value; } }
public TextDefinition SuccessMessage { get { return m_SuccessMessage; } }
public void SendSuccessTo( Mobile m )
{
TextDefinition.SendMessageTo( m, m_SuccessMessage );
}
public BonusHarvestResource( double reqSkill, double chance, TextDefinition message, Type type )
{
m_ReqSkill = reqSkill;
m_Chance = chance;
m_Type = type;
m_SuccessMessage = message;
}
}
}

View file

@ -9,6 +9,13 @@ namespace Server.Engines.Harvest
private DateTime m_NextRespawn;
private HarvestVein m_Vein, m_DefaultVein;
HarvestDefinition m_Definition;
public HarvestDefinition Definition
{
get { return m_Definition; }
}
public int Current
{
get
@ -46,23 +53,31 @@ namespace Server.Engines.Harvest
return;
m_Current = m_Maximum;
m_Vein = m_DefaultVein;
if ( m_Definition.RandomizeVeins )
{
m_Vein = m_Definition.GetVeinFrom( Utility.RandomDouble() );
}
else
{
m_Vein = m_DefaultVein;
}
}
public void Consume( HarvestDefinition def, int amount, Mobile from )
public void Consume( int amount, Mobile from )
{
CheckRespawn();
if ( m_Current == m_Maximum )
{
double min = def.MinRespawn.TotalMinutes;
double max = def.MaxRespawn.TotalMinutes;
double min = m_Definition.MinRespawn.TotalMinutes;
double max = m_Definition.MaxRespawn.TotalMinutes;
double rnd = Utility.RandomDouble();
m_Current = m_Maximum - amount;
double minutes = min + (rnd * (max - min));
if( def.RaceBonus && from.Race == Race.Elf ) //def.RaceBonus = Core.ML
if ( m_Definition.RaceBonus && from.Race == Race.Elf ) //def.RaceBonus = Core.ML
minutes *= .75; //25% off the time.
m_NextRespawn = DateTime.Now + TimeSpan.FromMinutes( minutes );
@ -82,6 +97,8 @@ namespace Server.Engines.Harvest
m_Current = m_Maximum;
m_DefaultVein = defaultVein;
m_Vein = m_DefaultVein;
m_Definition = def;
}
}
}

View file

@ -22,7 +22,9 @@ namespace Server.Engines.Harvest
private object m_NoResourcesMessage, m_OutOfRangeMessage, m_TimedOutOfRangeMessage, m_DoubleHarvestMessage, m_FailMessage, m_PackFullMessage, m_ToolBrokeMessage;
private HarvestResource[] m_Resources;
private HarvestVein[] m_Veins;
private BonusHarvestResource[] m_BonusResources;
private bool m_RaceBonus;
private bool m_RandomizeVeins;
public int BankWidth{ get{ return m_BankWidth; } set{ m_BankWidth = value; } }
public int BankHeight{ get{ return m_BankHeight; } set{ m_BankHeight = value; } }
@ -51,7 +53,9 @@ namespace Server.Engines.Harvest
public object ToolBrokeMessage{ get{ return m_ToolBrokeMessage; } set{ m_ToolBrokeMessage = value; } }
public HarvestResource[] Resources{ get{ return m_Resources; } set{ m_Resources = value; } }
public HarvestVein[] Veins{ get{ return m_Veins; } set{ m_Veins = value; } }
public BonusHarvestResource[] BonusResources{ get { return m_BonusResources; } set { m_BonusResources = value; } }
public bool RaceBonus { get { return m_RaceBonus; } set { m_RaceBonus = value; } }
public bool RandomizeVeins { get { return m_RandomizeVeins; } set { m_RandomizeVeins = value; } }
private Dictionary<Map, Dictionary<Point2D, HarvestBank>> m_BanksByMap;
@ -94,8 +98,27 @@ namespace Server.Engines.Harvest
if ( m_Veins.Length == 1 )
return m_Veins[0];
Random random = new Random( (x*17)+(y*11)+(map.MapID * 3) );
double randomValue = random.NextDouble() * 100;
double randomValue;
if ( m_RandomizeVeins )
{
randomValue = Utility.RandomDouble();
}
else
{
Random random = new Random( ( x * 17 ) + ( y * 11 ) + ( map.MapID * 3 ) );
randomValue = random.NextDouble();
}
return GetVeinFrom( randomValue );
}
public HarvestVein GetVeinFrom( double randomValue )
{
if ( m_Veins.Length == 1 )
return m_Veins[0];
randomValue *= 100;
for ( int i = 0; i < m_Veins.Length; ++i )
{
@ -108,6 +131,24 @@ namespace Server.Engines.Harvest
return null;
}
public BonusHarvestResource GetBonusResource()
{
if ( m_BonusResources == null )
return null;
double randomValue = Utility.RandomDouble() * 100;
for ( int i = 0; i < m_BonusResources.Length; ++i )
{
if ( randomValue <= m_BonusResources[i].Chance )
return m_BonusResources[i];
randomValue -= m_BonusResources[i].Chance;
}
return null;
}
public HarvestDefinition()
{
m_BanksByMap = new Dictionary<Map, Dictionary<Point2D, HarvestBank>>();

View file

@ -186,7 +186,7 @@ namespace Server.Engines.Harvest
item.Amount = amount;
}
bank.Consume( def, item.Amount, from );
bank.Consume( item.Amount, from );
if ( Give( from, item, def.PlaceAtFeetIfFull ) )
{
@ -198,6 +198,22 @@ namespace Server.Engines.Harvest
item.Delete();
}
BonusHarvestResource bonus = def.GetBonusResource();
if ( bonus != null && bonus.Type != null && skillBase >= bonus.ReqSkill )
{
Item bonusItem = Construct( bonus.Type, from );
if ( Give( from, bonusItem, true ) ) //Bonuses always allow placing at feet, even if pack is full irregrdless of def
{
bonus.SendSuccessTo( from );
}
else
{
item.Delete();
}
}
if ( tool is IUsesRemaining )
{
IUsesRemaining toolWithUses = (IUsesRemaining)tool;
@ -266,14 +282,14 @@ namespace Server.Engines.Harvest
if ( map == null )
return false;
ArrayList atFeet = new ArrayList();
List<Item> atFeet = new List<Item>();
foreach ( Item obj in m.GetItemsInRange( 0 ) )
atFeet.Add( obj );
for ( int i = 0; i < atFeet.Count; ++i )
{
Item check = (Item)atFeet[i];
Item check = atFeet[i];
if ( check.StackWith( m, item, false ) )
return true;