RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
CommandExtension.java
1package com.osroyale.game.plugin.extension;
2
3import com.google.common.collect.ArrayListMultimap;
4import com.google.common.collect.Multimap;
5import com.osroyale.game.plugin.PluginContext;
6import com.osroyale.game.world.entity.mob.data.PacketType;
7import com.osroyale.game.world.entity.mob.player.command.CommandParser;
8import com.osroyale.game.world.entity.mob.player.Player;
9import com.osroyale.game.world.entity.mob.player.command.Command;
10import org.apache.logging.log4j.LogManager;
11import org.apache.logging.log4j.Logger;
12
13import java.util.Collection;
14import java.util.HashSet;
15import java.util.Set;
16
39
40public abstract class CommandExtension extends PluginContext {
41
42 public static final Logger logger = LogManager.getLogger(CommandExtension.class);
43 protected static final Set<CommandExtension> extensions = new HashSet<>();
44
45 protected final Set<Command> commands = new HashSet<>();
46 public final Multimap<String, Command> multimap = ArrayListMultimap.create();
47
48 @Override
49 public void onInit() {
50 extensions.add(this);
51 register();
52 multimap.clear();
53 for (Command command : commands) {
54 if (command.getNames().length == 0) {
55 logger.warn(String.format("plugin=%s command missing name.", this.getClass().getSimpleName()));
56 continue;
57 }
58
59 for (String name : command.getNames()) {
60 final String key = name.toLowerCase();
61 if (multimap.containsKey(key)) {
62 logger.warn(String.format("plugin=%s duplicate command=%s", this.getClass().getSimpleName(), key));
63 continue;
64 }
65
66 multimap.put(key, command);
67 }
68 }
69 commands.clear();
70 }
71
72 protected abstract void register();
73
74 public abstract boolean canAccess(Player player);
75
76 private static boolean canExecute(Player player, CommandParser parser) {
77 return !player.locking.locked(PacketType.COMMANDS) || parser.getCommand().startsWith("key");
78 }
79
80 @Override
81 protected boolean handleCommand(Player player, CommandParser parser) {
82 if (!canExecute(player, parser)) {
83 return true;
84 }
85
86 for (CommandExtension extension : extensions) {
87
88 if (!extension.canAccess(player)) {
89 continue;
90 }
91
92 final Collection<Command> collection = extension.multimap.get(parser.getCommand().toLowerCase());
93
94 if (collection == null) {
95 continue;
96 }
97
98 if (collection.isEmpty()) {
99 continue;
100 }
101
102 final Command command = collection.toArray(new Command[0])[0];
103
104 // execute error
105 try {
106 command.execute(player, parser);
107 } catch (Exception ex) {
108 // but dont care about the exception
109 }
110
111 return true;
112
113 }
114 return false;
115 }
116
117}