Skip to content

Commit fa9b99b

Browse files
committed
Added first few classes
1 parent acb7101 commit fa9b99b

File tree

15 files changed

+1400
-0
lines changed

15 files changed

+1400
-0
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ repositories {
1717
dependencies {
1818
testImplementation(platform("org.junit:junit-bom:5.10.0"))
1919
testImplementation("org.junit.jupiter:junit-jupiter")
20+
implementation("net.kyori:adventure-text-minimessage:4.19.0")
2021
paperweight.paperDevBundle("1.21.4-R0.1-SNAPSHOT")
2122
}
2223

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,68 @@
11
package de.pascalpex.pexnpc;
22

3+
import de.pascalpex.pexnpc.events.listener.JoinEventListener;
4+
import de.pascalpex.pexnpc.files.Config;
5+
import de.pascalpex.pexnpc.files.NpcData;
6+
import de.pascalpex.pexnpc.npc.NPC;
7+
import de.pascalpex.pexnpc.util.Metrics;
8+
import de.pascalpex.pexnpc.util.VersionChecker;
39
import org.bukkit.plugin.java.JavaPlugin;
410

11+
import java.util.ArrayList;
12+
import java.util.List;
13+
import java.util.logging.Logger;
14+
515
public class Main extends JavaPlugin {
616

17+
private static final VersionChecker versionChecker = new VersionChecker();
18+
19+
private static Main instance;
20+
private static Logger logger;
21+
private static List<NPC> npcs;
22+
private static String version = "";
23+
724
@Override
825
public void onEnable() {
26+
version = getPlugin(this.getClass()).getDescription().getVersion();
27+
instance = this;
28+
logger = getLogger();
29+
npcs = new ArrayList<>();
30+
31+
Config.load();
32+
NpcData.load();
33+
34+
new Metrics(this, 14923);
35+
36+
if (Config.getUpdateChecker()) {
37+
versionChecker.fetchNewestVersion();
38+
}
39+
40+
// Listeners
41+
this.getServer().getPluginManager().registerEvents(new JoinEventListener(), this);
942
}
1043

1144
@Override
1245
public void onDisable() {
1346

1447
}
1548

49+
public static Main getInstance() {
50+
return instance;
51+
}
52+
53+
public static Logger logger() {
54+
return logger;
55+
}
56+
57+
public static List<NPC> getNpcs() {
58+
return npcs;
59+
}
60+
61+
public static String getVersion() {
62+
return version;
63+
}
64+
65+
public static VersionChecker getVersionChecker() {
66+
return versionChecker;
67+
}
1668
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package de.pascalpex.pexnpc.commands;
2+
3+
import de.pascalpex.pexnpc.Main;
4+
import de.pascalpex.pexnpc.files.NpcData;
5+
import org.bukkit.Bukkit;
6+
import org.bukkit.command.Command;
7+
import org.bukkit.command.CommandSender;
8+
import org.bukkit.entity.Player;
9+
import org.jetbrains.annotations.NotNull;
10+
import org.jetbrains.annotations.Nullable;
11+
12+
import java.util.ArrayList;
13+
import java.util.Collections;
14+
import java.util.List;
15+
16+
public class TabCompletion implements org.bukkit.command.TabCompleter {
17+
18+
@Nullable
19+
@Override
20+
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
21+
final List<String> completions = new ArrayList<>();
22+
if (label.equalsIgnoreCase("pexnpc")) {
23+
if (sender instanceof Player) {
24+
if (sender.hasPermission("pexnpc.command")) {
25+
if (args.length == 1) {
26+
completions.add("help");
27+
completions.add("reload");
28+
completions.add("create");
29+
completions.add("list");
30+
completions.add("delete");
31+
completions.add("name");
32+
completions.add("movehere");
33+
completions.add("tp");
34+
completions.add("skin");
35+
completions.add("cmd");
36+
completions.add("msg");
37+
completions.add("item");
38+
completions.add("clear");
39+
completions.removeIf(s -> !s.startsWith(args[0].toLowerCase()));
40+
}
41+
if (args.length == 2) {
42+
if (args[0].equalsIgnoreCase("clear") || args[0].equalsIgnoreCase("delete") || args[0].equalsIgnoreCase("name") || args[0].equalsIgnoreCase("tp") || args[0].equalsIgnoreCase("movehere") || args[0].equalsIgnoreCase("skin") || args[0].equalsIgnoreCase("cmd") || args[0].equalsIgnoreCase("msg") || args[0].equalsIgnoreCase("item")) {
43+
for (int i = 1; i <= Main.getNpcs().size(); i++) {
44+
completions.add(String.valueOf(i));
45+
}
46+
completions.removeIf(s -> !s.startsWith(args[1]));
47+
}
48+
}
49+
if (args.length == 3) {
50+
if (args[0].equalsIgnoreCase("item")) {
51+
completions.add("HAND");
52+
completions.add("OFFHAND");
53+
completions.add("HELMET");
54+
completions.add("CHESTPLATE");
55+
completions.add("LEGGINGS");
56+
completions.add("BOOTS");
57+
completions.removeIf(s -> !s.startsWith(args[2].toUpperCase()));
58+
}
59+
if (args[0].equalsIgnoreCase("skin")) {
60+
for (Player player : Bukkit.getOnlinePlayers()) {
61+
completions.add(player.getName());
62+
}
63+
completions.removeIf(s -> !s.toLowerCase().startsWith(args[2].toLowerCase()));
64+
}
65+
}
66+
Collections.sort(completions);
67+
return completions;
68+
}
69+
}
70+
}
71+
return null;
72+
}
73+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package de.pascalpex.pexnpc.events;
2+
3+
import de.pascalpex.pexnpc.npc.NPC;
4+
import de.pascalpex.pexnpc.util.ReflectionHelper;
5+
import io.netty.channel.Channel;
6+
import io.netty.channel.ChannelHandlerContext;
7+
import io.netty.handler.codec.MessageToMessageDecoder;
8+
import net.minecraft.network.Connection;
9+
import net.minecraft.network.protocol.Packet;
10+
import net.minecraft.network.protocol.game.ServerboundInteractPacket;
11+
import net.minecraft.server.level.ServerPlayer;
12+
import net.minecraft.server.network.ServerGamePacketListenerImpl;
13+
import de.pascalpex.pexnpc.Main;
14+
import org.bukkit.Bukkit;
15+
import org.bukkit.craftbukkit.entity.CraftPlayer;
16+
import org.bukkit.entity.Player;
17+
18+
import java.util.*;
19+
import java.util.stream.Collectors;
20+
21+
public class PacketReader {
22+
23+
Channel channel;
24+
public static Map<UUID, Channel> channels = new HashMap<>();
25+
public static Map<UUID, Boolean> clicking = new HashMap<>();
26+
27+
public void inject(Player player) throws NoSuchFieldException, IllegalAccessException {
28+
CraftPlayer craftPlayer = (CraftPlayer) player;
29+
ServerGamePacketListenerImpl serverConnection = craftPlayer.getHandle().connection;
30+
Connection connection = (Connection) ReflectionHelper.getValue(serverConnection, "e");
31+
channel = connection.channel;
32+
channels.put(player.getUniqueId(), channel);
33+
34+
if (channel.pipeline().get("PacketInjector") != null) {
35+
return;
36+
}
37+
38+
try {
39+
channel.pipeline().addAfter("decoder", "PacketInjector", new MessageToMessageDecoder<ServerboundInteractPacket>() {
40+
41+
@Override
42+
protected void decode(ChannelHandlerContext channel, ServerboundInteractPacket packet, List<Object> arg) {
43+
arg.add(packet);
44+
readPacket(player, packet);
45+
}
46+
47+
});
48+
} catch (NoSuchElementException ignored) {
49+
} // Player is no longer online
50+
51+
}
52+
53+
public void uninject(Player player) {
54+
channel = channels.get(player.getUniqueId());
55+
if (channel == null) {
56+
return;
57+
}
58+
if (channel.pipeline().get("PacketInjector") != null) {
59+
channel.pipeline().remove("PacketInjector");
60+
}
61+
channels.remove(player.getUniqueId());
62+
}
63+
64+
public void readPacket(Player player, Packet<?> packet) {
65+
66+
String packetName = packet.getClass().getSimpleName();
67+
if (packetName.equalsIgnoreCase("PacketPlayInUseEntity") || packetName.equalsIgnoreCase("ServerboundInteractPacket")) {
68+
69+
int id = (int) ReflectionHelper.getValue(packet, "b");
70+
71+
for (ServerPlayer npc : Main.getNpcs().stream().map(NPC::getServerPlayer).toList()) {
72+
if (npc.getId() == id) {
73+
if (!clicking.containsKey(player.getUniqueId())) {
74+
clicking.put(player.getUniqueId(), true);
75+
Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), () -> {
76+
clicking.remove(player.getUniqueId());
77+
Bukkit.getPluginManager().callEvent(new RightClickNPC(player, npc));
78+
}, 1);
79+
}
80+
}
81+
}
82+
83+
}
84+
}
85+
86+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package de.pascalpex.pexnpc.events;
2+
3+
import net.minecraft.server.level.ServerPlayer;
4+
import org.bukkit.entity.Player;
5+
import org.bukkit.event.Cancellable;
6+
import org.bukkit.event.Event;
7+
import org.bukkit.event.HandlerList;
8+
9+
public class RightClickNPC extends Event implements Cancellable {
10+
11+
private final Player player;
12+
private final ServerPlayer npc;
13+
private boolean isCancelled;
14+
private static final HandlerList HANDLERS = new HandlerList();
15+
16+
public RightClickNPC(Player player, ServerPlayer npc) {
17+
this.player = player;
18+
this.npc = npc;
19+
}
20+
21+
public Player getPlayer() {
22+
return player;
23+
}
24+
25+
public ServerPlayer getNpc() {
26+
return npc;
27+
}
28+
29+
@Override
30+
public HandlerList getHandlers() {
31+
return HANDLERS;
32+
}
33+
34+
public static HandlerList getHandlerList() {
35+
return HANDLERS;
36+
}
37+
38+
@Override
39+
public boolean isCancelled() {
40+
return isCancelled;
41+
}
42+
43+
@Override
44+
public void setCancelled(boolean b) {
45+
isCancelled = b;
46+
}
47+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package de.pascalpex.pexnpc.events.listener;
2+
3+
import de.pascalpex.pexnpc.Main;
4+
import de.pascalpex.pexnpc.files.Config;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.event.EventHandler;
7+
import org.bukkit.event.Listener;
8+
import org.bukkit.event.player.PlayerJoinEvent;
9+
10+
public class JoinEventListener implements Listener {
11+
12+
@EventHandler
13+
public void onJoin(PlayerJoinEvent event) {
14+
Player player = event.getPlayer();
15+
if (Config.getUpdateChecker()) {
16+
if (player.hasPermission("pexnpc.update")) {
17+
Main.getVersionChecker().playerJoin(player);
18+
}
19+
}
20+
}
21+
22+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package de.pascalpex.pexnpc.files;
2+
3+
import org.bukkit.configuration.InvalidConfigurationException;
4+
import org.bukkit.configuration.file.FileConfiguration;
5+
import org.bukkit.configuration.file.YamlConfiguration;
6+
7+
import java.io.File;
8+
import java.io.IOException;
9+
10+
public class Config {
11+
12+
public static File configFile = new File("plugins/PexNPC", "config.yml");
13+
public static FileConfiguration config = YamlConfiguration.loadConfiguration(configFile);
14+
15+
public static void load() {
16+
try {
17+
configFile.getParentFile().mkdirs();
18+
if (!configFile.exists()) {
19+
configFile.createNewFile();
20+
config.options().header("Skin Mode 1: No second layer, no cape 2: Only second layer 3: Second layer and cape");
21+
config.set("skinMode", 2);
22+
config.set("prefix", "&7[&ePexNPC&7]");
23+
config.set("skinTimeout", 40);
24+
save();
25+
}
26+
config.load(configFile);
27+
if (!config.contains("updateChecker")) {
28+
config.set("updateChecker", true);
29+
}
30+
if (!config.contains("logNPCClickedCommands")) {
31+
config.set("logNPCClickedCommands", false);
32+
}
33+
if (!config.contains("spectatorModeOnTeleport")) {
34+
config.set("spectatorModeOnTeleport", true);
35+
}
36+
save();
37+
} catch (IOException | InvalidConfigurationException e) {
38+
e.printStackTrace();
39+
}
40+
41+
}
42+
43+
public static void save() {
44+
try {
45+
config.save(configFile);
46+
} catch (IOException e) {
47+
48+
e.printStackTrace();
49+
}
50+
}
51+
52+
public static boolean getUpdateChecker() {
53+
return config.getBoolean("updateChecker");
54+
}
55+
56+
public static boolean getLogCommands() {
57+
return config.getBoolean("logNPCClickedCommands");
58+
}
59+
60+
public static int getSkinMode() {
61+
return config.getInt("skinMode");
62+
}
63+
64+
public static String getPrefix() {
65+
return config.getString("prefix").replace("&", "§");
66+
}
67+
68+
public static int getSkinTimeout() {
69+
return config.getInt("skinTimeout");
70+
}
71+
72+
public static boolean getSpectatorModeOnTeleport() {
73+
return config.getBoolean("spectatorModeOnTeleport");
74+
}
75+
76+
}

0 commit comments

Comments
 (0)