-
-
Notifications
You must be signed in to change notification settings - Fork 102
/
NPCBossBarCommand.java
121 lines (114 loc) · 5.4 KB
/
NPCBossBarCommand.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
package com.denizenscript.denizen.scripts.commands.npc;
import com.denizenscript.denizen.objects.NPCTag;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizencore.exceptions.InvalidArgumentsRuntimeException;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.scripts.ScriptEntry;
import com.denizenscript.denizencore.scripts.commands.AbstractCommand;
import com.denizenscript.denizencore.scripts.commands.generator.ArgDefaultNull;
import com.denizenscript.denizencore.scripts.commands.generator.ArgName;
import com.denizenscript.denizencore.scripts.commands.generator.ArgPrefixed;
import com.denizenscript.denizencore.scripts.commands.generator.ArgSubType;
import net.citizensnpcs.trait.versioned.BossBarTrait;
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarFlag;
import org.bukkit.boss.BarStyle;
import java.util.List;
public class NPCBossBarCommand extends AbstractCommand {
public NPCBossBarCommand() {
setName("npcbossbar");
setSyntax("npcbossbar (remove) (color:<color>) (options:<option>|...) (range:<#>) (style:<style>) (title:<title>) (progress:<progress>) (view_permission:<permission>) (visible:<true/false>)");
setRequiredArguments(1, 8);
autoCompile();
}
// <--[command]
// @Name npcbossbar
// @Syntax npcbossbar (remove) (color:<color>) (options:<option>|...) (range:<#>) (style:<style>) (title:<title>) (progress:<progress>) (view_permission:<permission>) (visible:<true/false>)
// @Required 1
// @Maximum 8
// @Short Controls or removes the linked NPC's bossbar.
// @Group npc
//
// @Description
// Controls or removes the linked NPC's bossbar.
//
// Progress can be a number between 1 and 100 or 'health' to make it track the NPC's health.
// Placeholder API/Citizens placeholders are supported.
//
// Optionally specify a range around the NPC where the bossbar is visible, and/or a permission required to view it.
// Input an empty view permission to remove it ('view_permission:').
//
// Valid colors: <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/boss/BarColor.html>.
// Valid styles: <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/boss/BarStyle.html>.
// Valid options: <@link url https://hub.spigotmc.org/javadocs/spigot/org/bukkit/boss/BarFlag.html>.
//
// @Usage
// # Makes the linked NPC's bossbar green, and changes its title.
// - npcbossbar color:green "title:This bossbar is green!"
//
// @Usage
// # Makes it so the linked NPC's bossbar can only be visible 5 blocks away from it.
// - npcbossbar range:5
//
// @Usage
// # Removes a specific NPC's bossbar.
// - npcbossbar remove npc:<[theNPC]>
// -->
@Override
public void addCustomTabCompletions(TabCompletionsBuilder tab) {
tab.addWithPrefix("color:", BarColor.values());
tab.addWithPrefix("options:", BarFlag.values());
tab.addWithPrefix("style:", BarStyle.values());
tab.add("progress:health");
}
public static void autoExecute(ScriptEntry scriptEntry,
@ArgName("remove") boolean remove,
@ArgName("color") @ArgPrefixed @ArgDefaultNull BarColor color,
@ArgName("options") @ArgPrefixed @ArgDefaultNull @ArgSubType(BarFlag.class) List<BarFlag> options,
@ArgName("range") @ArgPrefixed @ArgDefaultNull ElementTag range,
@ArgName("style") @ArgPrefixed @ArgDefaultNull BarStyle style,
@ArgName("title") @ArgPrefixed @ArgDefaultNull String title,
@ArgName("progress") @ArgPrefixed @ArgDefaultNull String progress,
@ArgName("view_permission") @ArgPrefixed @ArgDefaultNull String viewPermission,
@ArgName("visible") @ArgPrefixed @ArgDefaultNull ElementTag visible) {
NPCTag npc = Utilities.getEntryNPC(scriptEntry);
if (npc == null) {
throw new InvalidArgumentsRuntimeException("Must have a linked NPC.");
}
if (remove) {
npc.getCitizen().removeTrait(BossBarTrait.class);
return;
}
BossBarTrait trait = npc.getCitizen().getOrAddTrait(BossBarTrait.class);
if (color != null) {
trait.setColor(color);
}
if (range != null) {
if (!range.isInt()) {
throw new InvalidArgumentsRuntimeException("Invalid number '" + range + "' specified for 'range'.");
}
trait.setRange(range.asInt());
}
if (options != null) {
trait.setFlags(options);
}
if (style != null) {
trait.setStyle(style);
}
if (title != null) {
trait.setTitle(title);
}
if (progress != null) {
trait.setTrackVariable(progress);
}
if (viewPermission != null) {
trait.setViewPermission(viewPermission.isEmpty() ? null : viewPermission);
}
if (visible != null) {
if (!visible.isBoolean()) {
throw new InvalidArgumentsRuntimeException("Invalid boolean '" + visible + "' specified for 'visible'.");
}
trait.setVisible(visible.asBoolean());
}
}
}