-
-
Notifications
You must be signed in to change notification settings - Fork 302
/
Waypoints.java
139 lines (121 loc) · 4.22 KB
/
Waypoints.java
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package net.citizensnpcs.trait.waypoint;
import java.util.Map;
import java.util.Map.Entry;
import net.citizensnpcs.api.command.CommandContext;
import net.citizensnpcs.api.exception.NPCLoadException;
import net.citizensnpcs.api.persistence.PersistenceLoader;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.util.DataKey;
import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.editor.Editor;
import net.citizensnpcs.util.Messages;
import net.citizensnpcs.util.StringHelper;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.google.common.collect.Maps;
public class Waypoints extends Trait {
private WaypointProvider provider = new LinearWaypointProvider();
private String providerName = "linear";
public Waypoints() {
super("waypoints");
}
private WaypointProvider create(Class<? extends WaypointProvider> clazz) {
try {
return clazz.newInstance();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
public void describeProviders(CommandSender sender) {
Messaging.sendTr(sender, Messages.AVAILABLE_WAYPOINT_PROVIDERS);
for (String name : providers.keySet()) {
Messaging.send(sender, " - " + StringHelper.wrap(name));
}
}
/**
* Returns the current {@link WaypointProvider}. May be null during
* initialisation.
*
* @return The current provider
*/
public WaypointProvider getCurrentProvider() {
return provider;
}
/**
* @return The current provider name
*/
public String getCurrentProviderName() {
return providerName;
}
public Editor getEditor(Player player, CommandContext args) {
return provider.createEditor(player, args);
}
@Override
public void load(DataKey key) throws NPCLoadException {
provider = null;
providerName = key.getString("provider", "linear");
for (Entry<String, Class<? extends WaypointProvider>> entry : providers.entrySet()) {
if (entry.getKey().equals(providerName)) {
provider = create(entry.getValue());
break;
}
}
if (provider == null)
return;
PersistenceLoader.load(provider, key.getRelative(providerName));
provider.load(key.getRelative(providerName));
}
@Override
public void onSpawn() {
if (provider != null)
provider.onSpawn(getNPC());
}
@Override
public void save(DataKey key) {
if (provider == null)
return;
PersistenceLoader.save(provider, key.getRelative(providerName));
provider.save(key.getRelative(providerName));
key.setString("provider", providerName);
}
/**
* Sets the current {@link WaypointProvider} using the given name.
*
* @param name
* The name of the waypoint provider, registered using
* {@link #registerWaypointProvider(Class, String)}
* @return Whether the operation succeeded
*/
public boolean setWaypointProvider(String name) {
name = name.toLowerCase();
Class<? extends WaypointProvider> clazz = providers.get(name);
if (clazz == null)
return false;
provider = create(clazz);
if (provider == null)
return false;
providerName = name;
if (npc != null && npc.isSpawned())
provider.onSpawn(npc);
return true;
}
/**
* Registers a {@link WaypointProvider}, which can be subsequently used by
* NPCs.
*
* @param clazz
* The class of the waypoint provider
* @param name
* The name of the waypoint provider
*/
public static void registerWaypointProvider(Class<? extends WaypointProvider> clazz, String name) {
providers.put(name, clazz);
}
private static final Map<String, Class<? extends WaypointProvider>> providers = Maps.newHashMap();
static {
providers.put("linear", LinearWaypointProvider.class);
providers.put("wander", WanderWaypointProvider.class);
providers.put("jeebissfinding", JeebissFindingWaypointProvider.class);
}
}