custom entity

This commit is contained in:
zimzaza4
2024-04-14 19:37:25 +08:00
parent 3e2c9026fc
commit 2a263f60d5
5 changed files with 70 additions and 21 deletions

View File

@@ -112,7 +112,7 @@
<dependency>
<groupId>me.zimzaza4</groupId>
<artifactId>geyserutils-spigot</artifactId>
<version>1.0.1</version>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/geyserutils-spigot-1.0-SNAPSHOT.jar</systemPath>
</dependency>

View File

@@ -1,13 +1,16 @@
package re.imc.geysermodelengine.listener;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.*;
import com.comphenix.protocol.reflect.StructureModifier;
import com.ticxo.modelengine.api.entity.BukkitEntity;
import org.bukkit.Bukkit;
import org.bukkit.entity.Entity;
import org.geysermc.floodgate.api.FloodgateApi;
import org.jetbrains.annotations.NotNull;
import re.imc.geysermodelengine.GeyserModelEngine;
import re.imc.geysermodelengine.model.EntityTask;
import re.imc.geysermodelengine.model.ModelEntity;
import java.util.Set;
@@ -29,11 +32,22 @@ public class AddEntityPacketListener extends PacketAdapter {
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());
if (packet.getMeta("delayed").isPresent()) {
return;
}
EntityTask task = model.getTask();
if (task == null) {
Bukkit.getScheduler().runTaskLater(GeyserModelEngine.getInstance(), () -> {
model.getTask().sendEntityData(event.getPlayer(), GeyserModelEngine.getInstance().getSkinSendDelay());
}, 1);
} else {
task.sendEntityData(event.getPlayer(), GeyserModelEngine.getInstance().getSkinSendDelay());
}
event.setCancelled(true);
Bukkit.getScheduler().runTaskLater(GeyserModelEngine.getInstance(), () -> {
packet.setMeta("delayed", 1);
ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet);
}, 2);
} else {
event.setCancelled(true);
}

View File

@@ -59,6 +59,7 @@ public class EntityTask {
}
if (syncTick % 5 == 0) {
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
if (!FloodgateApi.getInstance().isFloodgatePlayer(onlinePlayer.getUniqueId())) {
onlinePlayer.hideEntity(GeyserModelEngine.getInstance(), model.getEntity());
@@ -78,16 +79,24 @@ public class EntityTask {
ActiveModel activeModel = model.getActiveModel();
ModeledEntity modeledEntity = model.getModeledEntity();
if (modeledEntity.isDestroyed() || !modeledEntity.getBase().isAlive()) {
if (!modeledEntity.isDestroyed() && !modeledEntity.getBase().isAlive()) {
String animation = hasAnimation("death") ? "death" : "idle";
new BukkitRunnable() {
@Override
public void run() {
entity.remove();
}
}.runTaskLater(GeyserModelEngine.getInstance(), Math.max(playAnimation(animation, 99) - 1, 0));
if (!modeledEntity.getBase().isAlive()) {
if (!modeledEntity.isDestroyed()) {
String animation = hasAnimation("death") ? "death" : "idle";
new BukkitRunnable() {
@Override
public void run() {
entity.remove();
}
}.runTaskLater(GeyserModelEngine.getInstance(), Math.min(Math.max(playAnimation(animation, 99) - 1, 0), 200));
} else {
new BukkitRunnable() {
@Override
public void run() {
entity.remove();
}
}.runTask(GeyserModelEngine.getInstance());
}
}
ENTITIES.remove(modeledEntity.getBase().getEntityId());
MODEL_ENTITIES.remove(entity.getEntityId());
@@ -190,8 +199,11 @@ public class EntityTask {
}
public void sendEntityData(Player player, int delay) {
GeyserModelEngine.getInstance().getLogger()
.info("SEND ENTITY");
PlayerUtils.setCustomEntity(player, model.getEntity().getEntityId(), "modelengine:" + model.getActiveModel().getBlueprint().getName());
Bukkit.getScheduler().runTaskLaterAsynchronously(GeyserModelEngine.getInstance(), () -> {
PlayerUtils.sendCustomSkin(player, model.getEntity(), model.getActiveModel().getBlueprint().getName());
// PlayerUtils.sendCustomSkin(player, model.getEntity(), model.getActiveModel().getBlueprint().getName());
playBedrockAnimation("animation." + model.getActiveModel().getBlueprint().getName() + "." + lastAnimation, looping);
sendHitBox(player);
Bukkit.getScheduler().runTaskLaterAsynchronously(GeyserModelEngine.getInstance(), () -> {
@@ -363,6 +375,8 @@ public class EntityTask {
}
public void run(GeyserModelEngine instance, int i) {
sendHitBoxToAll();
syncTask = new BukkitRunnable() {
@Override
public void run() {

View File

@@ -6,9 +6,16 @@ import com.ticxo.modelengine.api.model.ActiveModel;
import com.ticxo.modelengine.api.model.ModeledEntity;
import lombok.Getter;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.disguisetypes.MiscDisguise;
import me.libraryaddict.disguise.disguisetypes.MobDisguise;
import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.zimzaza4.geyserutils.spigot.api.PlayerUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.geysermc.floodgate.api.FloodgateApi;
@@ -74,11 +81,23 @@ public class ModelEntity {
}
public LivingEntity spawnEntity() {
entity = (LivingEntity) modeledEntity.getBase().getLocation().getWorld().spawnEntity(modeledEntity.getBase().getLocation(), GeyserModelEngine.getInstance().getModelEntityType());
applyFeatures(entity, "model." + activeModel.getBlueprint().getName());
ModelEntity model = this;
int lastEntityId = ReflectionManager.getNewEntityId();
// System.out.println("RID:" + entityId);
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
if (FloodgateApi.getInstance().isFloodgatePlayer(onlinePlayer.getUniqueId())) {
PlayerUtils.setCustomEntity(onlinePlayer, lastEntityId + 1, "modelengine:" + model.getActiveModel().getBlueprint().getName());
}
}
entity = (LivingEntity) modeledEntity.getBase().getLocation().getWorld().spawnEntity(modeledEntity.getBase().getLocation(), GeyserModelEngine.getInstance().getModelEntityType());
int id = entity.getEntityId();
MODEL_ENTITIES.put(id, model);
applyFeatures(entity, "model." + activeModel.getBlueprint().getName());
controllerEntity = new BukkitEntity(entity);
return entity;
}
@@ -102,15 +121,17 @@ public class ModelEntity {
display.setPersistent(false);
// armorStand.setVisible(false);
/*
String uuid = UUID.randomUUID().toString();
PlayerDisguise disguise = new PlayerDisguise(name + "_" + uuid);
MobDisguise disguise = new MobDisguise(DisguiseType.getType(entity.getType()));
disguise.setDisguiseName(uuid);
DisguiseAPI.disguiseEntity(display, disguise.setNameVisible(false));
DisguiseAPI.disguiseEntity(display, disguise);
*/
}
}