diff --git a/src/main/java/com/magmaguy/freeminecraftmodels/customentity/DynamicEntity.java b/src/main/java/com/magmaguy/freeminecraftmodels/customentity/DynamicEntity.java index 94719d8..d2e049a 100644 --- a/src/main/java/com/magmaguy/freeminecraftmodels/customentity/DynamicEntity.java +++ b/src/main/java/com/magmaguy/freeminecraftmodels/customentity/DynamicEntity.java @@ -62,11 +62,22 @@ public static DynamicEntity create(String entityID, LivingEntity livingEntity) { DynamicEntity dynamicEntity = new DynamicEntity(entityID, livingEntity.getLocation()); dynamicEntity.spawn(livingEntity); livingEntity.setVisibleByDefault(false); - Bukkit.getOnlinePlayers().forEach(player -> { - if (player.getLocation().getWorld().equals(dynamicEntity.getLocation().getWorld())) { - player.hideEntity(MetadataHandler.PLUGIN, livingEntity); - } - }); + // Must run on main thread + if (Bukkit.isPrimaryThread()) { + Bukkit.getOnlinePlayers().forEach(player -> { + if (player.getLocation().getWorld().equals(dynamicEntity.getLocation().getWorld())) { + player.hideEntity(MetadataHandler.PLUGIN, livingEntity); + } + }); + } else { + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, () -> { + Bukkit.getOnlinePlayers().forEach(player -> { + if (player.getLocation().getWorld().equals(dynamicEntity.getLocation().getWorld())) { + player.hideEntity(MetadataHandler.PLUGIN, livingEntity); + } + }); + }); + } livingEntity.getPersistentDataContainer().set(namespacedKey, PersistentDataType.BYTE, (byte) 0); return dynamicEntity; diff --git a/src/main/java/com/magmaguy/freeminecraftmodels/customentity/ModeledEntity.java b/src/main/java/com/magmaguy/freeminecraftmodels/customentity/ModeledEntity.java index 6b87b65..3192a74 100644 --- a/src/main/java/com/magmaguy/freeminecraftmodels/customentity/ModeledEntity.java +++ b/src/main/java/com/magmaguy/freeminecraftmodels/customentity/ModeledEntity.java @@ -234,14 +234,34 @@ public boolean isChunkLoaded() { public void showUnderlyingEntity(Player player) { if (underlyingEntity == null || !underlyingEntity.isValid()) return; - player.showEntity(MetadataHandler.PLUGIN, underlyingEntity); - underlyingEntity.setGlowing(true); + // Must run on main thread + if (Bukkit.isPrimaryThread()) { + player.showEntity(MetadataHandler.PLUGIN, underlyingEntity); + underlyingEntity.setGlowing(true); + } else { + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, () -> { + if (underlyingEntity != null && underlyingEntity.isValid() && player.isOnline()) { + player.showEntity(MetadataHandler.PLUGIN, underlyingEntity); + underlyingEntity.setGlowing(true); + } + }); + } } public void hideUnderlyingEntity(Player player) { if (underlyingEntity == null || !underlyingEntity.isValid()) return; - player.hideEntity(MetadataHandler.PLUGIN, underlyingEntity); - underlyingEntity.setGlowing(false); + // Must run on main thread + if (Bukkit.isPrimaryThread()) { + player.hideEntity(MetadataHandler.PLUGIN, underlyingEntity); + underlyingEntity.setGlowing(false); + } else { + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, () -> { + if (underlyingEntity != null && underlyingEntity.isValid() && player.isOnline()) { + player.hideEntity(MetadataHandler.PLUGIN, underlyingEntity); + underlyingEntity.setGlowing(false); + } + }); + } } /** diff --git a/src/main/java/com/magmaguy/freeminecraftmodels/customentity/PlayerDisguiseEntity.java b/src/main/java/com/magmaguy/freeminecraftmodels/customentity/PlayerDisguiseEntity.java index e2c5ea4..62f4727 100644 --- a/src/main/java/com/magmaguy/freeminecraftmodels/customentity/PlayerDisguiseEntity.java +++ b/src/main/java/com/magmaguy/freeminecraftmodels/customentity/PlayerDisguiseEntity.java @@ -22,11 +22,22 @@ public static PlayerDisguiseEntity create(String entityID, Player targetPlayer) PlayerDisguiseEntity dynamicEntity = new PlayerDisguiseEntity(entityID, targetPlayer.getLocation()); dynamicEntity.spawn(targetPlayer); targetPlayer.setVisibleByDefault(false); - Bukkit.getOnlinePlayers().forEach(player -> { - if (player.getLocation().getWorld().equals(dynamicEntity.getLocation().getWorld())) { - player.hideEntity(MetadataHandler.PLUGIN, targetPlayer); - } - }); + // Must run on main thread + if (Bukkit.isPrimaryThread()) { + Bukkit.getOnlinePlayers().forEach(player -> { + if (player.getLocation().getWorld().equals(dynamicEntity.getLocation().getWorld())) { + player.hideEntity(MetadataHandler.PLUGIN, targetPlayer); + } + }); + } else { + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, () -> { + Bukkit.getOnlinePlayers().forEach(player -> { + if (player.getLocation().getWorld().equals(dynamicEntity.getLocation().getWorld())) { + player.hideEntity(MetadataHandler.PLUGIN, targetPlayer); + } + }); + }); + } targetPlayer.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1)); return dynamicEntity; } diff --git a/src/main/java/com/magmaguy/freeminecraftmodels/customentity/core/SkeletonWatchers.java b/src/main/java/com/magmaguy/freeminecraftmodels/customentity/core/SkeletonWatchers.java index 58643f7..ff49665 100644 --- a/src/main/java/com/magmaguy/freeminecraftmodels/customentity/core/SkeletonWatchers.java +++ b/src/main/java/com/magmaguy/freeminecraftmodels/customentity/core/SkeletonWatchers.java @@ -224,8 +224,14 @@ private boolean isPointVisibleRecursive(Location eyeLocation, Vector targetPoint private void displayTo(Player player) { boolean isBedrock = BedrockChecker.isBedrock(player); - if (isBedrock && !DefaultConfig.sendCustomModelsToBedrockClients && skeleton.getModeledEntity().getUnderlyingEntity() != null) - player.showEntity(MetadataHandler.PLUGIN, skeleton.getModeledEntity().getUnderlyingEntity()); + if (isBedrock && !DefaultConfig.sendCustomModelsToBedrockClients && skeleton.getModeledEntity().getUnderlyingEntity() != null) { + // Must run on main thread + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, () -> { + if (player.isOnline() && player.isValid()) { + player.showEntity(MetadataHandler.PLUGIN, skeleton.getModeledEntity().getUnderlyingEntity()); + } + }); + } viewers.add(player.getUniqueId()); skeleton.getBones().forEach(bone -> bone.displayTo(player)); if (skeleton.getModeledEntity() instanceof PropEntity propEntity) @@ -233,11 +239,18 @@ private void displayTo(Player player) { } private void hideFrom(UUID uuid) { - boolean isBedrock = BedrockChecker.isBedrock(Bukkit.getPlayer(uuid)); Player player = Bukkit.getPlayer(uuid); if (player == null || !player.isValid()) return; - if (isBedrock && !DefaultConfig.sendCustomModelsToBedrockClients && skeleton.getModeledEntity().getUnderlyingEntity() != null) - player.hideEntity(MetadataHandler.PLUGIN, skeleton.getModeledEntity().getUnderlyingEntity()); + + boolean isBedrock = BedrockChecker.isBedrock(player); + if (isBedrock && !DefaultConfig.sendCustomModelsToBedrockClients && skeleton.getModeledEntity().getUnderlyingEntity() != null) { + // Must run on main thread + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, () -> { + if (player.isOnline() && player.isValid()) { + player.hideEntity(MetadataHandler.PLUGIN, skeleton.getModeledEntity().getUnderlyingEntity()); + } + }); + } viewers.remove(uuid); skeleton.getBones().forEach(bone -> bone.hideFrom(uuid)); if (skeleton.getModeledEntity() instanceof PropEntity propEntity)