diff --git a/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java b/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java index f0e75a8..937b88a 100644 --- a/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java +++ b/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java @@ -5,16 +5,19 @@ import com.ticxo.modelengine.api.events.AddModelEvent; import com.ticxo.modelengine.api.events.AnimationEndEvent; import com.ticxo.modelengine.api.events.AnimationPlayEvent; import com.ticxo.modelengine.api.events.RemoveModelEvent; +import com.ticxo.modelengine.api.generator.blueprint.ModelBlueprint; import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.ModeledEntity; import me.zimzaza4.geyserutils.spigot.api.PlayerUtils; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.ProjectileHitEvent; @@ -28,6 +31,8 @@ import re.imc.geysermodelengine.model.ModelEntity; import java.util.Map; import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; public class ModelListener implements Listener { @@ -37,9 +42,9 @@ public class ModelListener implements Listener { return; } - if (event.getTarget().getModel(event.getModel().getBlueprint().getName()).isPresent()) { - return; - } + + UUID entityId = event.getTarget().getBase().getUUID(); + ModelBlueprint blueprint = event.getModel().getBlueprint(); Bukkit.getScheduler().runTask(GeyserModelEngine.getInstance(), () -> { ModelEntity.create(event.getTarget(), event.getModel()); @@ -47,10 +52,9 @@ public class ModelListener implements Listener { } + @EventHandler public void onRemoveModel(RemoveModelEvent event) { - event.getTarget().getBase(); - // todo? } @EventHandler diff --git a/src/main/java/re/imc/geysermodelengine/model/EntityTask.java b/src/main/java/re/imc/geysermodelengine/model/EntityTask.java index 6775974..4fff2ea 100644 --- a/src/main/java/re/imc/geysermodelengine/model/EntityTask.java +++ b/src/main/java/re/imc/geysermodelengine/model/EntityTask.java @@ -17,6 +17,7 @@ import org.bukkit.util.BoundingBox; import org.geysermc.floodgate.api.FloodgateApi; import org.jetbrains.annotations.NotNull; import re.imc.geysermodelengine.GeyserModelEngine; +import re.imc.geysermodelengine.listener.ModelListener; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; @@ -83,14 +84,13 @@ public class EntityTask { if (activeModel.isRemoved() || !modeledEntity.getBase().isAlive()) { if (!modeledEntity.getBase().isAlive()) { - if (!activeModel.isRemoved()) { - String animation = hasAnimation("death") ? "death" : "idle"; + if (!activeModel.isRemoved() && hasAnimation("death")) { new BukkitRunnable() { @Override public void run() { entity.remove(); } - }.runTaskLater(GeyserModelEngine.getInstance(), Math.min(Math.max(playAnimation(animation, 999, 0f) - 3, 0), 200)); + }.runTaskLater(GeyserModelEngine.getInstance(), Math.min(Math.max(playAnimation("death", 999, 5f, true) - 3, 0), 200)); } else { new BukkitRunnable() { @Override @@ -154,6 +154,7 @@ public class EntityTask { playAnimation("idle", 0); } } + if (tick % 40 == 0) { for (Player viewer : Set.copyOf(viewers)) { @@ -205,7 +206,9 @@ public class EntityTask { PlayerUtils.setCustomEntity(player, model.getEntity().getEntityId(), "modelengine:" + model.getActiveModel().getBlueprint().getName().toLowerCase()); Bukkit.getScheduler().runTaskLaterAsynchronously(GeyserModelEngine.getInstance(), () -> { // PlayerUtils.sendCustomSkin(player, model.getEntity(), model.getActiveModel().getBlueprint().getName()); - playBedrockAnimation("animation." + model.getActiveModel().getBlueprint().getName() + "." + lastAnimation, looping, 0f); + if (looping) { + playBedrockAnimation("animation." + model.getActiveModel().getBlueprint().getName() + "." + lastAnimation, looping, 0f); + } sendHitBox(player); sendScale(player); Bukkit.getScheduler().runTaskLaterAsynchronously(GeyserModelEngine.getInstance(), () -> { @@ -237,9 +240,9 @@ public class EntityTask { } public int playAnimation(String animation, int p) { - return playAnimation(animation, p, 0); + return playAnimation(animation, p, 0, false); } - public int playAnimation(String animation, int p, float blendTime) { + public int playAnimation(String animation, int p, float blendTime, boolean forceLoop) { ActiveModel activeModel = model.getActiveModel(); @@ -264,7 +267,7 @@ public class EntityTask { firstAnimation = false; } boolean lastLoopState = looping; - looping = animationProperty.getLoopMode() == BlueprintAnimation.LoopMode.LOOP;; + looping = forceLoop || animationProperty.getLoopMode() == BlueprintAnimation.LoopMode.LOOP;; if (lastAnimation.equals(animation)) { if (looping) { @@ -274,6 +277,7 @@ public class EntityTask { } + if (play) { currentAnimationPriority.set(p); @@ -326,15 +330,14 @@ public class EntityTask { */ private void playBedrockAnimation(String animationId, boolean loop, float blendTime) { - // model.getViewers().forEach(viewer -> viewer.sendActionBar("CURRENT AN:" + animationId)); + model.getViewers().forEach(viewer -> viewer.sendActionBar("CURRENT AN:" + animationId)); Entity entity = model.getEntity(); Set viewers = model.getViewers(); Animation.AnimationBuilder animation = Animation.builder() .animation(animationId) - .blendOutTime(blendTime) - .controller("controller.animation.armor_stand.wiggle"); + .blendOutTime(blendTime); if (loop) { animation.nextState(animationId); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a1a80e5..eee40f1 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,4 +1,5 @@ skin-send-delay: 0 skin-view-distance: 50 join-send-delay: 20 -model-entity-type: BAT # must be a living entity \ No newline at end of file +model-entity-type: BAT # must be a living entity +debug: false \ No newline at end of file