1
0
mirror of https://github.com/GeyserMC/Geyser.git synced 2025-12-30 12:19:10 +00:00

Implement VariantHolder for farm animals, still have to figure out how to do this efficiently

This commit is contained in:
Eclipse
2025-03-22 11:13:54 +00:00
committed by onebeastchris
parent c8c09c9b7d
commit 4c2ac05a53
7 changed files with 20 additions and 56 deletions

View File

@@ -980,7 +980,7 @@ public final class EntityDefinitions {
FROG = EntityDefinition.inherited(FrogEntity::new, ageableEntityBase)
.type(EntityType.FROG)
.heightAndWidth(0.5f)
.addTranslator(MetadataTypes.FROG_VARIANT, FrogEntity::setFrogVariant)
.addTranslator(MetadataTypes.FROG_VARIANT, FrogEntity::setVariant)
.addTranslator(MetadataTypes.OPTIONAL_VARINT, FrogEntity::setTongueTarget)
.build();
HOGLIN = EntityDefinition.inherited(HoglinEntity::new, ageableEntityBase)
@@ -1151,7 +1151,7 @@ public final class EntityDefinitions {
CAT = EntityDefinition.inherited(CatEntity::new, tameableEntityBase)
.type(EntityType.CAT)
.height(0.35f).width(0.3f)
.addTranslator(MetadataTypes.CAT_VARIANT, CatEntity::setCatVariant)
.addTranslator(MetadataTypes.CAT_VARIANT, CatEntity::setVariant)
.addTranslator(MetadataTypes.BOOLEAN, CatEntity::setResting)
.addTranslator(null) // "resting state one" //TODO
.addTranslator(MetadataTypes.INT, CatEntity::setCollarColor)
@@ -1169,7 +1169,7 @@ public final class EntityDefinitions {
.addTranslator(MetadataTypes.BOOLEAN, (wolfEntity, entityMetadata) -> wolfEntity.setFlag(EntityFlag.INTERESTED, ((BooleanEntityMetadata) entityMetadata).getPrimitiveValue()))
.addTranslator(MetadataTypes.INT, WolfEntity::setCollarColor)
.addTranslator(MetadataTypes.INT, WolfEntity::setWolfAngerTime)
.addTranslator(MetadataTypes.WOLF_VARIANT, WolfEntity::setWolfVariant)
.addTranslator(MetadataTypes.WOLF_VARIANT, WolfEntity::setVariant)
.build();
// As of 1.18 these don't track entity data at all

View File

@@ -49,6 +49,7 @@ public class MooshroomEntity extends CowEntity {
super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw);
}
// TODO fix this with super
public void setVariant(ObjectEntityMetadata<String> entityMetadata) {
isBrown = entityMetadata.getValue().equals("brown");
dirtyMetadata.put(EntityDataTypes.VARIANT, isBrown ? 1 : 0);

View File

@@ -30,7 +30,6 @@ import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.packet.AddEntityPacket;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.properties.VanillaEntityProperties;
import org.geysermc.geyser.entity.type.living.animal.AnimalEntity;
import org.geysermc.geyser.item.type.Item;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.registry.JavaRegistries;
@@ -59,7 +58,7 @@ public class ChickenEntity extends TemperatureVariantAnimal<ChickenVariant> {
}
@Override
protected JavaRegistryKey<BuiltInVariant> variantRegistry() {
public JavaRegistryKey<BuiltInVariant> variantRegistry() {
return JavaRegistries.CHICKEN_VARIANT;
}
}

View File

@@ -33,7 +33,6 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.cloudburstmc.protocol.bedrock.packet.AddEntityPacket;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.properties.VanillaEntityProperties;
import org.geysermc.geyser.entity.type.living.animal.AnimalEntity;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.item.type.Item;
@@ -88,7 +87,7 @@ public class CowEntity extends TemperatureVariantAnimal<CowVariant> {
}
@Override
protected JavaRegistryKey<BuiltInVariant> variantRegistry() {
public JavaRegistryKey<BuiltInVariant> variantRegistry() {
return JavaRegistries.COW_VARIANT;
}
}

View File

@@ -35,7 +35,6 @@ import org.cloudburstmc.protocol.bedrock.packet.AddEntityPacket;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.properties.VanillaEntityProperties;
import org.geysermc.geyser.entity.type.Tickable;
import org.geysermc.geyser.entity.type.living.animal.AnimalEntity;
import org.geysermc.geyser.entity.type.player.PlayerEntity;
import org.geysermc.geyser.entity.vehicle.BoostableVehicleComponent;
import org.geysermc.geyser.entity.vehicle.ClientVehicle;
@@ -51,9 +50,6 @@ import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.EntityUtils;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import org.geysermc.mcprotocollib.protocol.data.game.Holder;
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.metadata.PigVariant;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata;
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand;
@@ -164,7 +160,7 @@ public class PigEntity extends TemperatureVariantAnimal<PigVariant> implements T
}
@Override
protected JavaRegistryKey<BuiltInVariant> variantRegistry() {
public JavaRegistryKey<BuiltInVariant> variantRegistry() {
return JavaRegistries.PIG_VARIANT;
}
}

View File

@@ -25,25 +25,16 @@
package org.geysermc.geyser.entity.type.living.animal.farm;
import net.kyori.adventure.key.Key;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.type.living.animal.AnimalEntity;
import org.geysermc.geyser.entity.type.living.animal.VariantHolder;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.registry.JavaRegistryKey;
import org.geysermc.geyser.session.cache.registry.RegistryEntryContext;
import org.geysermc.geyser.util.MinecraftKey;
import org.geysermc.mcprotocollib.protocol.data.game.Holder;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.EntityMetadata;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.MetadataType;
import java.util.Locale;
import java.util.UUID;
import java.util.function.Function;
// TODO figure out how to do the generics here
public abstract class TemperatureVariantAnimal<Variant> extends AnimalEntity implements VariantHolder<Variant> {
public TemperatureVariantAnimal(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition<?> definition,
@@ -51,20 +42,15 @@ public abstract class TemperatureVariantAnimal<Variant> extends AnimalEntity imp
super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw);
}
protected abstract JavaRegistryKey<BuiltInVariant> variantRegistry();
public void setVariant(EntityMetadata<Holder<Variant>, ? extends MetadataType<Holder<Variant>>> variant) {
BuiltInVariant animalVariant;
if (variant.getValue().isId()) {
animalVariant = variantRegistry().fromNetworkId(session, variant.getValue().id());
if (animalVariant == null) {
animalVariant = BuiltInVariant.TEMPERATE;
}
} else {
animalVariant = BuiltInVariant.TEMPERATE;
}
@Override
public void setBedrockVariant(int bedrockId) {
// TODO does this work?
dirtyMetadata.put(EntityDataTypes.VARIANT, animalVariant.ordinal());
dirtyMetadata.put(EntityDataTypes.VARIANT, bedrockId);
}
@Override
public BuiltIn<Variant> defaultVariant() {
return BuiltInVariant.TEMPERATE;
}
// Ordered by bedrock id
@@ -72,23 +58,6 @@ public abstract class TemperatureVariantAnimal<Variant> extends AnimalEntity imp
public enum BuiltInVariant implements BuiltIn<?> {
COLD,
TEMPERATE,
WARM;
public static final Function<RegistryEntryContext, BuiltInVariant> READER = context -> getByJavaIdentifier(context.id());
private final Key javaIdentifier;
BuiltInVariant() {
javaIdentifier = MinecraftKey.key(name().toLowerCase(Locale.ROOT));
}
public static @Nullable BuiltInVariant getByJavaIdentifier(Key identifier) {
for (BuiltInVariant variant : values()) {
if (variant.javaIdentifier.equals(identifier)) {
return variant;
}
}
return null;
}
WARM
}
}

View File

@@ -101,9 +101,9 @@ public final class RegistryCache {
register(JavaRegistries.FROG_VARIANT, cache -> cache.frogVariants, VariantHolder.reader(FrogEntity.BuiltInVariant.class));
register(JavaRegistries.WOLF_VARIANT, cache -> cache.wolfVariants, VariantHolder.reader(WolfEntity.BuiltInVariant.class));
register(JavaRegistries.PIG_VARIANT, cache -> cache.pigVariants, TemperatureVariantAnimal.BuiltInVariant.READER);
register(JavaRegistries.COW_VARIANT, cache -> cache.cowVariants, TemperatureVariantAnimal.BuiltInVariant.READER);
register(JavaRegistries.CHICKEN_VARIANT, cache -> cache.chickenVariants, TemperatureVariantAnimal.BuiltInVariant.READER);
register(JavaRegistries.PIG_VARIANT, cache -> cache.pigVariants, VariantHolder.reader(TemperatureVariantAnimal.BuiltInVariant.class));
register(JavaRegistries.COW_VARIANT, cache -> cache.cowVariants, VariantHolder.reader(TemperatureVariantAnimal.BuiltInVariant.class));
register(JavaRegistries.CHICKEN_VARIANT, cache -> cache.chickenVariants, VariantHolder.reader(TemperatureVariantAnimal.BuiltInVariant.class));
// Load from MCProtocolLib's classloader
NbtMap tag = MinecraftProtocol.loadNetworkCodec();