/
EffectItem.cs
86 lines (68 loc) · 2.14 KB
/
EffectItem.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System;
using System.Collections.Generic;
namespace Server.Items
{
public class EffectItem : Item
{
public static readonly TimeSpan DefaultDuration = TimeSpan.FromSeconds(5.0);
private static readonly List<EffectItem> m_Free = new List<EffectItem>();// List of available EffectItems
public EffectItem(Serial serial)
: base(serial)
{
}
private EffectItem()
: base(1)// nodraw
{
Movable = false;
}
public override bool Decays => true;
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;
}
public void BeginFree(TimeSpan duration)
{
new FreeTimer(this, duration).Start();
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
Delete();
}
private class FreeTimer : Timer
{
private readonly 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);
}
}
}
}