diff --git a/README.md b/README.md index ff95e73b2..c0bb5734d 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,38 @@ Cardboard is an implementation of the popular Bukkit/Spigot/Paper Modding API fo Fabric version chart: | Support | Minecraft | Git Branch | Dev Status | |----------|------------------|-------------|------------| -| ✅ | Fabric 26.1.2 | ver/26.1 | Active | +| ✅ | Fabric 26.2 | ver/26.2 | Active | +| ✅ | Fabric 26.1.2 | ver/26.1 | Low | | ✅ | Fabric 1.21.11 | ver/1.21.11 | Low | | ✅ | Fabric 1.21.1 | ver/1.21 | Low | | ❌ | <= 1.20 | | | See [Supported Versions](https://github.com/CardboardPowered/cardboard/wiki/Supported-Versions) for more details. & [View Downloads](https://cardboardpowered.org/download/) +## Building + +Requires JDK 25 (auto-provisioned by the Gradle toolchain resolver) and Java 21+ at runtime. + +``` +./gradlew build +``` + +The mod jar is produced at `build/libs/Cardboard-.jar`. Drop it into a +Fabric server's `mods/` folder alongside [Fabric API](https://modrinth.com/mod/fabric-api) +and iCommonLib; Bukkit plugins then go in `plugins/`. + +### 26.2 notes + +Minecraft 26.2 moved the entity and block-entity constants out of their type +classes (`EntityType.X` -> `EntityTypes.X`, `BlockEntityType.X` -> +`BlockEntityTypes.X`), stripped the colour metadata from `ChatFormatting` in +favour of `world.scores.TeamColor`, and ships Adventure 5. Cardboard on this +branch targets Paper-API `26.2.build.110-stable` and Adventure `5.2.0`. + +## About this fork +This repository is derived from [CardboardPowered/cardboard](https://github.com/CardboardPowered/cardboard) +and carries its history and license. The `ver/26.2` branch adds Minecraft 26.2 support. + ## License We inherit the license from Paper. See [Paper's License](https://github.com/PaperMC/Paper/blob/master/LICENSE.md) for full details. SrgLib is also licensed under MIT. diff --git a/build.gradle b/build.gradle index 90260c9f0..7171cc167 100644 --- a/build.gradle +++ b/build.gradle @@ -49,8 +49,8 @@ configurations.all { } // Paper-API -def PAPER_VER_A = "26.1.2.build.69-stable" // "1.21.11-R0.1-SNAPSHOT" -def PAPER_VER_B = "26.1.2.build.69-stable" // "1.21.11-R0.1-20260511.115010-91" // "1.21.11-R0.1-20260120.191825-59" +def PAPER_VER_A = "26.2.build.110-stable" // "26.1.2.build.69-stable" +def PAPER_VER_B = "26.2.build.110-stable" // "26.1.2.build.69-stable" def PAPER_API_VER = "io.papermc.paper:paper-api:" + PAPER_VER_B @@ -75,9 +75,9 @@ dependencies { // javax.annotation-api-1.3.2.jar // iCommon-Fabric-1.21.11_unobfuscated.jar - compileOnly fileTree(dir: 'libs', include: 'iCommon-Fabric-26.1.2.jar') + compileOnly fileTree(dir: 'libs', include: 'iCommon-Fabric-26.2.jar') - implementation fileTree(dir: 'libs', include: 'iCommon-Fabric-26.1.2.jar') + implementation fileTree(dir: 'libs', include: 'iCommon-Fabric-26.2.jar') // TODO: Maven repo this compileOnly fileTree(dir: 'libs', include: 'icommon-configuration-1.0.jar') @@ -102,11 +102,11 @@ dependencies { implementation(PAPER_API_VER) implementation("net.md-5:bungeecord-chat:1.21-R0.2") - implementation("net.kyori:adventure-api:4.25.0") - implementation("net.kyori:adventure-text-serializer-gson:4.25.0") - implementation("net.kyori:adventure-text-serializer-legacy:4.25.0") - implementation("net.kyori:adventure-text-serializer-plain:4.25.0") - implementation("net.kyori:adventure-text-minimessage:4.25.0") + implementation("net.kyori:adventure-api:5.2.0") + implementation("net.kyori:adventure-text-serializer-gson:5.2.0") + implementation("net.kyori:adventure-text-serializer-legacy:5.2.0") + implementation("net.kyori:adventure-text-serializer-plain:5.2.0") + implementation("net.kyori:adventure-text-minimessage:5.2.0") // compileOnly fileTree(dir: 'libs', include: 'commons-lang-2.6.jar') // compileOnly group: "org.jetbrains", name: "annotations", version: "18.0.0" @@ -188,9 +188,9 @@ processResources { duplicatesStrategy = DuplicatesStrategy.INCLUDE from(sourceSets.main.resources.srcDirs) { include "fabric.mod.json" - if(System.env.BUILD_NUMBER){ - expand "version": System.env.BUILD_NUMBER - } + // Always expand: leaving the literal ${version} in fabric.mod.json makes + // Fabric Loader warn that the version is unparseable on every start. + expand "version": (System.env.BUILD_NUMBER ?: project.mod_version) } from(sourceSets.main.resources.srcDirs) { @@ -230,7 +230,7 @@ shadowJar { modrinth { token = System.getenv("MODRINTH") // This is the default. Remember to have the MODRINTH_TOKEN environment variable set or else this will fail, or set it to whatever you want - just make sure it stays private! projectId = "MLYQ9VGP" - versionNumber = "26.1-" + System.env.BUILD_NUMBER + versionNumber = project.mod_version + "-" + System.env.BUILD_NUMBER versionType = "beta" uploadFile = jar gameVersions = ["26.1.2"] @@ -261,3 +261,4 @@ publishing { // } //} } + diff --git a/gradle.properties b/gradle.properties index 2e901d872..f56051a2e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,12 +24,17 @@ org.gradle.jvmargs=-Xmx2G # fabric_version=0.139.4+1.21.11_unobfuscated # 26.1.2 - minecraft_version=26.1.2 - loader_version=0.19.2 - fabric_version=0.149.1+26.1.2 + # minecraft_version=26.1.2 + # loader_version=0.19.2 + # fabric_version=0.149.1+26.1.2 + + # 26.2 + minecraft_version=26.2 + loader_version=0.19.3 + fabric_version=0.156.0+26.2 # Mod Properties - mod_version = 26.1.2 + mod_version = 26.2 maven_group = org.cardboardpowered archives_base_name = Cardboard diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/libs/iCommon-Fabric-26.1.2.jar b/libs/iCommon-Fabric-26.2.jar similarity index 79% rename from libs/iCommon-Fabric-26.1.2.jar rename to libs/iCommon-Fabric-26.2.jar index 00db72c71..9f77d4eb7 100644 Binary files a/libs/iCommon-Fabric-26.1.2.jar and b/libs/iCommon-Fabric-26.2.jar differ diff --git a/settings.gradle b/settings.gradle index fcec66ec8..49e35e3d6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,6 +8,13 @@ pluginManagement { } } +// Auto-provision the JDK 25 toolchain this build requires (build.gradle pins +// languageVersion 25). Without this, Gradle fails on machines that only have a +// different JDK installed instead of downloading a matching one. +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' +} + //include ':iCommon',':iCommon-API',':iCommon-Fabric-1.20.2' //project(':iCommon').projectDir = new File("C:/Users/isaia/mods/iCommonLib") //project(':iCommon-API').projectDir = new File("C:/Users/isaia/mods/iCommonLib/iCommon-API") diff --git a/src/main/java/com/destroystokyo/paper/entity/PaperPathfinder.java b/src/main/java/com/destroystokyo/paper/entity/PaperPathfinder.java index aeee52210..6a1914233 100644 --- a/src/main/java/com/destroystokyo/paper/entity/PaperPathfinder.java +++ b/src/main/java/com/destroystokyo/paper/entity/PaperPathfinder.java @@ -135,4 +135,23 @@ public PathResult findPath(Entity target) { return path != null ? new PaperPathResult(path) : null; } + + // 26.2: Pathfinder gained a max-distance overload + @Override + public PathResult findPath(Location loc, int maxDistance) { + Preconditions.checkArgument(loc != null, "Location cant be nil"); + Path path = this.entity.getNavigation().createPath( + new net.minecraft.core.BlockPos(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()), maxDistance); + return path != null ? new PaperPathResult(path) : null; + } + + + // 26.2: Pathfinder declares max-distance overloads for both Entity and Location + @Override + public PathResult findPath(Entity target, int maxDistance) { + Preconditions.checkArgument(target != null, "Target cant be nil"); + Path path = this.entity.getNavigation().createPath(((CraftEntity) target).getHandle(), maxDistance); + return path != null ? new PaperPathResult(path) : null; + } + } diff --git a/src/main/java/io/papermc/paper/adventure/AdventureCodecs.java b/src/main/java/io/papermc/paper/adventure/AdventureCodecs.java index 39d95efba..7c2f2bcd1 100644 --- a/src/main/java/io/papermc/paper/adventure/AdventureCodecs.java +++ b/src/main/java/io/papermc/paper/adventure/AdventureCodecs.java @@ -172,15 +172,19 @@ public String getSerializedName() { } public static final Function GET_CLICK_EVENT_TYPE = - he -> switch (he.action()) { - case OPEN_URL -> OPEN_URL_CLICK_EVENT_TYPE; - case OPEN_FILE -> OPEN_FILE_CLICK_EVENT_TYPE; - case RUN_COMMAND -> RUN_COMMAND_CLICK_EVENT_TYPE; - case SUGGEST_COMMAND -> SUGGEST_COMMAND_CLICK_EVENT_TYPE; - case CHANGE_PAGE -> CHANGE_PAGE_CLICK_EVENT_TYPE; - case COPY_TO_CLIPBOARD -> COPY_TO_CLIPBOARD_CLICK_EVENT_TYPE; - case SHOW_DIALOG -> SHOW_DIALOG_CLICK_EVENT_TYPE; - case CUSTOM -> CUSTOM_CLICK_EVENT_TYPE; + he -> { + // 26.2: Adventure 5 turned ClickEvent.Action from an enum into a generic + // interface with singleton instances, so this can no longer be a switch. + final ClickEvent.Action a = he.action(); + if (a == ClickEvent.Action.OPEN_URL) return OPEN_URL_CLICK_EVENT_TYPE; + if (a == ClickEvent.Action.OPEN_FILE) return OPEN_FILE_CLICK_EVENT_TYPE; + if (a == ClickEvent.Action.RUN_COMMAND) return RUN_COMMAND_CLICK_EVENT_TYPE; + if (a == ClickEvent.Action.SUGGEST_COMMAND) return SUGGEST_COMMAND_CLICK_EVENT_TYPE; + if (a == ClickEvent.Action.CHANGE_PAGE) return CHANGE_PAGE_CLICK_EVENT_TYPE; + if (a == ClickEvent.Action.COPY_TO_CLIPBOARD) return COPY_TO_CLIPBOARD_CLICK_EVENT_TYPE; + if (a == ClickEvent.Action.SHOW_DIALOG) return SHOW_DIALOG_CLICK_EVENT_TYPE; + if (a == ClickEvent.Action.CUSTOM) return CUSTOM_CLICK_EVENT_TYPE; + throw new IllegalArgumentException("Unknown ClickEvent.Action: " + a); }; static final Codec CLICK_EVENT_CODEC = CLICK_EVENT_TYPE_CODEC.dispatch("action", GET_CLICK_EVENT_TYPE, ClickEventType::codec); @@ -471,7 +475,7 @@ public String getSerializedName() { } } - static final MapCodec> NBT_COMPONENT_MAP_CODEC = mapCodec((instance) -> { + static final MapCodec> NBT_COMPONENT_MAP_CODEC = mapCodec((instance) -> { return instance.group( Codec.STRING.fieldOf("nbt").forGetter(NBTComponent::nbtPath), Codec.BOOL.lenientOptionalFieldOf("interpret", false).forGetter(NBTComponent::interpret), @@ -506,7 +510,7 @@ public String getSerializedName() { static final ComponentType OBJECT = new ComponentType<>(OBJECT_COMPONENT_MAP_CODEC, ObjectComponent.class::isInstance, "object"); static final ComponentType SCORE = new ComponentType<>(SCORE_COMPONENT_MAP_CODEC, ScoreComponent.class::isInstance, "score"); static final ComponentType SELECTOR = new ComponentType<>(SELECTOR_COMPONENT_MAP_CODEC, SelectorComponent.class::isInstance, "selector"); - static final ComponentType> NBT = new ComponentType<>(NBT_COMPONENT_MAP_CODEC, NBTComponent.class::isInstance, "nbt"); + static final ComponentType> NBT = new ComponentType<>(NBT_COMPONENT_MAP_CODEC, NBTComponent.class::isInstance, "nbt"); static Codec createCodec(final Codec selfCodec) { final ExtraCodecs.LateBoundIdMapper> lateBoundIdMapper = new ExtraCodecs.LateBoundIdMapper<>(); diff --git a/src/main/java/io/papermc/paper/adventure/PaperAdventure.java b/src/main/java/io/papermc/paper/adventure/PaperAdventure.java index 885530b65..3993bfb43 100644 --- a/src/main/java/io/papermc/paper/adventure/PaperAdventure.java +++ b/src/main/java/io/papermc/paper/adventure/PaperAdventure.java @@ -30,7 +30,6 @@ import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.serializer.ComponentSerializer; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.kyori.adventure.translation.GlobalTranslator; import net.kyori.adventure.util.Codec; @@ -114,7 +113,7 @@ public final class PaperAdventure { .build(); public static final AttributeKey LOCALE_ATTRIBUTE = AttributeKey.valueOf("adventure:locale"); // init after FLATTENER because classloading triggered here might create a logger @Deprecated - public static final PlainComponentSerializer PLAIN = PlainComponentSerializer.builder().flattener(FLATTENER).build(); + // 26.2: Adventure 5 removed PlainComponentSerializer; PlainTextComponentSerializer replaces it. //public static final ANSIComponentSerializer ANSI_SERIALIZER = ANSIComponentSerializer.builder().flattener(FLATTENER).build(); private static final TagParser NBT_PARSER = TagParser.create(NbtOps.INSTANCE); public static final Codec NBT_CODEC = new Codec<>() { @@ -431,12 +430,14 @@ public record DataComponentValueImpl(com.mojang.serialization.Codec codec, // Colors + // 26.2: ChatFormatting no longer carries colour data; net.minecraft.world.scores.TeamColor does. public static @NotNull TextColor asAdventure(final ChatFormatting formatting) { - final Integer color = formatting.getColor(); - if (color == null) { + final net.minecraft.world.scores.TeamColor teamColor = + net.minecraft.world.scores.TeamColor.byName(formatting.name()); + if (teamColor == null) { throw new IllegalArgumentException("Not a valid color"); } - return TextColor.color(color); + return TextColor.color(teamColor.rgb()); } public static @Nullable ChatFormatting asVanilla(final TextColor color) { @@ -448,7 +449,9 @@ public record DataComponentValueImpl(com.mojang.serialization.Codec codec, @org.jspecify.annotations.Nullable public static ChatFormatting getByHexValue(int color) { for (ChatFormatting value : ChatFormatting.values()) { - if (value.getColor() != null && value.getColor() == color) { + final net.minecraft.world.scores.TeamColor tc = + net.minecraft.world.scores.TeamColor.byName(value.name()); + if (tc != null && tc.rgb() == color) { return value; } } diff --git a/src/main/java/io/papermc/paper/connection/PaperPlayerGameConnection.java b/src/main/java/io/papermc/paper/connection/PaperPlayerGameConnection.java index b2b5864bb..e2d2efebf 100644 --- a/src/main/java/io/papermc/paper/connection/PaperPlayerGameConnection.java +++ b/src/main/java/io/papermc/paper/connection/PaperPlayerGameConnection.java @@ -51,4 +51,12 @@ public boolean isConnected() { return getPlayer().isConnected(); } -} + + // 26.2: new on PlayerCommonConnection + @Override + public String getClientBrandName() { + // captured from the minecraft:brand custom payload by ServerCommonPacketListenerImplMixin_Brand + return ((org.cardboardpowered.bridge.server.network.ClientBrandBridge) this.handle).cardboard_getClientBrand(); + } + +} \ No newline at end of file diff --git a/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java b/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java index c5c00f133..9d1e4a1b8 100644 --- a/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java +++ b/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java @@ -185,6 +185,7 @@ public static void bootstrap() { register(DataComponents.TOOLTIP_DISPLAY, PaperTooltipDisplay::new); register(DataComponents.WEAPON, PaperWeapon::new); register(DataComponents.BLOCKS_ATTACKS, PaperBlocksAttacks::new); + register(DataComponents.SULFUR_CUBE_CONTENT, io.papermc.paper.datacomponent.item.PaperSulfurCubeContent::new); // 26.2: new component register(DataComponents.PIERCING_WEAPON, PaperPiercingWeapon::new); register(DataComponents.KINETIC_WEAPON, PaperKineticWeapon::new); register(DataComponents.ATTACK_RANGE, PaperAttackRange::new); diff --git a/src/main/java/io/papermc/paper/datacomponent/item/ItemComponentTypesBridgesImpl.java b/src/main/java/io/papermc/paper/datacomponent/item/ItemComponentTypesBridgesImpl.java index a02d5baa4..86acc4e48 100644 --- a/src/main/java/io/papermc/paper/datacomponent/item/ItemComponentTypesBridgesImpl.java +++ b/src/main/java/io/papermc/paper/datacomponent/item/ItemComponentTypesBridgesImpl.java @@ -307,4 +307,12 @@ public io.papermc.paper.datacomponent.item.AttackRange.Builder attackRange() { // TODO Auto-generated method stub return null; } -} + + // 26.2: new component type bridge + @Override + public io.papermc.paper.datacomponent.item.SulfurCubeContent sulfurCubeContent(org.bukkit.inventory.ItemStack stack) { + return new PaperSulfurCubeContent(net.minecraft.world.item.component.SulfurCubeContent.ofNonEmpty( + org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(stack))); + } + +} \ No newline at end of file diff --git a/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java b/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java index 1c626aec1..dcdeb4f39 100644 --- a/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java +++ b/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java @@ -8,7 +8,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import java.util.List; import java.util.Optional; -import net.minecraft.advancements.criterion.DataComponentMatchers; +import net.minecraft.advancements.predicates.DataComponentMatchers; import net.minecraft.core.registries.Registries; import net.minecraft.world.item.AdventureModePredicate; import org.bukkit.craftbukkit.util.Handleable; @@ -35,12 +35,12 @@ public List predicates() { static final class BuilderImpl implements ItemAdventurePredicate.Builder { - private final List predicates = new ObjectArrayList<>(); + private final List predicates = new ObjectArrayList<>(); private boolean showInTooltip = true; @Override public ItemAdventurePredicate.Builder addPredicate(BlockPredicate predicate) { - this.predicates.add(new net.minecraft.advancements.criterion.BlockPredicate(Optional.ofNullable(predicate.blocks()).map(blocks -> PaperRegistrySets.convertToNms(Registries.BLOCK, Conversions.global().lookup(), blocks)), Optional.empty(), Optional.empty(), DataComponentMatchers.ANY)); + this.predicates.add(new net.minecraft.advancements.predicates.BlockPredicate(Optional.ofNullable(predicate.blocks()).map(blocks -> PaperRegistrySets.convertToNms(Registries.BLOCK, Conversions.global().lookup(), blocks)), Optional.empty(), Optional.empty(), DataComponentMatchers.ANY)); return this; } diff --git a/src/main/java/io/papermc/paper/datacomponent/item/PaperSulfurCubeContent.java b/src/main/java/io/papermc/paper/datacomponent/item/PaperSulfurCubeContent.java new file mode 100644 index 000000000..3509e4bf0 --- /dev/null +++ b/src/main/java/io/papermc/paper/datacomponent/item/PaperSulfurCubeContent.java @@ -0,0 +1,22 @@ +package io.papermc.paper.datacomponent.item; + +import net.minecraft.world.item.component.SulfurCubeContent; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.Handleable; + +// 26.2: SULFUR_CUBE_CONTENT is a new data component type. +public record PaperSulfurCubeContent(SulfurCubeContent impl) + implements io.papermc.paper.datacomponent.item.SulfurCubeContent, Handleable { + + @Override + public SulfurCubeContent getHandle() { + return this.impl; + } + + @Override + public org.bukkit.inventory.ItemStack absorbedItem() { + // ItemStackTemplate -> ItemStack; apply an empty patch to materialise the stack + return CraftItemStack.asCraftMirror( + this.impl.absorbedBlockItemStack().apply(net.minecraft.core.component.DataComponentPatch.EMPTY)); + } +} diff --git a/src/main/java/io/papermc/paper/datacomponent/item/PaperWritableBookContent.java b/src/main/java/io/papermc/paper/datacomponent/item/PaperWritableBookContent.java index 559343a33..07b6be689 100644 --- a/src/main/java/io/papermc/paper/datacomponent/item/PaperWritableBookContent.java +++ b/src/main/java/io/papermc/paper/datacomponent/item/PaperWritableBookContent.java @@ -19,6 +19,19 @@ public net.minecraft.world.item.component.WritableBookContent getHandle() { return this.impl; } + // 26.2: Adventure 5 BookLike + @Override + public net.kyori.adventure.inventory.Book asBook() { + java.util.List bookPages = new java.util.ArrayList<>(); + for (Filtered page : this.pages()) { + bookPages.add(net.kyori.adventure.text.Component.text(page.raw())); + } + return net.kyori.adventure.inventory.Book.book( + net.kyori.adventure.text.Component.empty(), + net.kyori.adventure.text.Component.empty(), + bookPages); + } + @Override public @Unmodifiable List> pages() { return MCUtil.transformUnmodifiable(this.impl.pages(), input -> Filtered.of(input.raw(), input.filtered().orElse(null))); diff --git a/src/main/java/io/papermc/paper/datacomponent/item/PaperWrittenBookContent.java b/src/main/java/io/papermc/paper/datacomponent/item/PaperWrittenBookContent.java index 037a6695b..312607890 100644 --- a/src/main/java/io/papermc/paper/datacomponent/item/PaperWrittenBookContent.java +++ b/src/main/java/io/papermc/paper/datacomponent/item/PaperWrittenBookContent.java @@ -27,6 +27,19 @@ public net.minecraft.world.item.component.WrittenBookContent getHandle() { return this.impl; } + // 26.2: Adventure 5 BookLike + @Override + public net.kyori.adventure.inventory.Book asBook() { + java.util.List bookPages = new java.util.ArrayList<>(); + for (net.minecraft.server.network.Filterable page : this.impl.pages()) { + bookPages.add(io.papermc.paper.adventure.PaperAdventure.asAdventure(page.raw())); + } + return net.kyori.adventure.inventory.Book.book( + net.kyori.adventure.text.Component.text(this.impl.title().raw()), + net.kyori.adventure.text.Component.text(this.impl.author()), + bookPages); + } + @Override public Filtered title() { return Filtered.of(this.impl.title().raw(), this.impl.title().filtered().orElse(null)); diff --git a/src/main/java/io/papermc/paper/entity/PaperBucketable.java b/src/main/java/io/papermc/paper/entity/PaperBucketable.java index d3fc2e5db..a75ffe98c 100644 --- a/src/main/java/io/papermc/paper/entity/PaperBucketable.java +++ b/src/main/java/io/papermc/paper/entity/PaperBucketable.java @@ -7,7 +7,7 @@ public interface PaperBucketable extends Bucketable { - net.minecraft.world.entity.animal.Bucketable getHandle(); + net.minecraft.world.entity.Bucketable getHandle(); @Override default boolean isFromBucket() { diff --git a/src/main/java/io/papermc/paper/registry/data/InlinedRegistryBuilderProviderImpl.java b/src/main/java/io/papermc/paper/registry/data/InlinedRegistryBuilderProviderImpl.java index 270f90cf3..9aed0fd67 100644 --- a/src/main/java/io/papermc/paper/registry/data/InlinedRegistryBuilderProviderImpl.java +++ b/src/main/java/io/papermc/paper/registry/data/InlinedRegistryBuilderProviderImpl.java @@ -45,4 +45,26 @@ public io.papermc.paper.dialog.Dialog createDialog( } + + // 26.2: new on InlinedRegistryBuilderProvider + @Override + public org.bukkit.inventory.meta.trim.TrimPattern createTrimPattern( + java.util.function.Consumer> value) { + return Conversions.global().createApiInstanceFromBuilder( + io.papermc.paper.registry.RegistryKey.TRIM_PATTERN, value); + } + + + // 26.2: new on InlinedRegistryBuilderProvider + @Override + public org.bukkit.inventory.meta.trim.TrimMaterial createTrimMaterial( + java.util.function.Consumer> value) { + return Conversions.global().createApiInstanceFromBuilder( + io.papermc.paper.registry.RegistryKey.TRIM_MATERIAL, value); + } + } diff --git a/src/main/java/io/papermc/paper/world/damagesource/PaperCombatTrackerWrapper.java b/src/main/java/io/papermc/paper/world/damagesource/PaperCombatTrackerWrapper.java index 7e3ae6d92..db5b3dbaf 100644 --- a/src/main/java/io/papermc/paper/world/damagesource/PaperCombatTrackerWrapper.java +++ b/src/main/java/io/papermc/paper/world/damagesource/PaperCombatTrackerWrapper.java @@ -113,4 +113,11 @@ public static FallLocationType minecraftToPaper(FallLocation fallLocation) { return fallLocationType; } -} + + // 26.2: new on CombatTracker + @Override + public int getLastDamageTime() { + return this.handle.lastDamageTime; + } + +} \ No newline at end of file diff --git a/src/main/java/io/papermc/paper/world/saveddata/PaperLevelOverrides.java b/src/main/java/io/papermc/paper/world/saveddata/PaperLevelOverrides.java index f7b0e97c0..4c0d19f95 100644 --- a/src/main/java/io/papermc/paper/world/saveddata/PaperLevelOverrides.java +++ b/src/main/java/io/papermc/paper/world/saveddata/PaperLevelOverrides.java @@ -245,4 +245,11 @@ public static RespawnData fromVanilla(final LevelData.RespawnData respawnData) { return new RespawnData(respawnData.pos(), respawnData.yaw(), respawnData.pitch()).normalized(); } } -} + + // 26.2: new on ServerLevelData + @Override + public void setAllowCommands(boolean allowCommands) { + this.rootDataOrThrow().setAllowCommands(allowCommands); + } + +} \ No newline at end of file diff --git a/src/main/java/org/bukkit/craftbukkit/CraftEffect.java b/src/main/java/org/bukkit/craftbukkit/CraftEffect.java index 8ebe8f85e..e099f9849 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftEffect.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftEffect.java @@ -16,14 +16,14 @@ public static int getDataValue(Effect effect, T data) { int datavalue; switch (effect) { // Paper start - add missing effects - case PARTICLES_SCULK_CHARGE: + case SCULK_CHARGE: // 26.2: renamed (old name is now an alias field) case TRIAL_SPAWNER_DETECT_PLAYER: case BEE_GROWTH: case TURTLE_EGG_PLACEMENT: case SMASH_ATTACK: case TRIAL_SPAWNER_DETECT_PLAYER_OMINOUS: // Paper end - add missing effects - case VILLAGER_PLANT_GROW: + // 26.2: VILLAGER_PLANT_GROW is now an alias for BEE_GROWTH, already handled above datavalue = (Integer) data; break; case POTION_BREAK: @@ -35,13 +35,13 @@ public static int getDataValue(Effect effect, T data) { datavalue = Item.getId(CraftItemType.bukkitToMinecraft((Material) data)); break; // Paper start - handle shoot white smoke event - case SHOOT_WHITE_SMOKE: + case WHITE_SMOKE_SHOOT: // 26.2: renamed final BlockFace face = (BlockFace) data; Preconditions.checkArgument(face.isCartesian(), face + " isn't cartesian"); datavalue = org.bukkit.craftbukkit.block.CraftBlock.blockFaceToNotch(face).get3DDataValue(); break; // Paper end - handle shoot white smoke event - case SMOKE: + case SMOKE_SHOOT: // 26.2: renamed switch ((BlockFace) data) { case DOWN: // SPIGOT-6318: Fallback value for the old directions @@ -78,7 +78,7 @@ public static int getDataValue(Effect effect, T data) { // Paper start - support BlockData break; } - case PARTICLES_AND_SOUND_BRUSH_BLOCK_COMPLETE: + case BRUSH_BLOCK_COMPLETE: // 26.2: renamed datavalue = Block.getId(((org.bukkit.craftbukkit.block.data.CraftBlockData) data).getState()); // Paper end break; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index bad7b7c33..4b89da679 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -239,7 +239,7 @@ public class CraftServer extends CardboardAbstractServer implements Server { public final String serverName = "Cardboard"; - public final String bukkitVersion = "26.1.2"; // "1.21.11-R0.1-SNAPSHOT"; // "1.21.10-R0.1-SNAPSHOT"; // "1.21.8-R0.1-SNAPSHOT"; // "1.21.1-R0.1-SNAPSHOT"; + public final String bukkitVersion = "26.2"; // "26.1.2"; // "1.21.11-R0.1-SNAPSHOT"; // "1.21.10-R0.1-SNAPSHOT"; // "1.21.8-R0.1-SNAPSHOT"; // "1.21.1-R0.1-SNAPSHOT"; private final Logger logger = BukkitLogger.getLogger(); @@ -1008,7 +1008,13 @@ public BiomeProvider getBiomeProvider(String world) { public boolean dispatchCommand(CommandSender sender, String commandLine) throws CommandException { if(sender instanceof Entity) { ServerLevel world = (ServerLevel) ((CraftEntity) sender).getHandle().level(); - CommandSourceStack source = ((CraftEntity) sender).getHandle().createCommandSourceStackForNameResolution(world); + // A name-resolution source discards all command feedback, so commands whose + // only result is text (/list, /help) appeared to do nothing. Players get a + // real source that routes success/failure back to them. + net.minecraft.world.entity.Entity handle = ((CraftEntity) sender).getHandle(); + CommandSourceStack source = (handle instanceof net.minecraft.server.level.ServerPlayer serverPlayer) + ? serverPlayer.createCommandSourceStack() + : handle.createCommandSourceStackForNameResolution(world); try { String theCommand; @@ -2036,9 +2042,14 @@ public OfflinePlayer getOfflinePlayerIfCached(String arg0) { return null; } + /** Bukkit's stock permission-denied text, overridable via bukkit.yml. */ + private static final String DEFAULT_PERMISSION_MESSAGE = + "I'm sorry, but you do not have permission to perform this command. " + + "Please contact the server administrators if you believe that this is in error."; + @Override public String getPermissionMessage() { - return "No Permission"; + return this.configuration.getString("settings.permissions-message", DEFAULT_PERMISSION_MESSAGE); } @Override @@ -2347,8 +2358,8 @@ public boolean isTickingWorlds() { @Override public @NotNull Component permissionMessage() { - // TODO Auto-generated method stub - return Component.text("todo: permissionMessage"); + return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection() + .deserialize(this.getPermissionMessage()); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CapturedBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CapturedBlockState.java index 6b5853ced..0629c810a 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CapturedBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CapturedBlockState.java @@ -1,5 +1,7 @@ package org.bukkit.craftbukkit.block; +import net.minecraft.world.level.block.entity.BlockEntityTypes; + import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.level.Level; @@ -53,7 +55,7 @@ private void addBees() { RandomSource randomSource = worldGenLevel.getRandom(); // Begin copied block from BeehiveDecorator - worldGenLevel.getBlockEntity(pos, BlockEntityType.BEEHIVE).ifPresent(beehiveBlockEntity -> { + worldGenLevel.getBlockEntity(pos, BlockEntityTypes.BEEHIVE).ifPresent(beehiveBlockEntity -> { int i1 = 2 + randomSource.nextInt(2); for (int i2 = 0; i2 < i1; i2++) { diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java index 96b08722e..29ead5984 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java @@ -1,8 +1,8 @@ package org.bukkit.craftbukkit.block; -import net.minecraft.advancements.criterion.DataComponentMatchers; -import net.minecraft.advancements.criterion.ItemPredicate; -import net.minecraft.advancements.criterion.MinMaxBounds; +import net.minecraft.advancements.predicates.DataComponentMatchers; +import net.minecraft.advancements.predicates.ItemPredicate; +import net.minecraft.advancements.predicates.MinMaxBounds; import net.minecraft.core.component.DataComponentExactPredicate; import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponents; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java index 473dfc398..90145a10b 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java @@ -1,15 +1,28 @@ package org.bukkit.craftbukkit.block; -import net.minecraft.world.level.block.entity.BedBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTypes; + import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Bed; +import org.bukkit.block.Block; + +// 26.2: beds no longer have a BlockEntity (BlockEntityTypes.BED was removed), +// so this is now a plain CraftBlockState registered per bed Material. +public class CraftBed extends CraftBlockState implements Bed { -public class CraftBed extends CraftBlockEntityState implements Bed { + private final org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer persistentDataContainer = + new org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer( + new org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry()); - public CraftBed(World world, BedBlockEntity blockEntity) { - super(world, blockEntity); + public CraftBed(Block block) { + super(block); + } + + public CraftBed(World world, net.minecraft.core.BlockPos pos, + net.minecraft.world.level.block.state.BlockState data) { + super(world, pos, data); } protected CraftBed(CraftBed state, Location location) { @@ -44,6 +57,20 @@ public void setColor(DyeColor color) { throw new UnsupportedOperationException("Must set block type to appropriate bed colour"); } + // 26.2: Bed still extends TileState in the Bukkit API even though MC removed + // the bed BlockEntity, so these are satisfied without a backing block entity. + @Override + public boolean isSnapshot() { + return false; + } + + @Override + public org.bukkit.persistence.PersistentDataContainer getPersistentDataContainer() { + // Beds have no BlockEntity in 26.2, so there is nothing to persist to. + // The container is real but not backed by storage; writes will not survive. + return this.persistentDataContainer; + } + @Override public CraftBed copy() { return new CraftBed(this, null); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java index 94be21d23..aa3a9073a 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java @@ -12,6 +12,7 @@ import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.BlockEntityTypes; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; @@ -85,55 +86,70 @@ private static void register(BlockEntityType type, BlockStateFactory facto static { // Start generate - CraftBlockEntityStates - register(BlockEntityType.BANNER, CraftBanner.class, CraftBanner::new); - register(BlockEntityType.BARREL, CraftBarrel.class, CraftBarrel::new); - register(BlockEntityType.BEACON, CraftBeacon.class, CraftBeacon::new); - register(BlockEntityType.BED, CraftBed.class, CraftBed::new); - register(BlockEntityType.BEEHIVE, CraftBeehive.class, CraftBeehive::new); - register(BlockEntityType.BELL, CraftBell.class, CraftBell::new); - register(BlockEntityType.BLAST_FURNACE, CraftBlastFurnace.class, CraftBlastFurnace::new); - register(BlockEntityType.BREWING_STAND, CraftBrewingStand.class, CraftBrewingStand::new); - register(BlockEntityType.BRUSHABLE_BLOCK, CraftBrushableBlock.class, CraftBrushableBlock::new); - register(BlockEntityType.CALIBRATED_SCULK_SENSOR, CraftCalibratedSculkSensor.class, CraftCalibratedSculkSensor::new); - register(BlockEntityType.CAMPFIRE, CraftCampfire.class, CraftCampfire::new); - register(BlockEntityType.CHEST, CraftChest.class, CraftChest::new); - register(BlockEntityType.CHISELED_BOOKSHELF, CraftChiseledBookshelf.class, CraftChiseledBookshelf::new); - register(BlockEntityType.COMMAND_BLOCK, CraftCommandBlock.class, CraftCommandBlock::new); - register(BlockEntityType.COMPARATOR, CraftComparator.class, CraftComparator::new); - register(BlockEntityType.CONDUIT, CraftConduit.class, CraftConduit::new); - register(BlockEntityType.COPPER_GOLEM_STATUE, CraftCopperGolemStatue.class, CraftCopperGolemStatue::new); - register(BlockEntityType.CRAFTER, CraftCrafter.class, CraftCrafter::new); - register(BlockEntityType.CREAKING_HEART, CraftCreakingHeart.class, CraftCreakingHeart::new); - register(BlockEntityType.DAYLIGHT_DETECTOR, CraftDaylightDetector.class, CraftDaylightDetector::new); - register(BlockEntityType.DECORATED_POT, CraftDecoratedPot.class, CraftDecoratedPot::new); - register(BlockEntityType.DISPENSER, CraftDispenser.class, CraftDispenser::new); - register(BlockEntityType.DROPPER, CraftDropper.class, CraftDropper::new); - register(BlockEntityType.ENCHANTING_TABLE, CraftEnchantingTable.class, CraftEnchantingTable::new); - register(BlockEntityType.END_GATEWAY, CraftEndGateway.class, CraftEndGateway::new); - register(BlockEntityType.END_PORTAL, CraftEndPortal.class, CraftEndPortal::new); - register(BlockEntityType.ENDER_CHEST, CraftEnderChest.class, CraftEnderChest::new); - register(BlockEntityType.FURNACE, CraftFurnaceFurnace.class, CraftFurnaceFurnace::new); - register(BlockEntityType.HANGING_SIGN, CraftHangingSign.class, CraftHangingSign::new); - register(BlockEntityType.HOPPER, CraftHopper.class, CraftHopper::new); - register(BlockEntityType.JIGSAW, CraftJigsaw.class, CraftJigsaw::new); - register(BlockEntityType.JUKEBOX, CraftJukebox.class, CraftJukebox::new); - register(BlockEntityType.LECTERN, CraftLectern.class, CraftLectern::new); - register(BlockEntityType.MOB_SPAWNER, CraftCreatureSpawner.class, CraftCreatureSpawner::new); - register(BlockEntityType.PISTON, CraftMovingPiston.class, CraftMovingPiston::new); - register(BlockEntityType.SCULK_CATALYST, CraftSculkCatalyst.class, CraftSculkCatalyst::new); - register(BlockEntityType.SCULK_SENSOR, CraftSculkSensor.class, CraftSculkSensor::new); - register(BlockEntityType.SCULK_SHRIEKER, CraftSculkShrieker.class, CraftSculkShrieker::new); - register(BlockEntityType.SHELF, CraftShelf.class, CraftShelf::new); - register(BlockEntityType.SHULKER_BOX, CraftShulkerBox.class, CraftShulkerBox::new); - register(BlockEntityType.SIGN, CraftSign.class, CraftSign::new); - register(BlockEntityType.SKULL, CraftSkull.class, CraftSkull::new); - register(BlockEntityType.SMOKER, CraftSmoker.class, CraftSmoker::new); - register(BlockEntityType.STRUCTURE_BLOCK, CraftStructureBlock.class, CraftStructureBlock::new); - register(BlockEntityType.TEST_BLOCK, CraftTestBlock.class, CraftTestBlock::new); - register(BlockEntityType.TEST_INSTANCE_BLOCK, CraftTestInstanceBlock.class, CraftTestInstanceBlock::new); - register(BlockEntityType.TRAPPED_CHEST, CraftChest.class, CraftChest::new); - register(BlockEntityType.TRIAL_SPAWNER, CraftTrialSpawner.class, CraftTrialSpawner::new); - register(BlockEntityType.VAULT, CraftVault.class, CraftVault::new); + register(BlockEntityTypes.BANNER, CraftBanner.class, CraftBanner::new); + register(BlockEntityTypes.BARREL, CraftBarrel.class, CraftBarrel::new); + register(BlockEntityTypes.BEACON, CraftBeacon.class, CraftBeacon::new); + // 26.2: BlockEntityTypes.BED was removed; beds are a plain block state now, + // so register CraftBed per bed Material instead of by block-entity type. + BlockStateFactory bedFactory = new BlockStateFactory<>(CraftBed.class) { + @Override + public CraftBed createBlockState(World world, BlockPos pos, + net.minecraft.world.level.block.state.BlockState state, BlockEntity blockEntity) { + return new CraftBed(world, pos, state); + } + }; + for (Material material : Material.values()) { + if (material.name().endsWith("_BED")) { + register(material, bedFactory); + } + } + register(BlockEntityTypes.BEEHIVE, CraftBeehive.class, CraftBeehive::new); + register(BlockEntityTypes.BELL, CraftBell.class, CraftBell::new); + register(BlockEntityTypes.BLAST_FURNACE, CraftBlastFurnace.class, CraftBlastFurnace::new); + register(BlockEntityTypes.BREWING_STAND, CraftBrewingStand.class, CraftBrewingStand::new); + register(BlockEntityTypes.BRUSHABLE_BLOCK, CraftBrushableBlock.class, CraftBrushableBlock::new); + register(BlockEntityTypes.CALIBRATED_SCULK_SENSOR, CraftCalibratedSculkSensor.class, CraftCalibratedSculkSensor::new); + register(BlockEntityTypes.CAMPFIRE, CraftCampfire.class, CraftCampfire::new); + register(BlockEntityTypes.CHEST, CraftChest.class, CraftChest::new); + register(BlockEntityTypes.CHISELED_BOOKSHELF, CraftChiseledBookshelf.class, CraftChiseledBookshelf::new); + register(BlockEntityTypes.COMMAND_BLOCK, CraftCommandBlock.class, CraftCommandBlock::new); + register(BlockEntityTypes.COMPARATOR, CraftComparator.class, CraftComparator::new); + register(BlockEntityTypes.CONDUIT, CraftConduit.class, CraftConduit::new); + register(BlockEntityTypes.COPPER_GOLEM_STATUE, CraftCopperGolemStatue.class, CraftCopperGolemStatue::new); + register(BlockEntityTypes.CRAFTER, CraftCrafter.class, CraftCrafter::new); + register(BlockEntityTypes.CREAKING_HEART, CraftCreakingHeart.class, CraftCreakingHeart::new); + register(BlockEntityTypes.DAYLIGHT_DETECTOR, CraftDaylightDetector.class, CraftDaylightDetector::new); + register(BlockEntityTypes.DECORATED_POT, CraftDecoratedPot.class, CraftDecoratedPot::new); + register(BlockEntityTypes.DISPENSER, CraftDispenser.class, CraftDispenser::new); + register(BlockEntityTypes.DROPPER, CraftDropper.class, CraftDropper::new); + register(BlockEntityTypes.ENCHANTING_TABLE, CraftEnchantingTable.class, CraftEnchantingTable::new); + register(BlockEntityTypes.END_GATEWAY, CraftEndGateway.class, CraftEndGateway::new); + register(BlockEntityTypes.END_PORTAL, CraftEndPortal.class, CraftEndPortal::new); + register(BlockEntityTypes.ENDER_CHEST, CraftEnderChest.class, CraftEnderChest::new); + register(BlockEntityTypes.FURNACE, CraftFurnaceFurnace.class, CraftFurnaceFurnace::new); + register(BlockEntityTypes.HANGING_SIGN, CraftHangingSign.class, CraftHangingSign::new); + register(BlockEntityTypes.HOPPER, CraftHopper.class, CraftHopper::new); + register(BlockEntityTypes.JIGSAW, CraftJigsaw.class, CraftJigsaw::new); + register(BlockEntityTypes.JUKEBOX, CraftJukebox.class, CraftJukebox::new); + register(BlockEntityTypes.LECTERN, CraftLectern.class, CraftLectern::new); + register(BlockEntityTypes.MOB_SPAWNER, CraftCreatureSpawner.class, CraftCreatureSpawner::new); + register(BlockEntityTypes.PISTON, CraftMovingPiston.class, CraftMovingPiston::new); + register(BlockEntityTypes.SCULK_CATALYST, CraftSculkCatalyst.class, CraftSculkCatalyst::new); + register(BlockEntityTypes.SCULK_SENSOR, CraftSculkSensor.class, CraftSculkSensor::new); + register(BlockEntityTypes.SCULK_SHRIEKER, CraftSculkShrieker.class, CraftSculkShrieker::new); + register(BlockEntityTypes.SHELF, CraftShelf.class, CraftShelf::new); + register(BlockEntityTypes.SHULKER_BOX, CraftShulkerBox.class, CraftShulkerBox::new); + register(BlockEntityTypes.SIGN, CraftSign.class, CraftSign::new); + register(BlockEntityTypes.SKULL, CraftSkull.class, CraftSkull::new); + register(BlockEntityTypes.SMOKER, CraftSmoker.class, CraftSmoker::new); + register(BlockEntityTypes.STRUCTURE_BLOCK, CraftStructureBlock.class, CraftStructureBlock::new); + register(BlockEntityTypes.TEST_BLOCK, CraftTestBlock.class, CraftTestBlock::new); + register(BlockEntityTypes.TEST_INSTANCE_BLOCK, CraftTestInstanceBlock.class, CraftTestInstanceBlock::new); + register(BlockEntityTypes.TRAPPED_CHEST, CraftChest.class, CraftChest::new); + register(BlockEntityTypes.TRIAL_SPAWNER, CraftTrialSpawner.class, CraftTrialSpawner::new); + register(BlockEntityTypes.VAULT, CraftVault.class, CraftVault::new); + // 26.2: new block entity + register(BlockEntityTypes.POTENT_SULFUR, CraftPotentSulfur.class, CraftPotentSulfur::new); // End generate - CraftBlockEntityStates } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java index 9cc2bd8f3..a155f7000 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java @@ -2,9 +2,9 @@ import java.util.Collections; import java.util.Optional; -import net.minecraft.advancements.criterion.DataComponentMatchers; -import net.minecraft.advancements.criterion.ItemPredicate; -import net.minecraft.advancements.criterion.MinMaxBounds; +import net.minecraft.advancements.predicates.DataComponentMatchers; +import net.minecraft.advancements.predicates.ItemPredicate; +import net.minecraft.advancements.predicates.MinMaxBounds; import net.minecraft.core.component.DataComponentExactPredicate; import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponents; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCreakingHeart.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCreakingHeart.java index f8f4b1db6..a3c5d0aa5 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftCreakingHeart.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCreakingHeart.java @@ -24,4 +24,42 @@ public CraftCreakingHeart copy() { public CraftCreakingHeart copy(Location location) { return new CraftCreakingHeart(this, location); } + + // 26.2: new on CreakingHeart + @Override + public org.bukkit.Location spreadResin() { + // Paper implements resin spreading inside its patched server; there is no + // equivalent hook on the vanilla block entity to delegate to. + throw new UnsupportedOperationException("spreadResin is not supported on Cardboard"); + } + + + // 26.2: CreakingHeart gained creaking accessors + @Override + public org.bukkit.entity.Creaking getCreaking() { + final com.mojang.datafixers.util.Either + info = this.getSnapshot().creakingInfo; + if (info == null) return null; + return info.left() + .map(c -> (org.bukkit.entity.Creaking) c.getBukkitEntity()) + .orElse(null); + } + + @Override + public void setCreaking(org.bukkit.entity.Creaking creaking) { + if (creaking == null) { + this.getSnapshot().creakingInfo = null; + return; + } + this.getSnapshot().setCreakingInfo( + (net.minecraft.world.entity.monster.creaking.Creaking) + ((org.bukkit.craftbukkit.entity.CraftEntity) creaking).getHandle()); + } + + @Override + public org.bukkit.entity.Creaking spawnCreaking() { + // Paper spawns the creaking from its patched block-entity tick; not reachable here. + throw new UnsupportedOperationException("spawnCreaking is not supported on Cardboard"); + } + } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftPotentSulfur.java b/src/main/java/org/bukkit/craftbukkit/block/CraftPotentSulfur.java new file mode 100644 index 000000000..c4277297d --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftPotentSulfur.java @@ -0,0 +1,29 @@ +package org.bukkit.craftbukkit.block; + +import net.minecraft.world.level.block.entity.PotentSulfurBlockEntity; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.PotentSulfur; + +// 26.2: Potent Sulfur is a new block entity. The Bukkit interface adds no +// members beyond TileState, so this is a plain block-entity state wrapper. +public class CraftPotentSulfur extends CraftBlockEntityState implements PotentSulfur { + + public CraftPotentSulfur(World world, PotentSulfurBlockEntity blockEntity) { + super(world, blockEntity); + } + + protected CraftPotentSulfur(CraftPotentSulfur state, Location location) { + super(state, location); + } + + @Override + public CraftPotentSulfur copy() { + return new CraftPotentSulfur(this, null); + } + + @Override + public CraftPotentSulfur copy(Location location) { + return new CraftPotentSulfur(this, location); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPointedDripstone.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPointedDripstone.java index 2e58ec8a5..ee1ec949a 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPointedDripstone.java +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPointedDripstone.java @@ -6,7 +6,7 @@ import net.minecraft.world.level.block.PointedDripstoneBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.level.block.state.properties.DripstoneThickness; +import net.minecraft.world.level.block.state.properties.SpeleothemThickness; import net.minecraft.world.level.block.state.properties.EnumProperty; import org.bukkit.block.BlockFace; import org.bukkit.block.data.type.PointedDripstone; @@ -18,7 +18,7 @@ @NullMarked @GeneratedClass public class CraftPointedDripstone extends CraftBlockData implements PointedDripstone { - private static final EnumProperty THICKNESS = PointedDripstoneBlock.THICKNESS; + private static final EnumProperty THICKNESS = PointedDripstoneBlock.THICKNESS; private static final EnumProperty TIP_DIRECTION = PointedDripstoneBlock.TIP_DIRECTION; diff --git a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java index 1f3e88eda..1f7588b87 100644 --- a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java +++ b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java @@ -115,4 +115,17 @@ public static DamageSource buildFromBukkit(DamageType damageType, Entity causing return new CraftDamageSource(new net.minecraft.world.damagesource.DamageSource(holderDamageType, nmsDirectEntity, nmsCausingEntity, sourcePos)); } -} + + // 26.2: DamageSource now carries an adventure Pointers context + @Override + public net.kyori.adventure.pointer.Pointers getDamageContext() { + return this.damageContext == null ? net.kyori.adventure.pointer.Pointers.empty() : this.damageContext; + } + + public void setDamageContext(net.kyori.adventure.pointer.Pointers damageContext) { + this.damageContext = damageContext; + } + + private net.kyori.adventure.pointer.Pointers damageContext; + +} \ No newline at end of file diff --git a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java index a8e47720c..cf370a56d 100644 --- a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java +++ b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java @@ -41,7 +41,26 @@ public DamageSource.Builder withDamageLocation(Location location) { @Override public DamageSource build() { - return CraftDamageSource.buildFromBukkit(this.damageType, this.causingEntity, this.directEntity, this.damageLocation); + final DamageSource built = CraftDamageSource.buildFromBukkit( + this.damageType, this.causingEntity, this.directEntity, this.damageLocation); + // 26.2: carry the damage context onto the built source + if (this.damageContext != null && built instanceof CraftDamageSource craft) { + craft.setDamageContext(this.damageContext); + } + return built; } -} + + // 26.2: DamageSource.Builder gained a damage-context hook + @Override + public org.bukkit.damage.DamageSource.Builder withDamageContext( + java.util.function.Consumer consumer) { + final net.kyori.adventure.pointer.Pointers.Builder builder = net.kyori.adventure.pointer.Pointers.builder(); + consumer.accept(builder); + this.damageContext = builder.build(); + return this; + } + + private net.kyori.adventure.pointer.Pointers damageContext; + +} \ No newline at end of file diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java index d4ae2e365..4137d4f13 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.vehicle.boat.AbstractBoat; import org.bukkit.TreeSpecies; import org.bukkit.craftbukkit.CraftServer; @@ -108,39 +109,39 @@ public Status getStatus() { } public static Type boatTypeFromNms(EntityType boatType) { - if (boatType == EntityType.OAK_BOAT || boatType == EntityType.OAK_CHEST_BOAT) { + if (boatType == EntityTypes.OAK_BOAT || boatType == EntityTypes.OAK_CHEST_BOAT) { return Type.OAK; } - if (boatType == EntityType.BIRCH_BOAT || boatType == EntityType.BIRCH_CHEST_BOAT) { + if (boatType == EntityTypes.BIRCH_BOAT || boatType == EntityTypes.BIRCH_CHEST_BOAT) { return Type.BIRCH; } - if (boatType == EntityType.ACACIA_BOAT || boatType == EntityType.ACACIA_CHEST_BOAT) { + if (boatType == EntityTypes.ACACIA_BOAT || boatType == EntityTypes.ACACIA_CHEST_BOAT) { return Type.ACACIA; } - if (boatType == EntityType.CHERRY_BOAT || boatType == EntityType.CHERRY_CHEST_BOAT) { + if (boatType == EntityTypes.CHERRY_BOAT || boatType == EntityTypes.CHERRY_CHEST_BOAT) { return Type.CHERRY; } - if (boatType == EntityType.JUNGLE_BOAT || boatType == EntityType.JUNGLE_CHEST_BOAT) { + if (boatType == EntityTypes.JUNGLE_BOAT || boatType == EntityTypes.JUNGLE_CHEST_BOAT) { return Type.JUNGLE; } - if (boatType == EntityType.SPRUCE_BOAT || boatType == EntityType.SPRUCE_CHEST_BOAT) { + if (boatType == EntityTypes.SPRUCE_BOAT || boatType == EntityTypes.SPRUCE_CHEST_BOAT) { return Type.SPRUCE; } - if (boatType == EntityType.DARK_OAK_BOAT || boatType == EntityType.DARK_OAK_CHEST_BOAT) { + if (boatType == EntityTypes.DARK_OAK_BOAT || boatType == EntityTypes.DARK_OAK_CHEST_BOAT) { return Type.DARK_OAK; } - if (boatType == EntityType.MANGROVE_BOAT || boatType == EntityType.MANGROVE_CHEST_BOAT) { + if (boatType == EntityTypes.MANGROVE_BOAT || boatType == EntityTypes.MANGROVE_CHEST_BOAT) { return Type.MANGROVE; } - if (boatType == EntityType.BAMBOO_RAFT || boatType == EntityType.BAMBOO_CHEST_RAFT) { + if (boatType == EntityTypes.BAMBOO_RAFT || boatType == EntityTypes.BAMBOO_CHEST_RAFT) { return Type.BAMBOO; } @@ -160,23 +161,23 @@ public static Status boatStatusFromNms(AbstractBoat.Status enumStatus) { // Pape @Deprecated public static TreeSpecies getTreeSpecies(EntityType boatType) { - if (boatType == EntityType.SPRUCE_BOAT || boatType == EntityType.SPRUCE_CHEST_BOAT) { + if (boatType == EntityTypes.SPRUCE_BOAT || boatType == EntityTypes.SPRUCE_CHEST_BOAT) { return TreeSpecies.REDWOOD; } - if (boatType == EntityType.BIRCH_BOAT || boatType == EntityType.BIRCH_CHEST_BOAT) { + if (boatType == EntityTypes.BIRCH_BOAT || boatType == EntityTypes.BIRCH_CHEST_BOAT) { return TreeSpecies.BIRCH; } - if (boatType == EntityType.JUNGLE_BOAT || boatType == EntityType.JUNGLE_CHEST_BOAT) { + if (boatType == EntityTypes.JUNGLE_BOAT || boatType == EntityTypes.JUNGLE_CHEST_BOAT) { return TreeSpecies.JUNGLE; } - if (boatType == EntityType.ACACIA_BOAT || boatType == EntityType.ACACIA_CHEST_BOAT) { + if (boatType == EntityTypes.ACACIA_BOAT || boatType == EntityTypes.ACACIA_CHEST_BOAT) { return TreeSpecies.ACACIA; } - if (boatType == EntityType.DARK_OAK_BOAT || boatType == EntityType.DARK_OAK_CHEST_BOAT) { + if (boatType == EntityTypes.DARK_OAK_BOAT || boatType == EntityTypes.DARK_OAK_CHEST_BOAT) { return TreeSpecies.DARK_OAK; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index 1d6c524d0..0693cbf4c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -267,6 +267,14 @@ public World getWorld() { return ((LevelBridge)this.entity.level()).cardboard$getWorld(); } + // 26.2: Paper added an Angle-based overload supporting relative rotation + @Override + public void setRotation(io.papermc.paper.math.Angle yaw, io.papermc.paper.math.Angle pitch) { + float y = yaw.relative() ? this.getHandle().getYRot() + yaw.degrees() : yaw.degrees(); + float p = pitch.relative() ? this.getHandle().getXRot() + pitch.degrees() : pitch.degrees(); + this.setRotation(y, p); + } + @Override public void setRotation(float yaw, float pitch) { NumberConversions.checkFinite(pitch, "pitch not finite"); @@ -1036,7 +1044,7 @@ private Entity copy(net.minecraft.world.level.Level level) { final TagValueOutput output = TagValueOutput.createWithContext(problemReporter, level.registryAccess()); this.getHandle().saveAsPassenger(output);//, false, true, true); // TODO - return net.minecraft.world.entity.EntityType.loadEntityRecursive(output.buildResult(), level, EntitySpawnReason.LOAD, EntityProcessor.NOP); + return net.minecraft.world.entity.EntityType.loadEntityRecursive(output.buildResult(), level, new net.minecraft.world.entity.EntitySpawnRequest(EntitySpawnReason.LOAD, false), EntityProcessor.NOP); } } @@ -1345,4 +1353,38 @@ public boolean hasData(final @NotNull DataComponentType type) { return this.entity.get(io.papermc.paper.datacomponent.PaperDataComponentType.bukkitToMinecraft(type)) != null; } + // 26.2: Paper's Entity now extends adventure Sound.Source.Provider + @Override + public net.kyori.adventure.sound.Sound.Source soundSource() { + return net.kyori.adventure.sound.Sound.Source.NAMES + .valueOr(this.entity.getSoundSource().getName(), net.kyori.adventure.sound.Sound.Source.NEUTRAL); + } + + // 26.2: newly abstract on the Paper Entity interface + @Override + public org.bukkit.SoundCategory getSoundCategory() { + // SoundSource and SoundCategory share their constant names + return org.bukkit.SoundCategory.valueOf(this.entity.getSoundSource().name()); + } + + @Override + public io.papermc.paper.entity.RemovalReason getRemovalReason() { + final net.minecraft.world.entity.Entity.RemovalReason reason = this.entity.getRemovalReason(); + // both enums declare the same constants; null while the entity is still alive + return reason == null ? null : io.papermc.paper.entity.RemovalReason.valueOf(reason.name()); + } + + @Override + public org.bukkit.event.entity.EntityRemoveEvent.Cause getRemoveEventCause() { + final net.minecraft.world.entity.Entity.RemovalReason reason = this.entity.getRemovalReason(); + if (reason == null) return null; + return switch (reason) { + case KILLED -> org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH; + case DISCARDED -> org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD; + case UNLOADED_TO_CHUNK -> org.bukkit.event.entity.EntityRemoveEvent.Cause.UNLOAD; + case UNLOADED_WITH_PLAYER, CHANGED_DIMENSION -> + org.bukkit.event.entity.EntityRemoveEvent.Cause.PLAYER_QUIT; + }; + } + } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntitySnapshot.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntitySnapshot.java index 6895d9c7a..3c1ce9d3e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntitySnapshot.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntitySnapshot.java @@ -60,7 +60,7 @@ public String getAsString() { private net.minecraft.world.entity.Entity createInternal(World world) { net.minecraft.world.level.Level level = ((CraftWorld) world).getHandle(); - net.minecraft.world.entity.Entity internal = net.minecraft.world.entity.EntityType.loadEntityRecursive(this.data, level, EntitySpawnReason.LOAD, EntityProcessor.NOP); + net.minecraft.world.entity.Entity internal = net.minecraft.world.entity.EntityType.loadEntityRecursive(this.data, level, new net.minecraft.world.entity.EntitySpawnRequest(EntitySpawnReason.LOAD, false), EntityProcessor.NOP); if (internal == null) { // Try creating by type internal = CraftEntityType.bukkitToMinecraft(this.type).create(level, EntitySpawnReason.LOAD); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java index 80aa49dec..bc7047b64 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.entity; + import com.google.common.base.Preconditions; import java.util.HashMap; import java.util.Iterator; @@ -102,110 +103,112 @@ Level minecraftWorld() { static { // Living - register(new EntityTypeData<>(EntityType.ELDER_GUARDIAN, ElderGuardian.class, CraftElderGuardian::new, createLiving(net.minecraft.world.entity.EntityType.ELDER_GUARDIAN))); - register(new EntityTypeData<>(EntityType.WITHER_SKELETON, WitherSkeleton.class, CraftWitherSkeleton::new, createLiving(net.minecraft.world.entity.EntityType.WITHER_SKELETON))); - register(new EntityTypeData<>(EntityType.STRAY, Stray.class, CraftStray::new, createLiving(net.minecraft.world.entity.EntityType.STRAY))); - register(new EntityTypeData<>(EntityType.BOGGED, Bogged.class, CraftBogged::new, createLiving(net.minecraft.world.entity.EntityType.BOGGED))); - register(new EntityTypeData<>(EntityType.HUSK, Husk.class, CraftHusk::new, createLiving(net.minecraft.world.entity.EntityType.HUSK))); - register(new EntityTypeData<>(EntityType.ZOMBIE_VILLAGER, ZombieVillager.class, CraftVillagerZombie::new, createLiving(net.minecraft.world.entity.EntityType.ZOMBIE_VILLAGER))); - register(new EntityTypeData<>(EntityType.SKELETON_HORSE, SkeletonHorse.class, CraftSkeletonHorse::new, createLiving(net.minecraft.world.entity.EntityType.SKELETON_HORSE))); - register(new EntityTypeData<>(EntityType.ZOMBIE_HORSE, ZombieHorse.class, CraftZombieHorse::new, createLiving(net.minecraft.world.entity.EntityType.ZOMBIE_HORSE))); - register(new EntityTypeData<>(EntityType.ARMOR_STAND, ArmorStand.class, CraftArmorStand::new, createLiving(net.minecraft.world.entity.EntityType.ARMOR_STAND))); - register(new EntityTypeData<>(EntityType.DONKEY, Donkey.class, CraftDonkey::new, createLiving(net.minecraft.world.entity.EntityType.DONKEY))); - register(new EntityTypeData<>(EntityType.MULE, Mule.class, CraftMule::new, createLiving(net.minecraft.world.entity.EntityType.MULE))); - register(new EntityTypeData<>(EntityType.EVOKER, Evoker.class, CraftEvoker::new, createLiving(net.minecraft.world.entity.EntityType.EVOKER))); - register(new EntityTypeData<>(EntityType.VEX, Vex.class, CraftVex::new, createLiving(net.minecraft.world.entity.EntityType.VEX))); - register(new EntityTypeData<>(EntityType.VINDICATOR, Vindicator.class, CraftVindicator::new, createLiving(net.minecraft.world.entity.EntityType.VINDICATOR))); - register(new EntityTypeData<>(EntityType.ILLUSIONER, Illusioner.class, CraftIllusioner::new, createLiving(net.minecraft.world.entity.EntityType.ILLUSIONER))); - register(new EntityTypeData<>(EntityType.CREEPER, Creeper.class, CraftCreeper::new, createLiving(net.minecraft.world.entity.EntityType.CREEPER))); - register(new EntityTypeData<>(EntityType.SKELETON, Skeleton.class, CraftSkeleton::new, createLiving(net.minecraft.world.entity.EntityType.SKELETON))); - register(new EntityTypeData<>(EntityType.SPIDER, Spider.class, CraftSpider::new, createLiving(net.minecraft.world.entity.EntityType.SPIDER))); - register(new EntityTypeData<>(EntityType.GIANT, Giant.class, CraftGiant::new, createLiving(net.minecraft.world.entity.EntityType.GIANT))); - register(new EntityTypeData<>(EntityType.ZOMBIE, Zombie.class, CraftZombie::new, createLiving(net.minecraft.world.entity.EntityType.ZOMBIE))); - register(new EntityTypeData<>(EntityType.SLIME, Slime.class, CraftSlime::new, createLiving(net.minecraft.world.entity.EntityType.SLIME))); - register(new EntityTypeData<>(EntityType.GHAST, Ghast.class, CraftGhast::new, createLiving(net.minecraft.world.entity.EntityType.GHAST))); - register(new EntityTypeData<>(EntityType.ZOMBIFIED_PIGLIN, PigZombie.class, CraftPigZombie::new, createLiving(net.minecraft.world.entity.EntityType.ZOMBIFIED_PIGLIN))); - register(new EntityTypeData<>(EntityType.ENDERMAN, Enderman.class, CraftEnderman::new, createLiving(net.minecraft.world.entity.EntityType.ENDERMAN))); - register(new EntityTypeData<>(EntityType.CAVE_SPIDER, CaveSpider.class, CraftCaveSpider::new, createLiving(net.minecraft.world.entity.EntityType.CAVE_SPIDER))); - register(new EntityTypeData<>(EntityType.SILVERFISH, Silverfish.class, CraftSilverfish::new, createLiving(net.minecraft.world.entity.EntityType.SILVERFISH))); - register(new EntityTypeData<>(EntityType.BLAZE, Blaze.class, CraftBlaze::new, createLiving(net.minecraft.world.entity.EntityType.BLAZE))); - register(new EntityTypeData<>(EntityType.MAGMA_CUBE, MagmaCube.class, CraftMagmaCube::new, createLiving(net.minecraft.world.entity.EntityType.MAGMA_CUBE))); - register(new EntityTypeData<>(EntityType.WITHER, Wither.class, CraftWither::new, createLiving(net.minecraft.world.entity.EntityType.WITHER))); - register(new EntityTypeData<>(EntityType.BAT, Bat.class, CraftBat::new, createLiving(net.minecraft.world.entity.EntityType.BAT))); - register(new EntityTypeData<>(EntityType.WITCH, Witch.class, CraftWitch::new, createLiving(net.minecraft.world.entity.EntityType.WITCH))); - register(new EntityTypeData<>(EntityType.ENDERMITE, Endermite.class, CraftEndermite::new, createLiving(net.minecraft.world.entity.EntityType.ENDERMITE))); - register(new EntityTypeData<>(EntityType.GUARDIAN, Guardian.class, CraftGuardian::new, createLiving(net.minecraft.world.entity.EntityType.GUARDIAN))); - register(new EntityTypeData<>(EntityType.SHULKER, Shulker.class, CraftShulker::new, createLiving(net.minecraft.world.entity.EntityType.SHULKER))); - register(new EntityTypeData<>(EntityType.PIG, Pig.class, CraftPig::new, createLiving(net.minecraft.world.entity.EntityType.PIG))); - register(new EntityTypeData<>(EntityType.SHEEP, Sheep.class, CraftSheep::new, createLiving(net.minecraft.world.entity.EntityType.SHEEP))); - register(new EntityTypeData<>(EntityType.COW, Cow.class, CraftCow::new, createLiving(net.minecraft.world.entity.EntityType.COW))); - register(new EntityTypeData<>(EntityType.CHICKEN, Chicken.class, CraftChicken::new, createLiving(net.minecraft.world.entity.EntityType.CHICKEN))); - register(new EntityTypeData<>(EntityType.SQUID, Squid.class, CraftSquid::new, createLiving(net.minecraft.world.entity.EntityType.SQUID))); - register(new EntityTypeData<>(EntityType.WOLF, Wolf.class, CraftWolf::new, createLiving(net.minecraft.world.entity.EntityType.WOLF))); - register(new EntityTypeData<>(EntityType.MOOSHROOM, MushroomCow.class, CraftMushroomCow::new, createLiving(net.minecraft.world.entity.EntityType.MOOSHROOM))); - register(new EntityTypeData<>(EntityType.SNOW_GOLEM, Snowman.class, CraftSnowman::new, createLiving(net.minecraft.world.entity.EntityType.SNOW_GOLEM))); - register(new EntityTypeData<>(EntityType.OCELOT, Ocelot.class, CraftOcelot::new, createLiving(net.minecraft.world.entity.EntityType.OCELOT))); - register(new EntityTypeData<>(EntityType.IRON_GOLEM, IronGolem.class, CraftIronGolem::new, createLiving(net.minecraft.world.entity.EntityType.IRON_GOLEM))); - register(new EntityTypeData<>(EntityType.HORSE, Horse.class, CraftHorse::new, createLiving(net.minecraft.world.entity.EntityType.HORSE))); - register(new EntityTypeData<>(EntityType.RABBIT, Rabbit.class, CraftRabbit::new, createLiving(net.minecraft.world.entity.EntityType.RABBIT))); - register(new EntityTypeData<>(EntityType.POLAR_BEAR, PolarBear.class, CraftPolarBear::new, createLiving(net.minecraft.world.entity.EntityType.POLAR_BEAR))); - register(new EntityTypeData<>(EntityType.LLAMA, Llama.class, CraftLlama::new, createLiving(net.minecraft.world.entity.EntityType.LLAMA))); - register(new EntityTypeData<>(EntityType.PARROT, Parrot.class, CraftParrot::new, createLiving(net.minecraft.world.entity.EntityType.PARROT))); - register(new EntityTypeData<>(EntityType.VILLAGER, Villager.class, CraftVillager::new, createLiving(net.minecraft.world.entity.EntityType.VILLAGER))); - register(new EntityTypeData<>(EntityType.TURTLE, Turtle.class, CraftTurtle::new, createLiving(net.minecraft.world.entity.EntityType.TURTLE))); - register(new EntityTypeData<>(EntityType.PHANTOM, Phantom.class, CraftPhantom::new, createLiving(net.minecraft.world.entity.EntityType.PHANTOM))); - register(new EntityTypeData<>(EntityType.COD, Cod.class, CraftCod::new, createLiving(net.minecraft.world.entity.EntityType.COD))); - register(new EntityTypeData<>(EntityType.SALMON, Salmon.class, CraftSalmon::new, createLiving(net.minecraft.world.entity.EntityType.SALMON))); - register(new EntityTypeData<>(EntityType.PUFFERFISH, PufferFish.class, CraftPufferFish::new, createLiving(net.minecraft.world.entity.EntityType.PUFFERFISH))); - register(new EntityTypeData<>(EntityType.TROPICAL_FISH, TropicalFish.class, CraftTropicalFish::new, createLiving(net.minecraft.world.entity.EntityType.TROPICAL_FISH))); - register(new EntityTypeData<>(EntityType.DROWNED, Drowned.class, CraftDrowned::new, createLiving(net.minecraft.world.entity.EntityType.DROWNED))); - register(new EntityTypeData<>(EntityType.DOLPHIN, Dolphin.class, CraftDolphin::new, createLiving(net.minecraft.world.entity.EntityType.DOLPHIN))); - register(new EntityTypeData<>(EntityType.CAT, Cat.class, CraftCat::new, createLiving(net.minecraft.world.entity.EntityType.CAT))); - register(new EntityTypeData<>(EntityType.PANDA, Panda.class, CraftPanda::new, createLiving(net.minecraft.world.entity.EntityType.PANDA))); - register(new EntityTypeData<>(EntityType.PILLAGER, Pillager.class, CraftPillager::new, createLiving(net.minecraft.world.entity.EntityType.PILLAGER))); - register(new EntityTypeData<>(EntityType.RAVAGER, Ravager.class, CraftRavager::new, createLiving(net.minecraft.world.entity.EntityType.RAVAGER))); - register(new EntityTypeData<>(EntityType.TRADER_LLAMA, TraderLlama.class, CraftTraderLlama::new, createLiving(net.minecraft.world.entity.EntityType.TRADER_LLAMA))); - register(new EntityTypeData<>(EntityType.WANDERING_TRADER, WanderingTrader.class, CraftWanderingTrader::new, createLiving(net.minecraft.world.entity.EntityType.WANDERING_TRADER))); - register(new EntityTypeData<>(EntityType.FOX, Fox.class, CraftFox::new, createLiving(net.minecraft.world.entity.EntityType.FOX))); - register(new EntityTypeData<>(EntityType.BEE, Bee.class, CraftBee::new, createLiving(net.minecraft.world.entity.EntityType.BEE))); - register(new EntityTypeData<>(EntityType.HOGLIN, Hoglin.class, CraftHoglin::new, createLiving(net.minecraft.world.entity.EntityType.HOGLIN))); - register(new EntityTypeData<>(EntityType.PIGLIN, Piglin.class, CraftPiglin::new, createLiving(net.minecraft.world.entity.EntityType.PIGLIN))); - register(new EntityTypeData<>(EntityType.STRIDER, Strider.class, CraftStrider::new, createLiving(net.minecraft.world.entity.EntityType.STRIDER))); - register(new EntityTypeData<>(EntityType.ZOGLIN, Zoglin.class, CraftZoglin::new, createLiving(net.minecraft.world.entity.EntityType.ZOGLIN))); - register(new EntityTypeData<>(EntityType.PIGLIN_BRUTE, PiglinBrute.class, CraftPiglinBrute::new, createLiving(net.minecraft.world.entity.EntityType.PIGLIN_BRUTE))); - register(new EntityTypeData<>(EntityType.AXOLOTL, Axolotl.class, CraftAxolotl::new, createLiving(net.minecraft.world.entity.EntityType.AXOLOTL))); - register(new EntityTypeData<>(EntityType.GLOW_SQUID, GlowSquid.class, CraftGlowSquid::new, createLiving(net.minecraft.world.entity.EntityType.GLOW_SQUID))); - register(new EntityTypeData<>(EntityType.GOAT, Goat.class, CraftGoat::new, createLiving(net.minecraft.world.entity.EntityType.GOAT))); - register(new EntityTypeData<>(EntityType.ALLAY, Allay.class, CraftAllay::new, createLiving(net.minecraft.world.entity.EntityType.ALLAY))); - register(new EntityTypeData<>(EntityType.FROG, Frog.class, CraftFrog::new, createLiving(net.minecraft.world.entity.EntityType.FROG))); - register(new EntityTypeData<>(EntityType.TADPOLE, Tadpole.class, CraftTadpole::new, createLiving(net.minecraft.world.entity.EntityType.TADPOLE))); - register(new EntityTypeData<>(EntityType.WARDEN, Warden.class, CraftWarden::new, createLiving(net.minecraft.world.entity.EntityType.WARDEN))); - register(new EntityTypeData<>(EntityType.CAMEL, Camel.class, CraftCamel::new, createLiving(net.minecraft.world.entity.EntityType.CAMEL))); - register(new EntityTypeData<>(EntityType.SNIFFER, Sniffer.class, CraftSniffer::new, createLiving(net.minecraft.world.entity.EntityType.SNIFFER))); - register(new EntityTypeData<>(EntityType.BREEZE, Breeze.class, CraftBreeze::new, createLiving(net.minecraft.world.entity.EntityType.BREEZE))); - register(new EntityTypeData<>(EntityType.ARMADILLO, Armadillo.class, CraftArmadillo::new, createLiving(net.minecraft.world.entity.EntityType.ARMADILLO))); - register(new EntityTypeData<>(EntityType.CREAKING, Creaking.class, CraftCreaking::new, createLiving(net.minecraft.world.entity.EntityType.CREAKING))); - register(new EntityTypeData<>(EntityType.HAPPY_GHAST, HappyGhast.class, CraftHappyGhast::new, createLiving(net.minecraft.world.entity.EntityType.HAPPY_GHAST))); - register(new EntityTypeData<>(EntityType.COPPER_GOLEM, CopperGolem.class, CraftCopperGolem::new, createLiving(net.minecraft.world.entity.EntityType.COPPER_GOLEM))); - register(new EntityTypeData<>(EntityType.MANNEQUIN, Mannequin.class, CraftMannequin::new, createLiving(net.minecraft.world.entity.EntityType.MANNEQUIN))); - register(new EntityTypeData<>(EntityType.NAUTILUS, Nautilus.class, CraftNautilus::new, createLiving(net.minecraft.world.entity.EntityType.NAUTILUS))); - register(new EntityTypeData<>(EntityType.ZOMBIE_NAUTILUS, ZombieNautilus.class, CraftZombieNautilus::new, createLiving(net.minecraft.world.entity.EntityType.ZOMBIE_NAUTILUS))); - register(new EntityTypeData<>(EntityType.CAMEL_HUSK, CamelHusk.class, CraftCamelHusk::new, createLiving(net.minecraft.world.entity.EntityType.CAMEL_HUSK))); - register(new EntityTypeData<>(EntityType.PARCHED, Parched.class, CraftParched::new, createLiving(net.minecraft.world.entity.EntityType.PARCHED))); - - Function dragonFunction = createLiving(net.minecraft.world.entity.EntityType.ENDER_DRAGON); + register(new EntityTypeData<>(EntityType.ELDER_GUARDIAN, ElderGuardian.class, CraftElderGuardian::new, createLiving(net.minecraft.world.entity.EntityTypes.ELDER_GUARDIAN))); + register(new EntityTypeData<>(EntityType.WITHER_SKELETON, WitherSkeleton.class, CraftWitherSkeleton::new, createLiving(net.minecraft.world.entity.EntityTypes.WITHER_SKELETON))); + register(new EntityTypeData<>(EntityType.STRAY, Stray.class, CraftStray::new, createLiving(net.minecraft.world.entity.EntityTypes.STRAY))); + register(new EntityTypeData<>(EntityType.BOGGED, Bogged.class, CraftBogged::new, createLiving(net.minecraft.world.entity.EntityTypes.BOGGED))); + register(new EntityTypeData<>(EntityType.HUSK, Husk.class, CraftHusk::new, createLiving(net.minecraft.world.entity.EntityTypes.HUSK))); + register(new EntityTypeData<>(EntityType.ZOMBIE_VILLAGER, ZombieVillager.class, CraftVillagerZombie::new, createLiving(net.minecraft.world.entity.EntityTypes.ZOMBIE_VILLAGER))); + register(new EntityTypeData<>(EntityType.SKELETON_HORSE, SkeletonHorse.class, CraftSkeletonHorse::new, createLiving(net.minecraft.world.entity.EntityTypes.SKELETON_HORSE))); + register(new EntityTypeData<>(EntityType.ZOMBIE_HORSE, ZombieHorse.class, CraftZombieHorse::new, createLiving(net.minecraft.world.entity.EntityTypes.ZOMBIE_HORSE))); + register(new EntityTypeData<>(EntityType.ARMOR_STAND, ArmorStand.class, CraftArmorStand::new, createLiving(net.minecraft.world.entity.EntityTypes.ARMOR_STAND))); + register(new EntityTypeData<>(EntityType.DONKEY, Donkey.class, CraftDonkey::new, createLiving(net.minecraft.world.entity.EntityTypes.DONKEY))); + register(new EntityTypeData<>(EntityType.MULE, Mule.class, CraftMule::new, createLiving(net.minecraft.world.entity.EntityTypes.MULE))); + register(new EntityTypeData<>(EntityType.EVOKER, Evoker.class, CraftEvoker::new, createLiving(net.minecraft.world.entity.EntityTypes.EVOKER))); + register(new EntityTypeData<>(EntityType.VEX, Vex.class, CraftVex::new, createLiving(net.minecraft.world.entity.EntityTypes.VEX))); + register(new EntityTypeData<>(EntityType.VINDICATOR, Vindicator.class, CraftVindicator::new, createLiving(net.minecraft.world.entity.EntityTypes.VINDICATOR))); + register(new EntityTypeData<>(EntityType.ILLUSIONER, Illusioner.class, CraftIllusioner::new, createLiving(net.minecraft.world.entity.EntityTypes.ILLUSIONER))); + register(new EntityTypeData<>(EntityType.CREEPER, Creeper.class, CraftCreeper::new, createLiving(net.minecraft.world.entity.EntityTypes.CREEPER))); + register(new EntityTypeData<>(EntityType.SKELETON, Skeleton.class, CraftSkeleton::new, createLiving(net.minecraft.world.entity.EntityTypes.SKELETON))); + register(new EntityTypeData<>(EntityType.SPIDER, Spider.class, CraftSpider::new, createLiving(net.minecraft.world.entity.EntityTypes.SPIDER))); + register(new EntityTypeData<>(EntityType.GIANT, Giant.class, CraftGiant::new, createLiving(net.minecraft.world.entity.EntityTypes.GIANT))); + register(new EntityTypeData<>(EntityType.ZOMBIE, Zombie.class, CraftZombie::new, createLiving(net.minecraft.world.entity.EntityTypes.ZOMBIE))); + register(new EntityTypeData<>(EntityType.SLIME, Slime.class, CraftSlime::new, createLiving(net.minecraft.world.entity.EntityTypes.SLIME))); + register(new EntityTypeData<>(EntityType.GHAST, Ghast.class, CraftGhast::new, createLiving(net.minecraft.world.entity.EntityTypes.GHAST))); + register(new EntityTypeData<>(EntityType.ZOMBIFIED_PIGLIN, PigZombie.class, CraftPigZombie::new, createLiving(net.minecraft.world.entity.EntityTypes.ZOMBIFIED_PIGLIN))); + register(new EntityTypeData<>(EntityType.ENDERMAN, Enderman.class, CraftEnderman::new, createLiving(net.minecraft.world.entity.EntityTypes.ENDERMAN))); + register(new EntityTypeData<>(EntityType.CAVE_SPIDER, CaveSpider.class, CraftCaveSpider::new, createLiving(net.minecraft.world.entity.EntityTypes.CAVE_SPIDER))); + register(new EntityTypeData<>(EntityType.SILVERFISH, Silverfish.class, CraftSilverfish::new, createLiving(net.minecraft.world.entity.EntityTypes.SILVERFISH))); + register(new EntityTypeData<>(EntityType.BLAZE, Blaze.class, CraftBlaze::new, createLiving(net.minecraft.world.entity.EntityTypes.BLAZE))); + register(new EntityTypeData<>(EntityType.MAGMA_CUBE, MagmaCube.class, CraftMagmaCube::new, createLiving(net.minecraft.world.entity.EntityTypes.MAGMA_CUBE))); + // 26.2: new cube mob + register(new EntityTypeData<>(EntityType.SULFUR_CUBE, org.bukkit.entity.SulfurCube.class, CraftSulfurCube::new, createLiving(net.minecraft.world.entity.EntityTypes.SULFUR_CUBE))); + register(new EntityTypeData<>(EntityType.WITHER, Wither.class, CraftWither::new, createLiving(net.minecraft.world.entity.EntityTypes.WITHER))); + register(new EntityTypeData<>(EntityType.BAT, Bat.class, CraftBat::new, createLiving(net.minecraft.world.entity.EntityTypes.BAT))); + register(new EntityTypeData<>(EntityType.WITCH, Witch.class, CraftWitch::new, createLiving(net.minecraft.world.entity.EntityTypes.WITCH))); + register(new EntityTypeData<>(EntityType.ENDERMITE, Endermite.class, CraftEndermite::new, createLiving(net.minecraft.world.entity.EntityTypes.ENDERMITE))); + register(new EntityTypeData<>(EntityType.GUARDIAN, Guardian.class, CraftGuardian::new, createLiving(net.minecraft.world.entity.EntityTypes.GUARDIAN))); + register(new EntityTypeData<>(EntityType.SHULKER, Shulker.class, CraftShulker::new, createLiving(net.minecraft.world.entity.EntityTypes.SHULKER))); + register(new EntityTypeData<>(EntityType.PIG, Pig.class, CraftPig::new, createLiving(net.minecraft.world.entity.EntityTypes.PIG))); + register(new EntityTypeData<>(EntityType.SHEEP, Sheep.class, CraftSheep::new, createLiving(net.minecraft.world.entity.EntityTypes.SHEEP))); + register(new EntityTypeData<>(EntityType.COW, Cow.class, CraftCow::new, createLiving(net.minecraft.world.entity.EntityTypes.COW))); + register(new EntityTypeData<>(EntityType.CHICKEN, Chicken.class, CraftChicken::new, createLiving(net.minecraft.world.entity.EntityTypes.CHICKEN))); + register(new EntityTypeData<>(EntityType.SQUID, Squid.class, CraftSquid::new, createLiving(net.minecraft.world.entity.EntityTypes.SQUID))); + register(new EntityTypeData<>(EntityType.WOLF, Wolf.class, CraftWolf::new, createLiving(net.minecraft.world.entity.EntityTypes.WOLF))); + register(new EntityTypeData<>(EntityType.MOOSHROOM, MushroomCow.class, CraftMushroomCow::new, createLiving(net.minecraft.world.entity.EntityTypes.MOOSHROOM))); + register(new EntityTypeData<>(EntityType.SNOW_GOLEM, Snowman.class, CraftSnowman::new, createLiving(net.minecraft.world.entity.EntityTypes.SNOW_GOLEM))); + register(new EntityTypeData<>(EntityType.OCELOT, Ocelot.class, CraftOcelot::new, createLiving(net.minecraft.world.entity.EntityTypes.OCELOT))); + register(new EntityTypeData<>(EntityType.IRON_GOLEM, IronGolem.class, CraftIronGolem::new, createLiving(net.minecraft.world.entity.EntityTypes.IRON_GOLEM))); + register(new EntityTypeData<>(EntityType.HORSE, Horse.class, CraftHorse::new, createLiving(net.minecraft.world.entity.EntityTypes.HORSE))); + register(new EntityTypeData<>(EntityType.RABBIT, Rabbit.class, CraftRabbit::new, createLiving(net.minecraft.world.entity.EntityTypes.RABBIT))); + register(new EntityTypeData<>(EntityType.POLAR_BEAR, PolarBear.class, CraftPolarBear::new, createLiving(net.minecraft.world.entity.EntityTypes.POLAR_BEAR))); + register(new EntityTypeData<>(EntityType.LLAMA, Llama.class, CraftLlama::new, createLiving(net.minecraft.world.entity.EntityTypes.LLAMA))); + register(new EntityTypeData<>(EntityType.PARROT, Parrot.class, CraftParrot::new, createLiving(net.minecraft.world.entity.EntityTypes.PARROT))); + register(new EntityTypeData<>(EntityType.VILLAGER, Villager.class, CraftVillager::new, createLiving(net.minecraft.world.entity.EntityTypes.VILLAGER))); + register(new EntityTypeData<>(EntityType.TURTLE, Turtle.class, CraftTurtle::new, createLiving(net.minecraft.world.entity.EntityTypes.TURTLE))); + register(new EntityTypeData<>(EntityType.PHANTOM, Phantom.class, CraftPhantom::new, createLiving(net.minecraft.world.entity.EntityTypes.PHANTOM))); + register(new EntityTypeData<>(EntityType.COD, Cod.class, CraftCod::new, createLiving(net.minecraft.world.entity.EntityTypes.COD))); + register(new EntityTypeData<>(EntityType.SALMON, Salmon.class, CraftSalmon::new, createLiving(net.minecraft.world.entity.EntityTypes.SALMON))); + register(new EntityTypeData<>(EntityType.PUFFERFISH, PufferFish.class, CraftPufferFish::new, createLiving(net.minecraft.world.entity.EntityTypes.PUFFERFISH))); + register(new EntityTypeData<>(EntityType.TROPICAL_FISH, TropicalFish.class, CraftTropicalFish::new, createLiving(net.minecraft.world.entity.EntityTypes.TROPICAL_FISH))); + register(new EntityTypeData<>(EntityType.DROWNED, Drowned.class, CraftDrowned::new, createLiving(net.minecraft.world.entity.EntityTypes.DROWNED))); + register(new EntityTypeData<>(EntityType.DOLPHIN, Dolphin.class, CraftDolphin::new, createLiving(net.minecraft.world.entity.EntityTypes.DOLPHIN))); + register(new EntityTypeData<>(EntityType.CAT, Cat.class, CraftCat::new, createLiving(net.minecraft.world.entity.EntityTypes.CAT))); + register(new EntityTypeData<>(EntityType.PANDA, Panda.class, CraftPanda::new, createLiving(net.minecraft.world.entity.EntityTypes.PANDA))); + register(new EntityTypeData<>(EntityType.PILLAGER, Pillager.class, CraftPillager::new, createLiving(net.minecraft.world.entity.EntityTypes.PILLAGER))); + register(new EntityTypeData<>(EntityType.RAVAGER, Ravager.class, CraftRavager::new, createLiving(net.minecraft.world.entity.EntityTypes.RAVAGER))); + register(new EntityTypeData<>(EntityType.TRADER_LLAMA, TraderLlama.class, CraftTraderLlama::new, createLiving(net.minecraft.world.entity.EntityTypes.TRADER_LLAMA))); + register(new EntityTypeData<>(EntityType.WANDERING_TRADER, WanderingTrader.class, CraftWanderingTrader::new, createLiving(net.minecraft.world.entity.EntityTypes.WANDERING_TRADER))); + register(new EntityTypeData<>(EntityType.FOX, Fox.class, CraftFox::new, createLiving(net.minecraft.world.entity.EntityTypes.FOX))); + register(new EntityTypeData<>(EntityType.BEE, Bee.class, CraftBee::new, createLiving(net.minecraft.world.entity.EntityTypes.BEE))); + register(new EntityTypeData<>(EntityType.HOGLIN, Hoglin.class, CraftHoglin::new, createLiving(net.minecraft.world.entity.EntityTypes.HOGLIN))); + register(new EntityTypeData<>(EntityType.PIGLIN, Piglin.class, CraftPiglin::new, createLiving(net.minecraft.world.entity.EntityTypes.PIGLIN))); + register(new EntityTypeData<>(EntityType.STRIDER, Strider.class, CraftStrider::new, createLiving(net.minecraft.world.entity.EntityTypes.STRIDER))); + register(new EntityTypeData<>(EntityType.ZOGLIN, Zoglin.class, CraftZoglin::new, createLiving(net.minecraft.world.entity.EntityTypes.ZOGLIN))); + register(new EntityTypeData<>(EntityType.PIGLIN_BRUTE, PiglinBrute.class, CraftPiglinBrute::new, createLiving(net.minecraft.world.entity.EntityTypes.PIGLIN_BRUTE))); + register(new EntityTypeData<>(EntityType.AXOLOTL, Axolotl.class, CraftAxolotl::new, createLiving(net.minecraft.world.entity.EntityTypes.AXOLOTL))); + register(new EntityTypeData<>(EntityType.GLOW_SQUID, GlowSquid.class, CraftGlowSquid::new, createLiving(net.minecraft.world.entity.EntityTypes.GLOW_SQUID))); + register(new EntityTypeData<>(EntityType.GOAT, Goat.class, CraftGoat::new, createLiving(net.minecraft.world.entity.EntityTypes.GOAT))); + register(new EntityTypeData<>(EntityType.ALLAY, Allay.class, CraftAllay::new, createLiving(net.minecraft.world.entity.EntityTypes.ALLAY))); + register(new EntityTypeData<>(EntityType.FROG, Frog.class, CraftFrog::new, createLiving(net.minecraft.world.entity.EntityTypes.FROG))); + register(new EntityTypeData<>(EntityType.TADPOLE, Tadpole.class, CraftTadpole::new, createLiving(net.minecraft.world.entity.EntityTypes.TADPOLE))); + register(new EntityTypeData<>(EntityType.WARDEN, Warden.class, CraftWarden::new, createLiving(net.minecraft.world.entity.EntityTypes.WARDEN))); + register(new EntityTypeData<>(EntityType.CAMEL, Camel.class, CraftCamel::new, createLiving(net.minecraft.world.entity.EntityTypes.CAMEL))); + register(new EntityTypeData<>(EntityType.SNIFFER, Sniffer.class, CraftSniffer::new, createLiving(net.minecraft.world.entity.EntityTypes.SNIFFER))); + register(new EntityTypeData<>(EntityType.BREEZE, Breeze.class, CraftBreeze::new, createLiving(net.minecraft.world.entity.EntityTypes.BREEZE))); + register(new EntityTypeData<>(EntityType.ARMADILLO, Armadillo.class, CraftArmadillo::new, createLiving(net.minecraft.world.entity.EntityTypes.ARMADILLO))); + register(new EntityTypeData<>(EntityType.CREAKING, Creaking.class, CraftCreaking::new, createLiving(net.minecraft.world.entity.EntityTypes.CREAKING))); + register(new EntityTypeData<>(EntityType.HAPPY_GHAST, HappyGhast.class, CraftHappyGhast::new, createLiving(net.minecraft.world.entity.EntityTypes.HAPPY_GHAST))); + register(new EntityTypeData<>(EntityType.COPPER_GOLEM, CopperGolem.class, CraftCopperGolem::new, createLiving(net.minecraft.world.entity.EntityTypes.COPPER_GOLEM))); + register(new EntityTypeData<>(EntityType.MANNEQUIN, Mannequin.class, CraftMannequin::new, createLiving(net.minecraft.world.entity.EntityTypes.MANNEQUIN))); + register(new EntityTypeData<>(EntityType.NAUTILUS, Nautilus.class, CraftNautilus::new, createLiving(net.minecraft.world.entity.EntityTypes.NAUTILUS))); + register(new EntityTypeData<>(EntityType.ZOMBIE_NAUTILUS, ZombieNautilus.class, CraftZombieNautilus::new, createLiving(net.minecraft.world.entity.EntityTypes.ZOMBIE_NAUTILUS))); + register(new EntityTypeData<>(EntityType.CAMEL_HUSK, CamelHusk.class, CraftCamelHusk::new, createLiving(net.minecraft.world.entity.EntityTypes.CAMEL_HUSK))); + register(new EntityTypeData<>(EntityType.PARCHED, Parched.class, CraftParched::new, createLiving(net.minecraft.world.entity.EntityTypes.PARCHED))); + + Function dragonFunction = createLiving(net.minecraft.world.entity.EntityTypes.ENDER_DRAGON); register(new EntityTypeData<>(EntityType.ENDER_DRAGON, EnderDragon.class, CraftEnderDragon::new, spawnData -> { Preconditions.checkArgument(spawnData.normalWorld(), "Cannot spawn entity %s during world generation", EnderDragon.class.getName()); return dragonFunction.apply(spawnData); })); // Fireball - register(new EntityTypeData<>(EntityType.FIREBALL, LargeFireball.class, CraftLargeFireball::new, createFireball(net.minecraft.world.entity.EntityType.FIREBALL))); - register(new EntityTypeData<>(EntityType.SMALL_FIREBALL, SmallFireball.class, CraftSmallFireball::new, createFireball(net.minecraft.world.entity.EntityType.SMALL_FIREBALL))); - register(new EntityTypeData<>(EntityType.WITHER_SKULL, WitherSkull.class, CraftWitherSkull::new, createFireball(net.minecraft.world.entity.EntityType.WITHER_SKULL))); - register(new EntityTypeData<>(EntityType.DRAGON_FIREBALL, DragonFireball.class, CraftDragonFireball::new, createFireball(net.minecraft.world.entity.EntityType.DRAGON_FIREBALL))); - register(new EntityTypeData<>(EntityType.WIND_CHARGE, WindCharge.class, CraftWindCharge::new, createFireball(net.minecraft.world.entity.EntityType.WIND_CHARGE))); - register(new EntityTypeData<>(EntityType.BREEZE_WIND_CHARGE, BreezeWindCharge.class, CraftBreezeWindCharge::new, createFireball(net.minecraft.world.entity.EntityType.BREEZE_WIND_CHARGE))); + register(new EntityTypeData<>(EntityType.FIREBALL, LargeFireball.class, CraftLargeFireball::new, createFireball(net.minecraft.world.entity.EntityTypes.FIREBALL))); + register(new EntityTypeData<>(EntityType.SMALL_FIREBALL, SmallFireball.class, CraftSmallFireball::new, createFireball(net.minecraft.world.entity.EntityTypes.SMALL_FIREBALL))); + register(new EntityTypeData<>(EntityType.WITHER_SKULL, WitherSkull.class, CraftWitherSkull::new, createFireball(net.minecraft.world.entity.EntityTypes.WITHER_SKULL))); + register(new EntityTypeData<>(EntityType.DRAGON_FIREBALL, DragonFireball.class, CraftDragonFireball::new, createFireball(net.minecraft.world.entity.EntityTypes.DRAGON_FIREBALL))); + register(new EntityTypeData<>(EntityType.WIND_CHARGE, WindCharge.class, CraftWindCharge::new, createFireball(net.minecraft.world.entity.EntityTypes.WIND_CHARGE))); + register(new EntityTypeData<>(EntityType.BREEZE_WIND_CHARGE, BreezeWindCharge.class, CraftBreezeWindCharge::new, createFireball(net.minecraft.world.entity.EntityTypes.BREEZE_WIND_CHARGE))); // Hanging register(new EntityTypeData<>(EntityType.PAINTING, Painting.class, CraftPainting::new, createHanging(Painting.class, (spawnData, hangingData) -> { @@ -217,7 +220,7 @@ Level minecraftWorld() { } } /*else*/ { // Paper end - if randomizeData fails, force it - net.minecraft.world.entity.decoration.painting.Painting entity = new net.minecraft.world.entity.decoration.painting.Painting(net.minecraft.world.entity.EntityType.PAINTING, spawnData.minecraftWorld()); + net.minecraft.world.entity.decoration.painting.Painting entity = new net.minecraft.world.entity.decoration.painting.Painting(net.minecraft.world.entity.EntityTypes.PAINTING, spawnData.minecraftWorld()); entity.absSnapTo(spawnData.x(), spawnData.y(), spawnData.z(), spawnData.yaw(), spawnData.pitch()); entity.setDirection(hangingData.direction()); return entity; @@ -228,46 +231,46 @@ Level minecraftWorld() { register(new EntityTypeData<>(EntityType.GLOW_ITEM_FRAME, GlowItemFrame.class, CraftGlowItemFrame::new, createHanging(GlowItemFrame.class, (spawnData, hangingData) -> new net.minecraft.world.entity.decoration.GlowItemFrame(spawnData.minecraftWorld(), hangingData.position(), hangingData.direction())))); // Move no rotation - register(new EntityTypeData<>(EntityType.ARROW, Arrow.class, CraftArrow::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityType.ARROW))); - register(new EntityTypeData<>(EntityType.ENDER_PEARL, EnderPearl.class, CraftEnderPearl::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityType.ENDER_PEARL))); - register(new EntityTypeData<>(EntityType.EXPERIENCE_BOTTLE, ThrownExpBottle.class, CraftThrownExpBottle::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityType.EXPERIENCE_BOTTLE))); - register(new EntityTypeData<>(EntityType.SPECTRAL_ARROW, SpectralArrow.class, CraftSpectralArrow::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityType.SPECTRAL_ARROW))); - register(new EntityTypeData<>(EntityType.END_CRYSTAL, EnderCrystal.class, CraftEnderCrystal::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityType.END_CRYSTAL))); - register(new EntityTypeData<>(EntityType.TRIDENT, Trident.class, CraftTrident::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityType.TRIDENT))); - register(new EntityTypeData<>(EntityType.LIGHTNING_BOLT, LightningStrike.class, CraftLightningStrike::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityType.LIGHTNING_BOLT))); + register(new EntityTypeData<>(EntityType.ARROW, Arrow.class, CraftArrow::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityTypes.ARROW))); + register(new EntityTypeData<>(EntityType.ENDER_PEARL, EnderPearl.class, CraftEnderPearl::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityTypes.ENDER_PEARL))); + register(new EntityTypeData<>(EntityType.EXPERIENCE_BOTTLE, ThrownExpBottle.class, CraftThrownExpBottle::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityTypes.EXPERIENCE_BOTTLE))); + register(new EntityTypeData<>(EntityType.SPECTRAL_ARROW, SpectralArrow.class, CraftSpectralArrow::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityTypes.SPECTRAL_ARROW))); + register(new EntityTypeData<>(EntityType.END_CRYSTAL, EnderCrystal.class, CraftEnderCrystal::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityTypes.END_CRYSTAL))); + register(new EntityTypeData<>(EntityType.TRIDENT, Trident.class, CraftTrident::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityTypes.TRIDENT))); + register(new EntityTypeData<>(EntityType.LIGHTNING_BOLT, LightningStrike.class, CraftLightningStrike::new, createAndMoveEmptyRot(net.minecraft.world.entity.EntityTypes.LIGHTNING_BOLT))); // Move - register(new EntityTypeData<>(EntityType.SHULKER_BULLET, ShulkerBullet.class, CraftShulkerBullet::new, createAndMove(net.minecraft.world.entity.EntityType.SHULKER_BULLET))); - register(new EntityTypeData<>(EntityType.LLAMA_SPIT, LlamaSpit.class, CraftLlamaSpit::new, createAndMove(net.minecraft.world.entity.EntityType.LLAMA_SPIT))); - register(new EntityTypeData<>(EntityType.OMINOUS_ITEM_SPAWNER, OminousItemSpawner.class, CraftOminousItemSpawner::new, createAndMove(net.minecraft.world.entity.EntityType.OMINOUS_ITEM_SPAWNER))); + register(new EntityTypeData<>(EntityType.SHULKER_BULLET, ShulkerBullet.class, CraftShulkerBullet::new, createAndMove(net.minecraft.world.entity.EntityTypes.SHULKER_BULLET))); + register(new EntityTypeData<>(EntityType.LLAMA_SPIT, LlamaSpit.class, CraftLlamaSpit::new, createAndMove(net.minecraft.world.entity.EntityTypes.LLAMA_SPIT))); + register(new EntityTypeData<>(EntityType.OMINOUS_ITEM_SPAWNER, OminousItemSpawner.class, CraftOminousItemSpawner::new, createAndMove(net.minecraft.world.entity.EntityTypes.OMINOUS_ITEM_SPAWNER))); // Move (boats) - register(new EntityTypeData<>(EntityType.ACACIA_BOAT, AcaciaBoat.class, CraftAcaciaBoat::new, createAndMove(net.minecraft.world.entity.EntityType.ACACIA_BOAT))); - register(new EntityTypeData<>(EntityType.ACACIA_CHEST_BOAT, AcaciaChestBoat.class, CraftAcaciaChestBoat::new, createAndMove(net.minecraft.world.entity.EntityType.ACACIA_CHEST_BOAT))); - register(new EntityTypeData<>(EntityType.BAMBOO_RAFT, BambooRaft.class, CraftBambooRaft::new, createAndMove(net.minecraft.world.entity.EntityType.BAMBOO_RAFT))); - register(new EntityTypeData<>(EntityType.BAMBOO_CHEST_RAFT, BambooChestRaft.class, CraftBambooChestRaft::new, createAndMove(net.minecraft.world.entity.EntityType.BAMBOO_CHEST_RAFT))); - register(new EntityTypeData<>(EntityType.BIRCH_BOAT, BirchBoat.class, CraftBirchBoat::new, createAndMove(net.minecraft.world.entity.EntityType.BIRCH_BOAT))); - register(new EntityTypeData<>(EntityType.BIRCH_CHEST_BOAT, BirchChestBoat.class, CraftBirchChestBoat::new, createAndMove(net.minecraft.world.entity.EntityType.BIRCH_CHEST_BOAT))); - register(new EntityTypeData<>(EntityType.CHERRY_BOAT, CherryBoat.class, CraftCherryBoat::new, createAndMove(net.minecraft.world.entity.EntityType.CHERRY_BOAT))); - register(new EntityTypeData<>(EntityType.CHERRY_CHEST_BOAT, CherryChestBoat.class, CraftCherryChestBoat::new, createAndMove(net.minecraft.world.entity.EntityType.CHERRY_CHEST_BOAT))); - register(new EntityTypeData<>(EntityType.DARK_OAK_BOAT, DarkOakBoat.class, CraftDarkOakBoat::new, createAndMove(net.minecraft.world.entity.EntityType.DARK_OAK_BOAT))); - register(new EntityTypeData<>(EntityType.DARK_OAK_CHEST_BOAT, DarkOakChestBoat.class, CraftDarkOakChestBoat::new, createAndMove(net.minecraft.world.entity.EntityType.DARK_OAK_CHEST_BOAT))); - register(new EntityTypeData<>(EntityType.JUNGLE_BOAT, JungleBoat.class, CraftJungleBoat::new, createAndMove(net.minecraft.world.entity.EntityType.JUNGLE_BOAT))); - register(new EntityTypeData<>(EntityType.JUNGLE_CHEST_BOAT, JungleChestBoat.class, CraftJungleChestBoat::new, createAndMove(net.minecraft.world.entity.EntityType.JUNGLE_CHEST_BOAT))); - register(new EntityTypeData<>(EntityType.MANGROVE_BOAT, MangroveBoat.class, CraftMangroveBoat::new, createAndMove(net.minecraft.world.entity.EntityType.MANGROVE_BOAT))); - register(new EntityTypeData<>(EntityType.MANGROVE_CHEST_BOAT, MangroveChestBoat.class, CraftMangroveChestBoat::new, createAndMove(net.minecraft.world.entity.EntityType.MANGROVE_CHEST_BOAT))); - register(new EntityTypeData<>(EntityType.OAK_BOAT, OakBoat.class, CraftOakBoat::new, createAndMove(net.minecraft.world.entity.EntityType.OAK_BOAT))); - register(new EntityTypeData<>(EntityType.OAK_CHEST_BOAT, OakChestBoat.class, CraftOakChestBoat::new, createAndMove(net.minecraft.world.entity.EntityType.OAK_CHEST_BOAT))); - register(new EntityTypeData<>(EntityType.PALE_OAK_BOAT, PaleOakBoat.class, CraftPaleOakBoat::new, createAndMove(net.minecraft.world.entity.EntityType.PALE_OAK_BOAT))); - register(new EntityTypeData<>(EntityType.PALE_OAK_CHEST_BOAT, PaleOakChestBoat.class, CraftPaleOakChestBoat::new, createAndMove(net.minecraft.world.entity.EntityType.PALE_OAK_CHEST_BOAT))); - register(new EntityTypeData<>(EntityType.SPRUCE_BOAT, SpruceBoat.class, CraftSpruceBoat::new, createAndMove(net.minecraft.world.entity.EntityType.SPRUCE_BOAT))); - register(new EntityTypeData<>(EntityType.SPRUCE_CHEST_BOAT, SpruceChestBoat.class, CraftSpruceChestBoat::new, createAndMove(net.minecraft.world.entity.EntityType.SPRUCE_CHEST_BOAT))); + register(new EntityTypeData<>(EntityType.ACACIA_BOAT, AcaciaBoat.class, CraftAcaciaBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.ACACIA_BOAT))); + register(new EntityTypeData<>(EntityType.ACACIA_CHEST_BOAT, AcaciaChestBoat.class, CraftAcaciaChestBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.ACACIA_CHEST_BOAT))); + register(new EntityTypeData<>(EntityType.BAMBOO_RAFT, BambooRaft.class, CraftBambooRaft::new, createAndMove(net.minecraft.world.entity.EntityTypes.BAMBOO_RAFT))); + register(new EntityTypeData<>(EntityType.BAMBOO_CHEST_RAFT, BambooChestRaft.class, CraftBambooChestRaft::new, createAndMove(net.minecraft.world.entity.EntityTypes.BAMBOO_CHEST_RAFT))); + register(new EntityTypeData<>(EntityType.BIRCH_BOAT, BirchBoat.class, CraftBirchBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.BIRCH_BOAT))); + register(new EntityTypeData<>(EntityType.BIRCH_CHEST_BOAT, BirchChestBoat.class, CraftBirchChestBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.BIRCH_CHEST_BOAT))); + register(new EntityTypeData<>(EntityType.CHERRY_BOAT, CherryBoat.class, CraftCherryBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.CHERRY_BOAT))); + register(new EntityTypeData<>(EntityType.CHERRY_CHEST_BOAT, CherryChestBoat.class, CraftCherryChestBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.CHERRY_CHEST_BOAT))); + register(new EntityTypeData<>(EntityType.DARK_OAK_BOAT, DarkOakBoat.class, CraftDarkOakBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.DARK_OAK_BOAT))); + register(new EntityTypeData<>(EntityType.DARK_OAK_CHEST_BOAT, DarkOakChestBoat.class, CraftDarkOakChestBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.DARK_OAK_CHEST_BOAT))); + register(new EntityTypeData<>(EntityType.JUNGLE_BOAT, JungleBoat.class, CraftJungleBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.JUNGLE_BOAT))); + register(new EntityTypeData<>(EntityType.JUNGLE_CHEST_BOAT, JungleChestBoat.class, CraftJungleChestBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.JUNGLE_CHEST_BOAT))); + register(new EntityTypeData<>(EntityType.MANGROVE_BOAT, MangroveBoat.class, CraftMangroveBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.MANGROVE_BOAT))); + register(new EntityTypeData<>(EntityType.MANGROVE_CHEST_BOAT, MangroveChestBoat.class, CraftMangroveChestBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.MANGROVE_CHEST_BOAT))); + register(new EntityTypeData<>(EntityType.OAK_BOAT, OakBoat.class, CraftOakBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.OAK_BOAT))); + register(new EntityTypeData<>(EntityType.OAK_CHEST_BOAT, OakChestBoat.class, CraftOakChestBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.OAK_CHEST_BOAT))); + register(new EntityTypeData<>(EntityType.PALE_OAK_BOAT, PaleOakBoat.class, CraftPaleOakBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.PALE_OAK_BOAT))); + register(new EntityTypeData<>(EntityType.PALE_OAK_CHEST_BOAT, PaleOakChestBoat.class, CraftPaleOakChestBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.PALE_OAK_CHEST_BOAT))); + register(new EntityTypeData<>(EntityType.SPRUCE_BOAT, SpruceBoat.class, CraftSpruceBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.SPRUCE_BOAT))); + register(new EntityTypeData<>(EntityType.SPRUCE_CHEST_BOAT, SpruceChestBoat.class, CraftSpruceChestBoat::new, createAndMove(net.minecraft.world.entity.EntityTypes.SPRUCE_CHEST_BOAT))); // Set pos - register(new EntityTypeData<>(EntityType.MARKER, Marker.class, CraftMarker::new, createAndSetPos(net.minecraft.world.entity.EntityType.MARKER))); - register(new EntityTypeData<>(EntityType.BLOCK_DISPLAY, BlockDisplay.class, CraftBlockDisplay::new, combine(createAndSetPos(net.minecraft.world.entity.EntityType.BLOCK_DISPLAY), ROT))); // Paper - register(new EntityTypeData<>(EntityType.INTERACTION, Interaction.class, CraftInteraction::new, createAndSetPos(net.minecraft.world.entity.EntityType.INTERACTION))); - register(new EntityTypeData<>(EntityType.ITEM_DISPLAY, ItemDisplay.class, CraftItemDisplay::new, combine(createAndSetPos(net.minecraft.world.entity.EntityType.ITEM_DISPLAY), ROT))); // Paper - register(new EntityTypeData<>(EntityType.TEXT_DISPLAY, TextDisplay.class, CraftTextDisplay::new, combine(createAndSetPos(net.minecraft.world.entity.EntityType.TEXT_DISPLAY), ROT))); // Paper + register(new EntityTypeData<>(EntityType.MARKER, Marker.class, CraftMarker::new, createAndSetPos(net.minecraft.world.entity.EntityTypes.MARKER))); + register(new EntityTypeData<>(EntityType.BLOCK_DISPLAY, BlockDisplay.class, CraftBlockDisplay::new, combine(createAndSetPos(net.minecraft.world.entity.EntityTypes.BLOCK_DISPLAY), ROT))); // Paper + register(new EntityTypeData<>(EntityType.INTERACTION, Interaction.class, CraftInteraction::new, createAndSetPos(net.minecraft.world.entity.EntityTypes.INTERACTION))); + register(new EntityTypeData<>(EntityType.ITEM_DISPLAY, ItemDisplay.class, CraftItemDisplay::new, combine(createAndSetPos(net.minecraft.world.entity.EntityTypes.ITEM_DISPLAY), ROT))); // Paper + register(new EntityTypeData<>(EntityType.TEXT_DISPLAY, TextDisplay.class, CraftTextDisplay::new, combine(createAndSetPos(net.minecraft.world.entity.EntityTypes.TEXT_DISPLAY), ROT))); // Paper // MISC register(new EntityTypeData<>(EntityType.ITEM, Item.class, CraftItem::new, spawnData -> { @@ -283,7 +286,7 @@ Level minecraftWorld() { register(new EntityTypeData<>(EntityType.EXPERIENCE_ORB, ExperienceOrb.class, CraftExperienceOrb::new, combine(combine(spawnData -> new net.minecraft.world.entity.ExperienceOrb(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), 0), CLEAR_MOVE_IF_NOT_RANDOMIZED), (spawnData, experienceOrb) -> { if (!spawnData.randomizeData()) { experienceOrb.setYRot(0); } }) // Paper - respect randomizeData )); - register(new EntityTypeData<>(EntityType.AREA_EFFECT_CLOUD, AreaEffectCloud.class, CraftAreaEffectCloud::new, createAndMove(net.minecraft.world.entity.EntityType.AREA_EFFECT_CLOUD))); // Paper - set area effect cloud rotation + register(new EntityTypeData<>(EntityType.AREA_EFFECT_CLOUD, AreaEffectCloud.class, CraftAreaEffectCloud::new, createAndMove(net.minecraft.world.entity.EntityTypes.AREA_EFFECT_CLOUD))); // Paper - set area effect cloud rotation register(new EntityTypeData<>(EntityType.EGG, Egg.class, CraftEgg::new, spawnData -> new ThrownEgg(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), new ItemStack(Items.EGG)))); register(new EntityTypeData<>(EntityType.LEASH_KNOT, LeashHitch.class, CraftLeash::new, spawnData -> new LeashFenceKnotEntity(spawnData.minecraftWorld(), BlockPos.containing(spawnData.x(), spawnData.y(), spawnData.z())))); // SPIGOT-5732: LeashHitch has no direction and is always centered at a block register(new EntityTypeData<>(EntityType.SNOWBALL, Snowball.class, CraftSnowball::new, spawnData -> new net.minecraft.world.entity.projectile.throwableitemprojectile.Snowball(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), new ItemStack(Items.SNOWBALL)))); @@ -308,13 +311,13 @@ Level minecraftWorld() { })); // Paper end - respect randomizeData register(new EntityTypeData<>(EntityType.EVOKER_FANGS, EvokerFangs.class, CraftEvokerFangs::new, spawnData -> new net.minecraft.world.entity.projectile.EvokerFangs(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), (float) Math.toRadians(spawnData.yaw()), 0, null))); - register(new EntityTypeData<>(EntityType.COMMAND_BLOCK_MINECART, CommandMinecart.class, CraftMinecartCommand::new, createMinecart(net.minecraft.world.entity.EntityType.COMMAND_BLOCK_MINECART))); - register(new EntityTypeData<>(EntityType.MINECART, RideableMinecart.class, CraftMinecartRideable::new, createMinecart(net.minecraft.world.entity.EntityType.MINECART))); - register(new EntityTypeData<>(EntityType.CHEST_MINECART, StorageMinecart.class, CraftMinecartChest::new, createMinecart(net.minecraft.world.entity.EntityType.CHEST_MINECART))); - register(new EntityTypeData<>(EntityType.FURNACE_MINECART, PoweredMinecart.class, CraftMinecartFurnace::new, createMinecart(net.minecraft.world.entity.EntityType.FURNACE_MINECART))); - register(new EntityTypeData<>(EntityType.TNT_MINECART, ExplosiveMinecart.class, CraftMinecartTNT::new, createMinecart(net.minecraft.world.entity.EntityType.TNT_MINECART))); - register(new EntityTypeData<>(EntityType.HOPPER_MINECART, HopperMinecart.class, CraftMinecartHopper::new, createMinecart(net.minecraft.world.entity.EntityType.HOPPER_MINECART))); - register(new EntityTypeData<>(EntityType.SPAWNER_MINECART, SpawnerMinecart.class, CraftMinecartMobSpawner::new, createMinecart(net.minecraft.world.entity.EntityType.SPAWNER_MINECART))); + register(new EntityTypeData<>(EntityType.COMMAND_BLOCK_MINECART, CommandMinecart.class, CraftMinecartCommand::new, createMinecart(net.minecraft.world.entity.EntityTypes.COMMAND_BLOCK_MINECART))); + register(new EntityTypeData<>(EntityType.MINECART, RideableMinecart.class, CraftMinecartRideable::new, createMinecart(net.minecraft.world.entity.EntityTypes.MINECART))); + register(new EntityTypeData<>(EntityType.CHEST_MINECART, StorageMinecart.class, CraftMinecartChest::new, createMinecart(net.minecraft.world.entity.EntityTypes.CHEST_MINECART))); + register(new EntityTypeData<>(EntityType.FURNACE_MINECART, PoweredMinecart.class, CraftMinecartFurnace::new, createMinecart(net.minecraft.world.entity.EntityTypes.FURNACE_MINECART))); + register(new EntityTypeData<>(EntityType.TNT_MINECART, ExplosiveMinecart.class, CraftMinecartTNT::new, createMinecart(net.minecraft.world.entity.EntityTypes.TNT_MINECART))); + register(new EntityTypeData<>(EntityType.HOPPER_MINECART, HopperMinecart.class, CraftMinecartHopper::new, createMinecart(net.minecraft.world.entity.EntityTypes.HOPPER_MINECART))); + register(new EntityTypeData<>(EntityType.SPAWNER_MINECART, SpawnerMinecart.class, CraftMinecartMobSpawner::new, createMinecart(net.minecraft.world.entity.EntityTypes.SPAWNER_MINECART))); // None spawn able register(new EntityTypeData<>(EntityType.FISHING_BOBBER, FishHook.class, CraftFishHook::new, null)); // Cannot spawn a fish hook diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index 16683e854..f148465a5 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -813,7 +813,7 @@ public T launchProjectile(Class projectile, } else if (FishHook.class.isAssignableFrom(projectile) && this.getHandle() instanceof net.minecraft.world.entity.player.Player) { // launch = new FishingBobberEntity((PlayerEntity)this.getHandle(), world, 0, 0, new net.minecraft.item.ItemStack(Items.FISHING_ROD)); - launch = net.minecraft.world.entity.EntityType.FISHING_BOBBER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + launch = net.minecraft.world.entity.EntityTypes.FISHING_BOBBER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); // launch.refreshPositionAndAngles(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); } else if (Fireball.class.isAssignableFrom(projectile)) { @@ -828,8 +828,8 @@ public T launchProjectile(Class projectile, launch = new net.minecraft.world.entity.projectile.hurtingprojectile.DragonFireball(world, this.getHandle(), vec); } else if (AbstractWindCharge.class.isAssignableFrom(projectile)) { launch = BreezeWindCharge.class.isAssignableFrom(projectile) - ? net.minecraft.world.entity.EntityType.BREEZE_WIND_CHARGE.create(world, net.minecraft.world.entity.EntitySpawnReason.TRIGGERED) - : net.minecraft.world.entity.EntityType.WIND_CHARGE.create(world, net.minecraft.world.entity.EntitySpawnReason.TRIGGERED); + ? net.minecraft.world.entity.EntityTypes.BREEZE_WIND_CHARGE.create(world, net.minecraft.world.entity.EntitySpawnReason.TRIGGERED) + : net.minecraft.world.entity.EntityTypes.WIND_CHARGE.create(world, net.minecraft.world.entity.EntitySpawnReason.TRIGGERED); ((net.minecraft.world.entity.projectile.hurtingprojectile.windcharge.AbstractWindCharge)launch).setOwner(this.getHandle()); ((net.minecraft.world.entity.projectile.hurtingprojectile.windcharge.AbstractWindCharge)launch).shootFromRotation(this.getHandle(), this.getHandle().getXRot(), this.getHandle().getYRot(), 0.0f, 1.5f, 1.0f); } else { @@ -841,7 +841,7 @@ public T launchProjectile(Class projectile, } else if (LlamaSpit.class.isAssignableFrom(projectile)) { Location location = this.getEyeLocation(); Vector direction = location.getDirection(); - launch = net.minecraft.world.entity.EntityType.LLAMA_SPIT.create(world, net.minecraft.world.entity.EntitySpawnReason.TRIGGERED); + launch = net.minecraft.world.entity.EntityTypes.LLAMA_SPIT.create(world, net.minecraft.world.entity.EntitySpawnReason.TRIGGERED); ((net.minecraft.world.entity.projectile.LlamaSpit)launch).setOwner(this.getHandle()); ((net.minecraft.world.entity.projectile.LlamaSpit)launch).shoot(direction.getX(), direction.getY(), direction.getZ(), 1.5f, 10.0f); launch.snapTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); @@ -990,9 +990,28 @@ private void damageItemStack0(net.minecraft.world.item.ItemStack nmsStack, int a return Sound.ENTITY_GENERIC_HURT; } + @Override + public @Nullable Sound getHurtSound(org.bukkit.damage.DamageSource damageSource) { + final DamageSource nms = damageSource instanceof CraftDamageSource craft + ? craft.getHandle() : this.getHandle().damageSources().generic(); + final net.minecraft.sounds.SoundEvent sound = this.getHandle().getHurtSound(nms); + return sound == null ? null : org.bukkit.craftbukkit.CraftSound.minecraftToBukkit(sound); + } + + @Override + public float getSoundVolume() { + return this.getHandle().getSoundVolume(); + } + + @Override + public float getSoundPitch() { + return this.getHandle().getVoicePitch(); + } + @Override public void knockback(double arg0, double arg1, double arg2) { - this.getHandle().knockback(arg0, arg2, arg2); + // 26.2: LivingEntity#knockback(double,double,double) was removed + this.getHandle().push(arg0, arg1, arg2); } // 1.19.4: diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMagmaCube.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMagmaCube.java index 8720425ea..9ee88a8b9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMagmaCube.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMagmaCube.java @@ -5,12 +5,12 @@ public class CraftMagmaCube extends CraftSlime implements MagmaCube { - public CraftMagmaCube(CraftServer server, net.minecraft.world.entity.monster.MagmaCube entity) { + public CraftMagmaCube(CraftServer server, net.minecraft.world.entity.monster.cubemob.MagmaCube entity) { super(server, entity); } @Override - public net.minecraft.world.entity.monster.MagmaCube getHandle() { - return (net.minecraft.world.entity.monster.MagmaCube) this.entity; + public net.minecraft.world.entity.monster.cubemob.MagmaCube getHandle() { + return (net.minecraft.world.entity.monster.cubemob.MagmaCube) this.entity; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 3be84feee..8aea23e62 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1699,7 +1699,7 @@ public int applyMending(int amount) { .getRandomItemWith(net.minecraft.world.item.enchantment.EnchantmentEffectComponents.REPAIR_WITH_XP, handle, net.minecraft.world.item.ItemStack::isDamaged); final net.minecraft.world.item.ItemStack itemstack = stackEntry.map(net.minecraft.world.item.enchantment.EnchantedItemInUse::itemStack).orElse(net.minecraft.world.item.ItemStack.EMPTY); if (!itemstack.isEmpty() && itemstack.getItem().components().has(net.minecraft.core.component.DataComponents.MAX_DAMAGE)) { - net.minecraft.world.entity.ExperienceOrb orb = net.minecraft.world.entity.EntityType.EXPERIENCE_ORB.create(handle.level(), net.minecraft.world.entity.EntitySpawnReason.COMMAND); + net.minecraft.world.entity.ExperienceOrb orb = net.minecraft.world.entity.EntityTypes.EXPERIENCE_ORB.create(handle.level(), net.minecraft.world.entity.EntitySpawnReason.COMMAND); orb.setValue(amount); //orb.spawnReason = org.bukkit.entity.ExperienceOrb.SpawnReason.CUSTOM; // TODO orb.setPosRaw(handle.getX(), handle.getY(), handle.getZ()); @@ -2847,14 +2847,7 @@ public void sendMessage(net.kyori.adventure.chat.SignedMessage signedMessage, ne // // this.getHandle().sendChatMessage(net.minecraft.network.chat.OutgoingChatMessage.create(playerChatMessage), this.getHandle().isTextFilteringEnabled(), this.toHandle(boundChatType)); } - - @Deprecated(forRemoval = true) - @Override - public void sendMessage(final net.kyori.adventure.identity.Identity identity, final net.kyori.adventure.text.Component message, final net.kyori.adventure.audience.MessageType type) { - if (getHandle().connection == null) return; - final net.minecraft.core.Registry chatTypeRegistry = this.getHandle().level().registryAccess().lookupOrThrow(net.minecraft.core.registries.Registries.CHAT_TYPE); - this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundSystemChatPacket(PaperAdventure.asVanilla(message), false)); - } + // 26.2: Adventure 5 removed MessageType; this deprecated overload no longer exists. @Override public void sendActionBar(final net.kyori.adventure.text.Component message) { @@ -3386,7 +3379,7 @@ public org.bukkit.entity.Entity getShoulderEntityLeft() { return net.minecraft.world.entity.EntityType.create( TagValueInput.create(scopedCollector.forChild(() -> ".shoulder"), this.getHandle().registryAccess(), this.getHandle().getShoulderEntityLeft()), this.getHandle().level(), - EntitySpawnReason.LOAD + new net.minecraft.world.entity.EntitySpawnRequest(EntitySpawnReason.LOAD, false) ).map(Entity::getBukkitEntity).orElse(null); } } @@ -3412,7 +3405,7 @@ public org.bukkit.entity.Entity getShoulderEntityRight() { return net.minecraft.world.entity.EntityType.create( TagValueInput.create(scopedCollector.forChild(() -> ".shoulder"), this.getHandle().registryAccess(), this.getHandle().getShoulderEntityRight()), this.getHandle().level(), - EntitySpawnReason.LOAD + new net.minecraft.world.entity.EntitySpawnRequest(EntitySpawnReason.LOAD, false) ).map(Entity::getBukkitEntity).orElse(null); } } @@ -3430,4 +3423,21 @@ public void setShoulderEntityRight(org.bukkit.entity.Entity entity) { entity.remove(); } } + + // 26.2: new on Player + @Override + public void unsetFixedPose() { + // Paper's fixed-pose support is a server patch with no vanilla equivalent. + // Clearing it is a no-op here, but we resync the pose so clients stay consistent. + this.getHandle().refreshDimensions(); + } + + + // 26.2: new on Player + @Override + public void resetFlyingTicks() { + // Paper tracks flying ticks in its patched ServerGamePacketListenerImpl; + // vanilla has no such counter, so there is nothing to reset. + } + } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java index 504bb0a4e..05418f156 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java @@ -1,17 +1,18 @@ package org.bukkit.craftbukkit.entity; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.Enemy; import org.bukkit.entity.Slime; -public class CraftSlime extends CraftMob implements Slime, CraftEnemy { +public class CraftSlime extends CraftMob implements Slime, Enemy { // 26.2: AbstractCubeMob does not implement NMS Enemy - public CraftSlime(CraftServer server, net.minecraft.world.entity.monster.Slime entity) { + public CraftSlime(CraftServer server, net.minecraft.world.entity.monster.cubemob.AbstractCubeMob entity) { super(server, entity); } @Override - public net.minecraft.world.entity.monster.Slime getHandle() { - return (net.minecraft.world.entity.monster.Slime) this.entity; + public net.minecraft.world.entity.monster.cubemob.AbstractCubeMob getHandle() { + return (net.minecraft.world.entity.monster.cubemob.AbstractCubeMob) this.entity; } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSulfurCube.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSulfurCube.java new file mode 100644 index 000000000..06365929e --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSulfurCube.java @@ -0,0 +1,103 @@ +package org.bukkit.craftbukkit.entity; + +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.entity.SulfurCube; + +// 26.2: SulfurCube is a new cube mob. Bukkit models it as +// AbstractCubeMob + Shearable + Bucketable + Ageable (notably not a Slime). +public class CraftSulfurCube extends CraftAgeable implements SulfurCube { + + public CraftSulfurCube(CraftServer server, net.minecraft.world.entity.monster.cubemob.SulfurCube entity) { + super(server, entity); + } + + @Override + public net.minecraft.world.entity.monster.cubemob.SulfurCube getHandle() { + return (net.minecraft.world.entity.monster.cubemob.SulfurCube) this.entity; + } + + // --- AbstractCubeMob --- + + @Override + public int getSize() { + return this.getHandle().getSize(); + } + + @Override + public void setSize(int size) { + this.getHandle().setSize(size, this.getHandle().isAlive()); + } + + @Override + public boolean canWander() { + // Cardboard does not expose the wander flag yet; matches CraftSlime. + return true; + } + + @Override + public void setWander(boolean canWander) { + // Cardboard does not expose the wander flag yet; matches CraftSlime. + } + + // --- SulfurCube --- + + @Override + public int getFuseTicks() { + return this.getHandle().getFuse(); + } + + @Override + public void setFuseTicks(int ticks) { + this.getHandle().setFuse(ticks); + } + + @Override + public boolean canExplode() { + return this.getHandle().canExplode(); + } + + @Override + public boolean ignite(boolean force) { + return this.getHandle().primeTime(force); + } + + // --- Shearable --- + + @Override + public void shear(net.kyori.adventure.sound.Sound.Source source) { + if (!(this.getHandle().level() instanceof net.minecraft.server.level.ServerLevel serverLevel)) { + return; + } + this.getHandle().shear(serverLevel, + net.minecraft.sounds.SoundSource.valueOf(source.name()), + net.minecraft.world.item.ItemStack.EMPTY); + } + + @Override + public boolean readyToBeSheared() { + return this.getHandle().readyForShearing(); + } + + // --- Bucketable --- + + @Override + public boolean isFromBucket() { + return this.getHandle().fromBucket(); + } + + @Override + public void setFromBucket(boolean fromBucket) { + this.getHandle().setFromBucket(fromBucket); + } + + @Override + public org.bukkit.inventory.ItemStack getBaseBucketItem() { + return CraftItemStack.asBukkitCopy(this.getHandle().getBucketItemStack()); + } + + @Override + public org.bukkit.Sound getPickupSound() { + return org.bukkit.craftbukkit.CraftSound.minecraftToBukkit(this.getHandle().getPickupSound()); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java index dee934d99..388a93603 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java @@ -21,8 +21,16 @@ public net.minecraft.world.entity.monster.Vex getHandle() { @Override public org.bukkit.entity.Mob getSummoner() { - net.minecraft.world.entity.Mob owner = this.getHandle().getOwner(); - return owner != null ? (org.bukkit.entity.Mob) owner.getBukkitEntity() : null; + // 26.2: Vex#getOwner widened from Mob to LivingEntity + net.minecraft.world.entity.LivingEntity owner = this.getHandle().getOwner(); + return owner instanceof net.minecraft.world.entity.Mob mob + ? (org.bukkit.entity.Mob) mob.getBukkitEntity() : null; + } + + @Override + public org.bukkit.entity.LivingEntity getOwner() { + net.minecraft.world.entity.LivingEntity owner = this.getHandle().getOwner(); + return owner != null ? (org.bukkit.entity.LivingEntity) owner.getBukkitEntity() : null; } @Override @@ -93,4 +101,12 @@ public void setLifeTicks(int lifeTicks) { public boolean hasLimitedLife() { return this.getHandle().hasLimitedLife; } -} + + // 26.2: Vex owner widened from Mob to LivingEntity + @Override + public void setOwner(org.bukkit.entity.LivingEntity owner) { + this.getHandle().setOwner(owner == null ? null + : (net.minecraft.world.entity.Mob) ((CraftLivingEntity) owner).getHandle()); + } + +} \ No newline at end of file diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java index d14aac718..98ce7bd35 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java @@ -8,9 +8,9 @@ import java.util.function.Consumer; import java.util.function.Predicate; import net.kyori.adventure.text.Component; -import net.minecraft.advancements.criterion.DataComponentMatchers; -import net.minecraft.advancements.criterion.ItemPredicate; -import net.minecraft.advancements.criterion.MinMaxBounds; +import net.minecraft.advancements.predicates.DataComponentMatchers; +import net.minecraft.advancements.predicates.ItemPredicate; +import net.minecraft.advancements.predicates.MinMaxBounds; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; import net.minecraft.core.component.DataComponentExactPredicate; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java index 892e2f6d3..b4fdde21b 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java @@ -9,6 +9,7 @@ import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.ExperienceOrb; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -59,7 +60,7 @@ public MinecraftMerchant(Component title) { } public MinecraftMerchant() { - this.title = EntityType.VILLAGER.getDescription(); + this.title = EntityTypes.VILLAGER.getDescription(); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java index 5ffe16a22..8653aca78 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaArmorStand.java @@ -5,6 +5,7 @@ import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.item.component.TypedEntityData; import org.bukkit.Material; import org.bukkit.configuration.serialization.DelegateDeserialization; @@ -90,7 +91,7 @@ void deserializeInternal(CompoundTag tag, Object context) { super.deserializeInternal(tag, context); tag.getCompound(CraftMetaArmorStand.ENTITY_TAG.NBT).ifPresent(entityTag -> { - if (!entityTag.contains(ENTITY_ID.NBT)) entityTag.putString(ENTITY_ID.NBT, EntityType.getKey(EntityType.ARMOR_STAND).toString()); // fixup legacy armorstand metas that did not include this. + if (!entityTag.contains(ENTITY_ID.NBT)) entityTag.putString(ENTITY_ID.NBT, EntityType.getKey(EntityTypes.ARMOR_STAND).toString()); // fixup legacy armorstand metas that did not include this. this.entityTag = entityTag; }); } @@ -177,7 +178,7 @@ public CraftMetaArmorStand clone() { private void populateTagIfNull() { if (this.entityTag == null) { this.entityTag = new CompoundTag(); - this.entityTag.putString(ENTITY_ID.NBT, EntityType.getKey(EntityType.ARMOR_STAND).toString()); + this.entityTag.putString(ENTITY_ID.NBT, EntityType.getKey(EntityTypes.ARMOR_STAND).toString()); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java index 67809c787..0f1555847 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java @@ -240,46 +240,21 @@ private CraftMetaBook(List pages) { this.pages = pages.subList(0, Math.min(MAX_PAGES, pages.size())).stream().map(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection()::serialize).collect(java.util.stream.Collectors.toList()); } - static class CraftMetaBookBuilder implements BookMetaBuilder { - protected final List pages = new ArrayList<>(); - - @Override - public BookMetaBuilder title(net.kyori.adventure.text.Component title) { - return this; - } - - @Override - public BookMetaBuilder author(net.kyori.adventure.text.Component author) { - return this; - } - - @Override - public BookMetaBuilder addPage(net.kyori.adventure.text.Component page) { - this.pages.add(page); - return this; - } - - @Override - public BookMetaBuilder pages(net.kyori.adventure.text.Component... pages) { - java.util.Collections.addAll(this.pages, pages); - return this; - } - - @Override - public BookMetaBuilder pages(java.util.Collection pages) { - this.pages.addAll(pages); - return this; - } - - @Override - public BookMeta build() { - return new CraftMetaBook(this.pages); - } - } - + // 26.2: Paper removed BookMetaBuilder (Adventure 5 replaced it with BookLike/Book.Builder). @Override - public BookMetaBuilder toBuilder() { - return new CraftMetaBookBuilder(); + public net.kyori.adventure.inventory.Book asBook() { + net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer ls = + net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection(); + java.util.List bookPages = new ArrayList<>(); + if (this.pages != null) { + for (String page : this.pages) { + bookPages.add(ls.deserialize(page == null ? "" : page)); + } + } + return net.kyori.adventure.inventory.Book.book( + net.kyori.adventure.text.Component.empty(), + net.kyori.adventure.text.Component.empty(), + bookPages); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java index 715f80da8..44cbf9764 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java @@ -453,31 +453,22 @@ private CraftMetaBookSigned(net.kyori.adventure.text.Component title, net.kyori. this.pages = io.papermc.paper.adventure.PaperAdventure.asVanilla(pages); } - static final class CraftMetaBookSignedBuilder extends CraftMetaBook.CraftMetaBookBuilder { - private net.kyori.adventure.text.Component title; - private net.kyori.adventure.text.Component author; - - @Override - public BookMetaBuilder title(final net.kyori.adventure.text.Component title) { - this.title = title; - return this; - } - - @Override - public BookMetaBuilder author(final net.kyori.adventure.text.Component author) { - this.author = author; - return this; - } - - @Override - public BookMeta build() { - return new CraftMetaBookSigned(this.title, this.author, this.pages); - } - } - + // 26.2: Paper removed BookMetaBuilder (Adventure 5 replaced it with BookLike/Book.Builder). @Override - public BookMetaBuilder toBuilder() { - return new CraftMetaBookSignedBuilder(); + public net.kyori.adventure.inventory.Book asBook() { + java.util.List bookPages = new java.util.ArrayList<>(); + if (this.pages != null) { + for (Object page : this.pages) { + bookPages.add(io.papermc.paper.adventure.PaperAdventure.asAdventure( + (net.minecraft.network.chat.Component) page)); + } + } + return net.kyori.adventure.inventory.Book.book( + this.title == null ? net.kyori.adventure.text.Component.empty() + : LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER.deserialize(this.title), + this.author == null ? net.kyori.adventure.text.Component.empty() + : LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER.deserialize(this.author), + bookPages); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java index 986330815..39bcb5d2a 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java @@ -311,8 +311,8 @@ DataComponentPatch build() { private CraftJukeboxComponent jukebox; private Integer damage; private Integer maxDamage; - private List canPlaceOnPredicates; - private List canBreakPredicates; + private List canPlaceOnPredicates; + private List canBreakPredicates; // hide_additional_tooltip backward compatibility based on TooltipDisplayComponentFix#CONVERTED_ADDITIONAL_TOOLTIP_TYPES private static final Set> HIDDEN_COMPONENTS_PREVIOUSLY = Set.of( @@ -2538,14 +2538,14 @@ public void setCanPlaceOn(final Set canPlaceOn) { this.canPlaceOnPredicates = convertFromLegacyMaterial(canPlaceOn); } - private static List convertFromLegacyMaterial(final Collection materials) { + private static List convertFromLegacyMaterial(final Collection materials) { final net.minecraft.core.Registry blockRegistry = CraftRegistry.getMinecraftRegistry().lookupOrThrow(net.minecraft.core.registries.Registries.BLOCK); return materials.stream().map(m -> { - return net.minecraft.advancements.criterion.BlockPredicate.Builder.block().of(blockRegistry, CraftBlockType.bukkitToMinecraft(m)).build(); + return net.minecraft.advancements.predicates.BlockPredicate.Builder.block().of(blockRegistry, CraftBlockType.bukkitToMinecraft(m)).build(); }).toList(); } - private static Set convertToLegacyMaterial(final List predicates) { + private static Set convertToLegacyMaterial(final List predicates) { return predicates.stream() .flatMap(p -> p.blocks().map(net.minecraft.core.HolderSet::stream).orElse(java.util.stream.Stream.empty())) .map(holder -> CraftBlockType.minecraftToBukkit(holder.value())) @@ -2576,22 +2576,22 @@ public void setPlaceableKeys(final Collection convertFromLegacyNamespaced(final Collection namespaceds) { - final List predicates = new ArrayList<>(); + private static List convertFromLegacyNamespaced(final Collection namespaceds) { + final List predicates = new ArrayList<>(); final net.minecraft.core.Registry blockRegistry = CraftRegistry.getMinecraftRegistry().lookupOrThrow(net.minecraft.core.registries.Registries.BLOCK); for (final com.destroystokyo.paper.Namespaced namespaced : namespaceds) { if (namespaced instanceof final org.bukkit.NamespacedKey key) { - predicates.add(net.minecraft.advancements.criterion.BlockPredicate.Builder.block().of(blockRegistry, CraftBlockType.bukkitToMinecraft(Objects.requireNonNull(org.bukkit.Registry.MATERIAL.get(key)))).build()); + predicates.add(net.minecraft.advancements.predicates.BlockPredicate.Builder.block().of(blockRegistry, CraftBlockType.bukkitToMinecraft(Objects.requireNonNull(org.bukkit.Registry.MATERIAL.get(key)))).build()); } else if (namespaced instanceof final com.destroystokyo.paper.NamespacedTag tag) { - predicates.add(net.minecraft.advancements.criterion.BlockPredicate.Builder.block().of(blockRegistry, net.minecraft.tags.TagKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(tag.getNamespace(), tag.getKey()))).build()); + predicates.add(net.minecraft.advancements.predicates.BlockPredicate.Builder.block().of(blockRegistry, net.minecraft.tags.TagKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(tag.getNamespace(), tag.getKey()))).build()); } } return predicates; } - private static Set convertToLegacyNamespaced(final Collection predicates) { + private static Set convertToLegacyNamespaced(final Collection predicates) { final Set namespaceds = Sets.newHashSet(); - for (final net.minecraft.advancements.criterion.BlockPredicate predicate : predicates) { + for (final net.minecraft.advancements.predicates.BlockPredicate predicate : predicates) { if (predicate.blocks().isEmpty()) { continue; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java index fab2ba1ee..9f7ff1bca 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java @@ -218,4 +218,23 @@ ImmutableMap.Builder serialize(ImmutableMap.Builder + return this.team.getColor().isPresent(); } @Override public net.kyori.adventure.text.format.TextColor color() throws IllegalStateException { - Preconditions.checkState(this.team.getColor().getColor() != null, "Team colors must have hex values"); + Preconditions.checkState(this.team.getColor().isPresent(), "Team colors must have hex values"); this.checkState(); - net.kyori.adventure.text.format.TextColor color = net.kyori.adventure.text.format.TextColor.color(this.team.getColor().getColor()); + net.kyori.adventure.text.format.TextColor color = net.kyori.adventure.text.format.TextColor.color( + this.team.getColor().orElseThrow().rgb()); if (!(color instanceof net.kyori.adventure.text.format.NamedTextColor)) { throw new IllegalStateException("Team doesn't have a NamedTextColor"); } @@ -92,7 +94,10 @@ public net.kyori.adventure.text.format.TextColor color() throws IllegalStateExce @Override public void color(net.kyori.adventure.text.format.NamedTextColor color) { this.checkState(); - this.team.setColor(color == null ? net.minecraft.ChatFormatting.RESET : io.papermc.paper.adventure.PaperAdventure.asVanilla(color)); + // 26.2: PlayerTeam#setColor takes Optional instead of ChatFormatting + this.team.setColor(color == null ? java.util.Optional.empty() + : java.util.Optional.ofNullable(net.minecraft.world.scores.TeamColor.byName( + net.kyori.adventure.text.format.NamedTextColor.NAMES.key(color)))); } @Override @@ -144,7 +149,10 @@ public void setSuffix(String suffix) { public ChatColor getColor() { this.checkState(); - return CraftChatMessage.getColor(this.team.getColor()); + // 26.2: map Optional back to a Bukkit ChatColor + return this.team.getColor() + .map(tc -> CraftChatMessage.getColor(net.minecraft.ChatFormatting.valueOf(tc.name()))) + .orElse(ChatColor.RESET); } @Override @@ -153,7 +161,8 @@ public void setColor(ChatColor color) { Preconditions.checkArgument(!color.isFormat(), "Color must be a color not a format"); this.checkState(); - this.team.setColor(CraftChatMessage.getColor(color)); + this.team.setColor(java.util.Optional.ofNullable( + net.minecraft.world.scores.TeamColor.byName(CraftChatMessage.getColor(color).name()))); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/spawner/PaperSharedSpawnerLogic.java b/src/main/java/org/bukkit/craftbukkit/spawner/PaperSharedSpawnerLogic.java index a91c9c424..eda6def92 100644 --- a/src/main/java/org/bukkit/craftbukkit/spawner/PaperSharedSpawnerLogic.java +++ b/src/main/java/org/bukkit/craftbukkit/spawner/PaperSharedSpawnerLogic.java @@ -12,6 +12,7 @@ import net.minecraft.util.ProblemReporter; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; @@ -56,7 +57,7 @@ default void setSpawnedItem(final ItemStack itemStack) { try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(() -> getSpawner().toString(), LOGGER)) { TagValueOutput tagValueOutput = TagValueOutput.createWithContext(scopedCollector, this.getInternalWorld().registryAccess()); - tagValueOutput.putString(Entity.TAG_ID, BuiltInRegistries.ENTITY_TYPE.getKey(EntityType.ITEM).toString()); + tagValueOutput.putString(Entity.TAG_ID, BuiltInRegistries.ENTITY_TYPE.getKey(EntityTypes.ITEM).toString()); tagValueOutput.store("Item", net.minecraft.world.item.ItemStack.CODEC, item); this.setNextSpawnData( diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java index 62fc17ec0..880c3e1bf 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java @@ -49,6 +49,14 @@ public static ChatFormatting getColor(ChatColor color) { return CraftChatMessage.formatMap.get(color.getChar()); } + // 26.2: ChatFormatting.isFormat() was removed; these are the style (non-colour) codes. + public static boolean isFormat(ChatFormatting format) { + return switch (format) { + case OBFUSCATED, BOLD, STRIKETHROUGH, UNDERLINE, ITALIC -> true; + default -> false; + }; + } + public static ChatColor getColor(ChatFormatting format) { return ChatColor.getByChar(format.code); } @@ -105,7 +113,7 @@ private StringMessage(String message, boolean keepNewlines, boolean plain) { this.modifier = StringMessage.RESET.withColor(TextColor.parseColor(this.hex.toString()).result().orElse(null)); // Paper this.hex = null; } - } else if (format.isFormat() && format != ChatFormatting.RESET) { + } else if (CraftChatMessage.isFormat(format) && format != ChatFormatting.RESET) { switch (format) { case BOLD: this.modifier = this.modifier.withBold(Boolean.TRUE); diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java index 5709ecd2b..04741d22f 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -121,37 +121,35 @@ public Block IgetBlock(Material m) { return CraftMagicNumbers.getBlock(m); } - @Override + // 26.2: no longer declared by the Paper supertype public net.kyori.adventure.text.flattener.ComponentFlattener componentFlattener() { return io.papermc.paper.adventure.PaperAdventure.FLATTENER; } - @Override + // 26.2: no longer declared by the Paper supertype public net.kyori.adventure.text.serializer.gson.GsonComponentSerializer colorDownsamplingGsonComponentSerializer() { return net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.colorDownsamplingGson(); } - @Override + // 26.2: no longer declared by the Paper supertype public net.kyori.adventure.text.serializer.gson.GsonComponentSerializer gsonComponentSerializer() { return net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson(); } - @Override - public net.kyori.adventure.text.serializer.plain.PlainComponentSerializer plainComponentSerializer() { - return io.papermc.paper.adventure.PaperAdventure.PLAIN; - } + // 26.2: no longer declared by the Paper supertype + // 26.2: removed - Adventure 5 deleted PlainComponentSerializer - @Override + // 26.2: no longer declared by the Paper supertype public net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer plainTextSerializer() { return net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText(); } - @Override + // 26.2: no longer declared by the Paper supertype public net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer legacyComponentSerializer() { return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection(); } - @Override + // 26.2: no longer declared by the Paper supertype public net.kyori.adventure.text.Component resolveWithContext(final net.kyori.adventure.text.Component component, final org.bukkit.command.CommandSender context, final org.bukkit.entity.Entity scoreboardSubject, final boolean bypassPermissions) throws IOException { //return io.papermc.paper.adventure.PaperAdventure.resolveWithContext(component, context, scoreboardSubject, bypassPermissions); return component; // TODO @@ -430,7 +428,7 @@ public byte[] processClass(PluginDescriptionFile pdf, String path, byte[] clazz) return clazz; } - @Override + // 26.2: no longer declared by the Paper supertype public Multimap getDefaultAttributeModifiers(Material material, EquipmentSlot slot) { // Paper start - delegate to method on ItemType final org.bukkit.inventory.ItemType item = material.asItemType(); @@ -439,28 +437,31 @@ public Multimap getDefaultAttributeModifiers(Mater // Paper end - delegate to method on ItemType } - @Override + // 26.2: no longer declared by the Paper supertype public CreativeCategory getCreativeCategory(Material material) { return material.getCreativeCategory(); } - @Override + // 26.2: no longer declared by the Paper supertype public String getBlockTranslationKey(Material material) { return material.getBlockTranslationKey(); } - @Override + // 26.2: no longer declared by the Paper supertype public String getItemTranslationKey(Material material) { return material.getItemTranslationKey(); } - @Override + // 26.2: no longer declared by the Paper supertype public String getTranslationKey(EntityType entityType) { Preconditions.checkArgument(entityType.getName() != null, "Invalid name of EntityType %s for translation key", entityType); - return net.minecraft.world.entity.EntityType.byString(entityType.getName()).map(net.minecraft.world.entity.EntityType::getDescriptionId).orElseThrow(); + // 26.2: EntityType.byString was removed; resolve via the registry + return net.minecraft.core.registries.BuiltInRegistries.ENTITY_TYPE + .getOptional(net.minecraft.resources.Identifier.parse(entityType.getName())) + .map(net.minecraft.world.entity.EntityType::getDescriptionId).orElseThrow(); } - @Override + // 26.2: no longer declared by the Paper supertype public String getTranslationKey(ItemStack itemStack) { net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack); return nmsItemStack.getItem().getDescriptionId(); @@ -475,7 +476,7 @@ public boolean isSupportedApiVersion(String apiVersion) { return !toCheck.isNewerThan(ApiVersion.CURRENT) && !toCheck.isOlderThan(minimumVersion); } - @Override + // 26.2: no longer declared by the Paper supertype public String getTranslationKey(final Attribute attribute) { return attribute.getTranslationKey(); } @@ -488,7 +489,7 @@ public PotionType.InternalPotionData getInternalPotionData(NamespacedKey namespa return new CraftPotionType(namespacedKey, potionRegistry); } - @Override + // 26.2: no longer declared by the Paper supertype public DamageSource.Builder createDamageSourceBuilder(DamageType damageType) { return new CraftDamageSourceBuilder(damageType); } @@ -508,7 +509,7 @@ public B get(RegistryKey registry, NamespacedKey namespaced return CraftRegistry.get(registry, namespacedKey, ApiVersion.CURRENT); } - @Override + // 26.2: no longer declared by the Paper supertype public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { //return new com.destroystokyo.paper.PaperVersionFetcher(); // TODO return new com.destroystokyo.paper.util.VersionFetcher() { @@ -524,7 +525,7 @@ public Component getVersionMessage() { }; } - @Override + // 26.2: no longer declared by the Paper supertype public byte[] serializeItem(ItemStack item) { Preconditions.checkNotNull(item, "null cannot be serialized"); Preconditions.checkArgument(!item.isEmpty(), "Empty itemstack cannot be serialized"); @@ -537,7 +538,7 @@ public byte[] serializeItem(ItemStack item) { ); } - @Override + // 26.2: no longer declared by the Paper supertype public ItemStack deserializeItem(byte[] data) { Preconditions.checkNotNull(data, "null cannot be deserialized"); Preconditions.checkArgument(data.length > 0, "cannot deserialize nothing"); @@ -567,7 +568,7 @@ private ItemStack deserializeItem(CompoundTag compound) { return (CompoundTag)dataFixer.update(type, new Dynamic<>(NbtOps.INSTANCE, nbt), fromVersion, toVersion).getValue(); } - @Override + // 26.2: no longer declared by the Paper supertype public @org.jetbrains.annotations.NotNull Map serializeStack(final ItemStack itemStack) { if (itemStack.isEmpty()) { return Map.of("id", "minecraft:air", SharedConstants.DATA_VERSION_TAG, this.getDataVersion(), "schema_version", 1); @@ -783,7 +784,7 @@ private net.minecraft.world.entity.Entity deserializeEntity(CompoundTag compound nmsEntity = net.minecraft.world.entity.EntityType.create( TagValueInput.create(problemReporter, world.registryAccess(), compound), world, - net.minecraft.world.entity.EntitySpawnReason.LOAD + new net.minecraft.world.entity.EntitySpawnRequest(net.minecraft.world.entity.EntitySpawnReason.LOAD, false) ).orElseThrow(() -> new IllegalArgumentException("An ID was not found for the data. Did you downgrade?")); } @@ -827,8 +828,8 @@ private CompoundTag deserializeNbtFromBytes(byte[] data) { return compound; } - @Override - public int nextEntityId() { + // 26.2: no longer declared by the Paper supertype + public int nextEntityId(org.bukkit.World world) { //return net.minecraft.world.entity.Entity.nextEntityId(); // TODO return 0; } @@ -843,7 +844,7 @@ public int getProtocolVersion() { return net.minecraft.SharedConstants.getCurrentVersion().protocolVersion(); } - @Override + // 26.2: no longer declared by the Paper supertype public boolean isValidRepairItemStack(org.bukkit.inventory.ItemStack itemToBeRepaired, org.bukkit.inventory.ItemStack repairMaterial) { if (!itemToBeRepaired.getType().isItem() || !repairMaterial.getType().isItem()) { return false; @@ -851,35 +852,35 @@ public boolean isValidRepairItemStack(org.bukkit.inventory.ItemStack itemToBeRep return CraftItemStack.unwrap(itemToBeRepaired).isValidRepairItem(CraftItemStack.unwrap(repairMaterial)); } - @Override + // 26.2: no longer declared by the Paper supertype public boolean hasDefaultEntityAttributes(NamespacedKey entityKey) { return net.minecraft.world.entity.ai.attributes.DefaultAttributes.hasSupplier(net.minecraft.core.registries.BuiltInRegistries.ENTITY_TYPE.getValue(CraftNamespacedKey.toMinecraft(entityKey))); } - @Override + // 26.2: no longer declared by the Paper supertype public org.bukkit.attribute.Attributable getDefaultEntityAttributes(NamespacedKey entityKey) { Preconditions.checkArgument(hasDefaultEntityAttributes(entityKey), entityKey + " doesn't have default attributes"); var supplier = net.minecraft.world.entity.ai.attributes.DefaultAttributes.getSupplier((net.minecraft.world.entity.EntityType) net.minecraft.core.registries.BuiltInRegistries.ENTITY_TYPE.getValue(CraftNamespacedKey.toMinecraft(entityKey))); return new io.papermc.paper.attribute.UnmodifiableAttributeMap(supplier); } - @Override + // 26.2: no longer declared by the Paper supertype public org.bukkit.NamespacedKey getBiomeKey(org.bukkit.RegionAccessor accessor, int x, int y, int z) { return accessor.getBiome(x, y, z).getKey(); } - @Override + // 26.2: no longer declared by the Paper supertype public void setBiomeKey(org.bukkit.RegionAccessor accessor, int x, int y, int z, org.bukkit.NamespacedKey biomeKey) { accessor.setBiome(x, y, z, org.bukkit.Registry.BIOME.getOrThrow(biomeKey)); } - @Override + // 26.2: no longer declared by the Paper supertype public String getStatisticCriteriaKey(org.bukkit.Statistic statistic) { if (statistic.getType() != org.bukkit.Statistic.Type.UNTYPED) return "minecraft.custom:minecraft." + statistic.getKey().getKey(); return org.bukkit.craftbukkit.CraftStatistic.getNMSStatistic(statistic).getName(); } - @Override + // 26.2: no longer declared by the Paper supertype public List computeTooltipLines(final ItemStack itemStack, final io.papermc.paper.inventory.tooltip.TooltipContext tooltipContext, final org.bukkit.entity.Player player) { Preconditions.checkArgument(tooltipContext != null, "tooltipContext cannot be null"); net.minecraft.world.item.TooltipFlag.Default flag = tooltipContext.isAdvanced() ? net.minecraft.world.item.TooltipFlag.ADVANCED : net.minecraft.world.item.TooltipFlag.NORMAL; @@ -893,7 +894,7 @@ public List computeTooltipLines(final ItemSt } // Paper end - @Override + // 26.2: no longer declared by the Paper supertype public org.bukkit.Color getSpawnEggLayerColor(final EntityType entityType, final int layer) { final net.minecraft.world.entity.EntityType nmsType = org.bukkit.craftbukkit.entity.CraftEntityType.bukkitToMinecraft(entityType); @@ -911,12 +912,12 @@ public org.bukkit.Color getSpawnEggLayerColor(final EntityType entityType, final return null; } - @Override + // 26.2: no longer declared by the Paper supertype public io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager createPluginLifecycleEventManager(final org.bukkit.plugin.java.JavaPlugin plugin, final java.util.function.BooleanSupplier registrationCheck) { return new io.papermc.paper.plugin.lifecycle.event.PaperLifecycleEventManager<>(plugin, registrationCheck); } - @Override + // 26.2: no longer declared by the Paper supertype public org.bukkit.inventory.ItemStack createEmptyStack() { return CraftItemStack.asCraftMirror(null); } @@ -931,4 +932,30 @@ public ItemStack deserializeItemHover(final HoverEvent.ShowItem itemHover) { .parse(ops, encoded).getOrThrow(IllegalStateException::new) .item()); } + + // 26.2: new on UnsafeValues + @Override + public java.util.List loadAdvancements( + java.util.Map advancements, boolean force) { + // 26.2: bulk variant is just the single-advancement path applied in order + final java.util.List loaded = + new java.util.ArrayList<>(advancements.size()); + for (java.util.Map.Entry entry : advancements.entrySet()) { + loaded.add(this.loadAdvancement(entry.getKey(), entry.getValue(), force)); + } + return loaded; + } + + + // 26.2: new on UnsafeValues + @Override + public org.bukkit.advancement.Advancement loadAdvancement(net.kyori.adventure.key.Key key, String advancement, boolean force) { + // 26.2: keyed/force variant delegates to the existing NamespacedKey loader + final NamespacedKey bukkitKey = new NamespacedKey(key.namespace(), key.value()); + if (force && Bukkit.getAdvancement(bukkitKey) != null) { + this.removeAdvancement(bukkitKey); + } + return this.loadAdvancement(bukkitKey, advancement); + } + } diff --git a/src/main/java/org/cardboardpowered/TeleportTargetExtra.java b/src/main/java/org/cardboardpowered/TeleportTargetExtra.java index 911e2c1d5..1c6d8977b 100644 --- a/src/main/java/org/cardboardpowered/TeleportTargetExtra.java +++ b/src/main/java/org/cardboardpowered/TeleportTargetExtra.java @@ -25,7 +25,9 @@ public static TeleportTransition newTeleportTarget(ServerLevel level, Entity ent } private static Vec3 getWorldSpawnPos(ServerLevel world, Entity entity) { - return entity.adjustSpawnLocation(world, world.getRespawnData().pos()).getBottomCenter(); + // 26.2: BlockPos#getBottomCenter was removed + return net.minecraft.world.phys.Vec3.atBottomCenterOf( + entity.adjustSpawnLocation(world, world.getRespawnData().pos())); } } diff --git a/src/main/java/org/cardboardpowered/adventure/NBTLegacyHoverEventSerializer.java b/src/main/java/org/cardboardpowered/adventure/NBTLegacyHoverEventSerializer.java index 75e0263e9..ef226bcb8 100644 --- a/src/main/java/org/cardboardpowered/adventure/NBTLegacyHoverEventSerializer.java +++ b/src/main/java/org/cardboardpowered/adventure/NBTLegacyHoverEventSerializer.java @@ -1,6 +1,6 @@ package org.cardboardpowered.adventure; -import net.kyori.adventure.text.serializer.gson.LegacyHoverEventSerializer; +import net.kyori.adventure.text.serializer.json.LegacyHoverEventSerializer; @Deprecated public final class NBTLegacyHoverEventSerializer extends io.papermc.paper.adventure.providers.NBTLegacyHoverEventSerializer implements LegacyHoverEventSerializer { diff --git a/src/main/java/org/cardboardpowered/bridge/server/level/ServerPlayerBridge.java b/src/main/java/org/cardboardpowered/bridge/server/level/ServerPlayerBridge.java index 23f941be7..b2342a12d 100644 --- a/src/main/java/org/cardboardpowered/bridge/server/level/ServerPlayerBridge.java +++ b/src/main/java/org/cardboardpowered/bridge/server/level/ServerPlayerBridge.java @@ -24,6 +24,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.attribute.EnvironmentAttributes; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BedBlock; import net.minecraft.world.level.block.Block; @@ -79,7 +80,7 @@ public interface ServerPlayerBridge extends EntityBridge { if (block instanceof RespawnAnchorBlock && (flag || blockState.getValue(RespawnAnchorBlock.CHARGE) > 0) && RespawnAnchorBlock.canSetSpawn(level, blockPos)) { - Optional optional = RespawnAnchorBlock.findStandUpPosition(EntityType.PLAYER, level, blockPos); + Optional optional = RespawnAnchorBlock.findStandUpPosition(EntityTypes.PLAYER, level, blockPos); Runnable consumeAnchorCharge = null; // Paper - Fix SPIGOT-5989 (don't use charge until after respawn event) if (!flag && useCharge && optional.isPresent()) { consumeAnchorCharge = () -> level.setBlock(blockPos, blockState.setValue(RespawnAnchorBlock.CHARGE, blockState.getValue(RespawnAnchorBlock.CHARGE) - 1), Block.UPDATE_ALL); // Paper - Fix SPIGOT-5989 (don't use charge until after respawn event) @@ -88,7 +89,7 @@ public interface ServerPlayerBridge extends EntityBridge { return optional.map(pos -> ServerPlayer_RespawnPosAngle.of(pos, blockPos, 0.0F, false, true, finalConsumeAnchorCharge)); // Paper - Fix SPIGOT-5989 (don't use charge until after respawn event) } else if (block instanceof BedBlock && level.environmentAttributes().getValue(EnvironmentAttributes.BED_RULE, blockPos).canSetSpawn(level)) { - return BedBlock.findStandUpPosition(EntityType.PLAYER, level, blockPos, blockState.getValue(BedBlock.FACING), yaw) + return BedBlock.findStandUpPosition(EntityTypes.PLAYER, level, blockPos, blockState.getValue(BedBlock.FACING), yaw) .map(pos -> ServerPlayer_RespawnPosAngle.of(pos, blockPos, 0.0F, true, false, null)); // Paper - Fix SPIGOT-5989 } else if (!flag) { return Optional.empty(); diff --git a/src/main/java/org/cardboardpowered/bridge/server/network/ClientBrandBridge.java b/src/main/java/org/cardboardpowered/bridge/server/network/ClientBrandBridge.java new file mode 100644 index 000000000..eb7037ba3 --- /dev/null +++ b/src/main/java/org/cardboardpowered/bridge/server/network/ClientBrandBridge.java @@ -0,0 +1,12 @@ +package org.cardboardpowered.bridge.server.network; + +/** + * 26.2: Paper tracks the client brand on its patched connection class. + * Cardboard captures it from the vanilla {@code minecraft:brand} custom payload instead. + */ +public interface ClientBrandBridge { + + String cardboard_getClientBrand(); + + void cardboard_setClientBrand(String brand); +} diff --git a/src/main/java/org/cardboardpowered/bridge/world/entity/monster/zombie/ZombieBridge.java b/src/main/java/org/cardboardpowered/bridge/world/entity/monster/zombie/ZombieBridge.java index 6f962ae21..dae8e45a7 100644 --- a/src/main/java/org/cardboardpowered/bridge/world/entity/monster/zombie/ZombieBridge.java +++ b/src/main/java/org/cardboardpowered/bridge/world/entity/monster/zombie/ZombieBridge.java @@ -4,6 +4,7 @@ import net.minecraft.world.entity.ConversionParams; import net.minecraft.world.entity.EntitySpawnReason; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.monster.zombie.Zombie; import net.minecraft.world.entity.monster.zombie.ZombieVillager; import net.minecraft.world.entity.npc.villager.Villager; @@ -12,7 +13,7 @@ public interface ZombieBridge { public static @Nullable ZombieVillager convertVillagerToZombieVillager(ServerLevel level, Villager villager, net.minecraft.core.BlockPos blockPosition, boolean silent, org.bukkit.event.entity.EntityTransformEvent.TransformReason transformReason, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason creatureSpawnReason) { - ZombieVillager zombieVillager = villager.convertTo(EntityType.ZOMBIE_VILLAGER, ConversionParams.single(villager, true, true), mob -> { + ZombieVillager zombieVillager = villager.convertTo(EntityTypes.ZOMBIE_VILLAGER, ConversionParams.single(villager, true, true), mob -> { mob.finalizeSpawn(level, level.getCurrentDifficultyAt(mob.blockPosition()), EntitySpawnReason.CONVERSION, new Zombie.ZombieGroupData(false, true)); mob.setVillagerData(villager.getVillagerData()); mob.setGossips(villager.getGossips().copy()); diff --git a/src/main/java/org/cardboardpowered/impl/CardboardAbstractServer.java b/src/main/java/org/cardboardpowered/impl/CardboardAbstractServer.java index 957ee7381..f6fa236eb 100644 --- a/src/main/java/org/cardboardpowered/impl/CardboardAbstractServer.java +++ b/src/main/java/org/cardboardpowered/impl/CardboardAbstractServer.java @@ -11,7 +11,7 @@ public abstract class CardboardAbstractServer implements org.bukkit.Server { - public static final String API_VERSION = "26.1.2"; + public static final String API_VERSION = "26.2"; public final String serverName = "Cardboard"; diff --git a/src/main/java/org/cardboardpowered/impl/CardboardPotionEffectType.java b/src/main/java/org/cardboardpowered/impl/CardboardPotionEffectType.java index 27f50bf49..ed5a7ad58 100644 --- a/src/main/java/org/cardboardpowered/impl/CardboardPotionEffectType.java +++ b/src/main/java/org/cardboardpowered/impl/CardboardPotionEffectType.java @@ -155,7 +155,7 @@ public String getName() { @Override public boolean isInstant() { - return handle.isInstantenous(); + return handle.isInstantaneous(); } @Override diff --git a/src/main/java/org/cardboardpowered/impl/PaperServerInternalAPIBridge.java b/src/main/java/org/cardboardpowered/impl/PaperServerInternalAPIBridge.java index 3f3a40452..45f44c05f 100644 --- a/src/main/java/org/cardboardpowered/impl/PaperServerInternalAPIBridge.java +++ b/src/main/java/org/cardboardpowered/impl/PaperServerInternalAPIBridge.java @@ -125,4 +125,72 @@ public Occupancy createOccupancy(String enumNameEntry) { return null; } -} \ No newline at end of file + + // 26.2: Paper moved the adventure serializer accessors off UnsafeValues onto InternalAPIBridge + @Override + public net.kyori.adventure.text.flattener.ComponentFlattener componentFlattener() { + return io.papermc.paper.adventure.PaperAdventure.FLATTENER; + } + + + // 26.2: Paper split these off UnsafeValues onto InternalAPIBridge. + // The implementations still live on CraftMagicNumbers, so delegate rather than duplicate. + private static final org.bukkit.craftbukkit.util.CraftMagicNumbers MN = + org.bukkit.craftbukkit.util.CraftMagicNumbers.INSTANCE; + + @Override + public DamageSource.Builder createDamageSourceBuilder(org.bukkit.damage.DamageType damageType) { + return MN.createDamageSourceBuilder(damageType); + } + + @Override + public String getTranslationKey(org.bukkit.entity.EntityType entityType) { + return MN.getTranslationKey(entityType); + } + + @Override + public org.bukkit.entity.SpawnCategory getSpawnCategory(org.bukkit.entity.EntityType entityType) { + return org.bukkit.craftbukkit.util.CraftSpawnCategory.toBukkit( + org.bukkit.craftbukkit.entity.CraftEntityType.bukkitToMinecraft(entityType).getCategory()); + } + + @Override + public org.bukkit.inventory.ItemStack deserializeItem(byte[] data) { + return MN.deserializeItem(data); + } + + @Override + public boolean hasDefaultEntityAttributes(org.bukkit.NamespacedKey entityKey) { + return MN.hasDefaultEntityAttributes(entityKey); + } + + @Override + public org.bukkit.attribute.Attributable getDefaultEntityAttributes(org.bukkit.NamespacedKey entityKey) { + return MN.getDefaultEntityAttributes(entityKey); + } + + @Override + public String getStatisticCriteriaKey(org.bukkit.Statistic statistic) { + return MN.getStatisticCriteriaKey(statistic); + } + + @Override + public io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager + createPluginLifecycleEventManager(org.bukkit.plugin.java.JavaPlugin plugin, + java.util.function.BooleanSupplier registrationCheck) { + return MN.createPluginLifecycleEventManager(plugin, registrationCheck); + } + + @Override + public org.bukkit.inventory.ItemStack createEmptyStack() { + return MN.createEmptyStack(); + } + + @Override + public Component resolveWithContext(Component component, org.bukkit.command.@Nullable CommandSender context, + org.bukkit.entity.@Nullable Entity scoreboardSubject, + boolean bypassPermissions) throws java.io.IOException { + return MN.resolveWithContext(component, context, scoreboardSubject, bypassPermissions); + } + +} diff --git a/src/main/java/org/cardboardpowered/impl/world/CraftWorld.java b/src/main/java/org/cardboardpowered/impl/world/CraftWorld.java index 6af2e9577..4e09a7e3e 100644 --- a/src/main/java/org/cardboardpowered/impl/world/CraftWorld.java +++ b/src/main/java/org/cardboardpowered/impl/world/CraftWorld.java @@ -1686,7 +1686,7 @@ public net.minecraft.world.entity.Entity createEntity_Old(Location location, Cla if(Boat.class.isAssignableFrom(clazz)) { // entity = new BoatEntity(nms, x, y, z); - entity = net.minecraft.world.entity.EntityType.OAK_BOAT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.OAK_BOAT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); entity.setPos(x, y, z); entity.snapTo(x, y, z, yaw, pitch); } else if(FallingBlock.class.isAssignableFrom(clazz)) { @@ -1694,28 +1694,28 @@ public net.minecraft.world.entity.Entity createEntity_Old(Location location, Cla // entity = new FallingBlockEntity(nms, x, y, z, nms.getBlockState(new BlockPos(x, y, z))); } else if(Projectile.class.isAssignableFrom(clazz)) { if(Snowball.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.SNOWBALL.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SNOWBALL.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); entity.setPos(x, y, z); } else if(Egg.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.EGG.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.EGG.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); entity.setPos(x, y, z); } else if(AbstractArrow.class.isAssignableFrom(clazz)) { if(TippedArrow.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.ARROW.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ARROW.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); // TODO set type } else if(SpectralArrow.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.SPECTRAL_ARROW.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SPECTRAL_ARROW.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Trident.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.TRIDENT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.TRIDENT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else { - entity = net.minecraft.world.entity.EntityType.ARROW.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ARROW.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } entity.snapTo(x, y, z, 0, 0); } else if(ThrownExpBottle.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.EXPERIENCE_BOTTLE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.EXPERIENCE_BOTTLE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); entity.snapTo(x, y, z, 0, 0); } else if(EnderPearl.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.ENDER_PEARL.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ENDER_PEARL.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); entity.snapTo(x, y, z, 0, 0); } else if(ThrownPotion.class.isAssignableFrom(clazz)) { /* @@ -1731,220 +1731,220 @@ public net.minecraft.world.entity.Entity createEntity_Old(Location location, Cla } else if(Fireball.class.isAssignableFrom(clazz)) { // TODO Fireball } else if(ShulkerBullet.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.SHULKER_BULLET.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SHULKER_BULLET.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); entity.snapTo(x, y, z, yaw, pitch); } else if(LlamaSpit.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.LLAMA_SPIT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.LLAMA_SPIT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); entity.snapTo(x, y, z, yaw, pitch); } else if(Firework.class.isAssignableFrom(clazz)) { entity = new FireworkRocketEntity(world, x, y, z, net.minecraft.world.item.ItemStack.EMPTY); } } else if(Minecart.class.isAssignableFrom(clazz)) { if(PoweredMinecart.class.isAssignableFrom(clazz)) { - entity = new MinecartFurnace(net.minecraft.world.entity.EntityType.FURNACE_MINECART, world); + entity = new MinecartFurnace(net.minecraft.world.entity.EntityTypes.FURNACE_MINECART, world); entity.setPos(x, y, z); } else if(StorageMinecart.class.isAssignableFrom(clazz)) { - entity = new MinecartChest(net.minecraft.world.entity.EntityType.CHEST_MINECART, world); + entity = new MinecartChest(net.minecraft.world.entity.EntityTypes.CHEST_MINECART, world); entity.setPos(x, y, z); } else if(ExplosiveMinecart.class.isAssignableFrom(clazz)) { - entity = new MinecartTNT(net.minecraft.world.entity.EntityType.TNT_MINECART, world); + entity = new MinecartTNT(net.minecraft.world.entity.EntityTypes.TNT_MINECART, world); entity.setPos(x, y, z); } else if(HopperMinecart.class.isAssignableFrom(clazz)) { - entity = new MinecartHopper(net.minecraft.world.entity.EntityType.HOPPER_MINECART, world); + entity = new MinecartHopper(net.minecraft.world.entity.EntityTypes.HOPPER_MINECART, world); entity.setPos(x, y, z); } else if(SpawnerMinecart.class.isAssignableFrom(clazz)) { // entity = new SpawnerMinecartEntity(nms, x, y, z); - entity = new MinecartSpawner(net.minecraft.world.entity.EntityType.SPAWNER_MINECART, world); + entity = new MinecartSpawner(net.minecraft.world.entity.EntityTypes.SPAWNER_MINECART, world); entity.setPos(x, y, z); } else if(CommandMinecart.class.isAssignableFrom(clazz)) { - entity = new MinecartCommandBlock(net.minecraft.world.entity.EntityType.COMMAND_BLOCK_MINECART, world); + entity = new MinecartCommandBlock(net.minecraft.world.entity.EntityTypes.COMMAND_BLOCK_MINECART, world); entity.setPos(x, y, z); } else { - entity = new net.minecraft.world.entity.vehicle.minecart.Minecart(net.minecraft.world.entity.EntityType.MINECART, world); + entity = new net.minecraft.world.entity.vehicle.minecart.Minecart(net.minecraft.world.entity.EntityTypes.MINECART, world); entity.setPos(x, y, z); } } else if(EnderSignal.class.isAssignableFrom(clazz)) { // TODO EnderSignal } else if(EnderCrystal.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.END_CRYSTAL.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.END_CRYSTAL.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); entity.snapTo(x, y, z, 0, 0); } else if(LivingEntity.class.isAssignableFrom(clazz)) { if(Chicken.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.CHICKEN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.CHICKEN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Cow.class.isAssignableFrom(clazz)) { if(MushroomCow.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.MOOSHROOM.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.MOOSHROOM.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else { - entity = net.minecraft.world.entity.EntityType.COW.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.COW.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Golem.class.isAssignableFrom(clazz)) { if(Snowman.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.SNOW_GOLEM.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SNOW_GOLEM.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(IronGolem.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.IRON_GOLEM.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.IRON_GOLEM.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Shulker.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.SHULKER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SHULKER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Creeper.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.CREEPER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.CREEPER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Ghast.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.GHAST.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.GHAST.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Pig.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.PIG.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.PIG.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Player.class.isAssignableFrom(clazz)) { // need a net server handler for this one } else if(Sheep.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.SHEEP.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SHEEP.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(AbstractHorse.class.isAssignableFrom(clazz)) { if(ChestedHorse.class.isAssignableFrom(clazz)) { if(Donkey.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.DONKEY.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.DONKEY.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Mule.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.MULE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.MULE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Llama.class.isAssignableFrom(clazz)) { entity = TraderLlama.class.isAssignableFrom(clazz) ? - net.minecraft.world.entity.EntityType.TRADER_LLAMA.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND) - : net.minecraft.world.entity.EntityType.LLAMA.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + net.minecraft.world.entity.EntityTypes.TRADER_LLAMA.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND) + : net.minecraft.world.entity.EntityTypes.LLAMA.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(SkeletonHorse.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.SKELETON_HORSE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SKELETON_HORSE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(ZombieHorse.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.ZOMBIE_HORSE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); - } else entity = net.minecraft.world.entity.EntityType.HORSE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ZOMBIE_HORSE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + } else entity = net.minecraft.world.entity.EntityTypes.HORSE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Skeleton.class.isAssignableFrom(clazz)) { if(Stray.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.STRAY.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.STRAY.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(WitherSkeleton.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.WITHER_SKELETON.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.WITHER_SKELETON.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else { - entity = net.minecraft.world.entity.EntityType.SKELETON.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SKELETON.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Slime.class.isAssignableFrom(clazz)) { if(MagmaCube.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.MAGMA_CUBE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.MAGMA_CUBE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else { - entity = net.minecraft.world.entity.EntityType.SLIME.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SLIME.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Spider.class.isAssignableFrom(clazz)) { if(CaveSpider.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.CAVE_SPIDER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.CAVE_SPIDER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else { - entity = net.minecraft.world.entity.EntityType.SPIDER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SPIDER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Squid.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.SQUID.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SQUID.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Tameable.class.isAssignableFrom(clazz)) { if(Wolf.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.WOLF.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.WOLF.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Parrot.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.PARROT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.PARROT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Cat.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.CAT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.CAT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(PigZombie.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.ZOMBIFIED_PIGLIN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ZOMBIFIED_PIGLIN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Zombie.class.isAssignableFrom(clazz)) { if(Husk.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.HUSK.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.HUSK.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(ZombieVillager.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.ZOMBIE_VILLAGER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ZOMBIE_VILLAGER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Drowned.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.DROWNED.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.DROWNED.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else { entity = new net.minecraft.world.entity.monster.zombie.Zombie(world); } } else if(Giant.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.GIANT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.GIANT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Silverfish.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.SILVERFISH.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SILVERFISH.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Enderman.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.ENDERMAN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ENDERMAN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Blaze.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.BLAZE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.BLAZE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(AbstractVillager.class.isAssignableFrom(clazz)) { if(Villager.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.VILLAGER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.VILLAGER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(WanderingTrader.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.WANDERING_TRADER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.WANDERING_TRADER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Witch.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.WITCH.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.WITCH.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Wither.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.WITHER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.WITHER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(ComplexLivingEntity.class.isAssignableFrom(clazz)) { if(EnderDragon.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.ENDER_DRAGON.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ENDER_DRAGON.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Ambient.class.isAssignableFrom(clazz)) { if(Bat.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.BAT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.BAT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Rabbit.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.RABBIT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.RABBIT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Endermite.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.ENDERMITE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ENDERMITE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Guardian.class.isAssignableFrom(clazz)) { if(ElderGuardian.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.ELDER_GUARDIAN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ELDER_GUARDIAN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else { - entity = net.minecraft.world.entity.EntityType.GUARDIAN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.GUARDIAN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(ArmorStand.class.isAssignableFrom(clazz)) { entity = new net.minecraft.world.entity.decoration.ArmorStand(world, x, y, z); } else if(PolarBear.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.POLAR_BEAR.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.POLAR_BEAR.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Vex.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.VEX.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.VEX.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Illager.class.isAssignableFrom(clazz)) { if(Spellcaster.class.isAssignableFrom(clazz)) { if(Evoker.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.EVOKER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.EVOKER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Illusioner.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.ILLUSIONER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ILLUSIONER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Vindicator.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.VINDICATOR.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.VINDICATOR.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Pillager.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.PILLAGER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.PILLAGER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Turtle.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.TURTLE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.TURTLE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Phantom.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.PHANTOM.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.PHANTOM.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Fish.class.isAssignableFrom(clazz)) { if(Cod.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.COD.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.COD.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(PufferFish.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.PUFFERFISH.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.PUFFERFISH.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Salmon.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.SALMON.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.SALMON.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(TropicalFish.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.TROPICAL_FISH.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.TROPICAL_FISH.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } } else if(Dolphin.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.DOLPHIN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.DOLPHIN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Ocelot.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.OCELOT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.OCELOT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Ravager.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.RAVAGER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.RAVAGER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Panda.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.PANDA.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.PANDA.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Fox.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.FOX.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.FOX.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Bee.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.BEE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.BEE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Hoglin.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.HOGLIN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.HOGLIN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Piglin.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.PIGLIN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.PIGLIN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(PiglinBrute.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.PIGLIN_BRUTE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.PIGLIN_BRUTE.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Strider.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.STRIDER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.STRIDER.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(Zoglin.class.isAssignableFrom(clazz)) - entity = net.minecraft.world.entity.EntityType.ZOGLIN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.ZOGLIN.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); if(entity != null) { entity.absSnapTo(x, y, z, yaw, pitch); @@ -1996,7 +1996,7 @@ public net.minecraft.world.entity.Entity createEntity_Old(Location location, Cla } else if(ExperienceOrb.class.isAssignableFrom(clazz)) { entity = new net.minecraft.world.entity.ExperienceOrb(world, x, y, z, 0); } else if(LightningStrike.class.isAssignableFrom(clazz)) { - entity = net.minecraft.world.entity.EntityType.LIGHTNING_BOLT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + entity = net.minecraft.world.entity.EntityTypes.LIGHTNING_BOLT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); } else if(AreaEffectCloud.class.isAssignableFrom(clazz)) { entity = new net.minecraft.world.entity.AreaEffectCloud(world, x, y, z); } else if(EvokerFangs.class.isAssignableFrom(clazz)) @@ -2033,14 +2033,14 @@ public T spawnArrow(Location location, Vector directio net.minecraft.world.entity.projectile.arrow.AbstractArrow arrow; if (TippedArrow.class.isAssignableFrom(clazz)) { - arrow = net.minecraft.world.entity.EntityType.ARROW.create(this.world, EntitySpawnReason.COMMAND); + arrow = net.minecraft.world.entity.EntityTypes.ARROW.create(this.world, EntitySpawnReason.COMMAND); ((Arrow) arrow.getBukkitEntity()).setBasePotionType(PotionType.WATER); } else if (SpectralArrow.class.isAssignableFrom(clazz)) { - arrow = net.minecraft.world.entity.EntityType.SPECTRAL_ARROW.create(this.world, EntitySpawnReason.COMMAND); + arrow = net.minecraft.world.entity.EntityTypes.SPECTRAL_ARROW.create(this.world, EntitySpawnReason.COMMAND); } else if (Trident.class.isAssignableFrom(clazz)) { - arrow = net.minecraft.world.entity.EntityType.TRIDENT.create(this.world, EntitySpawnReason.COMMAND); + arrow = net.minecraft.world.entity.EntityTypes.TRIDENT.create(this.world, EntitySpawnReason.COMMAND); } else { - arrow = net.minecraft.world.entity.EntityType.ARROW.create(this.world, EntitySpawnReason.COMMAND); + arrow = net.minecraft.world.entity.EntityTypes.ARROW.create(this.world, EntitySpawnReason.COMMAND); } arrow.snapTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); @@ -2179,7 +2179,7 @@ public void spawnParticle(Particle particle, double x, double y, double z, i @Override public LightningStrike strikeLightning(Location loc) { - LightningBolt lightning = net.minecraft.world.entity.EntityType.LIGHTNING_BOLT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + LightningBolt lightning = net.minecraft.world.entity.EntityTypes.LIGHTNING_BOLT.create(world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); lightning.snapTo(loc.getX(), loc.getY(), loc.getZ()); // nms.strikeLightning(lightning); return (LightningStrike) ((EntityBridge) lightning).getBukkitEntity(); @@ -2193,7 +2193,7 @@ public LightningStrike strikeLightningEffect(Location arg0) { private LightningStrike strikeLightning0(Location loc, boolean isVisual) { Preconditions.checkArgument(loc != null, "Location cannot be null"); - LightningBolt lightning = net.minecraft.world.entity.EntityType.LIGHTNING_BOLT.create(this.world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); + LightningBolt lightning = net.minecraft.world.entity.EntityTypes.LIGHTNING_BOLT.create(this.world, net.minecraft.world.entity.EntitySpawnReason.COMMAND); lightning.snapTo(loc.getX(), loc.getY(), loc.getZ()); // lightning.isEffect = isVisual; // this.nms.strikeLightning(lightning); @@ -3162,4 +3162,13 @@ public boolean hasBonusChest() { return null; } + + // 26.2: new on World + @Override + public void setAllowMonsterSpawning(boolean allow) { + // Routed through the existing spawn-flag API so both share one code path. + // NOTE: setSpawnFlags/getAllowMonsters are unimplemented in Cardboard (pre-existing). + this.setSpawnFlags(allow, this.getAllowAnimals()); + } + } diff --git a/src/main/java/org/cardboardpowered/library/Libraries.java b/src/main/java/org/cardboardpowered/library/Libraries.java index 6d05a8d0c..fe1c6aac6 100644 --- a/src/main/java/org/cardboardpowered/library/Libraries.java +++ b/src/main/java/org/cardboardpowered/library/Libraries.java @@ -18,15 +18,15 @@ public class Libraries { */ public static List getLibraries() { // TODO: Keep Adventure version in check - String adventureVersion = "4.25.0"; + String adventureVersion = "5.2.0"; // 26.2: Paper 26.2 ships Adventure 5 // Paper API //Library paperApi = Library.of("io.papermc", "paper-api", "1.21.11-R0.1-20260120.191825-59") // .withSha1("223f4b673a6cefe155849a18d7a82b422bf45335") // .overrideRepo("https://repo.papermc.io/repository/maven-snapshots/"); - Library paperApi = Library.of("io.papermc.paper", "paper-api", "26.1.2.build.69-stable") - .withSha1("0dbcf5b9cdcc6c81776475517a7c86cf64c63783") + Library paperApi = Library.of("io.papermc.paper", "paper-api", "26.2.build.110-stable") + .withSha1("c94ea2a3efbe687f70b8135934588c8ca575b75a") .overrideRepo("https://repo.papermc.io/repository/maven-public/"); List libraries = List.of( @@ -39,15 +39,15 @@ public static List getLibraries() { Library.of("commons-collections", "commons-collections", "3.2.1", "761ea405b9b37ced573d2df0d1e3a4e0f9edc668"), Library.of("net.md-5", "bungeecord-chat", "1.21-R0.2", "64956ff493786f981a15697ce406fe39a2551692"), // Adventure - Library.of("net.kyori", "adventure-api", adventureVersion, "6bd10494eeb2f8eadce7226db4445e8728985cbb"), - Library.of("net.kyori", "adventure-key", adventureVersion, "eadeff9eeaa46f76de3f31fdff1d8e952273cf04") , - Library.of("net.kyori", "adventure-text-serializer-gson", adventureVersion, "e312e240fe82f4207ff2232b33ee4433855bdfff") , - Library.of("net.kyori", "adventure-text-serializer-json", adventureVersion, "ff6b4381dd8be9a40a1127937a4b71b9b010fcd6") , - Library.of("net.kyori", "adventure-text-serializer-commons", adventureVersion, "58708c96ea4292800f08360ca1ce8a31ef0cdf97") , - Library.of("net.kyori", "adventure-text-serializer-legacy", adventureVersion, "b12eaaac78d2534b9b1556049a8d95a046b0812d") , - Library.of("net.kyori", "adventure-text-serializer-plain", adventureVersion, "82f5d4188f3cb6da9654b4ceea8b4093af5f1243") , - Library.of("net.kyori", "adventure-text-minimessage", adventureVersion, "38f8f778c92f1ea848f79f992c99c4b98f96f23b") , - Library.of("net.kyori", "adventure-text-logger-slf4j", adventureVersion, "7800e20f422798c0011eadce9bfa6bef159d7ae9") , + Library.of("net.kyori", "adventure-api", adventureVersion, "3e2ef126f3e3c3456995643aa49767af3b39ac34"), + Library.of("net.kyori", "adventure-key", adventureVersion, "32cf2afc230c0a932c71c30a86762246f23f345d") , + Library.of("net.kyori", "adventure-text-serializer-gson", adventureVersion, "64921b6da90b2b4aa42e09342e12fd048783749f") , + Library.of("net.kyori", "adventure-text-serializer-json", adventureVersion, "5afc1c7538e3625fb5d87926c20a96b428881e6d") , + Library.of("net.kyori", "adventure-text-serializer-commons", adventureVersion, "bd00ab0ec93e5a326a0d9ce48b27c7025ce3a760") , + Library.of("net.kyori", "adventure-text-serializer-legacy", adventureVersion, "29351ad8bac77a694aec074a63d89c3af08a1ada") , + Library.of("net.kyori", "adventure-text-serializer-plain", adventureVersion, "eb0d8304dd9457246b6d4cae6c333e0a29375305") , + Library.of("net.kyori", "adventure-text-minimessage", adventureVersion, "8435e812c70784ba7ccbd46210dccbcc576a18d5") , + Library.of("net.kyori", "adventure-text-logger-slf4j", adventureVersion, "0efddd8e1faa2edae2d948b5d10be1a8f35c817a") , Library.of("net.kyori", "option", "1.1.0", "593fecb9c42688eebc7d8da5d6ea127f4d4c92a2"), // Complete Maven & Resolver Stack diff --git a/src/main/java/org/cardboardpowered/mixin/core/dispenser/BoatDispenseItemBehaviorMixin.java b/src/main/java/org/cardboardpowered/mixin/core/dispenser/BoatDispenseItemBehaviorMixin.java index 21bcd0d38..bf7666cd1 100644 --- a/src/main/java/org/cardboardpowered/mixin/core/dispenser/BoatDispenseItemBehaviorMixin.java +++ b/src/main/java/org/cardboardpowered/mixin/core/dispenser/BoatDispenseItemBehaviorMixin.java @@ -82,7 +82,9 @@ public ItemStack dispenseSilently(BlockSource isourceblock, ItemStack itemstack) if (null != entityboat) { entityboat.setInitialPos(event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); - EntityType.createDefaultStackConfig(worldserver, itemstack, null).accept(entityboat); + // 26.2: PostSpawnProcessor is typed to Entity + // 26.2: PostSpawnProcessor#accept was renamed to apply + EntityType.createDefaultStackConfig(worldserver, itemstack, null).apply((net.minecraft.world.entity.Entity) entityboat); entityboat.setYRot(enumdirection.toYRot()); } diff --git a/src/main/java/org/cardboardpowered/mixin/network/chat/TextColorMixin.java b/src/main/java/org/cardboardpowered/mixin/network/chat/TextColorMixin.java index e42ba6f7b..cea01f9b4 100644 --- a/src/main/java/org/cardboardpowered/mixin/network/chat/TextColorMixin.java +++ b/src/main/java/org/cardboardpowered/mixin/network/chat/TextColorMixin.java @@ -19,7 +19,9 @@ public class TextColorMixin implements TextColorBridge { @Inject(method = "(ILjava/lang/String;)V", at = @At("RETURN")) private void initFormat(int value, String name, CallbackInfo ci) { if (name != null) { - this.format = ChatFormatting.getByName(name); + // 26.2: ChatFormatting.getByName was removed + this.format = java.util.Arrays.stream(ChatFormatting.values()) + .filter(f -> f.name().equalsIgnoreCase(name)).findFirst().orElse(null); } else { this.format = null; } diff --git a/src/main/java/org/cardboardpowered/mixin/server/level/ServerPlayerGameModeMixin.java b/src/main/java/org/cardboardpowered/mixin/server/level/ServerPlayerGameModeMixin.java index 85ed70508..a65bc17bf 100644 --- a/src/main/java/org/cardboardpowered/mixin/server/level/ServerPlayerGameModeMixin.java +++ b/src/main/java/org/cardboardpowered/mixin/server/level/ServerPlayerGameModeMixin.java @@ -18,7 +18,7 @@ import org.cardboardpowered.bridge.server.level.ServerPlayerBridge; import org.cardboardpowered.bridge.server.level.ServerPlayerGameModeBridge; import net.fabricmc.fabric.api.event.player.UseBlockCallback; -import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.advancements.triggers.CriteriaTriggers; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; diff --git a/src/main/java/org/cardboardpowered/mixin/server/network/ServerCommonPacketListenerImplMixin_Brand.java b/src/main/java/org/cardboardpowered/mixin/server/network/ServerCommonPacketListenerImplMixin_Brand.java new file mode 100644 index 000000000..8fba6dbb1 --- /dev/null +++ b/src/main/java/org/cardboardpowered/mixin/server/network/ServerCommonPacketListenerImplMixin_Brand.java @@ -0,0 +1,37 @@ +package org.cardboardpowered.mixin.server.network; + +import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket; +import net.minecraft.network.protocol.common.custom.BrandPayload; +import net.minecraft.server.network.ServerCommonPacketListenerImpl; +import org.cardboardpowered.bridge.server.network.ClientBrandBridge; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +// 26.2: capture the client brand from the vanilla minecraft:brand payload, +// which is what Paper exposes as PlayerCommonConnection#getClientBrandName. +@Mixin(ServerCommonPacketListenerImpl.class) +public class ServerCommonPacketListenerImplMixin_Brand implements ClientBrandBridge { + + @Unique + private String cardboard$clientBrand; + + @Inject(method = "handleCustomPayload", at = @At("HEAD")) + private void cardboard$captureBrand(ServerboundCustomPayloadPacket packet, CallbackInfo ci) { + if (packet.payload() instanceof BrandPayload brandPayload) { + this.cardboard$clientBrand = brandPayload.brand(); + } + } + + @Override + public String cardboard_getClientBrand() { + return this.cardboard$clientBrand; + } + + @Override + public void cardboard_setClientBrand(String brand) { + this.cardboard$clientBrand = brand; + } +} diff --git a/src/main/java/org/cardboardpowered/mixin/server/network/ServerLoginPacketListenerImplMixin.java b/src/main/java/org/cardboardpowered/mixin/server/network/ServerLoginPacketListenerImplMixin.java index b53182c05..d50233def 100644 --- a/src/main/java/org/cardboardpowered/mixin/server/network/ServerLoginPacketListenerImplMixin.java +++ b/src/main/java/org/cardboardpowered/mixin/server/network/ServerLoginPacketListenerImplMixin.java @@ -376,7 +376,7 @@ private void verifyLoginAndFinishConnectionSetup(GameProfile profile) { @Shadow private void finishLoginAndWaitForClient(GameProfile profile) { this.state = State.PROTOCOL_SWITCHING; - this.connection.send(new ClientboundLoginFinishedPacket(profile)); + this.connection.send(new ClientboundLoginFinishedPacket(profile, java.util.UUID.randomUUID())); } @Inject(at = @At("TAIL"), method = "handleHello") diff --git a/src/main/java/org/cardboardpowered/mixin/server/players/PlayerListMixin_ChatEvent.java b/src/main/java/org/cardboardpowered/mixin/server/players/PlayerListMixin_ChatEvent.java index 32f81ce87..9ad0474b6 100644 --- a/src/main/java/org/cardboardpowered/mixin/server/players/PlayerListMixin_ChatEvent.java +++ b/src/main/java/org/cardboardpowered/mixin/server/players/PlayerListMixin_ChatEvent.java @@ -85,6 +85,16 @@ public void broadcastChatMessage(PlayerChatMessage message, Predicate(Lnet/minecraft/world/inventory/MenuType;Lnet/minecraft/world/item/crafting/RecipeType;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/inventory/RecipeBookType;ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;Lnet/minecraft/world/inventory/ContainerData;)V", + "(Lnet/minecraft/world/inventory/MenuType;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/inventory/RecipeBookType;ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/Container;Lnet/minecraft/world/inventory/ContainerData;)V", // "Lnet/minecraft/screen/AbstractFurnaceScreenHandler;(Lnet/minecraft/screen/ScreenHandlerType;Lnet/minecraft/recipe/RecipeType;Lnet/minecraft/registry/RegistryKey;Lnet/minecraft/recipe/book/RecipeBookType;ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/inventory/Inventory;Lnet/minecraft/screen/PropertyDelegate;)V", // "(Lnet/minecraft/screen/ScreenHandlerType;Lnet/minecraft/recipe/RecipeType;Lnet/minecraft/recipe/book/RecipeBookCategory;ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/inventory/Inventory;Lnet/minecraft/screen/PropertyDelegate;)V", at = @At("TAIL") ) public void setPlayerInv( MenuType sh, - RecipeType recipes, + // 26.2: the RecipeType parameter was removed from this constructor ResourceKey key, RecipeBookType type, int i, diff --git a/src/main/java/org/cardboardpowered/mixin/world/item/ArmorStandItemMixin.java b/src/main/java/org/cardboardpowered/mixin/world/item/ArmorStandItemMixin.java index e947d4ab9..63c358f72 100644 --- a/src/main/java/org/cardboardpowered/mixin/world/item/ArmorStandItemMixin.java +++ b/src/main/java/org/cardboardpowered/mixin/world/item/ArmorStandItemMixin.java @@ -1,5 +1,7 @@ package org.cardboardpowered.mixin.world.item; +import net.minecraft.world.entity.EntityTypes; + import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.item.ArmorStandItem; @@ -50,12 +52,12 @@ public ActionResult useOnBlock(ItemUsageContext itemactioncontext) { BlockPos blockposition = blockactioncontext.getBlockPos(); ItemStack itemstack = itemactioncontext.getStack(); Vec3d vec3d = Vec3d.ofBottomCenter((Vec3i) blockposition); - Box axisalignedbb = EntityType.ARMOR_STAND.getDimensions().getBoxAt(vec3d.getX(), vec3d.getY(), vec3d.getZ()); + Box axisalignedbb = EntityTypes.ARMOR_STAND.getDimensions().getBoxAt(vec3d.getX(), vec3d.getY(), vec3d.getZ()); if (world.getOtherEntities((Entity) null, axisalignedbb).isEmpty()) { if (world instanceof ServerWorld) { ServerWorld worldserver = (ServerWorld) world; - ArmorStandEntity entityarmorstand = (ArmorStandEntity) EntityType.ARMOR_STAND.create(worldserver, itemstack.getNbt(), (Text) null, itemactioncontext.getPlayer(), blockposition, SpawnReason.NATURAL, true, true); + ArmorStandEntity entityarmorstand = (ArmorStandEntity) EntityTypes.ARMOR_STAND.create(worldserver, itemstack.getNbt(), (Text) null, itemactioncontext.getPlayer(), blockposition, SpawnReason.NATURAL, true, true); if (entityarmorstand == null) return ActionResult.FAIL; worldserver.spawnEntityAndPassengers(entityarmorstand); diff --git a/src/main/java/org/cardboardpowered/mixin/world/item/ItemStackMixin.java b/src/main/java/org/cardboardpowered/mixin/world/item/ItemStackMixin.java index e3cfa43c4..091c28a99 100644 --- a/src/main/java/org/cardboardpowered/mixin/world/item/ItemStackMixin.java +++ b/src/main/java/org/cardboardpowered/mixin/world/item/ItemStackMixin.java @@ -1,6 +1,6 @@ package org.cardboardpowered.mixin.world.item; -import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.advancements.triggers.CriteriaTriggers; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import org.bukkit.craftbukkit.event.CraftEventFactory; diff --git a/src/main/java/org/cardboardpowered/util/VersionUtil.java b/src/main/java/org/cardboardpowered/util/VersionUtil.java index ebe0e648a..c4db38120 100644 --- a/src/main/java/org/cardboardpowered/util/VersionUtil.java +++ b/src/main/java/org/cardboardpowered/util/VersionUtil.java @@ -52,8 +52,9 @@ public final class VersionUtil { public static final BukkitVersion v1_21_11_R01 = BukkitVersion.fromString("1.21.11-R0.1-SNAPSHOT"); public static final BukkitVersion v26_1_R01 = BukkitVersion.fromString("26.1.2-R0.1-SNAPSHOT"); + public static final BukkitVersion v26_2_R01 = BukkitVersion.fromString("26.2-R0.1-SNAPSHOT"); - private static final Set supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01, v1_16_5_R01, v1_17_1_R01, v1_18_2_R01, v1_19_4_R01, v1_20_6_R01, v1_21_11_R01, v26_1_R01); + private static final Set supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01, v1_16_5_R01, v1_17_1_R01, v1_18_2_R01, v1_19_4_R01, v1_20_6_R01, v1_21_11_R01, v26_1_R01, v26_2_R01); public static final boolean PRE_FLATTENING = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); diff --git a/src/main/resources/bukkitfabric.accesswidener b/src/main/resources/bukkitfabric.accesswidener index 28824bc01..e546ad510 100644 --- a/src/main/resources/bukkitfabric.accesswidener +++ b/src/main/resources/bukkitfabric.accesswidener @@ -81,7 +81,7 @@ accessible field net/minecraft/world/entity/LivingEntity lastDamageStamp J mutable field net/minecraft/world/entity/LivingEntity lastDamageStamp J accessible field net/minecraft/world/entity/LivingEntity brain Lnet/minecraft/world/entity/ai/Brain; accessible method net/minecraft/world/entity/LivingEntity isAlwaysExperienceDropper ()Z -accessible method net/minecraft/world/entity/LivingEntity blockedByItem (Lnet/minecraft/world/entity/LivingEntity;)V +accessible method net/minecraft/world/entity/LivingEntity blockedByItem (Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/damagesource/DamageSource;F)V accessible method net/minecraft/world/entity/LivingEntity createWitherRose (Lnet/minecraft/world/entity/LivingEntity;)V accessible method net/minecraft/world/entity/LivingEntity jumpFromGround ()V accessible method net/minecraft/world/entity/LivingEntity doAutoAttackOnTouch (Lnet/minecraft/world/entity/LivingEntity;)V @@ -199,8 +199,8 @@ accessible field net/minecraft/world/level/block/entity/BeaconBlockEntity levels mutable field net/minecraft/world/level/block/entity/BeaconBlockEntity levels I accessible field net/minecraft/world/level/block/entity/BeaconBlockEntity name Lnet/minecraft/network/chat/Component; mutable field net/minecraft/world/level/block/entity/BeaconBlockEntity name Lnet/minecraft/network/chat/Component; -accessible field net/minecraft/world/level/block/entity/BedBlockEntity color Lnet/minecraft/world/item/DyeColor; -mutable field net/minecraft/world/level/block/entity/BedBlockEntity color Lnet/minecraft/world/item/DyeColor; +# 26.2: BedBlockEntity was removed (beds no longer have a block entity) +# 26.2: BedBlockEntity was removed (beds no longer have a block entity) accessible field net/minecraft/world/level/block/entity/BlockEntity type Lnet/minecraft/world/level/block/entity/BlockEntityType; mutable field net/minecraft/world/level/block/entity/BlockEntity type Lnet/minecraft/world/level/block/entity/BlockEntityType; accessible field net/minecraft/world/level/block/entity/BlockEntity level Lnet/minecraft/world/level/Level; @@ -288,7 +288,7 @@ extendable class net/minecraft/core/Direction # mutable field net/minecraft/util/math/Direction name Ljava/lang/String; accessible field net/minecraft/core/Direction BY_2D_DATA [Lnet/minecraft/core/Direction; extendable class net/minecraft/ChatFormatting -accessible field net/minecraft/ChatFormatting name Ljava/lang/String; +# 26.2: ChatFormatting#name was renamed to #toString and is unused here accessible field net/minecraft/ChatFormatting code C accessible field net/minecraft/core/Vec3i x I mutable field net/minecraft/core/Vec3i x I @@ -947,4 +947,13 @@ accessible field net/minecraft/tags/TagEntry id Lnet/minecraft/resources/Identif accessible field net/minecraft/tags/TagEntry tag Z accessible field net/minecraft/tags/TagEntry required Z accessible field net/minecraft/world/level/Level levelData Lnet/minecraft/world/level/storage/WritableLevelData; -accessible field net/minecraft/server/level/ServerLevel entityManager Lnet/minecraft/world/level/entity/PersistentEntitySectionManager; \ No newline at end of file +accessible field net/minecraft/server/level/ServerLevel entityManager Lnet/minecraft/world/level/entity/PersistentEntitySectionManager; +# 26.2: expose protected sound accessors for the Bukkit LivingEntity API +accessible method net/minecraft/world/entity/LivingEntity getSoundVolume ()F +accessible method net/minecraft/world/entity/LivingEntity getHurtSound (Lnet/minecraft/world/damagesource/DamageSource;)Lnet/minecraft/sounds/SoundEvent; +# 26.2: expose the creaking binding for the Bukkit CreakingHeart API +accessible field net/minecraft/world/level/block/entity/CreakingHeartBlockEntity creakingInfo Lcom/mojang/datafixers/util/Either; +# 26.2: expose CombatTracker#lastDamageTime for the Paper CombatTracker API +accessible field net/minecraft/world/damagesource/CombatTracker lastDamageTime I +# 26.2: expose SulfurCube fuse setter for the Bukkit SulfurCube API +accessible method net/minecraft/world/entity/monster/cubemob/SulfurCube setFuse (I)V diff --git a/src/main/resources/bukkitfabric.mixins.json b/src/main/resources/bukkitfabric.mixins.json index 79545d902..abaaeb974 100644 --- a/src/main/resources/bukkitfabric.mixins.json +++ b/src/main/resources/bukkitfabric.mixins.json @@ -62,6 +62,7 @@ "server.level.WorldGenRegionMixin", "server.network.LegacyQueryHandlerMixin", "server.network.ServerConfigurationPacketListenerImplMixin", + "server.network.ServerCommonPacketListenerImplMixin_Brand", "server.network.ServerConnectionListenerMixin", "server.network.ServerGamePacketListenerImplMixin", "server.network.ServerGamePacketListenerImplMixin_ChatEvent", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index f3c7a1d19..a35a0f8b4 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -32,7 +32,7 @@ "fabric-api": "*", "java": ">=21", "icommon": "*", - "minecraft": ">=26.1" + "minecraft": ">=26.2" }, "custom": { "loom:injected_interfaces": {