blob: 9736d951081b99a02af6f452920a418f554651e5 (
plain)
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
115
116
|
package com.earth2me.essentials.update.states;
import com.earth2me.essentials.update.WorkListener;
import com.earth2me.essentials.update.VersionInfo;
import java.util.Iterator;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public class StateMachine extends WorkListener
{
public enum MachineResult
{
ABORT, WAIT, DONE
}
private final transient StateMap states = new StateMap();
private transient AbstractState current;
private final transient Player player;
public StateMachine(final Plugin plugin, final Player player, final VersionInfo newVersionInfo)
{
super(plugin, newVersionInfo);
this.player = player;
states.clear();
states.add(new EssentialsChat(states));
states.add(new EssentialsProtect(states));
current = states.values().iterator().next();
}
public MachineResult askQuestion()
{
while (current.guessAnswer())
{
current = current.getNextState();
if (current == null)
{
return MachineResult.DONE;
}
}
current.askQuestion(player);
return MachineResult.WAIT;
}
public MachineResult reactOnMessage(final String message)
{
final AbstractState next = current.reactOnAnswer(player, message);
if (next == null)
{
if (current.isAbortion())
{
return MachineResult.ABORT;
}
else
{
return MachineResult.DONE;
}
}
current = next;
return askQuestion();
}
private transient Iterator<AbstractState> iterator;
public void startWork()
{
iterator = states.values().iterator();
callStateWork();
}
private void callStateWork()
{
if (!iterator.hasNext())
{
if (player.isOnline())
{
player.sendMessage("Installation done.");
}
return;
}
final AbstractState state = iterator.next();
state.doWork(this);
}
@Override
public void onWorkAbort(final String message)
{
Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable()
{
@Override
public void run()
{
if (message != null && !message.isEmpty() && StateMachine.this.player.isOnline())
{
StateMachine.this.player.sendMessage(message);
}
}
});
}
@Override
public void onWorkDone(final String message)
{
Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable()
{
@Override
public void run()
{
if (message != null && !message.isEmpty() && StateMachine.this.player.isOnline())
{
StateMachine.this.player.sendMessage(message);
}
StateMachine.this.callStateWork();
}
});
}
}
|