Files
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

233 lines
6.8 KiB
C#

using System;
using Server;
using Server.Items;
using Server.Mobiles;
using System.Collections.Generic;
namespace Server.Engines.NewMagincia
{
public class CommodityBrokerEntry
{
private Type m_CommodityType;
private CommodityBroker m_Broker;
private int m_ItemID;
private int m_Label;
private int m_SellPricePer;
private int m_BuyPricePer;
private int m_BuyLimit;
private int m_SellLimit;
private int m_Stock;
public Type CommodityType { get { return m_CommodityType; } }
public CommodityBroker Broker { get { return m_Broker; } }
public int ItemID { get { return m_ItemID; } }
public int Label { get { return m_Label; } }
public int SellPricePer { get { return m_SellPricePer; } set { m_SellPricePer = value; } }
public int BuyPricePer { get { return m_BuyPricePer; } set { m_BuyPricePer = value; } }
public int BuyLimit { get { return m_BuyLimit; } set { m_BuyLimit = value; } }
public int SellLimit { get { return m_SellLimit; } set { m_SellLimit = value; } }
public int Stock { get { return m_Stock; } set { m_Stock = value; } }
public int ActualSellLimit
{
get
{
if (m_Stock < m_SellLimit)
return m_Stock;
return m_SellLimit;
}
}
public int ActualBuyLimit
{
get
{
if (m_Broker != null && m_Broker.BankBalance < m_BuyLimit * m_BuyPricePer && m_BuyPricePer > 0)
return m_Broker.BankBalance / m_BuyPricePer;
int limit = m_BuyLimit - m_Stock;
if (limit <= 0)
return 0;
return limit;
}
}
/* SellPricePer - price per unit the broker is selling to players for
* BuyPricePer - price per unit the borker is buying from players for
* BuyAtLimit - Limit a commodity must go below before it will buy that particular commodity
*
* SellAtLimit - Limit a commodty must go above before it will sell that particular commodity
* BuyLimit - Limit (in units) it will buy from players
* SellLimit - Limit (in units) it will sell to players
*/
public CommodityBrokerEntry (Item item, CommodityBroker broker, int amount)
{
m_CommodityType = item.GetType();
m_ItemID = item.ItemID;
m_Broker = broker;
m_Stock = amount;
if(item is ICommodity)
m_Label = ((ICommodity)item).Description;
else
m_Label = item.LabelNumber;
}
/// <summary>
/// Player buys, the vendor is selling
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
public bool PlayerCanBuy(int amount)
{
//return (m_SellAtLimit == 0 || m_Stock >= m_SellAtLimit) && m_Stock > 0 && m_SellPricePer > 0 && m_SellLimit < amount;
return (m_SellLimit == 0 || amount <= ActualSellLimit) && m_SellPricePer > 0;
}
/// <summary>
/// Player sells, the vendor is buying
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
public bool PlayerCanSell(int amount)
{
//(m_BuyAtLimit == 0 || m_Stock <= entry.BuyAtLimit) && m_Stock > 0 && m_BuyPricePer * amount <= m_Broker.BankBalance && m_BuyPricePer > 0 && m_BuyLimit < amount;
return (m_BuyLimit == 0 || amount <= ActualBuyLimit) && m_Stock > 0 && m_BuyPricePer > 0 && m_BuyPricePer <= m_Broker.BankBalance;
}
public CommodityBrokerEntry(GenericReader reader)
{
int version = reader.ReadInt();
m_CommodityType = ScriptCompiler.FindTypeByName(reader.ReadString());
m_Label = reader.ReadInt();
m_Broker = reader.ReadMobile() as CommodityBroker;
m_ItemID = reader.ReadInt();
m_SellPricePer = reader.ReadInt();
m_BuyPricePer = reader.ReadInt();
m_BuyLimit = reader.ReadInt();
m_SellLimit = reader.ReadInt();
m_Stock = reader.ReadInt();
}
public void Serialize(GenericWriter writer)
{
writer.Write((int)0);
writer.Write(m_CommodityType.Name);
writer.Write(m_Label);
writer.Write(m_Broker);
writer.Write(m_ItemID);
writer.Write(m_SellPricePer);
writer.Write(m_BuyPricePer);
writer.Write(m_BuyLimit);
writer.Write(m_SellLimit);
writer.Write(m_Stock);
}
}
public class PetBrokerEntry
{
private BaseCreature m_Pet;
private int m_SalePrice;
private string m_TypeName;
public BaseCreature Pet { get { return m_Pet; } }
public int SalePrice { get { return m_SalePrice; } set { m_SalePrice = value; } }
public string TypeName { get { return m_TypeName; } set { m_TypeName = value; } }
private static Dictionary<Type, string> m_NameBuffer = new Dictionary<Type, string>();
public static Dictionary<Type, string> NameBuffer { get { return m_NameBuffer; } }
public static readonly int DefaultPrice = 1000;
public PetBrokerEntry(BaseCreature pet) : this(pet, DefaultPrice)
{
}
public PetBrokerEntry(BaseCreature pet, int price)
{
m_Pet = pet;
m_SalePrice = price;
m_TypeName = GetOriginalName(pet);
}
public static string GetOriginalName(BaseCreature bc)
{
if(bc == null)
return null;
Type t = bc.GetType();
if(m_NameBuffer.ContainsKey(t))
return m_NameBuffer[t];
BaseCreature c = Activator.CreateInstance(t) as BaseCreature;
if(c != null)
{
c.Delete();
AddToBuffer(t, c.Name);
return c.Name;
}
return t.Name;
}
public static void AddToBuffer(Type type, string s)
{
if(s != null && s.Length > 0 && !m_NameBuffer.ContainsKey(type))
m_NameBuffer[type] = s;
}
public void Internalize()
{
if (m_Pet.Map == Map.Internal)
return;
m_Pet.ControlTarget = null;
m_Pet.ControlOrder = OrderType.Stay;
m_Pet.Internalize();
m_Pet.SetControlMaster(null);
m_Pet.SummonMaster = null;
m_Pet.IsStabled = true;
m_Pet.Loyalty = BaseCreature.MaxLoyalty;
m_Pet.Home = Point3D.Zero;
m_Pet.RangeHome = 10;
m_Pet.Blessed = false;
}
public PetBrokerEntry(GenericReader reader)
{
int version = reader.ReadInt();
m_Pet = reader.ReadMobile() as BaseCreature;
m_SalePrice = reader.ReadInt();
m_TypeName = reader.ReadString();
if (m_Pet != null)
{
AddToBuffer(m_Pet.GetType(), m_TypeName);
m_Pet.IsStabled = true;
Timer.DelayCall(TimeSpan.FromSeconds(10), new TimerCallback(Internalize));
}
}
public void Serialize(GenericWriter writer)
{
writer.Write((int)0);
writer.Write(m_Pet);
writer.Write(m_SalePrice);
writer.Write(m_TypeName);
}
}
}