NullValkyrie

Minecraft 1.19 multipurpose plugin for spigot servers with a lot of features where most modern servers have.
git clone https://codeberg.org/night0721/NullValkyrie
Log | Files | Refs | README | LICENSE

commit 8aa9266b17ff5a7fa17e85e9837d3444b490840b
parent 3771481d1779beca62e98fa0f7f75ffdf114a9df
Author: NK <[email protected]>
Date:   Thu, 22 Dec 2022 23:42:47 +0000

resource pack + npcs 1.19.3

Diffstat:
Msrc/main/java/me/night/nullvalkyrie/entities/npcs/NPCManager.java | 90++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/main/java/me/night/nullvalkyrie/events/listeners/NPCEvents.java | 16++++++++--------
Msrc/main/java/me/night/nullvalkyrie/events/listeners/ServerEvents.java | 16+++++++++++++++-
3 files changed, 69 insertions(+), 53 deletions(-)

diff --git a/src/main/java/me/night/nullvalkyrie/entities/npcs/NPCManager.java b/src/main/java/me/night/nullvalkyrie/entities/npcs/NPCManager.java @@ -9,17 +9,17 @@ import me.night.nullvalkyrie.util.*; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.*; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.EntityPlayer; -import net.minecraft.server.level.WorldServer; -import net.minecraft.server.network.PlayerConnection; -import net.minecraft.world.entity.EnumItemSlot; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.world.entity.EquipmentSlot; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_19_R1.CraftServer; -import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_19_R2.CraftServer; +import org.bukkit.craftbukkit.v1_19_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -29,60 +29,62 @@ import java.util.List; import java.util.UUID; public class NPCManager { - private static final List<EntityPlayer> NPCs = new ArrayList<>(); + private static final List<ServerPlayer> NPCs = new ArrayList<>(); - public static List<EntityPlayer> getNPCs() { + public static List<ServerPlayer> getNPCs() { return NPCs; } public static void createNPC(Player player, String name) { // name must be less than 16 characters including color codes - EntityPlayer sp = ((CraftPlayer) player).getHandle(); - MinecraftServer server = sp.c; - WorldServer level = ((CraftWorld) player.getLocation().getWorld()).getHandle(); + ServerPlayer sp = ((CraftPlayer) player).getHandle(); + MinecraftServer server = sp.server; + ServerLevel level = ((CraftWorld) player.getLocation().getWorld()).getHandle(); GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color(name)); String[] skin = Skin.getSkin(player); gameProfile.getProperties().put("textures", new Property("textures", skin[0], skin[1])); - EntityPlayer npc = new EntityPlayer(server, level, gameProfile, null); + ServerPlayer npc = new ServerPlayer(server, level, gameProfile); Location location = player.getLocation(); - npc.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + npc.setPos(location.getX(), location.getY(), location.getZ()); addNPCPacket(npc); NPCs.add(npc); NPCDataManager.setNPC(name, (int) player.getLocation().getX(), (int) player.getLocation().getY(), (int) player.getLocation().getZ(), (int) player.getLocation().getPitch(), (int) player.getLocation().getYaw(), player.getLocation().getWorld().getName(), skin[0], skin[1]); } - public static void addNPCPacket(EntityPlayer npc) { + public static void addNPCPacket(ServerPlayer npc) { for (Player player : Bukkit.getOnlinePlayers()) { - PlayerConnection pc = ((CraftPlayer) player).getHandle().b; - pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc)); - pc.a(new PacketPlayOutNamedEntitySpawn(npc)); - pc.a(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.getBukkitYaw() * 256 / 360))); - DataWatcher watcher = npc.ai(); - watcher.b(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 127); - pc.a(new PacketPlayOutEntityMetadata(npc.ae(), watcher, true)); - Bukkit.getScheduler().runTaskLaterAsynchronously(Main.getPlugin(Main.class), () -> pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npc)), 50); + ServerGamePacketListenerImpl pc = ((CraftPlayer) player).getHandle().connection; + pc.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, npc)); + pc.send(new ClientboundAddPlayerPacket(npc)); + pc.send(new ClientboundRotateHeadPacket(npc, (byte) (npc.getBukkitYaw() * 256 / 360))); + SynchedEntityData watcher = npc.getEntityData(); + watcher.set(new EntityDataAccessor<>(17, EntityDataSerializers.BYTE), (byte) 127); + List<SynchedEntityData.DataValue<?>> list = watcher.getNonDefaultValues(); + pc.send(new ClientboundSetEntityDataPacket(npc.getBukkitEntity().getEntityId(), list)); + Bukkit.getScheduler().runTaskLaterAsynchronously(Main.getPlugin(Main.class), () -> pc.send(new ClientboundPlayerInfoRemovePacket(List.of(npc.getUUID()))), 50); ItemStack netheriteAxe = new ItemStack(Material.NETHERITE_AXE); ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT); - List<Pair<EnumItemSlot, net.minecraft.world.item.ItemStack>> list = new ArrayList<>(); - list.add(new Pair<>(EnumItemSlot.a, CraftItemStack.asNMSCopy(netheriteAxe))); - list.add(new Pair<>(EnumItemSlot.b, CraftItemStack.asNMSCopy(anotherAxe))); - pc.a(new PacketPlayOutEntityEquipment(npc.ae(), list)); + List<Pair<EquipmentSlot, net.minecraft.world.item.ItemStack>> itemList = new ArrayList<>(); + itemList.add(new Pair<>(EquipmentSlot.MAINHAND, CraftItemStack.asNMSCopy(netheriteAxe))); + itemList.add(new Pair<>(EquipmentSlot.OFFHAND, CraftItemStack.asNMSCopy(anotherAxe))); + pc.send(new ClientboundSetEquipmentPacket(npc.getBukkitEntity().getEntityId(), itemList)); } } public static void addJoinPacket(Player player) { - for (EntityPlayer npc : NPCs) { - PlayerConnection pc = ((CraftPlayer) player).getHandle().b; - pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc)); - pc.a(new PacketPlayOutNamedEntitySpawn(npc)); - pc.a(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.getBukkitYaw() * 256 / 360))); - DataWatcher watcher = npc.ai(); - watcher.b(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 127); - pc.a(new PacketPlayOutEntityMetadata(npc.ae(), watcher, true)); - Bukkit.getScheduler().runTaskLaterAsynchronously(Main.getPlugin(Main.class), () -> pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npc)), 50); + for (ServerPlayer npc : NPCs) { + ServerGamePacketListenerImpl pc = ((CraftPlayer) player).getHandle().connection; + pc.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, npc)); + pc.send(new ClientboundAddPlayerPacket(npc)); + pc.send(new ClientboundRotateHeadPacket(npc, (byte) (npc.getBukkitYaw() * 256 / 360))); + SynchedEntityData watcher = npc.getEntityData(); + watcher.set(new EntityDataAccessor<>(17, EntityDataSerializers.BYTE), (byte) 127); + List<SynchedEntityData.DataValue<?>> list = watcher.getNonDefaultValues(); + pc.send(new ClientboundSetEntityDataPacket(npc.getBukkitEntity().getEntityId(), list)); + Bukkit.getScheduler().runTaskLaterAsynchronously(Main.getPlugin(Main.class), () -> pc.send(new ClientboundPlayerInfoRemovePacket(List.of(npc.getUUID()))), 50); ItemStack netheriteAxe = new ItemStack(Material.NETHERITE_AXE); ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT); - List<Pair<EnumItemSlot, net.minecraft.world.item.ItemStack>> list = new ArrayList<>(); - list.add(new Pair<>(EnumItemSlot.a, CraftItemStack.asNMSCopy(netheriteAxe))); - list.add(new Pair<>(EnumItemSlot.b, CraftItemStack.asNMSCopy(anotherAxe))); - pc.a(new PacketPlayOutEntityEquipment(npc.ae(), list)); + List<Pair<EquipmentSlot, net.minecraft.world.item.ItemStack>> itemList = new ArrayList<>(); + itemList.add(new Pair<>(EquipmentSlot.MAINHAND, CraftItemStack.asNMSCopy(netheriteAxe))); + itemList.add(new Pair<>(EquipmentSlot.OFFHAND, CraftItemStack.asNMSCopy(anotherAxe))); + pc.send(new ClientboundSetEquipmentPacket(npc.getBukkitEntity().getEntityId(), itemList)); } } public static void reloadNPC(List<HashMap<String, Object>> npcs) { @@ -91,9 +93,9 @@ public class NPCManager { GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color((String) npc.get("name"))); gameProfile.getProperties().put("textures", new Property("textures", (String) npc.get("texture"), (String) npc.get("signature"))); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); - WorldServer w = ((CraftWorld) location.getWorld()).getHandle(); - EntityPlayer ep = new EntityPlayer(server, w, gameProfile, null); - ep.a(location.getX(), location.getY(), location.getZ(), location.getPitch(), location.getPitch()); // NMS: 1.19.2 https://nms.screamingsandals.org/1.19.2/net/minecraft/world/entity/Entity.html absMoveTo + ServerLevel w = ((CraftWorld) location.getWorld()).getHandle(); + ServerPlayer ep = new ServerPlayer(server, w, gameProfile); + ep.setPos(location.getX(), location.getY(), location.getZ()); // NMS: 1.19.2 https://nms.screamingsandals.org/1.19.2/net/minecraft/world/entity/Entity.html absMoveTo addNPCPacket(ep); NPCs.add(ep); } diff --git a/src/main/java/me/night/nullvalkyrie/events/listeners/NPCEvents.java b/src/main/java/me/night/nullvalkyrie/events/listeners/NPCEvents.java @@ -3,11 +3,11 @@ package me.night.nullvalkyrie.events.listeners; import me.night.nullvalkyrie.events.custom.RightClickNPCEvent; import me.night.nullvalkyrie.entities.npcs.NPCManager; import me.night.nullvalkyrie.util.Util; -import net.minecraft.network.protocol.game.PacketPlayOutEntity; -import net.minecraft.network.protocol.game.PacketPlayOutEntityHeadRotation; -import net.minecraft.server.network.PlayerConnection; +import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket; +import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket; +import net.minecraft.server.network.ServerGamePacketListenerImpl; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -17,7 +17,7 @@ public class NPCEvents implements Listener { @EventHandler public void onClick(RightClickNPCEvent e) { Player player = e.getPlayer(); - if (e.getNPC().getBukkitEntity().getName().equalsIgnoreCase(Util.color("&1&lRB18"))) { + if (e.getNPC().getBukkitEntity().getName().contains("SAI")) { player.sendMessage(Util.color("Hi")); } } @@ -29,9 +29,9 @@ public class NPCEvents implements Listener { location.setDirection(e.getPlayer().getLocation().subtract(location).toVector()); float yaw = location.getYaw(); float pitch = location.getPitch(); - PlayerConnection con = ((CraftPlayer) e.getPlayer()).getHandle().b; - con.a(new PacketPlayOutEntityHeadRotation(npc, (byte) ((yaw % 360) * 256 / 360))); - con.a(new PacketPlayOutEntity.PacketPlayOutEntityLook(npc.ae(), (byte) ((yaw % 360) * 256 / 360), (byte) ((pitch % 360) * 256 / 360), false)); + ServerGamePacketListenerImpl con = ((CraftPlayer) e.getPlayer()).getHandle().connection; + con.send(new ClientboundRotateHeadPacket(npc, (byte) ((yaw % 360) * 256 / 360))); + con.send(new ClientboundMoveEntityPacket.Rot(npc.getBukkitEntity().getEntityId(), (byte) ((yaw % 360) * 256 / 360), (byte) ((pitch % 360) * 256 / 360), false)); }); } } diff --git a/src/main/java/me/night/nullvalkyrie/events/listeners/ServerEvents.java b/src/main/java/me/night/nullvalkyrie/events/listeners/ServerEvents.java @@ -10,6 +10,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerResourcePackStatusEvent; import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.event.weather.WeatherChangeEvent; @@ -18,25 +19,29 @@ import java.io.File; public class ServerEvents implements Listener { public final BossBar bossbar; public final PacketInjector injector; + public ServerEvents() { bossbar = Bukkit.createBossBar(ChatColor.GOLD + "Kuudra", BarColor.RED, BarStyle.SEGMENTED_12); this.injector = new PacketInjector(); } + @EventHandler public void onJoin(PlayerJoinEvent e) { bossbar.addPlayer(e.getPlayer()); injector.addPlayer(e.getPlayer()); + e.getPlayer().setResourcePack("https://www.dropbox.com/s/7y7p93xzhar6vvw/%C2%A7b%C2%A7lNKRP%201.19.3.zip?dl=1"); } @EventHandler public void onQuit(PlayerQuitEvent e) { injector.removePlayer(e.getPlayer()); } + @EventHandler public void onPing(ServerListPingEvent e) { e.setMaxPlayers(8964); String s = Util.centerText("Vanadium", 45); - String s2 = Util.centerText("Support 1.19.2", 45); + String s2 = Util.centerText("Support 1.19.3", 45); e.setMotd(ChatColor.AQUA.toString() + ChatColor.BOLD + s + "\n" + ChatColor.GOLD + ChatColor.BOLD + s2); try { e.setServerIcon(Bukkit.loadServerIcon(new File("nuke.png"))); @@ -44,6 +49,7 @@ public class ServerEvents implements Listener { ee.printStackTrace(); } } + @EventHandler public void onClickHologram(InteractHologramEvent e) { if (e.getHologram().getCustomName() == null) return; @@ -51,8 +57,16 @@ public class ServerEvents implements Listener { // TODO: change hologram things } } + @EventHandler public void onWeatherChange(WeatherChangeEvent e) { e.setCancelled(true); } + + @EventHandler + public void onResourcePackChange(PlayerResourcePackStatusEvent e) { + if (e.getStatus() == PlayerResourcePackStatusEvent.Status.DECLINED || e.getStatus() == PlayerResourcePackStatusEvent.Status.FAILED_DOWNLOAD) { + e.getPlayer().kickPlayer("You must download the resource pack to play on this server!"); + } + } }