This commit is contained in:
zimzaza4
2024-04-13 21:58:27 +08:00
parent f40e08fdab
commit 3e2c9026fc
6 changed files with 65 additions and 19 deletions

View File

@@ -41,18 +41,22 @@ public final class GeyserModelEngine extends JavaPlugin {
@Getter @Getter
private Cache<Player, Boolean> joinedPlayer; private Cache<Player, Boolean> joinedPlayer;
@Getter
private int joinSendDelay;
@Override @Override
public void onEnable() { public void onEnable() {
// Plugin startup logic // Plugin startup logic
saveDefaultConfig(); saveDefaultConfig();
// alwaysSendSkin = getConfig().getBoolean("always-send-skin"); // alwaysSendSkin = getConfig().getBoolean("always-send-skin");
skinSendDelay = getConfig().getInt("skin-send-delay"); skinSendDelay = getConfig().getInt("skin-send-delay", 0);
viewDistance = getConfig().getInt("skin-view-distance"); viewDistance = getConfig().getInt("skin-view-distance", 60);
modelEntityType = EntityType.valueOf(getConfig().getString("model-entity-type", "BAT")); modelEntityType = EntityType.valueOf(getConfig().getString("model-entity-type", "BAT"));
int joinedDelay = getConfig().getInt("join-send-delay"); joinSendDelay = getConfig().getInt("join-send-delay", 20);
if (joinedDelay > 0) { if (joinSendDelay > 0) {
joinedPlayer = CacheBuilder.newBuilder() joinedPlayer = CacheBuilder.newBuilder()
.expireAfterWrite(joinedDelay * 50L, TimeUnit.MILLISECONDS).build(); .expireAfterWrite(joinSendDelay * 50L, TimeUnit.MILLISECONDS).build();
} }
instance = this; instance = this;
ProtocolLibrary.getProtocolManager().addPacketListener(new InteractPacketListener()); ProtocolLibrary.getProtocolManager().addPacketListener(new InteractPacketListener());

View File

@@ -27,8 +27,16 @@ public class AddEntityPacketListener extends PacketAdapter {
} }
ModelEntity model = ModelEntity.MODEL_ENTITIES.get(entity.getEntityId()); ModelEntity model = ModelEntity.MODEL_ENTITIES.get(entity.getEntityId());
if (model != null && FloodgateApi.getInstance().isFloodgatePlayer(event.getPlayer().getUniqueId())) { if (model != null) {
if (FloodgateApi.getInstance().isFloodgatePlayer(event.getPlayer().getUniqueId())) {
if (GeyserModelEngine.getInstance().getJoinedPlayer() != null && GeyserModelEngine.getInstance().getJoinedPlayer().getIfPresent(event.getPlayer()) != null) {
model.getTask().sendEntityData(event.getPlayer(), GeyserModelEngine.getInstance().getJoinSendDelay());
} else {
model.getTask().sendEntityData(event.getPlayer(), GeyserModelEngine.getInstance().getSkinSendDelay()); model.getTask().sendEntityData(event.getPlayer(), GeyserModelEngine.getInstance().getSkinSendDelay());
} }
} else {
event.setCancelled(true);
}
}
} }
} }

View File

@@ -8,14 +8,11 @@ import com.ticxo.modelengine.api.events.RemoveModelEvent;
import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.ActiveModel;
import com.ticxo.modelengine.api.model.ModeledEntity; import com.ticxo.modelengine.api.model.ModeledEntity;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Damageable;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.world.EntitiesLoadEvent; import org.bukkit.event.world.EntitiesLoadEvent;
@@ -34,6 +31,7 @@ public class ModelListener implements Listener {
if (event.isCancelled()) { if (event.isCancelled()) {
return; return;
} }
Bukkit.getScheduler().runTask(GeyserModelEngine.getInstance(), () -> { Bukkit.getScheduler().runTask(GeyserModelEngine.getInstance(), () -> {
ModelEntity.create(event.getTarget(), event.getModel()); ModelEntity.create(event.getTarget(), event.getModel());
}); });
@@ -64,7 +62,11 @@ public class ModelListener implements Listener {
@EventHandler @EventHandler
public void onAnimationPlay(AnimationPlayEvent event) { public void onAnimationPlay(AnimationPlayEvent event) {
ModelEntity model = ModelEntity.ENTITIES.get(event.getModel().getModeledEntity().getBase().getEntityId()).get(event.getModel()); Map<ActiveModel, ModelEntity> map = ModelEntity.ENTITIES.get(event.getModel().getModeledEntity().getBase().getEntityId());
if (map == null) {
return;
}
ModelEntity model = map.get(event.getModel());
if (model != null) { if (model != null) {
EntityTask task = model.getTask(); EntityTask task = model.getTask();

View File

@@ -3,7 +3,6 @@ package re.imc.geysermodelengine.model;
import com.ticxo.modelengine.api.animation.BlueprintAnimation; import com.ticxo.modelengine.api.animation.BlueprintAnimation;
import com.ticxo.modelengine.api.entity.BaseEntity; import com.ticxo.modelengine.api.entity.BaseEntity;
import com.ticxo.modelengine.api.entity.BukkitEntity; import com.ticxo.modelengine.api.entity.BukkitEntity;
import com.ticxo.modelengine.api.entity.Hitbox;
import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.ActiveModel;
import com.ticxo.modelengine.api.model.ModeledEntity; import com.ticxo.modelengine.api.model.ModeledEntity;
import lombok.Getter; import lombok.Getter;
@@ -19,7 +18,6 @@ import org.geysermc.floodgate.api.FloodgateApi;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import re.imc.geysermodelengine.GeyserModelEngine; import re.imc.geysermodelengine.GeyserModelEngine;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@@ -33,6 +31,7 @@ public class EntityTask {
ModelEntity model; ModelEntity model;
int tick = 0; int tick = 0;
int syncTick = 0;
AtomicInteger animationCooldown = new AtomicInteger(0); AtomicInteger animationCooldown = new AtomicInteger(0);
AtomicInteger currentAnimationPriority = new AtomicInteger(0); AtomicInteger currentAnimationPriority = new AtomicInteger(0);
@@ -53,9 +52,23 @@ public class EntityTask {
} }
public void runSync() { public void runSync() {
syncTick ++;
if (syncTick > 400) {
syncTick = 0;
}
if (syncTick % 5 == 0) {
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
if (!FloodgateApi.getInstance().isFloodgatePlayer(onlinePlayer.getUniqueId())) {
onlinePlayer.hideEntity(GeyserModelEngine.getInstance(), model.getEntity());
}
}
}
if (model.getEntity().isDead()) { if (model.getEntity().isDead()) {
model.spawnEntity(); model.spawnEntity();
} }
model.getEntity().setVisualFire(false); model.getEntity().setVisualFire(false);
model.teleportToModel(); model.teleportToModel();
} }
@@ -95,9 +108,8 @@ public class EntityTask {
if (tick > 1 && tick % 5 == 0) { if (tick > 1 && tick % 5 == 0) {
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
if (!FloodgateApi.getInstance().isFloodgatePlayer(onlinePlayer.getUniqueId())) { if (FloodgateApi.getInstance().isFloodgatePlayer(onlinePlayer.getUniqueId())) {
onlinePlayer.hideEntity(GeyserModelEngine.getInstance(), entity);
} else {
if (canSee(onlinePlayer, model.getEntity())) { if (canSee(onlinePlayer, model.getEntity())) {
if (!viewers.contains(onlinePlayer)) { if (!viewers.contains(onlinePlayer)) {

View File

@@ -1,13 +1,17 @@
package re.imc.geysermodelengine.model; package re.imc.geysermodelengine.model;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.ticxo.modelengine.api.entity.BukkitEntity;
import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.ActiveModel;
import com.ticxo.modelengine.api.model.ModeledEntity; import com.ticxo.modelengine.api.model.ModeledEntity;
import lombok.Getter; import lombok.Getter;
import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.geysermc.floodgate.api.FloodgateApi;
import re.imc.geysermodelengine.GeyserModelEngine; import re.imc.geysermodelengine.GeyserModelEngine;
import java.util.HashMap; import java.util.HashMap;
@@ -24,6 +28,7 @@ public class ModelEntity {
public static Map<Integer, ModelEntity> MODEL_ENTITIES = new ConcurrentHashMap<>(); public static Map<Integer, ModelEntity> MODEL_ENTITIES = new ConcurrentHashMap<>();
private LivingEntity entity; private LivingEntity entity;
private BukkitEntity controllerEntity;
private final Set<Player> viewers = Sets.newConcurrentHashSet(); private final Set<Player> viewers = Sets.newConcurrentHashSet();
@@ -42,14 +47,28 @@ public class ModelEntity {
} }
public void teleportToModel() { public void teleportToModel() {
entity.teleportAsync(modeledEntity.getBase().getLocation()); Location location = modeledEntity.getBase().getLocation();
/*
location.setPitch(modeledEntity.getXHeadRot());
location.setYaw(modeledEntity.getYHeadRot());
for (Player viewer : viewers) {
viewer.sendActionBar("X:" + modeledEntity.getXHeadRot() + ", Y:" + modeledEntity.getYHeadRot());
}
*/
entity.teleportAsync(location);
if (modeledEntity.getBase() instanceof BukkitEntity bukkitEntity && bukkitEntity.getOriginal() instanceof LivingEntity livingEntity) {
controllerEntity.getLookController().setHeadYaw(livingEntity.getEyeLocation().getYaw());
controllerEntity.getLookController().setPitch(livingEntity.getEyeLocation().getPitch());
controllerEntity.getLookController().setBodyYaw(livingEntity.getBodyYaw());
}
} }
public static ModelEntity create(ModeledEntity entity, ActiveModel model) { public static ModelEntity create(ModeledEntity entity, ActiveModel model) {
ModelEntity modelEntity = new ModelEntity(entity, model); ModelEntity modelEntity = new ModelEntity(entity, model);
int id = entity.getBase().getEntityId(); int id = entity.getBase().getEntityId();
Map<ActiveModel, ModelEntity> map = ENTITIES.computeIfAbsent(id, k -> new HashMap<>()); Map<ActiveModel, ModelEntity> map = ENTITIES.computeIfAbsent(id, k -> new HashMap<>());
map.put(model, modelEntity); map.put(model, modelEntity);
ENTITIES.put(id, map);
return modelEntity; return modelEntity;
} }
@@ -60,6 +79,7 @@ public class ModelEntity {
ModelEntity model = this; ModelEntity model = this;
int id = entity.getEntityId(); int id = entity.getEntityId();
MODEL_ENTITIES.put(id, model); MODEL_ENTITIES.put(id, model);
controllerEntity = new BukkitEntity(entity);
return entity; return entity;
} }

View File

@@ -1,4 +1,4 @@
skin-send-delay: 0 skin-send-delay: 0
skin-view-distance: 50 skin-view-distance: 50
join-send-delay: 10 join-send-delay: 20
model-entity-type: BAT # must be a living entity model-entity-type: BAT # must be a living entity