mirror of
https://github.com/GeyserExtensionists/GeyserModelEngine.git
synced 2025-12-19 23:19:19 +00:00
uhhh
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user