make glow work for all entities + better 1.8 support

This commit is contained in:
Pyrbu 2023-04-24 23:58:12 +01:00
parent 7ee4be8009
commit 7fade89b8d
9 changed files with 62 additions and 15 deletions

@ -141,10 +141,10 @@ public class ZNPCsPlus extends JavaPlugin {
for (NPCType type : NPCType.values()) { for (NPCType type : NPCType.values()) {
NPC npc = new NPC(world, type, new PacketLocation(x * 3, 200, z * 3, 0, 0)); NPC npc = new NPC(world, type, new PacketLocation(x * 3, 200, z * 3, 0, 0));
if (type.getType() == EntityTypes.PLAYER) { if (type.getType() == EntityTypes.PLAYER) {
npc.setProperty(NPCProperty.GLOW, NamedTextColor.RED);
npc.setProperty(NPCProperty.FIRE, true);
NPCSkin.forName("Notch", (skin, ex) -> npc.setProperty(NPCProperty.SKIN, skin)); NPCSkin.forName("Notch", (skin, ex) -> npc.setProperty(NPCProperty.SKIN, skin));
} }
npc.setProperty(NPCProperty.GLOW, NamedTextColor.RED);
npc.setProperty(NPCProperty.FIRE, true);
NPCRegistry.register("debug_npc" + (z * wrap + x), npc); NPCRegistry.register("debug_npc" + (z * wrap + x), npc);
if (x++ > wrap) { if (x++ > wrap) {
x = 0; x = 0;

@ -11,7 +11,7 @@ public class V1_8Factory implements MetadataFactory {
@Override @Override
public EntityData effects(boolean onFire, boolean glowing) { public EntityData effects(boolean onFire, boolean glowing) {
return new EntityData(0, EntityDataTypes.BYTE, (byte) ((onFire ? 0x01 : 0) | (glowing ? 0x40 : 0))); return new EntityData(0, EntityDataTypes.BYTE, onFire ? 0x01 : 0);
} }
protected EntityData createSkinLayers(int index) { protected EntityData createSkinLayers(int index) {

@ -1,10 +1,16 @@
package lol.pyr.znpcsplus.metadata; package lol.pyr.znpcsplus.metadata;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
public class V1_9Factory extends V1_8Factory { public class V1_9Factory extends V1_8Factory {
@Override @Override
public EntityData skinLayers() { public EntityData skinLayers() {
return createSkinLayers(13); return createSkinLayers(13);
} }
@Override
public EntityData effects(boolean onFire, boolean glowing) {
return new EntityData(0, EntityDataTypes.BYTE, (byte) ((onFire ? 0x01 : 0) | (glowing ? 0x40 : 0)));
}
} }

@ -20,7 +20,7 @@ public class NPCProperty<T> {
BY_NAME.put(this.name, this); BY_NAME.put(this.name, this);
} }
public String getName() { public String name() {
return name; return name;
} }

@ -33,10 +33,10 @@ public class NPCType {
static { static {
ImmutableList.Builder<NPCType> builder = new ImmutableList.Builder<>(); ImmutableList.Builder<NPCType> builder = new ImmutableList.Builder<>();
builder.add(new NPCType(EntityTypes.PLAYER, NPCProperty.SKIN)); builder.add(new NPCType(EntityTypes.PLAYER, NPCProperty.GLOW, NPCProperty.FIRE, NPCProperty.SKIN, NPCProperty.SKIN_LAYERS));
builder.add(new NPCType(EntityTypes.CREEPER)); builder.add(new NPCType(EntityTypes.CREEPER, NPCProperty.GLOW, NPCProperty.FIRE));
builder.add(new NPCType(EntityTypes.ZOMBIE)); builder.add(new NPCType(EntityTypes.ZOMBIE, NPCProperty.GLOW, NPCProperty.FIRE));
builder.add(new NPCType(EntityTypes.SKELETON)); builder.add(new NPCType(EntityTypes.SKELETON, NPCProperty.GLOW, NPCProperty.FIRE));
npcTypes = builder.build(); npcTypes = builder.build();
} }

@ -19,6 +19,7 @@ public interface PacketFactory {
void removeTabPlayer(Player player, PacketEntity entity); void removeTabPlayer(Player player, PacketEntity entity);
void createTeam(Player player, PacketEntity entity); void createTeam(Player player, PacketEntity entity);
void removeTeam(Player player, PacketEntity entity); void removeTeam(Player player, PacketEntity entity);
void sendAllMetadata(Player player, PacketEntity entity);
void sendMetadata(Player player, PacketEntity entity, EntityData... data); void sendMetadata(Player player, PacketEntity entity, EntityData... data);
PacketFactory factory = get(); PacketFactory factory = get();
@ -39,6 +40,7 @@ public interface PacketFactory {
private static Map<ServerVersion, LazyLoader<? extends PacketFactory>> buildFactoryMap() { private static Map<ServerVersion, LazyLoader<? extends PacketFactory>> buildFactoryMap() {
HashMap<ServerVersion, LazyLoader<? extends PacketFactory>> map = new HashMap<>(); HashMap<ServerVersion, LazyLoader<? extends PacketFactory>> map = new HashMap<>();
map.put(ServerVersion.V_1_8, LazyLoader.of(V1_8Factory::new)); map.put(ServerVersion.V_1_8, LazyLoader.of(V1_8Factory::new));
map.put(ServerVersion.V_1_9, LazyLoader.of(V1_9Factory::new));
map.put(ServerVersion.V_1_14, LazyLoader.of(V1_14Factory::new)); map.put(ServerVersion.V_1_14, LazyLoader.of(V1_14Factory::new));
map.put(ServerVersion.V_1_19, LazyLoader.of(V1_19Factory::new)); map.put(ServerVersion.V_1_19, LazyLoader.of(V1_19Factory::new));
return map; return map;

@ -3,15 +3,18 @@ package lol.pyr.znpcsplus.packets;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity;
import lol.pyr.znpcsplus.entity.PacketEntity; import lol.pyr.znpcsplus.entity.PacketEntity;
import lol.pyr.znpcsplus.entity.PacketLocation; import lol.pyr.znpcsplus.entity.PacketLocation;
import lol.pyr.znpcsplus.npc.NPCProperty;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.Optional; import java.util.Optional;
public class V1_14Factory extends V1_8Factory { public class V1_14Factory extends V1_9Factory {
@Override @Override
public void spawnEntity(Player player, PacketEntity entity) { public void spawnEntity(Player player, PacketEntity entity) {
PacketLocation location = entity.getLocation(); PacketLocation location = entity.getLocation();
sendPacket(player, new WrapperPlayServerSpawnEntity(entity.getEntityId(), Optional.of(entity.getUuid()), entity.getType(), sendPacket(player, new WrapperPlayServerSpawnEntity(entity.getEntityId(), Optional.of(entity.getUuid()), entity.getType(),
location.toVector3d(), location.getPitch(), location.getYaw(), location.getYaw(), 0, Optional.empty())); location.toVector3d(), location.getPitch(), location.getYaw(), location.getYaw(), 0, Optional.empty()));
if (entity.getOwner().hasProperty(NPCProperty.GLOW)) createTeam(player, entity);
sendAllMetadata(player, entity);
} }
} }

@ -28,16 +28,12 @@ import java.util.Optional;
public class V1_8Factory implements PacketFactory { public class V1_8Factory implements PacketFactory {
@Override @Override
public void spawnPlayer(Player player, PacketEntity entity) { public void spawnPlayer(Player player, PacketEntity entity) {
NPC owner = entity.getOwner();
addTabPlayer(player, entity); addTabPlayer(player, entity);
createTeam(player, entity); createTeam(player, entity);
PacketLocation location = entity.getLocation(); PacketLocation location = entity.getLocation();
sendPacket(player, new WrapperPlayServerSpawnPlayer(entity.getEntityId(), sendPacket(player, new WrapperPlayServerSpawnPlayer(entity.getEntityId(),
entity.getUuid(), location.toVector3d(), location.getYaw(), location.getPitch(), List.of())); entity.getUuid(), location.toVector3d(), location.getYaw(), location.getPitch(), List.of()));
if (owner.getProperty(NPCProperty.SKIN_LAYERS)) sendMetadata(player, entity, MetadataFactory.get().skinLayers()); sendAllMetadata(player, entity);
boolean glow = owner.hasProperty(NPCProperty.GLOW);
boolean fire = owner.getProperty(NPCProperty.FIRE);
if (glow || fire) sendMetadata(player, entity, MetadataFactory.get().effects(fire, glow));
ZNPCsPlus.SCHEDULER.scheduleSyncDelayedTask(() -> removeTabPlayer(player, entity), 60); ZNPCsPlus.SCHEDULER.scheduleSyncDelayedTask(() -> removeTabPlayer(player, entity), 60);
} }
@ -51,6 +47,7 @@ public class V1_8Factory implements PacketFactory {
location.getYaw(), location.getPitch(), location.getPitch(), new Vector3d(), List.of()) : location.getYaw(), location.getPitch(), location.getPitch(), new Vector3d(), List.of()) :
new WrapperPlayServerSpawnEntity(entity.getEntityId(), Optional.of(entity.getUuid()), entity.getType(), location.toVector3d(), new WrapperPlayServerSpawnEntity(entity.getEntityId(), Optional.of(entity.getUuid()), entity.getType(), location.toVector3d(),
location.getPitch(), location.getYaw(), location.getYaw(), 0, Optional.empty())); location.getPitch(), location.getYaw(), location.getYaw(), 0, Optional.empty()));
sendAllMetadata(player, entity);
} }
@Override @Override
@ -92,7 +89,8 @@ public class V1_8Factory implements PacketFactory {
owner.hasProperty(NPCProperty.GLOW) ? owner.getProperty(NPCProperty.GLOW) : NamedTextColor.WHITE, owner.hasProperty(NPCProperty.GLOW) ? owner.getProperty(NPCProperty.GLOW) : NamedTextColor.WHITE,
WrapperPlayServerTeams.OptionData.NONE WrapperPlayServerTeams.OptionData.NONE
))); )));
sendPacket(player, new WrapperPlayServerTeams("npc_team_" + entity.getEntityId(), WrapperPlayServerTeams.TeamMode.ADD_ENTITIES, (WrapperPlayServerTeams.ScoreBoardTeamInfo) null, Integer.toString(entity.getEntityId()))); sendPacket(player, new WrapperPlayServerTeams("npc_team_" + entity.getEntityId(), WrapperPlayServerTeams.TeamMode.ADD_ENTITIES, (WrapperPlayServerTeams.ScoreBoardTeamInfo) null,
entity.getType() == EntityTypes.PLAYER ? Integer.toString(entity.getEntityId()) : entity.getUuid().toString()));
} }
@Override @Override
@ -100,6 +98,13 @@ public class V1_8Factory implements PacketFactory {
sendPacket(player, new WrapperPlayServerTeams("npc_team_" + entity.getEntityId(), WrapperPlayServerTeams.TeamMode.REMOVE, (WrapperPlayServerTeams.ScoreBoardTeamInfo) null)); sendPacket(player, new WrapperPlayServerTeams("npc_team_" + entity.getEntityId(), WrapperPlayServerTeams.TeamMode.REMOVE, (WrapperPlayServerTeams.ScoreBoardTeamInfo) null));
} }
@Override
public void sendAllMetadata(Player player, PacketEntity entity) {
NPC owner = entity.getOwner();
if (entity.getType() == EntityTypes.PLAYER && owner.getProperty(NPCProperty.SKIN_LAYERS)) sendMetadata(player, entity, MetadataFactory.get().skinLayers());
if (owner.getProperty(NPCProperty.FIRE)) sendMetadata(player, entity, MetadataFactory.get().effects(true, false));
}
@Override @Override
public void sendMetadata(Player player, PacketEntity entity, EntityData... data) { public void sendMetadata(Player player, PacketEntity entity, EntityData... data) {
PacketEvents.getAPI().getPlayerManager().sendPacket(player, new WrapperPlayServerEntityMetadata(entity.getEntityId(), List.of(data))); PacketEvents.getAPI().getPlayerManager().sendPacket(player, new WrapperPlayServerEntityMetadata(entity.getEntityId(), List.of(data)));

@ -0,0 +1,31 @@
package lol.pyr.znpcsplus.packets;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import lol.pyr.znpcsplus.entity.PacketEntity;
import lol.pyr.znpcsplus.metadata.MetadataFactory;
import lol.pyr.znpcsplus.npc.NPC;
import lol.pyr.znpcsplus.npc.NPCProperty;
import org.bukkit.entity.Player;
public class V1_9Factory extends V1_8Factory {
@Override
public void sendAllMetadata(Player player, PacketEntity entity) {
NPC owner = entity.getOwner();
if (entity.getType() == EntityTypes.PLAYER && owner.getProperty(NPCProperty.SKIN_LAYERS)) sendMetadata(player, entity, MetadataFactory.get().skinLayers());
boolean glow = owner.hasProperty(NPCProperty.GLOW);
boolean fire = owner.getProperty(NPCProperty.FIRE);
if (glow || fire) sendMetadata(player, entity, MetadataFactory.get().effects(fire, glow));
}
@Override
public void spawnEntity(Player player, PacketEntity entity) {
super.spawnEntity(player, entity);
if (entity.getOwner().hasProperty(NPCProperty.GLOW)) createTeam(player, entity);
}
@Override
public void destroyEntity(Player player, PacketEntity entity) {
super.destroyEntity(player, entity);
if (entity.getType() != EntityTypes.PLAYER && entity.getOwner().hasProperty(NPCProperty.GLOW)) removeTeam(player, entity);
}
}