mirror of
https://github.com/HibiscusMC/HMCCosmetics.git
synced 2025-12-28 19:39:14 +00:00
Fixed issue with odd behaviour when interacting with non-cosmetic helmet with a cosmetic applied
This commit is contained in:
@@ -7,6 +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.JoinListener;
|
||||
import io.github.fisher2911.hmccosmetics.listener.RespawnListener;
|
||||
import io.github.fisher2911.hmccosmetics.listener.TeleportListener;
|
||||
@@ -15,6 +16,7 @@ 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;
|
||||
@@ -57,7 +59,8 @@ public class HMCCosmetics extends JavaPlugin {
|
||||
List.of(new JoinListener(this),
|
||||
new ClickListener(this),
|
||||
new TeleportListener(this),
|
||||
new RespawnListener(this)).
|
||||
new RespawnListener(this),
|
||||
new InventoryListener(this)).
|
||||
forEach(listener ->
|
||||
this.getServer().getPluginManager().registerEvents(listener, this)
|
||||
);
|
||||
|
||||
@@ -100,9 +100,6 @@ public class ItemSerializer implements TypeSerializer<GuiItem> {
|
||||
Material.class, Material.AIR);
|
||||
final int amount = amountNode.getInt();
|
||||
final Component name = StringUtils.parse(nameNode.getString());
|
||||
// Adventure.MINI_MESSAGE.parse(
|
||||
// Utils.replaceIfNull(nameNode.getString(), "")
|
||||
// );
|
||||
|
||||
final boolean unbreakable = unbreakableNode.getBoolean();
|
||||
final boolean glowing = glowingNode.getBoolean();
|
||||
|
||||
@@ -60,8 +60,6 @@ public class CosmeticsMenu {
|
||||
|
||||
if (gui instanceof final DyeSelectorGui dyeSelectorGui) {
|
||||
dyeSelectorGui.getGui(user, armorItem).open(player);
|
||||
} else {
|
||||
player.sendMessage(gui.getClass().toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package io.github.fisher2911.hmccosmetics.gui;
|
||||
|
||||
import dev.triumphteam.gui.builder.item.ItemBuilder;
|
||||
import dev.triumphteam.gui.guis.Gui;
|
||||
import dev.triumphteam.gui.guis.GuiItem;
|
||||
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
|
||||
@@ -9,10 +8,8 @@ import io.github.fisher2911.hmccosmetics.user.User;
|
||||
import io.github.fisher2911.hmccosmetics.util.builder.ColorBuilder;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
package io.github.fisher2911.hmccosmetics.listener;
|
||||
|
||||
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
|
||||
import io.github.fisher2911.hmccosmetics.user.UserManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryDragEvent;
|
||||
|
||||
public class InventoryListener implements Listener {
|
||||
|
||||
private final HMCCosmetics plugin;
|
||||
private final UserManager userManager;
|
||||
|
||||
public InventoryListener(final HMCCosmetics plugin) {
|
||||
this.plugin = plugin;
|
||||
this.userManager = this.plugin.getUserManager();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInventoryClick(final InventoryClickEvent event) {
|
||||
if (!(event.getWhoClicked() instanceof final Player player)) return;
|
||||
this.fixHat(player);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInventoryDrag(final InventoryDragEvent event) {
|
||||
if (!(event.getWhoClicked() instanceof final Player player)) return;
|
||||
this.fixHat(player);
|
||||
}
|
||||
|
||||
private void fixHat(final Player player) {
|
||||
Bukkit.getScheduler().runTaskLater(
|
||||
this.plugin,
|
||||
() -> this.userManager.get(player.getUniqueId()).ifPresent(this.userManager::setFakeHelmet),
|
||||
1);
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,6 @@ 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.WrappedDataWatcher;
|
||||
import io.github.fisher2911.hmccosmetics.gui.ArmorItem;
|
||||
import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor;
|
||||
import io.github.fisher2911.hmccosmetics.message.MessageHandler;
|
||||
@@ -13,13 +12,11 @@ import io.github.fisher2911.hmccosmetics.util.Keys;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.craftbukkit.v1_17_R1.entity.CraftWolf;
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Wolf;
|
||||
import org.bukkit.inventory.EntityEquipment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
@@ -57,6 +54,15 @@ public class User {
|
||||
return playerArmor;
|
||||
}
|
||||
|
||||
public void setPlayerArmor(final PlayerArmor playerArmor) {
|
||||
this.playerArmor.setBackpack(playerArmor.getBackpack());
|
||||
this.playerArmor.setHat(playerArmor.getHat());
|
||||
}
|
||||
|
||||
public void removeAllCosmetics() {
|
||||
this.setPlayerArmor(PlayerArmor.empty());
|
||||
}
|
||||
|
||||
public int getArmorStandId() {
|
||||
return armorStandId;
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.EntityEquipment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
@@ -51,22 +52,9 @@ public class UserManager {
|
||||
public void add(final Player player) {
|
||||
final UUID uuid = player.getUniqueId();
|
||||
final int armorStandId = this.currentArmorStandId;
|
||||
final User user = new User(uuid, new PlayerArmor(
|
||||
new ArmorItem(
|
||||
new ItemStack(Material.AIR),
|
||||
"",
|
||||
new ArrayList<>(),
|
||||
"",
|
||||
ArmorItem.Type.HAT
|
||||
),
|
||||
new ArmorItem(
|
||||
new ItemStack(Material.AIR),
|
||||
"",
|
||||
new ArrayList<>(),
|
||||
"",
|
||||
ArmorItem.Type.BACKPACK
|
||||
)
|
||||
),
|
||||
final User user = new User(
|
||||
uuid,
|
||||
PlayerArmor.empty(),
|
||||
armorStandId);
|
||||
this.userMap.put(uuid, user);
|
||||
this.armorStandIdMap.put(armorStandId, user);
|
||||
@@ -86,6 +74,8 @@ public class UserManager {
|
||||
|
||||
if (user == null) return;
|
||||
|
||||
user.removeAllCosmetics();
|
||||
this.setFakeHelmet(user);
|
||||
user.despawnAttached();
|
||||
|
||||
this.armorStandIdMap.remove(user.getArmorStandId());
|
||||
@@ -134,7 +124,6 @@ public class UserManager {
|
||||
final ItemStack hat = user.getPlayerArmor().getHat().getItemStack();
|
||||
final ItemStack second = entry.getSecond();
|
||||
|
||||
|
||||
if (hat != null && hat
|
||||
.getType() != Material.AIR &&
|
||||
second != null &&
|
||||
@@ -147,76 +136,83 @@ public class UserManager {
|
||||
}
|
||||
});
|
||||
|
||||
protocolManager.addPacketListener(new PacketAdapter(
|
||||
this.plugin,
|
||||
ListenerPriority.NORMAL,
|
||||
PacketType.Play.Server.SPAWN_ENTITY_LIVING
|
||||
) {
|
||||
@Override
|
||||
public void onPacketReceiving(PacketEvent event) {
|
||||
if (event.getPacketType() != PacketType.Play.Server.SPAWN_ENTITY_LIVING) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.getPlayer().sendMessage("What the heck * 2");
|
||||
|
||||
Bukkit.broadcast(Component.text("Received spawn"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPacketSending(PacketEvent event) {
|
||||
if (event.getPacketType() != PacketType.Play.Server.SPAWN_ENTITY_LIVING) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.getPlayer().sendMessage("What the heck");
|
||||
|
||||
PacketContainer packet = event.getPacket();
|
||||
|
||||
Entity entity = packet.getEntityModifier(event).read(0);
|
||||
|
||||
for (int i = 0; i < 100; i++) {
|
||||
if (entity == null) {
|
||||
Bukkit.broadcast(Component.text("Entity null" + packet));
|
||||
} else {
|
||||
Bukkit.broadcast(Component.text("Not null: " + entity.getEntityId()));
|
||||
}
|
||||
}
|
||||
|
||||
final int id = entity.getEntityId();
|
||||
|
||||
final User user = armorStandIdMap.get(id);
|
||||
|
||||
if (user == null) return;
|
||||
|
||||
user.addArmorStandPassenger(entity);
|
||||
|
||||
// user.
|
||||
// protocolManager.addPacketListener(new PacketAdapter(
|
||||
// this.plugin,
|
||||
// ListenerPriority.NORMAL,
|
||||
// PacketType.Play.Server.SPAWN_ENTITY_LIVING
|
||||
// ) {
|
||||
// @Override
|
||||
// public void onPacketReceiving(PacketEvent event) {
|
||||
// if (event.getPacketType() != PacketType.Play.Server.SPAWN_ENTITY_LIVING) {
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// WrappedDataWatcher dataWatcher = WrappedDataWatcher.getEntityWatcher(entity);
|
||||
// event.getPlayer().sendMessage("What the heck * 2");
|
||||
//
|
||||
// Bukkit.broadcast(Component.text("Received spawn"));
|
||||
// }
|
||||
//
|
||||
// WrappedDataWatcher.Serializer chatSerializer = WrappedDataWatcher.Registry.getChatComponentSerializer(true);
|
||||
// @Override
|
||||
// public void onPacketSending(PacketEvent event) {
|
||||
// if (event.getPacketType() != PacketType.Play.Server.SPAWN_ENTITY_LIVING) {
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, chatSerializer),
|
||||
// Optional.of(WrappedChatComponent.fromChatMessage(leveledMob.getTag() /* or name, or what you need here */)[0].getHandle()));
|
||||
// event.getPlayer().sendMessage("What the heck");
|
||||
//
|
||||
// packet.getWatchableCollectionModifier().write(0, dataWatcher.getWatchableObjects());
|
||||
// PacketContainer packet = event.getPacket();
|
||||
//
|
||||
event.setPacket(packet);
|
||||
}
|
||||
});
|
||||
// Entity entity = packet.getEntityModifier(event).read(0);
|
||||
//
|
||||
// for (int i = 0; i < 100; i++) {
|
||||
// if (entity == null) {
|
||||
// Bukkit.broadcast(Component.text("Entity null" + packet));
|
||||
// } else {
|
||||
// Bukkit.broadcast(Component.text("Not null: " + entity.getEntityId()));
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// final int id = entity.getEntityId();
|
||||
//
|
||||
// final User user = armorStandIdMap.get(id);
|
||||
//
|
||||
// if (user == null) return;
|
||||
//
|
||||
// user.addArmorStandPassenger(entity);
|
||||
//
|
||||
//// user.
|
||||
////
|
||||
//// WrappedDataWatcher dataWatcher = WrappedDataWatcher.getEntityWatcher(entity);
|
||||
////
|
||||
////
|
||||
//// WrappedDataWatcher.Serializer chatSerializer = WrappedDataWatcher.Registry.getChatComponentSerializer(true);
|
||||
////
|
||||
//// dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, chatSerializer),
|
||||
//// Optional.of(WrappedChatComponent.fromChatMessage(leveledMob.getTag() /* or name, or what you need here */)[0].getHandle()));
|
||||
////
|
||||
//// packet.getWatchableCollectionModifier().write(0, dataWatcher.getWatchableObjects());
|
||||
////
|
||||
// event.setPacket(packet);
|
||||
// }
|
||||
// });
|
||||
}
|
||||
|
||||
public void setFakeHelmet(final User user) {
|
||||
|
||||
final ItemStack hat = user.getPlayerArmor().getHat().getItemStack();
|
||||
ItemStack hat = user.getPlayerArmor().getHat().getItemStack();
|
||||
final Player player = user.getPlayer();
|
||||
|
||||
if (player == null || hat == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (hat.getType() == Material.AIR) {
|
||||
final EntityEquipment equipment = player.getEquipment();
|
||||
if (equipment != null) {
|
||||
hat = equipment.getHelmet();
|
||||
}
|
||||
}
|
||||
|
||||
final List<Pair<EnumWrappers.ItemSlot, ItemStack>> equipmentList = new ArrayList<>();
|
||||
|
||||
final Map<String, String> placeholders = Map.of(Placeholder.ALLOWED, "true",
|
||||
@@ -234,6 +230,8 @@ public class UserManager {
|
||||
fake.getIntegers().write(0, player.getEntityId());
|
||||
fake.getSlotStackPairLists().write(0, equipmentList);
|
||||
|
||||
player.sendMessage("Set Hat");
|
||||
|
||||
for (final Player p : Bukkit.getOnlinePlayers()) {
|
||||
try {
|
||||
this.plugin.getProtocolManager().sendServerPacket(p, fake);
|
||||
|
||||
Reference in New Issue
Block a user