-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathEffectCommands.java
More file actions
112 lines (92 loc) · 4.66 KB
/
Copy pathEffectCommands.java
File metadata and controls
112 lines (92 loc) · 4.66 KB
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
package com.github.skriptdev.skript.plugin.command;
import com.github.skriptdev.skript.api.skript.event.PlayerContext;
import com.github.skriptdev.skript.api.utils.Utils;
import com.github.skriptdev.skript.plugin.Skript;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.server.core.event.events.player.PlayerChatEvent;
import com.hypixel.hytale.server.core.permissions.PermissionsModule;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import com.hypixel.hytale.server.core.universe.Universe;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import io.github.syst3ms.skriptparser.lang.Effect;
import io.github.syst3ms.skriptparser.log.LogEntry;
import io.github.syst3ms.skriptparser.log.SkriptLogger;
import io.github.syst3ms.skriptparser.parsing.ParserState;
import io.github.syst3ms.skriptparser.parsing.SyntaxParser;
import io.github.syst3ms.skriptparser.registration.context.ContextValue.Usage;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
public class EffectCommands {
public static void register(Skript skript, String token, boolean allowOps, String permission) {
skript.getSkriptRegistration().newContextValue(PlayerEffectContext.class, Player.class, true, "me", PlayerEffectContext::getPlayer)
.setUsage(Usage.EXPRESSION_OR_ALONE)
.register();
skript.getPlugin().getEventRegistry().registerGlobal(PlayerChatEvent.class, event -> {
if (event.getContent().startsWith(token)) {
PlayerRef sender = event.getSender();
// PERM CHECK
// Pretty sure the OP stuff doesn't work
PermissionsModule perm = PermissionsModule.get();
Set<String> groupsForUser = perm.getGroupsForUser(sender.getUuid());
if (!allowOps) {
if (groupsForUser.contains("OP") && !perm.hasPermission(sender.getUuid(), permission)) {
return;
}
} else if (!perm.hasPermission(sender.getUuid(), permission)) {
return;
}
event.setCancelled(true);
// Create dummy ParserState/Logger for effect commands
ParserState parserState = new ParserState();
parserState.setCurrentContexts(Set.of(PlayerEffectContext.class));
SkriptLogger skriptLogger = new SkriptLogger(true);
skriptLogger.setFileInfo("dummy_cause_this_doesnt_matter.sk", List.of());
// Parse effect
String effectString = event.getContent().substring(1);
Optional<? extends Effect> optionalEffect = SyntaxParser.parseEffect(effectString, parserState, skriptLogger);
// If no effect available, send logs
if (optionalEffect.isEmpty()) {
skriptLogger.finalizeLogs();
for (LogEntry logEntry : skriptLogger.close()) {
Utils.log(sender, logEntry);
}
return;
}
Effect effect = optionalEffect.get();
Ref<EntityStore> reference = sender.getReference();
if (reference == null) return;
UUID worldUuid = sender.getWorldUuid();
if (worldUuid == null) return;
World world = Universe.get().getWorld(worldUuid);
if (world == null) return;
skriptLogger.info("Executing: '" + effectString + "'");
skriptLogger.finalizeLogs();
for (LogEntry logEntry : skriptLogger.close()) {
Utils.log(sender, logEntry);
}
if (world.isInThread()) {
Player player = world.getEntityStore().getStore().getComponent(reference, Player.getComponentType());
effect.walk(new PlayerEffectContext(player));
} else {
world.execute(() -> {
Player player = world.getEntityStore().getStore().getComponent(reference, Player.getComponentType());
effect.walk(new PlayerEffectContext(player));
});
}
}
});
}
private record PlayerEffectContext(Player player) implements PlayerContext {
public Player[] getPlayer() {
return new Player[]{this.player};
}
@Override
public String getName() {
return "player effect context";
}
}
}