diff --git a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java index a0eec8983..1cdc967a4 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java +++ b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java @@ -115,15 +115,19 @@ import org.geysermc.geyser.entity.type.living.animal.TurtleEntity; import org.geysermc.geyser.entity.type.living.animal.farm.ChickenEntity; import org.geysermc.geyser.entity.type.living.animal.farm.CowEntity; import org.geysermc.geyser.entity.type.living.animal.farm.PigEntity; -import org.geysermc.geyser.entity.type.living.animal.farm.TemperatureVariantAnimal; +import org.geysermc.geyser.entity.type.living.animal.TemperatureVariantAnimal; import org.geysermc.geyser.entity.type.living.animal.horse.AbstractHorseEntity; import org.geysermc.geyser.entity.type.living.animal.horse.CamelEntity; +import org.geysermc.geyser.entity.type.living.animal.horse.CamelHuskEntity; import org.geysermc.geyser.entity.type.living.animal.horse.ChestedHorseEntity; import org.geysermc.geyser.entity.type.living.animal.horse.HorseEntity; import org.geysermc.geyser.entity.type.living.animal.horse.LlamaEntity; import org.geysermc.geyser.entity.type.living.animal.horse.SkeletonHorseEntity; import org.geysermc.geyser.entity.type.living.animal.horse.TraderLlamaEntity; import org.geysermc.geyser.entity.type.living.animal.horse.ZombieHorseEntity; +import org.geysermc.geyser.entity.type.living.animal.nautilus.AbstractNautilusEntity; +import org.geysermc.geyser.entity.type.living.animal.nautilus.NautilusEntity; +import org.geysermc.geyser.entity.type.living.animal.nautilus.ZombieNautilusEntity; import org.geysermc.geyser.entity.type.living.animal.tameable.CatEntity; import org.geysermc.geyser.entity.type.living.animal.tameable.ParrotEntity; import org.geysermc.geyser.entity.type.living.animal.tameable.TameableEntity; @@ -196,6 +200,7 @@ public final class EntityDefinitions { public static final EntityDefinition BREEZE; public static final EntityDefinition BREEZE_WIND_CHARGE; public static final EntityDefinition CAMEL; + public static final EntityDefinition CAMEL_HUSK; public static final EntityDefinition CAT; public static final EntityDefinition CAVE_SPIDER; public static final EntityDefinition CHERRY_BOAT; @@ -262,6 +267,7 @@ public final class EntityDefinitions { public static final EntityDefinition MINECART; public static final EntityDefinition MOOSHROOM; public static final EntityDefinition MULE; + public static final EntityDefinition NAUTILUS; public static final EntityDefinition OAK_BOAT; public static final EntityDefinition OAK_CHEST_BOAT; public static final EntityDefinition OCELOT; @@ -269,6 +275,7 @@ public final class EntityDefinitions { public static final EntityDefinition PALE_OAK_BOAT; public static final EntityDefinition PALE_OAK_CHEST_BOAT; public static final EntityDefinition PANDA; + public static final EntityDefinition PARCHED; public static final EntityDefinition PARROT; public static final EntityDefinition PHANTOM; public static final EntityDefinition PIG; @@ -324,6 +331,7 @@ public final class EntityDefinitions { public static final EntityDefinition ZOGLIN; public static final EntityDefinition ZOMBIE; public static final EntityDefinition ZOMBIE_HORSE; + public static final EntityDefinition ZOMBIE_NAUTILUS; public static final EntityDefinition ZOMBIE_VILLAGER; public static final EntityDefinition ZOMBIFIED_PIGLIN; @@ -829,6 +837,11 @@ public final class EntityDefinitions { .height(1.8f).width(0.6f) .offset(1.62f) .build(); + PARCHED = EntityDefinition.inherited(AbstractSkeletonEntity::new, mobEntityBase) + .type(EntityType.PARCHED) + .height(1.8f).width(0.6f) + .offset(1.62f) + .build(); VEX = EntityDefinition.inherited(VexEntity::new, mobEntityBase) .type(EntityType.VEX) .height(0.8f).width(0.4f) @@ -1173,6 +1186,9 @@ public final class EntityDefinitions { .addTranslator(MetadataTypes.BOOLEAN, CamelEntity::setDashing) .addTranslator(MetadataTypes.LONG, CamelEntity::setLastPoseTick) .build(); + CAMEL_HUSK = EntityDefinition.inherited(CamelHuskEntity::new, CAMEL) + .type(EntityType.CAMEL_HUSK) + .build(); HORSE = EntityDefinition.inherited(HorseEntity::new, abstractHorseEntityBase) .type(EntityType.HORSE) .height(1.6f).width(1.3965f) @@ -1209,6 +1225,18 @@ public final class EntityDefinitions { .build(); } + // Nautilus + { + EntityDefinition abstractNautilusBase = EntityDefinition.inherited(null, ageableEntityBase) // No factory, is abstract + .build(); + + NAUTILUS = EntityDefinition.inherited(NautilusEntity::new, abstractNautilusBase) + .build(); + + ZOMBIE_NAUTILUS = EntityDefinition.inherited(ZombieNautilusEntity::new, abstractNautilusBase) + .build(); + } + EntityDefinition tameableEntityBase = EntityDefinition.inherited(null, ageableEntityBase) // No factory, is abstract .addTranslator(MetadataTypes.BYTE, TameableEntity::setTameableFlags) .addTranslator(MetadataTypes.OPTIONAL_LIVING_ENTITY_REFERENCE, TameableEntity::setOwner) diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEggEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEggEntity.java index a32762abe..a54821a02 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEggEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEggEntity.java @@ -29,7 +29,7 @@ import lombok.Getter; import net.kyori.adventure.key.Key; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.entity.type.living.animal.farm.TemperatureVariantAnimal; +import org.geysermc.geyser.entity.type.living.animal.TemperatureVariantAnimal; import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.item.Items; import org.geysermc.geyser.session.GeyserSession; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/TemperatureVariantAnimal.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TemperatureVariantAnimal.java similarity index 93% rename from core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/TemperatureVariantAnimal.java rename to core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TemperatureVariantAnimal.java index 9d772c8a2..f7fde1d74 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/TemperatureVariantAnimal.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TemperatureVariantAnimal.java @@ -23,13 +23,11 @@ * @link https://github.com/GeyserMC/Geyser */ -package org.geysermc.geyser.entity.type.living.animal.farm; +package org.geysermc.geyser.entity.type.living.animal; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.properties.type.EnumProperty; -import org.geysermc.geyser.entity.type.living.animal.AnimalEntity; -import org.geysermc.geyser.entity.type.living.animal.VariantHolder; import org.geysermc.geyser.impl.IdentifierImpl; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.RegistryCache; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/ChickenEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/ChickenEntity.java index 4ee7175de..05d564366 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/ChickenEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/ChickenEntity.java @@ -28,6 +28,7 @@ package org.geysermc.geyser.entity.type.living.animal.farm; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.type.living.animal.TemperatureVariantAnimal; import org.geysermc.geyser.item.type.Item; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.registry.JavaRegistries; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/CowEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/CowEntity.java index 8c1a27b95..fbfd0bbdb 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/CowEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/CowEntity.java @@ -31,6 +31,7 @@ import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.SoundEvent; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.type.living.animal.TemperatureVariantAnimal; import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.item.Items; import org.geysermc.geyser.item.type.Item; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/PigEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/PigEntity.java index bb629c3d7..db8397b03 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/PigEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/farm/PigEntity.java @@ -32,6 +32,7 @@ import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.type.Tickable; +import org.geysermc.geyser.entity.type.living.animal.TemperatureVariantAnimal; import org.geysermc.geyser.entity.type.player.PlayerEntity; import org.geysermc.geyser.entity.vehicle.BoostableVehicleComponent; import org.geysermc.geyser.entity.vehicle.ClientVehicle; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelHuskEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelHuskEntity.java new file mode 100644 index 000000000..0ba9ed2ba --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelHuskEntity.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.entity.type.living.animal.horse; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.math.vector.Vector3f; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.item.type.Item; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.tags.ItemTag; +import org.geysermc.geyser.session.cache.tags.Tag; + +import java.util.UUID; + +public class CamelHuskEntity extends CamelEntity { + public CamelHuskEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); + } + + @Override + protected @Nullable Tag getFoodTag() { + return ItemTag.CAMEL_HUSK_FOOD; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/nautilus/AbstractNautilusEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/nautilus/AbstractNautilusEntity.java new file mode 100644 index 000000000..b577ae87a --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/nautilus/AbstractNautilusEntity.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.entity.type.living.animal.nautilus; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.math.TrigMath; +import org.cloudburstmc.math.vector.Vector2f; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.type.living.animal.AnimalEntity; +import org.geysermc.geyser.entity.vehicle.ClientVehicle; +import org.geysermc.geyser.entity.vehicle.NautilusVehicleComponent; +import org.geysermc.geyser.entity.vehicle.VehicleComponent; +import org.geysermc.geyser.inventory.GeyserItemStack; +import org.geysermc.geyser.item.Items; +import org.geysermc.geyser.item.enchantment.EnchantmentComponent; +import org.geysermc.geyser.item.type.Item; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.tags.ItemTag; +import org.geysermc.geyser.session.cache.tags.Tag; +import org.geysermc.geyser.util.InteractiveTag; +import org.geysermc.geyser.util.ItemUtils; +import org.geysermc.mcprotocollib.protocol.data.game.entity.EquipmentSlot; +import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata; +import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode; +import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentTypes; +import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet; + +import java.util.UUID; + +public abstract class AbstractNautilusEntity extends AnimalEntity implements ClientVehicle { + private HolderSet repairableItems = null; + private boolean isCurseOfBinding = false; + private final NautilusVehicleComponent vehicleComponent; + + public AbstractNautilusEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw, float defSpeed) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); + this.vehicleComponent = new NautilusVehicleComponent(this, 0.0f, defSpeed); + } + + @Override + protected @Nullable Tag getFoodTag() { + return ItemTag.NAUTILUS_FOOD; + } + + @Override + public void setBody(GeyserItemStack stack) { + super.setBody(stack); + isCurseOfBinding = ItemUtils.hasEffect(session, stack, EnchantmentComponent.PREVENT_ARMOR_CHANGE); + repairableItems = stack.getComponent(DataComponentTypes.REPAIRABLE); + } + + @NonNull + @Override + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { + if (getFlag(EntityFlag.ANGRY)) { + return InteractiveTag.NONE; + } + + if (getFlag(EntityFlag.TAMED)) { + if (itemInHand.asItem().javaIdentifier().endsWith("_nautilus_armor") && !getItemInSlot(EquipmentSlot.BODY).isEmpty() && !getFlag(EntityFlag.BABY)) { + return InteractiveTag.EQUIP_WOLF_ARMOR; // TODO + } + if (itemInHand.is(Items.SHEARS) && !getItemInSlot(EquipmentSlot.BODY).isEmpty() + && (!isCurseOfBinding || session.getGameMode().equals(GameMode.CREATIVE))) { + return InteractiveTag.REMOVE_WOLF_ARMOR; // TODO + } + if (itemInHand.is(session, repairableItems) && + !getItemInSlot(EquipmentSlot.BODY).isEmpty() && getItemInSlot(EquipmentSlot.BODY).isDamaged()) { + return InteractiveTag.REPAIR_WOLF_ARMOR; // TODO + } + } else if (getFlag(EntityFlag.BABY) || getFlag(EntityFlag.TAMED)) { + if (itemInHand.is(session, ItemTag.NAUTILUS_FOOD)) { + // Can feed either baby nautilus, or tamed nautilus + return InteractiveTag.FEED; + } + } else { + if (itemInHand.is(session, ItemTag.NAUTILUS_TAMING_ITEMS)) { + // Nautilus taming food and untamed - can tame + return InteractiveTag.TAME; + } + } + return super.testMobInteraction(hand, itemInHand); + } + + public void setBoost(IntEntityMetadata entityMetadata) { + vehicleComponent.startBoost(entityMetadata.getPrimitiveValue()); + } + + @Override + public VehicleComponent getVehicleComponent() { + return vehicleComponent; + } + + @Override + public Vector3f getRiddenInput(Vector2f input) { + float x = input.getX(); + float y = 0.0f; + float z = 0.0f; + + if (input.getY() != 0.0f) { + float pitch = session.getPlayerEntity().getPitch(); + z = TrigMath.cos(pitch * TrigMath.DEG_TO_RAD); + y = -TrigMath.sin(pitch * TrigMath.DEG_TO_RAD); + if (input.getY() < 0.0f) { + z *= -0.5f; + y *= -0.5f; + } + } + + if (session.getInputCache().wasJumping()) { + y += 0.5f; + } + + return Vector3f.from(x, y, z).mul(3.9f * vehicleComponent.getMoveSpeed()); + } + + @Override + public float getVehicleSpeed() { + return 0.0f; // Unused + } + + @Override + public boolean isClientControlled() { + return false; + } + + @Override + public boolean canClimb() { + return false; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/conversion/Conversion827_819.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/nautilus/NautilusEntity.java similarity index 66% rename from core/src/main/java/org/geysermc/geyser/registry/populator/conversion/Conversion827_819.java rename to core/src/main/java/org/geysermc/geyser/entity/type/living/animal/nautilus/NautilusEntity.java index c04e70615..5e04fc329 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/conversion/Conversion827_819.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/nautilus/NautilusEntity.java @@ -23,20 +23,16 @@ * @link https://github.com/GeyserMC/Geyser */ -package org.geysermc.geyser.registry.populator.conversion; +package org.geysermc.geyser.entity.type.living.animal.nautilus; -import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.math.vector.Vector3f; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.session.GeyserSession; -public class Conversion827_819 { +import java.util.UUID; - public static NbtMap remapBlock(NbtMap nbtMap) { - nbtMap = Conversion844_827.remapBlock(nbtMap); - - final String name = nbtMap.getString("name"); - if (name.endsWith("copper_chest")) { - return ConversionHelper.withName(nbtMap, "chest"); - } - - return nbtMap; +public class NautilusEntity extends AbstractNautilusEntity { + public NautilusEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw, 1.0f); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/nautilus/ZombieNautilusEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/nautilus/ZombieNautilusEntity.java new file mode 100644 index 000000000..ec34441db --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/nautilus/ZombieNautilusEntity.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.entity.type.living.animal.nautilus; + +import org.cloudburstmc.math.vector.Vector3f; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.entity.type.living.animal.TemperatureVariantAnimal; +import org.geysermc.geyser.entity.type.living.animal.VariantHolder; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.registry.JavaRegistries; +import org.geysermc.geyser.session.cache.registry.JavaRegistryKey; + +import java.util.UUID; + +public class ZombieNautilusEntity extends AbstractNautilusEntity implements VariantHolder { + public ZombieNautilusEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw, 1.1f); + } + + @Override + public void setBedrockVariant(TemperatureVariantAnimal.BuiltInVariant variant) { + TemperatureVariantAnimal.TEMPERATE_VARIANT_PROPERTY.apply(propertyManager, variant); + updateBedrockEntityProperties(); + } + + @Override + public JavaRegistryKey variantRegistry() { + return JavaRegistries.ZOMBIE_NAUTILUS_VARIANT; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/vehicle/HappyGhastVehicleComponent.java b/core/src/main/java/org/geysermc/geyser/entity/vehicle/HappyGhastVehicleComponent.java index b332ff5ff..abb8133f6 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/vehicle/HappyGhastVehicleComponent.java +++ b/core/src/main/java/org/geysermc/geyser/entity/vehicle/HappyGhastVehicleComponent.java @@ -103,27 +103,4 @@ public class HappyGhastVehicleComponent extends VehicleComponent { + public NautilusVehicleComponent(AbstractNautilusEntity vehicle, float stepHeight, float defSpeed) { + super(vehicle, stepHeight); + this.moveSpeed = defSpeed; + } + + @Override + protected void updateRotation() { + float yaw = vehicle.getYaw() + MathUtils.wrapDegrees(getRiddenRotation().getX() - vehicle.getYaw()) * 0.08f; + vehicle.setYaw(yaw); + vehicle.setHeadYaw(yaw); + } + + /** + * Called every session tick while the player is mounted on the vehicle. + */ + public void tickVehicle() { + if (!vehicle.isClientControlled()) { + return; + } + + VehicleContext ctx = new VehicleContext(); + ctx.loadSurroundingBlocks(); + + // LivingEntity#travel + Fluid fluid = checkForFluid(ctx); + float drag = switch (fluid) { + case WATER -> 0.9f; // AbstractNautilus#travelInWater + case LAVA -> 0.5f; // LivingEntity#travelInLava + case EMPTY -> 1f; // TODO No drag it seems? Should probably check the block below, e.g. soul sand + }; + + travel(ctx, getRiddenSpeed(fluid)); + vehicle.setMotion(vehicle.getMotion().mul(drag)); + } + + // AbstractNautilus#getRiddenSpeed + private float getRiddenSpeed(Fluid fluid) { + return fluid == Fluid.WATER ? 0.0325F * this.getMoveSpeed() : + 0.02F * this.getMoveSpeed(); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java b/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java index 64796d052..33ce59797 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java +++ b/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java @@ -898,6 +898,29 @@ public class VehicleComponent { return 1.0f; } + protected Fluid checkForFluid(VehicleContext ctx) { + Fluid result = Fluid.EMPTY; + + BoundingBox box = boundingBox.clone(); + box.expand(-0.001); + + Vector3d min = box.getMin(); + Vector3d max = box.getMax(); + + BlockPositionIterator iter = BlockPositionIterator.fromMinMax(min.getFloorX(), min.getFloorY(), min.getFloorZ(), max.getFloorX(), max.getFloorY(), max.getFloorZ()); + for (iter.reset(); iter.hasNext(); iter.next()) { + BlockState blockState = ctx.getBlock(iter); + if (blockState.is(Blocks.WATER)) { + return Fluid.WATER; // Water takes priority over lava + } + if (blockState.is(Blocks.LAVA)) { + result = Fluid.LAVA; + } + } + + return result; + } + protected class VehicleContext { private Vector3d centerPos; private Vector3d cachePos; diff --git a/core/src/main/java/org/geysermc/geyser/inventory/item/BedrockEnchantment.java b/core/src/main/java/org/geysermc/geyser/inventory/item/BedrockEnchantment.java index 6d3fdbc27..ab3666686 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/item/BedrockEnchantment.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/item/BedrockEnchantment.java @@ -70,7 +70,8 @@ public enum BedrockEnchantment { SWIFT_SNEAK, WIND_BURST, DENSITY, - BREACH; + BREACH, + LUNGE; private static final BedrockEnchantment[] VALUES = values(); diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index 307a128a0..5ad121931 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -86,9 +86,6 @@ public final class GameProtocol { static { // Strict ordering - register(Bedrock_v818.CODEC, "1.21.90", "1.21.91", "1.21.92"); - register(Bedrock_v819.CODEC, "1.21.93", "1.21.94"); - register(Bedrock_v827.CODEC, "1.21.100", "1.21.101"); register(Bedrock_v844.CODEC, "1.21.111", "1.21.112", "1.21.113", "1.21.114"); register(Bedrock_v859.CODEC, "1.21.120", "1.21.121", "1.21.122", "1.21.123"); register(Bedrock_v860.CODEC); @@ -184,7 +181,7 @@ public final class GameProtocol { * @return the supported Minecraft: Java Edition version */ public static String getJavaMinecraftVersion() { - return "1.21.10"; + return "1.21.11"; } /** diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index 5198d88c0..f302e12ce 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -63,8 +63,6 @@ import org.geysermc.geyser.level.block.type.Block; import org.geysermc.geyser.level.block.type.BlockState; import org.geysermc.geyser.level.block.type.FlowerPotBlock; import org.geysermc.geyser.registry.BlockRegistries; -import org.geysermc.geyser.registry.populator.conversion.Conversion827_819; -import org.geysermc.geyser.registry.populator.conversion.Conversion844_827; import org.geysermc.geyser.registry.type.BlockMappings; import org.geysermc.geyser.registry.type.GeyserBedrockBlock; import org.geysermc.geyser.util.JsonUtils; @@ -125,9 +123,6 @@ public final class BlockRegistryPopulator { private static void registerBedrockBlocks() { var blockMappers = ImmutableMap., Remapper>builder() - .put(ObjectIntPair.of("1_21_90", Bedrock_v818.CODEC.getProtocolVersion()), Conversion827_819::remapBlock) - .put(ObjectIntPair.of("1_21_90", Bedrock_v819.CODEC.getProtocolVersion()), Conversion827_819::remapBlock) - .put(ObjectIntPair.of("1_21_100", Bedrock_v827.CODEC.getProtocolVersion()), Conversion844_827::remapBlock) .put(ObjectIntPair.of("1_21_110", Bedrock_v844.CODEC.getProtocolVersion()), tag -> tag) // 1.21.110 -> 1.21.12x doesn't change the block palette .put(ObjectIntPair.of("1_21_110", Bedrock_v859.CODEC.getProtocolVersion()), tag -> tag) diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index c7b0279e1..e70779f86 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -45,9 +45,6 @@ import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.nbt.NbtType; import org.cloudburstmc.nbt.NbtUtils; -import org.cloudburstmc.protocol.bedrock.codec.v818.Bedrock_v818; -import org.cloudburstmc.protocol.bedrock.codec.v819.Bedrock_v819; -import org.cloudburstmc.protocol.bedrock.codec.v827.Bedrock_v827; import org.cloudburstmc.protocol.bedrock.codec.v844.Bedrock_v844; import org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859; import org.cloudburstmc.protocol.bedrock.codec.v860.Bedrock_v860; @@ -76,7 +73,6 @@ import org.geysermc.geyser.item.type.Item; import org.geysermc.geyser.level.block.property.Properties; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.Registries; -import org.geysermc.geyser.registry.populator.conversion.Conversion844_827; import org.geysermc.geyser.registry.type.BlockMappings; import org.geysermc.geyser.registry.type.GeyserBedrockBlock; import org.geysermc.geyser.registry.type.GeyserMappingItem; @@ -125,84 +121,29 @@ public class ItemRegistryPopulator { } public static void populate() { - Map eightTwoSevenFallbacks = new HashMap<>(); - eightTwoSevenFallbacks.put(Items.ACACIA_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.BAMBOO_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.BIRCH_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.CHERRY_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.CRIMSON_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.DARK_OAK_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.JUNGLE_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.MANGROVE_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.OAK_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.PALE_OAK_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.SPRUCE_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.WARPED_SHELF, Items.CHISELED_BOOKSHELF); - eightTwoSevenFallbacks.put(Items.COPPER_BARS, Items.IRON_BARS); - eightTwoSevenFallbacks.put(Items.EXPOSED_COPPER_BARS, Items.IRON_BARS); - eightTwoSevenFallbacks.put(Items.WEATHERED_COPPER_BARS, Items.IRON_BARS); - eightTwoSevenFallbacks.put(Items.OXIDIZED_COPPER_BARS, Items.IRON_BARS); - eightTwoSevenFallbacks.put(Items.WAXED_COPPER_BARS, Items.IRON_BARS); - eightTwoSevenFallbacks.put(Items.WAXED_EXPOSED_COPPER_BARS, Items.IRON_BARS); - eightTwoSevenFallbacks.put(Items.WAXED_WEATHERED_COPPER_BARS, Items.IRON_BARS); - eightTwoSevenFallbacks.put(Items.WAXED_OXIDIZED_COPPER_BARS, Items.IRON_BARS); - eightTwoSevenFallbacks.put(Items.COPPER_GOLEM_STATUE, Items.ARMOR_STAND); - eightTwoSevenFallbacks.put(Items.EXPOSED_COPPER_GOLEM_STATUE, Items.ARMOR_STAND); - eightTwoSevenFallbacks.put(Items.WEATHERED_COPPER_GOLEM_STATUE, Items.ARMOR_STAND); - eightTwoSevenFallbacks.put(Items.OXIDIZED_COPPER_GOLEM_STATUE, Items.ARMOR_STAND); - eightTwoSevenFallbacks.put(Items.WAXED_COPPER_GOLEM_STATUE, Items.ARMOR_STAND); - eightTwoSevenFallbacks.put(Items.WAXED_EXPOSED_COPPER_GOLEM_STATUE, Items.ARMOR_STAND); - eightTwoSevenFallbacks.put(Items.WAXED_WEATHERED_COPPER_GOLEM_STATUE, Items.ARMOR_STAND); - eightTwoSevenFallbacks.put(Items.WAXED_OXIDIZED_COPPER_GOLEM_STATUE, Items.ARMOR_STAND); - eightTwoSevenFallbacks.put(Items.COPPER_LANTERN, Items.LANTERN); - eightTwoSevenFallbacks.put(Items.EXPOSED_COPPER_LANTERN, Items.LANTERN); - eightTwoSevenFallbacks.put(Items.WEATHERED_COPPER_LANTERN, Items.LANTERN); - eightTwoSevenFallbacks.put(Items.OXIDIZED_COPPER_LANTERN, Items.LANTERN); - eightTwoSevenFallbacks.put(Items.WAXED_COPPER_LANTERN, Items.LANTERN); - eightTwoSevenFallbacks.put(Items.WAXED_EXPOSED_COPPER_LANTERN, Items.LANTERN); - eightTwoSevenFallbacks.put(Items.WAXED_WEATHERED_COPPER_LANTERN, Items.LANTERN); - eightTwoSevenFallbacks.put(Items.WAXED_OXIDIZED_COPPER_LANTERN, Items.LANTERN); - eightTwoSevenFallbacks.put(Items.EXPOSED_LIGHTNING_ROD, Items.LIGHTNING_ROD); - eightTwoSevenFallbacks.put(Items.WEATHERED_LIGHTNING_ROD, Items.LIGHTNING_ROD); - eightTwoSevenFallbacks.put(Items.OXIDIZED_LIGHTNING_ROD, Items.LIGHTNING_ROD); - eightTwoSevenFallbacks.put(Items.WAXED_LIGHTNING_ROD, Items.LIGHTNING_ROD); - eightTwoSevenFallbacks.put(Items.WAXED_EXPOSED_LIGHTNING_ROD, Items.LIGHTNING_ROD); - eightTwoSevenFallbacks.put(Items.WAXED_WEATHERED_LIGHTNING_ROD, Items.LIGHTNING_ROD); - eightTwoSevenFallbacks.put(Items.WAXED_OXIDIZED_LIGHTNING_ROD, Items.LIGHTNING_ROD); - eightTwoSevenFallbacks.put(Items.COPPER_TORCH, Items.TORCH); - eightTwoSevenFallbacks.put(Items.COPPER_HORSE_ARMOR, Items.LEATHER_HORSE_ARMOR); - - Map eightOneNineFallbacks = new HashMap<>(eightTwoSevenFallbacks); - eightOneNineFallbacks.put(Items.COPPER_CHEST, Items.CHEST); - eightOneNineFallbacks.put(Items.EXPOSED_COPPER_CHEST, Items.CHEST); - eightOneNineFallbacks.put(Items.WEATHERED_COPPER_CHEST, Items.CHEST); - eightOneNineFallbacks.put(Items.OXIDIZED_COPPER_CHEST, Items.CHEST); - eightOneNineFallbacks.put(Items.WAXED_COPPER_CHEST, Items.CHEST); - eightOneNineFallbacks.put(Items.WAXED_EXPOSED_COPPER_CHEST, Items.CHEST); - eightOneNineFallbacks.put(Items.WAXED_WEATHERED_COPPER_CHEST, Items.CHEST); - eightOneNineFallbacks.put(Items.WAXED_OXIDIZED_COPPER_CHEST, Items.CHEST); - eightOneNineFallbacks.put(Items.COPPER_HELMET, Items.LEATHER_HELMET); - eightOneNineFallbacks.put(Items.COPPER_CHESTPLATE, Items.LEATHER_CHESTPLATE); - eightOneNineFallbacks.put(Items.COPPER_LEGGINGS, Items.LEATHER_LEGGINGS); - eightOneNineFallbacks.put(Items.COPPER_BOOTS, Items.LEATHER_BOOTS); - eightOneNineFallbacks.put(Items.COPPER_NUGGET, Items.IRON_NUGGET); - eightOneNineFallbacks.put(Items.COPPER_SWORD, Items.STONE_SWORD); - eightOneNineFallbacks.put(Items.COPPER_PICKAXE, Items.STONE_PICKAXE); - eightOneNineFallbacks.put(Items.COPPER_SHOVEL, Items.STONE_SHOVEL); - eightOneNineFallbacks.put(Items.COPPER_AXE, Items.STONE_AXE); - eightOneNineFallbacks.put(Items.COPPER_HOE, Items.STONE_HOE); - eightOneNineFallbacks.put(Items.COPPER_GOLEM_SPAWN_EGG, Items.IRON_GOLEM_SPAWN_EGG); - - Map eightOneEightFallbacks = new HashMap<>(eightOneNineFallbacks); - eightOneEightFallbacks.put(Items.MUSIC_DISC_LAVA_CHICKEN, Items.MUSIC_DISC_CHIRP); + Map eightFourFourFallbacks = new HashMap<>(); + eightFourFourFallbacks.put(Items.WOODEN_SPEAR, Items.WOODEN_SWORD); + eightFourFourFallbacks.put(Items.STONE_SPEAR, Items.STONE_SWORD); + eightFourFourFallbacks.put(Items.COPPER_SPEAR, Items.COPPER_SWORD); + eightFourFourFallbacks.put(Items.IRON_SPEAR, Items.IRON_SWORD); + eightFourFourFallbacks.put(Items.GOLDEN_SPEAR, Items.GOLDEN_SWORD); + eightFourFourFallbacks.put(Items.DIAMOND_SPEAR, Items.DIAMOND_SWORD); + eightFourFourFallbacks.put(Items.NETHERITE_SPEAR, Items.NETHERITE_SWORD); + eightFourFourFallbacks.put(Items.COPPER_NAUTILUS_ARMOR, Items.COPPER_HORSE_ARMOR); + eightFourFourFallbacks.put(Items.IRON_NAUTILUS_ARMOR, Items.IRON_HORSE_ARMOR); + eightFourFourFallbacks.put(Items.GOLDEN_NAUTILUS_ARMOR, Items.GOLDEN_HORSE_ARMOR); + eightFourFourFallbacks.put(Items.DIAMOND_NAUTILUS_ARMOR, Items.DIAMOND_HORSE_ARMOR); + eightFourFourFallbacks.put(Items.NETHERITE_NAUTILUS_ARMOR, Items.DIAMOND_HORSE_ARMOR); // Any version without nautilus armor won't have netherite horse armor either + eightFourFourFallbacks.put(Items.NETHERITE_HORSE_ARMOR, Items.DIAMOND_HORSE_ARMOR); + eightFourFourFallbacks.put(Items.NAUTILUS_SPAWN_EGG, Items.PUFFERFISH_SPAWN_EGG); + eightFourFourFallbacks.put(Items.ZOMBIE_NAUTILUS_SPAWN_EGG, Items.PUFFERFISH_SPAWN_EGG); + eightFourFourFallbacks.put(Items.CAMEL_HUSK_SPAWN_EGG, Items.CAMEL_SPAWN_EGG); + eightFourFourFallbacks.put(Items.PARCHED_SPAWN_EGG, Items.SKELETON_SPAWN_EGG); List paletteVersions = new ArrayList<>(6); - paletteVersions.add(new PaletteVersion("1_21_90", Bedrock_v818.CODEC.getProtocolVersion(), eightOneEightFallbacks, Conversion844_827::remapItem)); - paletteVersions.add(new PaletteVersion("1_21_93", Bedrock_v819.CODEC.getProtocolVersion(), eightOneNineFallbacks, Conversion844_827::remapItem)); - paletteVersions.add(new PaletteVersion("1_21_100", Bedrock_v827.CODEC.getProtocolVersion(), eightTwoSevenFallbacks, Conversion844_827::remapItem)); - paletteVersions.add(new PaletteVersion("1_21_110", Bedrock_v844.CODEC.getProtocolVersion())); - paletteVersions.add(new PaletteVersion("1_21_120", Bedrock_v859.CODEC.getProtocolVersion())); - paletteVersions.add(new PaletteVersion("1_21_120", Bedrock_v860.CODEC.getProtocolVersion())); + paletteVersions.add(new PaletteVersion("1_21_110", Bedrock_v844.CODEC.getProtocolVersion(), eightFourFourFallbacks)); + paletteVersions.add(new PaletteVersion("1_21_120", Bedrock_v859.CODEC.getProtocolVersion(), eightFourFourFallbacks)); + paletteVersions.add(new PaletteVersion("1_21_120", Bedrock_v860.CODEC.getProtocolVersion(), eightFourFourFallbacks)); paletteVersions.add(new PaletteVersion("1_21_130", Bedrock_v898.CODEC.getProtocolVersion())); GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java index cc2c76876..9dd6c2ab3 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java @@ -70,10 +70,6 @@ public final class TagRegistryPopulator { }; List> paletteVersions = List.of( - ObjectIntPair.of("1_21_90", Bedrock_v818.CODEC.getProtocolVersion()), - // Not a typo, it's the same file - ObjectIntPair.of("1_21_90", Bedrock_v819.CODEC.getProtocolVersion()), - ObjectIntPair.of("1_21_100", Bedrock_v827.CODEC.getProtocolVersion()), ObjectIntPair.of("1_21_110", Bedrock_v844.CODEC.getProtocolVersion()), ObjectIntPair.of("1_21_120", Bedrock_v859.CODEC.getProtocolVersion()) // TODO .130! diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/conversion/Conversion844_827.java b/core/src/main/java/org/geysermc/geyser/registry/populator/conversion/Conversion844_827.java deleted file mode 100644 index 511d27407..000000000 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/conversion/Conversion844_827.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2025 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/Geyser - */ - -package org.geysermc.geyser.registry.populator.conversion; - -import org.cloudburstmc.nbt.NbtMap; -import org.cloudburstmc.nbt.NbtMapBuilder; -import org.geysermc.geyser.item.Items; -import org.geysermc.geyser.item.type.Item; -import org.geysermc.geyser.registry.type.GeyserMappingItem; - -public class Conversion844_827 { - - public static NbtMap remapBlock(NbtMap nbtMap) { - final String name = nbtMap.getString("name"); - if (name.equals("minecraft:iron_chain") || name.endsWith("copper_chain")) { - return ConversionHelper.withName(nbtMap, "chain"); - } else if (name.endsWith("lightning_rod")) { - NbtMapBuilder statesWithoutPoweredBit = nbtMap.getCompound("states").toBuilder(); - statesWithoutPoweredBit.remove("powered_bit"); - return nbtMap.toBuilder() - .putString("name", "minecraft:lightning_rod") - .putCompound("states", statesWithoutPoweredBit.build()) - .build(); - } else if (name.endsWith("_shelf") || name.endsWith("copper_golem_statue")) { - return ConversionHelper.withoutStates("unknown"); - } else if (name.equals("minecraft:copper_torch")) { - return ConversionHelper.withName(nbtMap, "torch"); - } else if (name.endsWith("copper_bars")) { - return ConversionHelper.withName(nbtMap, "iron_bars"); - } else if (name.endsWith("copper_lantern")) { - return ConversionHelper.withName(nbtMap, "lantern"); - } - - return nbtMap; - } - - public static GeyserMappingItem remapItem(Item item, GeyserMappingItem mapping) { - if (item == Items.IRON_CHAIN || item.javaIdentifier().endsWith("copper_chain")) { - return mapping.withBedrockIdentifier("minecraft:chain"); - } - return mapping; - } -} diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java index 22f2f3e16..26e2e7f39 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java @@ -35,7 +35,7 @@ import org.cloudburstmc.nbt.NbtType; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.entity.type.living.animal.FrogEntity; import org.geysermc.geyser.entity.type.living.animal.VariantHolder; -import org.geysermc.geyser.entity.type.living.animal.farm.TemperatureVariantAnimal; +import org.geysermc.geyser.entity.type.living.animal.TemperatureVariantAnimal; import org.geysermc.geyser.entity.type.living.animal.tameable.CatEntity; import org.geysermc.geyser.entity.type.living.animal.tameable.WolfEntity; import org.geysermc.geyser.inventory.item.BannerPattern; diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java index b6e80bf17..e344c32cc 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java @@ -30,7 +30,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.data.TrimMaterial; import org.cloudburstmc.protocol.bedrock.data.TrimPattern; import org.geysermc.geyser.entity.type.living.animal.FrogEntity; -import org.geysermc.geyser.entity.type.living.animal.farm.TemperatureVariantAnimal; +import org.geysermc.geyser.entity.type.living.animal.TemperatureVariantAnimal; import org.geysermc.geyser.entity.type.living.animal.tameable.CatEntity; import org.geysermc.geyser.entity.type.living.animal.tameable.WolfEntity; import org.geysermc.geyser.inventory.item.BannerPattern; @@ -98,6 +98,7 @@ public class JavaRegistries { public static final JavaRegistryKey PIG_VARIANT = create("pig_variant"); public static final JavaRegistryKey COW_VARIANT = create("cow_variant"); public static final JavaRegistryKey CHICKEN_VARIANT = create("chicken_variant"); + public static final JavaRegistryKey ZOMBIE_NAUTILUS_VARIANT = create("zombie_nautilus_variant"); private static JavaRegistryKey create(String key, JavaRegistryKey.RegistryLookup registryLookup) { JavaRegistryKey registry = new JavaRegistryKey<>(MinecraftKey.key(key), registryLookup); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaHorseScreenOpenTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaHorseScreenOpenTranslator.java index 28b29d0d4..77c1383a5 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaHorseScreenOpenTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaHorseScreenOpenTranslator.java @@ -47,14 +47,14 @@ import org.geysermc.geyser.translator.inventory.horse.LlamaInventoryTranslator; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.InventoryUtils; -import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.inventory.ClientboundHorseScreenOpenPacket; +import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.inventory.ClientboundMountScreenOpenPacket; import java.util.ArrayList; import java.util.Collections; import java.util.List; -@Translator(packet = ClientboundHorseScreenOpenPacket.class) -public class JavaHorseScreenOpenTranslator extends PacketTranslator { +@Translator(packet = ClientboundMountScreenOpenPacket.class) +public class JavaHorseScreenOpenTranslator extends PacketTranslator { private static final NbtMap ARMOR_SLOT; private static final NbtMap CARPET_SLOT; @@ -102,7 +102,7 @@ public class JavaHorseScreenOpenTranslator extends PacketTranslator