diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/Cosmetics.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/Cosmetics.java index 50a83f39..5672c2c0 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/Cosmetics.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/Cosmetics.java @@ -5,6 +5,7 @@ import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticArmorType; import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticBackpackType; import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticBalloonType; +import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticMainhandType; import org.spongepowered.configurate.CommentedConfigurationNode; import org.spongepowered.configurate.ConfigurateException; import org.spongepowered.configurate.ConfigurationNode; @@ -85,6 +86,9 @@ public class Cosmetics { case BACKPACK -> { new CosmeticBackpackType(id, cosmeticConfig); } + case MAINHAND -> { + new CosmeticMainhandType(id, cosmeticConfig); + } default -> { new CosmeticArmorType(id, cosmeticConfig); } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticMainhandType.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticMainhandType.java index 679d6f42..7305258b 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticMainhandType.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticMainhandType.java @@ -4,6 +4,7 @@ import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; import com.hibiscusmc.hmccosmetics.config.serializer.ItemSerializer; import com.hibiscusmc.hmccosmetics.cosmetic.Cosmetic; import com.hibiscusmc.hmccosmetics.user.CosmeticUser; +import com.hibiscusmc.hmccosmetics.util.PlayerUtils; import com.hibiscusmc.hmccosmetics.util.packets.PacketManager; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -27,6 +28,8 @@ public class CosmeticMainhandType extends Cosmetic { public void update(CosmeticUser user) { Player player = user.getPlayer(); + PacketManager.equipmentSlotUpdate(player.getEntityId(), user, getSlot(), PlayerUtils.getNearbyPlayers(player)); + } private ItemStack generateItemStack(ConfigurationNode config) { diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java index 254f8d77..2f76dc86 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java @@ -14,6 +14,7 @@ import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticArmorType; import com.hibiscusmc.hmccosmetics.user.CosmeticUser; import com.hibiscusmc.hmccosmetics.user.CosmeticUsers; import com.hibiscusmc.hmccosmetics.util.InventoryUtils; +import com.hibiscusmc.hmccosmetics.util.packets.PacketManager; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; @@ -154,11 +155,17 @@ public class PlayerGameListener implements Listener { } @EventHandler - public void onMainHandSwitch(PlayerChangedMainHandEvent event) { - CosmeticUser user = CosmeticUsers.getUser(event.getPlayer().getUniqueId()); + public void onMainHandSwitch(PlayerItemHeldEvent event) { + HMCCosmeticsPlugin.getInstance().getLogger().info("PlayerItemHeldEvent"); + CosmeticUser user = CosmeticUsers.getUser(event.getPlayer()); + if (user == null) return; + HMCCosmeticsPlugin.getInstance().getLogger().info("PlayerItemHeldEvent 2"); - // TODO: Mainhand cosmetics - //user.updateCosmetic(CosmeticSlot.MAINHAND); + + + event.getPreviousSlot(); + + user.updateCosmetic(CosmeticSlot.MAINHAND); } private void registerInventoryClickListener() { diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/NMSHandler.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/NMSHandler.java index 744239b1..6618ede4 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/NMSHandler.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/NMSHandler.java @@ -32,6 +32,7 @@ public interface NMSHandler { List sendTo ); + default boolean getSupported () { return false; } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java index e33dc93d..4c762ef8 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java @@ -7,6 +7,7 @@ import com.hibiscusmc.hmccosmetics.cosmetic.CosmeticSlot; import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticArmorType; import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticBackpackType; import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticBalloonType; +import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticMainhandType; import com.hibiscusmc.hmccosmetics.entities.BalloonEntity; import com.hibiscusmc.hmccosmetics.nms.NMSHandlers; import com.hibiscusmc.hmccosmetics.util.InventoryUtils; @@ -144,6 +145,10 @@ public class CosmeticUser { item = cosmetic1.getCosmeticItem(); HMCCosmeticsPlugin.getInstance().getLogger().info("GetUserCosemticUser Armor"); } + if (cosmetic instanceof CosmeticMainhandType) { + CosmeticMainhandType cosmetic1 = (CosmeticMainhandType) cosmetic; + item = cosmetic1.getItemStack(); + } if (cosmetic instanceof CosmeticBackpackType) { CosmeticBackpackType cosmetic1 = (CosmeticBackpackType) cosmetic; item = cosmetic1.getBackpackItem(); diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/InventoryUtils.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/InventoryUtils.java index ae48ceec..9825f474 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/InventoryUtils.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/InventoryUtils.java @@ -121,6 +121,9 @@ public class InventoryUtils { case OFFHAND -> { return EquipmentSlot.OFF_HAND; } + case MAINHAND -> { + return EquipmentSlot.HAND; + } default -> { return null; } diff --git a/v1_19_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R1/NMSHandler.java b/v1_19_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R1/NMSHandler.java index fe5ed4a8..58092d69 100644 --- a/v1_19_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R1/NMSHandler.java +++ b/v1_19_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R1/NMSHandler.java @@ -120,8 +120,16 @@ public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { if (!(user.getCosmetic(cosmeticSlot) instanceof CosmeticArmorType)) { + if (user.getCosmetic(cosmeticSlot) instanceof CosmeticMainhandType) { + CosmeticMainhandType cosmeticMainhandType = (CosmeticMainhandType) user.getCosmetic(cosmeticSlot); + nmsItem = CraftItemStack.asNMSCopy(cosmeticMainhandType.getItemStack()); + } else { + nmsItem = CraftItemStack.asNMSCopy(user.getPlayer().getInventory().getItem(InventoryUtils.getEquipmentSlot(cosmeticSlot))); + } + nmsSlot = CraftEquipmentSlot.getNMS(InventoryUtils.getEquipmentSlot(cosmeticSlot)); - nmsItem = CraftItemStack.asNMSCopy(user.getPlayer().getInventory().getItem(InventoryUtils.getEquipmentSlot(cosmeticSlot))); + + if (nmsSlot == null) return; Pair pair = new Pair<>(nmsSlot, nmsItem); @@ -147,29 +155,6 @@ public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { for (Player p : sendTo) sendPacket(p, packet); } - public void equipmentSlotUpdate( - int entityId, - CosmeticUser user, - org.bukkit.inventory.EquipmentSlot slot, - List sendTo - ) { - EquipmentSlot nmsSlot = null; - net.minecraft.world.item.ItemStack nmsItem = null; - - CosmeticMainhandType cosmetic = (CosmeticMainhandType) user.getCosmetic(CosmeticSlot.MAINHAND); - ItemStack item = new ItemStack(Material.AIR); //cosmetic.getItem() - - nmsSlot = CraftEquipmentSlot.getNMS(slot); - nmsItem = CraftItemStack.asNMSCopy(item); - - Pair pair = new Pair<>(nmsSlot, nmsItem); - - List> pairs = Collections.singletonList(pair); - - ClientboundSetEquipmentPacket packet = new ClientboundSetEquipmentPacket(entityId, pairs); - for (Player p : sendTo) sendPacket(p, packet); - } - public void sendPacket(Player player, Packet packet) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); ServerPlayerConnection connection = serverPlayer.connection;