add hologram offsets for all npc types & register equipment properties to npcs that support it

This commit is contained in:
Pyrbu 2023-05-25 13:51:58 +01:00
parent 1762bf595e
commit 80b75ebc0d
2 changed files with 272 additions and 98 deletions

@ -45,7 +45,6 @@ public class NpcTypeImpl implements NpcType {
private final String name; private final String name;
private final EntityType type; private final EntityType type;
private final List<EntityPropertyImpl<?>> allowedProperties = new ArrayList<>(); private final List<EntityPropertyImpl<?>> allowedProperties = new ArrayList<>();
private boolean globalProperties = true;
private double hologramOffset = 0; private double hologramOffset = 0;
Builder(EntityPropertyRegistryImpl propertyRegistry, String name, EntityType type) { Builder(EntityPropertyRegistryImpl propertyRegistry, String name, EntityType type) {
@ -54,9 +53,12 @@ public class NpcTypeImpl implements NpcType {
this.type = type; this.type = type;
} }
public Builder addProperties(EntityPropertyImpl<?>... properties) { public Builder addEquipmentProperties() {
allowedProperties.addAll(Arrays.asList(properties)); return addProperties("helmet", "chestplate", "leggings", "boots", "hand", "offhand");
return this; }
public Builder addHandProperties() {
return addProperties("hand", "offhand");
} }
public Builder addProperties(String... names) { public Builder addProperties(String... names) {
@ -64,25 +66,18 @@ public class NpcTypeImpl implements NpcType {
return this; return this;
} }
public Builder setEnableGlobalProperties(boolean enabled) {
globalProperties = enabled;
return this;
}
public Builder setHologramOffset(double hologramOffset) { public Builder setHologramOffset(double hologramOffset) {
this.hologramOffset = hologramOffset; this.hologramOffset = hologramOffset;
return this; return this;
} }
public NpcTypeImpl build() { public NpcTypeImpl build() {
if (globalProperties) { allowedProperties.add(propertyRegistry.getByName("fire"));
allowedProperties.add(propertyRegistry.getByName("fire")); allowedProperties.add(propertyRegistry.getByName("invisible"));
allowedProperties.add(propertyRegistry.getByName("invisible")); allowedProperties.add(propertyRegistry.getByName("silent"));
allowedProperties.add(propertyRegistry.getByName("silent")); allowedProperties.add(propertyRegistry.getByName("look"));
allowedProperties.add(propertyRegistry.getByName("look")); if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_9))
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_9)) allowedProperties.add(propertyRegistry.getByName("glow"));
allowedProperties.add(propertyRegistry.getByName("glow"));
}
return new NpcTypeImpl(name, type, hologramOffset, new HashSet<>(allowedProperties)); return new NpcTypeImpl(name, type, hologramOffset, new HashSet<>(allowedProperties));
} }
} }

@ -25,110 +25,289 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry {
return type; return type;
} }
public void registerDefault(PacketEventsAPI<Plugin> packetEvents, EntityPropertyRegistryImpl propertyRegistry) { private NpcTypeImpl.Builder builder(EntityPropertyRegistryImpl propertyRegistry, String name, EntityType type) {
return new NpcTypeImpl.Builder(propertyRegistry, name, type);
}
public void registerDefault(PacketEventsAPI<Plugin> packetEvents, EntityPropertyRegistryImpl p /* propertyRegistry */) {
ServerVersion version = packetEvents.getServerManager().getVersion(); ServerVersion version = packetEvents.getServerManager().getVersion();
register(new NpcTypeImpl.Builder(propertyRegistry, "player", EntityTypes.PLAYER).setHologramOffset(-0.15D) register(builder(p, "player", EntityTypes.PLAYER)
.addProperties("skin", "skin_layers", "helmet", "chestplate", "leggings", "boots", "hand", "offhand")); .setHologramOffset(-0.15D)
.addEquipmentProperties());
register(new NpcTypeImpl.Builder(propertyRegistry, "armor_stand", EntityTypes.ARMOR_STAND)); // Most hologram offsets generated using Entity#getHeight() in 1.19.4
register(new NpcTypeImpl.Builder(propertyRegistry, "bat", EntityTypes.BAT).setHologramOffset(-1.365));
register(new NpcTypeImpl.Builder(propertyRegistry, "blaze", EntityTypes.BLAZE)); register(builder(p, "armor_stand", EntityTypes.ARMOR_STAND)
register(new NpcTypeImpl.Builder(propertyRegistry, "cat", EntityTypes.CAT)); .setHologramOffset(-0.15).addEquipmentProperties());
register(new NpcTypeImpl.Builder(propertyRegistry, "cave_spider", EntityTypes.CAVE_SPIDER));
register(new NpcTypeImpl.Builder(propertyRegistry, "chicken", EntityTypes.CHICKEN)); register(builder(p, "bat", EntityTypes.BAT)
register(new NpcTypeImpl.Builder(propertyRegistry, "cow", EntityTypes.COW)); .setHologramOffset(-1.075));
register(new NpcTypeImpl.Builder(propertyRegistry, "creeper", EntityTypes.CREEPER).setHologramOffset(-0.3D));
register(new NpcTypeImpl.Builder(propertyRegistry, "donkey", EntityTypes.DONKEY)); register(builder(p, "blaze", EntityTypes.BLAZE)
register(new NpcTypeImpl.Builder(propertyRegistry, "elder_guardian", EntityTypes.ELDER_GUARDIAN)); .setHologramOffset(-0.175));
register(new NpcTypeImpl.Builder(propertyRegistry, "ender_dragon", EntityTypes.ENDER_DRAGON));
register(new NpcTypeImpl.Builder(propertyRegistry, "enderman", EntityTypes.ENDERMAN)); register(builder(p, "cat", EntityTypes.CAT)
register(new NpcTypeImpl.Builder(propertyRegistry, "endermite", EntityTypes.ENDERMITE)); .setHologramOffset(-1.275));
register(new NpcTypeImpl.Builder(propertyRegistry, "ghast", EntityTypes.GHAST));
register(new NpcTypeImpl.Builder(propertyRegistry, "giant", EntityTypes.GIANT)); register(builder(p, "cave_spider", EntityTypes.CAVE_SPIDER)
register(new NpcTypeImpl.Builder(propertyRegistry, "guardian", EntityTypes.GUARDIAN)); .setHologramOffset(-1.475));
register(new NpcTypeImpl.Builder(propertyRegistry, "horse", EntityTypes.HORSE));
register(new NpcTypeImpl.Builder(propertyRegistry, "iron_golem", EntityTypes.IRON_GOLEM)); register(builder(p, "chicken", EntityTypes.CHICKEN)
register(new NpcTypeImpl.Builder(propertyRegistry, "magma_cube", EntityTypes.MAGMA_CUBE)); .setHologramOffset(-1.275));
register(new NpcTypeImpl.Builder(propertyRegistry, "mooshroom", EntityTypes.MOOSHROOM));
register(new NpcTypeImpl.Builder(propertyRegistry, "mule", EntityTypes.MULE)); register(builder(p, "cow", EntityTypes.COW)
register(new NpcTypeImpl.Builder(propertyRegistry, "ocelot", EntityTypes.OCELOT)); .setHologramOffset(-0.575));
register(new NpcTypeImpl.Builder(propertyRegistry, "pig", EntityTypes.PIG));
register(new NpcTypeImpl.Builder(propertyRegistry, "rabbit", EntityTypes.RABBIT)); register(builder(p, "creeper", EntityTypes.CREEPER)
register(new NpcTypeImpl.Builder(propertyRegistry, "sheep", EntityTypes.SHEEP)); .setHologramOffset(-0.275));
register(new NpcTypeImpl.Builder(propertyRegistry, "silverfish", EntityTypes.SILVERFISH));
register(new NpcTypeImpl.Builder(propertyRegistry, "skeleton", EntityTypes.SKELETON)); register(builder(p, "donkey", EntityTypes.DONKEY)
register(new NpcTypeImpl.Builder(propertyRegistry, "skeleton_horse", EntityTypes.SKELETON_HORSE)); .setHologramOffset(-0.475));
register(new NpcTypeImpl.Builder(propertyRegistry, "slime", EntityTypes.SLIME));
register(new NpcTypeImpl.Builder(propertyRegistry, "snow_golem", EntityTypes.SNOW_GOLEM)); register(builder(p, "elder_guardian", EntityTypes.ELDER_GUARDIAN)
register(new NpcTypeImpl.Builder(propertyRegistry, "spider", EntityTypes.SPIDER)); .setHologramOffset(0.0225));
register(new NpcTypeImpl.Builder(propertyRegistry, "squid", EntityTypes.SQUID));
register(new NpcTypeImpl.Builder(propertyRegistry, "villager", EntityTypes.VILLAGER)); register(builder(p, "ender_dragon", EntityTypes.ENDER_DRAGON)
register(new NpcTypeImpl.Builder(propertyRegistry, "witch", EntityTypes.WITCH)); .setHologramOffset(6.0245));
register(new NpcTypeImpl.Builder(propertyRegistry, "wither", EntityTypes.WITHER));
register(new NpcTypeImpl.Builder(propertyRegistry, "wither_skeleton", EntityTypes.WITHER_SKELETON)); register(builder(p, "enderman", EntityTypes.ENDERMAN)
register(new NpcTypeImpl.Builder(propertyRegistry, "wolf", EntityTypes.WOLF)); .setHologramOffset(0.925));
register(new NpcTypeImpl.Builder(propertyRegistry, "zombie", EntityTypes.ZOMBIE));
register(new NpcTypeImpl.Builder(propertyRegistry, "zombie_horse", EntityTypes.ZOMBIE_HORSE)); register(builder(p, "endermite", EntityTypes.ENDERMITE)
register(new NpcTypeImpl.Builder(propertyRegistry, "zombie_villager", EntityTypes.ZOMBIE_VILLAGER)); .setHologramOffset(-1.675));
register(builder(p, "ghast", EntityTypes.GHAST)
.setHologramOffset(2.025));
register(builder(p, "giant", EntityTypes.GIANT)
.setHologramOffset(10.025)
.addEquipmentProperties());
register(builder(p, "guardian", EntityTypes.GUARDIAN)
.setHologramOffset(-1.125));
register(builder(p, "horse", EntityTypes.HORSE)
.setHologramOffset(-0.375));
register(builder(p, "iron_golem", EntityTypes.IRON_GOLEM)
.setHologramOffset(0.725));
register(builder(p, "magma_cube", EntityTypes.MAGMA_CUBE)); // TODO: Hologram offset scaling with size property
register(builder(p, "mooshroom", EntityTypes.MOOSHROOM)
.setHologramOffset(-0.575));
register(builder(p, "mule", EntityTypes.MULE)
.setHologramOffset(-0.375));
register(builder(p, "ocelot", EntityTypes.OCELOT)
.setHologramOffset(-1.275));
register(builder(p, "pig", EntityTypes.PIG)
.setHologramOffset(-1.075));
register(builder(p, "rabbit", EntityTypes.RABBIT)
.setHologramOffset(-1.475));
register(builder(p, "sheep", EntityTypes.SHEEP)
.setHologramOffset(-0.675));
register(builder(p, "silverfish", EntityTypes.SILVERFISH)
.setHologramOffset(-1.675));
register(builder(p, "skeleton", EntityTypes.SKELETON)
.setHologramOffset(0.015)
.addEquipmentProperties());
register(builder(p, "skeleton_horse", EntityTypes.SKELETON_HORSE)
.setHologramOffset(-0.375));
register(builder(p, "slime", EntityTypes.SLIME)); // TODO: Hologram offset scaling with size property
register(builder(p, "snow_golem", EntityTypes.SNOW_GOLEM)
.setHologramOffset(-0.075));
register(builder(p, "spider", EntityTypes.SPIDER)
.setHologramOffset(-1.075));
register(builder(p, "squid", EntityTypes.SQUID)
.setHologramOffset(-1.175));
register(builder(p, "villager", EntityTypes.VILLAGER)
.setHologramOffset(-0.025)
.addProperties("hand"));
register(builder(p, "witch", EntityTypes.WITCH)
.setHologramOffset(-0.025)
.addProperties("hand"));
register(builder(p, "wither", EntityTypes.WITHER)
.setHologramOffset(1.525));
register(builder(p, "wither_skeleton", EntityTypes.WITHER_SKELETON)
.setHologramOffset(0.425)
.addEquipmentProperties());
register(builder(p, "wolf", EntityTypes.WOLF)
.setHologramOffset(-1.125));
register(builder(p, "zombie", EntityTypes.ZOMBIE)
.setHologramOffset(-0.025)
.addEquipmentProperties());
register(builder(p, "zombie_horse", EntityTypes.ZOMBIE_HORSE)
.setHologramOffset(-0.375));
register(builder(p, "zombie_villager", EntityTypes.ZOMBIE_VILLAGER)
.setHologramOffset(-1.0)
.addEquipmentProperties());
if (!version.isNewerThanOrEquals(ServerVersion.V_1_9)) return; if (!version.isNewerThanOrEquals(ServerVersion.V_1_9)) return;
register(new NpcTypeImpl.Builder(propertyRegistry, "shulker", EntityTypes.SHULKER));
register(builder(p, "shulker", EntityTypes.SHULKER)
.setHologramOffset(-0.975));
if (!version.isNewerThanOrEquals(ServerVersion.V_1_10)) return; if (!version.isNewerThanOrEquals(ServerVersion.V_1_10)) return;
register(new NpcTypeImpl.Builder(propertyRegistry, "husk", EntityTypes.HUSK));
register(new NpcTypeImpl.Builder(propertyRegistry, "polar_bear", EntityTypes.POLAR_BEAR)); register(builder(p, "husk", EntityTypes.HUSK)
register(new NpcTypeImpl.Builder(propertyRegistry, "stray", EntityTypes.STRAY)); .setHologramOffset(-0.025)
.addEquipmentProperties());
register(builder(p, "polar_bear", EntityTypes.POLAR_BEAR)
.setHologramOffset(-0.575));
register(builder(p, "stray", EntityTypes.STRAY)
.setHologramOffset(0.015)
.addEquipmentProperties());
if (!version.isNewerThanOrEquals(ServerVersion.V_1_11)) return; if (!version.isNewerThanOrEquals(ServerVersion.V_1_11)) return;
register(new NpcTypeImpl.Builder(propertyRegistry, "evoker", EntityTypes.EVOKER));
register(new NpcTypeImpl.Builder(propertyRegistry, "llama", EntityTypes.LLAMA)); register(builder(p, "evoker", EntityTypes.EVOKER)
register(new NpcTypeImpl.Builder(propertyRegistry, "vex", EntityTypes.VEX)); .setHologramOffset(-0.025));
register(new NpcTypeImpl.Builder(propertyRegistry, "vindicator", EntityTypes.VINDICATOR));
register(builder(p, "llama", EntityTypes.LLAMA)
.setHologramOffset(-0.105));
register(builder(p, "vex", EntityTypes.VEX)
.setHologramOffset(-1.175)
.addHandProperties());
register(builder(p, "vindicator", EntityTypes.VINDICATOR)
.setHologramOffset(-0.025));
if (!version.isNewerThanOrEquals(ServerVersion.V_1_12)) return; if (!version.isNewerThanOrEquals(ServerVersion.V_1_12)) return;
register(new NpcTypeImpl.Builder(propertyRegistry, "illusioner", EntityTypes.ILLUSIONER));
register(new NpcTypeImpl.Builder(propertyRegistry, "parrot", EntityTypes.PARROT)); register(builder(p, "illusioner", EntityTypes.ILLUSIONER)
.setHologramOffset(-0.025));
register(builder(p, "parrot", EntityTypes.PARROT)
.setHologramOffset(-1.075));
if (!version.isNewerThanOrEquals(ServerVersion.V_1_13)) return; if (!version.isNewerThanOrEquals(ServerVersion.V_1_13)) return;
register(new NpcTypeImpl.Builder(propertyRegistry, "cod", EntityTypes.COD));
register(new NpcTypeImpl.Builder(propertyRegistry, "dolphin", EntityTypes.DOLPHIN)); register(builder(p, "cod", EntityTypes.COD)
register(new NpcTypeImpl.Builder(propertyRegistry, "drowned", EntityTypes.DROWNED)); .setHologramOffset(-1.675));
register(new NpcTypeImpl.Builder(propertyRegistry, "phantom", EntityTypes.PHANTOM));
register(new NpcTypeImpl.Builder(propertyRegistry, "pufferfish", EntityTypes.PUFFERFISH)); register(builder(p, "dolphin", EntityTypes.DOLPHIN)
register(new NpcTypeImpl.Builder(propertyRegistry, "salmon", EntityTypes.SALMON)); .setHologramOffset(-1.375)
register(new NpcTypeImpl.Builder(propertyRegistry, "tropical_fish", EntityTypes.TROPICAL_FISH)); .addProperties("hand"));
register(new NpcTypeImpl.Builder(propertyRegistry, "turtle", EntityTypes.TURTLE));
register(builder(p, "drowned", EntityTypes.DROWNED)
.setHologramOffset(-0.025)
.addEquipmentProperties());
register(builder(p, "phantom", EntityTypes.PHANTOM)
.setHologramOffset(-1.475));
register(builder(p, "pufferfish", EntityTypes.PUFFERFISH)
.setHologramOffset(-1.625));
register(builder(p, "salmon", EntityTypes.SALMON)
.setHologramOffset(-1.575));
register(builder(p, "tropical_fish", EntityTypes.TROPICAL_FISH)
.setHologramOffset(-1.575));
register(builder(p, "turtle", EntityTypes.TURTLE)
.setHologramOffset(-1.575));
if (!version.isNewerThanOrEquals(ServerVersion.V_1_14)) return; if (!version.isNewerThanOrEquals(ServerVersion.V_1_14)) return;
register(new NpcTypeImpl.Builder(propertyRegistry, "fox", EntityTypes.FOX));
register(new NpcTypeImpl.Builder(propertyRegistry, "panda", EntityTypes.PANDA)); register(builder(p, "fox", EntityTypes.FOX)
register(new NpcTypeImpl.Builder(propertyRegistry, "pillager", EntityTypes.PILLAGER)); .setHologramOffset(-1.275)
register(new NpcTypeImpl.Builder(propertyRegistry, "ravager", EntityTypes.RAVAGER)); .addProperties("hand"));
register(new NpcTypeImpl.Builder(propertyRegistry, "trader_llama", EntityTypes.TRADER_LLAMA));
register(new NpcTypeImpl.Builder(propertyRegistry, "wandering_trader", EntityTypes.WANDERING_TRADER)); register(builder(p, "panda", EntityTypes.PANDA)
.setHologramOffset(-0.725));
register(builder(p, "pillager", EntityTypes.PILLAGER)
.setHologramOffset(-0.025)
.addHandProperties());
register(builder(p, "ravager", EntityTypes.RAVAGER)
.setHologramOffset(0.225));
register(builder(p, "trader_llama", EntityTypes.TRADER_LLAMA)
.setHologramOffset(-0.105));
register(builder(p, "wandering_trader", EntityTypes.WANDERING_TRADER)
.setHologramOffset(-0.025)
.addProperties("hand"));
if (!version.isNewerThanOrEquals(ServerVersion.V_1_15)) return; if (!version.isNewerThanOrEquals(ServerVersion.V_1_15)) return;
register(new NpcTypeImpl.Builder(propertyRegistry, "bee", EntityTypes.BEE));
register(builder(p, "bee", EntityTypes.BEE)
.setHologramOffset(-1.375));
if (!version.isNewerThanOrEquals(ServerVersion.V_1_16)) return; if (!version.isNewerThanOrEquals(ServerVersion.V_1_16)) return;
register(new NpcTypeImpl.Builder(propertyRegistry, "hoglin", EntityTypes.HOGLIN));
register(new NpcTypeImpl.Builder(propertyRegistry, "piglin", EntityTypes.PIGLIN)); register(builder(p, "hoglin", EntityTypes.HOGLIN)
register(new NpcTypeImpl.Builder(propertyRegistry, "piglin_brute", EntityTypes.PIGLIN_BRUTE)); .setHologramOffset(-0.575));
register(new NpcTypeImpl.Builder(propertyRegistry, "strider", EntityTypes.STRIDER));
register(new NpcTypeImpl.Builder(propertyRegistry, "zoglin", EntityTypes.ZOGLIN)); register(builder(p, "piglin", EntityTypes.PIGLIN)
register(new NpcTypeImpl.Builder(propertyRegistry, "zombified_piglin", EntityTypes.ZOMBIFIED_PIGLIN)); .setHologramOffset(-1.0)
.addEquipmentProperties());
register(builder(p, "piglin_brute", EntityTypes.PIGLIN_BRUTE)
.setHologramOffset(-0.025)
.addEquipmentProperties());
register(builder(p, "strider", EntityTypes.STRIDER)
.setHologramOffset(-0.275));
register(builder(p, "zoglin", EntityTypes.ZOGLIN)
.setHologramOffset(-0.575));
register(builder(p, "zombified_piglin", EntityTypes.ZOMBIFIED_PIGLIN)
.setHologramOffset(-0.025)
.addEquipmentProperties());
if (!version.isNewerThanOrEquals(ServerVersion.V_1_17)) return; if (!version.isNewerThanOrEquals(ServerVersion.V_1_17)) return;
register(new NpcTypeImpl.Builder(propertyRegistry, "axolotl", EntityTypes.AXOLOTL));
register(new NpcTypeImpl.Builder(propertyRegistry, "glow_squid", EntityTypes.GLOW_SQUID)); register(builder(p, "axolotl", EntityTypes.AXOLOTL)
register(new NpcTypeImpl.Builder(propertyRegistry, "goat", EntityTypes.GOAT)); .setHologramOffset(-1.555));
register(builder(p, "glow_squid", EntityTypes.GLOW_SQUID)
.setHologramOffset(-1.175));
register(builder(p, "goat", EntityTypes.GOAT)
.setHologramOffset(-0.675));
if (!version.isNewerThanOrEquals(ServerVersion.V_1_19)) return; if (!version.isNewerThanOrEquals(ServerVersion.V_1_19)) return;
register(new NpcTypeImpl.Builder(propertyRegistry, "allay", EntityTypes.ALLAY));
register(new NpcTypeImpl.Builder(propertyRegistry, "frog", EntityTypes.FROG)); register(builder(p, "allay", EntityTypes.ALLAY)
register(new NpcTypeImpl.Builder(propertyRegistry, "tadpole", EntityTypes.TADPOLE)); .setHologramOffset(-1.375)
register(new NpcTypeImpl.Builder(propertyRegistry, "warden", EntityTypes.WARDEN)); .addHandProperties());
register(builder(p, "frog", EntityTypes.FROG)
.setHologramOffset(-1.475));
register(builder(p, "tadpole", EntityTypes.TADPOLE)
.setHologramOffset(-1.675));
register(builder(p, "warden", EntityTypes.WARDEN)
.setHologramOffset(0.925));
} }
public Collection<NpcTypeImpl> getAll() { public Collection<NpcTypeImpl> getAll() {