1
0
mirror of https://github.com/GeyserMC/Geyser.git synced 2026-01-04 15:31:36 +00:00

Add EntityDefinition#is

This commit is contained in:
Eclipse
2025-10-27 10:27:22 +00:00
committed by onebeastchris
parent 7fe8992ceb
commit e398c545f9
7 changed files with 73 additions and 62 deletions

View File

@@ -38,6 +38,7 @@ import org.geysermc.geyser.entity.type.Entity;
import org.geysermc.geyser.translator.entity.EntityMetadataTranslator;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.EntityMetadata;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.MetadataType;
import org.geysermc.mcprotocollib.protocol.data.game.entity.type.BuiltinEntityType;
import java.util.List;
import java.util.function.BiConsumer;
@@ -66,6 +67,8 @@ public abstract class EntityDefinition<T extends Entity> extends EntityDefinitio
this.registeredProperties = registeredProperties;
}
public abstract boolean is(BuiltinEntityType type);
@Setter
@Accessors(fluent = true, chain = true)
public static abstract class Builder<T extends Entity> extends EntityDefinitionBase.Builder<T> {

View File

@@ -76,7 +76,7 @@ public class EntityDefinitionBase<T extends Entity> {
}
if (translator.acceptedType() != metadata.getType()) {
GeyserImpl.getInstance().getLogger().warning("Metadata ID " + metadata.getId() + " was received with type " + metadata.getType() + " but we expected " + translator.acceptedType() + " for " + entity.getDefinition().entityType());
GeyserImpl.getInstance().getLogger().warning("Metadata ID " + metadata.getId() + " was received with type " + metadata.getType() + " but we expected " + translator.acceptedType() + " for " + entity.getDefinition().bedrockIdentifier());
if (GeyserImpl.getInstance().getConfig().isDebugMode()) {
GeyserImpl.getInstance().getLogger().debug(metadata.toString());
}

View File

@@ -45,6 +45,7 @@ import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.translator.entity.EntityMetadataTranslator;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.EntityMetadata;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.MetadataType;
import org.geysermc.mcprotocollib.protocol.data.game.entity.type.BuiltinEntityType;
import java.util.List;
import java.util.Objects;
@@ -65,6 +66,11 @@ public class GeyserCustomEntityDefinition<T extends Entity> extends EntityDefini
this.predicateStrategy = predicateStrategy;
}
@Override
public boolean is(BuiltinEntityType type) {
return false;
}
public static Builder<?> inherited(String bedrockIdentifier, JavaEntityType vanillaType) {
if (!vanillaType.vanilla()) {
throw new IllegalArgumentException("vanillaType must be a vanilla entity type, was: " + vanillaType);

View File

@@ -56,6 +56,11 @@ public class VanillaEntityDefinition<T extends Entity> extends EntityDefinition<
this.entityType = entityType;
}
@Override
public boolean is(BuiltinEntityType builtin) {
return entityType.is(builtin);
}
public static <T extends Entity> Builder<T> builder(EntityFactory<T> factory) {
return new Builder<>(factory);
}

View File

@@ -31,7 +31,6 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
import org.cloudburstmc.protocol.bedrock.packet.MoveEntityDeltaPacket;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.GeyserEntityType;
import org.geysermc.geyser.level.block.BlockStateValues;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.mcprotocollib.protocol.data.game.entity.type.BuiltinEntityType;
@@ -120,16 +119,15 @@ public class ThrowableEntity extends Entity implements Tickable {
*/
protected float getGravity() {
if (getFlag(EntityFlag.HAS_GRAVITY)) {
GeyserEntityType type = definition.entityType();
if (type.is(BuiltinEntityType.LINGERING_POTION) || type.is(BuiltinEntityType.SPLASH_POTION)) {
if (definition.is(BuiltinEntityType.LINGERING_POTION) || definition.is(BuiltinEntityType.SPLASH_POTION)) {
return 0.05f;
} else if (type.is(BuiltinEntityType.EXPERIENCE_BOTTLE)) {
} else if (definition.is(BuiltinEntityType.EXPERIENCE_BOTTLE)) {
return 0.07f;
} else if (type.is(BuiltinEntityType.FIREBALL) || type.is(BuiltinEntityType.SHULKER_BULLET)) {
} else if (definition.is(BuiltinEntityType.FIREBALL) || definition.is(BuiltinEntityType.SHULKER_BULLET)) {
return 0;
} else if (type.is(BuiltinEntityType.SNOWBALL) || type.is(BuiltinEntityType.EGG) || type.is(BuiltinEntityType.ENDER_PEARL)) {
} else if (definition.is(BuiltinEntityType.SNOWBALL) || definition.is(BuiltinEntityType.EGG) || definition.is(BuiltinEntityType.ENDER_PEARL)) {
return 0.03f;
} else if (type.is(BuiltinEntityType.LLAMA_SPIT)) {
} else if (definition.is(BuiltinEntityType.LLAMA_SPIT)) {
return 0.06f;
}
}
@@ -143,13 +141,12 @@ public class ThrowableEntity extends Entity implements Tickable {
if (isInWater()) {
return 0.8f;
} else {
GeyserEntityType type = definition.entityType();
if (type.is(BuiltinEntityType.LINGERING_POTION) || type.is(BuiltinEntityType.SPLASH_POTION) || type.is(BuiltinEntityType.EXPERIENCE_BOTTLE)
|| type.is(BuiltinEntityType.SNOWBALL) || type.is(BuiltinEntityType.EGG) || type.is(BuiltinEntityType.ENDER_PEARL) || type.is(BuiltinEntityType.LLAMA_SPIT)) {
if (definition.is(BuiltinEntityType.LINGERING_POTION) || definition.is(BuiltinEntityType.SPLASH_POTION) || definition.is(BuiltinEntityType.EXPERIENCE_BOTTLE)
|| definition.is(BuiltinEntityType.SNOWBALL) || definition.is(BuiltinEntityType.EGG) || definition.is(BuiltinEntityType.ENDER_PEARL) || definition.is(BuiltinEntityType.LLAMA_SPIT)) {
return 0.99f;
} else if (type.is(BuiltinEntityType.FIREBALL) || type.is(BuiltinEntityType.SMALL_FIREBALL) || type.is(BuiltinEntityType.DRAGON_FIREBALL)) {
} else if (definition.is(BuiltinEntityType.FIREBALL) || definition.is(BuiltinEntityType.SMALL_FIREBALL) || definition.is(BuiltinEntityType.DRAGON_FIREBALL)) {
return 0.95f;
} else if (type.is(BuiltinEntityType.SHULKER_BULLET)) {
} else if (definition.is(BuiltinEntityType.SHULKER_BULLET)) {
return 1;
}
}
@@ -166,7 +163,7 @@ public class ThrowableEntity extends Entity implements Tickable {
@Override
public void despawnEntity() {
if (definition.entityType().is(BuiltinEntityType.ENDER_PEARL)) {
if (definition.is(BuiltinEntityType.ENDER_PEARL)) {
LevelEventPacket particlePacket = new LevelEventPacket();
particlePacket.setType(LevelEvent.PARTICLE_TELEPORT);
particlePacket.setPosition(position);

View File

@@ -30,7 +30,6 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityLinkData;
import org.cloudburstmc.protocol.bedrock.packet.SetEntityLinkPacket;
import org.geysermc.geyser.entity.EntityDefinitions;
import org.geysermc.geyser.entity.GeyserEntityType;
import org.geysermc.geyser.entity.type.Entity;
import org.geysermc.geyser.entity.vehicle.ClientVehicle;
import org.geysermc.geyser.session.GeyserSession;
@@ -126,8 +125,8 @@ public class JavaSetPassengersTranslator extends PacketTranslator<ClientboundSet
entity.setPassengers(newPassengers);
GeyserEntityType type = entity.getDefinition().entityType();
if (type.is(BuiltinEntityType.HORSE) || type.is(BuiltinEntityType.SKELETON_HORSE) || type.is(BuiltinEntityType.DONKEY) || type.is(BuiltinEntityType.MULE) || type.is(BuiltinEntityType.RAVAGER)) {
if (entity.getDefinition().is(BuiltinEntityType.HORSE) || entity.getDefinition().is(BuiltinEntityType.SKELETON_HORSE) || entity.getDefinition().is(BuiltinEntityType.DONKEY)
|| entity.getDefinition().is(BuiltinEntityType.MULE) || entity.getDefinition().is(BuiltinEntityType.RAVAGER)) {
entity.getDirtyMetadata().put(EntityDataTypes.SEAT_ROTATION_OFFSET_DEGREES, 181.0f);
entity.updateBedrockMetadata();
}

View File

@@ -33,6 +33,7 @@ import org.cloudburstmc.protocol.bedrock.data.GameType;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.api.util.Identifier;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.EntityDefinitions;
import org.geysermc.geyser.entity.GeyserEntityType;
import org.geysermc.geyser.entity.type.BoatEntity;
@@ -108,36 +109,36 @@ public final class EntityUtils {
float height = mount.getBoundingBoxHeight();
float mountedHeightOffset = height * 0.75f;
GeyserEntityType type = mount.getDefinition().entityType();
if (type.is(BuiltinEntityType.CAMEL)) {
EntityDefinition<?> definition = mount.getDefinition();
if (definition.is(BuiltinEntityType.CAMEL)) {
boolean isBaby = mount.getFlag(EntityFlag.BABY);
mountedHeightOffset = height - (isBaby ? 0.35f : 0.6f);
} else if (type.is(BuiltinEntityType.CAVE_SPIDER) || type.is(BuiltinEntityType.CHICKEN) || type.is(BuiltinEntityType.SPIDER)) {
} else if (definition.is(BuiltinEntityType.CAVE_SPIDER) || definition.is(BuiltinEntityType.CHICKEN) || definition.is(BuiltinEntityType.SPIDER)) {
mountedHeightOffset = height * 0.5f;
} else if (type.is(BuiltinEntityType.DONKEY) || type.is(BuiltinEntityType.MULE)) {
} else if (definition.is(BuiltinEntityType.DONKEY) || definition.is(BuiltinEntityType.MULE)) {
mountedHeightOffset -= 0.25f;
} else if (type.is(BuiltinEntityType.TRADER_LLAMA) || type.is(BuiltinEntityType.LLAMA)) {
} else if (definition.is(BuiltinEntityType.TRADER_LLAMA) || definition.is(BuiltinEntityType.LLAMA)) {
mountedHeightOffset = height * 0.6f;
} else if (type.is(BuiltinEntityType.MINECART) || type.is(BuiltinEntityType.HOPPER_MINECART) || type.is(BuiltinEntityType.TNT_MINECART)
|| type.is(BuiltinEntityType.CHEST_MINECART) || type.is(BuiltinEntityType.FURNACE_MINECART)
|| type.is(BuiltinEntityType.SPAWNER_MINECART) || type.is(BuiltinEntityType.COMMAND_BLOCK_MINECART)) {
} else if (definition.is(BuiltinEntityType.MINECART) || definition.is(BuiltinEntityType.HOPPER_MINECART) || definition.is(BuiltinEntityType.TNT_MINECART)
|| definition.is(BuiltinEntityType.CHEST_MINECART) || definition.is(BuiltinEntityType.FURNACE_MINECART)
|| definition.is(BuiltinEntityType.SPAWNER_MINECART) || definition.is(BuiltinEntityType.COMMAND_BLOCK_MINECART)) {
mountedHeightOffset = 0;
} else if (type.is(BuiltinEntityType.BAMBOO_RAFT) || type.is(BuiltinEntityType.BAMBOO_CHEST_RAFT)) {
} else if (definition.is(BuiltinEntityType.BAMBOO_RAFT) || definition.is(BuiltinEntityType.BAMBOO_CHEST_RAFT)) {
mountedHeightOffset = 0.25f;
} else if (type.is(BuiltinEntityType.HOGLIN) || type.is(BuiltinEntityType.ZOGLIN)) {
} else if (definition.is(BuiltinEntityType.HOGLIN) || definition.is(BuiltinEntityType.ZOGLIN)) {
boolean isBaby = mount.getFlag(EntityFlag.BABY);
mountedHeightOffset = height - (isBaby ? 0.2f : 0.15f);
} else if (type.is(BuiltinEntityType.PIGLIN)) {
} else if (definition.is(BuiltinEntityType.PIGLIN)) {
mountedHeightOffset = height * 0.92f;
} else if (type.is(BuiltinEntityType.PHANTOM)) {
} else if (definition.is(BuiltinEntityType.PHANTOM)) {
mountedHeightOffset = height * 0.35f;
} else if (type.is(BuiltinEntityType.RAVAGER)) {
} else if (definition.is(BuiltinEntityType.RAVAGER)) {
mountedHeightOffset = 2.1f;
} else if (type.is(BuiltinEntityType.SKELETON_HORSE)) {
} else if (definition.is(BuiltinEntityType.SKELETON_HORSE)) {
mountedHeightOffset -= 0.1875f;
} else if (type.is(BuiltinEntityType.SNIFFER)) {
} else if (definition.is(BuiltinEntityType.SNIFFER)) {
mountedHeightOffset = 1.8f;
} else if (type.is(BuiltinEntityType.STRIDER)) {
} else if (definition.is(BuiltinEntityType.STRIDER)) {
mountedHeightOffset = height - 0.19f;
}
return mountedHeightOffset;
@@ -145,32 +146,32 @@ public final class EntityUtils {
private static float getHeightOffset(Entity passenger) {
boolean isBaby;
GeyserEntityType type = passenger.getDefinition().entityType();
if (type.is(BuiltinEntityType.ALLAY) || type.is(BuiltinEntityType.VEX)) {
EntityDefinition<?> definition = passenger.getDefinition();
if (definition.is(BuiltinEntityType.ALLAY) || definition.is(BuiltinEntityType.VEX)) {
return 0.4f;
} else if (type.is(BuiltinEntityType.SKELETON) || type.is(BuiltinEntityType.STRAY) || type.is(BuiltinEntityType.WITHER_SKELETON)) {
} else if (definition.is(BuiltinEntityType.SKELETON) || definition.is(BuiltinEntityType.STRAY) || definition.is(BuiltinEntityType.WITHER_SKELETON)) {
return -0.6f;
} else if (type.is(BuiltinEntityType.ARMOR_STAND)) {
} else if (definition.is(BuiltinEntityType.ARMOR_STAND)) {
if (((ArmorStandEntity) passenger).isMarker()) {
return 0.0f;
} else {
return 0.1f;
}
} else if (type.is(BuiltinEntityType.ENDERMITE) || type.is(BuiltinEntityType.SILVERFISH)) {
} else if (definition.is(BuiltinEntityType.ENDERMITE) || definition.is(BuiltinEntityType.SILVERFISH)) {
return 0.1f;
} else if (type.is(BuiltinEntityType.PIGLIN) || type.is(BuiltinEntityType.PIGLIN_BRUTE) || type.is(BuiltinEntityType.ZOMBIFIED_PIGLIN)) {
} else if (definition.is(BuiltinEntityType.PIGLIN) || definition.is(BuiltinEntityType.PIGLIN_BRUTE) || definition.is(BuiltinEntityType.ZOMBIFIED_PIGLIN)) {
isBaby = passenger.getFlag(EntityFlag.BABY);
return isBaby ? -0.05f : -0.45f;
} else if (type.is(BuiltinEntityType.DROWNED) || type.is(BuiltinEntityType.HUSK) || type.is(BuiltinEntityType.ZOMBIE_VILLAGER)
|| type.is(BuiltinEntityType.ZOMBIE)) {
} else if (definition.is(BuiltinEntityType.DROWNED) || definition.is(BuiltinEntityType.HUSK) || definition.is(BuiltinEntityType.ZOMBIE_VILLAGER)
|| definition.is(BuiltinEntityType.ZOMBIE)) {
isBaby = passenger.getFlag(EntityFlag.BABY);
return isBaby ? 0.0f : -0.45f;
} else if (type.is(BuiltinEntityType.EVOKER) || type.is(BuiltinEntityType.ILLUSIONER) || type.is(BuiltinEntityType.PILLAGER)
|| type.is(BuiltinEntityType.RAVAGER) || type.is(BuiltinEntityType.VINDICATOR) || type.is(BuiltinEntityType.WITCH)) {
} else if (definition.is(BuiltinEntityType.EVOKER) || definition.is(BuiltinEntityType.ILLUSIONER) || definition.is(BuiltinEntityType.PILLAGER)
|| definition.is(BuiltinEntityType.RAVAGER) || definition.is(BuiltinEntityType.VINDICATOR) || definition.is(BuiltinEntityType.WITCH)) {
return -0.45f;
} else if (type.is(BuiltinEntityType.PLAYER)) {
} else if (definition.is(BuiltinEntityType.PLAYER)) {
return -0.35f;
} else if (type.is(BuiltinEntityType.SHULKER)) {
} else if (definition.is(BuiltinEntityType.SHULKER)) {
Entity vehicle = passenger.getVehicle();
if (vehicle instanceof BoatEntity || vehicle.getDefinition() == EntityDefinitions.MINECART) {
return 0.1875f - getMountedHeightOffset(vehicle);
@@ -195,8 +196,8 @@ public final class EntityUtils {
float xOffset = 0;
float yOffset = mountedHeightOffset + heightOffset;
float zOffset = 0;
GeyserEntityType mountType = mount.getDefinition().entityType();
if (mountType.is(BuiltinEntityType.CAMEL)) {
EntityDefinition<?> mountDefinition = mount.getDefinition();
if (mountDefinition.is(BuiltinEntityType.CAMEL)) {
zOffset = 0.5f;
if (passengers > 1) {
if (!rider) {
@@ -213,11 +214,11 @@ public final class EntityUtils {
yOffset += CamelEntity.SITTING_HEIGHT_DIFFERENCE;
}
}
} else if (mountType.is(BuiltinEntityType.CHICKEN)) {
} else if (mountDefinition.is(BuiltinEntityType.CHICKEN)) {
zOffset = -0.1f;
} else if (mountType.is(BuiltinEntityType.TRADER_LLAMA) || mountType.is(BuiltinEntityType.LLAMA)) {
} else if (mountDefinition.is(BuiltinEntityType.TRADER_LLAMA) || mountDefinition.is(BuiltinEntityType.LLAMA)) {
zOffset = -0.3f;
} else if (mountType.is(BuiltinEntityType.TEXT_DISPLAY)) {
} else if (mountDefinition.is(BuiltinEntityType.TEXT_DISPLAY)) {
if (passenger instanceof TextDisplayEntity textDisplay) {
Vector3f displayTranslation = textDisplay.getTranslation();
if (displayTranslation == null) {
@@ -228,7 +229,7 @@ public final class EntityUtils {
yOffset = displayTranslation.getY() + 0.2f;
zOffset = displayTranslation.getZ();
}
} else if (mountType.is(BuiltinEntityType.PLAYER)) {
} else if (mountDefinition.is(BuiltinEntityType.PLAYER)) {
if (passenger instanceof TextDisplayEntity textDisplay) {
Vector3f displayTranslation = textDisplay.getTranslation();
int lines = textDisplay.getLineCount();
@@ -239,7 +240,7 @@ public final class EntityUtils {
zOffset = displayTranslation.getZ();
}
}
} else if (mountType.is(BuiltinEntityType.HAPPY_GHAST)) {
} else if (mountDefinition.is(BuiltinEntityType.HAPPY_GHAST)) {
int seatingIndex = Math.min(index, 4);
xOffset = HappyGhastEntity.X_OFFSETS[seatingIndex];
yOffset = 3.4f;
@@ -263,23 +264,23 @@ public final class EntityUtils {
* Horses are tinier
* Players, Minecarts, and Boats have different origins
*/
GeyserEntityType passengerType = passenger.getDefinition().entityType();
if (mountType.is(BuiltinEntityType.PLAYER)) {
EntityDefinition<?> passengerDefinition = passenger.getDefinition();
if (mountDefinition.is(BuiltinEntityType.PLAYER)) {
yOffset -= EntityDefinitions.PLAYER.offset();
}
if (passengerType.is(BuiltinEntityType.PLAYER)) {
if (passengerDefinition.is(BuiltinEntityType.PLAYER)) {
yOffset += EntityDefinitions.PLAYER.offset();
}
if (mountType.is(BuiltinEntityType.MINECART) || mountType.is(BuiltinEntityType.HOPPER_MINECART) || mountType.is(BuiltinEntityType.TNT_MINECART)
|| mountType.is(BuiltinEntityType.CHEST_MINECART) || mountType.is(BuiltinEntityType.FURNACE_MINECART)
|| mountType.is(BuiltinEntityType.SPAWNER_MINECART) || mountType.is(BuiltinEntityType.COMMAND_BLOCK_MINECART)) {
if (mountDefinition.is(BuiltinEntityType.MINECART) || mountDefinition.is(BuiltinEntityType.HOPPER_MINECART) || mountDefinition.is(BuiltinEntityType.TNT_MINECART)
|| mountDefinition.is(BuiltinEntityType.CHEST_MINECART) || mountDefinition.is(BuiltinEntityType.FURNACE_MINECART)
|| mountDefinition.is(BuiltinEntityType.SPAWNER_MINECART) || mountDefinition.is(BuiltinEntityType.COMMAND_BLOCK_MINECART)) {
yOffset -= mount.getDefinition().height() * 0.5f;
}
if (passengerType.is(BuiltinEntityType.MINECART) || passengerType.is(BuiltinEntityType.HOPPER_MINECART) || passengerType.is(BuiltinEntityType.TNT_MINECART)
|| passengerType.is(BuiltinEntityType.CHEST_MINECART) || passengerType.is(BuiltinEntityType.FURNACE_MINECART) || passengerType.is(BuiltinEntityType.SPAWNER_MINECART)
|| passengerType.is(BuiltinEntityType.COMMAND_BLOCK_MINECART) || passengerType.is(BuiltinEntityType.SHULKER)) {
if (passengerDefinition.is(BuiltinEntityType.MINECART) || passengerDefinition.is(BuiltinEntityType.HOPPER_MINECART) || passengerDefinition.is(BuiltinEntityType.TNT_MINECART)
|| passengerDefinition.is(BuiltinEntityType.CHEST_MINECART) || passengerDefinition.is(BuiltinEntityType.FURNACE_MINECART) || passengerDefinition.is(BuiltinEntityType.SPAWNER_MINECART)
|| passengerDefinition.is(BuiltinEntityType.COMMAND_BLOCK_MINECART) || passengerDefinition.is(BuiltinEntityType.SHULKER)) {
yOffset += passenger.getDefinition().height() * 0.5f;
} else if (passengerType.is(BuiltinEntityType.FALLING_BLOCK)) {
} else if (passengerDefinition.is(BuiltinEntityType.FALLING_BLOCK)) {
yOffset += 0.995f;
}
if (mount instanceof BoatEntity) {