From 4f48af4316a85e1e515e71d96d5229ba2282c5d0 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 09:34:26 -0700 Subject: [PATCH 01/15] 26.2: Bump to Minecraft 26.2, Paper-API 26.2 and Adventure 5 - minecraft 26.2, loader 0.19.3, fabric-api 0.156.0+26.2 - paper-api 26.2.build.110-stable - Adventure 4.25.0 -> 5.2.0. Paper 26.2 already resolved Adventure 5 transitively, so the old 4.25.0 pin was being silently overridden. - Libraries.java ships its own runtime dependency list with pinned SHA1s; it was still fetching Adventure 4.25.0 and paper-api 26.1.2 at boot, which no compile could catch. Updated with hashes from Maven Central. - settings.gradle: auto-provision the JDK 25 toolchain the build pins - gradlew: restore the executable bit --- build.gradle | 15 ++++++------ gradle.properties | 13 ++++++---- gradlew | 0 settings.gradle | 7 ++++++ .../cardboardpowered/library/Libraries.java | 24 +++++++++---------- 5 files changed, 36 insertions(+), 23 deletions(-) mode change 100644 => 100755 gradlew diff --git a/build.gradle b/build.gradle index 90260c9f0..ca9e4b409 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 @@ -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" @@ -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/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/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 From 62319b83bead3b976860972eeb11a43877f43322 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 09:34:40 -0700 Subject: [PATCH 02/15] 26.2: Registry splits and entity package moves Minecraft 26.2 moved constant holders out of the type classes: EntityType.X -> EntityTypes.X (158 constants) BlockEntityType.X -> BlockEntityTypes.X Both singular classes still exist and keep the generic machinery (EntityType, CODEC, STREAM_CODEC), so only constant accesses move. Bukkit has its own org.bukkit.entity.EntityType with identical constant names, so only fully-qualified Minecraft references were rewritten. Entity classes also moved into deeper packages: monster.Slime/MagmaCube -> monster.cubemob.* world.entity.animal.Bucketable -> world.entity.Bucketable block.state.properties.DripstoneThickness -> SpeleothemThickness MagmaCube no longer extends Slime; both now extend AbstractCubeMob, which carries getSize/setSize. CraftSlime retargets onto AbstractCubeMob so Bukkit's MagmaCube-extends-Slime hierarchy still holds. --- .../craftbukkit/block/CapturedBlockState.java | 4 +- .../craftbukkit/block/CraftBlockStates.java | 112 ++++--- .../block/impl/CraftPointedDripstone.java | 4 +- .../bukkit/craftbukkit/entity/CraftBoat.java | 29 +- .../craftbukkit/entity/CraftEntityTypes.java | 285 +++++++++--------- .../craftbukkit/entity/CraftMagmaCube.java | 6 +- .../bukkit/craftbukkit/entity/CraftSlime.java | 9 +- .../inventory/CraftMerchantCustom.java | 3 +- .../inventory/CraftMetaArmorStand.java | 5 +- .../craftbukkit/legacy/CraftLegacy.java | 1 + .../spawner/PaperSharedSpawnerLogic.java | 3 +- .../server/level/ServerPlayerBridge.java | 5 +- .../server/network/ClientBrandBridge.java | 12 + .../entity/monster/zombie/ZombieBridge.java | 3 +- .../impl/world/CraftWorld.java | 199 ++++++------ .../world/entity/monster/SlimeMixin.java | 5 +- .../mixin/world/item/ArmorStandItemMixin.java | 6 +- 17 files changed, 370 insertions(+), 321 deletions(-) create mode 100644 src/main/java/org/cardboardpowered/bridge/server/network/ClientBrandBridge.java 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/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java index 94be21d23..9c807ca44 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,68 @@ 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); // End generate - CraftBlockEntityStates } 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/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/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java index 80aa49dec..7cf3bd80e 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,110 @@ 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))); + 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 +218,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 +229,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 +284,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 +309,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/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/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/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/legacy/CraftLegacy.java b/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java index 790b493c2..d2b5d3be6 100644 --- a/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java +++ b/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.legacy; + import com.google.common.base.Preconditions; import com.mojang.serialization.Dynamic; import java.util.Arrays; 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/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/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/mixin/world/entity/monster/SlimeMixin.java b/src/main/java/org/cardboardpowered/mixin/world/entity/monster/SlimeMixin.java index d4f12eac8..394414e03 100644 --- a/src/main/java/org/cardboardpowered/mixin/world/entity/monster/SlimeMixin.java +++ b/src/main/java/org/cardboardpowered/mixin/world/entity/monster/SlimeMixin.java @@ -3,13 +3,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import net.minecraft.world.entity.monster.Slime; +import net.minecraft.world.entity.monster.cubemob.AbstractCubeMob; import org.cardboardpowered.mixin.world.entity.EntityMixin; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.cardboardpowered.bridge.world.entity.monster.SlimeBridge; -@Mixin(Slime.class) +// 26.2: getSize/setSize moved from Slime to AbstractCubeMob (shared with MagmaCube) +@Mixin(AbstractCubeMob.class) public class SlimeMixin extends EntityMixin implements SlimeBridge { @Shadow public int getSize() {return 0;} 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); From 15655030293583916cefa3ab673286ec28b0b0b7 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 09:34:55 -0700 Subject: [PATCH 03/15] 26.2: Adventure 4 -> 5 migration and ChatFormatting rework Adventure 5: - ClickEvent.Action is no longer an enum but a generic interface with singleton instances, so the dispatch switch becomes identity checks with an explicit throw on unknown actions. - PlainComponentSerializer and MessageType were removed. - BookMetaBuilder is gone; Adventure 5 introduces BookLike#asBook(), implemented on CraftMetaBook, CraftMetaBookSigned and the two Paper book-content records. - NBTComponent lost a type parameter. - LegacyHoverEventSerializer moved from ...serializer.gson to .json. Minecraft 26.2 stripped all colour metadata from ChatFormatting (getColor/isFormat/getByName are gone); it now carries only the formatting code. Colour data lives on the new world.scores.TeamColor, which PaperAdventure and CraftChatMessage now resolve through. PlayerTeam#getColor/setColor use Optional. --- .../paper/adventure/AdventureCodecs.java | 26 +++++---- .../paper/adventure/PaperAdventure.java | 15 +++--- .../item/PaperWritableBookContent.java | 13 +++++ .../item/PaperWrittenBookContent.java | 13 +++++ .../craftbukkit/inventory/CraftMetaBook.java | 53 +++++-------------- .../inventory/CraftMetaBookSigned.java | 39 ++++++-------- .../craftbukkit/scoreboard/CraftTeam.java | 21 +++++--- .../craftbukkit/util/CraftChatMessage.java | 10 +++- .../NBTLegacyHoverEventSerializer.java | 2 +- .../mixin/network/chat/TextColorMixin.java | 4 +- 10 files changed, 107 insertions(+), 89 deletions(-) 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/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/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/scoreboard/CraftTeam.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java index 4286a6f4f..bcaedba79 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java @@ -74,15 +74,17 @@ public void suffix(net.kyori.adventure.text.Component suffix) throws IllegalStat @Override public boolean hasColor() { this.checkState(); - return this.team.getColor().getColor() != null; + // 26.2: PlayerTeam#getColor is now Optional + 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/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/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/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; } From 775748afb29b2466aec160015632c4db39387f66 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 09:35:07 -0700 Subject: [PATCH 04/15] 26.2: Implement new and relocated Paper API methods Paper 26.2 added abstract methods across the API. Two cascaded into every concrete Craft* entity class: Entity#setRotation(Angle,Angle) (relative-aware) and Entity#soundSource(), the latter because Paper's Entity now extends Adventure's Sound.Source.Provider. Paper also split UnsafeValues: the Adventure-facing accessors moved to InternalAPIBridge. Those implementations still live on CraftMagicNumbers, so PaperServerInternalAPIBridge delegates rather than duplicating them. Implemented against real Minecraft state rather than stubbed: - sound category/source, hurt sound, sound volume and voice pitch - removal reason and remove-event cause - CombatTracker#getLastDamageTime - damage context retained on the builder and carried onto the source - trim pattern/material via the existing Conversions builder path - advancement loading delegating to Cardboard's existing loader - CraftBed registered per bed Material, since 26.2 removed the bed BlockEntity and block.getState() would otherwise not cast to Bed spawnCreaking, spreadResin and resetFlyingTicks are Paper server patches with no vanilla equivalent; they now say so explicitly instead of returning null. --- .../paper/entity/PaperPathfinder.java | 19 ++++ .../InlinedRegistryBuilderProviderImpl.java | 22 +++++ .../PaperCombatTrackerWrapper.java | 9 +- .../world/saveddata/PaperLevelOverrides.java | 9 +- .../bukkit/craftbukkit/block/CraftBeacon.java | 6 +- .../bukkit/craftbukkit/block/CraftBed.java | 35 ++++++- .../craftbukkit/block/CraftContainer.java | 6 +- .../craftbukkit/block/CraftCreakingHeart.java | 38 +++++++ .../craftbukkit/damage/CraftDamageSource.java | 15 ++- .../damage/CraftDamageSourceBuilder.java | 23 ++++- .../craftbukkit/entity/CraftEntity.java | 44 ++++++++- .../entity/CraftEntitySnapshot.java | 2 +- .../craftbukkit/entity/CraftLivingEntity.java | 29 +++++- .../craftbukkit/entity/CraftPlayer.java | 32 +++--- .../bukkit/craftbukkit/entity/CraftVex.java | 22 ++++- .../CraftMetaTropicalFishBucket.java | 19 ++++ .../craftbukkit/util/CraftMagicNumbers.java | 99 ++++++++++++------- .../impl/PaperServerInternalAPIBridge.java | 70 ++++++++++++- 18 files changed, 426 insertions(+), 73 deletions(-) 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/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/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/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/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/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/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/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/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/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 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/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); + } + +} From 522fc938271883e37f2c7b354a622020b43b95d5 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 09:35:18 -0700 Subject: [PATCH 05/15] 26.2: Mixin, access-widener and data component fixes Mixins that compile but fail at apply time against real 26.2 bytecode: - SlimeMixin shadowed getSize(), which moved to AbstractCubeMob - AbstractFurnaceMenuMixin injected into a constructor that lost its RecipeType parameter - BoatDispenseItemBehaviorMixin: PostSpawnProcessor#accept -> #apply Access widener (949 -> 956 entries): - LivingEntity#blockedByItem gained a DamageSource/float signature - BedBlockEntity was removed outright - ChatFormatting#name is now #toString - newly widened: LivingEntity#getSoundVolume/#getHurtSound, CreakingHeartBlockEntity#creakingInfo, CombatTracker#lastDamageTime SULFUR_CUBE_CONTENT is a new 26.2 data component. Leaving it unimplemented crashed Paper's DataComponentTypes static initialiser at bootstrap, so PaperSulfurCubeContent implements it for real. Client brand: Paper reads it from a patched connection field that does not exist in vanilla. ServerCommonPacketListenerImplMixin_Brand captures it from the vanilla minecraft:brand custom payload instead. --- .../connection/PaperPlayerGameConnection.java | 10 ++++- .../datacomponent/DataComponentAdapters.java | 1 + .../item/ItemComponentTypesBridgesImpl.java | 10 ++++- .../item/PaperItemAdventurePredicate.java | 6 +-- .../item/PaperSulfurCubeContent.java | 22 +++++++++++ .../papermc/paper/entity/PaperBucketable.java | 2 +- .../org/bukkit/craftbukkit/CraftEffect.java | 10 ++--- .../craftbukkit/inventory/CraftItemStack.java | 6 +-- .../craftbukkit/inventory/CraftMetaItem.java | 22 +++++------ .../potion/CraftPotionEffectType.java | 2 +- .../cardboardpowered/TeleportTargetExtra.java | 4 +- .../impl/CardboardPotionEffectType.java | 2 +- .../BoatDispenseItemBehaviorMixin.java | 4 +- .../level/ServerPlayerGameModeMixin.java | 2 +- ...erCommonPacketListenerImplMixin_Brand.java | 37 +++++++++++++++++++ .../ServerLoginPacketListenerImplMixin.java | 2 +- .../inventory/AbstractFurnaceMenuMixin.java | 4 +- .../mixin/world/item/ItemStackMixin.java | 2 +- src/main/resources/bukkitfabric.accesswidener | 17 ++++++--- src/main/resources/bukkitfabric.mixins.json | 1 + 20 files changed, 127 insertions(+), 39 deletions(-) create mode 100644 src/main/java/io/papermc/paper/datacomponent/item/PaperSulfurCubeContent.java create mode 100644 src/main/java/org/cardboardpowered/mixin/server/network/ServerCommonPacketListenerImplMixin_Brand.java 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/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/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/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/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/potion/CraftPotionEffectType.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java index 9702a2dba..3638007eb 100644 --- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java +++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java @@ -116,7 +116,7 @@ public PotionEffect createEffect(int duration, int amplifier) { @Override public boolean isInstant() { - return this.getHandle().isInstantenous(); + return this.getHandle().isInstantaneous(); } @Override 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/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/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/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/world/inventory/AbstractFurnaceMenuMixin.java b/src/main/java/org/cardboardpowered/mixin/world/inventory/AbstractFurnaceMenuMixin.java index 0ee043fa9..4b6a5db58 100644 --- a/src/main/java/org/cardboardpowered/mixin/world/inventory/AbstractFurnaceMenuMixin.java +++ b/src/main/java/org/cardboardpowered/mixin/world/inventory/AbstractFurnaceMenuMixin.java @@ -52,14 +52,14 @@ public class AbstractFurnaceMenuMixin extends AbstractContainerMenuMixin { @Inject( method = - "(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/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/resources/bukkitfabric.accesswidener b/src/main/resources/bukkitfabric.accesswidener index 28824bc01..d2a19de26 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,11 @@ 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 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", From fec6a7387a41541d25d18935bc52b8f6dcc49d83 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 09:49:13 -0700 Subject: [PATCH 06/15] 26.2: Report 26.2 as the implemented API version CraftServer#bukkitVersion and CardboardAbstractServer#API_VERSION still advertised 26.1.2, which plugins read via Bukkit#getBukkitVersion for compatibility checks. VersionUtil also gains a 26.2 entry so the version is recognised as supported rather than unknown. Verified in-game: /version now reports Cardboard version git-... (MC: 26.2) (Implementing API version 26.2) --- src/main/java/org/bukkit/craftbukkit/CraftServer.java | 2 +- .../org/cardboardpowered/impl/CardboardAbstractServer.java | 2 +- src/main/java/org/cardboardpowered/util/VersionUtil.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index bad7b7c33..03b8f9b6e 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(); 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/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); From b7a985ac6069c053553dd4a9432dfccbb33dbf44 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 10:08:55 -0700 Subject: [PATCH 07/15] Fix NPE broadcasting console chat (e.g. /say) PlayerListMixin_ChatEvent#broadcastChatMessage called getPlayer_0(sender) unconditionally, which dereferences sender. Console and system broadcasts have no sending player, so /say threw before reaching any recipient. AsyncPlayerChatEvent requires a non-null player, so a null sender now delivers the message directly to all recipients instead of fabricating a player-chat event. Pre-existing on ver/26.1; not introduced by the 26.2 port. --- .../server/players/PlayerListMixin_ChatEvent.java | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 Date: Fri, 7 Aug 2026 10:11:58 -0700 Subject: [PATCH 08/15] Implement Server#permissionMessage instead of a placeholder permissionMessage() returned the literal string "todo: permissionMessage", which players saw whenever a command was denied. getPermissionMessage() separately returned a hardcoded "No Permission". Both now resolve settings.permissions-message from bukkit.yml, defaulting to Bukkit's stock wording, and permissionMessage() renders it through the legacy section serializer so colour codes work. Pre-existing since the Paper API 1.19.2 update; not related to the 26.2 port. --- src/main/java/org/bukkit/craftbukkit/CraftServer.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 03b8f9b6e..7835ef2ae 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -2036,9 +2036,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 +2352,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 From 32a22332589ae48a9897d39d3e5f29a3ab53b817 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 10:31:38 -0700 Subject: [PATCH 09/15] Fix silent player commands by using a feedback-capable command source CraftServer#dispatchCommand built the Brigadier source with createCommandSourceStackForNameResolution, which exists to resolve names and discards all command output. Commands run by a player still had their side effects (/difficulty, /gamemode, /give worked) but any command whose result is text produced nothing at all - /list, /help and /pl appeared dead with no error and no log entry. Players now get ServerPlayer#createCommandSourceStack, which routes success and failure back to the sender. Non-player entities keep the name-resolution source. Also suppress repeated "Unknown target reason" warnings; the generic Mob#setTarget path logged a full stack trace on every mob retarget. --- .../java/org/bukkit/craftbukkit/CraftServer.java | 8 +++++++- .../mixin/world/entity/MobMixin.java | 12 ++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 7835ef2ae..4b89da679 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -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; diff --git a/src/main/java/org/cardboardpowered/mixin/world/entity/MobMixin.java b/src/main/java/org/cardboardpowered/mixin/world/entity/MobMixin.java index 500c32c1b..a96faae11 100644 --- a/src/main/java/org/cardboardpowered/mixin/world/entity/MobMixin.java +++ b/src/main/java/org/cardboardpowered/mixin/world/entity/MobMixin.java @@ -12,6 +12,7 @@ import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +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; @@ -38,6 +39,10 @@ public void setTargetCraftBukkit(LivingEntity livingEntity, CallbackInfo ci) { } } + @Unique + private static final java.util.concurrent.atomic.AtomicBoolean cardboard$warnedUnknownTarget = + new java.util.concurrent.atomic.AtomicBoolean(false); + @Override public boolean cardboard$setTarget(@Nullable LivingEntity target, EntityTargetEvent.@Nullable TargetReason reason) { if (this.getTarget() == target) { @@ -47,8 +52,11 @@ public void setTargetCraftBukkit(LivingEntity livingEntity, CallbackInfo ci) { if (reason == EntityTargetEvent.TargetReason.UNKNOWN && this.getTarget() != null && target == null) { reason = this.getTarget().isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; } - if (reason == EntityTargetEvent.TargetReason.UNKNOWN) { - ((ServerLevelBridge)this.level()).getCraftServer().getLogger().log(java.util.logging.Level.WARNING, "Unknown target reason, please report on the issue tracker", new Exception()); + if (reason == EntityTargetEvent.TargetReason.UNKNOWN && cardboard$warnedUnknownTarget.compareAndSet(false, true)) { + // Fires on every generic setTarget call, i.e. constantly once mobs are active. + // Report it once per run so the signal survives without flooding the log. + ((ServerLevelBridge)this.level()).getCraftServer().getLogger().log(java.util.logging.Level.WARNING, + "Unknown target reason, please report on the issue tracker (further occurrences suppressed)", new Exception()); } CraftLivingEntity ctarget = null; if (target != null) { From 51e1a68b55623677e1f0f6f9d5d8cbec873edbf1 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 10:41:42 -0700 Subject: [PATCH 10/15] 26.2: Add missing SulfurCube entity mapping 26.2 introduces SulfurCube, a new cube mob. CraftEntityTypes had no registration for it, so CraftEntity#getEntity hit its AssertionError and took the server down whenever one was spawned, ticked or untracked - emptying a sulfur cube bucket was enough. Audited all 158 NMS EntityTypes constants against CraftEntityTypes: SULFUR_CUBE was the only one missing. Bukkit models it as AbstractCubeMob + Shearable + Bucketable + Ageable (not a Slime, unlike MagmaCube), so CraftSulfurCube extends CraftAgeable and implements each contract against real NMS calls. setFuse is private in NMS and is now access-widened. canWander/setWander stay inert to match the existing CraftSlime behaviour. Verified: spawn, tick, kill and save with no AssertionError. --- .../craftbukkit/entity/CraftEntityTypes.java | 2 + .../craftbukkit/entity/CraftSulfurCube.java | 103 ++++++++++++++++++ src/main/resources/bukkitfabric.accesswidener | 2 + 3 files changed, 107 insertions(+) create mode 100644 src/main/java/org/bukkit/craftbukkit/entity/CraftSulfurCube.java diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java index 7cf3bd80e..bc7047b64 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java @@ -131,6 +131,8 @@ Level minecraftWorld() { 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))); 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/resources/bukkitfabric.accesswidener b/src/main/resources/bukkitfabric.accesswidener index d2a19de26..e546ad510 100644 --- a/src/main/resources/bukkitfabric.accesswidener +++ b/src/main/resources/bukkitfabric.accesswidener @@ -955,3 +955,5 @@ accessible method net/minecraft/world/entity/LivingEntity getHurtSound (Lnet/min 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 From 5308b926d8bd4c344773c50d6a243d61d04ed357 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 10:48:06 -0700 Subject: [PATCH 11/15] 26.2: Add missing PotentSulfur block entity mapping POTENT_SULFUR is a new 26.2 block entity with no registration in CraftBlockStates, so block.getState() on one fell through to the default factory, which asserts the block entity is null. Same failure class as the missing SulfurCube entity mapping. Found by auditing all 49 NMS BlockEntityTypes constants against the CraftBlockStates registrations; POTENT_SULFUR was the only gap. org.bukkit.block.PotentSulfur adds no members beyond TileState, so CraftPotentSulfur is a plain CraftBlockEntityState wrapper. Verified: placing minecraft:potent_sulfur no longer errors. --- .../craftbukkit/block/CraftBlockStates.java | 2 ++ .../craftbukkit/block/CraftPotentSulfur.java | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/main/java/org/bukkit/craftbukkit/block/CraftPotentSulfur.java diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java index 9c807ca44..aa3a9073a 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java @@ -148,6 +148,8 @@ public CraftBed createBlockState(World world, BlockPos pos, 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/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); + } +} From 013e0c1c97906b3858c853e7095d289c0425d88d Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 10:56:24 -0700 Subject: [PATCH 12/15] 26.2: Update README for the 26.2 branch - add ver/26.2 to the version chart and demote 26.1 to low - document building and the runtime layout - summarise the 26.2 API changes this branch targets - note the repository's derivation from CardboardPowered/cardboard --- README.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) 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. From 89f42d6601ab90ad79ed4a5c7c491176bd1c7ce9 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 11:09:04 -0700 Subject: [PATCH 13/15] 26.2: Use the iCommonLib 26.2 build Replaces the bundled iCommon-Fabric-26.1.2.jar with a jar built from the new iCommon-Fabric-26.2 module (minenite/iCommonLib). The 26.1.2 jar did load on 26.2, but it was compiled against the old Level#dimensionTypeRegistration() signature; on 26.2 that comparison silently evaluated false, so end-dimension checks were wrong rather than loudly broken. The 26.2 build fixes that and declares minecraft >=26.2. --- build.gradle | 4 ++-- ...ric-26.1.2.jar => iCommon-Fabric-26.2.jar} | Bin 126198 -> 121824 bytes 2 files changed, 2 insertions(+), 2 deletions(-) rename libs/{iCommon-Fabric-26.1.2.jar => iCommon-Fabric-26.2.jar} (79%) diff --git a/build.gradle b/build.gradle index ca9e4b409..6fc2ad669 100644 --- a/build.gradle +++ b/build.gradle @@ -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') 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 00db72c714a64a7c456795a0074bc9936c6d73a2..0df1b79a59b4d041d6ad23df3f97a07e2d64bc33 100644 GIT binary patch delta 12369 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 delta 16876 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 From b10b17c030608dd8cb631a3a83dc293a04244c6f Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Fri, 7 Aug 2026 18:05:46 -0700 Subject: [PATCH 14/15] 26.2: Always expand the mod version, and derive the Modrinth version processResources only expanded ${version} in fabric.mod.json when BUILD_NUMBER was set, so every local build shipped the literal string "${version}" and Fabric Loader warned that the version was unparseable on each start. It now always expands, falling back to project.mod_version. The Modrinth block also hardcoded "26.1-" for versionNumber, which would have published 26.2 builds labelled 26.1; it now derives from project.mod_version. Also refreshes libs/iCommon-Fabric-26.2.jar with the matching semver fix. Verified: boot log now reports "cardboard 26.2" and "icommon 0.0.0+26.2" with no loader version warnings. --- build.gradle | 8 ++++---- libs/iCommon-Fabric-26.2.jar | Bin 121824 -> 121827 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 6fc2ad669..7171cc167 100644 --- a/build.gradle +++ b/build.gradle @@ -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"] diff --git a/libs/iCommon-Fabric-26.2.jar b/libs/iCommon-Fabric-26.2.jar index 0df1b79a59b4d041d6ad23df3f97a07e2d64bc33..9f77d4eb7ab25fcca3676691853f7ec9e08eb683 100644 GIT binary patch delta 635 zcmaE`o&E84_J%Ety`A;G{)Y{C_P!5yv1Rg&p1@G(EIe7w@CajJqwJ<5xwg8VQ|C-=|twlZ7{1z$>t5r+Zbk;;YxB49*GDmXb#eXlph)W2B%w9I5 zi`(wSy@Cywx3R_E&R=m{^z-GG>m~~=ym@2#CZ6WA)Q~nm|2#GBqEY9E*^5fjbSPY|1wzxBpq7Ur(Hga)4=g$di*qV0sp{D zuj)RiTnaeAyZUZ@M2(g5ZQa>1{~xOCIu`q-^6QsxGxX!dTpQ-DGx>h)+Kn%5t=mQ3 zi8uZ#+VoIj#reMd0p9E!$K`G~buuzA{N66t%{YOH$zj6u4ZV!25*!U>Suh;n&CDXg zz`?=60F-^(%jm=fli_ICZrR6p-kTF{%yhw9jN!~G-Hg-ix)~*=OWkJVoj&0fqZ;#f zppak>qxkd-w-}8XcT8uw&8Q8s&G0s(4CC_YezzIL3_->Qcr!AIFu<&1k6p*ot-ME& uf#H)d1A{gLCj$aJ>1CY$ua{9zmX(1WqLY;kBs&iX4_h-Za4i7(iva+QfdE|q delta 630 zcmaF7o&CXf_J%Ety`A-^{SF%l?D?*}MyAn%)1zU>!Y;3=8jl)wIPkCA>$z>!+Y@D6 zD_-q?>^_T4Z$#G@4U|sRa@%6OUtZ*R>+Tg67kB^C zYZh%a#iHjEfA>fi>2YnilkmK4pNnGudheiY=al`$Gx)zx+7)gipsTuaX8qT7SC9QV z#$W&Cz$K%U+-Ll+Jsw0^9-FH!Bed|UkkvI8+qK1WYc;se_1wtVU-FBahhvp*uupF* zPf5PTjm+rgb#KkDeD3=Bvh8|_bKy3rEi#Lz$rc5e`OQ0jde5R%qlfCQug^pkY?~0Z zfa9^~+mOi`3%+G+nY5s3>YGO`R-Z3t)`y&%$LrOWbw+tkV-ioRnsdp_C2O}tZ0L2I z=lZN_isnb@t16ciIc62?+WI`8EhsLuy#7@3A114Sq($rcl*?yv8XP>C9zV@oAUyEW ztGW{^rveV}uD)9z^~Y-QE#28R{~xC8Iu?7T^6QsxGxX!dTo=rpXY&2xwHsgBTK9|G zYy4Ft()Cbc$@#wh0p9E!3*2(c+87xazHe9TW}Lvpv^!$@=3YisiDtR7EEo>(W@Zs# z;Nak30Lp&oWpv_#$u!Gtx9MX%@68D}X1d5N#&Bk!S<@Z686~F6-e%;T{%#2)&-D4X z7^N7$Oy6~j(T8#CboSef+VZ<2*kc)x03QP<5^u@$z}t*sLLjRGycwB97~oE*yv-=X j{IHjCI%6NBo-8W^J46jD8%Xy&AUtf%z`(u$=qm;Q9H Date: Fri, 7 Aug 2026 18:14:12 -0700 Subject: [PATCH 15/15] 26.2: Require Minecraft 26.2 in the mod metadata fabric.mod.json still declared minecraft >=26.1. This branch targets the 26.2 registry layout (EntityTypes/BlockEntityTypes) and Adventure 5, so it cannot run on 26.1 - loading it there would fail confusingly rather than being refused up front. --- src/main/resources/fabric.mod.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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": {