Overwrite

Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
Unstable Kitsune
2023-11-28 23:20:26 -05:00
parent 3cd54811de
commit b918192e4e
11608 changed files with 2644205 additions and 47 deletions

View File

@@ -0,0 +1,179 @@
using System;
namespace Server.Factions
{
public interface IFactionItem
{
FactionItem FactionItemState { get; set; }
}
public class FactionItem
{
public static readonly TimeSpan ExpirationPeriod = TimeSpan.FromDays(21.0);
private readonly Item m_Item;
private readonly Faction m_Faction;
private DateTime m_Expiration;
private int m_MinRank;
public FactionItem(Item item, Faction faction, int level)
{
m_Item = item;
m_Faction = faction;
m_MinRank = level;
}
public FactionItem(GenericReader reader, Faction faction)
{
int version = reader.ReadEncodedInt();
switch ( version )
{
case 1:
{
m_MinRank = reader.ReadInt();
goto case 0;
}
case 0:
{
m_Item = reader.ReadItem();
m_Expiration = reader.ReadDateTime();
break;
}
}
m_Faction = faction;
}
public Item Item
{
get
{
return m_Item;
}
}
public Faction Faction
{
get
{
return m_Faction;
}
}
public DateTime Expiration
{
get
{
return m_Expiration;
}
}
public int MinRank
{
get
{
return m_MinRank;
}
}
public bool HasExpired
{
get
{
if (m_Item == null || m_Item.Deleted)
return true;
return (m_Expiration != DateTime.MinValue && DateTime.UtcNow >= m_Expiration);
}
}
public static int GetMaxWearables(Mobile mob)
{
PlayerState pl = PlayerState.Find(mob);
if (pl == null)
return 0;
if (pl.Faction.IsCommander(mob))
return 9;
return pl.Rank.MaxWearables;
}
public static FactionItem Find(Item item)
{
if (item is IFactionItem)
{
FactionItem state = ((IFactionItem)item).FactionItemState;
if (state != null && state.HasExpired)
{
state.Detach();
state = null;
}
return state;
}
return null;
}
public static Item Imbue(Item item, Faction faction, bool expire, int hue, int MinRank = 0)
{
if (!(item is IFactionItem))
return item;
FactionItem state = Find(item);
if (state == null)
{
state = new FactionItem(item, faction, MinRank);
state.Attach();
}
if (expire)
state.StartExpiration();
if (hue >= 0)
item.Hue = hue;
return item;
}
public void StartExpiration()
{
m_Expiration = DateTime.UtcNow + ExpirationPeriod;
}
public void CheckAttach()
{
if (!HasExpired)
Attach();
else
Detach();
}
public void Attach()
{
if (m_Item is IFactionItem)
((IFactionItem)m_Item).FactionItemState = this;
if (m_Faction != null)
m_Faction.State.FactionItems.Add(this);
}
public void Detach()
{
if (m_Item is IFactionItem)
((IFactionItem)m_Item).FactionItemState = null;
if (m_Faction != null && m_Faction.State.FactionItems.Contains(this))
m_Faction.State.FactionItems.Remove(this);
}
public void Serialize(GenericWriter writer)
{
writer.WriteEncodedInt((int)1);
writer.Write(m_MinRank);
writer.Write((Item)m_Item);
writer.Write((DateTime)m_Expiration);
}
}
}