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

View File

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

View File

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

View File

@@ -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<Player> 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)) {

View File

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

View File

@@ -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<ScheduledTask> {
@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<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:
required: true
floodgate:
required: true
required: false