From 520b9854f57230cd05142f7135eabaaa68046c9d Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Fri, 14 Jan 2022 20:16:34 -0500 Subject: [PATCH] Potential sitting fix --- .../fisher2911/hmccosmetics/HMCCosmetics.java | 5 +- .../hmccosmetics/listener/ClickListener.java | 1 + ...istener.java => HatRemoveFixListener.java} | 11 +- .../fisher2911/hmccosmetics/user/User.java | 121 ++++++++++++++---- .../hmccosmetics/user/UserManager.java | 2 +- 5 files changed, 108 insertions(+), 32 deletions(-) rename src/main/java/io/github/fisher2911/hmccosmetics/listener/{InventoryListener.java => HatRemoveFixListener.java} (78%) diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java index c808a338..d9077b63 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java @@ -7,7 +7,7 @@ import io.github.fisher2911.hmccosmetics.command.CosmeticsCommand; import io.github.fisher2911.hmccosmetics.gui.ArmorItem; import io.github.fisher2911.hmccosmetics.gui.CosmeticsMenu; import io.github.fisher2911.hmccosmetics.listener.ClickListener; -import io.github.fisher2911.hmccosmetics.listener.InventoryListener; +import io.github.fisher2911.hmccosmetics.listener.HatRemoveFixListener; import io.github.fisher2911.hmccosmetics.listener.JoinListener; import io.github.fisher2911.hmccosmetics.listener.RespawnListener; import io.github.fisher2911.hmccosmetics.listener.TeleportListener; @@ -16,7 +16,6 @@ import io.github.fisher2911.hmccosmetics.message.Messages; import io.github.fisher2911.hmccosmetics.user.UserManager; import me.mattstudios.mf.base.CommandManager; import org.bstats.bukkit.Metrics; -import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.plugin.java.JavaPlugin; import java.util.Arrays; @@ -60,7 +59,7 @@ public class HMCCosmetics extends JavaPlugin { new ClickListener(this), new TeleportListener(this), new RespawnListener(this), - new InventoryListener(this)). + new HatRemoveFixListener(this)). forEach(listener -> this.getServer().getPluginManager().registerEvents(listener, this) ); diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java b/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java index 84f64028..4969598e 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java @@ -10,6 +10,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.PlayerInventory; +import org.spigotmc.event.entity.EntityMountEvent; import java.util.Optional; diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/listener/InventoryListener.java b/src/main/java/io/github/fisher2911/hmccosmetics/listener/HatRemoveFixListener.java similarity index 78% rename from src/main/java/io/github/fisher2911/hmccosmetics/listener/InventoryListener.java rename to src/main/java/io/github/fisher2911/hmccosmetics/listener/HatRemoveFixListener.java index 892d28ed..328cbf49 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/listener/InventoryListener.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/listener/HatRemoveFixListener.java @@ -8,13 +8,14 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryDragEvent; +import org.spigotmc.event.entity.EntityMountEvent; -public class InventoryListener implements Listener { +public class HatRemoveFixListener implements Listener { private final HMCCosmetics plugin; private final UserManager userManager; - public InventoryListener(final HMCCosmetics plugin) { + public HatRemoveFixListener(final HMCCosmetics plugin) { this.plugin = plugin; this.userManager = this.plugin.getUserManager(); } @@ -31,6 +32,12 @@ public class InventoryListener implements Listener { this.fixHat(player); } + @EventHandler + public void test(final EntityMountEvent event) { + if (!(event.getEntity() instanceof final Player player)) return; + this.fixHat(player); + } + private void fixHat(final Player player) { Bukkit.getScheduler().runTaskLater( this.plugin, diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java b/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java index 8566a1c8..59b0ef9c 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java @@ -4,12 +4,24 @@ 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.EnumWrappers; +import com.comphenix.protocol.wrappers.Pair; +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.sun.jdi.InvocationException; +import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.gui.ArmorItem; import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor; import io.github.fisher2911.hmccosmetics.message.MessageHandler; import io.github.fisher2911.hmccosmetics.message.Messages; +import io.github.fisher2911.hmccosmetics.message.Placeholder; import io.github.fisher2911.hmccosmetics.util.Keys; +import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; +import net.minecraft.network.protocol.game.PacketPlayOutEntityHeadRotation; +import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; +import net.minecraft.network.syncher.DataWatcher; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.ArmorStand; @@ -24,6 +36,9 @@ import org.jetbrains.annotations.Nullable; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.UUID; public class User { @@ -233,6 +248,7 @@ public class User { return; } + this.hasArmorStand = true; final Location location = player.getLocation(); @@ -244,11 +260,7 @@ public class User { // Entity ID packet.getIntegers().write(0, this.armorStandId); // Entity Type - packet.getIntegers().write(6, 78); - // Set optional velocity (/8000) - packet.getIntegers().write(1, 0); - packet.getIntegers().write(2, 0); - packet.getIntegers().write(3, 0); +// packet.getIntegers().write(6, 78); // Set yaw pitch packet.getIntegers().write(4, (int) location.getPitch()); packet.getIntegers().write(5, (int) location.getYaw()); @@ -261,30 +273,17 @@ public class User { packet.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND); + final PacketContainer ridingPacket = new PacketContainer(PacketType.Play.Server.MOUNT); + ridingPacket. + getIntegers(). + write(0, player.getEntityId()); + ridingPacket.getIntegerArrays().write(0, new int[]{this.armorStandId}); + for (final Player p : Bukkit.getOnlinePlayers()) { try { protocolManager.sendServerPacket(p, packet); + protocolManager.sendServerPacket(p, ridingPacket); - player.sendMessage(this.armorStandId + ""); - - packet.getEntityModifier(player.getWorld()).read(0); - - packet.getEntityModifier(player.getWorld()).getValues().forEach( - e -> { - if (e == null) { - player.sendMessage("entity null"); - return; - } - try { - player.sendMessage(String.valueOf(e.getEntityId())); - } catch (final IllegalArgumentException exception) { - player.sendMessage("Exception"); - } - if (e instanceof final LivingEntity entity) { - entity.getEquipment().setHelmet(this.playerArmor.getBackpack().getItemStack()); - } - } - ); } catch (InvocationTargetException e) { e.printStackTrace(); } @@ -294,9 +293,79 @@ public class User { public void updatePacketArmorStand() { if (!this.hasArmorStand) { this.spawnPacketArmorstand(); - this.getPlayer().sendMessage("Spawning armor stand"); + return; } + final Player player = this.getPlayer(); + + if (player == null) return; + + final List> equipmentList = new ArrayList<>(); + + final Map placeholders = Map.of(Placeholder.ALLOWED, "true", + Placeholder.ENABLED, "true"); + + equipmentList.add(new Pair<>(EnumWrappers.ItemSlot.HEAD, + ItemBuilder.from(this.playerArmor.getBackpack().getItemStack()). + namePlaceholders(placeholders). + lorePlaceholders(placeholders). + build() + )); + + final PacketContainer armorPacket = new PacketContainer(PacketType.Play.Server.ENTITY_EQUIPMENT); + armorPacket.getIntegers().write(0, this.armorStandId); + armorPacket.getSlotStackPairLists().write(0, equipmentList); + +// final PacketContainer rotationContainer = new PacketContainer(PacketType.Play.Server.ENTITY_LOOK); +// final Location location = player.getLocation(); +// rotationContainer. +// getIntegers(). +// write(0, this.armorStandId); +// rotationContainer. +// getBytes(). +// write(0, (byte) (location.getYaw() * 256.0F / 360.0F)); +// +// final PacketContainer rotationContainer2 = new PacketContainer(PacketType.Play.Server.ENTITY_HEAD_ROTATION); +// rotationContainer2. +// getIntegers(). +// write(0, this.armorStandId); +// rotationContainer2. +// getBytes(). +// write(0, (byte) (location.getPitch() * 256.0F / 360.0F)); + + final PacketContainer metaContainer = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); +// metaContainer. +// getBytes(). +// write(15, (byte) 0x01); + + + WrappedChatComponent wrappedChatComponent = WrappedChatComponent.fromText(ChatColor.RED + "TEST"); + Optional opt = Optional.of(wrappedChatComponent); + + WrappedDataWatcher metadata = new WrappedDataWatcher(); + metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x01)); //isSmall, noBasePlate, set Marker +// metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x01)); //isSmall, noBasePlate, set Marker + + metaContainer.getIntegers().write(0, this.armorStandId); + metaContainer.getWatchableCollectionModifier().write(0, metadata.getWatchableObjects()); + +// final WrappedDataWatcher dataWatcher = new WrappedDataWatcher(); +// dataWatcher.setObject(15, (byte) 0x01); +// +// metaContainer.getDataWatcherModifier().write( +// 0, dataWatcher +// ); + + final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + + for (final Player p : Bukkit.getOnlinePlayers()) { + try { + protocolManager.sendServerPacket(p, armorPacket); + protocolManager.sendServerPacket(p, metaContainer); + } catch (final InvocationTargetException exception) { + exception.printStackTrace(); + } + } } public void addArmorStandPassenger(final Entity entity) { diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java b/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java index 9d107bde..cdd2ec71 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java @@ -209,7 +209,7 @@ public class UserManager { if (hat.getType() == Material.AIR) { final EntityEquipment equipment = player.getEquipment(); if (equipment != null) { - hat = equipment.getHelmet(); + hat = equipment.getHelmet() == null ? hat : equipment.getHelmet(); } }