From 7c48f6b6ab412d991e6c20ec14a5873317a90e66 Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Tue, 9 Dec 2025 21:25:52 +0800 Subject: [PATCH] Fix Rotation & Support run without floodgate --- .../geysermodelengine/GeyserModelEngine.java | 6 +++++- .../listener/ModelListener.java | 6 +++--- .../listener/MountPacketListener.java | 4 ++-- .../managers/model/EntityTaskManager.java | 4 ++-- .../packet/entity/PacketEntity.java | 2 +- .../runnables/BedrockMountControlRunnable.java | 4 ++-- .../geysermodelengine/util/BedrockUtils.java | 18 ++++++++++++++++++ src/main/resources/paper-plugin.yml | 2 +- 8 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 src/main/java/re/imc/geysermodelengine/util/BedrockUtils.java diff --git a/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java b/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java index 549c415..8616702 100644 --- a/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java +++ b/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java @@ -8,6 +8,7 @@ import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; +import org.geysermc.floodgate.api.FloodgateApi; import re.imc.geysermodelengine.listener.ModelListener; import re.imc.geysermodelengine.listener.MountPacketListener; import re.imc.geysermodelengine.managers.ConfigManager; @@ -16,6 +17,7 @@ import re.imc.geysermodelengine.managers.model.EntityTaskManager; import re.imc.geysermodelengine.managers.model.ModelManager; import re.imc.geysermodelengine.runnables.BedrockMountControlRunnable; import re.imc.geysermodelengine.runnables.UpdateTaskRunnable; +import re.imc.geysermodelengine.util.BedrockUtils; import java.util.concurrent.*; @@ -43,7 +45,6 @@ public class GeyserModelEngine extends JavaPlugin { loadHooks(); loadManagers(); loadRunnables(); - loadBStats(); PacketEvents.getAPI().getEventManager().registerListener(new MountPacketListener(this), PacketListenerPriority.NORMAL); @@ -61,6 +62,9 @@ public class GeyserModelEngine extends JavaPlugin { } private void loadHooks() { + if (Bukkit.getPluginManager().getPlugin("floodgate") != null) { + BedrockUtils.FLOODGATE_API = FloodgateApi.getInstance(); + } PacketEvents.getAPI().init(); CommandAPI.onEnable(); } diff --git a/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java b/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java index dc94a0f..1deaa57 100644 --- a/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java +++ b/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java @@ -12,9 +12,9 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.world.WorldInitEvent; -import org.geysermc.floodgate.api.FloodgateApi; import re.imc.geysermodelengine.GeyserModelEngine; import re.imc.geysermodelengine.managers.model.data.ModelEntityData; +import re.imc.geysermodelengine.util.BedrockUtils; import java.util.Map; @@ -69,14 +69,14 @@ public class ModelListener implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); - if (!FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) return; + if (!BedrockUtils.isBedrockPlayer(player)) return; Bukkit.getGlobalRegionScheduler().runDelayed(plugin, scheduledTask -> plugin.getModelManager().getPlayerJoinedCache().add(player.getUniqueId()), 10); } @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); - if (!FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) return; + if (!BedrockUtils.isBedrockPlayer(player)) return; plugin.getModelManager().getPlayerJoinedCache().remove(player.getUniqueId()); } } diff --git a/src/main/java/re/imc/geysermodelengine/listener/MountPacketListener.java b/src/main/java/re/imc/geysermodelengine/listener/MountPacketListener.java index cdda581..3283b50 100644 --- a/src/main/java/re/imc/geysermodelengine/listener/MountPacketListener.java +++ b/src/main/java/re/imc/geysermodelengine/listener/MountPacketListener.java @@ -9,8 +9,8 @@ import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.bone.type.Mount; import org.apache.commons.lang3.tuple.Pair; import org.bukkit.entity.Player; -import org.geysermc.floodgate.api.FloodgateApi; import re.imc.geysermodelengine.GeyserModelEngine; +import re.imc.geysermodelengine.util.BedrockUtils; public class MountPacketListener implements PacketListener { @@ -23,7 +23,7 @@ public class MountPacketListener implements PacketListener { @Override public void onPacketReceive(PacketReceiveEvent event) { if (event.getPacketType() != PacketType.Play.Client.ENTITY_ACTION) return; - if (!FloodgateApi.getInstance().isFloodgatePlayer(event.getUser().getUUID())) return; + if (!BedrockUtils.isBedrockPlayer(event.getPlayer())) return; Player player = event.getPlayer(); diff --git a/src/main/java/re/imc/geysermodelengine/managers/model/EntityTaskManager.java b/src/main/java/re/imc/geysermodelengine/managers/model/EntityTaskManager.java index 26d5eed..2ad5bf3 100644 --- a/src/main/java/re/imc/geysermodelengine/managers/model/EntityTaskManager.java +++ b/src/main/java/re/imc/geysermodelengine/managers/model/EntityTaskManager.java @@ -8,12 +8,12 @@ import me.zimzaza4.geyserutils.spigot.api.EntityUtils; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; -import org.geysermc.floodgate.api.FloodgateApi; import org.joml.Vector3fc; import re.imc.geysermodelengine.GeyserModelEngine; import re.imc.geysermodelengine.managers.model.data.ModelEntityData; import re.imc.geysermodelengine.packet.entity.PacketEntity; import re.imc.geysermodelengine.runnables.EntityTaskRunnable; +import re.imc.geysermodelengine.util.BedrockUtils; import java.awt.*; import java.lang.reflect.Method; @@ -80,7 +80,7 @@ public class EntityTaskManager { public void checkViewers(ModelEntityData model, Set viewers) { for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { - if (!FloodgateApi.getInstance().isFloodgatePlayer(onlinePlayer.getUniqueId())) continue; + if (!BedrockUtils.isBedrockPlayer(onlinePlayer)) continue; if (canSee(onlinePlayer, model.getEntity())) { if (!viewers.contains(onlinePlayer)) { diff --git a/src/main/java/re/imc/geysermodelengine/packet/entity/PacketEntity.java b/src/main/java/re/imc/geysermodelengine/packet/entity/PacketEntity.java index f3cf64e..ad5a2c5 100644 --- a/src/main/java/re/imc/geysermodelengine/packet/entity/PacketEntity.java +++ b/src/main/java/re/imc/geysermodelengine/packet/entity/PacketEntity.java @@ -50,7 +50,7 @@ public class PacketEntity { } public boolean teleport(@NotNull Location location) { - boolean sent = this.location.getWorld() != location.getWorld() || this.location.distanceSquared(location) > 0.000001; + boolean sent = this.location.getWorld() != location.getWorld() || this.location.distanceSquared(location) > 0.000001 || this.location.getYaw() != location.getYaw() || this.location.getPitch() != location.getPitch(); this.location = location.clone(); if (sent) sendLocationPacket(viewers); diff --git a/src/main/java/re/imc/geysermodelengine/runnables/BedrockMountControlRunnable.java b/src/main/java/re/imc/geysermodelengine/runnables/BedrockMountControlRunnable.java index 7693197..5604c46 100644 --- a/src/main/java/re/imc/geysermodelengine/runnables/BedrockMountControlRunnable.java +++ b/src/main/java/re/imc/geysermodelengine/runnables/BedrockMountControlRunnable.java @@ -9,8 +9,8 @@ import io.papermc.paper.threadedregions.scheduler.ScheduledTask; import org.apache.commons.lang3.tuple.Pair; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import org.geysermc.floodgate.api.FloodgateApi; import re.imc.geysermodelengine.GeyserModelEngine; +import re.imc.geysermodelengine.util.BedrockUtils; import java.util.function.Consumer; @@ -25,7 +25,7 @@ public class BedrockMountControlRunnable implements Consumer { @Override public void accept(ScheduledTask scheduledTask) { for (Player player : Bukkit.getOnlinePlayers()) { - if (!FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) continue; + if (!BedrockUtils.isBedrockPlayer(player)) continue; float pitch = player.getLocation().getPitch(); Pair seat = plugin.getModelManager().getDriversCache().get(player.getUniqueId()); diff --git a/src/main/java/re/imc/geysermodelengine/util/BedrockUtils.java b/src/main/java/re/imc/geysermodelengine/util/BedrockUtils.java new file mode 100644 index 0000000..fbc96b2 --- /dev/null +++ b/src/main/java/re/imc/geysermodelengine/util/BedrockUtils.java @@ -0,0 +1,18 @@ +package re.imc.geysermodelengine.util; + +import org.bukkit.entity.Player; +import org.geysermc.floodgate.api.FloodgateApi; + +import java.util.Objects; + +public class BedrockUtils { + + public static FloodgateApi FLOODGATE_API; + + public static boolean isBedrockPlayer(Player player) { + if (FLOODGATE_API != null) { + return FLOODGATE_API.isFloodgatePlayer(player.getUniqueId()); + } + return Objects.equals(player.getClientBrandName(), "Geyser"); + } +} diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml index 015a6c6..7dc01cb 100644 --- a/src/main/resources/paper-plugin.yml +++ b/src/main/resources/paper-plugin.yml @@ -18,4 +18,4 @@ dependencies: ModelEngine: required: true floodgate: - required: true \ No newline at end of file + required: false \ No newline at end of file