From e554c7c5726d8cce311e29e57431814a84d895dd Mon Sep 17 00:00:00 2001 From: zimzaza4 <3625282098@qq.com> Date: Sat, 28 Sep 2024 00:20:56 +0800 Subject: [PATCH] custom damage tint support --- .../geysermodelengine/GeyserModelEngine.java | 19 +++++++++++++++++++ .../listener/ModelListener.java | 5 +++-- .../geysermodelengine/model/EntityTask.java | 5 +++-- .../packet/EntityHurtPacket.java | 1 + src/main/resources/config.yml | 1 + 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java b/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java index 20e6bb4..885993a 100644 --- a/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java +++ b/src/main/java/re/imc/geysermodelengine/GeyserModelEngine.java @@ -26,6 +26,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public final class GeyserModelEngine extends JavaPlugin { @@ -51,6 +53,9 @@ public final class GeyserModelEngine extends JavaPlugin { @Getter private int joinSendDelay; + @Getter + private long entityPositionUpdatePeriod; + @Getter private boolean debug; @@ -62,6 +67,9 @@ public final class GeyserModelEngine extends JavaPlugin { @Getter private List enablePartVisibilityModels = new ArrayList<>(); + + @Getter + private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); @Override public void onEnable() { // Plugin startup logic @@ -72,6 +80,7 @@ public final class GeyserModelEngine extends JavaPlugin { debug = getConfig().getBoolean("debug", false); modelEntityType = EntityType.valueOf(getConfig().getString("model-entity-type", "BAT")); joinSendDelay = getConfig().getInt("join-send-delay", 20); + entityPositionUpdatePeriod = getConfig().getLong("entity-position-update-period", 35); enablePartVisibilityModels.addAll(getConfig().getStringList("enable-part-visibility-models")); if (joinSendDelay > 0) { joinedPlayer = CacheBuilder.newBuilder() @@ -98,6 +107,16 @@ public final class GeyserModelEngine extends JavaPlugin { initialized = true; }, 100); + + scheduler.scheduleAtFixedRate(() -> { + try { + for (Map models : ModelEntity.ENTITIES.values()) { + models.values().forEach(ModelEntity::teleportToModel); + } + } catch (Throwable t) { + t.printStackTrace(); + } + }, 10, entityPositionUpdatePeriod, TimeUnit.MILLISECONDS); BedrockMountControl.startTask(); } diff --git a/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java b/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java index 363bdd9..ea5933c 100644 --- a/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java +++ b/src/main/java/re/imc/geysermodelengine/listener/ModelListener.java @@ -85,7 +85,7 @@ public class ModelListener implements Listener { - + /* @EventHandler(priority = EventPriority.MONITOR) public void onModelEntityHurt(EntityDamageEvent event) { if (event.isCancelled()) { @@ -96,13 +96,14 @@ public class ModelListener implements Listener { if (model != null) { for (Map.Entry entry : model.entrySet()) { if (!entry.getValue().getEntity().isDead()) { - entry.getValue().getEntity().sendHurtPacket(entry.getValue().getViewers()); + //entry.getValue().getEntity().sendHurtPacket(entry.getValue().getViewers()); } } } } + */ /* @EventHandler diff --git a/src/main/java/re/imc/geysermodelengine/model/EntityTask.java b/src/main/java/re/imc/geysermodelengine/model/EntityTask.java index 9927b38..8ee12ac 100644 --- a/src/main/java/re/imc/geysermodelengine/model/EntityTask.java +++ b/src/main/java/re/imc/geysermodelengine/model/EntityTask.java @@ -66,7 +66,6 @@ public class EntityTask { return; } - model.teleportToModel(); Set viewers = model.getViewers(); ActiveModel activeModel = model.getActiveModel(); ModeledEntity modeledEntity = model.getModeledEntity(); @@ -108,7 +107,6 @@ public class EntityTask { sendHitBoxToAll(); } - BaseEntity base = modeledEntity.getBase(); // Optional player = viewers.stream().findAny(); // if (player.isEmpty()) return @@ -191,6 +189,9 @@ public class EntityTask { if (players.isEmpty()) return; Color color = new Color(model.getActiveModel().getDefaultTint().asARGB()); + if (model.getActiveModel().isMarkedHurt()) { + color = new Color(model.getActiveModel().getDamageTint().asARGB()); + } if (firstSend) { if (color.equals(lastColor)) return; } diff --git a/src/main/java/re/imc/geysermodelengine/packet/EntityHurtPacket.java b/src/main/java/re/imc/geysermodelengine/packet/EntityHurtPacket.java index 2b06f97..36a2ae7 100644 --- a/src/main/java/re/imc/geysermodelengine/packet/EntityHurtPacket.java +++ b/src/main/java/re/imc/geysermodelengine/packet/EntityHurtPacket.java @@ -18,6 +18,7 @@ public class EntityHurtPacket implements WrapperPacket { packet.getIntegers().writeSafely(1,0); packet.getIntegers().writeSafely(2, 0); packet.getIntegers().writeSafely(3, 0); + packet.getBooleans().writeSafely(0, false); return packet; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 43bf990..ba9fd1e 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,6 +1,7 @@ data-send-delay: 5 entity-view-distance: 50 join-send-delay: 20 +entity-position-update-period: 35 model-entity-type: BAT # must be a living entity enable-part-visibility-models: - example