9
0
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:
HeroBrineGoat
2022-01-14 17:42:40 -05:00
parent 44c99ae6d2
commit f8bc649799
7 changed files with 122 additions and 83 deletions

View File

@@ -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)
);

View File

@@ -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();

View File

@@ -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());
}
}

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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);