Fix Rotation & Support run without floodgate

This commit is contained in:
zimzaza4
2025-12-09 21:25:52 +08:00
parent 1c47fe83d2
commit 7c48f6b6ab
8 changed files with 34 additions and 12 deletions

View File

@@ -8,6 +8,7 @@ import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.geysermc.floodgate.api.FloodgateApi;
import re.imc.geysermodelengine.listener.ModelListener; import re.imc.geysermodelengine.listener.ModelListener;
import re.imc.geysermodelengine.listener.MountPacketListener; import re.imc.geysermodelengine.listener.MountPacketListener;
import re.imc.geysermodelengine.managers.ConfigManager; 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.managers.model.ModelManager;
import re.imc.geysermodelengine.runnables.BedrockMountControlRunnable; import re.imc.geysermodelengine.runnables.BedrockMountControlRunnable;
import re.imc.geysermodelengine.runnables.UpdateTaskRunnable; import re.imc.geysermodelengine.runnables.UpdateTaskRunnable;
import re.imc.geysermodelengine.util.BedrockUtils;
import java.util.concurrent.*; import java.util.concurrent.*;
@@ -43,7 +45,6 @@ public class GeyserModelEngine extends JavaPlugin {
loadHooks(); loadHooks();
loadManagers(); loadManagers();
loadRunnables(); loadRunnables();
loadBStats(); loadBStats();
PacketEvents.getAPI().getEventManager().registerListener(new MountPacketListener(this), PacketListenerPriority.NORMAL); PacketEvents.getAPI().getEventManager().registerListener(new MountPacketListener(this), PacketListenerPriority.NORMAL);
@@ -61,6 +62,9 @@ public class GeyserModelEngine extends JavaPlugin {
} }
private void loadHooks() { private void loadHooks() {
if (Bukkit.getPluginManager().getPlugin("floodgate") != null) {
BedrockUtils.FLOODGATE_API = FloodgateApi.getInstance();
}
PacketEvents.getAPI().init(); PacketEvents.getAPI().init();
CommandAPI.onEnable(); CommandAPI.onEnable();
} }

View File

@@ -12,9 +12,9 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.world.WorldInitEvent; import org.bukkit.event.world.WorldInitEvent;
import org.geysermc.floodgate.api.FloodgateApi;
import re.imc.geysermodelengine.GeyserModelEngine; import re.imc.geysermodelengine.GeyserModelEngine;
import re.imc.geysermodelengine.managers.model.data.ModelEntityData; import re.imc.geysermodelengine.managers.model.data.ModelEntityData;
import re.imc.geysermodelengine.util.BedrockUtils;
import java.util.Map; import java.util.Map;
@@ -69,14 +69,14 @@ public class ModelListener implements Listener {
@EventHandler @EventHandler
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer(); 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); Bukkit.getGlobalRegionScheduler().runDelayed(plugin, scheduledTask -> plugin.getModelManager().getPlayerJoinedCache().add(player.getUniqueId()), 10);
} }
@EventHandler @EventHandler
public void onPlayerQuit(PlayerQuitEvent event) { public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
if (!FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) return; if (!BedrockUtils.isBedrockPlayer(player)) return;
plugin.getModelManager().getPlayerJoinedCache().remove(player.getUniqueId()); plugin.getModelManager().getPlayerJoinedCache().remove(player.getUniqueId());
} }
} }

View File

@@ -9,8 +9,8 @@ import com.ticxo.modelengine.api.model.ActiveModel;
import com.ticxo.modelengine.api.model.bone.type.Mount; import com.ticxo.modelengine.api.model.bone.type.Mount;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.geysermc.floodgate.api.FloodgateApi;
import re.imc.geysermodelengine.GeyserModelEngine; import re.imc.geysermodelengine.GeyserModelEngine;
import re.imc.geysermodelengine.util.BedrockUtils;
public class MountPacketListener implements PacketListener { public class MountPacketListener implements PacketListener {
@@ -23,7 +23,7 @@ public class MountPacketListener implements PacketListener {
@Override @Override
public void onPacketReceive(PacketReceiveEvent event) { public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() != PacketType.Play.Client.ENTITY_ACTION) return; 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(); Player player = event.getPlayer();

View File

@@ -8,12 +8,12 @@ import me.zimzaza4.geyserutils.spigot.api.EntityUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.geysermc.floodgate.api.FloodgateApi;
import org.joml.Vector3fc; import org.joml.Vector3fc;
import re.imc.geysermodelengine.GeyserModelEngine; import re.imc.geysermodelengine.GeyserModelEngine;
import re.imc.geysermodelengine.managers.model.data.ModelEntityData; import re.imc.geysermodelengine.managers.model.data.ModelEntityData;
import re.imc.geysermodelengine.packet.entity.PacketEntity; import re.imc.geysermodelengine.packet.entity.PacketEntity;
import re.imc.geysermodelengine.runnables.EntityTaskRunnable; import re.imc.geysermodelengine.runnables.EntityTaskRunnable;
import re.imc.geysermodelengine.util.BedrockUtils;
import java.awt.*; import java.awt.*;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@@ -80,7 +80,7 @@ public class EntityTaskManager {
public void checkViewers(ModelEntityData model, Set<Player> viewers) { public void checkViewers(ModelEntityData model, Set<Player> viewers) {
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
if (!FloodgateApi.getInstance().isFloodgatePlayer(onlinePlayer.getUniqueId())) continue; if (!BedrockUtils.isBedrockPlayer(onlinePlayer)) continue;
if (canSee(onlinePlayer, model.getEntity())) { if (canSee(onlinePlayer, model.getEntity())) {
if (!viewers.contains(onlinePlayer)) { if (!viewers.contains(onlinePlayer)) {

View File

@@ -50,7 +50,7 @@ public class PacketEntity {
} }
public boolean teleport(@NotNull Location location) { 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(); this.location = location.clone();
if (sent) sendLocationPacket(viewers); if (sent) sendLocationPacket(viewers);

View File

@@ -9,8 +9,8 @@ import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.geysermc.floodgate.api.FloodgateApi;
import re.imc.geysermodelengine.GeyserModelEngine; import re.imc.geysermodelengine.GeyserModelEngine;
import re.imc.geysermodelengine.util.BedrockUtils;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -25,7 +25,7 @@ public class BedrockMountControlRunnable implements Consumer<ScheduledTask> {
@Override @Override
public void accept(ScheduledTask scheduledTask) { public void accept(ScheduledTask scheduledTask) {
for (Player player : Bukkit.getOnlinePlayers()) { for (Player player : Bukkit.getOnlinePlayers()) {
if (!FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) continue; if (!BedrockUtils.isBedrockPlayer(player)) continue;
float pitch = player.getLocation().getPitch(); float pitch = player.getLocation().getPitch();
Pair<ActiveModel, Mount> seat = plugin.getModelManager().getDriversCache().get(player.getUniqueId()); Pair<ActiveModel, Mount> seat = plugin.getModelManager().getDriversCache().get(player.getUniqueId());

View File

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

View File

@@ -18,4 +18,4 @@ dependencies:
ModelEngine: ModelEngine:
required: true required: true
floodgate: floodgate:
required: true required: false