95 lines
No EOL
1.8 KiB
C#
95 lines
No EOL
1.8 KiB
C#
using System;
|
|
using System.Collections;
|
|
using Server;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Server.Items
|
|
{
|
|
public class EffectItem : Item
|
|
{
|
|
private static List<EffectItem> m_Free = new List<EffectItem>(); // List of available EffectItems
|
|
|
|
public static readonly TimeSpan DefaultDuration = TimeSpan.FromSeconds( 5.0 );
|
|
|
|
public static EffectItem Create( Point3D p, Map map, TimeSpan duration )
|
|
{
|
|
EffectItem item = null;
|
|
|
|
for ( int i = m_Free.Count - 1; item == null && i >= 0; --i ) // We reuse new entries first so decay works better
|
|
{
|
|
EffectItem free = m_Free[i];
|
|
|
|
m_Free.RemoveAt( i );
|
|
|
|
if ( !free.Deleted && free.Map == Map.Internal )
|
|
item = free;
|
|
}
|
|
|
|
if ( item == null )
|
|
item = new EffectItem();
|
|
else
|
|
item.ItemID = 1;
|
|
|
|
item.MoveToWorld( p, map );
|
|
item.BeginFree( duration );
|
|
|
|
return item;
|
|
}
|
|
|
|
private EffectItem() : base( 1 ) // nodraw
|
|
{
|
|
Movable = false;
|
|
}
|
|
|
|
public void BeginFree( TimeSpan duration )
|
|
{
|
|
new FreeTimer( this, duration ).Start();
|
|
}
|
|
|
|
public override bool Decays
|
|
{
|
|
get
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public EffectItem( Serial serial ) : base( serial )
|
|
{
|
|
}
|
|
|
|
public override void Serialize( GenericWriter writer )
|
|
{
|
|
base.Serialize( writer );
|
|
|
|
writer.Write( (int) 0 ); // version
|
|
}
|
|
|
|
public override void Deserialize( GenericReader reader )
|
|
{
|
|
base.Deserialize( reader );
|
|
|
|
int version = reader.ReadInt();
|
|
|
|
Delete();
|
|
}
|
|
|
|
private class FreeTimer : Timer
|
|
{
|
|
private EffectItem m_Item;
|
|
|
|
public FreeTimer( EffectItem item, TimeSpan delay ) : base( delay )
|
|
{
|
|
m_Item = item;
|
|
Priority = TimerPriority.OneSecond;
|
|
}
|
|
|
|
protected override void OnTick()
|
|
{
|
|
m_Item.Internalize();
|
|
|
|
m_Free.Add( m_Item );
|
|
}
|
|
}
|
|
}
|
|
} |