diff --git a/pom.xml b/pom.xml index de86710..e80c745 100644 --- a/pom.xml +++ b/pom.xml @@ -125,7 +125,7 @@ com.comphenix.protocol ProtocolLib - 5.1.0 + 5.3.0-SNAPSHOT provided diff --git a/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java b/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java index e6c6802..20e6bb4 100644 --- a/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java +++ b/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java @@ -18,6 +18,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import re.imc.geysermodelengine.listener.ModelListener; import re.imc.geysermodelengine.listener.MountPacketListener; +import re.imc.geysermodelengine.model.BedrockMountControl; import re.imc.geysermodelengine.model.ModelEntity; import java.util.ArrayList; @@ -97,6 +98,7 @@ public final class GeyserModelEngine extends JavaPlugin { initialized = true; }, 100); + BedrockMountControl.startTask(); } @Override diff --git a/src/main/java/re/imc/geysermodelengine/listener/MountPacketListener.java b/src/main/java/re/imc/geysermodelengine/listener/MountPacketListener.java index cfdab1a..d1c7e9a 100644 --- a/src/main/java/re/imc/geysermodelengine/listener/MountPacketListener.java +++ b/src/main/java/re/imc/geysermodelengine/listener/MountPacketListener.java @@ -10,6 +10,7 @@ import com.comphenix.protocol.wrappers.Pair; import com.ticxo.modelengine.api.ModelEngineAPI; import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.bone.type.Mount; +import com.ticxo.modelengine.api.mount.controller.MountController; import org.geysermc.floodgate.api.FloodgateApi; import re.imc.geysermodelengine.GeyserModelEngine; @@ -17,7 +18,7 @@ import java.util.Set; public class MountPacketListener extends PacketAdapter { public MountPacketListener() { - super(GeyserModelEngine.getInstance(), ListenerPriority.HIGHEST, Set.of(PacketType.Play.Client.STEER_VEHICLE, PacketType.Play.Client.ENTITY_ACTION), ListenerOptions.SYNC); + super(GeyserModelEngine.getInstance(), ListenerPriority.HIGHEST, Set.of(PacketType.Play.Client.ENTITY_ACTION), ListenerOptions.ASYNC); } @Override @@ -26,37 +27,10 @@ public class MountPacketListener extends PacketAdapter { return; } - if (event.getPacket().getType() == PacketType.Play.Client.STEER_VEHICLE) { - Pair seat = GeyserModelEngine.getInstance().getDrivers().get(event.getPlayer()); - if (seat != null) { - float pitch = event.getPlayer().getPitch(); - if (seat.getFirst().getModeledEntity().getBase().isFlying()) { - if (pitch < -30) { - event.getPacket().getBooleans().writeSafely(0, true); - } - if (pitch > 45) { - event.getPacket().getBooleans().writeSafely(1, true); - } - } else { - if (event.getPlayer().getInventory().getHeldItemSlot() == 0) { - event.getPacket().getBooleans().writeSafely(0, true); - event.getPlayer().getInventory().setHeldItemSlot(3); - } - if (pitch > 89 || event.getPlayer().getInventory().getHeldItemSlot() == 1) { - event.getPacket().getBooleans().writeSafely(1, true); - } - if (event.getPlayer().getInventory().getHeldItemSlot() == 8) { - event.getPacket().getBooleans().writeSafely(0, true); - } - } - } - } else { - Pair seat = GeyserModelEngine.getInstance().getDrivers().get(event.getPlayer()); - if (seat != null) { - if (event.getPacket().getPlayerActions().read(0) == EnumWrappers.PlayerAction.START_SNEAKING) { - event.getPlayer().sendActionBar("leave"); - ModelEngineAPI.getMountPairManager().tryDismount(event.getPlayer()); - } + Pair seat = GeyserModelEngine.getInstance().getDrivers().get(event.getPlayer()); + if (seat != null) { + if (event.getPacket().getPlayerActions().read(0) == EnumWrappers.PlayerAction.START_SNEAKING) { + ModelEngineAPI.getMountPairManager().tryDismount(event.getPlayer()); } } } diff --git a/src/main/java/re/imc/geysermodelengine/model/BedrockMountControl.java b/src/main/java/re/imc/geysermodelengine/model/BedrockMountControl.java new file mode 100644 index 0000000..0f0938b --- /dev/null +++ b/src/main/java/re/imc/geysermodelengine/model/BedrockMountControl.java @@ -0,0 +1,52 @@ +package re.imc.geysermodelengine.model; + +import com.comphenix.protocol.wrappers.Pair; +import com.ticxo.modelengine.api.ModelEngineAPI; +import com.ticxo.modelengine.api.model.ActiveModel; +import com.ticxo.modelengine.api.model.bone.type.Mount; +import com.ticxo.modelengine.api.mount.controller.MountController; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import re.imc.geysermodelengine.GeyserModelEngine; + +public class BedrockMountControl { + + public static void startTask() { + new BukkitRunnable() { + @Override + public void run() { + for (Player player : Bukkit.getOnlinePlayers()) { + float pitch = player.getPitch(); + Pair seat = GeyserModelEngine.getInstance().getDrivers().get(player); + if (seat != null) { + if (pitch < -30) { + MountController controller = ModelEngineAPI.getMountPairManager() + .getController(player.getUniqueId()); + if (controller != null) { + MountController.MountInput input = controller.getInput(); + if (input != null) { + input.setJump(true); + controller.setInput(input); + } + } + } + if (pitch > 50) { + MountController controller = ModelEngineAPI.getMountPairManager() + .getController(player.getUniqueId()); + if (controller != null) { + MountController.MountInput input = controller.getInput(); + if (input != null) { + input.setSneak(true); + controller.setInput(input); + } + } + } + + } + } + + } + }.runTaskTimerAsynchronously(GeyserModelEngine.getInstance(), 1, 1); + } +} diff --git a/src/main/java/re/imc/geysermodelengine/model/EntityTask.java b/src/main/java/re/imc/geysermodelengine/model/EntityTask.java index 52b98b4..12cef5a 100644 --- a/src/main/java/re/imc/geysermodelengine/model/EntityTask.java +++ b/src/main/java/re/imc/geysermodelengine/model/EntityTask.java @@ -1,6 +1,9 @@ package re.imc.geysermodelengine.model; import com.ticxo.modelengine.api.animation.BlueprintAnimation; +import com.ticxo.modelengine.api.animation.ModelState; +import com.ticxo.modelengine.api.animation.handler.AnimationHandler; +import com.ticxo.modelengine.api.animation.handler.IStateMachineHandler; import com.ticxo.modelengine.api.entity.BaseEntity; import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.ModeledEntity; @@ -58,6 +61,7 @@ public class EntityTask { private BukkitRunnable asyncTask; + public EntityTask(ModelEntity model) { this.model = model; } @@ -139,18 +143,22 @@ public class EntityTask { BaseEntity base = modeledEntity.getBase(); - if (base.isStrafing() && hasAnimation("strafe")) { - playAnimation("strafe", 50); - } else if (base.isFlying() && hasAnimation("fly")) { - playAnimation("fly", 40); - } else if (base.isJumping() && hasAnimation("jump")) { - playAnimation("jump", 30); - } else if (base.isWalking() && hasAnimation("walk")) { - playAnimation("walk", 20); - } else if (hasAnimation("idle")) { - playAnimation("idle", 0); + AnimationHandler handler = activeModel.getAnimationHandler(); + if (base.isStrafing()) { + playAnimation(handler.getDefaultProperty(ModelState.STRAFE).getAnimation(), 50); + } else if (base.isFlying()) { + if (base.isWalking()) { + playAnimation(handler.getDefaultProperty(ModelState.FLY).getAnimation(), 40); + } else { + playAnimation(handler.getDefaultProperty(ModelState.HOVER).getAnimation(), 40); + } + } else if (base.isJumping()) { + playAnimation(handler.getDefaultProperty(ModelState.JUMP).getAnimation(), 30); + } else if (base.isWalking()) { + playAnimation(handler.getDefaultProperty(ModelState.WALK).getAnimation(), 20); + } else if (hasAnimation(handler.getDefaultProperty(ModelState.IDLE).getAnimation())) { + playAnimation(handler.getDefaultProperty(ModelState.IDLE).getAnimation(), 0); } - if (animationCooldown.get() > 0) { animationCooldown.decrementAndGet(); } @@ -160,8 +168,8 @@ public class EntityTask { updateEntityProperties(player.get(), false); // do not actually use this, atleast bundle these up ;( - sendScale(player.get(), true); - sendColor(player.get(), true); + sendScale(player.get(), false); + sendColor(player.get(), false); } @@ -191,29 +199,33 @@ public class EntityTask { } sendHitBox(player); sendScale(player, true); + sendColor(player, true); updateEntityProperties(player, true); }, 8); }, delay); } - public void sendScale(Player player, boolean ignore) { + public void sendScale(Player player, boolean firstSend) { if (player == null) return; Vector3f scale = model.getActiveModel().getScale(); float average = (scale.x + scale.y + scale.z) / 3; - if (average == lastScale) return; + if (!firstSend) { + if (average == lastScale) return; + } EntityUtils.sendCustomScale(player, model.getEntity().getEntityId(), average); lastScale = average; } - public void sendColor(Player player, boolean ignore) { + public void sendColor(Player player, boolean firstSend) { if (player == null) return; Color color = new Color(model.getActiveModel().getDefaultTint().asARGB()); - if (color.equals(lastColor)) return; - + if (firstSend) { + if (color.equals(lastColor)) return; + } EntityUtils.sendCustomColor(player, model.getEntity().getEntityId(), color); lastColor = color; 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 d0ff025..f96b3be 100644 --- a/src/main/java/re/imc/geysermodelengine/packet/entity/PacketEntity.java +++ b/src/main/java/re/imc/geysermodelengine/packet/entity/PacketEntity.java @@ -1,6 +1,7 @@ package re.imc.geysermodelengine.packet.entity; import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.utility.MinecraftVersion; import com.comphenix.protocol.wrappers.EnumWrappers; import lombok.Getter; import org.bukkit.Location; @@ -20,6 +21,8 @@ import java.util.concurrent.ThreadLocalRandom; @Getter public class PacketEntity { + + public static final MinecraftVersion V1_20_5 = new MinecraftVersion("1.20.5"); public PacketEntity(EntityType type, Set viewers, Location location) { this.id = ThreadLocalRandom.current().nextInt(300000000, 400000000); this.uuid = UUID.randomUUID(); @@ -89,8 +92,11 @@ public class PacketEntity { } public void sendHurtPacket(Collection players) { - EntityHurtPacket packet = new EntityHurtPacket(id); - players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode())); + // 1.21 error + if (MinecraftVersion.getCurrentVersion().compareTo(V1_20_5) < 0) { + EntityHurtPacket packet = new EntityHurtPacket(id); + players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode())); + } } public void sendEntityDestroyPacket(Collection players) {