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 8441c06a175e52b82de2ad5aa8bf4902f32c5847
parent f8d85374c927ccfa610a9d07133272f68ba67346
Author: NK <[email protected]>
Date:   Sun,  4 Dec 2022 11:56:52 +0000

organisation and hologram interaction

Diffstat:
Msrc/main/java/me/night/nullvalkyrie/Main.java | 6++++--
Msrc/main/java/me/night/nullvalkyrie/commands/RankCommand.java | 2+-
Msrc/main/java/me/night/nullvalkyrie/database/NPCDataManager.java | 2+-
Msrc/main/java/me/night/nullvalkyrie/database/RankDataManager.java | 2+-
Asrc/main/java/me/night/nullvalkyrie/entities/npcs/NPCManager.java | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/entities/npcs/Skin.java | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/enums/Rank.java | 17+++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/enums/Rarity.java | 38++++++++++++++++++++++++++++++++++++++
Dsrc/main/java/me/night/nullvalkyrie/events/CustomItemEvents.java | 367-------------------------------------------------------------------------------
Dsrc/main/java/me/night/nullvalkyrie/events/DamageEffectEvents.java | 112-------------------------------------------------------------------------------
Dsrc/main/java/me/night/nullvalkyrie/events/ServerEvents.java | 42------------------------------------------
Asrc/main/java/me/night/nullvalkyrie/events/custom/InteractHologramEvent.java | 41+++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/events/custom/RightClickNPCEvent.java | 42++++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/events/listeners/CustomItemEvents.java | 357+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/events/listeners/DamageEffectEvents.java | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/events/listeners/NPCEvents.java | 37+++++++++++++++++++++++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/events/listeners/ServerEvents.java | 48++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/main/java/me/night/nullvalkyrie/items/CustomItemManager.java | 18+-----------------
Dsrc/main/java/me/night/nullvalkyrie/items/Rarity.java | 47-----------------------------------------------
Dsrc/main/java/me/night/nullvalkyrie/npc/NPCEvents.java | 35-----------------------------------
Dsrc/main/java/me/night/nullvalkyrie/npc/NPCManager.java | 89-------------------------------------------------------------------------------
Dsrc/main/java/me/night/nullvalkyrie/npc/PacketHandler.java | 58----------------------------------------------------------
Dsrc/main/java/me/night/nullvalkyrie/npc/PacketInjector.java | 41-----------------------------------------
Dsrc/main/java/me/night/nullvalkyrie/npc/RightClickNPC.java | 42------------------------------------------
Dsrc/main/java/me/night/nullvalkyrie/npc/Skin.java | 49-------------------------------------------------
Asrc/main/java/me/night/nullvalkyrie/packets/PacketHandler.java | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/packets/PacketInjector.java | 41+++++++++++++++++++++++++++++++++++++++++
Msrc/main/java/me/night/nullvalkyrie/ui/NameTagManager.java | 1+
Dsrc/main/java/me/night/nullvalkyrie/ui/Rank.java | 17-----------------
Msrc/main/java/me/night/nullvalkyrie/ui/ScoreboardListener.java | 3++-
30 files changed, 963 insertions(+), 922 deletions(-)

diff --git a/src/main/java/me/night/nullvalkyrie/Main.java b/src/main/java/me/night/nullvalkyrie/Main.java @@ -2,12 +2,14 @@ package me.night.nullvalkyrie; import com.mongodb.client.MongoDatabase; import io.github.cdimascio.dotenv.Dotenv; +import me.night.nullvalkyrie.events.listeners.CustomItemEvents; +import me.night.nullvalkyrie.events.listeners.DamageEffectEvents; +import me.night.nullvalkyrie.events.listeners.NPCEvents; +import me.night.nullvalkyrie.events.listeners.ServerEvents; import me.night.nullvalkyrie.ui.inventory.InventoryListener; import me.night.nullvalkyrie.database.NPCDataManager; import me.night.nullvalkyrie.discord.DiscordClientManager; import me.night.nullvalkyrie.enchantments.EnchantmentManager; -import me.night.nullvalkyrie.events.*; -import me.night.nullvalkyrie.npc.*; import me.night.nullvalkyrie.ui.ScoreboardListener; import me.night.nullvalkyrie.util.*; import me.night.nullvalkyrie.commands.*; diff --git a/src/main/java/me/night/nullvalkyrie/commands/RankCommand.java b/src/main/java/me/night/nullvalkyrie/commands/RankCommand.java @@ -1,7 +1,7 @@ package me.night.nullvalkyrie.commands; import me.night.nullvalkyrie.database.RankDataManager; -import me.night.nullvalkyrie.ui.Rank; +import me.night.nullvalkyrie.enums.Rank; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; diff --git a/src/main/java/me/night/nullvalkyrie/database/NPCDataManager.java b/src/main/java/me/night/nullvalkyrie/database/NPCDataManager.java @@ -15,7 +15,7 @@ import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; import java.util.UUID; -import static me.night.nullvalkyrie.npc.NPCManager.*; +import static me.night.nullvalkyrie.entities.npcs.NPCManager.*; public class NPCDataManager { diff --git a/src/main/java/me/night/nullvalkyrie/database/RankDataManager.java b/src/main/java/me/night/nullvalkyrie/database/RankDataManager.java @@ -2,7 +2,7 @@ package me.night.nullvalkyrie.database; import com.mongodb.client.MongoCursor; import com.mongodb.client.model.Filters; -import me.night.nullvalkyrie.ui.Rank; +import me.night.nullvalkyrie.enums.Rank; import org.bson.Document; import org.bson.conversions.Bson; import org.bukkit.Bukkit; diff --git a/src/main/java/me/night/nullvalkyrie/entities/npcs/NPCManager.java b/src/main/java/me/night/nullvalkyrie/entities/npcs/NPCManager.java @@ -0,0 +1,89 @@ +package me.night.nullvalkyrie.entities.npcs; + +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import com.mojang.datafixers.util.Pair; +import me.night.nullvalkyrie.Main; +import me.night.nullvalkyrie.database.NPCDataManager; +import me.night.nullvalkyrie.util.Util; +import net.minecraft.network.protocol.game.*; +import net.minecraft.network.syncher.DataWatcher; +import net.minecraft.network.syncher.DataWatcherObject; +import net.minecraft.network.syncher.DataWatcherRegistry; +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 org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +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.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class NPCManager { + private static final List<EntityPlayer> NPCs = new ArrayList<>(); + + public static List<EntityPlayer> 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(); + 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); + Location location = player.getLocation(); + npc.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + 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) { + 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); + 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)); + } + } + + 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); + 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)); + } + } + +} diff --git a/src/main/java/me/night/nullvalkyrie/entities/npcs/Skin.java b/src/main/java/me/night/nullvalkyrie/entities/npcs/Skin.java @@ -0,0 +1,49 @@ +package me.night.nullvalkyrie.entities.npcs; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.io.InputStreamReader; +import java.net.URL; + +public class Skin { + private final String texture; + private final String signature; + public Skin(String texture, String signature) { + this.texture = texture; + this.signature = signature; + } + public String getTexture() { return texture; } + public String getSignature() { return signature; } + + public static String[] getSkin(String name) { + try { + URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + name); + InputStreamReader reader = new InputStreamReader(url.openStream()); + String uuid = new JsonParser().parse(reader).getAsJsonObject().get("id").getAsString(); + URL url2 = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid + "?unsigned=false"); + InputStreamReader reader2 = new InputStreamReader(url2.openStream()); + JsonObject properties = new JsonParser().parse(reader2).getAsJsonObject().get("properties").getAsJsonArray().get(0).getAsJsonObject(); + String texture = properties.get("value").getAsString(); + String signature = properties.get("signature").getAsString(); + return new String[] {texture, signature}; + } catch (Exception e) { + return new String[]{}; + } + } + public static String[] getSkin(Player player) { + try { + GameProfile profile = ((CraftPlayer) player).getProfile(); + Property property = profile.getProperties().get("textures").iterator().next(); + String texture = property.getValue(); + String signature = property.getSignature(); + return new String[]{texture, signature}; + } catch (Exception e) { + return new String[]{}; + } + } +} diff --git a/src/main/java/me/night/nullvalkyrie/enums/Rank.java b/src/main/java/me/night/nullvalkyrie/enums/Rank.java @@ -0,0 +1,17 @@ +package me.night.nullvalkyrie.enums; + +import org.bukkit.ChatColor; + +public enum Rank { + OWNER(ChatColor.DARK_RED + "<OWNER>"), ADMIN(ChatColor.RED + "<ADMIN>"), SPECIAL(ChatColor.GOLD + "<SPECIAL>"), ROOKIE(ChatColor.DARK_GREEN + "<ROOKIE>"); + + private final String display; + + Rank(String display) { + this.display = display; + } + + public String getDisplay() { + return display; + } +} diff --git a/src/main/java/me/night/nullvalkyrie/enums/Rarity.java b/src/main/java/me/night/nullvalkyrie/enums/Rarity.java @@ -0,0 +1,38 @@ +package me.night.nullvalkyrie.enums; + +import org.bukkit.ChatColor; +public enum Rarity { + COMMON(ChatColor.WHITE.toString() + ChatColor.BOLD + "COMMON", ChatColor.WHITE.toString()), + UNCOMMON(net.md_5.bungee.api.ChatColor.of("#31ff09").toString() + ChatColor.BOLD + "UNCOMMON", net.md_5.bungee.api.ChatColor.of("#31ff09").toString()), + RARE(net.md_5.bungee.api.ChatColor.of("#2f57ae").toString() + ChatColor.BOLD + "RARE", net.md_5.bungee.api.ChatColor.of("#2f57ae").toString()), + EPIC(net.md_5.bungee.api.ChatColor.of("#b201b2").toString() + ChatColor.BOLD + "EPIC", net.md_5.bungee.api.ChatColor.of("#b201b2").toString()), + LEGENDARY(net.md_5.bungee.api.ChatColor.of("#ffa21b").toString() + ChatColor.BOLD + "LEGENDARY", net.md_5.bungee.api.ChatColor.of("#ffa21b").toString()), + MYTHIC(net.md_5.bungee.api.ChatColor.of("#ff23ff").toString() + ChatColor.BOLD + "MYTHIC", net.md_5.bungee.api.ChatColor.of("#ff23ff").toString()), + ULTRA(ChatColor.RED.toString() + ChatColor.BOLD + "ULTRA", ChatColor.RED.toString()), + GRAND(net.md_5.bungee.api.ChatColor.of("#00fdff").toString() + ChatColor.BOLD + "GRAND", net.md_5.bungee.api.ChatColor.of("#00fdff").toString()); + private String display; + private String color; + Rarity(String display, String color) { + this.display = display; + this.color = color; + } + public String getDisplay() { + return display; + } + public String getColor() { + return color; + } + public static Rarity getRarity(String str) { + return switch (str) { + case "COMMON" -> COMMON; + case "UNCOMMON" -> UNCOMMON; + case "RARE" -> RARE; + case "EPIC" -> EPIC; + case "LEGENDARY" -> LEGENDARY; + case "MYTHIC" -> MYTHIC; + case "ULTRA" -> ULTRA; + case "GRAND" -> GRAND; + default -> COMMON; + }; + } +} diff --git a/src/main/java/me/night/nullvalkyrie/events/CustomItemEvents.java b/src/main/java/me/night/nullvalkyrie/events/CustomItemEvents.java @@ -1,366 +0,0 @@ -package me.night.nullvalkyrie.events; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.ProtocolManager; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.wrappers.BlockPosition; -import me.night.nullvalkyrie.items.CustomItemManager; -import me.night.nullvalkyrie.items.Pickaxe; -import me.night.nullvalkyrie.items.Rarity; -import me.night.nullvalkyrie.Main; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.*; -import org.bukkit.block.Block; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.entity.*; -import org.bukkit.event.player.*; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.Merchant; -import org.bukkit.inventory.MerchantRecipe; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.persistence.PersistentDataContainer; -import org.bukkit.persistence.PersistentDataType; - -import java.lang.reflect.InvocationTargetException; -import java.util.*; - -public class CustomItemEvents implements Listener { - private final Main main; - - public CustomItemEvents(Main main) { - this.main = main; - } - - @EventHandler - public void onEntityDamageByEntity(EntityDamageByEntityEvent e) { - if (e.getDamager().getType().equals(EntityType.SNOWBALL)) { - Snowball sb = (Snowball) e.getDamager(); - Player pl = (Player) sb.getShooter(); - if (pl.getInventory().getItemInMainHand().getItemMeta() != null) { - String name = pl.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); - if (name.equalsIgnoreCase(Rarity.ULTRA.getColor() + "Snow Gun")) { - ((Snowball) e.getDamager()).setShooter(pl.getPlayer()); - e.setDamage(2000); - } else if (name.equalsIgnoreCase("AA-12")) { - e.setDamage(7); - } else { - e.setDamage(0); - } - } - } - } - - @EventHandler - public void onPlayerFish(PlayerFishEvent e) { - Player player = e.getPlayer(); - if (player.getInventory().getItemInMainHand().getItemMeta() != null) { - String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); - if (name.equalsIgnoreCase(Rarity.RARE.getColor() + "Grappling Hook")) { - if (e.getState().equals(PlayerFishEvent.State.REEL_IN)) { - Location change = e.getHook().getLocation().subtract(player.getLocation()); - player.setVelocity(change.toVector().multiply(0.4)); - } - } - } - } - - @EventHandler - public void onPlayerInteract(PlayerInteractEvent e) { - Player player = e.getPlayer(); - if (player.getInventory().getItemInMainHand().getItemMeta() != null) { - String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); - if (e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { - if (name.equalsIgnoreCase(Rarity.GRAND.getColor() + "Teleport Door")) { - Block block = player.getTargetBlock(null, 12); - Location l = block.getLocation(); - l.add(0, 1, 0); - float yaw = player.getEyeLocation().getYaw(); - float pitch = player.getEyeLocation().getPitch(); - l.setYaw(yaw); - l.setPitch(pitch); - player.teleport(l); - player.playSound(player.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 10, 10); - } else if (name.equalsIgnoreCase(Rarity.ULTRA.getColor() + "Snow Gun")) { - Snowball s = player.launchProjectile(Snowball.class, player.getLocation().getDirection()); - s.setVelocity(player.getLocation().getDirection().multiply(10)); - - ItemStack weapon = player.getInventory().getItemInMainHand(); - ItemMeta weaponMeta = weapon.getItemMeta(); - if (weaponMeta != null) { - PersistentDataContainer container = weaponMeta.getPersistentDataContainer(); - NamespacedKey ammoKey = CustomItemManager.keys.get(name + ".ammo"); - int ammo = container.get(ammoKey, PersistentDataType.INTEGER); - container.set(ammoKey, PersistentDataType.INTEGER, ammo - 1); - int max = container.get(CustomItemManager.keys.get(name + ".maxload"), PersistentDataType.INTEGER); - weapon.setItemMeta(weaponMeta); - e.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', "&6AK-47 ( " + (ammo - 1) + "/ " + max + " )"))); - - } - - } else if (name.equalsIgnoreCase(Rarity.MYTHIC.getColor() + "Terminator")) { - Arrow arrow = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); - arrow.setVelocity(arrow.getVelocity().multiply(5)); - arrow.setPickupStatus(Arrow.PickupStatus.DISALLOWED); - arrow.setShooter(player); - arrow.setDamage(50); - Arrow a1 = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); - a1.setVelocity(arrow.getVelocity().rotateAroundY(Math.toRadians(5)).multiply(5)); - a1.setPickupStatus(Arrow.PickupStatus.DISALLOWED); - a1.setShooter(player); - a1.setDamage(50); - Arrow a2 = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); - a2.setVelocity(arrow.getVelocity().rotateAroundY(Math.toRadians(-5)).multiply(5)); - a2.setPickupStatus(Arrow.PickupStatus.DISALLOWED); - a2.setShooter(player); - a2.setDamage(50); - e.setCancelled(true); - } else if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Explosive Bow")) { - Arrow arrow = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); - arrow.setVelocity(arrow.getVelocity().multiply(5)); - arrow.setShooter(player); - arrow.setDamage(50); - e.setCancelled(true); - } - } else if (e.getAction().equals(Action.LEFT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK)) { - if (name.equalsIgnoreCase(Rarity.MYTHIC.getColor() + "Terminator")) { - Arrow arrow = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); - arrow.setVelocity(arrow.getVelocity().multiply(5)); - arrow.setPickupStatus(Arrow.PickupStatus.DISALLOWED); - arrow.setShooter(player); - arrow.setDamage(50); - Arrow a1 = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); - a1.setVelocity(arrow.getVelocity().rotateAroundY(Math.toRadians(5)).multiply(5)); - a1.setPickupStatus(Arrow.PickupStatus.DISALLOWED); - a1.setShooter(player); - a1.setDamage(50); - Arrow a2 = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); - a2.setVelocity(arrow.getVelocity().rotateAroundY(Math.toRadians(-5)).multiply(5)); - a2.setPickupStatus(Arrow.PickupStatus.DISALLOWED); - a2.setShooter(player); - a2.setDamage(50); - e.setCancelled(true); - } else if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Explosive Bow")) { - Arrow arrow = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); - arrow.setVelocity(arrow.getVelocity().multiply(5)); - arrow.setShooter(player); - arrow.setDamage(50); - e.setCancelled(true); - } - } - } - } - - @EventHandler - public void onEntityShoot(EntityShootBowEvent e) { - if (e.getProjectile() instanceof Arrow) { - if (e.getEntity() instanceof Player) { - Player player = (Player) e.getEntity(); - if (player.getInventory().getItemInMainHand().getItemMeta() != null) { - String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); - if (name.equalsIgnoreCase(Rarity.MYTHIC.getColor() + "Terminator")) { - e.setCancelled(true); - } else if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Explosive Bow")) { - e.setCancelled(true); - } - } - } - } - } - - @EventHandler - public void onProjectileHit(ProjectileHitEvent e) { - if (e.getEntity().getShooter() instanceof Player) { - Player shooter = (Player) e.getEntity().getShooter(); - if (shooter.getInventory().getItemInMainHand().getItemMeta() != null) { - String name = shooter.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); - if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Frag Grenade")) { - if (e.getHitBlock() == null) { - Location l = e.getHitEntity().getLocation(); - e.getEntity().setShooter(shooter); - e.getHitEntity().getWorld().createExplosion(l.getX(), l.getY(), l.getZ(), 100, false, false); - } else if (e.getHitEntity() == null) { - Location l = e.getHitBlock().getLocation(); - e.getHitBlock().getWorld().createExplosion(l.getX(), l.getY(), l.getZ(), 100, false, false); - } - } else if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Explosive Bow")) { - Arrow arrow = (Arrow) e.getEntity(); - Location al = arrow.getLocation(); - arrow.setShooter(shooter); - shooter.getWorld().createExplosion(al, 100, false, false); - } - } - - } - } - - @EventHandler - public void onCreatureSpawn(CreatureSpawnEvent event) { - if (event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.EGG) { - event.setCancelled(true); - } - } - - @EventHandler - public void Projectile(ProjectileLaunchEvent e) { - if (e.getEntity().getShooter() instanceof Player) { - Player player = (Player) e.getEntity().getShooter(); - if (player.getInventory().getItemInMainHand().getItemMeta() != null) { - String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); - if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Frag Grenade")) { - Egg s = (Egg) e.getEntity(); - s.setVelocity(player.getLocation().getDirection().multiply(10)); - } - } - } - } - - @EventHandler - public void onPlayerBucketEmpty(PlayerBucketEmptyEvent e) { - int x = e.getBlockClicked().getX() + e.getBlockFace().getModX(); - int y = e.getBlockClicked().getY() + e.getBlockFace().getModY(); - int z = e.getBlockClicked().getZ() + e.getBlockFace().getModZ(); - Player player = e.getPlayer(); - if (player.getInventory().getItemInMainHand().getItemMeta() != null) { - String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); - if (name.equalsIgnoreCase(Rarity.EPIC.getColor() + "Infinite Water Bucket")) { - e.getPlayer().getWorld().getBlockAt(x, y, z).setType(Material.WATER); - e.setCancelled(true); - } else if (name.equalsIgnoreCase(Rarity.EPIC.getColor() + "Infinite Lava Bucket")) { - e.getPlayer().getWorld().getBlockAt(x, y, z).setType(Material.LAVA); - e.setCancelled(true); - } - } - } - - @EventHandler - public void onDamage(EntityDamageByEntityEvent e) { - if (e.getEntity() instanceof Player) { - Player player = (Player) e.getEntity(); -// if ((player.getHealth() - e.getDamage()) <= 0) { -// e.setCancelled(true); -// Location loc = player.getWorld().getBlockAt(-3, 23, -3).getLocation(); -// player.teleport(loc); -// for (Player p : Bukkit.getOnlinePlayers()) { -// p.sendMessage(e.getDamager() instanceof Player -// ? ChatColor.RED + player.getName() + " has been killed by " + e.getDamager().getName() -// : ChatColor.RED + player.getName() + " died"); -// p.hidePlayer(player); -// } -// new BukkitRunnable() { -// @Override -// public void run() { -// for (Player p : Bukkit.getOnlinePlayers()) { -// p.showPlayer(player); -// } -// player.setHealth(20); -// player.teleport(generateRandomCoord(9, Bukkit.getWorld("world"))); -// } -// }.runTaskLater(main, 100L); -// countDown(player, new int[]{5}); -// } - } - - } - - private int taskID; - - public void countDown(Player player, int[] a) { - taskID = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(main, () -> { - player.sendTitle(ChatColor.RED + "YOU DIED!", ChatColor.GREEN + "You will revive in " + a[0] + " seconds", 0, 20, 0); - a[0]--; - if (a[0] == 0) { - Bukkit.getScheduler().cancelTask(taskID); - } - }, 0L, 20L); - } - - private final Map<UUID, Merchant> villagerlist = new HashMap<>(); - - @EventHandler - public void onClick(PlayerInteractEntityEvent e) { - Player p = e.getPlayer(); - Entity clickedEntity = e.getRightClicked(); - if (clickedEntity instanceof Creeper) { - if (p.getInventory().getItemInMainHand().getType() != Material.STICK) return; - clickedEntity.remove(); - Location loc = clickedEntity.getLocation(); - Villager villager = (Villager) p.getWorld().spawnEntity(loc, EntityType.VILLAGER); - villager.setProfession(Villager.Profession.TOOLSMITH); - List<MerchantRecipe> recipes = new ArrayList<>(); - MerchantRecipe bread = new MerchantRecipe(new ItemStack(Material.BREAD, 3), 10); - bread.addIngredient(new ItemStack(Material.EMERALD, 10)); - recipes.add(bread); - - MerchantRecipe tntStick = new MerchantRecipe(CustomItemManager.produceItem("Terminator"), 10); - tntStick.addIngredient(CustomItemManager.produceItem("Widow Sword")); - recipes.add(tntStick); - Merchant merchant = Bukkit.createMerchant("Exchange here"); - merchant.setRecipes(recipes); - villagerlist.put(villager.getUniqueId(), merchant); - p.spawnParticle(Particle.END_ROD, loc, 30, 0, 1, 0, 0.2); - p.openMerchant(merchant, true); - } - if (e.getRightClicked() instanceof Villager) { - Merchant merchant = villagerlist.get(clickedEntity.getUniqueId()); - if (merchant == null) return; - e.setCancelled(true); - p.openMerchant(merchant, true); - } - } - - // For hologram clicks to change page -// @EventHandler -// public void onEntityInteract(EntityInteractEvent e) { -// System.out.println(e.getEntity().getLocation()); -// e.getEntity().setCustomName(ChatColor.RED + "Changed name since you ust clicked lol"); -// } - private final HashMap<Location, Integer> blockStages = new HashMap<>(); - private final HashMap<UUID, Long> miningCooldown = new HashMap<>(); - @EventHandler - public void onAnimationEvent(PlayerAnimationEvent e) { //Material blockType, int mineInterval, Pickaxe x - Player player = e.getPlayer(); - UUID uuid = player.getUniqueId(); - if (!player.getGameMode().equals(GameMode.SURVIVAL)) return; - if (miningCooldown.containsKey(uuid) && (miningCooldown.get(uuid) > System.currentTimeMillis())) return; - else miningCooldown.remove(uuid); - - if (!e.getAnimationType().equals(PlayerAnimationType.ARM_SWING)) return; - Block block = player.getTargetBlockExact(4); - if (block == null) return; - - Pickaxe pickaxe = new Pickaxe(player.getInventory().getItemInMainHand()); - List<Material> materialsThatCanBeMinedFast = pickaxe.multimap.get(pickaxe.getMaterial()); // to get all materials that the pickaxe can mine - if (!materialsThatCanBeMinedFast.contains(block.getType())) return; - - long miningPerPhase = pickaxe.getMiningPerPhase(block.getType()); - miningCooldown.put(uuid, System.currentTimeMillis() + miningPerPhase); - int blockStage = blockStages.getOrDefault(block.getLocation(), 0); - blockStage = blockStage == 10 ? 0 : blockStage + 1; - blockStages.put(block.getLocation(), blockStage); - sendBlockDamage(player, block); - if (blockStage == 0) { - blockStages.remove(block.getLocation()); - block.breakNaturally(); - } - } - ProtocolManager manager = ProtocolLibrary.getProtocolManager(); - - public void sendBlockDamage(Player player, Block block) { - Location location = block.getLocation(); - int locationId = location.getBlockX() + location.getBlockY() + location.getBlockZ(); - PacketContainer packet = manager.createPacket(PacketType.Play.Server.BLOCK_BREAK_ANIMATION); - packet.getIntegers().write(0, locationId); // set entity ID to the location - packet.getBlockPositionModifier().write(0, new BlockPosition(location.toVector())); // set the block location - packet.getIntegers().write(1, blockStages.get(location)); // set the damage to blockStage - try { - manager.sendServerPacket(player, packet); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } -} -\ No newline at end of file diff --git a/src/main/java/me/night/nullvalkyrie/events/DamageEffectEvents.java b/src/main/java/me/night/nullvalkyrie/events/DamageEffectEvents.java @@ -1,111 +0,0 @@ -package me.night.nullvalkyrie.events; - -import me.night.nullvalkyrie.Main; -import me.night.nullvalkyrie.util.Util; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Zombie; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import java.text.DecimalFormat; -import java.util.*; - -public class DamageEffectEvents implements Listener { - private final Main main; - - public DamageEffectEvents(Main main) { - this.main = main; - } - - public World world = Bukkit.getWorld("world"); - public final Map<Entity, Integer> indicators = new HashMap<>(); - private final DecimalFormat formatter = new DecimalFormat("#"); - - @EventHandler - public void onDamage(EntityDamageByEntityEvent e) { - double damage = e.getFinalDamage(); - if (e.getEntity() instanceof Zombie) { - Location loc = e.getEntity().getLocation().clone().add(getRandomOffset(), 1, getRandomOffset()); - world.spawn(loc, ArmorStand.class, armorStand -> { - armorStand.setMarker(true); - armorStand.setVisible(false); - armorStand.setGravity(false); - armorStand.setSmall(true); - armorStand.setCustomNameVisible(true); - armorStand.setCustomName(Util.color("&c&l" + formatter.format(damage))); - indicators.put(armorStand, 30); - }); - removeStands(); - } - } - - public void removeStands() { - new BukkitRunnable() { - final Set<Entity> stands = indicators.keySet(); - final List<Entity> removal = new ArrayList<>(); - - @Override - public void run() { - for (Entity stand : stands) { - int ticksLeft = indicators.get(stand); - if (ticksLeft == 0) { - stand.remove(); - removal.add(stand); - continue; - } - ticksLeft--; - indicators.put(stand, ticksLeft); - } - removal.forEach(stands::remove); - } - }.runTaskTimer(main, 0L, 1L); - } - - public static boolean isSpawnable(Location loc) { - Block feetBlock = loc.getBlock(), headBlock = loc.clone().add(0, 1, 0).getBlock(), upperBlock = loc.clone().add(0, 2, 0).getBlock(); - return feetBlock.isPassable() && !feetBlock.isLiquid() && headBlock.isPassable() && !headBlock.isLiquid() && upperBlock.isPassable() && !upperBlock.isLiquid(); - } - - private static double getRandomOffset() { - double random = Math.random(); - if (Math.random() > 0.5) random *= -1; - return random; - } - - public static int getRandomWithNeg(int size) { - int random = (int) (Math.random() * (size + 1)); - if (Math.random() > 0.5) random *= -1; - return random; - } - - public Location generateRandomCoord(int size, World world) { - int ranX = getRandomWithNeg(size), ranZ = getRandomWithNeg(size); - Block block = world.getHighestBlockAt(ranX, ranZ); - return block.getLocation(); - } - - public Location generateRandomCoordIsSpawnable(int size) { - while (true) { - Location coord = generateRandomCoord(size, world); - boolean spawnable = isSpawnable(coord); - if (spawnable) { - return coord; - } - } - } -} -// -// @EventHandler -// public void onEntityDeath(EntityDeathEvent event) { -// if (!entities.containsKey(event.getEntity())) return; -// event.setDroppedExp(0); -// event.getDrops().clear(); -// entities.remove(event.getEntity()).tryDropLoot(event.getEntity().getLocation()); -// } -\ No newline at end of file diff --git a/src/main/java/me/night/nullvalkyrie/events/ServerEvents.java b/src/main/java/me/night/nullvalkyrie/events/ServerEvents.java @@ -1,42 +0,0 @@ -package me.night.nullvalkyrie.events; - -import me.night.nullvalkyrie.npc.PacketInjector; -import me.night.nullvalkyrie.util.Util; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.boss.BarColor; -import org.bukkit.boss.BarStyle; -import org.bukkit.boss.BossBar; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.server.ServerListPingEvent; - -import java.io.File; - -public class ServerEvents implements Listener { - public BossBar bossbar; - public 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()); - } - @EventHandler - public void onPing(ServerListPingEvent e) { - e.setMaxPlayers(8964); - String s = Util.centerText("Vanadium", 45); - String s2 = Util.centerText("Support 1.19.2", 45); - e.setMotd(ChatColor.AQUA.toString() + ChatColor.BOLD + s + "\n" + ChatColor.GOLD + ChatColor.BOLD + s2); - try { - e.setServerIcon(Bukkit.loadServerIcon(new File("nuke.png"))); - } catch (Exception ee) { - ee.printStackTrace(); - } - - } -} diff --git a/src/main/java/me/night/nullvalkyrie/events/custom/InteractHologramEvent.java b/src/main/java/me/night/nullvalkyrie/events/custom/InteractHologramEvent.java @@ -0,0 +1,41 @@ +package me.night.nullvalkyrie.events.custom; + +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +public class InteractHologramEvent extends Event implements Cancellable { + private boolean isCancelled; + public Player player; + public ArmorStand hologram; + private static final HandlerList HANDLERS = new HandlerList(); + public InteractHologramEvent(Player player, ArmorStand hologram) { + this.player = player; + this.hologram = hologram; + } + public Player getPlayer() { + return player; + } + public ArmorStand getHologram() { + return hologram; + } + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean cancel) { + isCancelled = cancel; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return HANDLERS; + } + + public static HandlerList getHandlerList() { return HANDLERS; } +} diff --git a/src/main/java/me/night/nullvalkyrie/events/custom/RightClickNPCEvent.java b/src/main/java/me/night/nullvalkyrie/events/custom/RightClickNPCEvent.java @@ -0,0 +1,42 @@ +package me.night.nullvalkyrie.events.custom; + +import net.minecraft.server.level.EntityPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class RightClickNPCEvent extends Event implements Cancellable { + private final Player player; + private final EntityPlayer npc; + private boolean isCancelled; + private static final HandlerList HANDLERS = new HandlerList(); + public RightClickNPCEvent(Player player, EntityPlayer npc) { + this.player = player; + this.npc = npc; + } + public Player getPlayer() { + return player; + } + public EntityPlayer getNPC() { + return npc; + } + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean cancel) { + isCancelled = cancel; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return HANDLERS; + } + + public static HandlerList getHandlerList() { return HANDLERS; } +} diff --git a/src/main/java/me/night/nullvalkyrie/events/listeners/CustomItemEvents.java b/src/main/java/me/night/nullvalkyrie/events/listeners/CustomItemEvents.java @@ -0,0 +1,356 @@ +package me.night.nullvalkyrie.events.listeners; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.BlockPosition; +import me.night.nullvalkyrie.items.CustomItemManager; +import me.night.nullvalkyrie.items.Pickaxe; +import me.night.nullvalkyrie.enums.Rarity; +import me.night.nullvalkyrie.Main; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.*; +import org.bukkit.event.player.*; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Merchant; +import org.bukkit.inventory.MerchantRecipe; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; + +import java.lang.reflect.InvocationTargetException; +import java.util.*; + +public class CustomItemEvents implements Listener { + private final Main main; + + public CustomItemEvents(Main main) { + this.main = main; + } + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent e) { + if (e.getDamager().getType().equals(EntityType.SNOWBALL)) { + Snowball sb = (Snowball) e.getDamager(); + Player pl = (Player) sb.getShooter(); + if (pl.getInventory().getItemInMainHand().getItemMeta() != null) { + String name = pl.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); + if (name.equalsIgnoreCase(Rarity.ULTRA.getColor() + "Snow Gun")) { + ((Snowball) e.getDamager()).setShooter(pl.getPlayer()); + e.setDamage(2000); + } else if (name.equalsIgnoreCase("AA-12")) { + e.setDamage(7); + } else { + e.setDamage(0); + } + } + } + } + + @EventHandler + public void onPlayerFish(PlayerFishEvent e) { + Player player = e.getPlayer(); + if (player.getInventory().getItemInMainHand().getItemMeta() != null) { + String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); + if (name.equalsIgnoreCase(Rarity.RARE.getColor() + "Grappling Hook")) { + if (e.getState().equals(PlayerFishEvent.State.REEL_IN)) { + Location change = e.getHook().getLocation().subtract(player.getLocation()); + player.setVelocity(change.toVector().multiply(0.4)); + } + } + } + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent e) { + Player player = e.getPlayer(); + if (player.getInventory().getItemInMainHand().getItemMeta() != null) { + String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); + if (e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + if (name.equalsIgnoreCase(Rarity.GRAND.getColor() + "Teleport Door")) { + Block block = player.getTargetBlock(null, 12); + Location l = block.getLocation(); + l.add(0, 1, 0); + float yaw = player.getEyeLocation().getYaw(); + float pitch = player.getEyeLocation().getPitch(); + l.setYaw(yaw); + l.setPitch(pitch); + player.teleport(l); + player.playSound(player.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 10, 10); + } else if (name.equalsIgnoreCase(Rarity.ULTRA.getColor() + "Snow Gun")) { + Snowball s = player.launchProjectile(Snowball.class, player.getLocation().getDirection()); + s.setVelocity(player.getLocation().getDirection().multiply(10)); + + ItemStack weapon = player.getInventory().getItemInMainHand(); + ItemMeta weaponMeta = weapon.getItemMeta(); + if (weaponMeta != null) { + PersistentDataContainer container = weaponMeta.getPersistentDataContainer(); + NamespacedKey ammoKey = CustomItemManager.keys.get(name + ".ammo"); + int ammo = container.get(ammoKey, PersistentDataType.INTEGER); + container.set(ammoKey, PersistentDataType.INTEGER, ammo - 1); + int max = container.get(CustomItemManager.keys.get(name + ".maxload"), PersistentDataType.INTEGER); + weapon.setItemMeta(weaponMeta); + e.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', "&6AK-47 ( " + (ammo - 1) + "/ " + max + " )"))); + + } + + } else if (name.equalsIgnoreCase(Rarity.MYTHIC.getColor() + "Terminator")) { + Arrow arrow = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); + arrow.setVelocity(arrow.getVelocity().multiply(5)); + arrow.setPickupStatus(Arrow.PickupStatus.DISALLOWED); + arrow.setShooter(player); + arrow.setDamage(50); + Arrow a1 = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); + a1.setVelocity(arrow.getVelocity().rotateAroundY(Math.toRadians(5)).multiply(5)); + a1.setPickupStatus(Arrow.PickupStatus.DISALLOWED); + a1.setShooter(player); + a1.setDamage(50); + Arrow a2 = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); + a2.setVelocity(arrow.getVelocity().rotateAroundY(Math.toRadians(-5)).multiply(5)); + a2.setPickupStatus(Arrow.PickupStatus.DISALLOWED); + a2.setShooter(player); + a2.setDamage(50); + e.setCancelled(true); + } else if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Explosive Bow")) { + Arrow arrow = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); + arrow.setVelocity(arrow.getVelocity().multiply(5)); + arrow.setShooter(player); + arrow.setDamage(50); + e.setCancelled(true); + } + } else if (e.getAction().equals(Action.LEFT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK)) { + if (name.equalsIgnoreCase(Rarity.MYTHIC.getColor() + "Terminator")) { + Arrow arrow = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); + arrow.setVelocity(arrow.getVelocity().multiply(5)); + arrow.setPickupStatus(Arrow.PickupStatus.DISALLOWED); + arrow.setShooter(player); + arrow.setDamage(50); + Arrow a1 = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); + a1.setVelocity(arrow.getVelocity().rotateAroundY(Math.toRadians(5)).multiply(5)); + a1.setPickupStatus(Arrow.PickupStatus.DISALLOWED); + a1.setShooter(player); + a1.setDamage(50); + Arrow a2 = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); + a2.setVelocity(arrow.getVelocity().rotateAroundY(Math.toRadians(-5)).multiply(5)); + a2.setPickupStatus(Arrow.PickupStatus.DISALLOWED); + a2.setShooter(player); + a2.setDamage(50); + e.setCancelled(true); + } else if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Explosive Bow")) { + Arrow arrow = player.launchProjectile(Arrow.class, player.getEyeLocation().getDirection()); + arrow.setVelocity(arrow.getVelocity().multiply(5)); + arrow.setShooter(player); + arrow.setDamage(50); + e.setCancelled(true); + } + } + } + } + + @EventHandler + public void onEntityShoot(EntityShootBowEvent e) { + if (e.getProjectile() instanceof Arrow) { + if (e.getEntity() instanceof Player player) { + if (player.getInventory().getItemInMainHand().getItemMeta() != null) { + String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); + if (name.equalsIgnoreCase(Rarity.MYTHIC.getColor() + "Terminator")) { + e.setCancelled(true); + } else if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Explosive Bow")) { + e.setCancelled(true); + } + } + } + } + } + + @EventHandler + public void onProjectileHit(ProjectileHitEvent e) { + if (e.getEntity().getShooter() instanceof Player shooter) { + if (shooter.getInventory().getItemInMainHand().getItemMeta() != null) { + String name = shooter.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); + if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Frag Grenade")) { + if (e.getHitBlock() == null) { + Location l = e.getHitEntity().getLocation(); + e.getEntity().setShooter(shooter); + e.getHitEntity().getWorld().createExplosion(l.getX(), l.getY(), l.getZ(), 100, false, false); + } else if (e.getHitEntity() == null) { + Location l = e.getHitBlock().getLocation(); + e.getHitBlock().getWorld().createExplosion(l.getX(), l.getY(), l.getZ(), 100, false, false); + } + } else if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Explosive Bow")) { + Arrow arrow = (Arrow) e.getEntity(); + Location al = arrow.getLocation(); + arrow.setShooter(shooter); + shooter.getWorld().createExplosion(al, 100, false, false); + } + } + + } + } + + @EventHandler + public void onCreatureSpawn(CreatureSpawnEvent event) { + if (event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.EGG) { + event.setCancelled(true); + } + } + + @EventHandler + public void Projectile(ProjectileLaunchEvent e) { + if (e.getEntity().getShooter() instanceof Player player) { + if (player.getInventory().getItemInMainHand().getItemMeta() != null) { + String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); + if (name.equalsIgnoreCase(Rarity.LEGENDARY.getColor() + "Frag Grenade")) { + Egg s = (Egg) e.getEntity(); + s.setVelocity(player.getLocation().getDirection().multiply(10)); + } + } + } + } + + @EventHandler + public void onPlayerBucketEmpty(PlayerBucketEmptyEvent e) { + int x = e.getBlockClicked().getX() + e.getBlockFace().getModX(); + int y = e.getBlockClicked().getY() + e.getBlockFace().getModY(); + int z = e.getBlockClicked().getZ() + e.getBlockFace().getModZ(); + Player player = e.getPlayer(); + if (player.getInventory().getItemInMainHand().getItemMeta() != null) { + String name = player.getInventory().getItemInMainHand().getItemMeta().getDisplayName(); + if (name.equalsIgnoreCase(Rarity.EPIC.getColor() + "Infinite Water Bucket")) { + e.getPlayer().getWorld().getBlockAt(x, y, z).setType(Material.WATER); + e.setCancelled(true); + } else if (name.equalsIgnoreCase(Rarity.EPIC.getColor() + "Infinite Lava Bucket")) { + e.getPlayer().getWorld().getBlockAt(x, y, z).setType(Material.LAVA); + e.setCancelled(true); + } + } + } + + @EventHandler + public void onDamage(EntityDamageByEntityEvent e) { + if (e.getEntity() instanceof Player) { + Player player = (Player) e.getEntity(); +// if ((player.getHealth() - e.getDamage()) <= 0) { +// e.setCancelled(true); +// Location loc = player.getWorld().getBlockAt(-3, 23, -3).getLocation(); +// player.teleport(loc); +// for (Player p : Bukkit.getOnlinePlayers()) { +// p.sendMessage(e.getDamager() instanceof Player +// ? ChatColor.RED + player.getName() + " has been killed by " + e.getDamager().getName() +// : ChatColor.RED + player.getName() + " died"); +// p.hidePlayer(player); +// } +// new BukkitRunnable() { +// @Override +// public void run() { +// for (Player p : Bukkit.getOnlinePlayers()) { +// p.showPlayer(player); +// } +// player.setHealth(20); +// player.teleport(generateRandomCoord(9, Bukkit.getWorld("world"))); +// } +// }.runTaskLater(main, 100L); +// countDown(player, new int[]{5}); +// } + } + + } + + private int taskID; + + public void countDown(Player player, int[] a) { + taskID = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(main, () -> { + player.sendTitle(ChatColor.RED + "YOU DIED!", ChatColor.GREEN + "You will revive in " + a[0] + " seconds", 0, 20, 0); + a[0]--; + if (a[0] == 0) { + Bukkit.getScheduler().cancelTask(taskID); + } + }, 0L, 20L); + } + + private final Map<UUID, Merchant> villagerlist = new HashMap<>(); + + @EventHandler + public void onClick(PlayerInteractEntityEvent e) { + Player p = e.getPlayer(); + Entity clickedEntity = e.getRightClicked(); + if (clickedEntity instanceof Creeper) { + if (p.getInventory().getItemInMainHand().getType() != Material.STICK) return; + clickedEntity.remove(); + Location loc = clickedEntity.getLocation(); + Villager villager = (Villager) p.getWorld().spawnEntity(loc, EntityType.VILLAGER); + villager.setProfession(Villager.Profession.TOOLSMITH); + List<MerchantRecipe> recipes = new ArrayList<>(); + MerchantRecipe bread = new MerchantRecipe(new ItemStack(Material.BREAD, 3), 10); + bread.addIngredient(new ItemStack(Material.EMERALD, 10)); + recipes.add(bread); + + MerchantRecipe tntStick = new MerchantRecipe(CustomItemManager.produceItem("Terminator"), 10); + tntStick.addIngredient(CustomItemManager.produceItem("Widow Sword")); + recipes.add(tntStick); + Merchant merchant = Bukkit.createMerchant("Exchange here"); + merchant.setRecipes(recipes); + villagerlist.put(villager.getUniqueId(), merchant); + p.spawnParticle(Particle.END_ROD, loc, 30, 0, 1, 0, 0.2); + p.openMerchant(merchant, true); + } + if (e.getRightClicked() instanceof Villager) { + Merchant merchant = villagerlist.get(clickedEntity.getUniqueId()); + if (merchant == null) return; + e.setCancelled(true); + p.openMerchant(merchant, true); + } + } + private final HashMap<Location, Integer> blockStages = new HashMap<>(); + private final HashMap<UUID, Long> miningCooldown = new HashMap<>(); + @EventHandler + public void onAnimationEvent(PlayerAnimationEvent e) { //Material blockType, int mineInterval, Pickaxe x + Player player = e.getPlayer(); + UUID uuid = player.getUniqueId(); + if (!player.getGameMode().equals(GameMode.SURVIVAL)) return; + if (miningCooldown.containsKey(uuid) && (miningCooldown.get(uuid) > System.currentTimeMillis())) return; + else miningCooldown.remove(uuid); + + if (!e.getAnimationType().equals(PlayerAnimationType.ARM_SWING)) return; + Block block = player.getTargetBlockExact(4); + if (block == null) return; + + Pickaxe pickaxe = new Pickaxe(player.getInventory().getItemInMainHand()); + List<Material> materialsThatCanBeMinedFast = pickaxe.multimap.get(pickaxe.getMaterial()); // to get all materials that the pickaxe can mine + if (!materialsThatCanBeMinedFast.contains(block.getType())) return; + + long miningPerPhase = pickaxe.getMiningPerPhase(block.getType()); + miningCooldown.put(uuid, System.currentTimeMillis() + miningPerPhase); + int blockStage = blockStages.getOrDefault(block.getLocation(), 0); + blockStage = blockStage == 10 ? 0 : blockStage + 1; + blockStages.put(block.getLocation(), blockStage); + sendBlockDamage(player, block); + if (blockStage == 0) { + blockStages.remove(block.getLocation()); + block.breakNaturally(); + } + } + ProtocolManager manager = ProtocolLibrary.getProtocolManager(); + + public void sendBlockDamage(Player player, Block block) { + Location location = block.getLocation(); + int locationId = location.getBlockX() + location.getBlockY() + location.getBlockZ(); + PacketContainer packet = manager.createPacket(PacketType.Play.Server.BLOCK_BREAK_ANIMATION); + packet.getIntegers().write(0, locationId); // set entity ID to the location + packet.getBlockPositionModifier().write(0, new BlockPosition(location.toVector())); // set the block location + packet.getIntegers().write(1, blockStages.get(location)); // set the damage to blockStage + try { + manager.sendServerPacket(player, packet); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } +} +\ No newline at end of file diff --git a/src/main/java/me/night/nullvalkyrie/events/listeners/DamageEffectEvents.java b/src/main/java/me/night/nullvalkyrie/events/listeners/DamageEffectEvents.java @@ -0,0 +1,111 @@ +package me.night.nullvalkyrie.events.listeners; + +import me.night.nullvalkyrie.Main; +import me.night.nullvalkyrie.util.Util; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Zombie; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.text.DecimalFormat; +import java.util.*; + +public class DamageEffectEvents implements Listener { + private final Main main; + + public DamageEffectEvents(Main main) { + this.main = main; + } + + public World world = Bukkit.getWorld("world"); + public final Map<Entity, Integer> indicators = new HashMap<>(); + private final DecimalFormat formatter = new DecimalFormat("#"); + + @EventHandler + public void onDamage(EntityDamageByEntityEvent e) { + double damage = e.getFinalDamage(); + if (e.getEntity() instanceof Zombie) { + Location loc = e.getEntity().getLocation().clone().add(getRandomOffset(), 1, getRandomOffset()); + world.spawn(loc, ArmorStand.class, armorStand -> { + armorStand.setMarker(true); + armorStand.setVisible(false); + armorStand.setGravity(false); + armorStand.setSmall(true); + armorStand.setCustomNameVisible(true); + armorStand.setCustomName(Util.color("&c&l" + formatter.format(damage))); + indicators.put(armorStand, 30); + }); + removeStands(); + } + } + + public void removeStands() { + new BukkitRunnable() { + final Set<Entity> stands = indicators.keySet(); + final List<Entity> removal = new ArrayList<>(); + + @Override + public void run() { + for (Entity stand : stands) { + int ticksLeft = indicators.get(stand); + if (ticksLeft == 0) { + stand.remove(); + removal.add(stand); + continue; + } + ticksLeft--; + indicators.put(stand, ticksLeft); + } + removal.forEach(stands::remove); + } + }.runTaskTimer(main, 0L, 1L); + } + + public static boolean isSpawnable(Location loc) { + Block feetBlock = loc.getBlock(), headBlock = loc.clone().add(0, 1, 0).getBlock(), upperBlock = loc.clone().add(0, 2, 0).getBlock(); + return feetBlock.isPassable() && !feetBlock.isLiquid() && headBlock.isPassable() && !headBlock.isLiquid() && upperBlock.isPassable() && !upperBlock.isLiquid(); + } + + private static double getRandomOffset() { + double random = Math.random(); + if (Math.random() > 0.5) random *= -1; + return random; + } + + public static int getRandomWithNeg(int size) { + int random = (int) (Math.random() * (size + 1)); + if (Math.random() > 0.5) random *= -1; + return random; + } + + public Location generateRandomCoord(int size, World world) { + int ranX = getRandomWithNeg(size), ranZ = getRandomWithNeg(size); + Block block = world.getHighestBlockAt(ranX, ranZ); + return block.getLocation(); + } + + public Location generateRandomCoordIsSpawnable(int size) { + while (true) { + Location coord = generateRandomCoord(size, world); + boolean spawnable = isSpawnable(coord); + if (spawnable) { + return coord; + } + } + } +} +// +// @EventHandler +// public void onEntityDeath(EntityDeathEvent event) { +// if (!entities.containsKey(event.getEntity())) return; +// event.setDroppedExp(0); +// event.getDrops().clear(); +// entities.remove(event.getEntity()).tryDropLoot(event.getEntity().getLocation()); +// } +\ No newline at end of file diff --git a/src/main/java/me/night/nullvalkyrie/events/listeners/NPCEvents.java b/src/main/java/me/night/nullvalkyrie/events/listeners/NPCEvents.java @@ -0,0 +1,37 @@ +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 org.bukkit.Location; +import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; + +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"))) { + player.sendMessage(Util.color("Hi")); + } + } + + @EventHandler + public void onMove(PlayerMoveEvent e) { + NPCManager.getNPCs().forEach(npc -> { + Location location = npc.getBukkitEntity().getLocation(); + 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)); + }); + } +} diff --git a/src/main/java/me/night/nullvalkyrie/events/listeners/ServerEvents.java b/src/main/java/me/night/nullvalkyrie/events/listeners/ServerEvents.java @@ -0,0 +1,48 @@ +package me.night.nullvalkyrie.events.listeners; + +import me.night.nullvalkyrie.events.custom.InteractHologramEvent; +import me.night.nullvalkyrie.packets.PacketInjector; +import me.night.nullvalkyrie.util.Util; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.server.ServerListPingEvent; + +import java.io.File; + +public class ServerEvents implements Listener { + public BossBar bossbar; + public 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()); + } + @EventHandler + public void onPing(ServerListPingEvent e) { + e.setMaxPlayers(8964); + String s = Util.centerText("Vanadium", 45); + String s2 = Util.centerText("Support 1.19.2", 45); + e.setMotd(ChatColor.AQUA.toString() + ChatColor.BOLD + s + "\n" + ChatColor.GOLD + ChatColor.BOLD + s2); + try { + e.setServerIcon(Bukkit.loadServerIcon(new File("nuke.png"))); + } catch (Exception ee) { + ee.printStackTrace(); + } + } + @EventHandler + public void onClickHologram(InteractHologramEvent e) { + if (e.getHologram().getCustomName().equals(ChatColor.GOLD + "Click me to change!!!")) { + System.out.println(true); + } + } +} diff --git a/src/main/java/me/night/nullvalkyrie/items/CustomItemManager.java b/src/main/java/me/night/nullvalkyrie/items/CustomItemManager.java @@ -1,6 +1,7 @@ package me.night.nullvalkyrie.items; import me.night.nullvalkyrie.Main; +import me.night.nullvalkyrie.enums.Rarity; import me.night.nullvalkyrie.util.Util; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -13,8 +14,6 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.persistence.PersistentDataContainer; -import org.bukkit.persistence.PersistentDataType; import java.io.File; import java.io.IOException; @@ -102,7 +101,6 @@ public class CustomItemManager { return item; } - public static void setItemRecipe(NamespacedKey key, ItemStack i, int ingredient, String shape1, String shape2, String shape3, List<Material> ingredients) { // ShapedRecipe wither_sword_recipe = new ShapedRecipe(new NamespacedKey(main, "widow_sword"), widow_sword); // wither_sword_recipe.shape(" A ", " A "," B "); @@ -111,20 +109,6 @@ public class CustomItemManager { // Bukkit.addRecipe(wither_sword_recipe); } - public static YamlConfiguration loadConfig(String path) { - File f = new File(Main.getPlugin(Main.class).getDataFolder(), path); - if (!f.exists()) { - try { - f.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - - } - return YamlConfiguration.loadConfiguration(f); - } - - public static void updateYamlFilesToPlugin(String path) { File file = new File(Main.getPlugin(Main.class).getDataFolder(), path); if (!file.exists()) Main.getPlugin(Main.class).saveResource(path, true); diff --git a/src/main/java/me/night/nullvalkyrie/items/Rarity.java b/src/main/java/me/night/nullvalkyrie/items/Rarity.java @@ -1,47 +0,0 @@ -package me.night.nullvalkyrie.items; - -import org.bukkit.ChatColor; -public enum Rarity { - COMMON(ChatColor.WHITE.toString() + ChatColor.BOLD + "COMMON", ChatColor.WHITE.toString()), - UNCOMMON(net.md_5.bungee.api.ChatColor.of("#31ff09").toString() + ChatColor.BOLD + "UNCOMMON", net.md_5.bungee.api.ChatColor.of("#31ff09").toString()), - RARE(net.md_5.bungee.api.ChatColor.of("#2f57ae").toString() + ChatColor.BOLD + "RARE", net.md_5.bungee.api.ChatColor.of("#2f57ae").toString()), - EPIC(net.md_5.bungee.api.ChatColor.of("#b201b2").toString() + ChatColor.BOLD + "EPIC", net.md_5.bungee.api.ChatColor.of("#b201b2").toString()), - LEGENDARY(net.md_5.bungee.api.ChatColor.of("#ffa21b").toString() + ChatColor.BOLD + "LEGENDARY", net.md_5.bungee.api.ChatColor.of("#ffa21b").toString()), - MYTHIC(net.md_5.bungee.api.ChatColor.of("#ff23ff").toString() + ChatColor.BOLD + "MYTHIC", net.md_5.bungee.api.ChatColor.of("#ff23ff").toString()), - ULTRA(ChatColor.RED.toString() + ChatColor.BOLD + "ULTRA", ChatColor.RED.toString()), - GRAND(net.md_5.bungee.api.ChatColor.of("#00fdff").toString() + ChatColor.BOLD + "GRAND", net.md_5.bungee.api.ChatColor.of("#00fdff").toString()); - private String display; - private String color; - Rarity(String display, String color) { - this.display = display; - this.color = color; - } - public String getDisplay() { - return display; - } - public String getColor() { - return color; - } - public static Rarity getRarity(String str) { - switch(str) { - case "COMMON": - return COMMON; - case "UNCOMMON": - return UNCOMMON; - case "RARE": - return RARE; - case "EPIC": - return EPIC; - case "LEGENDARY": - return LEGENDARY; - case "MYTHIC": - return MYTHIC; - case "ULTRA": - return ULTRA; - case "GRAND": - return GRAND; - default: - return COMMON; - } - } -} diff --git a/src/main/java/me/night/nullvalkyrie/npc/NPCEvents.java b/src/main/java/me/night/nullvalkyrie/npc/NPCEvents.java @@ -1,35 +0,0 @@ -package me.night.nullvalkyrie.npc; - -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 org.bukkit.Location; -import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerMoveEvent; - -public class NPCEvents implements Listener { - @EventHandler - public void onClick(RightClickNPC e) { - Player player = e.getPlayer(); - if (e.getNPC().getBukkitEntity().getName().equalsIgnoreCase(Util.color("&1&lRB18"))) { - player.sendMessage(Util.color("Hi")); - } - } - - @EventHandler - public void onMove(PlayerMoveEvent e) { - NPCManager.getNPCs().forEach(npc -> { - Location location = npc.getBukkitEntity().getLocation(); - 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)); - }); - } -} diff --git a/src/main/java/me/night/nullvalkyrie/npc/NPCManager.java b/src/main/java/me/night/nullvalkyrie/npc/NPCManager.java @@ -1,89 +0,0 @@ -package me.night.nullvalkyrie.npc; - -import com.mojang.authlib.GameProfile; -import com.mojang.authlib.properties.Property; -import com.mojang.datafixers.util.Pair; -import me.night.nullvalkyrie.Main; -import me.night.nullvalkyrie.database.NPCDataManager; -import me.night.nullvalkyrie.util.Util; -import net.minecraft.network.protocol.game.*; -import net.minecraft.network.syncher.DataWatcher; -import net.minecraft.network.syncher.DataWatcherObject; -import net.minecraft.network.syncher.DataWatcherRegistry; -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 org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -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.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class NPCManager { - private static final List<EntityPlayer> NPCs = new ArrayList<>(); - - public static List<EntityPlayer> 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(); - 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); - Location location = player.getLocation(); - npc.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); - 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) { - 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); - 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)); - } - } - - 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); - 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)); - } - } - -} diff --git a/src/main/java/me/night/nullvalkyrie/npc/PacketHandler.java b/src/main/java/me/night/nullvalkyrie/npc/PacketHandler.java @@ -1,57 +0,0 @@ -package me.night.nullvalkyrie.npc; - -import io.netty.channel.ChannelDuplexHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelPromise; -import me.night.nullvalkyrie.Main; -import net.minecraft.network.protocol.game.PacketPlayInUseEntity; -import net.minecraft.server.level.EntityPlayer; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import java.lang.reflect.Field; - -public class PacketHandler extends ChannelDuplexHandler { - private final Player player; - public PacketHandler(Player player) { - this.player = player; - } - @Override - public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - super.write(ctx, msg, promise); - } - @Override - public void channelRead(ChannelHandlerContext c, Object packet) throws Exception { - if (packet.getClass().getSimpleName().equalsIgnoreCase("PacketPlayInUseEntity")) { - PacketPlayInUseEntity pk = (PacketPlayInUseEntity) packet; - int entityID = (int) PacketInjector.getFieldValue(packet, "a"); - boolean sneak = (boolean) PacketInjector.getFieldValue(packet, "c"); - - Field type = pk.getClass().getDeclaredField("b"); - type.setAccessible(true); - Object data = type.get(pk); - if (data.toString().split("\\$")[1].charAt(0) == 'e') { return; } - try { - Field hand = data.getClass().getDeclaredField("a"); - hand.setAccessible(true); - if (!hand.get(data).toString().equals("MAIN_HAND")) { return; } - //Right Click - for (EntityPlayer npcs : NPCManager.getNPCs()) { - if (npcs.ae() == entityID && sneak) { - Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getPlugin(Main.class), new Runnable() { - @Override - public void run() { - Bukkit.getPluginManager().callEvent(new RightClickNPC(player, npcs)); - } - }, 0); - - } - } - } catch (NoSuchFieldException x) { - //Left Click - } - } else { - super.channelRead(c, packet); - } - } -} -\ No newline at end of file diff --git a/src/main/java/me/night/nullvalkyrie/npc/PacketInjector.java b/src/main/java/me/night/nullvalkyrie/npc/PacketInjector.java @@ -1,41 +0,0 @@ -package me.night.nullvalkyrie.npc; - -import io.netty.channel.Channel; -import net.minecraft.server.level.EntityPlayer; -import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; - -import java.lang.reflect.Field; - -public class PacketInjector { - public void addPlayer(Player p) { - try { - Channel ch = nms(p).b.b.m; - if(ch.pipeline().get("PacketInjector") == null) { - PacketHandler h = new PacketHandler(p); - ch.pipeline().addBefore("packet_handler", "PacketInjector", h); - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - - public void removePlayer(Player p) { - try { - Channel ch = nms(p).b.b.m; - if(ch.pipeline().get("PacketInjector") != null) { - ch.pipeline().remove("PacketInjector"); - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - public static Object getFieldValue(Object instance, String fieldName) throws Exception { - Field field = instance.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(instance); - } - public static EntityPlayer nms(Player p) { - return ((CraftPlayer) p).getHandle(); - } -} diff --git a/src/main/java/me/night/nullvalkyrie/npc/RightClickNPC.java b/src/main/java/me/night/nullvalkyrie/npc/RightClickNPC.java @@ -1,42 +0,0 @@ -package me.night.nullvalkyrie.npc; - -import net.minecraft.server.level.EntityPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; - -public class RightClickNPC extends Event implements Cancellable { - private final Player player; - private final EntityPlayer npc; - private boolean isCancelled; - private static final HandlerList HANDLERS = new HandlerList(); - public RightClickNPC(Player player, EntityPlayer npc) { - this.player = player; - this.npc = npc; - } - public Player getPlayer() { - return player; - } - public EntityPlayer getNPC() { - return npc; - } - @Override - public boolean isCancelled() { - return isCancelled; - } - - @Override - public void setCancelled(boolean cancel) { - isCancelled = cancel; - } - - @NotNull - @Override - public HandlerList getHandlers() { - return HANDLERS; - } - - public static HandlerList getHandlerList() { return HANDLERS; } -} diff --git a/src/main/java/me/night/nullvalkyrie/npc/Skin.java b/src/main/java/me/night/nullvalkyrie/npc/Skin.java @@ -1,49 +0,0 @@ -package me.night.nullvalkyrie.npc; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.mojang.authlib.GameProfile; -import com.mojang.authlib.properties.Property; -import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; - -import java.io.InputStreamReader; -import java.net.URL; - -public class Skin { - private String texture; - private String signature; - public Skin(String texture, String signature) { - this.texture = texture; - this.signature = signature; - } - public String getTexture() { return texture; } - public String getSignature() { return signature; } - - public static String[] getSkin(String name) { - try { - URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + name); - InputStreamReader reader = new InputStreamReader(url.openStream()); - String uuid = new JsonParser().parse(reader).getAsJsonObject().get("id").getAsString(); - URL url2 = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid + "?unsigned=false"); - InputStreamReader reader2 = new InputStreamReader(url2.openStream()); - JsonObject properties = new JsonParser().parse(reader2).getAsJsonObject().get("properties").getAsJsonArray().get(0).getAsJsonObject(); - String texture = properties.get("value").getAsString(); - String signature = properties.get("signature").getAsString(); - return new String[] {texture, signature}; - } catch (Exception e) { - return new String[]{}; - } - } - public static String[] getSkin(Player player) { - try { - GameProfile profile = ((CraftPlayer) player).getProfile(); - Property property = profile.getProperties().get("textures").iterator().next(); - String texture = property.getValue(); - String signature = property.getSignature(); - return new String[]{texture, signature}; - } catch (Exception e) { - return new String[]{}; - } - } -} diff --git a/src/main/java/me/night/nullvalkyrie/packets/PacketHandler.java b/src/main/java/me/night/nullvalkyrie/packets/PacketHandler.java @@ -0,0 +1,80 @@ +package me.night.nullvalkyrie.packets; + +import io.netty.channel.ChannelDuplexHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPromise; +import me.night.nullvalkyrie.Main; +import me.night.nullvalkyrie.entities.npcs.NPCManager; +import me.night.nullvalkyrie.events.custom.InteractHologramEvent; +import me.night.nullvalkyrie.events.custom.RightClickNPCEvent; +import net.minecraft.network.protocol.game.PacketPlayInUseEntity; +import net.minecraft.server.level.EntityPlayer; +import org.bukkit.Bukkit; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; + +import java.lang.reflect.Field; + +public class PacketHandler extends ChannelDuplexHandler { + private final Player player; + + public PacketHandler(Player player) { + this.player = player; + } + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + super.write(ctx, msg, promise); + } + + @Override + public void channelRead(ChannelHandlerContext c, Object packet) throws Exception { + if (packet.getClass().getSimpleName().equalsIgnoreCase("PacketPlayInUseEntity")) { + PacketPlayInUseEntity pk = (PacketPlayInUseEntity) packet; + int entityID = (int) PacketInjector.getFieldValue(packet, "a"); + boolean sneak = (boolean) PacketInjector.getFieldValue(packet, "c"); + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getPlugin(Main.class), new Runnable() { + @Override + public void run() { + for (Entity entity : Bukkit.getWorld("world").getEntities()) { + if (entity.getEntityId() == entityID && entity.getType() == EntityType.ARMOR_STAND){ + Bukkit.getPluginManager().callEvent(new InteractHologramEvent(player, (ArmorStand) entity)); + } + } + } + }, 0); + + Field type = pk.getClass().getDeclaredField("b"); + type.setAccessible(true); + Object data = type.get(pk); + if (data.toString().split("\\$")[1].charAt(0) == 'e') { + return; + } + try { + Field hand = data.getClass().getDeclaredField("a"); + hand.setAccessible(true); + if (!hand.get(data).toString().equals("MAIN_HAND")) { + return; + } + //Right Click + for (EntityPlayer npcs : NPCManager.getNPCs()) { + if (npcs.ae() == entityID && sneak) { + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getPlugin(Main.class), new Runnable() { + @Override + public void run() { + Bukkit.getPluginManager().callEvent(new RightClickNPCEvent(player, npcs)); + } + }, 0); + + } + } + } catch (NoSuchFieldException x) { + //Left Click + } + } else { + super.channelRead(c, packet); + } + } +} +\ No newline at end of file diff --git a/src/main/java/me/night/nullvalkyrie/packets/PacketInjector.java b/src/main/java/me/night/nullvalkyrie/packets/PacketInjector.java @@ -0,0 +1,41 @@ +package me.night.nullvalkyrie.packets; + +import io.netty.channel.Channel; +import net.minecraft.server.level.EntityPlayer; +import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.lang.reflect.Field; + +public class PacketInjector { + public void addPlayer(Player p) { + try { + Channel ch = nms(p).b.b.m; + if(ch.pipeline().get("PacketInjector") == null) { + PacketHandler h = new PacketHandler(p); + ch.pipeline().addBefore("packet_handler", "PacketInjector", h); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + + public void removePlayer(Player p) { + try { + Channel ch = nms(p).b.b.m; + if(ch.pipeline().get("PacketInjector") != null) { + ch.pipeline().remove("PacketInjector"); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + public static Object getFieldValue(Object instance, String fieldName) throws Exception { + Field field = instance.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(instance); + } + public static EntityPlayer nms(Player p) { + return ((CraftPlayer) p).getHandle(); + } +} diff --git a/src/main/java/me/night/nullvalkyrie/ui/NameTagManager.java b/src/main/java/me/night/nullvalkyrie/ui/NameTagManager.java @@ -1,6 +1,7 @@ package me.night.nullvalkyrie.ui; import me.night.nullvalkyrie.database.RankDataManager; +import me.night.nullvalkyrie.enums.Rank; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scoreboard.*; diff --git a/src/main/java/me/night/nullvalkyrie/ui/Rank.java b/src/main/java/me/night/nullvalkyrie/ui/Rank.java @@ -1,17 +0,0 @@ -package me.night.nullvalkyrie.ui; - -import org.bukkit.ChatColor; - -public enum Rank { - OWNER(ChatColor.DARK_RED + "<OWNER>"), ADMIN(ChatColor.RED + "<ADMIN>"), SPECIAL(ChatColor.GOLD + "<SPECIAL>"), ROOKIE(ChatColor.DARK_GREEN + "<ROOKIE>"); - - private final String display; - - Rank(String display) { - this.display = display; - } - - public String getDisplay() { - return display; - } -} diff --git a/src/main/java/me/night/nullvalkyrie/ui/ScoreboardListener.java b/src/main/java/me/night/nullvalkyrie/ui/ScoreboardListener.java @@ -2,7 +2,8 @@ package me.night.nullvalkyrie.ui; import me.night.nullvalkyrie.Main; import me.night.nullvalkyrie.database.RankDataManager; -import me.night.nullvalkyrie.npc.NPCManager; +import me.night.nullvalkyrie.enums.Rank; +import me.night.nullvalkyrie.entities.npcs.NPCManager; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player;