/
TriggerTrait.java
156 lines (137 loc) · 7.62 KB
/
TriggerTrait.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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package net.aufdemrand.denizen.npc.traits;
import net.aufdemrand.denizen.scripts.commands.core.EngageCommand;
import net.aufdemrand.denizen.scripts.triggers.AbstractTrigger;
import net.aufdemrand.denizen.scripts.triggers.TriggerRegistry.CooldownType;
import net.aufdemrand.denizen.utilities.DenizenAPI;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.citizensnpcs.api.persistence.Persist;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.command.exception.CommandException;
import net.citizensnpcs.util.Messages;
import net.citizensnpcs.util.Paginator;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
public class TriggerTrait extends Trait implements Listener {
@Persist(value="enabled", collectionType=ConcurrentHashMap.class)
private Map<String, Boolean> enabled = new ConcurrentHashMap<String, Boolean>();
@Persist(value="duration", collectionType=ConcurrentHashMap.class)
private Map<String, Double> duration = new ConcurrentHashMap<String, Double>();
@Persist(value="cooldowntype", collectionType=ConcurrentHashMap.class)
private Map<String, CooldownType> type = new ConcurrentHashMap<String, CooldownType>();
@Persist(value="radius", collectionType=ConcurrentHashMap.class)
private Map<String, Integer> radius = new ConcurrentHashMap<String, Integer>();
public void report() {
dB.echoDebug("enabled: " + enabled.entrySet().toString());
dB.echoDebug("duration: " + duration.entrySet().toString());
dB.echoDebug("type: " + type.entrySet().toString());
dB.echoDebug("radius: " + radius.entrySet().toString());
}
public TriggerTrait() {
super("triggers");
for (String triggerName : DenizenAPI.getCurrentInstance().getTriggerRegistry().list().keySet())
if (!enabled.containsKey(triggerName))
enabled.put(triggerName, DenizenAPI.getCurrentInstance().getTriggerRegistry().get(triggerName).getOptions().ENABLED_BY_DEFAULT);
}
public void onSpawn() {
for (String triggerName : DenizenAPI.getCurrentInstance().getTriggerRegistry().list().keySet())
if (!enabled.containsKey(triggerName))
enabled.put(triggerName, DenizenAPI.getCurrentInstance().getTriggerRegistry().get(triggerName).getOptions().ENABLED_BY_DEFAULT);
}
/**
* Toggles a trigger on or off for this NPC.
*
* @param triggerName name of the Trigger, as specified by the Trigger. Case in-sensitive.
* @param toggle new state of the trigger
* @return
*/
public String toggleTrigger(String triggerName, boolean toggle) {
if (enabled.containsKey(triggerName.toUpperCase())) {
enabled.put(triggerName.toUpperCase(), toggle);
return triggerName + " trigger is now " + (toggle ? "enabled." : "disabled.");
}
else return triggerName + " trigger not found!";
}
public String toggleTrigger(String triggerName) {
if (enabled.containsKey(triggerName.toUpperCase()))
if (enabled.get(triggerName.toUpperCase())) {
enabled.put(triggerName.toUpperCase(), false);
return triggerName + " trigger is now disabled.";
} else {
enabled.put(triggerName.toUpperCase(), true);
return triggerName + " trigger is now enabled.";
}
else return triggerName + " trigger not found!";
}
public boolean isEnabled(String triggerName) {
if (!DenizenAPI.getDenizenNPC(npc).hasAssignment()) return false;
if (enabled.containsKey(triggerName.toUpperCase()))
return enabled.get(triggerName.toUpperCase());
else return false;
}
public void setLocalCooldown(String triggerName, double value) {
duration.put(triggerName.toUpperCase(), value);
}
public double getCooldownDuration(String triggerName) {
if (duration.containsKey(triggerName.toUpperCase()))
return duration.get(triggerName.toUpperCase());
else return DenizenAPI.getCurrentInstance().getTriggerRegistry().get(triggerName).getOptions().DEFAULT_COOLDOWN;
}
public CooldownType getCooldownType(String triggerName) {
if (type.containsKey(triggerName.toUpperCase()))
return type.get(triggerName.toUpperCase());
else return DenizenAPI.getCurrentInstance().getTriggerRegistry().get(triggerName).getOptions().DEFAULT_COOLDOWN_TYPE;
}
public void setLocalRadius(String triggerName, int value) {
radius.put(triggerName.toUpperCase(), value);
}
public double getRadius(String triggerName) {
if (radius.containsKey(triggerName.toUpperCase()))
return radius.get(triggerName.toUpperCase());
else return DenizenAPI.getCurrentInstance().getTriggerRegistry().get(triggerName).getOptions().DEFAULT_RADIUS;
}
public void describe(CommandSender sender, int page) throws CommandException {
Paginator paginator = new Paginator().header("Triggers");
paginator.addLine("<e>Key: <a>Name <b>Status <c>Cooldown <d>Cooldown Type <e>(Radius)");
for (Entry<String, Boolean> entry : enabled.entrySet()) {
String line = "<a> " + entry.getKey()
+ "<b> " + (entry.getValue() ? "Enabled" : "Disabled")
+ "<c> " + getCooldownDuration(entry.getKey())
+ "<d> " + getCooldownType(entry.getKey()).name()
+ "<e> " + (getRadius(entry.getKey()) == -1 ? "" : getRadius(entry.getKey()));
paginator.addLine(line);
}
if (!paginator.sendPage(sender, page))
throw new CommandException(Messages.COMMAND_PAGE_MISSING, page);
}
public boolean triggerCooldownOnly(AbstractTrigger triggerClass, Player player) {
// Check cool down, return false if not yet met
if (!DenizenAPI.getCurrentInstance().getTriggerRegistry().checkCooldown(npc, player, triggerClass, getCooldownType(triggerClass.getName())))
return false;
// Check engaged
if (DenizenAPI.getCurrentInstance().getCommandRegistry().get(EngageCommand.class).getEngaged(npc)) {
return false;
}
// Set cool down
DenizenAPI.getCurrentInstance().getTriggerRegistry().setCooldown(npc, player, triggerClass, getCooldownDuration(triggerClass.getName()), getCooldownType(triggerClass.getName()));
return true;
}
public boolean trigger(AbstractTrigger triggerClass, Player player) {
// Check cool down, return false if not yet met
if (!DenizenAPI.getCurrentInstance().getTriggerRegistry().checkCooldown(npc, player, triggerClass, getCooldownType(triggerClass.getName())))
return false;
// Check engaged
if (DenizenAPI.getCurrentInstance().getCommandRegistry().get(EngageCommand.class).getEngaged(npc)) {
// On Unavailable Action
DenizenAPI.getCurrentInstance().getNPCRegistry().getDenizen(npc).action("unavailable", player);
return false;
}
// Set cool down, On [TriggerName] Action
DenizenAPI.getCurrentInstance().getTriggerRegistry().setCooldown(npc, player, triggerClass, getCooldownDuration(triggerClass.getName()), getCooldownType(triggerClass.getName()));
DenizenAPI.getCurrentInstance().getNPCRegistry().getDenizen(npc).action(triggerClass.getName(), player);
return true;
}
}