-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathchargers.csx
114 lines (92 loc) · 3.83 KB
/
chargers.csx
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
public static class Chargers
{
public static ScriptTrace Trace = UO.Trace.Create();
public static int FireLevel => GetLevel(fireCharger);
public static int EnergyLevel => GetLevel(energyCharger);
public static int MindLevel => GetLevel(mindCharger);
private static EventJournal journal = UO.CreateEventJournal();
private static Charger mindCharger = new Charger(2270, 6253, Trace);
private static Charger fireCharger = new Charger(2257, 6254, Trace);
private static Charger energyCharger = new Charger(2281, 6256, Trace);
private static int GetLevel(Charger charger)
{
if (!UO.CommandHandler.IsCommandRunning("chargers-track"))
{
GetAwaiter().All();
UO.CommandHandler.Invoke("chargers-track");
}
return charger.Level;
}
private static EventJournalAwaiter GetAwaiter() =>
journal
.When<ServerRequestedGumpCloseEvent>(ev => ProcessCloseRequest(ev))
.When<GumpReceivedEvent>(ev => ProcessGump(ev));
private static void ProcessCloseRequest(ServerRequestedGumpCloseEvent ev)
{
fireCharger.ProcessCloseRequest(ev);
energyCharger.ProcessCloseRequest(ev);
mindCharger.ProcessCloseRequest(ev);
}
private static void ProcessGump(GumpReceivedEvent ev)
{
fireCharger.ProcessGump(ev);
energyCharger.ProcessGump(ev);
mindCharger.ProcessGump(ev);
}
public static void TrackChargers() => GetAwaiter().Incomming();
private class Charger
{
public int Level { get; private set; }
private GumpTypeId chargerGumpId;
private readonly int tilePicHueId;
private readonly int gumpPicId;
private readonly ScriptTrace trace;
public Charger(int gumpPicId, int tilePicHueId, ScriptTrace trace)
{
this.tilePicHueId = tilePicHueId;
this.gumpPicId = gumpPicId;
this.trace = trace;
}
public void ProcessGump(GumpReceivedEvent ev)
{
trace.Log("ProcessGump");
var processor = new ChargerGumpProcessor(gumpPicId, tilePicHueId);
var parser = new GumpParser(processor);
parser.Parse(ev.Gump);
if (processor.IsChargerGump)
{
chargerGumpId = ev.Gump.GumpTypeId;
Level = processor.ChargerLevel;
}
if (trace.Enabled) trace.Log($"IsCharger: {processor.IsChargerGump}, Level: {processor.ChargerLevel}, lastCharger: {Level}");
}
public void ProcessCloseRequest(ServerRequestedGumpCloseEvent ev)
{
Level = ev.GumpTypeId == chargerGumpId ? 0 : Level;
trace.Log($"Processing close request {ev.GumpTypeId}, Level={Level}");
}
private class ChargerGumpProcessor : IProcessGumpPic, IProcessTilePicHue
{
public int ChargerLevel { get; private set; }
public bool IsChargerGump { get; private set; }
private readonly int chargerGumpPicId;
private readonly int tilePicHueId;
public ChargerGumpProcessor(int chargerGumpPicId, int tilePicHueId)
{
this.chargerGumpPicId = chargerGumpPicId;
this.tilePicHueId = tilePicHueId;
}
public void OnGumpPic(int x, int y, int gumpId)
{
if (chargerGumpPicId == gumpId)
IsChargerGump = true;
}
public void OnTilePicHue(int x, int y, uint itemId, int hue)
{
if (itemId == tilePicHueId)
ChargerLevel++;
}
}
}
}
UO.RegisterBackgroundCommand("chargers-track", Chargers.TrackChargers);