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