143 lines
2.6 KiB
C#
143 lines
2.6 KiB
C#
using System;
|
|
|
|
namespace Server.Factions
|
|
{
|
|
public interface IFactionItem
|
|
{
|
|
FactionItem FactionItemState{ get; set; }
|
|
}
|
|
|
|
public class FactionItem
|
|
{
|
|
public static readonly TimeSpan ExpirationPeriod = TimeSpan.FromDays( 21.0 );
|
|
|
|
public Item Item { get; }
|
|
|
|
public Faction Faction { get; }
|
|
|
|
public DateTime Expiration { get; private set; }
|
|
|
|
public bool HasExpired
|
|
{
|
|
get
|
|
{
|
|
if ( Item == null || Item.Deleted )
|
|
return true;
|
|
|
|
return ( Expiration != DateTime.MinValue && DateTime.UtcNow >= Expiration );
|
|
}
|
|
}
|
|
|
|
public void StartExpiration()
|
|
{
|
|
Expiration = DateTime.UtcNow + ExpirationPeriod;
|
|
}
|
|
|
|
public void CheckAttach()
|
|
{
|
|
if ( !HasExpired )
|
|
Attach();
|
|
else
|
|
Detach();
|
|
}
|
|
|
|
public void Attach()
|
|
{
|
|
if ( Item is IFactionItem item )
|
|
item.FactionItemState = this;
|
|
|
|
Faction?.State.FactionItems.Add( this );
|
|
}
|
|
|
|
public void Detach()
|
|
{
|
|
if ( Item is IFactionItem item )
|
|
item.FactionItemState = null;
|
|
|
|
if ( Faction != null && Faction.State.FactionItems.Contains( this ) )
|
|
Faction.State.FactionItems.Remove( this );
|
|
}
|
|
|
|
public FactionItem( Item item, Faction faction )
|
|
{
|
|
Item = item;
|
|
Faction = faction;
|
|
}
|
|
|
|
public FactionItem( GenericReader reader, Faction faction )
|
|
{
|
|
int version = reader.ReadEncodedInt();
|
|
|
|
switch ( version )
|
|
{
|
|
case 0:
|
|
{
|
|
Item = reader.ReadItem();
|
|
Expiration = reader.ReadDateTime();
|
|
break;
|
|
}
|
|
}
|
|
|
|
Faction = faction;
|
|
}
|
|
|
|
public void Serialize( GenericWriter writer )
|
|
{
|
|
writer.WriteEncodedInt( (int) 0 );
|
|
|
|
writer.Write( (Item) Item );
|
|
writer.Write( (DateTime) 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 )
|
|
{
|
|
FactionItem state = factionItem.FactionItemState;
|
|
|
|
if ( state?.HasExpired == true )
|
|
{
|
|
state.Detach();
|
|
state = null;
|
|
}
|
|
|
|
return state;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static Item Imbue( Item item, Faction faction, bool expire, int hue )
|
|
{
|
|
if ( !(item is IFactionItem) )
|
|
return item;
|
|
|
|
FactionItem state = Find( item );
|
|
|
|
if ( state == null )
|
|
{
|
|
state = new FactionItem( item, faction );
|
|
state.Attach();
|
|
}
|
|
|
|
if ( expire )
|
|
state.StartExpiration();
|
|
|
|
item.Hue = hue;
|
|
return item;
|
|
}
|
|
}
|
|
}
|