diff --git a/build.gradle b/build.gradle index 91f2e9ec..2c994e48 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.11-SNAPSHOT' + id 'net.fabricmc.fabric-loom-remap' version '1.14-SNAPSHOT' id 'maven-publish' } @@ -34,7 +34,7 @@ tasks.named('runGameTest', JavaExec).configure { dependencies { //to change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + mappings loom.officialMojangMappings() modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "carpet:fabric-carpet:${project.minecraft_version}-${project.carpet_core_version}" diff --git a/gradle.properties b/gradle.properties index 35d97115..babbc2d3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,16 +1,19 @@ # Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx1G + org.gradle.jvmargs=-Xmx1G + org.gradle.parallel=true + +# IntelliJ IDEA is not yet fully compatible with configuration cache, see: https://github.com/FabricMC/fabric-loom/issues/1349 + org.gradle.configuration-cache=false # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=1.21.9 - yarn_mappings=1.21.9+build.1 - loader_version=0.17.2 + minecraft_version=1.21.11 + loader_version=0.18.2 # check available versions on maven (https://masa.dy.fi/maven/carpet/fabric-carpet/) for the given minecraft version you are using - carpet_core_version=1.4.185+v250930 + carpet_core_version=1.4.193+v251211 # for gametests - fabric_api_version=0.134.0+1.21.9 + fabric_api_version=0.139.5+1.21.11 # Mod Properties mod_version = 1.4.177 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136..f8e1ee31 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca025c83..23449a2b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index b740cf13..adff685a 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -112,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -170,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -203,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 25da30db..c4bdd3ab 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -68,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/gametest/java/carpetextra/machinery/DynamicTest.java b/src/gametest/java/carpetextra/machinery/DynamicTest.java index 89389eb6..43d61605 100644 --- a/src/gametest/java/carpetextra/machinery/DynamicTest.java +++ b/src/gametest/java/carpetextra/machinery/DynamicTest.java @@ -3,17 +3,17 @@ import java.util.Locale; import java.util.function.Consumer; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.test.FunctionTestInstance; -import net.minecraft.test.TestContext; -import net.minecraft.test.TestData; -import net.minecraft.test.TestEnvironmentDefinition; -import net.minecraft.test.TestInstance; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Identifier; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.FunctionGameTestInstance; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.gametest.framework.GameTestInstance; +import net.minecraft.gametest.framework.TestData; +import net.minecraft.gametest.framework.TestEnvironmentDefinition; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.block.Rotation; // slightly extended TestData public record DynamicTest( @@ -23,37 +23,37 @@ public record DynamicTest( int maxTicks, int setupTicks, boolean required, - BlockRotation rotation, + Rotation rotation, boolean manualOnly, int maxAttempts, int requiredSuccesses, boolean skyAccess, - Consumer testFunction + Consumer testFunction ) { - public DynamicTest(String environment, String name, String structure, int maxTicks, int setupTicks, boolean required, BlockRotation rotation, Consumer runner) { + public DynamicTest(String environment, String name, String structure, int maxTicks, int setupTicks, boolean required, Rotation rotation, Consumer runner) { this(environment, name, structure, maxTicks, setupTicks, required, rotation, false, 1, 1, false, runner); } - public DynamicTest(String environment, String name, String structure, int maxTicks, int setupTicks, boolean required, Consumer runner) { - this(environment, name, structure, maxTicks, setupTicks, required, BlockRotation.NONE, runner); + public DynamicTest(String environment, String name, String structure, int maxTicks, int setupTicks, boolean required, Consumer runner) { + this(environment, name, structure, maxTicks, setupTicks, required, Rotation.NONE, runner); } // adapted from TestAnnotationLocator.TestMethod - public TestInstance testInstance(Registry envRegistry) { - return new FunctionTestInstance( - RegistryKey.of(RegistryKeys.TEST_FUNCTION, identifier()), + public GameTestInstance testInstance(Registry envRegistry) { + return new FunctionGameTestInstance( + ResourceKey.create(Registries.TEST_FUNCTION, identifier()), testData(envRegistry) ); } - TestData> testData(Registry testEnvironmentDefinitionRegistry) { + TestData> testData(Registry testEnvironmentDefinitionRegistry) { DynamicTest gameTest = this; - RegistryEntry testEnvironment = testEnvironmentDefinitionRegistry.getOrThrow(RegistryKey.of(RegistryKeys.TEST_ENVIRONMENT, Identifier.of(gameTest.environment()))); + Holder testEnvironment = testEnvironmentDefinitionRegistry.getOrThrow(ResourceKey.create(Registries.TEST_ENVIRONMENT, Identifier.parse(gameTest.environment()))); return new TestData<>( testEnvironment, - Identifier.of(gameTest.structure()), + Identifier.parse(gameTest.structure()), gameTest.maxTicks(), gameTest.setupTicks(), gameTest.required(), @@ -70,7 +70,7 @@ private static String camelToSnake(String input) { } public Identifier identifier() { - return Identifier.of("carpet-extra-gametest", camelToSnake(name)); + return Identifier.fromNamespaceAndPath("carpet-extra-gametest", camelToSnake(name)); } } diff --git a/src/gametest/java/carpetextra/machinery/TestEnvDefinitions.java b/src/gametest/java/carpetextra/machinery/TestEnvDefinitions.java index fe7e2670..40041c4a 100644 --- a/src/gametest/java/carpetextra/machinery/TestEnvDefinitions.java +++ b/src/gametest/java/carpetextra/machinery/TestEnvDefinitions.java @@ -7,14 +7,14 @@ import carpet.CarpetServer; import carpet.api.settings.InvalidRuleValueException; import carpet.api.settings.RuleHelper; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.test.TestEnvironmentDefinition; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.gametest.framework.TestEnvironmentDefinition; +import net.minecraft.server.level.ServerLevel; class TestEnvDefinitions { public static void runRegistration() { - Registry.register(Registries.TEST_ENVIRONMENT_DEFINITION_TYPE, "carpet:rule", CarpetRule.CODEC); + Registry.register(BuiltInRegistries.TEST_ENVIRONMENT_DEFINITION_TYPE, "carpet:rule", CarpetRule.CODEC); } public record CarpetRule(String key, String value) implements TestEnvironmentDefinition { @@ -24,21 +24,21 @@ public record CarpetRule(String key, String value) implements TestEnvironmentDef ).apply(i, CarpetRule::new)); @Override - public void setup(ServerWorld world) { + public void setup(ServerLevel world) { try { - CarpetServer.settingsManager.getCarpetRule(key).set(world.getServer().getCommandSource(), value); + CarpetServer.settingsManager.getCarpetRule(key).set(world.getServer().createCommandSourceStack(), value); } catch (InvalidRuleValueException e) { throw new IllegalArgumentException(e); } } @Override - public MapCodec getCodec() { + public MapCodec codec() { return CODEC; } @Override - public void teardown(ServerWorld world) { - RuleHelper.resetToDefault(CarpetServer.settingsManager.getCarpetRule(key), world.getServer().getCommandSource()); + public void teardown(ServerLevel world) { + RuleHelper.resetToDefault(CarpetServer.settingsManager.getCarpetRule(key), world.getServer().createCommandSourceStack()); } } } diff --git a/src/gametest/java/carpetextra/machinery/TestMachinery.java b/src/gametest/java/carpetextra/machinery/TestMachinery.java index f95e0813..41a39709 100644 --- a/src/gametest/java/carpetextra/machinery/TestMachinery.java +++ b/src/gametest/java/carpetextra/machinery/TestMachinery.java @@ -3,12 +3,12 @@ import java.nio.file.Path; import net.fabricmc.api.ModInitializer; -import net.minecraft.test.TestInstanceUtil; +import net.minecraft.gametest.framework.StructureUtils; public class TestMachinery implements ModInitializer { @Override public void onInitialize() { - TestInstanceUtil.testStructuresDirectoryName = Path.of("../src/gametest/resources/data/carpet-extra/gametest/structure"); + StructureUtils.testStructuresDir = Path.of("../src/gametest/resources/data/carpet-extra/gametest/structure"); TestEnvDefinitions.runRegistration(); TestProviderRunner.onInitialize(); } diff --git a/src/gametest/java/carpetextra/machinery/TestProviderRunner.java b/src/gametest/java/carpetextra/machinery/TestProviderRunner.java index 95e1e5c4..1b83cd6e 100644 --- a/src/gametest/java/carpetextra/machinery/TestProviderRunner.java +++ b/src/gametest/java/carpetextra/machinery/TestProviderRunner.java @@ -8,10 +8,10 @@ import net.fabricmc.fabric.api.gametest.v1.CustomTestMethodInvoker; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.entrypoint.EntrypointContainer; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; -import net.minecraft.test.TestEnvironmentDefinition; -import net.minecraft.test.TestInstance; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.gametest.framework.GameTestInstance; +import net.minecraft.gametest.framework.TestEnvironmentDefinition; // note: adapted from Fabric API implementation public class TestProviderRunner { @@ -44,14 +44,14 @@ public static void onInitialize() { } for (DynamicTest test : generated) { - Registry.register(Registries.TEST_FUNCTION, test.identifier(), test.testFunction()); + Registry.register(BuiltInRegistries.TEST_FUNCTION, test.identifier(), test.testFunction()); } } - public static void registerDynamicEntries(Registry testInstances, Registry envRegistry) { + public static void registerDynamicEntries(Registry testInstances, Registry envRegistry) { for (DynamicTest test : generated) { - TestInstance testInstance = test.testInstance(envRegistry); + GameTestInstance testInstance = test.testInstance(envRegistry); Registry.register(testInstances, test.identifier(), testInstance); } } diff --git a/src/gametest/java/carpetextra/mixin/FabricGametestMixin.java b/src/gametest/java/carpetextra/mixin/FabricGametestMixin.java index af1bb846..181178f4 100644 --- a/src/gametest/java/carpetextra/mixin/FabricGametestMixin.java +++ b/src/gametest/java/carpetextra/mixin/FabricGametestMixin.java @@ -9,15 +9,15 @@ import carpetextra.machinery.TestProviderRunner; import net.fabricmc.fabric.impl.gametest.FabricGameTestModInitializer; -import net.minecraft.registry.Registry; -import net.minecraft.test.TestEnvironmentDefinition; -import net.minecraft.test.TestInstance; +import net.minecraft.core.Registry; +import net.minecraft.gametest.framework.GameTestInstance; +import net.minecraft.gametest.framework.TestEnvironmentDefinition; @Mixin(value = FabricGameTestModInitializer.class, remap = false) class FabricGametestMixin { @Inject(method = "registerDynamicEntries", at = @At("TAIL")) private static void addOursToo(CallbackInfo ci, - @Local(name="testInstances") Registry testInstances, + @Local(name="testInstances") Registry testInstances, @Local(name="testEnvironmentDefinitionRegistry") Registry envRegistry) { TestProviderRunner.registerDynamicEntries(testInstances, envRegistry); } diff --git a/src/gametest/java/carpetextra/test/DispenserWithBlock.java b/src/gametest/java/carpetextra/test/DispenserWithBlock.java index 66a07bca..2606d25d 100644 --- a/src/gametest/java/carpetextra/test/DispenserWithBlock.java +++ b/src/gametest/java/carpetextra/test/DispenserWithBlock.java @@ -11,25 +11,25 @@ import carpetextra.machinery.TestProvider; import carpetextra.mixins.AxeItem_StrippedBlocksAccessorMixin; import net.fabricmc.fabric.api.gametest.v1.GameTest; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeveledCauldronBlock; -import net.minecraft.block.NetherWartBlock; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.component.type.PotionContentsComponent; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.potion.Potions; -import net.minecraft.test.TestContext; -import net.minecraft.text.Text; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.GameMode; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LayeredCauldronBlock; +import net.minecraft.world.level.block.NetherWartBlock; +import net.minecraft.world.level.block.entity.DispenserBlockEntity; +import net.minecraft.world.level.block.state.BlockState; public class DispenserWithBlock { static final String STRUCTURE = "carpet-extra:dispenserbase"; @@ -41,90 +41,90 @@ public class DispenserWithBlock { BlockPos dispenser = new BlockPos(1, 1, 0); @GameTest(structure = STRUCTURE, environment = ENV) - public void renewableNetherrack(TestContext ctx) { + public void renewableNetherrack(GameTestHelper ctx) { blockConversionTest(ctx, Items.FIRE_CHARGE, Blocks.COBBLESTONE, Blocks.NETHERRACK, 1, true); } @GameTest(structure = STRUCTURE, environment = ENV) - public void renewableEndstone(TestContext ctx) { + public void renewableEndstone(GameTestHelper ctx) { blockConversionTest(ctx, Items.DRAGON_BREATH, Blocks.COBBLESTONE, Blocks.END_STONE, 1, true); } @GameTest(structure = STRUCTURE, environment = ENV) - public void blazeMeal(TestContext ctx) { - putInDispenser(ctx, Items.BLAZE_POWDER.getDefaultStack()); - ctx.setBlockState(lapis, Blocks.SOUL_SAND); - ctx.setBlockState(lapis.up(), Blocks.NETHER_WART); + public void blazeMeal(GameTestHelper ctx) { + putInDispenser(ctx, Items.BLAZE_POWDER.getDefaultInstance()); + ctx.setBlock(lapis, Blocks.SOUL_SAND); + ctx.setBlock(lapis.above(), Blocks.NETHER_WART); - ctx.pushButton(button); + ctx.pressButton(button); - ctx.addFinalTaskWithDuration(DISPENSER_DELAY, () -> { - ctx.expectEmptyContainer(dispenser); - ctx.expectBlockProperty(lapis.up(), NetherWartBlock.AGE, 1); + ctx.succeedOnTickWhen(DISPENSER_DELAY, () -> { + ctx.assertContainerEmpty(dispenser); + ctx.assertBlockProperty(lapis.above(), NetherWartBlock.AGE, 1); }); } @GameTest(structure = STRUCTURE, environment = ENV) - public void blazeMealMaxed(TestContext ctx) { - putInDispenser(ctx, Items.BLAZE_POWDER.getDefaultStack()); - ctx.setBlockState(lapis, Blocks.SOUL_SAND); - ctx.setBlockState(lapis.up(), Blocks.NETHER_WART.getDefaultState().with(NetherWartBlock.AGE, NetherWartBlock.MAX_AGE)); + public void blazeMealMaxed(GameTestHelper ctx) { + putInDispenser(ctx, Items.BLAZE_POWDER.getDefaultInstance()); + ctx.setBlock(lapis, Blocks.SOUL_SAND); + ctx.setBlock(lapis.above(), Blocks.NETHER_WART.defaultBlockState().setValue(NetherWartBlock.AGE, NetherWartBlock.MAX_AGE)); - ctx.pushButton(button); + ctx.pressButton(button); - ctx.runAtTick(DISPENSER_DELAY, () -> { + ctx.runAtTickTime(DISPENSER_DELAY, () -> { checkFirstSlotHas(ctx, Items.BLAZE_POWDER, false); - ctx.expectBlockProperty(lapis.up(), NetherWartBlock.AGE, NetherWartBlock.MAX_AGE); - ctx.complete(); + ctx.assertBlockProperty(lapis.above(), NetherWartBlock.AGE, NetherWartBlock.MAX_AGE); + ctx.succeed(); }); } @GameTest(structure = STRUCTURE, environment = ENV) - public void shearPumpkin(TestContext ctx) { - blockConversionTest(ctx, Items.SHEARS, Blocks.PUMPKIN, Blocks.CARVED_PUMPKIN, 1, false, () -> ctx.expectItem(Items.PUMPKIN_SEEDS)); + public void shearPumpkin(GameTestHelper ctx) { + blockConversionTest(ctx, Items.SHEARS, Blocks.PUMPKIN, Blocks.CARVED_PUMPKIN, 1, false, () -> ctx.assertItemEntityPresent(Items.PUMPKIN_SEEDS)); } @GameTest(structure = STRUCTURE, environment = ENV) - public void shearPumpkinBreaks(TestContext ctx) { - blockConversionTest(ctx, Items.SHEARS, Blocks.PUMPKIN, Blocks.CARVED_PUMPKIN, 1, true, () -> ctx.expectItem(Items.PUMPKIN_SEEDS)); + public void shearPumpkinBreaks(GameTestHelper ctx) { + blockConversionTest(ctx, Items.SHEARS, Blocks.PUMPKIN, Blocks.CARVED_PUMPKIN, 1, true, () -> ctx.assertItemEntityPresent(Items.PUMPKIN_SEEDS)); } @GameTest(structure = STRUCTURE, environment = ENV) - public void boatOnRegularIce(TestContext ctx) { + public void boatOnRegularIce(GameTestHelper ctx) { boatTest(ctx, Items.OAK_BOAT, Blocks.ICE, EntityType.OAK_BOAT); } @GameTest(structure = STRUCTURE, environment = ENV) - public void boatOnPackedIce(TestContext ctx) { + public void boatOnPackedIce(GameTestHelper ctx) { boatTest(ctx, Items.OAK_BOAT, Blocks.PACKED_ICE, EntityType.OAK_BOAT); } @GameTest(structure = STRUCTURE, environment = ENV) - public void boatOnBlueIce(TestContext ctx) { + public void boatOnBlueIce(GameTestHelper ctx) { boatTest(ctx, Items.OAK_BOAT, Blocks.BLUE_ICE, EntityType.OAK_BOAT); } @GameTest(structure = STRUCTURE, environment = ENV) - public void chestBoatOnIce(TestContext ctx) { + public void chestBoatOnIce(GameTestHelper ctx) { boatTest(ctx, Items.OAK_CHEST_BOAT, Blocks.ICE, EntityType.OAK_CHEST_BOAT); } - private void boatTest(TestContext ctx, Item item, Block block, EntityType expectedEntity) { - putInDispenser(ctx, item.getDefaultStack()); - ctx.setBlockState(lapis, block); + private void boatTest(GameTestHelper ctx, Item item, Block block, EntityType expectedEntity) { + putInDispenser(ctx, item.getDefaultInstance()); + ctx.setBlock(lapis, block); - ctx.pushButton(button); - ctx.runAtTick(DISPENSER_DELAY, () -> { - ctx.expectEmptyContainer(dispenser); - ctx.expectEntityAt(expectedEntity, lapis.up()); + ctx.pressButton(button); + ctx.runAtTickTime(DISPENSER_DELAY, () -> { + ctx.assertContainerEmpty(dispenser); + ctx.assertEntityPresent(expectedEntity, lapis.above()); Entity boat = ctx.getEntities(expectedEntity).getFirst(); - PlayerEntity p = ctx.createMockPlayer(GameMode.SURVIVAL); + Player p = ctx.makeMockPlayer(GameType.SURVIVAL); for (int i = 0; i < 20; i++) p.attack(boat); // just kill doesn't drop it - ctx.expectItem(item); - ctx.complete(); + ctx.assertItemEntityPresent(item); + ctx.succeed(); }); } @@ -154,7 +154,7 @@ public Collection stripTests() { return fns; } - private void stripTest(TestContext ctx, Item tool, Block blockFrom, Block blockTo) { + private void stripTest(GameTestHelper ctx, Item tool, Block blockFrom, Block blockTo) { blockConversionTest(ctx, tool, blockFrom, blockTo, 1, false); } @@ -166,15 +166,15 @@ public Collection cauldronTests() { int finalOff = off; int adjustedI = off > 0 ? i : i + 1; fns.add(makeDispenserTest("cauldronBottleLvl" + adjustedI + (off > 0 ? "Fill" : "Empty"), ctx -> { - putInDispenser(ctx, finalOff > 0 ? waterBottle() : Items.GLASS_BOTTLE.getDefaultStack()); - ctx.setBlockState(lapis.up(), waterCauldronFor(ctx, adjustedI)); - BlockPos referencePos = dispenser.down(); - ctx.setBlockState(referencePos, waterCauldronFor(ctx, adjustedI + finalOff)); + putInDispenser(ctx, finalOff > 0 ? waterBottle() : Items.GLASS_BOTTLE.getDefaultInstance()); + ctx.setBlock(lapis.above(), waterCauldronFor(ctx, adjustedI)); + BlockPos referencePos = dispenser.below(); + ctx.setBlock(referencePos, waterCauldronFor(ctx, adjustedI + finalOff)); - ctx.pushButton(button); + ctx.pressButton(button); - ctx.addFinalTaskWithDuration(DISPENSER_DELAY, () -> { - ctx.expectSameStates(lapis.up(), referencePos); + ctx.succeedOnTickWhen(DISPENSER_DELAY, () -> { + ctx.assertSameBlockState(lapis.above(), referencePos); checkFirstSlotHas(ctx, finalOff > 0 ? Items.GLASS_BOTTLE : Items.POTION, false); }); })); @@ -199,14 +199,14 @@ public Collection cauldronTests() { } private static ItemStack waterBottle() { - return PotionContentsComponent.createStack(Items.POTION, Potions.WATER); + return PotionContents.createItemStack(Items.POTION, Potions.WATER); } - private BlockState waterCauldronFor(TestContext ctx, int level) { + private BlockState waterCauldronFor(GameTestHelper ctx, int level) { if (level == 0) { - return Blocks.CAULDRON.getDefaultState(); + return Blocks.CAULDRON.defaultBlockState(); } - return Blocks.WATER_CAULDRON.getDefaultState().with(LeveledCauldronBlock.LEVEL, level); + return Blocks.WATER_CAULDRON.defaultBlockState().setValue(LayeredCauldronBlock.LEVEL, level); } @TestProvider @@ -225,7 +225,7 @@ public Collection tillTests() { blockConversionTest(ctx, Items.IRON_HOE, Blocks.COARSE_DIRT, Blocks.DIRT, 0, false); })); fns.add(makeDispenserTest("tillRootedDirt", (ctx) -> { - blockConversionTest(ctx, Items.IRON_HOE, Blocks.ROOTED_DIRT, Blocks.DIRT, 0, false, () -> ctx.expectItem(Items.HANGING_ROOTS)); + blockConversionTest(ctx, Items.IRON_HOE, Blocks.ROOTED_DIRT, Blocks.DIRT, 0, false, () -> ctx.assertItemEntityPresent(Items.HANGING_ROOTS)); })); for (Item hoe : List.of(Items.WOODEN_HOE, Items.STONE_HOE, Items.GOLDEN_HOE, Items.IRON_HOE, Items.DIAMOND_HOE, Items.NETHERITE_HOE)) { @@ -237,20 +237,20 @@ public Collection tillTests() { return fns; } - private void blockConversionTest(TestContext ctx, Item tool, Block from, Block to, int offset, boolean putDamaged, Runnable... extras) { + private void blockConversionTest(GameTestHelper ctx, Item tool, Block from, Block to, int offset, boolean putDamaged, Runnable... extras) { if (putDamaged) { putAtOneDurability(ctx, tool); } else { - putInDispenser(ctx, tool.getDefaultStack()); + putInDispenser(ctx, tool.getDefaultInstance()); } - ctx.setBlockState(lapis.offset(Direction.UP, offset), from); - ctx.pushButton(button); + ctx.setBlock(lapis.relative(Direction.UP, offset), from); + ctx.pressButton(button); - ctx.addFinalTaskWithDuration(DISPENSER_DELAY, () -> { - ctx.expectBlock(to, lapis.offset(Direction.UP, offset)); + ctx.succeedOnTickWhen(DISPENSER_DELAY, () -> { + ctx.assertBlockPresent(to, lapis.relative(Direction.UP, offset)); if (putDamaged) { - ctx.expectEmptyContainer(dispenser); - } else if (tool.getDefaultStack().isDamageable()) { // otherwise we expect extras to handle it + ctx.assertContainerEmpty(dispenser); + } else if (tool.getDefaultInstance().isDamageableItem()) { // otherwise we expect extras to handle it checkFirstSlotHas(ctx, tool, true); } runAll(extras); @@ -258,99 +258,99 @@ private void blockConversionTest(TestContext ctx, Item tool, Block from, Block t } @GameTest(structure = STRUCTURE, environment = ENV) - public void fillMinecartChest(TestContext ctx) { + public void fillMinecartChest(GameTestHelper ctx) { cartTest(ctx, Items.CHEST, EntityType.CHEST_MINECART); } @GameTest(structure = STRUCTURE, environment = ENV) - public void fillMinecartHopper(TestContext ctx) { + public void fillMinecartHopper(GameTestHelper ctx) { cartTest(ctx, Items.HOPPER, EntityType.HOPPER_MINECART); } @GameTest(structure = STRUCTURE, environment = ENV) - public void fillMinecartTnt(TestContext ctx) { - cartTest(ctx, Items.TNT, EntityType.TNT_MINECART, () -> ctx.dontExpectEntity(EntityType.TNT)); + public void fillMinecartTnt(GameTestHelper ctx) { + cartTest(ctx, Items.TNT, EntityType.TNT_MINECART, () -> ctx.assertEntityNotPresent(EntityType.TNT)); } @GameTest(structure = STRUCTURE, environment = ENV) - public void fillMinecartFurnace(TestContext ctx) { + public void fillMinecartFurnace(GameTestHelper ctx) { cartTest(ctx, Items.FURNACE, EntityType.FURNACE_MINECART); } - private void cartTest(TestContext ctx, Item item, EntityType entity, Runnable... extras) { - putInDispenser(ctx, item.getDefaultStack()); - ctx.setBlockState(lapis.up(), Blocks.RAIL); - ctx.spawnEntity(EntityType.MINECART, lapis.up()); + private void cartTest(GameTestHelper ctx, Item item, EntityType entity, Runnable... extras) { + putInDispenser(ctx, item.getDefaultInstance()); + ctx.setBlock(lapis.above(), Blocks.RAIL); + ctx.spawn(EntityType.MINECART, lapis.above()); - ctx.pushButton(button); - ctx.addFinalTaskWithDuration(DISPENSER_DELAY, () -> { - ctx.expectEntityAt(entity, lapis.up()); - ctx.dontExpectEntity(EntityType.MINECART); - ctx.dontExpectEntity(EntityType.ITEM); + ctx.pressButton(button); + ctx.succeedOnTickWhen(DISPENSER_DELAY, () -> { + ctx.assertEntityPresent(entity, lapis.above()); + ctx.assertEntityNotPresent(EntityType.MINECART); + ctx.assertEntityNotPresent(EntityType.ITEM); runAll(extras); }); } // very basic autocrafting test, for now just to catch simple crashes or malfunctioning stuff @GameTest(structure = STRUCTURE, environment = ENV) - public void craftCake(TestContext ctx) { + public void craftCake(GameTestHelper ctx) { Item[] recipe = new Item[] { Items.MILK_BUCKET, Items.MILK_BUCKET, Items.MILK_BUCKET, Items.SUGAR, Items.EGG, Items.SUGAR, Items.WHEAT, Items.WHEAT, Items.WHEAT }; - ctx.setBlockState(dispenser, Blocks.DROPPER.getStateWithProperties(ctx.getBlockState(dispenser))); - ctx.setBlockState(lapis.up(), Blocks.CRAFTING_TABLE); + ctx.setBlock(dispenser, Blocks.DROPPER.withPropertiesOf(ctx.getBlockState(dispenser))); + ctx.setBlock(lapis.above(), Blocks.CRAFTING_TABLE); for (int i = 0; i < 9; i++) { - ctx.getBlockEntity(dispenser, DispenserBlockEntity.class).setStack(i, recipe[i].getDefaultStack()); + ctx.getBlockEntity(dispenser, DispenserBlockEntity.class).setItem(i, recipe[i].getDefaultInstance()); } - ctx.pushButton(button); + ctx.pressButton(button); - ctx.addFinalTaskWithDuration(DISPENSER_DELAY, () -> { - ctx.expectItem(Items.CAKE); - for (Item item : recipe) ctx.dontExpectItem(item); + ctx.succeedOnTickWhen(DISPENSER_DELAY, () -> { + ctx.assertItemEntityPresent(Items.CAKE); + for (Item item : recipe) ctx.assertItemEntityNotPresent(item); for (int i = 0; i < 3; i++) { int finalI = i; - ctx.checkBlockEntity(dispenser, DispenserBlockEntity.class, - disp -> disp.getStack(finalI).getItem() == Items.BUCKET, + ctx.assertBlockEntityData(dispenser, DispenserBlockEntity.class, + disp -> disp.getItem(finalI).getItem() == Items.BUCKET, msg("Must have buckets remaining in dispenser")); } for (int i = 3; i < 9; i++) { int finalI = i; - ctx.checkBlockEntity(dispenser, DispenserBlockEntity.class, - disp -> disp.getStack(finalI).isEmpty(), + ctx.assertBlockEntityData(dispenser, DispenserBlockEntity.class, + disp -> disp.getItem(finalI).isEmpty(), msg("Must not have anything but the first 3 buckets in dispenser")); } }); } // Util - private void putInDispenser(TestContext ctx, ItemStack item) { - ctx.getBlockEntity(dispenser, DispenserBlockEntity.class).addToFirstFreeSlot(item); + private void putInDispenser(GameTestHelper ctx, ItemStack item) { + ctx.getBlockEntity(dispenser, DispenserBlockEntity.class).insertItem(item); } - private void putAtOneDurability(TestContext ctx, Item item) { - ItemStack stack = item.getDefaultStack(); - stack.setDamage(stack.getMaxDamage() - 1); + private void putAtOneDurability(GameTestHelper ctx, Item item) { + ItemStack stack = item.getDefaultInstance(); + stack.setDamageValue(stack.getMaxDamage() - 1); putInDispenser(ctx, stack); } - private void checkFirstSlotHas(TestContext ctx, Item item, boolean damaged) { - ctx.checkBlockEntity(dispenser, DispenserBlockEntity.class, - disp -> disp.getStack(0).getItem() == item && (!damaged || disp.getStack(0).isDamaged()), + private void checkFirstSlotHas(GameTestHelper ctx, Item item, boolean damaged) { + ctx.assertBlockEntityData(dispenser, DispenserBlockEntity.class, + disp -> disp.getItem(0).getItem() == item && (!damaged || disp.getItem(0).isDamaged()), msg("Must have " + (damaged ? "damaged " : "") + item + " in dispenser")); } private void runAll(Runnable... actions) { for (Runnable r : actions) r.run(); } - private Supplier msg(String str) { - return () -> Text.literal(str); + private Supplier msg(String str) { + return () -> Component.literal(str); } // Setup util - private DynamicTest makeDispenserTest(String name, Consumer runner) { + private DynamicTest makeDispenserTest(String name, Consumer runner) { name = GEN_PREFIX + '.' + name.replace("minecraft:", ""); return new DynamicTest(ENV, name, STRUCTURE, 20, 0, true, runner); } diff --git a/src/gametest/java/carpetextra/test/WartFarming.java b/src/gametest/java/carpetextra/test/WartFarming.java index 6408694b..06e799bf 100644 --- a/src/gametest/java/carpetextra/test/WartFarming.java +++ b/src/gametest/java/carpetextra/test/WartFarming.java @@ -1,17 +1,17 @@ package carpetextra.test; -import static net.minecraft.block.NetherWartBlock.*; +import static net.minecraft.world.level.block.NetherWartBlock.*; import java.util.Set; import net.fabricmc.fabric.api.gametest.v1.GameTest; -import net.minecraft.block.Blocks; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.item.Items; -import net.minecraft.test.TestContext; -import net.minecraft.text.Text; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.npc.villager.Villager; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; public class WartFarming { private static final String STRUCTURE = "carpet-extra:wartbase"; @@ -21,37 +21,37 @@ public class WartFarming { BlockPos lapis = new BlockPos(3, 1, 0); @GameTest(environment = WART_FARMING_ENABLED, structure = STRUCTURE, maxTicks = 1500) - public void placesWarts(TestContext ctx) { + public void placesWarts(GameTestHelper ctx) { ctx.spawnItem(Items.NETHER_WART, lapis); - ctx.spawnEntity(EntityType.VILLAGER, lapis); + ctx.spawn(EntityType.VILLAGER, lapis); - ctx.addInstantFinalTask(() -> { - ctx.expectBlock(Blocks.NETHER_WART, soulSand.up()); + ctx.succeedWhen(() -> { + ctx.assertBlockPresent(Blocks.NETHER_WART, soulSand.above()); }); } @GameTest(environment = WART_FARMING_ENABLED, structure = STRUCTURE, maxTicks = 1500) - public void collectsWarts(TestContext ctx) { - ctx.setBlockState(soulSand.up(), Blocks.NETHER_WART.getDefaultState().with(AGE, MAX_AGE)); - VillagerEntity villager = ctx.spawnEntity(EntityType.VILLAGER, lapis); + public void collectsWarts(GameTestHelper ctx) { + ctx.setBlock(soulSand.above(), Blocks.NETHER_WART.defaultBlockState().setValue(AGE, MAX_AGE)); + Villager villager = ctx.spawn(EntityType.VILLAGER, lapis); - ctx.addInstantFinalTask(() -> { - ctx.checkBlockState(soulSand.up(), - state -> state.getBlock() != Blocks.NETHER_WART || state.get(AGE) != MAX_AGE, - (st) -> Text.literal("Wart not collected")); - ctx.assertTrue(villager.getInventory().containsAny(Set.of(Items.NETHER_WART)), Text.literal("Villager didn't get warts")); + ctx.succeedWhen(() -> { + ctx.assertBlockState(soulSand.above(), + state -> state.getBlock() != Blocks.NETHER_WART || state.getValue(AGE) != MAX_AGE, + (st) -> Component.literal("Wart not collected")); + ctx.assertTrue(villager.getInventory().hasAnyOf(Set.of(Items.NETHER_WART)), Component.literal("Villager didn't get warts")); }); } @GameTest(/* no env */ structure = STRUCTURE, maxTicks = 200) - public void doesntPickupWartsWithoutRule(TestContext ctx) { + public void doesntPickupWartsWithoutRule(GameTestHelper ctx) { ctx.spawnItem(Items.NETHER_WART, lapis); - ctx.spawnEntity(EntityType.VILLAGER, lapis); + ctx.spawn(EntityType.VILLAGER, lapis); - ctx.runAtEveryTick(() -> { - ctx.expectItem(Items.NETHER_WART); + ctx.failIfEver(() -> { + ctx.assertItemEntityPresent(Items.NETHER_WART); }); - ctx.runAtTick(200, ctx::complete); + ctx.runAtTickTime(200, ctx::succeed); } /* Too slow diff --git a/src/main/java/carpetextra/CarpetExtraServer.java b/src/main/java/carpetextra/CarpetExtraServer.java index 4c9cdae2..f3f99873 100644 --- a/src/main/java/carpetextra/CarpetExtraServer.java +++ b/src/main/java/carpetextra/CarpetExtraServer.java @@ -8,8 +8,8 @@ import carpetextra.utils.CarpetExtraTranslations; import com.mojang.brigadier.CommandDispatcher; import net.fabricmc.api.ModInitializer; -import net.minecraft.command.CommandRegistryAccess; -import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.CommandSourceStack; import java.util.Map; @@ -42,7 +42,7 @@ public void onGameStarted() } @Override - public void registerCommands(CommandDispatcher dispatcher, CommandRegistryAccess commandRegistryAccess) + public void registerCommands(CommandDispatcher dispatcher, CommandBuildContext commandRegistryAccess) { // here goes extra stuff PingCommand.register(dispatcher); diff --git a/src/main/java/carpetextra/CarpetExtraSettings.java b/src/main/java/carpetextra/CarpetExtraSettings.java index 3d122a4f..c3749096 100644 --- a/src/main/java/carpetextra/CarpetExtraSettings.java +++ b/src/main/java/carpetextra/CarpetExtraSettings.java @@ -4,7 +4,7 @@ import carpet.api.settings.CarpetRule; import carpet.api.settings.Validator; import carpet.api.settings.Validators; -import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.commands.CommandSourceStack; import static carpet.api.settings.RuleCategory.*; @@ -24,7 +24,7 @@ public enum ComparatorOptions { public static class validatorScaffoldingDistance extends Validator { @Override - public Integer validate(ServerCommandSource source, CarpetRule currentRule, Integer newValue, String string) { + public Integer validate(CommandSourceStack source, CarpetRule currentRule, Integer newValue, String string) { return newValue >= 0 && newValue <= 7 ? newValue : null; } @@ -181,7 +181,7 @@ public Integer validate(ServerCommandSource source, CarpetRule currentR public static class ValidateSpiderJokeyDropChance extends Validator { @Override - public Integer validate(ServerCommandSource source, CarpetRule currentRule, Integer newValue, String string) + public Integer validate(CommandSourceStack source, CarpetRule currentRule, Integer newValue, String string) { return newValue >= 0 && newValue <= 100 ? newValue : null; } diff --git a/src/main/java/carpetextra/commands/PingCommand.java b/src/main/java/carpetextra/commands/PingCommand.java index 4a28bca4..e6fcf882 100644 --- a/src/main/java/carpetextra/commands/PingCommand.java +++ b/src/main/java/carpetextra/commands/PingCommand.java @@ -3,23 +3,23 @@ import carpetextra.CarpetExtraSettings; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; -import static net.minecraft.server.command.CommandManager.literal; +import static net.minecraft.commands.Commands.literal; public class PingCommand { - public static void register(CommandDispatcher dispatcher) + public static void register(CommandDispatcher dispatcher) { - LiteralArgumentBuilder command = literal("ping"). - requires( (source) -> CarpetExtraSettings.commandPing && source.isExecutedByPlayer()). + LiteralArgumentBuilder command = literal("ping"). + requires( (source) -> CarpetExtraSettings.commandPing && source.isPlayer()). executes( c -> { - ServerPlayerEntity player = c.getSource().getPlayer(); - int ping = player.networkHandler.getLatency(); - c.getSource().sendFeedback(() -> Text.literal("Your ping is: " + ping + " ms"), false); + ServerPlayer player = c.getSource().getPlayer(); + int ping = player.connection.latency(); + c.getSource().sendSuccess(() -> Component.literal("Your ping is: " + ping + " ms"), false); return 1; }); diff --git a/src/main/java/carpetextra/dispenser/CarpetExtraDispenserBehaviors.java b/src/main/java/carpetextra/dispenser/CarpetExtraDispenserBehaviors.java index add91ac9..ebf0706a 100644 --- a/src/main/java/carpetextra/dispenser/CarpetExtraDispenserBehaviors.java +++ b/src/main/java/carpetextra/dispenser/CarpetExtraDispenserBehaviors.java @@ -22,85 +22,85 @@ import carpetextra.dispenser.behaviors.TillSoilDispenserBehavior; import carpetextra.dispenser.behaviors.ToggleBlockDispenserBehavior; import carpetextra.helpers.FlowerPotHelper; -import net.minecraft.block.AbstractCauldronBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.FlowerPotBlock; -import net.minecraft.block.dispenser.DispenserBehavior; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.CowEntity; -import net.minecraft.entity.passive.GoatEntity; -import net.minecraft.entity.passive.MooshroomEntity; -import net.minecraft.item.AxeItem; -import net.minecraft.item.BoatItem; -import net.minecraft.item.HoeItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.item.ShearsItem; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.registry.tag.ItemTags; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.DispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.cow.Cow; +import net.minecraft.world.entity.animal.cow.MushroomCow; +import net.minecraft.world.entity.animal.goat.Goat; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.item.BoatItem; +import net.minecraft.world.item.HoeItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.ShearsItem; +import net.minecraft.world.level.block.AbstractCauldronBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.FlowerPotBlock; +import net.minecraft.world.level.block.entity.DispenserBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; public class CarpetExtraDispenserBehaviors { // instances of custom dispenser behaviors // blazeMeal - public static final DispenserBehavior BLAZE_MEAL = new BlazePowderDispenserBehavior(); + public static final DispenseItemBehavior BLAZE_MEAL = new BlazePowderDispenserBehavior(); // chickenShearing - public static final DispenserBehavior SHEAR_CHICKEN = new ShearChickenDispenserBehavior(); + public static final DispenseItemBehavior SHEAR_CHICKEN = new ShearChickenDispenserBehavior(); // dispensersCarvePumpkins - public static final DispenserBehavior CARVE_PUMPKIN = new CarvePumpkinDispenserBehavior(); + public static final DispenseItemBehavior CARVE_PUMPKIN = new CarvePumpkinDispenserBehavior(); // dispensersFeedAnimals - public static final DispenserBehavior FEED_ANIMAL = new FeedAnimalDispenserBehavior(); - public static final DispenserBehavior FEED_MOOSHROOM = new FeedMooshroomDispenserBehavior(); + public static final DispenseItemBehavior FEED_ANIMAL = new FeedAnimalDispenserBehavior(); + public static final DispenseItemBehavior FEED_MOOSHROOM = new FeedMooshroomDispenserBehavior(); // dispensersFillMinecarts - public static final DispenserBehavior FILL_MINECART_CHEST = new FillMinecartDispenserBehavior(EntityType.CHEST_MINECART); - public static final DispenserBehavior FILL_MINECART_FURNACE = new FillMinecartDispenserBehavior(EntityType.FURNACE_MINECART); - public static final DispenserBehavior FILL_MINECART_TNT = new FillMinecartDispenserBehavior(EntityType.TNT_MINECART); - public static final DispenserBehavior FILL_MINECART_HOPPER = new FillMinecartDispenserBehavior(EntityType.HOPPER_MINECART); + public static final DispenseItemBehavior FILL_MINECART_CHEST = new FillMinecartDispenserBehavior(EntityType.CHEST_MINECART); + public static final DispenseItemBehavior FILL_MINECART_FURNACE = new FillMinecartDispenserBehavior(EntityType.FURNACE_MINECART); + public static final DispenseItemBehavior FILL_MINECART_TNT = new FillMinecartDispenserBehavior(EntityType.TNT_MINECART); + public static final DispenseItemBehavior FILL_MINECART_HOPPER = new FillMinecartDispenserBehavior(EntityType.HOPPER_MINECART); // dispensersMilkAnimals - public static final DispenserBehavior MILK_ANIMAL = new MilkAnimalDispenserBehavior(); - public static final DispenserBehavior MILK_MOOSHROOM = new MilkMooshroomDispenserBehavior(); + public static final DispenseItemBehavior MILK_ANIMAL = new MilkAnimalDispenserBehavior(); + public static final DispenseItemBehavior MILK_MOOSHROOM = new MilkMooshroomDispenserBehavior(); // dispensersPotPlants - public static final DispenserBehavior FILL_FLOWER_POT = new FlowerPotDispenserBehavior(); + public static final DispenseItemBehavior FILL_FLOWER_POT = new FlowerPotDispenserBehavior(); // dispensersStripBlocks - public static final DispenserBehavior STRIP_BLOCK = new StripBlocksDispenserBehavior(); + public static final DispenseItemBehavior STRIP_BLOCK = new StripBlocksDispenserBehavior(); // dispensersTillSoil - public static final DispenserBehavior TILL_SOIL = new TillSoilDispenserBehavior(); + public static final DispenseItemBehavior TILL_SOIL = new TillSoilDispenserBehavior(); // dispensersToggleThings - public static final DispenserBehavior TOGGLE_BLOCK = new ToggleBlockDispenserBehavior(); + public static final DispenseItemBehavior TOGGLE_BLOCK = new ToggleBlockDispenserBehavior(); // dispensersUseCauldrons - public static final DispenserBehavior CAULDRON_FILLING_BUCKET = new CauldronFillingDispenserBehavior(); - public static final DispenserBehavior CAULDRON_EMPTYING_BUCKET = new CauldronEmptyingDispenserBehavior(); - public static final DispenserBehavior CAULDRON_WATER = new CauldronWaterDispenserBehavior(); + public static final DispenseItemBehavior CAULDRON_FILLING_BUCKET = new CauldronFillingDispenserBehavior(); + public static final DispenseItemBehavior CAULDRON_EMPTYING_BUCKET = new CauldronEmptyingDispenserBehavior(); + public static final DispenseItemBehavior CAULDRON_WATER = new CauldronWaterDispenserBehavior(); // renewableEndstone - public static final DispenserBehavior DRAGON_BREATH_ENDSTONE = new DragonBreathDispenserBehavior(); + public static final DispenseItemBehavior DRAGON_BREATH_ENDSTONE = new DragonBreathDispenserBehavior(); // renewableNetherrack - public static final DispenserBehavior FIRE_CHARGE_NETHERRACK = new FireChargeDispenserBehavior(); + public static final DispenseItemBehavior FIRE_CHARGE_NETHERRACK = new FireChargeDispenserBehavior(); // dispensersPlaceBoatsOnIce - public static final DispenserBehavior PLACE_BOAT_ON_ICE = new PlaceBoatOnIceDispenserBehavior(); + public static final DispenseItemBehavior PLACE_BOAT_ON_ICE = new PlaceBoatOnIceDispenserBehavior(); // get custom dispenser behavior // this checks conditions such as the item and certain block or entity being in front of the dispenser to decide which rule to return // if the conditions for the rule match, it returns the instance of the dispenser behavior // returns null to fallback to vanilla (or another mod's) behavior for the given item - public static DispenserBehavior getCustomDispenserBehavior(ServerWorld world, BlockPos pos, BlockPointer pointer, DispenserBlockEntity dispenserBlockEntity, ItemStack stack, Map VANILLA_BEHAVIORS) { + public static DispenseItemBehavior getCustomDispenserBehavior(ServerLevel world, BlockPos pos, BlockSource pointer, DispenserBlockEntity dispenserBlockEntity, ItemStack stack, Map VANILLA_BEHAVIORS) { Item item = stack.getItem(); - Direction dispenserFacing = pointer.state().get(DispenserBlock.FACING); - BlockPos frontBlockPos = pos.offset(dispenserFacing); + Direction dispenserFacing = pointer.state().getValue(DispenserBlock.FACING); + BlockPos frontBlockPos = pos.relative(dispenserFacing); BlockState frontBlockState = world.getBlockState(frontBlockPos); Block frontBlock = frontBlockState.getBlock(); - Box frontBlockBox = new Box(frontBlockPos); + AABB frontBlockBox = new AABB(frontBlockPos); // blazeMeal if(CarpetExtraSettings.blazeMeal && item == Items.BLAZE_POWDER && frontBlock == Blocks.NETHER_WART) { @@ -109,8 +109,8 @@ public static DispenserBehavior getCustomDispenserBehavior(ServerWorld world, Bl // chickenShearing if(CarpetExtraSettings.chickenShearing && item == Items.SHEARS) { - boolean hasShearableChickens = !world.getEntitiesByType(EntityType.CHICKEN, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((chickenEntity) -> - !((AnimalEntity) chickenEntity).isBaby())).isEmpty(); + boolean hasShearableChickens = !world.getEntities(EntityType.CHICKEN, frontBlockBox, EntitySelector.LIVING_ENTITY_STILL_ALIVE.and((chickenEntity) -> + !((Animal) chickenEntity).isBaby())).isEmpty(); if(hasShearableChickens) { return SHEAR_CHICKEN; @@ -125,19 +125,19 @@ public static DispenserBehavior getCustomDispenserBehavior(ServerWorld world, Bl // dispensersFeedAnimals if(CarpetExtraSettings.dispensersFeedAnimals) { // check for animals that can be bred with the current item being dispensed in front of dispenser - boolean hasFeedableAnimals = !world.getEntitiesByClass(AnimalEntity.class, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((animalEntity) -> - ((AnimalEntity) animalEntity).isBreedingItem(stack))).isEmpty(); + boolean hasFeedableAnimals = !world.getEntitiesOfClass(Animal.class, frontBlockBox, EntitySelector.LIVING_ENTITY_STILL_ALIVE.and((animalEntity) -> + ((Animal) animalEntity).isFood(stack))).isEmpty(); if(hasFeedableAnimals) { return FEED_ANIMAL; } // get brown mooshrooms in front of dispenser - boolean hasFeedableMooshrooms = !world.getEntitiesByType(EntityType.MOOSHROOM, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((mooshroomEntity) -> - ((MooshroomEntity) mooshroomEntity).getVariant() == MooshroomEntity.Variant.BROWN)).isEmpty(); + boolean hasFeedableMooshrooms = !world.getEntities(EntityType.MOOSHROOM, frontBlockBox, EntitySelector.LIVING_ENTITY_STILL_ALIVE.and((mooshroomEntity) -> + ((MushroomCow) mooshroomEntity).getVariant() == MushroomCow.Variant.BROWN)).isEmpty(); // check if item is a small flower - if(hasFeedableMooshrooms && stack.isIn(ItemTags.SMALL_FLOWERS)) { + if(hasFeedableMooshrooms && stack.is(ItemTags.SMALL_FLOWERS)) { return FEED_MOOSHROOM; } } @@ -145,7 +145,7 @@ public static DispenserBehavior getCustomDispenserBehavior(ServerWorld world, Bl // dispensersFillMinecarts if(CarpetExtraSettings.dispensersFillMinecarts) { // check for minecarts with no riders in front of dispenser - boolean hasMinecarts = !world.getEntitiesByType(EntityType.MINECART, frontBlockBox, EntityPredicates.NOT_MOUNTED).isEmpty(); + boolean hasMinecarts = !world.getEntities(EntityType.MINECART, frontBlockBox, EntitySelector.ENTITY_NOT_BEING_RIDDEN).isEmpty(); // if a minecart exist, return dispenser behavior according to item type if(hasMinecarts) { @@ -169,8 +169,8 @@ else if(item == Items.HOPPER) { // bucket to milk if(item == Items.BUCKET) { // check for cows, mooshrooms, or goats in front of dispenser - boolean hasMilkable = !world.getEntitiesByClass(AnimalEntity.class, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((animalEntity) -> - animalEntity instanceof CowEntity || animalEntity instanceof GoatEntity)).isEmpty(); + boolean hasMilkable = !world.getEntitiesOfClass(Animal.class, frontBlockBox, EntitySelector.LIVING_ENTITY_STILL_ALIVE.and((animalEntity) -> + animalEntity instanceof Cow || animalEntity instanceof Goat)).isEmpty(); if(hasMilkable) { return MILK_ANIMAL; @@ -179,7 +179,7 @@ else if(item == Items.HOPPER) { // bowl to stew else if(item == Items.BOWL) { // check for mooshrooms in front of dispenser - boolean hasMooshroom = !world.getEntitiesByType(EntityType.MOOSHROOM, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY).isEmpty(); + boolean hasMooshroom = !world.getEntities(EntityType.MOOSHROOM, frontBlockBox, EntitySelector.LIVING_ENTITY_STILL_ALIVE).isEmpty(); if(hasMooshroom) { return MILK_MOOSHROOM; @@ -201,7 +201,7 @@ else if(item == Items.BOWL) { if(CarpetExtraSettings.dispensersTillSoil && item instanceof HoeItem) { // check block in front of dispenser and one block down for(int i = 0; i < 2; i++) { - BlockPos hoeBlockPos = frontBlockPos.down(i); + BlockPos hoeBlockPos = frontBlockPos.below(i); Block hoeBlock = world.getBlockState(hoeBlockPos).getBlock(); // check if block is in tilled blocks, or is farmland (to prevent hoe being dispensed when you don't want it to) @@ -244,8 +244,8 @@ else if(CauldronWaterDispenserBehavior.isWaterCauldronItem(stack)) { // dispensersPlaceBoatsOnIce if (CarpetExtraSettings.dispensersPlaceBoatsOnIce && item instanceof BoatItem && frontBlock == Blocks.AIR) { - BlockPos blockBelowFrontBlockPos = frontBlockPos.down(); - if (world.getBlockState(blockBelowFrontBlockPos).isIn(BlockTags.ICE)) { + BlockPos blockBelowFrontBlockPos = frontBlockPos.below(); + if (world.getBlockState(blockBelowFrontBlockPos).is(BlockTags.ICE)) { return PLACE_BOAT_ON_ICE; } } diff --git a/src/main/java/carpetextra/dispenser/DispenserBehaviorHelper.java b/src/main/java/carpetextra/dispenser/DispenserBehaviorHelper.java index 3f9cea46..f8427f62 100644 --- a/src/main/java/carpetextra/dispenser/DispenserBehaviorHelper.java +++ b/src/main/java/carpetextra/dispenser/DispenserBehaviorHelper.java @@ -1,23 +1,23 @@ package carpetextra.dispenser; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPointer; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.world.item.ItemStack; -public abstract class DispenserBehaviorHelper extends FallibleItemDispenserBehavior { +public abstract class DispenserBehaviorHelper extends OptionalDispenseItemBehavior { // adds new stack to dispenser inventory or dispenses if inventory is full - protected ItemStack addOrDispense(BlockPointer pointer, ItemStack originalStack, ItemStack newStack) { + protected ItemStack addOrDispense(BlockSource pointer, ItemStack originalStack, ItemStack newStack) { // removes item from original stack - originalStack.decrement(1); + originalStack.shrink(1); // check if original is now empty, if so return new stack in its place if (originalStack.isEmpty()) { return newStack; } // try to add new stack to inventory, if it can't be added, dispense - if (!pointer.blockEntity().addToFirstFreeSlot(newStack).isEmpty()) { + if (!pointer.blockEntity().insertItem(newStack).isEmpty()) { // if the newStack still contains items, then the addToFirstFreeSlot() // did not drain the stack fully -> there are items left to be dispensed - super.dispenseSilently(pointer, newStack); + super.execute(pointer, newStack); } return originalStack; } diff --git a/src/main/java/carpetextra/dispenser/DispenserEvent.java b/src/main/java/carpetextra/dispenser/DispenserEvent.java index 8d6784ee..2f1db2c9 100644 --- a/src/main/java/carpetextra/dispenser/DispenserEvent.java +++ b/src/main/java/carpetextra/dispenser/DispenserEvent.java @@ -6,11 +6,11 @@ import carpet.script.value.StringValue; import carpet.script.value.Value; import carpet.script.value.ValueConversions; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.DispenserBehavior; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.DispenseItemBehavior; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.DispenserBlock; public class DispenserEvent extends Event { private static final DispenserEvent INSTANCE = new DispenserEvent(); @@ -19,15 +19,16 @@ private DispenserEvent() { super("extra_dispenser_action", 5, true); } - public static void call(BlockPointer pointer, DispenserBehavior name, BlockPos pos, Value item, ItemStack resultItem) { + @SuppressWarnings("resource") + public static void call(BlockSource pointer, DispenseItemBehavior name, BlockPos pos, Value item, ItemStack resultItem) { INSTANCE.handler.call(() -> List.of( new StringValue(getScarpetName(name.getClass().getSimpleName())), ValueConversions.of(pos), - new StringValue(pointer.state().get(DispenserBlock.FACING).name().toLowerCase()), + new StringValue(pointer.state().getValue(DispenserBlock.FACING).name().toLowerCase()), item, // value directly because it needs to be a snapshot, stack is mutable - ValueConversions.of(resultItem, pointer.world().getRegistryManager()) + ValueConversions.of(resultItem, pointer.level().registryAccess()) ), - () -> pointer.world().getServer().getCommandSource().withWorld(pointer.world()) + () -> pointer.level().getServer().createCommandSourceStack().withLevel(pointer.level()) ); } diff --git a/src/main/java/carpetextra/dispenser/DispenserItemUsageContext.java b/src/main/java/carpetextra/dispenser/DispenserItemUsageContext.java index 142fb91e..5877b560 100644 --- a/src/main/java/carpetextra/dispenser/DispenserItemUsageContext.java +++ b/src/main/java/carpetextra/dispenser/DispenserItemUsageContext.java @@ -1,13 +1,13 @@ package carpetextra.dispenser; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.world.World; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; -public class DispenserItemUsageContext extends ItemUsageContext { - public DispenserItemUsageContext(World world, ItemStack stack, BlockHitResult hit) { - super(world, null, Hand.MAIN_HAND, stack, hit); +public class DispenserItemUsageContext extends UseOnContext { + public DispenserItemUsageContext(Level world, ItemStack stack, BlockHitResult hit) { + super(world, null, InteractionHand.MAIN_HAND, stack, hit); } } diff --git a/src/main/java/carpetextra/dispenser/behaviors/BlazePowderDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/BlazePowderDispenserBehavior.java index f53b7120..9e547f45 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/BlazePowderDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/BlazePowderDispenserBehavior.java @@ -1,36 +1,37 @@ package carpetextra.dispenser.behaviors; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.NetherWartBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldEvents; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.LevelEvent; +import net.minecraft.world.level.block.NetherWartBlock; +import net.minecraft.world.level.block.state.BlockState; -public class BlazePowderDispenserBehavior extends FallibleItemDispenserBehavior { +public class BlazePowderDispenserBehavior extends OptionalDispenseItemBehavior { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + @SuppressWarnings("resource") + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); BlockState frontBlockState = world.getBlockState(frontBlockPos); Block frontBlock = frontBlockState.getBlock(); if(frontBlock == Blocks.NETHER_WART) { - int age = frontBlockState.get(NetherWartBlock.AGE); + int age = frontBlockState.getValue(NetherWartBlock.AGE); if(age < 3) { // grow netherwart one stage - world.setBlockState(frontBlockPos, frontBlockState.with(NetherWartBlock.AGE, age + 1), Block.NOTIFY_LISTENERS); + world.setBlock(frontBlockPos, frontBlockState.setValue(NetherWartBlock.AGE, age + 1), Block.UPDATE_CLIENTS); // green sparkles - world.syncWorldEvent(WorldEvents.BONE_MEAL_USED, frontBlockPos, 0); + world.levelEvent(LevelEvent.PARTICLES_AND_SOUND_PLANT_GROWTH, frontBlockPos, 0); // decrement item and return - stack.decrement(1); + stack.shrink(1); return stack; } } diff --git a/src/main/java/carpetextra/dispenser/behaviors/CarvePumpkinDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/CarvePumpkinDispenserBehavior.java index b0df0885..3ff1f3af 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/CarvePumpkinDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/CarvePumpkinDispenserBehavior.java @@ -1,47 +1,47 @@ package carpetextra.dispenser.behaviors; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.CarvedPumpkinBlock; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.event.GameEvent; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.CarvedPumpkinBlock; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; -public class CarvePumpkinDispenserBehavior extends FallibleItemDispenserBehavior { +public class CarvePumpkinDispenserBehavior extends OptionalDispenseItemBehavior { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - Direction dispenserFacing = pointer.state().get(DispenserBlock.FACING); - BlockPos frontBlockPos = pointer.pos().offset(dispenserFacing); + ServerLevel world = pointer.level(); + Direction dispenserFacing = pointer.state().getValue(DispenserBlock.FACING); + BlockPos frontBlockPos = pointer.pos().relative(dispenserFacing); BlockState frontBlockState = world.getBlockState(frontBlockPos); Block frontBlock = frontBlockState.getBlock(); // check if uncarved pumpkin if(frontBlock == Blocks.PUMPKIN) { // set direction of carved pumpkin if dispenser is facing horizontal, otherwise use default - BlockState pumpkinState = Blocks.CARVED_PUMPKIN.getDefaultState(); + BlockState pumpkinState = Blocks.CARVED_PUMPKIN.defaultBlockState(); if(dispenserFacing.getAxis().isHorizontal()) { - pumpkinState = pumpkinState.with(CarvedPumpkinBlock.FACING, dispenserFacing.getOpposite()); + pumpkinState = pumpkinState.setValue(CarvedPumpkinBlock.FACING, dispenserFacing.getOpposite()); } // set pumpkin, play carve sound, drop pumpkin seeds, emit game event - world.setBlockState(frontBlockPos, pumpkinState); - world.playSound(null, frontBlockPos, SoundEvents.BLOCK_PUMPKIN_CARVE, SoundCategory.BLOCKS, 1.0F, 1.0F); - Block.dropStack(world, frontBlockPos, new ItemStack(Items.PUMPKIN_SEEDS, 4)); - world.emitGameEvent(null, GameEvent.SHEAR, frontBlockPos); + world.setBlockAndUpdate(frontBlockPos, pumpkinState); + world.playSound(null, frontBlockPos, SoundEvents.PUMPKIN_CARVE, SoundSource.BLOCKS, 1.0F, 1.0F); + Block.popResource(world, frontBlockPos, new ItemStack(Items.PUMPKIN_SEEDS, 4)); + world.gameEvent(null, GameEvent.SHEAR, frontBlockPos); // damage shears, remove if broken - stack.damage(1, world, null, (item) -> stack.setCount(0)); + stack.hurtAndBreak(1, world, null, (item) -> stack.setCount(0)); return stack; } diff --git a/src/main/java/carpetextra/dispenser/behaviors/CauldronEmptyingDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/CauldronEmptyingDispenserBehavior.java index 2216dc42..44459a6f 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/CauldronEmptyingDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/CauldronEmptyingDispenserBehavior.java @@ -1,27 +1,27 @@ package carpetextra.dispenser.behaviors; import carpetextra.dispenser.DispenserBehaviorHelper; -import net.minecraft.block.AbstractCauldronBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.event.GameEvent; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.AbstractCauldronBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; public class CauldronEmptyingDispenserBehavior extends DispenserBehaviorHelper { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); BlockState frontBlockState = world.getBlockState(frontBlockPos); Block frontBlock = frontBlockState.getBlock(); @@ -29,17 +29,17 @@ protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { if(frontBlock instanceof AbstractCauldronBlock && ((AbstractCauldronBlock) frontBlock).isFull(frontBlockState)) { // lava if(frontBlock == Blocks.LAVA_CAULDRON) { - setCauldron(world, frontBlockPos, SoundEvents.ITEM_BUCKET_FILL_LAVA); + setCauldron(world, frontBlockPos, SoundEvents.BUCKET_FILL_LAVA); return this.addOrDispense(pointer, stack, new ItemStack(Items.LAVA_BUCKET)); } // water else if(frontBlock == Blocks.WATER_CAULDRON) { - setCauldron(world, frontBlockPos, SoundEvents.ITEM_BUCKET_FILL); + setCauldron(world, frontBlockPos, SoundEvents.BUCKET_FILL); return this.addOrDispense(pointer, stack, new ItemStack(Items.WATER_BUCKET)); } // powder snow else if(frontBlock == Blocks.POWDER_SNOW_CAULDRON) { - setCauldron(world, frontBlockPos, SoundEvents.ITEM_BUCKET_FILL_POWDER_SNOW); + setCauldron(world, frontBlockPos, SoundEvents.BUCKET_FILL_POWDER_SNOW); return this.addOrDispense(pointer, stack, new ItemStack(Items.POWDER_SNOW_BUCKET)); } } @@ -50,9 +50,9 @@ else if(frontBlock == Blocks.POWDER_SNOW_CAULDRON) { } // set cauldron, play sound, emit game event - private static void setCauldron(ServerWorld world, BlockPos pos, SoundEvent soundEvent) { - world.setBlockState(pos, Blocks.CAULDRON.getDefaultState()); - world.playSound(null, pos, soundEvent, SoundCategory.BLOCKS, 1.0F, 1.0F); - world.emitGameEvent(null, GameEvent.FLUID_PICKUP, pos); + private static void setCauldron(ServerLevel world, BlockPos pos, SoundEvent soundEvent) { + world.setBlockAndUpdate(pos, Blocks.CAULDRON.defaultBlockState()); + world.playSound(null, pos, soundEvent, SoundSource.BLOCKS, 1.0F, 1.0F); + world.gameEvent(null, GameEvent.FLUID_PICKUP, pos); } } diff --git a/src/main/java/carpetextra/dispenser/behaviors/CauldronFillingDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/CauldronFillingDispenserBehavior.java index 18b11568..1e4b23c1 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/CauldronFillingDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/CauldronFillingDispenserBehavior.java @@ -1,50 +1,50 @@ package carpetextra.dispenser.behaviors; -import net.minecraft.block.AbstractCauldronBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.LeveledCauldronBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.event.GameEvent; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.AbstractCauldronBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.LayeredCauldronBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; -public class CauldronFillingDispenserBehavior extends FallibleItemDispenserBehavior { +public class CauldronFillingDispenserBehavior extends OptionalDispenseItemBehavior { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); Item item = stack.getItem(); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); BlockState frontBlockState = world.getBlockState(frontBlockPos); Block frontBlock = frontBlockState.getBlock(); if(frontBlock instanceof AbstractCauldronBlock) { // lava if(item == Items.LAVA_BUCKET) { - BlockState cauldronState = Blocks.LAVA_CAULDRON.getDefaultState(); - setCauldron(world, frontBlockPos, cauldronState, SoundEvents.ITEM_BUCKET_EMPTY_LAVA); + BlockState cauldronState = Blocks.LAVA_CAULDRON.defaultBlockState(); + setCauldron(world, frontBlockPos, cauldronState, SoundEvents.BUCKET_EMPTY_LAVA); return new ItemStack(Items.BUCKET); } // water else if(item == Items.WATER_BUCKET) { - BlockState cauldronState = Blocks.WATER_CAULDRON.getDefaultState().with(LeveledCauldronBlock.LEVEL, 3); - setCauldron(world, frontBlockPos, cauldronState, SoundEvents.ITEM_BUCKET_EMPTY); + BlockState cauldronState = Blocks.WATER_CAULDRON.defaultBlockState().setValue(LayeredCauldronBlock.LEVEL, 3); + setCauldron(world, frontBlockPos, cauldronState, SoundEvents.BUCKET_EMPTY); return new ItemStack(Items.BUCKET); } // powder snow else if(item == Items.POWDER_SNOW_BUCKET) { - BlockState cauldronState = Blocks.POWDER_SNOW_CAULDRON.getDefaultState().with(LeveledCauldronBlock.LEVEL, 3); - setCauldron(world, frontBlockPos, cauldronState, SoundEvents.ITEM_BUCKET_EMPTY_POWDER_SNOW); + BlockState cauldronState = Blocks.POWDER_SNOW_CAULDRON.defaultBlockState().setValue(LayeredCauldronBlock.LEVEL, 3); + setCauldron(world, frontBlockPos, cauldronState, SoundEvents.BUCKET_EMPTY_POWDER_SNOW); return new ItemStack(Items.BUCKET); } } @@ -55,9 +55,9 @@ else if(item == Items.POWDER_SNOW_BUCKET) { } // set cauldron, play sound, emit game event - private static void setCauldron(ServerWorld world, BlockPos pos, BlockState state, SoundEvent soundEvent) { - world.setBlockState(pos, state); - world.playSound(null, pos, soundEvent, SoundCategory.BLOCKS, 1.0F, 1.0F); - world.emitGameEvent(null, GameEvent.FLUID_PLACE, pos); + private static void setCauldron(ServerLevel world, BlockPos pos, BlockState state, SoundEvent soundEvent) { + world.setBlockAndUpdate(pos, state); + world.playSound(null, pos, soundEvent, SoundSource.BLOCKS, 1.0F, 1.0F); + world.gameEvent(null, GameEvent.FLUID_PLACE, pos); } } diff --git a/src/main/java/carpetextra/dispenser/behaviors/CauldronWaterDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/CauldronWaterDispenserBehavior.java index 6011c2ee..6148dc6e 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/CauldronWaterDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/CauldronWaterDispenserBehavior.java @@ -1,38 +1,38 @@ package carpetextra.dispenser.behaviors; import carpetextra.dispenser.DispenserBehaviorHelper; -import net.minecraft.block.AbstractCauldronBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.LeveledCauldronBlock; -import net.minecraft.block.ShulkerBoxBlock; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.BannerPatternsComponent; -import net.minecraft.component.type.PotionContentsComponent; -import net.minecraft.item.BannerItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.potion.Potions; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.registry.tag.ItemTags; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.event.GameEvent; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.item.BannerItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.block.AbstractCauldronBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.LayeredCauldronBlock; +import net.minecraft.world.level.block.ShulkerBoxBlock; +import net.minecraft.world.level.block.entity.BannerPatternLayers; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; public class CauldronWaterDispenserBehavior extends DispenserBehaviorHelper { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); Item item = stack.getItem(); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); BlockState frontBlockState = world.getBlockState(frontBlockPos); Block frontBlock = frontBlockState.getBlock(); @@ -41,9 +41,9 @@ protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { // check if cauldron is not full if (!((AbstractCauldronBlock) frontBlock).isFull(frontBlockState)) { // increase cauldron level - int level = frontBlockState.get(LeveledCauldronBlock.LEVEL); - BlockState cauldronState = frontBlockState.with(LeveledCauldronBlock.LEVEL, level + 1); - setCauldron(world, frontBlockPos, cauldronState, SoundEvents.ITEM_BOTTLE_EMPTY, GameEvent.FLUID_PLACE); + int level = frontBlockState.getValue(LayeredCauldronBlock.LEVEL); + BlockState cauldronState = frontBlockState.setValue(LayeredCauldronBlock.LEVEL, level + 1); + setCauldron(world, frontBlockPos, cauldronState, SoundEvents.BOTTLE_EMPTY, GameEvent.FLUID_PLACE); // return glass bottle return this.addOrDispense(pointer, stack, new ItemStack(Items.GLASS_BOTTLE)); @@ -51,44 +51,44 @@ protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { } else if (item == Items.GLASS_BOTTLE) { // decrease cauldron level - LeveledCauldronBlock.decrementFluidLevel(frontBlockState, world, frontBlockPos); + LayeredCauldronBlock.lowerFillLevel(frontBlockState, world, frontBlockPos); // return water bottle - return this.addOrDispense(pointer, stack, PotionContentsComponent.createStack(Items.POTION, Potions.WATER)); + return this.addOrDispense(pointer, stack, PotionContents.createItemStack(Items.POTION, Potions.WATER)); } - else if (Block.getBlockFromItem(item) instanceof ShulkerBoxBlock) { + else if (Block.byItem(item) instanceof ShulkerBoxBlock) { // make sure item isn't plain shulker box if (item != Items.SHULKER_BOX) { // decrease cauldron level - LeveledCauldronBlock.decrementFluidLevel(frontBlockState, world, frontBlockPos); + LayeredCauldronBlock.lowerFillLevel(frontBlockState, world, frontBlockPos); // turn dyed shulker box into undyed shulker box - ItemStack undyedShulkerBox = stack.copyComponentsToNewStack(Blocks.SHULKER_BOX, 1); + ItemStack undyedShulkerBox = stack.transmuteCopy(Blocks.SHULKER_BOX, 1); // return undyed shulker box return this.addOrDispense(pointer, stack, undyedShulkerBox); } } - if (stack.isIn(ItemTags.DYEABLE)) { + if (stack.is(ItemTags.DYEABLE)) { // check if dyeable item has color - if (stack.contains(DataComponentTypes.DYED_COLOR)) { + if (stack.has(DataComponents.DYED_COLOR)) { // decrease cauldron level - LeveledCauldronBlock.decrementFluidLevel(frontBlockState, world, frontBlockPos); + LayeredCauldronBlock.lowerFillLevel(frontBlockState, world, frontBlockPos); // remove color - stack.remove(DataComponentTypes.DYED_COLOR); + stack.remove(DataComponents.DYED_COLOR); // return undyed item return stack; } } else if (item instanceof BannerItem) { // check if banner has layers (https://minecraft.wiki/w/Banner#Patterns) - BannerPatternsComponent bannerPatterns = stack.getOrDefault(DataComponentTypes.BANNER_PATTERNS, BannerPatternsComponent.DEFAULT); + BannerPatternLayers bannerPatterns = stack.getOrDefault(DataComponents.BANNER_PATTERNS, BannerPatternLayers.EMPTY); if (!bannerPatterns.layers().isEmpty()) { // decrease cauldron level - LeveledCauldronBlock.decrementFluidLevel(frontBlockState, world, frontBlockPos); + LayeredCauldronBlock.lowerFillLevel(frontBlockState, world, frontBlockPos); // copy banner stack, set to one item ItemStack cleanedBanner = stack.copy(); cleanedBanner.setCount(1); // remove layer from banner - cleanedBanner.set(DataComponentTypes.BANNER_PATTERNS, bannerPatterns.withoutTopLayer()); + cleanedBanner.set(DataComponents.BANNER_PATTERNS, bannerPatterns.removeLast()); // return cleaned banner return this.addOrDispense(pointer, stack, cleanedBanner); } @@ -96,8 +96,8 @@ else if (item instanceof BannerItem) { } else if (frontBlock == Blocks.CAULDRON && isWaterBottle(stack)) { // increase cauldron level - BlockState cauldronState = Blocks.WATER_CAULDRON.getDefaultState(); - setCauldron(world, frontBlockPos, cauldronState, SoundEvents.ITEM_BOTTLE_EMPTY, GameEvent.FLUID_PLACE); + BlockState cauldronState = Blocks.WATER_CAULDRON.defaultBlockState(); + setCauldron(world, frontBlockPos, cauldronState, SoundEvents.BOTTLE_EMPTY, GameEvent.FLUID_PLACE); // return glass bottle return this.addOrDispense(pointer, stack, new ItemStack(Items.GLASS_BOTTLE)); @@ -109,10 +109,10 @@ else if (frontBlock == Blocks.CAULDRON && isWaterBottle(stack)) { } // set cauldron, play sound, emit game event - private static void setCauldron(ServerWorld world, BlockPos pos, BlockState state, SoundEvent soundEvent, RegistryEntry.Reference gameEvent) { - world.setBlockState(pos, state); - world.playSound(null, pos, soundEvent, SoundCategory.BLOCKS, 1.0F, 1.0F); - world.emitGameEvent(null, gameEvent, pos); + private static void setCauldron(ServerLevel world, BlockPos pos, BlockState state, SoundEvent soundEvent, Holder.Reference gameEvent) { + world.setBlockAndUpdate(pos, state); + world.playSound(null, pos, soundEvent, SoundSource.BLOCKS, 1.0F, 1.0F); + world.gameEvent(null, gameEvent, pos); } private static boolean isWaterBottle(ItemStack stack) { @@ -120,8 +120,8 @@ private static boolean isWaterBottle(ItemStack stack) { return false; } - PotionContentsComponent content = stack.get(DataComponentTypes.POTION_CONTENTS); - return content != null && content.matches(Potions.WATER); + PotionContents content = stack.get(DataComponents.POTION_CONTENTS); + return content != null && content.is(Potions.WATER); } public static boolean isWaterCauldronItem(ItemStack stack) { @@ -129,11 +129,11 @@ public static boolean isWaterCauldronItem(ItemStack stack) { Item item = stack.getItem(); if (item == Items.GLASS_BOTTLE || item instanceof BannerItem || isWaterBottle(stack)) return true; - if (Block.getBlockFromItem(item) instanceof ShulkerBoxBlock) { + if (Block.byItem(item) instanceof ShulkerBoxBlock) { return item != Items.SHULKER_BOX; // dyed Shulkers only } - if (stack.isIn(ItemTags.DYEABLE)) { - return stack.getComponents().contains(DataComponentTypes.DYED_COLOR); + if (stack.is(ItemTags.DYEABLE)) { + return stack.getComponents().has(DataComponents.DYED_COLOR); } return false; } diff --git a/src/main/java/carpetextra/dispenser/behaviors/DragonBreathDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/DragonBreathDispenserBehavior.java index d6bce16f..e66d18f3 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/DragonBreathDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/DragonBreathDispenserBehavior.java @@ -1,40 +1,41 @@ package carpetextra.dispenser.behaviors; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.DragonBreathParticleEffect; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.particles.PowerParticleOption; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.Vec3; -public class DragonBreathDispenserBehavior extends FallibleItemDispenserBehavior { +public class DragonBreathDispenserBehavior extends OptionalDispenseItemBehavior { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + @SuppressWarnings("resource") + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); Block frontBlock = world.getBlockState(frontBlockPos).getBlock(); // check if cobble, place end stone if(frontBlock == Blocks.COBBLESTONE) { - world.setBlockState(frontBlockPos, Blocks.END_STONE.getDefaultState()); + world.setBlockAndUpdate(frontBlockPos, Blocks.END_STONE.defaultBlockState()); // play dragon fireball shoot sound - world.playSound(null, frontBlockPos, SoundEvents.ENTITY_ENDER_DRAGON_SHOOT, SoundCategory.BLOCKS, 1.0F, (world.random.nextFloat() - world.random.nextFloat()) * 0.2F + 1.0F); + world.playSound(null, frontBlockPos, SoundEvents.ENDER_DRAGON_SHOOT, SoundSource.BLOCKS, 1.0F, (world.random.nextFloat() - world.random.nextFloat()) * 0.2F + 1.0F); // spawn some dragon breath particles around end stone - Vec3d center = Vec3d.ofCenter(frontBlockPos); - world.spawnParticles(DragonBreathParticleEffect.of(ParticleTypes.DRAGON_BREATH, 1), center.getX(), center.getY(), center.getZ(), 10, 0.5, 0.5, 0.5, 0.01); + Vec3 center = Vec3.atCenterOf(frontBlockPos); + world.sendParticles(PowerParticleOption.create(ParticleTypes.DRAGON_BREATH, 1), center.x(), center.y(), center.z(), 10, 0.5, 0.5, 0.5, 0.01); // decrement dragon breath and return - stack.decrement(1); + stack.shrink(1); return stack; } diff --git a/src/main/java/carpetextra/dispenser/behaviors/FeedAnimalDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/FeedAnimalDispenserBehavior.java index 5a474c9e..e7c441e1 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/FeedAnimalDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/FeedAnimalDispenserBehavior.java @@ -2,33 +2,34 @@ import java.util.List; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; - -public class FeedAnimalDispenserBehavior extends FallibleItemDispenserBehavior { +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.AABB; + +public class FeedAnimalDispenserBehavior extends OptionalDispenseItemBehavior { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + @SuppressWarnings("resource") + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); - Box frontBlockBox = new Box(frontBlockPos); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); + AABB frontBlockBox = new AABB(frontBlockPos); // get all animals in front of dispenser that are able to be fed current item and can breed or grow up - List animals = world.getEntitiesByClass(AnimalEntity.class, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((animalEntity) -> { - AnimalEntity animal = (AnimalEntity) animalEntity; - return animal.isBreedingItem(stack) && animal.getBreedingAge() <= 0 && animal.canEat(); + List animals = world.getEntitiesOfClass(Animal.class, frontBlockBox, EntitySelector.LIVING_ENTITY_STILL_ALIVE.and((animalEntity) -> { + Animal animal = (Animal) animalEntity; + return animal.isFood(stack) && animal.getAge() <= 0 && animal.canFallInLove(); })); if(!animals.isEmpty()) { @@ -43,14 +44,15 @@ protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { return stack; } - private static ItemStack tryFeed(List animals, ItemStack foodStack) { + @SuppressWarnings("resource") + private static ItemStack tryFeed(List animals, ItemStack foodStack) { // try to feed all adult animals first - for(AnimalEntity animal : animals) { + for(Animal animal : animals) { // check if breeding age is 0 (is adult and can breed) - if(animal.getBreedingAge() == 0) { + if(animal.getAge() == 0) { // check if animal can enter love mode with item if(canLoveWithItem(animal, foodStack)) { - animal.lovePlayer(null); + animal.setInLove(null); } // eat item @@ -58,12 +60,12 @@ private static ItemStack tryFeed(List animals, ItemStack foodStack } } // try to grow up baby animals next - for(AnimalEntity animal : animals) { + for(Animal animal : animals) { if(animal.isBaby()) { // grow up baby animal slightly - animal.growUp((int)(-animal.getBreedingAge() / 200), true); + animal.ageUp((int)(-animal.getAge() / 200), true); // spawn growth sparkle particle - animal.getEntityWorld().addParticleClient(ParticleTypes.HAPPY_VILLAGER, animal.getParticleX(1.0D), animal.getRandomBodyY() + 0.5D, animal.getParticleZ(1.0D), 0.0D, 0.0D, 0.0D); + animal.level().addParticle(ParticleTypes.HAPPY_VILLAGER, animal.getRandomX(1.0D), animal.getRandomY() + 0.5D, animal.getRandomZ(1.0D), 0.0D, 0.0D, 0.0D); // eat item return eatItem(animal, foodStack); @@ -76,7 +78,7 @@ private static ItemStack tryFeed(List animals, ItemStack foodStack // handles special cases for animals eating items // returns food item stack after being eaten - private static ItemStack eatItem(AnimalEntity animal, ItemStack foodStack) { + private static ItemStack eatItem(Animal animal, ItemStack foodStack) { EntityType type = animal.getType(); // axolotl returns water bucket if fed tropical fish bucket @@ -86,19 +88,19 @@ private static ItemStack eatItem(AnimalEntity animal, ItemStack foodStack) { // cats and foxes play a sound when being fed if(type == EntityType.CAT) { - animal.playSound(SoundEvents.ENTITY_CAT_EAT, 1.0F, 1.0F); + animal.playSound(SoundEvents.CAT_EAT, 1.0F, 1.0F); } else if(type == EntityType.FOX) { - animal.playSound(SoundEvents.ENTITY_FOX_EAT, 1.0F, 1.0F); + animal.playSound(SoundEvents.FOX_EAT, 1.0F, 1.0F); } // remove one item and return - foodStack.decrement(1); + foodStack.shrink(1); return foodStack; } // checks special cases if animal can enter love mode with item - private static boolean canLoveWithItem(AnimalEntity animal, ItemStack foodStack) { + private static boolean canLoveWithItem(Animal animal, ItemStack foodStack) { EntityType type = animal.getType(); Item item = foodStack.getItem(); diff --git a/src/main/java/carpetextra/dispenser/behaviors/FeedMooshroomDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/FeedMooshroomDispenserBehavior.java index 9e832ae4..1cf458e5 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/FeedMooshroomDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/FeedMooshroomDispenserBehavior.java @@ -3,48 +3,49 @@ import java.util.List; import java.util.Optional; -import net.minecraft.registry.tag.ItemTags; +import net.minecraft.tags.ItemTags; import carpetextra.mixins.MooshroomEntity_StatusEffectAccessorMixin; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.component.type.SuspiciousStewEffectsComponent; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.MooshroomEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.EffectParticleEffect; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.particles.SpellParticleOption; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.cow.MushroomCow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.SuspiciousStewEffects; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.AABB; -public class FeedMooshroomDispenserBehavior extends FallibleItemDispenserBehavior { +public class FeedMooshroomDispenserBehavior extends OptionalDispenseItemBehavior { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + @SuppressWarnings("resource") + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); // check if item is in SMALL_FLOWERS item tag - if(stack.isIn(ItemTags.SMALL_FLOWERS)) + if(stack.is(ItemTags.SMALL_FLOWERS)) { // get brown mooshrooms in front of dispenser - List mooshrooms = world.getEntitiesByType(EntityType.MOOSHROOM, new Box(frontBlockPos), EntityPredicates.VALID_LIVING_ENTITY.and((mooshroom) -> { - return ((MooshroomEntity) mooshroom).getVariant() == MooshroomEntity.Variant.BROWN; + List mooshrooms = world.getEntities(EntityType.MOOSHROOM, new AABB(frontBlockPos), EntitySelector.LIVING_ENTITY_STILL_ALIVE.and((mooshroom) -> { + return ((MushroomCow) mooshroom).getVariant() == MushroomCow.Variant.BROWN; })); // check all mooshrooms - for (MooshroomEntity mooshroom : mooshrooms) { + for (MushroomCow mooshroom : mooshrooms) { MooshroomEntity_StatusEffectAccessorMixin mooshroomAccessor = (MooshroomEntity_StatusEffectAccessorMixin) mooshroom; // check if mooshroom has no stew effect if (mooshroomAccessor.getStewEffects() == null) { // get stew effect and length for flower - Optional effect = mooshroomAccessor.invokeGetStewEffectFrom(stack); + Optional effect = mooshroomAccessor.invokeGetStewEffectFrom(stack); // check if effect is present if (effect.isPresent()) { @@ -53,13 +54,13 @@ protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { mooshroomAccessor.setStewEffects(effect.get()); // play sound effect and show particles - world.playSound(null, frontBlockPos, SoundEvents.ENTITY_MOOSHROOM_EAT, SoundCategory.NEUTRAL, 2.0F, 1.0F); - EffectParticleEffect effectParticleEffect = EffectParticleEffect.of(ParticleTypes.EFFECT, -1, 1.0F); + world.playSound(null, frontBlockPos, SoundEvents.MOOSHROOM_EAT, SoundSource.NEUTRAL, 2.0F, 1.0F); + SpellParticleOption effectParticleEffect = SpellParticleOption.create(ParticleTypes.EFFECT, -1, 1.0F); for (int j = 0; j < 4; j++) { - world.spawnParticles( + world.sendParticles( effectParticleEffect, mooshroom.getX() + mooshroom.getRandom().nextDouble() / 2.0, - mooshroom.getBodyY(0.5), + mooshroom.getY(0.5), mooshroom.getZ() + mooshroom.getRandom().nextDouble() / 2.0, 1, 0.0, @@ -70,7 +71,7 @@ protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { } // remove a flower and return stack - stack.decrement(1); + stack.shrink(1); return stack; } } diff --git a/src/main/java/carpetextra/dispenser/behaviors/FillMinecartDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/FillMinecartDispenserBehavior.java index 495afbee..42efa25e 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/FillMinecartDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/FillMinecartDispenserBehavior.java @@ -2,56 +2,56 @@ import java.util.List; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.entity.vehicle.MinecartEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; - -public class FillMinecartDispenserBehavior extends FallibleItemDispenserBehavior { - private final EntityType MINECART_TYPE; - - public FillMinecartDispenserBehavior(EntityType minecartType) { +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.EntitySpawnReason; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.minecart.AbstractMinecart; +import net.minecraft.world.entity.vehicle.minecart.Minecart; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.AABB; + +public class FillMinecartDispenserBehavior extends OptionalDispenseItemBehavior { + private final EntityType MINECART_TYPE; + + public FillMinecartDispenserBehavior(EntityType minecartType) { this.MINECART_TYPE = minecartType; } @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); - Box frontBlockBox = new Box(frontBlockPos); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); + AABB frontBlockBox = new AABB(frontBlockPos); // get non-mounted minecarts in front of dispenser - List minecarts = world.getEntitiesByType(EntityType.MINECART, frontBlockBox, EntityPredicates.NOT_MOUNTED); + List minecarts = world.getEntities(EntityType.MINECART, frontBlockBox, EntitySelector.ENTITY_NOT_BEING_RIDDEN); if(!minecarts.isEmpty()) { // choose a random minecart in front of dispenser to fill - MinecartEntity oldMinecart = minecarts.get(world.random.nextInt(minecarts.size())); - AbstractMinecartEntity newMinecart = AbstractMinecartEntity.create(world, oldMinecart.getX(), oldMinecart.getY(), oldMinecart.getZ(), this.MINECART_TYPE, SpawnReason.DISPENSER, ItemStack.EMPTY, null); + Minecart oldMinecart = minecarts.get(world.random.nextInt(minecarts.size())); + AbstractMinecart newMinecart = AbstractMinecart.createMinecart(world, oldMinecart.getX(), oldMinecart.getY(), oldMinecart.getZ(), this.MINECART_TYPE, EntitySpawnReason.DISPENSER, ItemStack.EMPTY, null); // Copy data from original minecart to new minecart // Possibly missing some things to copy here. Add more if needed - newMinecart.setVelocity(oldMinecart.getVelocity()); - newMinecart.setPitch(oldMinecart.getPitch()); - newMinecart.setYaw(oldMinecart.getYaw()); + newMinecart.setDeltaMovement(oldMinecart.getDeltaMovement()); + newMinecart.setXRot(oldMinecart.getXRot()); + newMinecart.setYRot(oldMinecart.getYRot()); newMinecart.setCustomName(oldMinecart.getCustomName()); - newMinecart.setFireTicks(oldMinecart.getFireTicks()); + newMinecart.setRemainingFireTicks(oldMinecart.getRemainingFireTicks()); // remove old minecart, spawn new minecart oldMinecart.discard(); - world.spawnEntity(newMinecart); + world.addFreshEntity(newMinecart); // decrement item and return - stack.decrement(1); + stack.shrink(1); return stack; } diff --git a/src/main/java/carpetextra/dispenser/behaviors/FireChargeDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/FireChargeDispenserBehavior.java index 77261dfe..b78c79ac 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/FireChargeDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/FireChargeDispenserBehavior.java @@ -1,39 +1,40 @@ package carpetextra.dispenser.behaviors; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.Vec3; -public class FireChargeDispenserBehavior extends FallibleItemDispenserBehavior { +public class FireChargeDispenserBehavior extends OptionalDispenseItemBehavior { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + @SuppressWarnings("resource") + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); Block frontBlock = world.getBlockState(frontBlockPos).getBlock(); // check if cobble, place netherrack if(frontBlock == Blocks.COBBLESTONE) { - world.setBlockState(frontBlockPos, Blocks.NETHERRACK.getDefaultState()); + world.setBlockAndUpdate(frontBlockPos, Blocks.NETHERRACK.defaultBlockState()); // play fire charge use sound - world.playSound(null, frontBlockPos, SoundEvents.ITEM_FIRECHARGE_USE, SoundCategory.BLOCKS, 1.0F, (world.random.nextFloat() - world.random.nextFloat()) * 0.2F + 1.0F); + world.playSound(null, frontBlockPos, SoundEvents.FIRECHARGE_USE, SoundSource.BLOCKS, 1.0F, (world.random.nextFloat() - world.random.nextFloat()) * 0.2F + 1.0F); // spawn some flame particles around netherrack - Vec3d center = Vec3d.ofCenter(frontBlockPos); - world.spawnParticles(ParticleTypes.FLAME, center.getX(), center.getY(), center.getZ(), 10, 0.5, 0.5, 0.5, 0.01); + Vec3 center = Vec3.atCenterOf(frontBlockPos); + world.sendParticles(ParticleTypes.FLAME, center.x(), center.y(), center.z(), 10, 0.5, 0.5, 0.5, 0.01); // decrement fire charge and return - stack.decrement(1); + stack.shrink(1); return stack; } diff --git a/src/main/java/carpetextra/dispenser/behaviors/FlowerPotDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/FlowerPotDispenserBehavior.java index 4b4f6a57..e02cd0bf 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/FlowerPotDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/FlowerPotDispenserBehavior.java @@ -1,41 +1,41 @@ package carpetextra.dispenser.behaviors; import carpetextra.helpers.FlowerPotHelper; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.FlowerPotBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.event.GameEvent; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.FlowerPotBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; -public class FlowerPotDispenserBehavior extends FallibleItemDispenserBehavior { +public class FlowerPotDispenserBehavior extends OptionalDispenseItemBehavior { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); Item item = stack.getItem(); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); BlockState frontBlockState = world.getBlockState(frontBlockPos); FlowerPotBlock frontBlock = (FlowerPotBlock) frontBlockState.getBlock(); // check if flower pot is empty - if(frontBlock.getContent() == Blocks.AIR && FlowerPotHelper.isPottable(item)) { + if(frontBlock.getPotted() == Blocks.AIR && FlowerPotHelper.isPottable(item)) { FlowerPotBlock pottedBlock = FlowerPotHelper.getPottedBlock(item); // place filled flower pot - world.setBlockState(frontBlockPos, pottedBlock.getDefaultState()); - world.emitGameEvent(null, GameEvent.BLOCK_CHANGE, frontBlockPos); + world.setBlockAndUpdate(frontBlockPos, pottedBlock.defaultBlockState()); + world.gameEvent(null, GameEvent.BLOCK_CHANGE, frontBlockPos); // check if flower pot should load chunk - FlowerPotHelper.updateLoadStatus(world, frontBlockPos, pottedBlock.getContent(), true); + FlowerPotHelper.updateLoadStatus(world, frontBlockPos, pottedBlock.getPotted(), true); // remove flower and return - stack.decrement(1); + stack.shrink(1); return stack; } diff --git a/src/main/java/carpetextra/dispenser/behaviors/MilkAnimalDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/MilkAnimalDispenserBehavior.java index 74c1c0c4..9879d6c4 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/MilkAnimalDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/MilkAnimalDispenserBehavior.java @@ -3,38 +3,39 @@ import java.util.List; import carpetextra.dispenser.DispenserBehaviorHelper; -import net.minecraft.block.DispenserBlock; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.CowEntity; -import net.minecraft.entity.passive.GoatEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.cow.Cow; +import net.minecraft.world.entity.animal.goat.Goat; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.AABB; public class MilkAnimalDispenserBehavior extends DispenserBehaviorHelper { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + @SuppressWarnings("resource") + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); // check if non-baby cows/mooshrooms/goats are in front of dispenser - List milkableAnimals = world.getEntitiesByClass(AnimalEntity.class, new Box(frontBlockPos), EntityPredicates.VALID_LIVING_ENTITY.and((animalEntity) -> { - return !((AnimalEntity) animalEntity).isBaby() && (animalEntity instanceof CowEntity || animalEntity instanceof GoatEntity); + List milkableAnimals = world.getEntitiesOfClass(Animal.class, new AABB(frontBlockPos), EntitySelector.LIVING_ENTITY_STILL_ALIVE.and((animalEntity) -> { + return !((Animal) animalEntity).isBaby() && (animalEntity instanceof Cow || animalEntity instanceof Goat); })); if(!milkableAnimals.isEmpty()) { // play milking sound for a random animal in front of dispenser - AnimalEntity milkAnimal = milkableAnimals.get(world.random.nextInt(milkableAnimals.size())); - world.playSound(null, frontBlockPos, getMilkSound(milkAnimal), SoundCategory.NEUTRAL, 1.0F, 1.0F); + Animal milkAnimal = milkableAnimals.get(world.random.nextInt(milkableAnimals.size())); + world.playSound(null, frontBlockPos, getMilkSound(milkAnimal), SoundSource.NEUTRAL, 1.0F, 1.0F); // add or dispense milk bucket stack return this.addOrDispense(pointer, stack, new ItemStack(Items.MILK_BUCKET)); @@ -45,10 +46,10 @@ protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { return stack; } - private static SoundEvent getMilkSound(AnimalEntity animal) { + private static SoundEvent getMilkSound(Animal animal) { if(animal.getType() == EntityType.GOAT) { - return ((GoatEntity) animal).isScreaming() ? SoundEvents.ENTITY_GOAT_SCREAMING_MILK : SoundEvents.ENTITY_GOAT_MILK; + return ((Goat) animal).isScreamingGoat() ? SoundEvents.GOAT_SCREAMING_MILK : SoundEvents.GOAT_MILK; } - return SoundEvents.ENTITY_COW_MILK; + return SoundEvents.COW_MILK; } } diff --git a/src/main/java/carpetextra/dispenser/behaviors/MilkMooshroomDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/MilkMooshroomDispenserBehavior.java index 70c8c8e8..28b85686 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/MilkMooshroomDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/MilkMooshroomDispenserBehavior.java @@ -4,33 +4,34 @@ import carpetextra.dispenser.DispenserBehaviorHelper; import carpetextra.mixins.MooshroomEntity_StatusEffectAccessorMixin; -import net.minecraft.block.DispenserBlock; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.SuspiciousStewEffectsComponent; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.MooshroomEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; +import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.cow.MushroomCow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.component.SuspiciousStewEffects; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.AABB; public class MilkMooshroomDispenserBehavior extends DispenserBehaviorHelper { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + @SuppressWarnings("resource") + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); - Box frontBlockBox = new Box(frontBlockPos); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); + AABB frontBlockBox = new AABB(frontBlockPos); // get non-baby mooshrooms in front of dispenser - List mooshrooms = world.getEntitiesByType(EntityType.MOOSHROOM, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((entity) -> { - return !((MooshroomEntity) entity).isBaby(); + List mooshrooms = world.getEntities(EntityType.MOOSHROOM, frontBlockBox, EntitySelector.LIVING_ENTITY_STILL_ALIVE.and((entity) -> { + return !((MushroomCow) entity).isBaby(); })); if(!mooshrooms.isEmpty()) { @@ -38,10 +39,10 @@ protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { ItemStack stewStack = getStewType(mooshrooms); // get milking sound effect depending if stew is sus - SoundEvent stewMilkSound = stewStack.getItem() == Items.SUSPICIOUS_STEW ? SoundEvents.ENTITY_MOOSHROOM_SUSPICIOUS_MILK : SoundEvents.ENTITY_MOOSHROOM_MILK; + SoundEvent stewMilkSound = stewStack.getItem() == Items.SUSPICIOUS_STEW ? SoundEvents.MOOSHROOM_MILK_SUSPICIOUSLY : SoundEvents.MOOSHROOM_MILK; // play sound - world.playSound(null, frontBlockPos, stewMilkSound, SoundCategory.NEUTRAL, 1.0F, 1.0F); + world.playSound(null, frontBlockPos, stewMilkSound, SoundSource.NEUTRAL, 1.0F, 1.0F); // add or dispense stew return this.addOrDispense(pointer, stack, stewStack); @@ -52,16 +53,16 @@ protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { return stack; } - private static ItemStack getStewType(List mooshrooms) { + private static ItemStack getStewType(List mooshrooms) { // check each mooshroom for stew effect, return suspicious stew of that type if exists - for (MooshroomEntity mooshroom : mooshrooms) { + for (MushroomCow mooshroom : mooshrooms) { // from MooshroomEntity#interact MooshroomEntity_StatusEffectAccessorMixin mooshroomAccessor = (MooshroomEntity_StatusEffectAccessorMixin) mooshroom; - SuspiciousStewEffectsComponent stewEffects = mooshroomAccessor.getStewEffects(); + SuspiciousStewEffects stewEffects = mooshroomAccessor.getStewEffects(); if (stewEffects != null) { // create suspicious stew and add mooshroom's stew effect to it ItemStack stewStack = new ItemStack(Items.SUSPICIOUS_STEW); - stewStack.set(DataComponentTypes.SUSPICIOUS_STEW_EFFECTS, stewEffects); + stewStack.set(DataComponents.SUSPICIOUS_STEW_EFFECTS, stewEffects); // clear mooshroom's stew effect mooshroomAccessor.setStewEffects(null); diff --git a/src/main/java/carpetextra/dispenser/behaviors/PlaceBoatOnIceDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/PlaceBoatOnIceDispenserBehavior.java index 713ba12a..1c92dfbe 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/PlaceBoatOnIceDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/PlaceBoatOnIceDispenserBehavior.java @@ -1,52 +1,52 @@ package carpetextra.dispenser.behaviors; import carpetextra.mixins.BoatItemAccessorMixin; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.vehicle.AbstractBoatEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; - -public class PlaceBoatOnIceDispenserBehavior extends FallibleItemDispenserBehavior { +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.EntitySpawnReason; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.boat.AbstractBoat; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class PlaceBoatOnIceDispenserBehavior extends OptionalDispenseItemBehavior { @Override - public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + public ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - Direction facing = pointer.state().get(DispenserBlock.FACING); + ServerLevel world = pointer.level(); + Direction facing = pointer.state().getValue(DispenserBlock.FACING); BoatItemAccessorMixin boatInfo = (BoatItemAccessorMixin) stack.getItem(); - EntityType boatType = boatInfo.getType(); + EntityType boatType = boatInfo.getType(); - Vec3d vec3d = pointer.centerPos(); + Vec3 vec3d = pointer.center(); double d = 0.5625 + boatType.getWidth() / 2.0; - double x = vec3d.getX() + facing.getOffsetX() * d; - double y = vec3d.getY() + facing.getOffsetY() * 1.125F; - double z = vec3d.getZ() + facing.getOffsetZ() * d; + double x = vec3d.x() + facing.getStepX() * d; + double y = vec3d.y() + facing.getStepY() * 1.125F; + double z = vec3d.z() + facing.getStepZ() * d; - BlockPos frontBlockPos = pointer.pos().offset(facing); + BlockPos frontBlockPos = pointer.pos().relative(facing); Block frontBlock = world.getBlockState(frontBlockPos).getBlock(); - BlockState stateBelowFront = world.getBlockState(frontBlockPos.down()); + BlockState stateBelowFront = world.getBlockState(frontBlockPos.below()); - if (frontBlock == Blocks.AIR && stateBelowFront.isIn(BlockTags.ICE)) { - AbstractBoatEntity boatEntity = boatType.create(world, SpawnReason.DISPENSER); + if (frontBlock == Blocks.AIR && stateBelowFront.is(BlockTags.ICE)) { + AbstractBoat boatEntity = boatType.create(world, EntitySpawnReason.DISPENSER); - boatEntity.initPosition(x, y, z); - EntityType.copier(world, stack, null).accept(boatEntity); - boatEntity.setYaw(facing.getPositiveHorizontalDegrees()); + boatEntity.setInitialPos(x, y, z); + EntityType.createDefaultStackConfig(world, stack, null).accept(boatEntity); + boatEntity.setYRot(facing.toYRot()); - world.spawnEntity(boatEntity); - stack.decrement(1); + world.addFreshEntity(boatEntity); + stack.shrink(1); return stack; } diff --git a/src/main/java/carpetextra/dispenser/behaviors/ShearChickenDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/ShearChickenDispenserBehavior.java index afc7f7c3..fb9c5bbc 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/ShearChickenDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/ShearChickenDispenserBehavior.java @@ -2,40 +2,40 @@ import java.util.List; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.ChickenEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; - -public class ShearChickenDispenserBehavior extends FallibleItemDispenserBehavior { +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.chicken.Chicken; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.AABB; + +public class ShearChickenDispenserBehavior extends OptionalDispenseItemBehavior { @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - BlockPos frontBlockPos = pointer.pos().offset(pointer.state().get(DispenserBlock.FACING)); - Box frontBlockBox = new Box(frontBlockPos); + ServerLevel world = pointer.level(); + BlockPos frontBlockPos = pointer.pos().relative(pointer.state().getValue(DispenserBlock.FACING)); + AABB frontBlockBox = new AABB(frontBlockPos); // get adult chickens in front of dispenser - List chickens = world.getEntitiesByType(EntityType.CHICKEN, frontBlockBox, EntityPredicates.VALID_LIVING_ENTITY.and((chickenEntity) -> !((AnimalEntity) chickenEntity).isBaby())); + List chickens = world.getEntities(EntityType.CHICKEN, frontBlockBox, EntitySelector.LIVING_ENTITY_STILL_ALIVE.and((chickenEntity) -> !((Animal) chickenEntity).isBaby())); if(!chickens.isEmpty()) { // choose a random chicken in front of dispenser to shear - ChickenEntity chicken = chickens.get(world.random.nextInt(chickens.size())); + Chicken chicken = chickens.get(world.random.nextInt(chickens.size())); // damage chicken, drop feather if successful - if(chicken.damage(world, world.getDamageSources().generic(), 1)) { - chicken.dropItem(world, Items.FEATHER); + if(chicken.hurtServer(world, world.damageSources().generic(), 1)) { + chicken.spawnAtLocation(world, Items.FEATHER); // damage shears, remove if broken - stack.damage(1, world, null, (item) -> stack.setCount(0)); + stack.hurtAndBreak(1, world, null, (item) -> stack.setCount(0)); // return shears return stack; diff --git a/src/main/java/carpetextra/dispenser/behaviors/StripBlocksDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/StripBlocksDispenserBehavior.java index 1a7931d5..16bfbcb7 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/StripBlocksDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/StripBlocksDispenserBehavior.java @@ -5,51 +5,51 @@ import carpetextra.dispenser.DispenserItemUsageContext; import carpetextra.mixins.AxeItem_StrippedBlocksAccessorMixin; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.Oxidizable; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.HoneycombItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.HoneycombItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.WeatheringCopper; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; -public class StripBlocksDispenserBehavior extends FallibleItemDispenserBehavior { +public class StripBlocksDispenserBehavior extends OptionalDispenseItemBehavior { // stripable blocks public static final Set STRIPPED_BLOCKS = AxeItem_StrippedBlocksAccessorMixin.getStrippedBlocks().keySet(); - public static final Set DEOXIDIZE_BLOCKS = Oxidizable.OXIDATION_LEVEL_DECREASES.get().keySet(); - public static final Set DEWAX_BLOCKS = HoneycombItem.WAXED_TO_UNWAXED_BLOCKS.get().keySet(); + public static final Set DEOXIDIZE_BLOCKS = WeatheringCopper.PREVIOUS_BY_BLOCK.get().keySet(); + public static final Set DEWAX_BLOCKS = HoneycombItem.WAX_OFF_BY_BLOCK.get().keySet(); // strip results public static final Collection STRIPPED_RESULTS = AxeItem_StrippedBlocksAccessorMixin.getStrippedBlocks().values(); - public static final Set DEOXIDIZE_RESULTS = Oxidizable.OXIDATION_LEVEL_DECREASES.get().values(); - public static final Set DEWAX_RESUTLS = HoneycombItem.WAXED_TO_UNWAXED_BLOCKS.get().values(); + public static final Set DEOXIDIZE_RESULTS = WeatheringCopper.PREVIOUS_BY_BLOCK.get().values(); + public static final Set DEWAX_RESUTLS = HoneycombItem.WAX_OFF_BY_BLOCK.get().values(); @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - Direction dispenserFacing = pointer.state().get(DispenserBlock.FACING); - BlockPos frontBlockPos = pointer.pos().offset(dispenserFacing); + ServerLevel world = pointer.level(); + Direction dispenserFacing = pointer.state().getValue(DispenserBlock.FACING); + BlockPos frontBlockPos = pointer.pos().relative(dispenserFacing); BlockState frontBlockState = world.getBlockState(frontBlockPos); Block frontBlock = frontBlockState.getBlock(); // check if axe can be used on block if(canStrip(frontBlock)) { - BlockHitResult hitResult = new BlockHitResult(Vec3d.ofCenter(frontBlockPos), dispenserFacing.getOpposite(), frontBlockPos, false); - ItemUsageContext context = new DispenserItemUsageContext(world, stack, hitResult); + BlockHitResult hitResult = new BlockHitResult(Vec3.atCenterOf(frontBlockPos), dispenserFacing.getOpposite(), frontBlockPos, false); + UseOnContext context = new DispenserItemUsageContext(world, stack, hitResult); // use on block, test if sucessful - if(stack.getItem().useOnBlock(context).isAccepted()) { + if(stack.getItem().useOn(context).consumesAction()) { // damage axe, remove if broken - stack.damage(1, world, null, (item) -> stack.setCount(0)); + stack.hurtAndBreak(1, world, null, (item) -> stack.setCount(0)); return stack; } } diff --git a/src/main/java/carpetextra/dispenser/behaviors/TillSoilDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/TillSoilDispenserBehavior.java index cbf48e6d..c9aa1b01 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/TillSoilDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/TillSoilDispenserBehavior.java @@ -4,44 +4,44 @@ import carpetextra.dispenser.DispenserItemUsageContext; import carpetextra.mixins.HoeItem_TilledBlocksAccessorMixin; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; - -public class TillSoilDispenserBehavior extends FallibleItemDispenserBehavior { +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; + +public class TillSoilDispenserBehavior extends OptionalDispenseItemBehavior { public static final Set TILLED_BLOCKS = HoeItem_TilledBlocksAccessorMixin.getTilledBlocks().keySet(); @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - Direction dispenserFacing = pointer.state().get(DispenserBlock.FACING); - BlockPos frontBlockPos = pointer.pos().offset(dispenserFacing); + ServerLevel world = pointer.level(); + Direction dispenserFacing = pointer.state().getValue(DispenserBlock.FACING); + BlockPos frontBlockPos = pointer.pos().relative(dispenserFacing); // check block in front of dispenser and one block down for(int i = 0; i < 2; i++) { - BlockPos hoeBlockPos = frontBlockPos.down(i); + BlockPos hoeBlockPos = frontBlockPos.below(i); BlockState hoeBlockState = world.getBlockState(hoeBlockPos); Block hoeBlock = hoeBlockState.getBlock(); // check if hoe can be used on block if(TILLED_BLOCKS.contains(hoeBlock)) { - BlockHitResult hitResult = new BlockHitResult(Vec3d.of(hoeBlockPos), dispenserFacing.getOpposite(), hoeBlockPos, false); - ItemUsageContext context = new DispenserItemUsageContext(world, stack, hitResult); + BlockHitResult hitResult = new BlockHitResult(Vec3.atLowerCornerOf(hoeBlockPos), dispenserFacing.getOpposite(), hoeBlockPos, false); + UseOnContext context = new DispenserItemUsageContext(world, stack, hitResult); // use on block, test if successful - if(stack.getItem().useOnBlock(context).isAccepted()) { + if(stack.getItem().useOn(context).consumesAction()) { // damage hoe, remove if broken - stack.damage(1, world, null, (item) -> stack.setCount(0)); + stack.hurtAndBreak(1, world, null, (item) -> stack.setCount(0)); return stack; } } diff --git a/src/main/java/carpetextra/dispenser/behaviors/ToggleBlockDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/ToggleBlockDispenserBehavior.java index 4d554b0d..8c24e4e3 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/ToggleBlockDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/ToggleBlockDispenserBehavior.java @@ -2,20 +2,20 @@ import java.util.Set; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; -public class ToggleBlockDispenserBehavior extends FallibleItemDispenserBehavior { +public class ToggleBlockDispenserBehavior extends OptionalDispenseItemBehavior { public static final Set TOGGLEABLE_BLOCKS = Set.of( Blocks.OAK_BUTTON, Blocks.SPRUCE_BUTTON, @@ -42,19 +42,19 @@ public class ToggleBlockDispenserBehavior extends FallibleItemDispenserBehavior ); @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + protected ItemStack execute(BlockSource pointer, ItemStack stack) { this.setSuccess(true); - ServerWorld world = pointer.world(); - Direction dispenserFacing = pointer.state().get(DispenserBlock.FACING); - BlockPos frontBlockPos = pointer.pos().offset(dispenserFacing); + ServerLevel world = pointer.level(); + Direction dispenserFacing = pointer.state().getValue(DispenserBlock.FACING); + BlockPos frontBlockPos = pointer.pos().relative(dispenserFacing); BlockState frontBlockState = world.getBlockState(frontBlockPos); // check if block can be toggled if (TOGGLEABLE_BLOCKS.contains(frontBlockState.getBlock())) { - BlockHitResult hitResult = new BlockHitResult(Vec3d.of(frontBlockPos), dispenserFacing.getOpposite(), frontBlockPos, false); + BlockHitResult hitResult = new BlockHitResult(Vec3.atLowerCornerOf(frontBlockPos), dispenserFacing.getOpposite(), frontBlockPos, false); // use on block, test if successful - if (frontBlockState.onUse(world, null, hitResult).isAccepted()) { + if (frontBlockState.useWithoutItem(world, null, hitResult).consumesAction()) { return stack; } } diff --git a/src/main/java/carpetextra/fakes/DispenserBlockEntityInterface.java b/src/main/java/carpetextra/fakes/DispenserBlockEntityInterface.java index 3e759c32..1ae1848f 100644 --- a/src/main/java/carpetextra/fakes/DispenserBlockEntityInterface.java +++ b/src/main/java/carpetextra/fakes/DispenserBlockEntityInterface.java @@ -1,9 +1,9 @@ package carpetextra.fakes; -import net.minecraft.item.ItemStack; -import net.minecraft.util.collection.DefaultedList; +import net.minecraft.core.NonNullList; +import net.minecraft.world.item.ItemStack; public interface DispenserBlockEntityInterface { - public DefaultedList getInventory(); + public NonNullList getInventory(); } diff --git a/src/main/java/carpetextra/helpers/CustomSpawnLists.java b/src/main/java/carpetextra/helpers/CustomSpawnLists.java index 975e7e4e..fe760333 100644 --- a/src/main/java/carpetextra/helpers/CustomSpawnLists.java +++ b/src/main/java/carpetextra/helpers/CustomSpawnLists.java @@ -2,20 +2,20 @@ import carpet.utils.SpawnOverrides; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.util.collection.Pool; -import net.minecraft.world.StructureSpawns; -import net.minecraft.world.biome.SpawnSettings; -import net.minecraft.world.gen.structure.StructureKeys; +import net.minecraft.util.random.WeightedList; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.structure.BuiltinStructures; +import net.minecraft.world.level.levelgen.structure.StructureSpawnOverride; public class CustomSpawnLists { public static void addExtraSpawnRules() { - SpawnOverrides.addOverride(() -> CarpetExtraSettings.straySpawningInIgloos, SpawnGroup.MONSTER, StructureKeys.IGLOO, - StructureSpawns.BoundingBox.STRUCTURE, Pool.of(new SpawnSettings.SpawnEntry(EntityType.STRAY, 1, 1))); - SpawnOverrides.addOverride(() -> CarpetExtraSettings.creeperSpawningInJungleTemples, SpawnGroup.MONSTER, StructureKeys.JUNGLE_PYRAMID, - StructureSpawns.BoundingBox.STRUCTURE, Pool.of(new SpawnSettings.SpawnEntry(EntityType.CREEPER, 1, 1))); + SpawnOverrides.addOverride(() -> CarpetExtraSettings.straySpawningInIgloos, MobCategory.MONSTER, BuiltinStructures.IGLOO, + StructureSpawnOverride.BoundingBoxType.STRUCTURE, WeightedList.of(new MobSpawnSettings.SpawnerData(EntityType.STRAY, 1, 1))); + SpawnOverrides.addOverride(() -> CarpetExtraSettings.creeperSpawningInJungleTemples, MobCategory.MONSTER, BuiltinStructures.JUNGLE_TEMPLE, + StructureSpawnOverride.BoundingBoxType.STRUCTURE, WeightedList.of(new MobSpawnSettings.SpawnerData(EntityType.CREEPER, 1, 1))); } } diff --git a/src/main/java/carpetextra/helpers/FlowerPotHelper.java b/src/main/java/carpetextra/helpers/FlowerPotHelper.java index 92dfbba5..b8001fcb 100644 --- a/src/main/java/carpetextra/helpers/FlowerPotHelper.java +++ b/src/main/java/carpetextra/helpers/FlowerPotHelper.java @@ -4,21 +4,21 @@ import carpetextra.CarpetExtraSettings; import carpetextra.mixins.FlowerPotBlock_ContentAccessorMixin; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.FlowerPotBlock; -import net.minecraft.item.Item; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FlowerPotBlock; public class FlowerPotHelper { public static final Map CONTENT_TO_POTTED = FlowerPotBlock_ContentAccessorMixin.getPottedBlocksMap(); - public static void updateLoadStatus(World world, BlockPos pos, Block block, boolean forceload) { + public static void updateLoadStatus(Level world, BlockPos pos, Block block, boolean forceload) { // check if rule is enabled and block is wither rose - if(CarpetExtraSettings.flowerPotChunkLoading && world instanceof ServerWorld && block == Blocks.WITHER_ROSE) { - ServerWorld serverWorld = (ServerWorld) world; + if(CarpetExtraSettings.flowerPotChunkLoading && world instanceof ServerLevel && block == Blocks.WITHER_ROSE) { + ServerLevel serverWorld = (ServerLevel) world; // set chunk to be force loaded serverWorld.setChunkForced(pos.getX() >> 4, pos.getZ() >> 4, forceload); @@ -28,7 +28,7 @@ public static void updateLoadStatus(World world, BlockPos pos, Block block, bool // checks if item can be put in a flower pot public static boolean isPottable(Item item) { - Block block = Block.getBlockFromItem(item); + Block block = Block.byItem(item); if(block != Blocks.AIR) { return CONTENT_TO_POTTED.containsKey(block); } @@ -37,6 +37,6 @@ public static boolean isPottable(Item item) { // gets flower pot type from item public static FlowerPotBlock getPottedBlock(Item item) { - return (FlowerPotBlock) CONTENT_TO_POTTED.get(Block.getBlockFromItem(item)); + return (FlowerPotBlock) CONTENT_TO_POTTED.get(Block.byItem(item)); } } diff --git a/src/main/java/carpetextra/mixins/AbstractButtonBlock_variableWoodMixin.java b/src/main/java/carpetextra/mixins/AbstractButtonBlock_variableWoodMixin.java index aec6de57..8767e8b9 100644 --- a/src/main/java/carpetextra/mixins/AbstractButtonBlock_variableWoodMixin.java +++ b/src/main/java/carpetextra/mixins/AbstractButtonBlock_variableWoodMixin.java @@ -2,11 +2,11 @@ import carpetextra.CarpetExtraSettings; import carpetextra.utils.WoodDelayMultipliers; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ButtonBlock; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.ButtonBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -14,34 +14,34 @@ @Mixin(ButtonBlock.class) public abstract class AbstractButtonBlock_variableWoodMixin { - @Redirect(method = "powerOn", at = @At( + @Redirect(method = "press", at = @At( value = "INVOKE", - target = "Lnet/minecraft/world/World;scheduleBlockTick(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/Block;I)V" + target = "Lnet/minecraft/world/level/Level;scheduleTick(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;I)V" )) - private void getCustomTickRate(World instance, BlockPos blockPos, Block block, int i, - BlockState state, World world, BlockPos pos) + private void getCustomTickRate(Level instance, BlockPos blockPos, Block block, int i, + BlockState state, Level world, BlockPos pos) { if (!CarpetExtraSettings.variableWoodDelays) { - instance.scheduleBlockTick(blockPos, block, i); + instance.scheduleTick(blockPos, block, i); return; } - instance.scheduleBlockTick(blockPos, block, WoodDelayMultipliers.getForDelay(state.getBlock(), i)); + instance.scheduleTick(blockPos, block, WoodDelayMultipliers.getForDelay(state.getBlock(), i)); } - @Redirect(method = "tryPowerWithProjectiles", at = @At( + @Redirect(method = "checkPressed", at = @At( value = "INVOKE", - target = "Lnet/minecraft/world/World;scheduleBlockTick(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/Block;I)V" + target = "Lnet/minecraft/world/level/Level;scheduleTick(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;I)V" )) - private void getCustomTickRateProjectiles(World instance, BlockPos blockPos, Block block, int i, - BlockState state, World world, BlockPos pos) + private void getCustomTickRateProjectiles(Level instance, BlockPos blockPos, Block block, int i, + BlockState state, Level world, BlockPos pos) { if (!CarpetExtraSettings.variableWoodDelays) { - instance.scheduleBlockTick(blockPos, block, i); + instance.scheduleTick(blockPos, block, i); return; } - instance.scheduleBlockTick(blockPos, block, WoodDelayMultipliers.getForDelay(state.getBlock(), i)); + instance.scheduleTick(blockPos, block, WoodDelayMultipliers.getForDelay(state.getBlock(), i)); } diff --git a/src/main/java/carpetextra/mixins/AbstractPressurePlateBlock_variableWoodMixin.java b/src/main/java/carpetextra/mixins/AbstractPressurePlateBlock_variableWoodMixin.java index 5840f05c..84d7a78e 100644 --- a/src/main/java/carpetextra/mixins/AbstractPressurePlateBlock_variableWoodMixin.java +++ b/src/main/java/carpetextra/mixins/AbstractPressurePlateBlock_variableWoodMixin.java @@ -2,32 +2,32 @@ import carpetextra.CarpetExtraSettings; import carpetextra.utils.WoodDelayMultipliers; -import net.minecraft.block.AbstractPressurePlateBlock; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BasePressurePlateBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -@Mixin(AbstractPressurePlateBlock.class) +@Mixin(BasePressurePlateBlock.class) public abstract class AbstractPressurePlateBlock_variableWoodMixin { - @Shadow protected abstract int getTickRate(); + @Shadow protected abstract int getPressedTime(); - @Redirect(method = "updatePlateState", at = @At( + @Redirect(method = "checkPressed", at = @At( value = "INVOKE", - target ="Lnet/minecraft/block/AbstractPressurePlateBlock;getTickRate()I" + target ="Lnet/minecraft/world/level/block/BasePressurePlateBlock;getPressedTime()I" )) - private int getCustomTickRate(AbstractPressurePlateBlock block, Entity entity, World world, BlockPos pos, BlockState state, int redstoneLevel) + private int getCustomTickRate(BasePressurePlateBlock block, Entity entity, Level world, BlockPos pos, BlockState state, int redstoneLevel) { if (!CarpetExtraSettings.variableWoodDelays) { - return getTickRate(); + return getPressedTime(); } - return WoodDelayMultipliers.getForDelay(state.getBlock(), getTickRate()); + return WoodDelayMultipliers.getForDelay(state.getBlock(), getPressedTime()); } } diff --git a/src/main/java/carpetextra/mixins/AbstractRedstoneGateBlockMixin.java b/src/main/java/carpetextra/mixins/AbstractRedstoneGateBlockMixin.java index 897e3b06..cc3f4212 100644 --- a/src/main/java/carpetextra/mixins/AbstractRedstoneGateBlockMixin.java +++ b/src/main/java/carpetextra/mixins/AbstractRedstoneGateBlockMixin.java @@ -1,19 +1,19 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.AbstractRedstoneGateBlock; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.DiodeBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -@Mixin(AbstractRedstoneGateBlock.class) +@Mixin(DiodeBlock.class) public abstract class AbstractRedstoneGateBlockMixin { @Redirect( - method = "isTargetNotAligned", + method = "shouldPrioritize", at = @At(value = "INVOKE", - target = "Lnet/minecraft/util/math/Direction;getOpposite()Lnet/minecraft/util/math/Direction;") + target = "Lnet/minecraft/core/Direction;getOpposite()Lnet/minecraft/core/Direction;") ) private Direction onIsTargetNotAligned(Direction direction) { diff --git a/src/main/java/carpetextra/mixins/AnimalEntity_dispenserMixin.java b/src/main/java/carpetextra/mixins/AnimalEntity_dispenserMixin.java index 90f2c813..b2799f03 100644 --- a/src/main/java/carpetextra/mixins/AnimalEntity_dispenserMixin.java +++ b/src/main/java/carpetextra/mixins/AnimalEntity_dispenserMixin.java @@ -1,34 +1,34 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.PassiveEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.animal.Animal; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(AnimalEntity.class) +@Mixin(Animal.class) public abstract class AnimalEntity_dispenserMixin { - @Shadow /*@Nullable*/ public abstract ServerPlayerEntity getLovingPlayer(); + @Shadow /*@Nullable*/ public abstract ServerPlayer getLoveCause(); @Inject( - method = "breed(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/entity/passive/AnimalEntity;Lnet/minecraft/entity/passive/PassiveEntity;)V", + method = "finalizeSpawnChildFromBreeding(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/animal/Animal;Lnet/minecraft/world/entity/AgeableMob;)V", at = @At( value = "INVOKE", - target = "Lnet/minecraft/server/world/ServerWorld;spawnEntity(Lnet/minecraft/entity/Entity;)Z", + target = "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z", ordinal = 0 ), cancellable = true ) - protected void preventDispenserSpawningExperience(ServerWorld world, AnimalEntity other, PassiveEntity baby, CallbackInfo ci) { - ServerPlayerEntity serverPlayerEntity_1 = getLovingPlayer(); + protected void preventDispenserSpawningExperience(ServerLevel world, Animal other, AgeableMob baby, CallbackInfo ci) { + ServerPlayer serverPlayerEntity_1 = getLoveCause(); if (serverPlayerEntity_1 == null) { - serverPlayerEntity_1 = other.getLovingPlayer(); + serverPlayerEntity_1 = other.getLoveCause(); } if(serverPlayerEntity_1 == null && CarpetExtraSettings.dispensersFeedAnimals) { ci.cancel(); diff --git a/src/main/java/carpetextra/mixins/AxeItem_StrippedBlocksAccessorMixin.java b/src/main/java/carpetextra/mixins/AxeItem_StrippedBlocksAccessorMixin.java index 72ad678a..914dfd3a 100644 --- a/src/main/java/carpetextra/mixins/AxeItem_StrippedBlocksAccessorMixin.java +++ b/src/main/java/carpetextra/mixins/AxeItem_StrippedBlocksAccessorMixin.java @@ -5,12 +5,12 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.block.Block; -import net.minecraft.item.AxeItem; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.level.block.Block; @Mixin(AxeItem.class) public interface AxeItem_StrippedBlocksAccessorMixin { - @Accessor("STRIPPED_BLOCKS") + @Accessor("STRIPPABLES") static Map getStrippedBlocks() { throw new AssertionError(); } diff --git a/src/main/java/carpetextra/mixins/AxeItem_allowStripMixin.java b/src/main/java/carpetextra/mixins/AxeItem_allowStripMixin.java index 075fc743..e324012e 100644 --- a/src/main/java/carpetextra/mixins/AxeItem_allowStripMixin.java +++ b/src/main/java/carpetextra/mixins/AxeItem_allowStripMixin.java @@ -1,7 +1,7 @@ package carpetextra.mixins; -import net.minecraft.item.AxeItem; -import net.minecraft.item.ItemUsageContext; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.item.context.UseOnContext; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -13,8 +13,8 @@ public class AxeItem_allowStripMixin { * Fixes crash when invoking {@code #shouldCancelStripAttempt(ItemUsageContext)} * with {@code null} player in the context */ - @Inject(method = "shouldCancelStripAttempt", at = @At(value = "HEAD"), cancellable=true) - private static void allowStripWithoutPlayer(ItemUsageContext context, CallbackInfoReturnable cir) { + @Inject(method = "playerHasBlockingItemUseIntent", at = @At(value = "HEAD"), cancellable=true) + private static void allowStripWithoutPlayer(UseOnContext context, CallbackInfoReturnable cir) { if (context.getPlayer() == null) { cir.setReturnValue(false); } diff --git a/src/main/java/carpetextra/mixins/BlockItemMixin_accurateBlockPlacement.java b/src/main/java/carpetextra/mixins/BlockItemMixin_accurateBlockPlacement.java index ac6a2433..1460fd3b 100644 --- a/src/main/java/carpetextra/mixins/BlockItemMixin_accurateBlockPlacement.java +++ b/src/main/java/carpetextra/mixins/BlockItemMixin_accurateBlockPlacement.java @@ -2,10 +2,10 @@ import carpetextra.CarpetExtraSettings; import carpetextra.utils.BlockPlacer; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemPlacementContext; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -15,9 +15,9 @@ public class BlockItemMixin_accurateBlockPlacement { @Redirect(method = "getPlacementState", at = @At( value = "INVOKE", - target = "Lnet/minecraft/block/Block;getPlacementState(Lnet/minecraft/item/ItemPlacementContext;)Lnet/minecraft/block/BlockState;" + target = "Lnet/minecraft/world/level/block/Block;getStateForPlacement(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;" )) - private BlockState getAlternatePlacement(Block block, ItemPlacementContext context) + private BlockState getAlternatePlacement(Block block, BlockPlaceContext context) { if (CarpetExtraSettings.accurateBlockPlacement) { @@ -25,7 +25,7 @@ private BlockState getAlternatePlacement(Block block, ItemPlacementContext conte if (tryAlternative != null) return tryAlternative; } - return block.getPlacementState(context); + return block.getStateForPlacement(context); } } diff --git a/src/main/java/carpetextra/mixins/BoatItemAccessorMixin.java b/src/main/java/carpetextra/mixins/BoatItemAccessorMixin.java index 78455725..d1b2d654 100644 --- a/src/main/java/carpetextra/mixins/BoatItemAccessorMixin.java +++ b/src/main/java/carpetextra/mixins/BoatItemAccessorMixin.java @@ -1,14 +1,13 @@ package carpetextra.mixins; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.vehicle.AbstractBoatEntity; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.item.BoatItem; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.boat.AbstractBoat; +import net.minecraft.world.item.BoatItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(BoatItem.class) public interface BoatItemAccessorMixin { - @Accessor("boatEntityType") - EntityType getType(); + @Accessor("entityType") + EntityType getType(); } diff --git a/src/main/java/carpetextra/mixins/CactusBlock_fertilizerMixin.java b/src/main/java/carpetextra/mixins/CactusBlock_fertilizerMixin.java index e4f814c6..a4ebcdc1 100644 --- a/src/main/java/carpetextra/mixins/CactusBlock_fertilizerMixin.java +++ b/src/main/java/carpetextra/mixins/CactusBlock_fertilizerMixin.java @@ -1,57 +1,57 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.CactusBlock; -import net.minecraft.block.Fertilizable; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldView; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.CactusBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; @Mixin(CactusBlock.class) -public abstract class CactusBlock_fertilizerMixin implements Fertilizable +public abstract class CactusBlock_fertilizerMixin implements BonemealableBlock { @Override - public boolean isFertilizable(WorldView world, BlockPos pos, BlockState state) + public boolean isValidBonemealTarget(LevelReader world, BlockPos pos, BlockState state) { int i = this.countCactusAbove(world, pos); int j = this.countCactusBelow(world, pos); - return CarpetExtraSettings.betterBonemeal && i + j < 2 && world.getBlockState(pos.up(i + 1)).isAir(); + return CarpetExtraSettings.betterBonemeal && i + j < 2 && world.getBlockState(pos.above(i + 1)).isAir(); } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) + public boolean isBonemealSuccess(Level world, RandomSource random, BlockPos pos, BlockState state) { return true; } @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) + public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) { int i = this.countCactusAbove(world, pos); - BlockPos growPos = pos.up(i + 1); - world.setBlockState(growPos, Blocks.CACTUS.getDefaultState()); - state.scheduledTick(world, growPos, random); + BlockPos growPos = pos.above(i + 1); + world.setBlockAndUpdate(growPos, Blocks.CACTUS.defaultBlockState()); + state.tick(world, growPos, random); } - private int countCactusAbove(BlockView world, BlockPos pos) + private int countCactusAbove(BlockGetter world, BlockPos pos) { int i; - for (i = 0; i < 2 && world.getBlockState(pos.up(i + 1)).isOf(Blocks.CACTUS); ++i) + for (i = 0; i < 2 && world.getBlockState(pos.above(i + 1)).is(Blocks.CACTUS); ++i) { } return i; } - private int countCactusBelow(BlockView world, BlockPos pos) + private int countCactusBelow(BlockGetter world, BlockPos pos) { int i; - for (i = 0; i < 2 && world.getBlockState(pos.down(i + 1)).isOf(Blocks.CACTUS); ++i) + for (i = 0; i < 2 && world.getBlockState(pos.below(i + 1)).is(Blocks.CACTUS); ++i) { } return i; diff --git a/src/main/java/carpetextra/mixins/CactusBlock_syncMixin.java b/src/main/java/carpetextra/mixins/CactusBlock_syncMixin.java index cd068786..070594a4 100644 --- a/src/main/java/carpetextra/mixins/CactusBlock_syncMixin.java +++ b/src/main/java/carpetextra/mixins/CactusBlock_syncMixin.java @@ -1,8 +1,8 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.Block; -import net.minecraft.block.CactusBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.CactusBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.ModifyConstant; @@ -10,11 +10,11 @@ @Mixin(CactusBlock.class) public abstract class CactusBlock_syncMixin { - @ModifyConstant(method = "randomTick", require = 2, constant = @Constant(intValue = Block.SKIP_REDRAW_AND_BLOCK_ENTITY_REPLACED_CALLBACK)) + @ModifyConstant(method = "randomTick", require = 2, constant = @Constant(intValue = Block.UPDATE_NONE)) private int onOnScheduledTick(int original) { if (CarpetExtraSettings.blockStateSyncing) - return original | Block.NOTIFY_LISTENERS; + return original | Block.UPDATE_CLIENTS; else return original; } diff --git a/src/main/java/carpetextra/mixins/ChickenEntityMixin.java b/src/main/java/carpetextra/mixins/ChickenEntityMixin.java index 78e38894..739a46a7 100644 --- a/src/main/java/carpetextra/mixins/ChickenEntityMixin.java +++ b/src/main/java/carpetextra/mixins/ChickenEntityMixin.java @@ -1,45 +1,46 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.ChickenEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.world.World; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.chicken.Chicken; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; -@Mixin(ChickenEntity.class) -public abstract class ChickenEntityMixin extends AnimalEntity +@Mixin(Chicken.class) +public abstract class ChickenEntityMixin extends Animal { - protected ChickenEntityMixin(EntityType entityType_1, World world_1) + protected ChickenEntityMixin(EntityType entityType_1, Level world_1) { super(entityType_1, world_1); } @Override - public ActionResult interactMob(PlayerEntity player, Hand hand) + @SuppressWarnings("resource") + public InteractionResult mobInteract(Player player, InteractionHand hand) { - if (this.getEntityWorld() instanceof ServerWorld sw) + if (this.level() instanceof ServerLevel sw) { - ItemStack stack = player.getStackInHand(hand); + ItemStack stack = player.getItemInHand(hand); if (CarpetExtraSettings.chickenShearing && stack.getItem() == Items.SHEARS && !this.isBaby()) { - boolean tookDamage = this.damage(sw, player.getEntityWorld().getDamageSources().generic(), 1); + boolean tookDamage = this.hurtServer(sw, player.level().damageSources().generic(), 1); if (tookDamage) { - this.dropItem(sw, Items.FEATHER); - stack.damage(1, player, hand == Hand.MAIN_HAND ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND); - return ActionResult.SUCCESS; + this.spawnAtLocation(sw, Items.FEATHER); + stack.hurtAndBreak(1, player, hand == InteractionHand.MAIN_HAND ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND); + return InteractionResult.SUCCESS; } } } - return super.interactMob(player, hand); + return super.mobInteract(player, hand); } } diff --git a/src/main/java/carpetextra/mixins/ChunkGeneratorMixin.java b/src/main/java/carpetextra/mixins/ChunkGeneratorMixin.java index f60015bc..31616d80 100644 --- a/src/main/java/carpetextra/mixins/ChunkGeneratorMixin.java +++ b/src/main/java/carpetextra/mixins/ChunkGeneratorMixin.java @@ -2,10 +2,10 @@ import carpetextra.CarpetExtraSettings; import carpetextra.helpers.DragonEggBedrockBreaking; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkGenerator; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -14,15 +14,15 @@ @Mixin(ChunkGenerator.class) public abstract class ChunkGeneratorMixin { - @Inject(method = "generateFeatures", at = @At("HEAD")) - private void onGenerateFeaturesStart(StructureWorldAccess world, Chunk chunk, StructureAccessor structureAccessor, CallbackInfo ci) + @Inject(method = "applyBiomeDecoration", at = @At("HEAD")) + private void onGenerateFeaturesStart(WorldGenLevel world, ChunkAccess chunk, StructureManager structureAccessor, CallbackInfo ci) { if (CarpetExtraSettings.dragonEggBedrockBreaking) DragonEggBedrockBreaking.fallInstantly = true; } - @Inject(method = "generateFeatures", at = @At("TAIL")) - private void onGenerateFeaturesEnd(StructureWorldAccess world, Chunk chunk, StructureAccessor structureAccessor, CallbackInfo ci) + @Inject(method = "applyBiomeDecoration", at = @At("TAIL")) + private void onGenerateFeaturesEnd(WorldGenLevel world, ChunkAccess chunk, StructureManager structureAccessor, CallbackInfo ci) { if (CarpetExtraSettings.dragonEggBedrockBreaking) DragonEggBedrockBreaking.fallInstantly = false; diff --git a/src/main/java/carpetextra/mixins/ComparatorBlock_comparatorBetterItemFramesMixin.java b/src/main/java/carpetextra/mixins/ComparatorBlock_comparatorBetterItemFramesMixin.java index afe0ae71..3dd64f27 100644 --- a/src/main/java/carpetextra/mixins/ComparatorBlock_comparatorBetterItemFramesMixin.java +++ b/src/main/java/carpetextra/mixins/ComparatorBlock_comparatorBetterItemFramesMixin.java @@ -2,14 +2,14 @@ import carpetextra.CarpetExtraSettings; import carpetextra.CarpetExtraSettings.ComparatorOptions; -import net.minecraft.block.AbstractRedstoneGateBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.ComparatorBlock; -import net.minecraft.entity.decoration.ItemFrameEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.ComparatorBlock; +import net.minecraft.world.level.block.DiodeBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -20,50 +20,50 @@ import java.util.Objects; @Mixin(ComparatorBlock.class) -public abstract class ComparatorBlock_comparatorBetterItemFramesMixin extends AbstractRedstoneGateBlock { - protected ComparatorBlock_comparatorBetterItemFramesMixin(Settings settings) { +public abstract class ComparatorBlock_comparatorBetterItemFramesMixin extends DiodeBlock { + protected ComparatorBlock_comparatorBetterItemFramesMixin(Properties settings) { super(settings); } @Unique - private ItemFrameEntity getAttachedItemFrameHorizontal(World world, Direction facing, BlockPos pos) { - List list; - list = world.getEntitiesByClass(ItemFrameEntity.class, new Box(pos), (itemFrame) -> - itemFrame != null && (CarpetExtraSettings.comparatorBetterItemFrames.ordinal() >= 2 || itemFrame.getHorizontalFacing() == facing)); + private ItemFrame getAttachedItemFrameHorizontal(Level world, Direction facing, BlockPos pos) { + List list; + list = world.getEntitiesOfClass(ItemFrame.class, new AABB(pos), (itemFrame) -> + itemFrame != null && (CarpetExtraSettings.comparatorBetterItemFrames.ordinal() >= 2 || itemFrame.getDirection() == facing)); if (list.isEmpty() && CarpetExtraSettings.comparatorBetterItemFrames == ComparatorOptions.EXTENDED) { - list = world.getEntitiesByClass(ItemFrameEntity.class, new Box(pos).expand(0.3), Objects::nonNull); + list = world.getEntitiesOfClass(ItemFrame.class, new AABB(pos).inflate(0.3), Objects::nonNull); } return !list.isEmpty() ? list.get(0) : null; } @Unique - private ItemFrameEntity getUnAttachedItemFrameHorizontal(World world, Direction facing, BlockPos pos) { + private ItemFrame getUnAttachedItemFrameHorizontal(Level world, Direction facing, BlockPos pos) { // If item frame is sitting in front of the comparator, horizontally or on another block - List list = world.getEntitiesByClass(ItemFrameEntity.class, new Box(pos), Objects::nonNull); + List list = world.getEntitiesOfClass(ItemFrame.class, new AABB(pos), Objects::nonNull); return !list.isEmpty() ? list.get(0) : null; } - @Inject(method = "getPower", at = @At(value = "RETURN"), cancellable = true) - protected void isSolidBlockOrAir(World world, BlockPos pos, BlockState state, CallbackInfoReturnable cir) { + @Inject(method = "getInputSignal", at = @At(value = "RETURN"), cancellable = true) + protected void isSolidBlockOrAir(Level world, BlockPos pos, BlockState state, CallbackInfoReturnable cir) { if (CarpetExtraSettings.comparatorBetterItemFrames != ComparatorOptions.VANILLA) { - int i = super.getPower(world, pos, state); - Direction direction = state.get(FACING); - BlockPos blockPos = pos.offset(direction); + int i = super.getInputSignal(world, pos, state); + Direction direction = state.getValue(FACING); + BlockPos blockPos = pos.relative(direction); BlockState blockState = world.getBlockState(blockPos); - if (blockState.hasComparatorOutput()) { - i = blockState.getComparatorOutput(world, blockPos, direction); - } else if (i < 15 && blockState.isSolidBlock(world, blockPos)) { - blockPos = blockPos.offset(direction); + if (blockState.hasAnalogOutputSignal()) { + i = blockState.getAnalogOutputSignal(world, blockPos, direction); + } else if (i < 15 && blockState.isRedstoneConductor(world, blockPos)) { + blockPos = blockPos.relative(direction); blockState = world.getBlockState(blockPos); - ItemFrameEntity itemFrameEntity = getAttachedItemFrameHorizontal(world, direction, blockPos); - int j = Math.max(itemFrameEntity == null ? -2147483648 : itemFrameEntity.getComparatorPower(), blockState.hasComparatorOutput() ? blockState.getComparatorOutput(world, blockPos, direction) : -2147483648); + ItemFrame itemFrameEntity = getAttachedItemFrameHorizontal(world, direction, blockPos); + int j = Math.max(itemFrameEntity == null ? -2147483648 : itemFrameEntity.getAnalogOutput(), blockState.hasAnalogOutputSignal() ? blockState.getAnalogOutputSignal(world, blockPos, direction) : -2147483648); if (j != -2147483648) { i = j; } } else { - ItemFrameEntity itemFrame = getUnAttachedItemFrameHorizontal(world,direction,blockPos); + ItemFrame itemFrame = getUnAttachedItemFrameHorizontal(world,direction,blockPos); if (itemFrame != null) { - i = itemFrame.getComparatorPower(); + i = itemFrame.getAnalogOutput(); } } cir.setReturnValue(i); diff --git a/src/main/java/carpetextra/mixins/ComparatorBlock_playerAbilityMixin.java b/src/main/java/carpetextra/mixins/ComparatorBlock_playerAbilityMixin.java index bec2027d..50dd3307 100644 --- a/src/main/java/carpetextra/mixins/ComparatorBlock_playerAbilityMixin.java +++ b/src/main/java/carpetextra/mixins/ComparatorBlock_playerAbilityMixin.java @@ -1,8 +1,8 @@ package carpetextra.mixins; -import net.minecraft.block.ComparatorBlock; -import net.minecraft.entity.player.PlayerAbilities; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Abilities; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.ComparatorBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -11,15 +11,15 @@ public abstract class ComparatorBlock_playerAbilityMixin { @Redirect( - method = "onUse", + method = "useWithoutItem", at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/player/PlayerEntity;getAbilities()Lnet/minecraft/entity/player/PlayerAbilities;" + target = "Lnet/minecraft/world/entity/player/Player;getAbilities()Lnet/minecraft/world/entity/player/Abilities;" ) ) - private PlayerAbilities hasPlayerAbilities(final PlayerEntity player) { + private Abilities hasPlayerAbilities(final Player player) { // player will never be null in VANILLA - if (player == null) return new PlayerAbilities(); + if (player == null) return new Abilities(); return player.getAbilities(); } } diff --git a/src/main/java/carpetextra/mixins/DaylightDetectorBlockMixin.java b/src/main/java/carpetextra/mixins/DaylightDetectorBlockMixin.java index 27650dac..f45364bf 100644 --- a/src/main/java/carpetextra/mixins/DaylightDetectorBlockMixin.java +++ b/src/main/java/carpetextra/mixins/DaylightDetectorBlockMixin.java @@ -1,7 +1,7 @@ package carpetextra.mixins; -import net.minecraft.block.DaylightDetectorBlock; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.DaylightDetectorBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -9,15 +9,15 @@ @Mixin(DaylightDetectorBlock.class) public abstract class DaylightDetectorBlockMixin { @Redirect( - method = "onUse", + method = "useWithoutItem", at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/player/PlayerEntity;canModifyBlocks()Z" + target = "Lnet/minecraft/world/entity/player/Player;mayBuild()Z" ) ) - private boolean hasModifyWorld(final PlayerEntity player) { + private boolean hasModifyWorld(final Player player) { // player will never be null in VANILLA if (player == null) return true; - return player.canModifyBlocks(); + return player.mayBuild(); } } diff --git a/src/main/java/carpetextra/mixins/DispenserBehaviorCarvedPumpkinMixin.java b/src/main/java/carpetextra/mixins/DispenserBehaviorCarvedPumpkinMixin.java index c82c949d..3101775d 100644 --- a/src/main/java/carpetextra/mixins/DispenserBehaviorCarvedPumpkinMixin.java +++ b/src/main/java/carpetextra/mixins/DispenserBehaviorCarvedPumpkinMixin.java @@ -6,13 +6,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import carpetextra.utils.PlaceBlockDispenserBehavior; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPointer; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; -@Mixin(targets = "net/minecraft/block/dispenser/DispenserBehavior$6") -public abstract class DispenserBehaviorCarvedPumpkinMixin extends FallibleItemDispenserBehavior +@Mixin(targets = "net/minecraft/core/dispenser/DispenseItemBehavior$14") +public abstract class DispenserBehaviorCarvedPumpkinMixin extends OptionalDispenseItemBehavior { /* difficult to maintain @Inject( diff --git a/src/main/java/carpetextra/mixins/DispenserBehaviorChestMixin.java b/src/main/java/carpetextra/mixins/DispenserBehaviorChestMixin.java index c00d2739..096985fe 100644 --- a/src/main/java/carpetextra/mixins/DispenserBehaviorChestMixin.java +++ b/src/main/java/carpetextra/mixins/DispenserBehaviorChestMixin.java @@ -1,15 +1,12 @@ package carpetextra.mixins; import carpetextra.utils.PlaceBlockDispenserBehavior; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPointer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(targets = "net/minecraft/block/dispenser/DispenserBehavior$9") +@Mixin(targets = "net/minecraft/core/dispenser/DispenseItemBehavior$3") public abstract class DispenserBehaviorChestMixin { /* difficult to maintain diff --git a/src/main/java/carpetextra/mixins/DispenserBehaviorGlowstoneMixin.java b/src/main/java/carpetextra/mixins/DispenserBehaviorGlowstoneMixin.java index 29e3d219..e4d59adb 100644 --- a/src/main/java/carpetextra/mixins/DispenserBehaviorGlowstoneMixin.java +++ b/src/main/java/carpetextra/mixins/DispenserBehaviorGlowstoneMixin.java @@ -1,15 +1,12 @@ package carpetextra.mixins; import carpetextra.utils.PlaceBlockDispenserBehavior; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPointer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(targets = "net/minecraft/block/dispenser/DispenserBehavior$4") +@Mixin(targets = "net/minecraft/core/dispenser/DispenseItemBehavior$12") public abstract class DispenserBehaviorGlowstoneMixin { /* difficult to maintain diff --git a/src/main/java/carpetextra/mixins/DispenserBehaviorMobHeadMixin.java b/src/main/java/carpetextra/mixins/DispenserBehaviorMobHeadMixin.java index c0b1e624..49899076 100644 --- a/src/main/java/carpetextra/mixins/DispenserBehaviorMobHeadMixin.java +++ b/src/main/java/carpetextra/mixins/DispenserBehaviorMobHeadMixin.java @@ -6,18 +6,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import carpetextra.utils.PlaceBlockDispenserBehavior; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPointer; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; @Mixin(targets = { - /* mob & player heads */ - "net/minecraft/block/dispenser/DispenserBehavior$6", + "net/minecraft/core/dispenser/DispenseItemBehavior$14", /* wither skull */ //"net/minecraft/block/dispenser/DispenserBehavior$7" }) -public abstract class DispenserBehaviorMobHeadMixin extends FallibleItemDispenserBehavior { +public abstract class DispenserBehaviorMobHeadMixin extends OptionalDispenseItemBehavior { /* difficult to maintain @Inject( method = "dispenseSilently(Lnet/minecraft/util/math/BlockPointer;Lnet/minecraft/item/ItemStack;)Lnet/minecraft/item/ItemStack;", diff --git a/src/main/java/carpetextra/mixins/DispenserBlockEntity_craftingMixin.java b/src/main/java/carpetextra/mixins/DispenserBlockEntity_craftingMixin.java index 6fd8e40d..f9f14d11 100644 --- a/src/main/java/carpetextra/mixins/DispenserBlockEntity_craftingMixin.java +++ b/src/main/java/carpetextra/mixins/DispenserBlockEntity_craftingMixin.java @@ -2,22 +2,22 @@ import carpetextra.CarpetExtraSettings; import carpetextra.fakes.DispenserBlockEntityInterface; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.block.entity.LootableContainerBlockEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.DispenserBlockEntity; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(DispenserBlockEntity.class) -public abstract class DispenserBlockEntity_craftingMixin extends LootableContainerBlockEntity implements DispenserBlockEntityInterface +public abstract class DispenserBlockEntity_craftingMixin extends RandomizableContainerBlockEntity implements DispenserBlockEntityInterface { - @Shadow private DefaultedList inventory; + @Shadow private NonNullList items; protected DispenserBlockEntity_craftingMixin(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { super(blockEntityType, blockPos, blockState); @@ -25,26 +25,26 @@ protected DispenserBlockEntity_craftingMixin(BlockEntityType blockEntityType, @Override - public DefaultedList getInventory() + public NonNullList getInventory() { - return inventory; + return items; } @Override - public boolean isValid(int slot, ItemStack stack) + public boolean canPlaceItem(int slot, ItemStack stack) { - if (CarpetExtraSettings.autoCraftingDropper && world != null) + if (CarpetExtraSettings.autoCraftingDropper && level != null) { - BlockState state = world.getBlockState(pos); + BlockState state = level.getBlockState(worldPosition); if (state.getBlock() == Blocks.DROPPER) { - if (world.getBlockState(pos.offset(state.get(DispenserBlock.FACING))).getBlock() == Blocks.CRAFTING_TABLE) + if (level.getBlockState(worldPosition.relative(state.getValue(DispenserBlock.FACING))).getBlock() == Blocks.CRAFTING_TABLE) { - return inventory.get(slot).isEmpty(); + return items.get(slot).isEmpty(); } } } - return super.isValid(slot, stack); + return super.canPlaceItem(slot, stack); } } diff --git a/src/main/java/carpetextra/mixins/DispenserBlockMixin.java b/src/main/java/carpetextra/mixins/DispenserBlockMixin.java index 9006220a..0395afd1 100644 --- a/src/main/java/carpetextra/mixins/DispenserBlockMixin.java +++ b/src/main/java/carpetextra/mixins/DispenserBlockMixin.java @@ -2,12 +2,12 @@ import carpetextra.CarpetExtraSettings; import carpetextra.utils.PlaceBlockDispenserBehavior; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.DispenserBehavior; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; +import net.minecraft.core.dispenser.DispenseItemBehavior; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -20,15 +20,15 @@ @Mixin(DispenserBlock.class) public abstract class DispenserBlockMixin { - @Shadow @Final public static Map BEHAVIORS; + @Shadow @Final public static Map DISPENSER_REGISTRY; // this is old code to keep dispenserPlacesBlocks working as is // new behaviors should go in CarpetExtraDispenserBehaviors class - @Inject(method = "getBehaviorForItem", at = @At("HEAD"), cancellable = true) - private void getBehaviorForItem(World world, ItemStack stack, CallbackInfoReturnable cir) + @Inject(method = "getDispenseMethod", at = @At("HEAD"), cancellable = true) + private void getBehaviorForItem(Level world, ItemStack stack, CallbackInfoReturnable cir) { Item item = stack.getItem(); - if (CarpetExtraSettings.dispenserPlacesBlocks && !BEHAVIORS.containsKey(item) && item instanceof BlockItem) + if (CarpetExtraSettings.dispenserPlacesBlocks && !DISPENSER_REGISTRY.containsKey(item) && item instanceof BlockItem) { if (PlaceBlockDispenserBehavior.canPlace(((BlockItem) item).getBlock())) diff --git a/src/main/java/carpetextra/mixins/DispenserBlock_GetCustomBehaviorMixin.java b/src/main/java/carpetextra/mixins/DispenserBlock_GetCustomBehaviorMixin.java index e8548f9d..40581610 100644 --- a/src/main/java/carpetextra/mixins/DispenserBlock_GetCustomBehaviorMixin.java +++ b/src/main/java/carpetextra/mixins/DispenserBlock_GetCustomBehaviorMixin.java @@ -15,40 +15,40 @@ import carpetextra.dispenser.DispenserEvent; import com.llamalad7.mixinextras.sugar.Local; -import net.minecraft.block.BlockState; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.DispenserBehavior; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; +import net.minecraft.core.BlockPos; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.DispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.entity.DispenserBlockEntity; +import net.minecraft.world.level.block.state.BlockState; @Mixin(DispenserBlock.class) public abstract class DispenserBlock_GetCustomBehaviorMixin { - @Shadow @Final public static Map BEHAVIORS; + @Shadow @Final public static Map DISPENSER_REGISTRY; @Inject( - method = "dispense", + method = "dispenseFrom", at = @At( value = "INVOKE", - target = "Lnet/minecraft/block/DispenserBlock;getBehaviorForItem(Lnet/minecraft/world/World;Lnet/minecraft/item/ItemStack;)Lnet/minecraft/block/dispenser/DispenserBehavior;" + target = "Lnet/minecraft/world/level/block/DispenserBlock;getDispenseMethod(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/core/dispenser/DispenseItemBehavior;" ), cancellable = true ) - private void dispenseCustomBehavior(ServerWorld world, BlockState state, BlockPos pos, CallbackInfo ci, @Local DispenserBlockEntity dispenserEntity, @Local BlockPointer pointer, @Local int slot, @Local ItemStack stack) { + private void dispenseCustomBehavior(ServerLevel world, BlockState state, BlockPos pos, CallbackInfo ci, @Local DispenserBlockEntity dispenserEntity, @Local BlockSource pointer, @Local int slot, @Local ItemStack stack) { // get custom behavior - DispenserBehavior behavior = CarpetExtraDispenserBehaviors.getCustomDispenserBehavior(world, pos, pointer, dispenserEntity, stack, BEHAVIORS); + DispenseItemBehavior behavior = CarpetExtraDispenserBehaviors.getCustomDispenserBehavior(world, pos, pointer, dispenserEntity, stack, DISPENSER_REGISTRY); // check if custom behavior exists if (behavior != null) { // run custom behavior Value previousStackSnapshot = null; - if (DispenserEvent.needed()) previousStackSnapshot = ValueConversions.of(stack, world.getRegistryManager()); + if (DispenserEvent.needed()) previousStackSnapshot = ValueConversions.of(stack, world.registryAccess()); ItemStack resultStack = behavior.dispense(pointer, stack); - dispenserEntity.setStack(slot, resultStack); + dispenserEntity.setItem(slot, resultStack); DispenserEvent.call(pointer, behavior, pos, previousStackSnapshot, resultStack); diff --git a/src/main/java/carpetextra/mixins/DispenserBlock_fallingBlockMixin.java b/src/main/java/carpetextra/mixins/DispenserBlock_fallingBlockMixin.java index d7a3fe8f..79fd298a 100644 --- a/src/main/java/carpetextra/mixins/DispenserBlock_fallingBlockMixin.java +++ b/src/main/java/carpetextra/mixins/DispenserBlock_fallingBlockMixin.java @@ -1,19 +1,19 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.FallingBlockEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.random.Random; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -24,36 +24,36 @@ public class DispenserBlock_fallingBlockMixin { // This is what happens to the code when a constructor is private and I just want to change the velocity before spawnEntity xD - private static final Vec3d INITIAL_VELOCITY = new Vec3d(0.0, 0.1, 0.0); + private static final Vec3 INITIAL_VELOCITY = new Vec3(0.0, 0.1, 0.0); - private void createFallingBlockWithVelocity(World world, BlockPos pos, BlockState state, Vec3d velocity) { + private void createFallingBlockWithVelocity(Level world, BlockPos pos, BlockState state, Vec3 velocity) { FallingBlockEntity fallingBlockEntity = new FallingBlockEntity(EntityType.FALLING_BLOCK, world); FallingBlockEntityAccessor fallingBlockAccessor = (FallingBlockEntityAccessor)fallingBlockEntity; - fallingBlockAccessor.setBlockState(state.contains(Properties.WATERLOGGED) ? state.with(Properties.WATERLOGGED, false) : state); - fallingBlockEntity.intersectionChecked = true; - Vec3d vecPos = Vec3d.ofBottomCenter(pos); - fallingBlockEntity.setPosition(vecPos); - fallingBlockEntity.setVelocity(velocity); - fallingBlockEntity.lastX = vecPos.x; - fallingBlockEntity.lastY = vecPos.y; - fallingBlockEntity.lastZ = vecPos.z; - fallingBlockEntity.setFallingBlockPos(fallingBlockEntity.getBlockPos()); - world.setBlockState(pos, state.getFluidState().getBlockState(), Block.NOTIFY_ALL); - world.spawnEntity(fallingBlockEntity); + fallingBlockAccessor.setBlockState(state.hasProperty(BlockStateProperties.WATERLOGGED) ? state.setValue(BlockStateProperties.WATERLOGGED, false) : state); + fallingBlockEntity.blocksBuilding = true; + Vec3 vecPos = Vec3.atBottomCenterOf(pos); + fallingBlockEntity.setPos(vecPos); + fallingBlockEntity.setDeltaMovement(velocity); + fallingBlockEntity.xo = vecPos.x; + fallingBlockEntity.yo = vecPos.y; + fallingBlockEntity.zo = vecPos.z; + fallingBlockEntity.setStartPos(fallingBlockEntity.blockPosition()); + world.setBlock(pos, state.getFluidState().createLegacyBlock(), Block.UPDATE_ALL); + world.addFreshEntity(fallingBlockEntity); } @Inject( - method = "scheduledTick", + method = "tick", at = @At("HEAD"), cancellable = true ) - public void onScheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random rand, CallbackInfo ci) { + public void onScheduledTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource rand, CallbackInfo ci) { if (CarpetExtraSettings.fallingBlockDispensers) { - Direction direction = state.get(DispenserBlock.FACING); - BlockPos facingPos = pos.offset(direction); + Direction direction = state.getValue(DispenserBlock.FACING); + BlockPos facingPos = pos.relative(direction); BlockState facingState = world.getBlockState(facingPos); - if (!facingState.isAir() && (!facingState.isOf(Blocks.WATER) && !facingState.isOf(Blocks.LAVA) || facingState.getFluidState().isStill())) { - Vec3d velocity = (state.isOf(Blocks.DROPPER) ? INITIAL_VELOCITY : INITIAL_VELOCITY.add(Vec3d.of((direction).getVector()))); + if (!facingState.isAir() && (!facingState.is(Blocks.WATER) && !facingState.is(Blocks.LAVA) || facingState.getFluidState().isSource())) { + Vec3 velocity = (state.is(Blocks.DROPPER) ? INITIAL_VELOCITY : INITIAL_VELOCITY.add(Vec3.atLowerCornerOf((direction).getUnitVec3i()))); createFallingBlockWithVelocity(world, facingPos, facingState, velocity); ci.cancel(); } diff --git a/src/main/java/carpetextra/mixins/DropperBlock_craftingMixin.java b/src/main/java/carpetextra/mixins/DropperBlock_craftingMixin.java index 26d0cdbb..11188b59 100644 --- a/src/main/java/carpetextra/mixins/DropperBlock_craftingMixin.java +++ b/src/main/java/carpetextra/mixins/DropperBlock_craftingMixin.java @@ -5,26 +5,26 @@ import carpetextra.CarpetExtraSettings; import carpetextra.fakes.DispenserBlockEntityInterface; import carpetextra.utils.VoidContainer; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.DropperBlock; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.entity.ItemEntity; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.CraftingRecipe; -import net.minecraft.recipe.RecipeEntry; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.input.CraftingRecipeInput; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.inventory.TransientCraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.DropperBlock; +import net.minecraft.world.level.block.entity.DispenserBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -35,17 +35,17 @@ public class DropperBlock_craftingMixin extends DispenserBlock { @Unique private static final Random rand = new Random(); - protected DropperBlock_craftingMixin(Settings settings) + protected DropperBlock_craftingMixin(Properties settings) { super(settings); } @Override - public int getComparatorOutput(BlockState state, World world, BlockPos pos, Direction direction) + public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos, Direction direction) { if (CarpetExtraSettings.autoCraftingDropper) { - BlockPos front = pos.offset(world.getBlockState(pos).get(DispenserBlock.FACING)); + BlockPos front = pos.relative(world.getBlockState(pos).getValue(DispenserBlock.FACING)); if (world.getBlockState(front).getBlock() == Blocks.CRAFTING_TABLE) { DispenserBlockEntity dispenser = (DispenserBlockEntity) world.getBlockEntity(pos); @@ -60,80 +60,80 @@ public int getComparatorOutput(BlockState state, World world, BlockPos pos, Dire } } } - return super.getComparatorOutput(state, world, pos, direction); + return super.getAnalogOutputSignal(state, world, pos, direction); } - @Unique private void spawn(World world, double x, double y, double z, ItemStack stack) { + @Unique private void spawn(Level world, double x, double y, double z, ItemStack stack) { while(!stack.isEmpty()) { ItemEntity item = new ItemEntity(world, x, y, z, stack.split(rand.nextInt(21) + 10)); - item.setVelocity( + item.setDeltaMovement( (rand.nextDouble()-rand.nextDouble()) * 0.05, rand.nextDouble() * 0.05, (rand.nextDouble()-rand.nextDouble()) * 0.05 ); - world.spawnEntity(item); + world.addFreshEntity(item); } } - @Inject(method = "dispense", at = @At("HEAD"), cancellable = true) - private void tryCraft(ServerWorld world, BlockState state, BlockPos pos, CallbackInfo ci) + @Inject(method = "dispenseFrom", at = @At("HEAD"), cancellable = true) + private void tryCraft(ServerLevel world, BlockState state, BlockPos pos, CallbackInfo ci) { if (!CarpetExtraSettings.autoCraftingDropper) return; - BlockPos front = pos.offset(world.getBlockState(pos).get(DispenserBlock.FACING)); + BlockPos front = pos.relative(world.getBlockState(pos).getValue(DispenserBlock.FACING)); if (world.getBlockState(front).getBlock() != Blocks.CRAFTING_TABLE) return; DispenserBlockEntity dispenser = (DispenserBlockEntity) world.getBlockEntity(pos); if (dispenser == null) return; - CraftingInventory craftingInventory = new CraftingInventory(new VoidContainer(), 3, 3); - for (int i=0; i < 9; i++) craftingInventory.setStack(i, dispenser.getStack(i)); - CraftingRecipeInput recipeInput = craftingInventory.createRecipeInput(); - RecipeEntry recipe = world.getRecipeManager().getFirstMatch(RecipeType.CRAFTING, recipeInput, world).orElse(null); + TransientCraftingContainer craftingInventory = new TransientCraftingContainer(new VoidContainer(), 3, 3); + for (int i=0; i < 9; i++) craftingInventory.setItem(i, dispenser.getItem(i)); + CraftingInput recipeInput = craftingInventory.asCraftInput(); + RecipeHolder recipe = world.recipeAccess().getRecipeFor(RecipeType.CRAFTING, recipeInput, world).orElse(null); if (recipe == null) return; // crafting it - Vec3d target = Vec3d.ofBottomCenter(front).add(0.0, 0.2, 0.0); - ItemStack result = recipe.value().craft(recipeInput, world.getRegistryManager()); + Vec3 target = Vec3.atBottomCenterOf(front).add(0.0, 0.2, 0.0); + ItemStack result = recipe.value().assemble(recipeInput, world.registryAccess()); spawn(world, target.x, target.y, target.z, result); // copied from CraftingResultSlot.onTakeItem() - CraftingRecipeInput.Positioned positioned = craftingInventory.createPositionedRecipeInput(); - CraftingRecipeInput input = positioned.input(); + CraftingInput.Positioned positioned = craftingInventory.asPositionedCraftInput(); + CraftingInput input = positioned.input(); int left = positioned.left(); int top = positioned.top(); - DefaultedList defaultedList = world.getRecipeManager().getFirstMatch(RecipeType.CRAFTING, recipeInput, world).map((r) -> - r.value().getRecipeRemainders(input)).orElseGet(() -> handleInput(input)); + NonNullList defaultedList = world.recipeAccess().getRecipeFor(RecipeType.CRAFTING, recipeInput, world).map((r) -> + r.value().getRemainingItems(input)).orElseGet(() -> handleInput(input)); - for (int row = 0; row < recipeInput.getHeight(); ++row) { - for (int column = 0; column < recipeInput.getWidth(); ++column) { + for (int row = 0; row < recipeInput.height(); ++row) { + for (int column = 0; column < recipeInput.width(); ++column) { int index = column + left + (row + top) * craftingInventory.getWidth(); - ItemStack itemStack = dispenser.getStack(index); - ItemStack itemStack2 = defaultedList.get(column + row * recipeInput.getWidth()); + ItemStack itemStack = dispenser.getItem(index); + ItemStack itemStack2 = defaultedList.get(column + row * recipeInput.width()); if (!itemStack.isEmpty()) { - dispenser.removeStack(index, 1); - itemStack = dispenser.getStack(index); + dispenser.removeItem(index, 1); + itemStack = dispenser.getItem(index); } if (!itemStack2.isEmpty()) { if (itemStack.isEmpty()) { - dispenser.setStack(index, itemStack2); - } else if (ItemStack.areItemsAndComponentsEqual(itemStack, itemStack2)) { - itemStack2.increment(itemStack.getCount()); - dispenser.setStack(index, itemStack2); + dispenser.setItem(index, itemStack2); + } else if (ItemStack.isSameItemSameComponents(itemStack, itemStack2)) { + itemStack2.grow(itemStack.getCount()); + dispenser.setItem(index, itemStack2); } else { spawn(world, target.x, target.y, target.z, itemStack2); } } } } - world.playSound(null, pos, SoundEvents.ENTITY_VILLAGER_WORK_MASON, SoundCategory.BLOCKS, 0.2f, 2.0f); + world.playSound(null, pos, SoundEvents.VILLAGER_WORK_MASON, SoundSource.BLOCKS, 0.2f, 2.0f); ci.cancel(); } - @Unique private static DefaultedList handleInput(CraftingRecipeInput input) + @Unique private static NonNullList handleInput(CraftingInput input) { - DefaultedList list = DefaultedList.ofSize(input.size(), ItemStack.EMPTY); + NonNullList list = NonNullList.withSize(input.size(), ItemStack.EMPTY); for (int i = 0; i < list.size(); ++i) { - list.set(i, input.getStackInSlot(i)); + list.set(i, input.getItem(i)); } return list; diff --git a/src/main/java/carpetextra/mixins/EntityMixin.java b/src/main/java/carpetextra/mixins/EntityMixin.java index 96d57cc2..a057c17b 100644 --- a/src/main/java/carpetextra/mixins/EntityMixin.java +++ b/src/main/java/carpetextra/mixins/EntityMixin.java @@ -1,11 +1,11 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.Entity; -import net.minecraft.storage.ReadView; -import net.minecraft.storage.WriteView; -import net.minecraft.storage.WriteView.ListAppender; -import net.minecraft.util.math.Box; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; +import net.minecraft.world.level.storage.ValueOutput.TypedOutputList; +import net.minecraft.world.phys.AABB; import java.util.Iterator; @@ -22,11 +22,11 @@ @Mixin(Entity.class) public abstract class EntityMixin { - @Shadow public abstract Box getBoundingBox(); + @Shadow public abstract AABB getBoundingBox(); //@Shadow protected abstract NbtList toNbtList(double... doubles_1); - @Shadow protected abstract boolean shouldSetPositionOnLoad(); + @Shadow protected abstract boolean repositionEntityAfterLoad(); @Shadow public abstract double getX(); @@ -34,53 +34,53 @@ public abstract class EntityMixin @Shadow public abstract double getZ(); - @Shadow public abstract void setBoundingBox(Box box_1); + @Shadow public abstract void setBoundingBox(AABB box_1); - @Shadow protected abstract void refreshPosition(); + @Shadow protected abstract void reapplyPosition(); @Unique - protected void fillDoubleAppender(ListAppender list, double... values) { + protected void fillDoubleAppender(TypedOutputList list, double... values) { for (final double value : values) { list.add(value); } } @Inject( - method = "writeData", + method = "saveWithoutId", at = @At(value = "INVOKE", shift = At.Shift.BEFORE, ordinal = 0, - target = "Lnet/minecraft/storage/WriteView;putDouble(Ljava/lang/String;D)V") + target = "Lnet/minecraft/world/level/storage/ValueOutput;putDouble(Ljava/lang/String;D)V") ) - private void onToTag(WriteView view, CallbackInfo ci) + private void onToTag(ValueOutput view, CallbackInfo ci) { if (CarpetExtraSettings.reloadSuffocationFix) { - Box box = this.getBoundingBox(); - fillDoubleAppender(view.getListAppender("CM_Box", Codec.DOUBLE), box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ); + AABB box = this.getBoundingBox(); + fillDoubleAppender(view.list("CM_Box", Codec.DOUBLE), box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ); } } - @Redirect(method = "readData", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;shouldSetPositionOnLoad()Z")) + @Redirect(method = "load", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;repositionEntityAfterLoad()Z")) private boolean cancelShouldSetPositionOnLoad(Entity entity) { return false; } @Inject( - method = "readData", + method = "load", at = @At(value = "INVOKE", shift = At.Shift.AFTER, - target = "Lnet/minecraft/entity/Entity;readCustomData(Lnet/minecraft/storage/ReadView;)V") + target = "Lnet/minecraft/world/entity/Entity;readAdditionalSaveData(Lnet/minecraft/world/level/storage/ValueInput;)V") ) - private void onFromTag(ReadView view, CallbackInfo ci) + private void onFromTag(ValueInput view, CallbackInfo ci) { - if (this.shouldSetPositionOnLoad()) + if (this.repositionEntityAfterLoad()) { - this.refreshPosition(); + this.reapplyPosition(); } - if (CarpetExtraSettings.reloadSuffocationFix && view.getOptionalListReadView("CM_Box").isPresent()) + if (CarpetExtraSettings.reloadSuffocationFix && view.childrenList("CM_Box").isPresent()) { - Iterator boxTag = view.getTypedListView("CM_Box", Codec.DOUBLE).stream().iterator(); + Iterator boxTag = view.listOrEmpty("CM_Box", Codec.DOUBLE).stream().iterator(); - Box box = new Box(boxTag.next(), boxTag.next(), + AABB box = new AABB(boxTag.next(), boxTag.next(), boxTag.next(), boxTag.next(), boxTag.next(), boxTag.next()); diff --git a/src/main/java/carpetextra/mixins/FallingBlockEntityAccessor.java b/src/main/java/carpetextra/mixins/FallingBlockEntityAccessor.java index 47f97fcd..6787f541 100644 --- a/src/main/java/carpetextra/mixins/FallingBlockEntityAccessor.java +++ b/src/main/java/carpetextra/mixins/FallingBlockEntityAccessor.java @@ -1,7 +1,7 @@ package carpetextra.mixins; -import net.minecraft.block.BlockState; -import net.minecraft.entity.FallingBlockEntity; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; diff --git a/src/main/java/carpetextra/mixins/FallingBlockEntityMixin.java b/src/main/java/carpetextra/mixins/FallingBlockEntityMixin.java index c336835e..5a6c79b8 100644 --- a/src/main/java/carpetextra/mixins/FallingBlockEntityMixin.java +++ b/src/main/java/carpetextra/mixins/FallingBlockEntityMixin.java @@ -1,17 +1,16 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.FallingBlockEntity; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldEvents; - +import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LevelEvent; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -33,30 +32,31 @@ public abstract class FallingBlockEntityMixin extends Entity Blocks.PACKED_ICE, Blocks.BLUE_ICE ); - public FallingBlockEntityMixin(EntityType type, World world) + public FallingBlockEntityMixin(EntityType type, Level world) { super(type, world); } - @Inject(method = "(Lnet/minecraft/world/World;DDDLnet/minecraft/block/BlockState;)V", at = @At("RETURN")) - private void onCtor(World world, double x, double y, double z, BlockState state, CallbackInfo ci) + @Inject(method = "(Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/level/block/state/BlockState;)V", at = @At("RETURN")) + private void onCtor(Level world, double x, double y, double z, BlockState state, CallbackInfo ci) { this.iceCount = 0; } @Inject(method = "tick", cancellable = true, at = @At( value = "FIELD", - target = "Lnet/minecraft/entity/FallingBlockEntity;destroyedOnLanding:Z", + target = "Lnet/minecraft/world/entity/item/FallingBlockEntity;cancelDrop:Z", shift = At.Shift.BEFORE )) + @SuppressWarnings("resource") private void onTick(CallbackInfo ci) { - if (getBlockState().isIn(BlockTags.ANVIL)) + if (getBlockState().is(BlockTags.ANVIL)) { - World world = this.getEntityWorld(); + Level world = this.level(); if (CarpetExtraSettings.renewableIce) { - Block below = world.getBlockState(BlockPos.ofFloored(this.getX(), this.getY() - 0.059999999776482582D, this.getZ())).getBlock(); + Block below = world.getBlockState(BlockPos.containing(this.getX(), this.getY() - 0.059999999776482582D, this.getZ())).getBlock(); if (iceProgression.containsKey(below)) { if (currentIce != below) @@ -66,24 +66,24 @@ private void onTick(CallbackInfo ci) } if (iceCount < 2) { - world.breakBlock(getBlockPos().down(), false, null); + world.destroyBlock(blockPosition().below(), false, null); this.setOnGround(false); iceCount++; ci.cancel(); } else { - BlockState newBlock = iceProgression.get(below).getDefaultState(); - world.setBlockState(getBlockPos().down(), newBlock, 3); - world.syncWorldEvent(WorldEvents.BLOCK_BROKEN, getBlockPos().down(), Block.getRawIdFromState(newBlock)); + BlockState newBlock = iceProgression.get(below).defaultBlockState(); + world.setBlock(blockPosition().below(), newBlock, 3); + world.levelEvent(LevelEvent.PARTICLES_DESTROY_BLOCK, blockPosition().below(), Block.getId(newBlock)); } } } - if (CarpetExtraSettings.renewableSand && world.getBlockState(BlockPos.ofFloored(this.getX(), this.getY() - 0.06, this.getZ())).getBlock() == Blocks.COBBLESTONE) + if (CarpetExtraSettings.renewableSand && world.getBlockState(BlockPos.containing(this.getX(), this.getY() - 0.06, this.getZ())).getBlock() == Blocks.COBBLESTONE) { - world.breakBlock(getBlockPos().down(), false); - world.setBlockState(getBlockPos().down(), Blocks.SAND.getDefaultState(), 3); + world.destroyBlock(blockPosition().below(), false); + world.setBlock(blockPosition().below(), Blocks.SAND.defaultBlockState(), 3); } } } diff --git a/src/main/java/carpetextra/mixins/FallingBlockMixin.java b/src/main/java/carpetextra/mixins/FallingBlockMixin.java index 33edb11a..5888769a 100644 --- a/src/main/java/carpetextra/mixins/FallingBlockMixin.java +++ b/src/main/java/carpetextra/mixins/FallingBlockMixin.java @@ -2,14 +2,14 @@ import carpetextra.CarpetExtraSettings; import carpetextra.helpers.DragonEggBedrockBreaking; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.DragonEggBlock; -import net.minecraft.block.FallingBlock; -import net.minecraft.entity.FallingBlockEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DragonEggBlock; +import net.minecraft.world.level.block.FallingBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -20,33 +20,33 @@ public abstract class FallingBlockMixin extends Block { @Shadow - public static boolean canFallThrough(BlockState state) + public static boolean isFree(BlockState state) { throw new AssertionError(); } - @Shadow protected abstract void configureFallingBlockEntity(FallingBlockEntity fallingBlockEntity_1); + @Shadow protected abstract void falling(FallingBlockEntity fallingBlockEntity_1); - public FallingBlockMixin(Settings settings) + public FallingBlockMixin(Properties settings) { super(settings); } @SuppressWarnings("ConstantConditions") - @Inject(method = "scheduledTick", at = @At("HEAD"), cancellable = true) - private void onTryStartFalling(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) + @Inject(method = "tick", at = @At("HEAD"), cancellable = true) + private void onTryStartFalling(BlockState state, ServerLevel world, BlockPos pos, RandomSource random, CallbackInfo ci) { if (CarpetExtraSettings.dragonEggBedrockBreaking && (FallingBlock)(Object)this instanceof DragonEggBlock) { - if (canFallThrough(world.getBlockState(pos.down(1))) && pos.getY() >= world.getBottomY()) + if (isFree(world.getBlockState(pos.below(1))) && pos.getY() >= world.getMinY()) { if (!DragonEggBedrockBreaking.fallInstantly && - world.shouldTickEntityAt(pos)) + world.isPositionEntityTicking(pos)) { - if (!world.isClient()) + if (!world.isClientSide()) { - FallingBlockEntity fallingBlock = FallingBlockEntity.spawnFromBlock(world, pos, world.getBlockState(pos) ); - this.configureFallingBlockEntity(fallingBlock); + FallingBlockEntity fallingBlock = FallingBlockEntity.fall(world, pos, world.getBlockState(pos) ); + this.falling(fallingBlock); //serverWorld_1.spawnEntity(fallingBlock); } } @@ -59,16 +59,16 @@ private void onTryStartFalling(BlockState state, ServerWorld world, BlockPos pos BlockPos blockPos; - int minY = CarpetExtraSettings.y0DragonEggBedrockBreaking ? world.getBottomY() - 1 : world.getBottomY(); + int minY = CarpetExtraSettings.y0DragonEggBedrockBreaking ? world.getMinY() - 1 : world.getMinY(); - for (blockPos = pos.down(1); canFallThrough(world.getBlockState(blockPos)) && blockPos.getY() > minY; blockPos = blockPos.down(1)) + for (blockPos = pos.below(1); isFree(world.getBlockState(blockPos)) && blockPos.getY() > minY; blockPos = blockPos.below(1)) { ; } if (blockPos.getY() > minY) { - world.setBlockState(blockPos, this.getDefaultState()); + world.setBlockAndUpdate(blockPos, this.defaultBlockState()); } } } diff --git a/src/main/java/carpetextra/mixins/FarmerVillagerTask_wartFarmMixin.java b/src/main/java/carpetextra/mixins/FarmerVillagerTask_wartFarmMixin.java index 8c38da50..471b85ff 100644 --- a/src/main/java/carpetextra/mixins/FarmerVillagerTask_wartFarmMixin.java +++ b/src/main/java/carpetextra/mixins/FarmerVillagerTask_wartFarmMixin.java @@ -1,28 +1,27 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.CropBlock; -import net.minecraft.block.NetherWartBlock; -import net.minecraft.entity.ai.brain.MemoryModuleState; -import net.minecraft.entity.ai.brain.MemoryModuleType; -import net.minecraft.entity.ai.brain.task.FarmerVillagerTask; -import net.minecraft.entity.ai.brain.task.MultiTickTask; -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.inventory.SimpleInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.registry.Registries; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPos; -import net.minecraft.village.VillagerData; -import net.minecraft.village.VillagerProfession; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.ai.behavior.Behavior; +import net.minecraft.world.entity.ai.behavior.HarvestFarmland; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.memory.MemoryStatus; +import net.minecraft.world.entity.npc.villager.Villager; +import net.minecraft.world.entity.npc.villager.VillagerData; +import net.minecraft.world.entity.npc.villager.VillagerProfession; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.CropBlock; +import net.minecraft.world.level.block.NetherWartBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -33,67 +32,67 @@ import java.util.Map; import java.util.Optional; -@Mixin(FarmerVillagerTask.class) -public abstract class FarmerVillagerTask_wartFarmMixin extends MultiTickTask +@Mixin(HarvestFarmland.class) +public abstract class FarmerVillagerTask_wartFarmMixin extends Behavior { //@Shadow private boolean ableToPlant; - @Shadow /*@Nullable*/ private BlockPos currentTarget; + @Shadow /*@Nullable*/ private BlockPos aboveFarmlandPos; private boolean isFarmingCleric; - public FarmerVillagerTask_wartFarmMixin(Map, MemoryModuleState> requiredMemoryState) + public FarmerVillagerTask_wartFarmMixin(Map, MemoryStatus> requiredMemoryState) { super(requiredMemoryState); } - @Redirect(method = "shouldRun", at = @At( + @Redirect(method = "checkExtraStartConditions", at = @At( value = "INVOKE", - target = "Lnet/minecraft/village/VillagerData;profession()Lnet/minecraft/registry/entry/RegistryEntry;" + target = "Lnet/minecraft/world/entity/npc/villager/VillagerData;profession()Lnet/minecraft/core/Holder;" )) - private RegistryEntry disguiseAsFarmer(VillagerData villagerData) + private Holder disguiseAsFarmer(VillagerData villagerData) { isFarmingCleric = false; - RegistryEntry profession = villagerData.profession(); - if (CarpetExtraSettings.clericsFarmWarts && profession.matchesKey(VillagerProfession.CLERIC)) + Holder profession = villagerData.profession(); + if (CarpetExtraSettings.clericsFarmWarts && profession.is(VillagerProfession.CLERIC)) { isFarmingCleric = true; - return Registries.VILLAGER_PROFESSION.getEntry(Registries.VILLAGER_PROFESSION.get(VillagerProfession.FARMER)); + return BuiltInRegistries.VILLAGER_PROFESSION.wrapAsHolder(BuiltInRegistries.VILLAGER_PROFESSION.getValue(VillagerProfession.FARMER)); } return villagerData.profession(); } - @Inject(method = "isSuitableTarget", at = @At("HEAD"), cancellable = true) - private void isValidSoulSand(BlockPos pos, ServerWorld world, CallbackInfoReturnable cir) + @Inject(method = "validPos", at = @At("HEAD"), cancellable = true) + private void isValidSoulSand(BlockPos pos, ServerLevel world, CallbackInfoReturnable cir) { if (isFarmingCleric) { BlockState blockState = world.getBlockState(pos); Block block = blockState.getBlock(); - Block block2 = world.getBlockState(pos.down()).getBlock(); + Block block2 = world.getBlockState(pos.below()).getBlock(); cir.setReturnValue( - block == Blocks.NETHER_WART && blockState.get(NetherWartBlock.AGE)== 3 || + block == Blocks.NETHER_WART && blockState.getValue(NetherWartBlock.AGE)== 3 || blockState.isAir() && block2 == Blocks.SOUL_SAND); } } - @Redirect(method = "keepRunning", at = @At( + @Redirect(method = "tick", at = @At( value = "INVOKE", - target = "Lnet/minecraft/server/world/ServerWorld;getBlockState(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState;", + target = "Lnet/minecraft/server/level/ServerLevel;getBlockState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;", ordinal = 0 ) ) - private BlockState getWartBlockState(ServerWorld serverWorld, BlockPos pos) + private BlockState getWartBlockState(ServerLevel serverWorld, BlockPos pos) { BlockState state = serverWorld.getBlockState(pos); - if (isFarmingCleric && state.getBlock() == Blocks.NETHER_WART && state.get(NetherWartBlock.AGE) == 3) + if (isFarmingCleric && state.getBlock() == Blocks.NETHER_WART && state.getValue(NetherWartBlock.AGE) == 3) { - return ((CropBlock)Blocks.WHEAT).withAge(((CropBlock)Blocks.WHEAT).getMaxAge()); + return ((CropBlock)Blocks.WHEAT).getStateForAge(((CropBlock)Blocks.WHEAT).getMaxAge()); } return state; } - @Redirect(method = "keepRunning", at = @At( + @Redirect(method = "tick", at = @At( value = "INVOKE", - target = "Lnet/minecraft/block/BlockState;getBlock()Lnet/minecraft/block/Block;", + target = "Lnet/minecraft/world/level/block/state/BlockState;getBlock()Lnet/minecraft/world/level/block/Block;", ordinal = 1 )) private Block getFarmlangBLock(BlockState blockState) @@ -106,36 +105,36 @@ private Block getFarmlangBLock(BlockState blockState) return block; } - @Redirect(method = "keepRunning", at = @At( + @Redirect(method = "tick", at = @At( value = "INVOKE", - target = "Lnet/minecraft/inventory/SimpleInventory;size()I" + target = "Lnet/minecraft/world/SimpleContainer;getContainerSize()I" )) - private int plantWart(SimpleInventory basicInventory, ServerWorld serverWorld, VillagerEntity villagerEntity, long l) + private int plantWart(SimpleContainer basicInventory, ServerLevel serverWorld, Villager villagerEntity, long l) { if (isFarmingCleric) // fill cancel that for loop by setting length to 0 { - for(int i = 0; i < basicInventory.size(); ++i) + for(int i = 0; i < basicInventory.getContainerSize(); ++i) { - ItemStack itemStack = basicInventory.getStack(i); + ItemStack itemStack = basicInventory.getItem(i); boolean bl = false; if (!itemStack.isEmpty()) { if (itemStack.getItem() == Items.NETHER_WART) { - serverWorld.setBlockState(currentTarget, Blocks.NETHER_WART.getDefaultState(), 3); + serverWorld.setBlock(aboveFarmlandPos, Blocks.NETHER_WART.defaultBlockState(), 3); bl = true; } } if (bl) { - serverWorld.playSound(null, - currentTarget.getX(), currentTarget.getY(), this.currentTarget.getZ(), - SoundEvents.ITEM_NETHER_WART_PLANT, SoundCategory.BLOCKS, 1.0F, 1.0F, serverWorld.getRandom().nextLong()); - itemStack.decrement(1); + serverWorld.playSeededSound(null, + aboveFarmlandPos.getX(), aboveFarmlandPos.getY(), this.aboveFarmlandPos.getZ(), + SoundEvents.NETHER_WART_PLANTED, SoundSource.BLOCKS, 1.0F, 1.0F, serverWorld.getRandom().nextLong()); + itemStack.shrink(1); if (itemStack.isEmpty()) { - basicInventory.setStack(i, ItemStack.EMPTY); + basicInventory.setItem(i, ItemStack.EMPTY); } break; } @@ -143,7 +142,7 @@ private int plantWart(SimpleInventory basicInventory, ServerWorld serverWorld, V return 0; } - return basicInventory.size(); + return basicInventory.getContainerSize(); } diff --git a/src/main/java/carpetextra/mixins/FlowerPotBlockMixin.java b/src/main/java/carpetextra/mixins/FlowerPotBlockMixin.java index 64d76526..11659def 100644 --- a/src/main/java/carpetextra/mixins/FlowerPotBlockMixin.java +++ b/src/main/java/carpetextra/mixins/FlowerPotBlockMixin.java @@ -1,6 +1,5 @@ package carpetextra.mixins; -import net.minecraft.server.world.ServerWorld; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -10,45 +9,45 @@ import carpetextra.helpers.FlowerPotHelper; import com.llamalad7.mixinextras.sugar.Local; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FlowerPotBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FlowerPotBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; @Mixin(FlowerPotBlock.class) public abstract class FlowerPotBlockMixin extends Block { - @Shadow @Final private Block content; + @Shadow @Final private Block potted; - public FlowerPotBlockMixin(Settings settings) + public FlowerPotBlockMixin(Properties settings) { super(settings); } @Inject( - method = "onUseWithItem", + method = "useItemOn", at = @At( value = "INVOKE", - target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z", + target = "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z", ordinal = 0 ) ) - private void onActivate(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit, CallbackInfoReturnable cir, @Local(ordinal = 1) BlockState blockState) { + private void onActivate(ItemStack stack, BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit, CallbackInfoReturnable cir, @Local(ordinal = 1) BlockState blockState) { // check if chunk should add force load when flower is placed in pot - FlowerPotHelper.updateLoadStatus(world, pos, ((FlowerPotBlock) blockState.getBlock()).getContent(), true); + FlowerPotHelper.updateLoadStatus(world, pos, ((FlowerPotBlock) blockState.getBlock()).getPotted(), true); } @Override - protected void onStateReplaced(BlockState state, ServerWorld world, BlockPos pos, boolean moved) { + protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel world, BlockPos pos, boolean moved) { // check if chunk should remove force load when flower pot is broken - FlowerPotHelper.updateLoadStatus(world, pos, this.content, false); - super.onStateReplaced(state, world, pos, moved); + FlowerPotHelper.updateLoadStatus(world, pos, this.potted, false); + super.affectNeighborsAfterRemoval(state, world, pos, moved); } } diff --git a/src/main/java/carpetextra/mixins/FlowerPotBlock_ContentAccessorMixin.java b/src/main/java/carpetextra/mixins/FlowerPotBlock_ContentAccessorMixin.java index 52d65084..5aab8f63 100644 --- a/src/main/java/carpetextra/mixins/FlowerPotBlock_ContentAccessorMixin.java +++ b/src/main/java/carpetextra/mixins/FlowerPotBlock_ContentAccessorMixin.java @@ -5,12 +5,12 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.block.Block; -import net.minecraft.block.FlowerPotBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FlowerPotBlock; @Mixin(FlowerPotBlock.class) public interface FlowerPotBlock_ContentAccessorMixin { - @Accessor("CONTENT_TO_POTTED") + @Accessor("POTTED_BY_CONTENT") static Map getPottedBlocksMap() { throw new AssertionError(); } diff --git a/src/main/java/carpetextra/mixins/FoxMateGoalMixin.java b/src/main/java/carpetextra/mixins/FoxMateGoalMixin.java index 6ebf6e0e..dd53d38f 100644 --- a/src/main/java/carpetextra/mixins/FoxMateGoalMixin.java +++ b/src/main/java/carpetextra/mixins/FoxMateGoalMixin.java @@ -1,19 +1,19 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.ai.goal.AnimalMateGoal; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.ai.goal.BreedGoal; +import net.minecraft.world.entity.animal.Animal; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(targets = "net.minecraft.entity.passive.FoxEntity$MateGoal") -public abstract class FoxMateGoalMixin extends AnimalMateGoal { +@Mixin(targets = "net.minecraft.world.entity.animal.fox.Fox$FoxBreedGoal") +public abstract class FoxMateGoalMixin extends BreedGoal { - public FoxMateGoalMixin(AnimalEntity fox, double speed) { + public FoxMateGoalMixin(Animal fox, double speed) { super(fox, speed); } @@ -21,15 +21,15 @@ public FoxMateGoalMixin(AnimalEntity fox, double speed) { method = "breed()V", at = @At( value = "INVOKE", - target = "Lnet/minecraft/server/world/ServerWorld;spawnEntity(Lnet/minecraft/entity/Entity;)Z", + target = "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z", ordinal = 0 ), cancellable = true ) protected void preventDispenserSpawningExperience(CallbackInfo ci) { - ServerPlayerEntity player = super.animal.getLovingPlayer(); - if (player == null && super.mate != null) { - player = super.mate.getLovingPlayer(); + ServerPlayer player = super.animal.getLoveCause(); + if (player == null && super.partner != null) { + player = super.partner.getLoveCause(); } if (player == null && CarpetExtraSettings.dispensersFeedAnimals) { ci.cancel(); diff --git a/src/main/java/carpetextra/mixins/HoeItem_TilledBlocksAccessorMixin.java b/src/main/java/carpetextra/mixins/HoeItem_TilledBlocksAccessorMixin.java index e676c3fe..3fbf3bc1 100644 --- a/src/main/java/carpetextra/mixins/HoeItem_TilledBlocksAccessorMixin.java +++ b/src/main/java/carpetextra/mixins/HoeItem_TilledBlocksAccessorMixin.java @@ -9,14 +9,14 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.block.Block; -import net.minecraft.item.HoeItem; -import net.minecraft.item.ItemUsageContext; +import net.minecraft.world.item.HoeItem; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.block.Block; @Mixin(HoeItem.class) public interface HoeItem_TilledBlocksAccessorMixin { - @Accessor("TILLING_ACTIONS") - static Map, Consumer>> getTilledBlocks() { + @Accessor("TILLABLES") + static Map, Consumer>> getTilledBlocks() { throw new AssertionError(); } } diff --git a/src/main/java/carpetextra/mixins/HopperMinecartEntity_transferItemsOutFeatureMixin.java b/src/main/java/carpetextra/mixins/HopperMinecartEntity_transferItemsOutFeatureMixin.java index 18f0fa39..729e38c3 100644 --- a/src/main/java/carpetextra/mixins/HopperMinecartEntity_transferItemsOutFeatureMixin.java +++ b/src/main/java/carpetextra/mixins/HopperMinecartEntity_transferItemsOutFeatureMixin.java @@ -1,24 +1,24 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.AbstractRailBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.Hopper; -import net.minecraft.block.entity.HopperBlockEntity; -import net.minecraft.block.enums.RailShape; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.vehicle.HopperMinecartEntity; -import net.minecraft.entity.vehicle.StorageMinecartEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.inventory.SidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.Mth; +import net.minecraft.world.Container; +import net.minecraft.world.WorldlyContainer; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.minecart.AbstractMinecartContainer; +import net.minecraft.world.entity.vehicle.minecart.MinecartHopper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseRailBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.Hopper; +import net.minecraft.world.level.block.entity.HopperBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.RailShape; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -27,39 +27,39 @@ import java.util.stream.IntStream; -import static net.minecraft.block.entity.HopperBlockEntity.transfer; +import static net.minecraft.world.level.block.entity.HopperBlockEntity.addItem; -@Mixin(HopperMinecartEntity.class) -public abstract class HopperMinecartEntity_transferItemsOutFeatureMixin extends StorageMinecartEntity implements Hopper +@Mixin(MinecartHopper.class) +public abstract class HopperMinecartEntity_transferItemsOutFeatureMixin extends AbstractMinecartContainer implements Hopper { @Shadow - public abstract boolean canOperate(); + public abstract boolean suckInItems(); - @Shadow public abstract int size(); + @Shadow public abstract int getContainerSize(); - public HopperMinecartEntity_transferItemsOutFeatureMixin(EntityType type, World world) { + public HopperMinecartEntity_transferItemsOutFeatureMixin(EntityType type, Level world) { super(type, world); } - @Redirect(method = "tickHopper", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/vehicle/HopperMinecartEntity;canOperate()Z")) - private boolean operate(HopperMinecartEntity entity) { + @Redirect(method = "tryConsumeItems", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/vehicle/minecart/MinecartHopper;suckInItems()Z")) + private boolean operate(MinecartHopper entity) { boolean workDone = false; if(CarpetExtraSettings.hopperMinecartItemTransfer) workDone = this.insert(); - workDone |= this.canOperate(); + workDone |= this.suckInItems(); return workDone; } - @Unique private static final Vec3d upwardVec = new Vec3d(0, 1, 0).normalize().multiply(-1); - @Unique private static final Vec3d ascending_east_offset = new Vec3d(-1, 1, 0).normalize().multiply(-1); - @Unique private static final Vec3d ascending_west_offset = new Vec3d( 1, 1, 0).normalize().multiply(-1); - @Unique private static final Vec3d ascending_north_offset = new Vec3d( 0, 1, 1).normalize().multiply(-1); - @Unique private static final Vec3d ascending_south_offset = new Vec3d( 0, 1, -1).normalize().multiply(-1); + @Unique private static final Vec3 upwardVec = new Vec3(0, 1, 0).normalize().scale(-1); + @Unique private static final Vec3 ascending_east_offset = new Vec3(-1, 1, 0).normalize().scale(-1); + @Unique private static final Vec3 ascending_west_offset = new Vec3( 1, 1, 0).normalize().scale(-1); + @Unique private static final Vec3 ascending_north_offset = new Vec3( 0, 1, 1).normalize().scale(-1); + @Unique private static final Vec3 ascending_south_offset = new Vec3( 0, 1, -1).normalize().scale(-1); - @Unique private Vec3d getBlockBelowCartOffset() { - BlockState state = this.getEntityWorld().getBlockState(BlockPos.ofFloored(this.getEntityPos())); - if (state.isIn(BlockTags.RAILS)) { - RailShape railShape = state.get(((AbstractRailBlock)state.getBlock()).getShapeProperty()); + @Unique @SuppressWarnings("resource") private Vec3 getBlockBelowCartOffset() { + BlockState state = this.level().getBlockState(BlockPos.containing(this.position())); + if (state.is(BlockTags.RAILS)) { + RailShape railShape = state.getValue(((BaseRailBlock)state.getBlock()).getShapeProperty()); return switch (railShape) { case ASCENDING_EAST -> ascending_east_offset; case ASCENDING_WEST -> ascending_west_offset; @@ -73,24 +73,24 @@ private boolean operate(HopperMinecartEntity entity) { @Unique private Direction outputDirection = Direction.DOWN; - @Unique private Inventory getOutputInventory() { - Vec3d offsetToInventory = getBlockBelowCartOffset(); + @Unique private Container getOutputInventory() { + Vec3 offsetToInventory = getBlockBelowCartOffset(); //The visual rotation point of the minecart is roughly 0.5 above its feet (determined visually ingame) //Search 0.5 Blocks below the feet for an inventory - Inventory inv = HopperBlockEntity.getInventoryAt(this.getEntityWorld(), BlockPos.ofFloored(this.getEntityPos().add(offsetToInventory))); + Container inv = HopperBlockEntity.getContainerAt(this.level(), BlockPos.containing(this.position().add(offsetToInventory))); //There is probably a way nicer way to determine the access side of the target inventory if (inv instanceof BlockEntity be) { - BlockPos pos = be.getPos(); - if (pos.getY() < MathHelper.floor(this.getY())) + BlockPos pos = be.getBlockPos(); + if (pos.getY() < Mth.floor(this.getY())) outputDirection = Direction.DOWN; - else if(pos.getX() > MathHelper.floor(this.getX())) + else if(pos.getX() > Mth.floor(this.getX())) outputDirection = Direction.EAST; - else if(pos.getX() < MathHelper.floor(this.getX())) + else if(pos.getX() < Mth.floor(this.getX())) outputDirection = Direction.WEST; - else if(pos.getZ() > MathHelper.floor(this.getZ())) + else if(pos.getZ() > Mth.floor(this.getZ())) outputDirection = Direction.SOUTH; - else if(pos.getZ() < MathHelper.floor(this.getZ())) + else if(pos.getZ() < Mth.floor(this.getZ())) outputDirection = Direction.NORTH; else outputDirection = Direction.DOWN; } else { @@ -107,7 +107,7 @@ else if(pos.getZ() < MathHelper.floor(this.getZ())) //copied from HopperBlockEntity, (code originally taken from 1.14.4 pre 6) @Unique private boolean insert() { if (!this.isEmpty()) { - Inventory inventory = this.getOutputInventory(); + Container inventory = this.getOutputInventory(); if (inventory == null) { return false; } else { @@ -115,16 +115,16 @@ else if(pos.getZ() < MathHelper.floor(this.getZ())) if (this.isInventoryFull(inventory, direction)) { return false; } else { - for (int i = 0; i < this.size(); ++i) { - if (!this.getStack(i).isEmpty()) { - ItemStack itemStack_1 = this.getStack(i).copy(); - ItemStack itemStack_2 = transfer(this, inventory, this.removeStack(i, 1), direction); + for (int i = 0; i < this.getContainerSize(); ++i) { + if (!this.getItem(i).isEmpty()) { + ItemStack itemStack_1 = this.getItem(i).copy(); + ItemStack itemStack_2 = addItem(this, inventory, this.removeItem(i, 1), direction); if (itemStack_2.isEmpty()) { - inventory.markDirty(); + inventory.setChanged(); return true; } - this.setStack(i, itemStack_1); + this.setItem(i, itemStack_1); } } @@ -137,14 +137,14 @@ else if(pos.getZ() < MathHelper.floor(this.getZ())) //Copied from HopperBlockEntity as it is private there - @Unique private boolean isInventoryFull(Inventory inventory, Direction direction) { + @Unique private boolean isInventoryFull(Container inventory, Direction direction) { return getAvailableSlots(inventory, direction).allMatch((slot) -> { - ItemStack stack = inventory.getStack(slot); - return stack.getCount() >= stack.getMaxCount(); + ItemStack stack = inventory.getItem(slot); + return stack.getCount() >= stack.getMaxStackSize(); }); } //Copied from HopperBlockEntity as it is private there - @Unique private static IntStream getAvailableSlots(Inventory inventory, Direction direction) { - return inventory instanceof SidedInventory ? IntStream.of(((SidedInventory)inventory).getAvailableSlots(direction)) : IntStream.range(0, inventory.size()); + @Unique private static IntStream getAvailableSlots(Container inventory, Direction direction) { + return inventory instanceof WorldlyContainer ? IntStream.of(((WorldlyContainer)inventory).getSlotsForFace(direction)) : IntStream.range(0, inventory.getContainerSize()); } } diff --git a/src/main/java/carpetextra/mixins/ItemFrameEntity_comparatorBetterItemFramesMixin.java b/src/main/java/carpetextra/mixins/ItemFrameEntity_comparatorBetterItemFramesMixin.java index ab5210f4..e5931b0a 100644 --- a/src/main/java/carpetextra/mixins/ItemFrameEntity_comparatorBetterItemFramesMixin.java +++ b/src/main/java/carpetextra/mixins/ItemFrameEntity_comparatorBetterItemFramesMixin.java @@ -2,34 +2,36 @@ import carpetextra.CarpetExtraSettings; import carpetextra.CarpetExtraSettings.ComparatorOptions; -import net.minecraft.block.Blocks; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.decoration.AbstractDecorationEntity; -import net.minecraft.entity.decoration.ItemFrameEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.HangingEntity; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(ItemFrameEntity.class) -public abstract class ItemFrameEntity_comparatorBetterItemFramesMixin extends AbstractDecorationEntity { - public ItemFrameEntity_comparatorBetterItemFramesMixin(EntityType type, World world) { +@Mixin(ItemFrame.class) +public abstract class ItemFrameEntity_comparatorBetterItemFramesMixin extends HangingEntity { + public ItemFrameEntity_comparatorBetterItemFramesMixin(EntityType type, Level world) { super(type, world); } - @Inject(method = "setHeldItemStack(Lnet/minecraft/item/ItemStack;Z)V", at = @At(value = "INVOKE", target="Lnet/minecraft/world/World;updateComparators(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/Block;)V"), cancellable = true) + @Inject(method = "setItem(Lnet/minecraft/world/item/ItemStack;Z)V", at = @At(value = "INVOKE", target="Lnet/minecraft/world/level/Level;updateNeighbourForOutputSignal(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V"), cancellable = true) + @SuppressWarnings("resource") private void onStackChangeUpdateComparatorDownwards(ItemStack value, boolean update, CallbackInfo ci) { if (CarpetExtraSettings.comparatorBetterItemFrames == ComparatorOptions.EXTENDED) { - this.getEntityWorld().updateComparators(this.attachedBlockPos.offset(this.getHorizontalFacing().getOpposite()), Blocks.AIR); + this.level().updateNeighbourForOutputSignal(this.pos.relative(this.getDirection().getOpposite()), Blocks.AIR); } } - @Inject(method = "setRotation(IZ)V", at = @At(value = "INVOKE", target="Lnet/minecraft/world/World;updateComparators(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/Block;)V"), cancellable = true) + @Inject(method = "setRotation(IZ)V", at = @At(value = "INVOKE", target="Lnet/minecraft/world/level/Level;updateNeighbourForOutputSignal(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;)V"), cancellable = true) + @SuppressWarnings("resource") private void onRotationUpdateComparatorDownwards(int value, boolean bl, CallbackInfo ci) { if (CarpetExtraSettings.comparatorBetterItemFrames == ComparatorOptions.EXTENDED) { - this.getEntityWorld().updateComparators(this.attachedBlockPos.offset(this.getHorizontalFacing().getOpposite()), Blocks.AIR); + this.level().updateNeighbourForOutputSignal(this.pos.relative(this.getDirection().getOpposite()), Blocks.AIR); } } } diff --git a/src/main/java/carpetextra/mixins/ItemFrameEntity_comparatorReadsClockMixin.java b/src/main/java/carpetextra/mixins/ItemFrameEntity_comparatorReadsClockMixin.java index fcb08ef5..192687d7 100644 --- a/src/main/java/carpetextra/mixins/ItemFrameEntity_comparatorReadsClockMixin.java +++ b/src/main/java/carpetextra/mixins/ItemFrameEntity_comparatorReadsClockMixin.java @@ -1,35 +1,36 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.Blocks; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.decoration.AbstractDecorationEntity; -import net.minecraft.entity.decoration.ItemFrameEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.HangingEntity; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(ItemFrameEntity.class) -public abstract class ItemFrameEntity_comparatorReadsClockMixin extends AbstractDecorationEntity +@Mixin(ItemFrame.class) +public abstract class ItemFrameEntity_comparatorReadsClockMixin extends HangingEntity { - public ItemFrameEntity_comparatorReadsClockMixin(EntityType entityType_1, World world_1) { + public ItemFrameEntity_comparatorReadsClockMixin(EntityType entityType_1, Level world_1) { super(entityType_1, world_1); } @Shadow - public abstract ItemStack getHeldItemStack(); + public abstract ItemStack getItem(); - @Inject(method = "getComparatorPower", at = @At("HEAD"),cancellable = true) + @Inject(method = "getAnalogOutput", at = @At("HEAD"),cancellable = true) + @SuppressWarnings("resource") private void giveClockPower(CallbackInfoReturnable cir) { - if(CarpetExtraSettings.comparatorReadsClock && this.getHeldItemStack().getItem() == Items.CLOCK) { + if(CarpetExtraSettings.comparatorReadsClock && this.getItem().getItem() == Items.CLOCK) { int power; //Every 1500 ticks, increase signal strength by one - power = (int)(this.getEntityWorld().getTimeOfDay() % 24000) / 1500; + power = (int)(this.level().getDayTime() % 24000) / 1500; //in case negative time of day every happens, make comparator output the according positive value if(power < 0) power = power + 16; @@ -39,14 +40,15 @@ private void giveClockPower(CallbackInfoReturnable cir) { } private boolean firstTick = true; + @SuppressWarnings("resource") public void tick() { - if(CarpetExtraSettings.comparatorReadsClock && this.getHeldItemStack().getItem() == Items.CLOCK) { + if(CarpetExtraSettings.comparatorReadsClock && this.getItem().getItem() == Items.CLOCK) { //This doesn't handle time set commands yet //Every 1500 ticks, increase signal strength by one, so update comparators exactly then - if(this.getEntityWorld().getTimeOfDay() % 1500 == 0 || firstTick) { + if(this.level().getDayTime() % 1500 == 0 || firstTick) { firstTick = false; - if(this.attachedBlockPos != null) { - this.getEntityWorld().updateComparators(this.attachedBlockPos, Blocks.AIR); + if(this.pos != null) { + this.level().updateNeighbourForOutputSignal(this.pos, Blocks.AIR); } } } diff --git a/src/main/java/carpetextra/mixins/ItemStackMixin.java b/src/main/java/carpetextra/mixins/ItemStackMixin.java index 305a3063..44972853 100644 --- a/src/main/java/carpetextra/mixins/ItemStackMixin.java +++ b/src/main/java/carpetextra/mixins/ItemStackMixin.java @@ -8,10 +8,10 @@ import carpetextra.CarpetExtraSettings; import carpetextra.utils.InventoryUtils; -import net.minecraft.block.ShulkerBoxBlock; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.ShulkerBoxBlock; import carpet.CarpetSettings; @@ -19,7 +19,7 @@ public abstract class ItemStackMixin { @Shadow public abstract Item getItem(); - @Inject(method = "getMaxCount", at = @At("HEAD"), cancellable = true) + @Inject(method = "getMaxStackSize", at = @At("HEAD"), cancellable = true) private void allowEmptyShulkerBoxStacking(CallbackInfoReturnable cir) { if (CarpetExtraSettings.emptyShulkerBoxStackAlways && this.getItem() instanceof BlockItem item) { ItemStack thisStack = (ItemStack) (Object) this; diff --git a/src/main/java/carpetextra/mixins/LilyPadBlock_fertilizerMixin.java b/src/main/java/carpetextra/mixins/LilyPadBlock_fertilizerMixin.java index 14daa6a5..66bd9680 100644 --- a/src/main/java/carpetextra/mixins/LilyPadBlock_fertilizerMixin.java +++ b/src/main/java/carpetextra/mixins/LilyPadBlock_fertilizerMixin.java @@ -1,59 +1,59 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.Fertilizable; -import net.minecraft.block.LilyPadBlock; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldView; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.WaterlilyBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -@Mixin(LilyPadBlock.class) -public abstract class LilyPadBlock_fertilizerMixin implements Fertilizable { - @Shadow protected abstract boolean canPlantOnTop(BlockState floor, BlockView world, BlockPos pos); +@Mixin(WaterlilyBlock.class) +public abstract class LilyPadBlock_fertilizerMixin implements BonemealableBlock { + @Shadow protected abstract boolean mayPlaceOn(BlockState floor, BlockGetter world, BlockPos pos); @Override - public boolean isFertilizable(WorldView world, BlockPos pos, BlockState state) { + public boolean isValidBonemealTarget(LevelReader world, BlockPos pos, BlockState state) { return CarpetExtraSettings.betterBonemeal; } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) + public boolean isBonemealSuccess(Level world, RandomSource random, BlockPos pos, BlockState state) { return true; } @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) + public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) { if(!CarpetExtraSettings.betterBonemeal) return; - BlockState blockState = Blocks.LILY_PAD.getDefaultState(); + BlockState blockState = Blocks.LILY_PAD.defaultBlockState(); stopGrowth: for(int i = 0; i < 24; ++i) { BlockPos growPos = pos; for (int j = 0; j < i / 16; ++j) { - growPos = growPos.add(random.nextInt(3) - 1, 0, random.nextInt(3) - 1); - if (world.getBlockState(growPos).isFullCube(world, growPos)) { + growPos = growPos.offset(random.nextInt(3) - 1, 0, random.nextInt(3) - 1); + if (world.getBlockState(growPos).isCollisionShapeFullBlock(world, growPos)) { continue stopGrowth; } } if (canGrowTo(growPos,world)) { - world.setBlockState(growPos,blockState); - state.scheduledTick(world, growPos, random); + world.setBlockAndUpdate(growPos,blockState); + state.tick(world, growPos, random); } } } - private boolean canGrowTo(BlockPos pos, BlockView world) { - return this.canPlantOnTop(world.getBlockState(pos.down()), world, pos.down()) && world.getBlockState(pos).isAir(); + private boolean canGrowTo(BlockPos pos, BlockGetter world) { + return this.mayPlaceOn(world.getBlockState(pos.below()), world, pos.below()) && world.getBlockState(pos).isAir(); } } diff --git a/src/main/java/carpetextra/mixins/LivingEntityMixin.java b/src/main/java/carpetextra/mixins/LivingEntityMixin.java index 7671a82e..f60d95c6 100644 --- a/src/main/java/carpetextra/mixins/LivingEntityMixin.java +++ b/src/main/java/carpetextra/mixins/LivingEntityMixin.java @@ -1,19 +1,19 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.mob.SpiderEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.spider.Spider; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -23,42 +23,44 @@ @Mixin(LivingEntity.class) public abstract class LivingEntityMixin extends Entity { - public LivingEntityMixin(EntityType entityType_1, World world_1) + public LivingEntityMixin(EntityType entityType_1, Level world_1) { super(entityType_1, world_1); } @Inject( - method = "onDeath", + method = "die", at = @At(value = "INVOKE", - target = "Lnet/minecraft/entity/damage/DamageSource;getAttacker()Lnet/minecraft/entity/Entity;", + target = "Lnet/minecraft/world/damagesource/DamageSource;getEntity()Lnet/minecraft/world/entity/Entity;", shift = At.Shift.BEFORE) ) + @SuppressWarnings("resource") private void convertSandToSoulsand(DamageSource damageSource, CallbackInfo ci) { if (!CarpetExtraSettings.mobInFireConvertsSandToSoulsand) return; - BlockPos pos = BlockPos.ofFloored(this.getX(), this.getY(), this.getZ()); - BlockState statePos = this.getEntityWorld().getBlockState(pos); + BlockPos pos = BlockPos.containing(this.getX(), this.getY(), this.getZ()); + BlockState statePos = this.level().getBlockState(pos); - BlockPos below = pos.down(1); - BlockState stateBelow = this.getEntityWorld().getBlockState(below); + BlockPos below = pos.below(1); + BlockState stateBelow = this.level().getBlockState(below); - if (statePos.getBlock() == Blocks.FIRE && stateBelow.isIn(BlockTags.SAND)) + if (statePos.getBlock() == Blocks.FIRE && stateBelow.is(BlockTags.SAND)) { - this.getEntityWorld().setBlockState(below, Blocks.SOUL_SAND.getDefaultState()); + this.level().setBlockAndUpdate(below, Blocks.SOUL_SAND.defaultBlockState()); } } - @Inject(method = "onDeath", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/damage/DamageSource;getAttacker()Lnet/minecraft/entity/Entity;")) + @Inject(method = "die", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/damagesource/DamageSource;getEntity()Lnet/minecraft/world/entity/Entity;")) + @SuppressWarnings("resource") private void onOnDeath(DamageSource source, CallbackInfo ci) { - if (this.getEntityWorld() instanceof ServerWorld sw) + if (this.level() instanceof ServerLevel sw) { - if ((this.getVehicle() instanceof SpiderEntity) && this.random.nextInt(100) + 1 < CarpetExtraSettings.spiderJockeysDropGapples) + if ((this.getVehicle() instanceof Spider) && this.random.nextInt(100) + 1 < CarpetExtraSettings.spiderJockeysDropGapples) { - this.dropStack(sw, new ItemStack(Items.ENCHANTED_GOLDEN_APPLE)); + this.spawnAtLocation(sw, new ItemStack(Items.ENCHANTED_GOLDEN_APPLE)); } } } diff --git a/src/main/java/carpetextra/mixins/MooshroomEntity_StatusEffectAccessorMixin.java b/src/main/java/carpetextra/mixins/MooshroomEntity_StatusEffectAccessorMixin.java index 22beffb8..005a17b8 100644 --- a/src/main/java/carpetextra/mixins/MooshroomEntity_StatusEffectAccessorMixin.java +++ b/src/main/java/carpetextra/mixins/MooshroomEntity_StatusEffectAccessorMixin.java @@ -6,18 +6,18 @@ import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; -import net.minecraft.component.type.SuspiciousStewEffectsComponent; -import net.minecraft.entity.passive.MooshroomEntity; -import net.minecraft.item.ItemStack; +import net.minecraft.world.entity.animal.cow.MushroomCow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.SuspiciousStewEffects; -@Mixin(MooshroomEntity.class) +@Mixin(MushroomCow.class) public interface MooshroomEntity_StatusEffectAccessorMixin { @Accessor("stewEffects") - SuspiciousStewEffectsComponent getStewEffects(); + SuspiciousStewEffects getStewEffects(); @Accessor("stewEffects") - void setStewEffects(SuspiciousStewEffectsComponent effect); + void setStewEffects(SuspiciousStewEffects effect); - @Invoker("getStewEffectFrom") - Optional invokeGetStewEffectFrom(ItemStack flower); + @Invoker("getEffectsFromItemStack") + Optional invokeGetStewEffectFrom(ItemStack flower); } diff --git a/src/main/java/carpetextra/mixins/NetherWartBlock_fertilizerMixin.java b/src/main/java/carpetextra/mixins/NetherWartBlock_fertilizerMixin.java index 4c4ded39..affbd3bc 100644 --- a/src/main/java/carpetextra/mixins/NetherWartBlock_fertilizerMixin.java +++ b/src/main/java/carpetextra/mixins/NetherWartBlock_fertilizerMixin.java @@ -1,36 +1,36 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.NetherWartBlock; -import net.minecraft.block.PlantBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldEvents; +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.LevelEvent; +import net.minecraft.world.level.block.NetherWartBlock; +import net.minecraft.world.level.block.VegetationBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; import org.spongepowered.asm.mixin.Mixin; @Mixin(NetherWartBlock.class) -public abstract class NetherWartBlock_fertilizerMixin extends PlantBlock { - protected NetherWartBlock_fertilizerMixin(Settings settings) { +public abstract class NetherWartBlock_fertilizerMixin extends VegetationBlock { + protected NetherWartBlock_fertilizerMixin(Properties settings) { super(settings); } @Override - protected ActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - int age = state.get(NetherWartBlock.AGE); + protected InteractionResult useItemOn(ItemStack stack, BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + int age = state.getValue(NetherWartBlock.AGE); if (CarpetExtraSettings.blazeMeal && stack.getItem() == Items.BLAZE_POWDER && age < 3) { - world.setBlockState(pos, this.getDefaultState().with(NetherWartBlock.AGE, age + 1), NOTIFY_LISTENERS); - world.syncWorldEvent(WorldEvents.BONE_MEAL_USED, pos, 0); - if (!player.isCreative()) stack.decrement(1); - return ActionResult.SUCCESS; + world.setBlock(pos, this.defaultBlockState().setValue(NetherWartBlock.AGE, age + 1), UPDATE_CLIENTS); + world.levelEvent(LevelEvent.PARTICLES_AND_SOUND_PLANT_GROWTH, pos, 0); + if (!player.isCreative()) stack.shrink(1); + return InteractionResult.SUCCESS; } - return super.onUseWithItem(stack, state, world, pos, player, hand, hit); + return super.useItemOn(stack, state, world, pos, player, hand, hit); } } diff --git a/src/main/java/carpetextra/mixins/NoteBlockMixin.java b/src/main/java/carpetextra/mixins/NoteBlockMixin.java index ae9f81ba..3d8465de 100644 --- a/src/main/java/carpetextra/mixins/NoteBlockMixin.java +++ b/src/main/java/carpetextra/mixins/NoteBlockMixin.java @@ -1,8 +1,8 @@ package carpetextra.mixins; -import net.minecraft.block.NoteBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.Identifier; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.NoteBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -10,16 +10,16 @@ @Mixin(NoteBlock.class) public abstract class NoteBlockMixin { @Redirect( - method = "onUse", + method = "useWithoutItem", at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/player/PlayerEntity;incrementStat(Lnet/minecraft/util/Identifier;)V" + target = "Lnet/minecraft/world/entity/player/Player;awardStat(Lnet/minecraft/resources/Identifier;)V" ) ) - private void onIncrementStat(PlayerEntity player, Identifier ident) { + private void onIncrementStat(Player player, Identifier ident) { // player will never be null in VANILLA if (player == null) return; - player.incrementStat(ident); + player.awardStat(ident); return; } } diff --git a/src/main/java/carpetextra/mixins/PistonBlockMixin.java b/src/main/java/carpetextra/mixins/PistonBlockMixin.java index 29cb705d..2d622536 100644 --- a/src/main/java/carpetextra/mixins/PistonBlockMixin.java +++ b/src/main/java/carpetextra/mixins/PistonBlockMixin.java @@ -1,28 +1,28 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.PistonBlock; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.piston.PistonBaseBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(PistonBlock.class) +@Mixin(PistonBaseBlock.class) public abstract class PistonBlockMixin { @Inject( - method = "tryMove", + method = "checkIfExtend", at = @At(value = "INVOKE", shift = At.Shift.BEFORE, ordinal = 1, - target = "Lnet/minecraft/world/World;addSyncedBlockEvent(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/Block;II)V") + target = "Lnet/minecraft/world/level/Level;blockEvent(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;II)V") ) - private void onTryMove(World world, BlockPos pos, BlockState state, CallbackInfo ci) + private void onTryMove(Level world, BlockPos pos, BlockState state, CallbackInfo ci) { if (CarpetExtraSettings.doubleRetraction) { - world.setBlockState(pos, state.with(PistonBlock.EXTENDED, false), 2); + world.setBlock(pos, state.setValue(PistonBaseBlock.EXTENDED, false), 2); } } } diff --git a/src/main/java/carpetextra/mixins/PlayerEntityMixin.java b/src/main/java/carpetextra/mixins/PlayerEntityMixin.java index e8feb614..858ec2de 100644 --- a/src/main/java/carpetextra/mixins/PlayerEntityMixin.java +++ b/src/main/java/carpetextra/mixins/PlayerEntityMixin.java @@ -1,16 +1,16 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; -@Mixin(PlayerEntity.class) +@Mixin(Player.class) public abstract class PlayerEntityMixin extends LivingEntity { - protected PlayerEntityMixin(EntityType entityType, World world) + protected PlayerEntityMixin(EntityType entityType, Level world) { super(entityType, world); } diff --git a/src/main/java/carpetextra/mixins/RedstoneWireBlockMixin.java b/src/main/java/carpetextra/mixins/RedstoneWireBlockMixin.java index b4460ab6..799a00f0 100644 --- a/src/main/java/carpetextra/mixins/RedstoneWireBlockMixin.java +++ b/src/main/java/carpetextra/mixins/RedstoneWireBlockMixin.java @@ -1,26 +1,26 @@ package carpetextra.mixins; -import net.minecraft.block.RedstoneWireBlock; -import net.minecraft.entity.player.PlayerAbilities; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Abilities; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.RedStoneWireBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -@Mixin(RedstoneWireBlock.class) +@Mixin(RedStoneWireBlock.class) public abstract class RedstoneWireBlockMixin { @Redirect( - method = "onUse", + method = "useWithoutItem", at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/player/PlayerEntity;getAbilities()Lnet/minecraft/entity/player/PlayerAbilities;" + target = "Lnet/minecraft/world/entity/player/Player;getAbilities()Lnet/minecraft/world/entity/player/Abilities;" ) ) - private PlayerAbilities hasPlayerAbilities(final PlayerEntity player) + private Abilities hasPlayerAbilities(final Player player) { // player will never be null in VANILLA - if (player == null) return new PlayerAbilities(); + if (player == null) return new Abilities(); return player.getAbilities(); } } diff --git a/src/main/java/carpetextra/mixins/RedstoneWireBlockMixin_pistonRedirectsRedstone.java b/src/main/java/carpetextra/mixins/RedstoneWireBlockMixin_pistonRedirectsRedstone.java index 705037a7..aa49460d 100644 --- a/src/main/java/carpetextra/mixins/RedstoneWireBlockMixin_pistonRedirectsRedstone.java +++ b/src/main/java/carpetextra/mixins/RedstoneWireBlockMixin_pistonRedirectsRedstone.java @@ -1,29 +1,29 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.BlockState; -import net.minecraft.block.PistonBlock; -import net.minecraft.block.RedstoneWireBlock; -import net.minecraft.util.math.Direction; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.RedStoneWireBlock; +import net.minecraft.world.level.block.piston.PistonBaseBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(RedstoneWireBlock.class) +@Mixin(RedStoneWireBlock.class) public abstract class RedstoneWireBlockMixin_pistonRedirectsRedstone { @Inject( - method = "Lnet/minecraft/block/RedstoneWireBlock;connectsTo(Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/Direction;)Z", + method = "shouldConnectTo(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;)Z", at = @At(value = "HEAD"), cancellable = true ) private static void onConnectsTo(BlockState state, Direction dir, CallbackInfoReturnable cir) { if ( CarpetExtraSettings.pistonRedirectsRedstone ) { - if (state.getBlock() instanceof PistonBlock) + if (state.getBlock() instanceof PistonBaseBlock) { - cir.setReturnValue(dir != null && dir != state.get(PistonBlock.FACING).getOpposite()); + cir.setReturnValue(dir != null && dir != state.getValue(PistonBaseBlock.FACING).getOpposite()); } } } diff --git a/src/main/java/carpetextra/mixins/RepeaterBlockMixin.java b/src/main/java/carpetextra/mixins/RepeaterBlockMixin.java index db0cad96..0828dc30 100644 --- a/src/main/java/carpetextra/mixins/RepeaterBlockMixin.java +++ b/src/main/java/carpetextra/mixins/RepeaterBlockMixin.java @@ -1,8 +1,8 @@ package carpetextra.mixins; -import net.minecraft.block.RepeaterBlock; -import net.minecraft.entity.player.PlayerAbilities; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.entity.player.Abilities; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.RepeaterBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -10,15 +10,15 @@ @Mixin(RepeaterBlock.class) public abstract class RepeaterBlockMixin { @Redirect( - method = "onUse", + method = "useWithoutItem", at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/player/PlayerEntity;getAbilities()Lnet/minecraft/entity/player/PlayerAbilities;" + target = "Lnet/minecraft/world/entity/player/Player;getAbilities()Lnet/minecraft/world/entity/player/Abilities;" ) ) - private PlayerAbilities hasPlayerAbilities(final PlayerEntity player) { + private Abilities hasPlayerAbilities(final Player player) { // player will never be null in VANILLA - if (player == null) return new PlayerAbilities(); + if (player == null) return new Abilities(); return player.getAbilities(); } } diff --git a/src/main/java/carpetextra/mixins/SaplingBlock_syncMixin.java b/src/main/java/carpetextra/mixins/SaplingBlock_syncMixin.java index 11efbb71..b0c34783 100644 --- a/src/main/java/carpetextra/mixins/SaplingBlock_syncMixin.java +++ b/src/main/java/carpetextra/mixins/SaplingBlock_syncMixin.java @@ -1,8 +1,8 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.Block; -import net.minecraft.block.SaplingBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SaplingBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.ModifyConstant; @@ -10,11 +10,11 @@ @Mixin(SaplingBlock.class) public abstract class SaplingBlock_syncMixin { - @ModifyConstant(method = "generate", constant = @Constant(intValue = Block.SKIP_REDRAW_AND_BLOCK_ENTITY_REPLACED_CALLBACK)) + @ModifyConstant(method = "advanceTree", constant = @Constant(intValue = Block.UPDATE_NONE)) private int onGenerate(int original) { if (CarpetExtraSettings.blockStateSyncing) - return Block.SKIP_REDRAW_AND_BLOCK_ENTITY_REPLACED_CALLBACK | Block.NOTIFY_LISTENERS; + return Block.UPDATE_NONE | Block.UPDATE_CLIENTS; else return original; } diff --git a/src/main/java/carpetextra/mixins/ScaffoldingBlock_scaffoldingDistanceMixin.java b/src/main/java/carpetextra/mixins/ScaffoldingBlock_scaffoldingDistanceMixin.java index a88ce104..1ea7d8d3 100644 --- a/src/main/java/carpetextra/mixins/ScaffoldingBlock_scaffoldingDistanceMixin.java +++ b/src/main/java/carpetextra/mixins/ScaffoldingBlock_scaffoldingDistanceMixin.java @@ -1,7 +1,7 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.ScaffoldingBlock; +import net.minecraft.world.level.block.ScaffoldingBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.ModifyConstant; @@ -18,19 +18,19 @@ private static IntProperty redirectDistanceProperty() } */ - @ModifyConstant(method = "scheduledTick", constant = @Constant(intValue = 7), require = 0) + @ModifyConstant(method = "tick", constant = @Constant(intValue = 7), require = 0) private int scheduledTick_maxDistance(int oldValue) { return CarpetExtraSettings.scaffoldingDistance; } - @ModifyConstant(method = "canPlaceAt", constant = @Constant(intValue = 7), require = 0) + @ModifyConstant(method = "canSurvive", constant = @Constant(intValue = 7), require = 0) private int canPlaceAt_maxDistance(int oldValue) { return CarpetExtraSettings.scaffoldingDistance; } - @ModifyConstant(method = "calculateDistance", constant = @Constant(intValue = 7), require = 0) + @ModifyConstant(method = "getDistance", constant = @Constant(intValue = 7), require = 0) private static int calculateDistance_maxDistance(int oldValue) { return CarpetExtraSettings.scaffoldingDistance; diff --git a/src/main/java/carpetextra/mixins/ScaffoldingItem_scaffoldingDistanceMixin.java b/src/main/java/carpetextra/mixins/ScaffoldingItem_scaffoldingDistanceMixin.java index 72c4f5fb..eec8db34 100644 --- a/src/main/java/carpetextra/mixins/ScaffoldingItem_scaffoldingDistanceMixin.java +++ b/src/main/java/carpetextra/mixins/ScaffoldingItem_scaffoldingDistanceMixin.java @@ -1,14 +1,14 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.item.ScaffoldingItem; +import net.minecraft.world.item.ScaffoldingBlockItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.ModifyConstant; -@Mixin(ScaffoldingItem.class) +@Mixin(ScaffoldingBlockItem.class) public class ScaffoldingItem_scaffoldingDistanceMixin { - @ModifyConstant(method = "getPlacementContext", constant = @Constant(intValue = 7), require = 0) + @ModifyConstant(method = "updatePlacementContext", constant = @Constant(intValue = 7), require = 0) private int getPlacementContext_maxDistance(int oldValue) { return CarpetExtraSettings.scaffoldingDistance; diff --git a/src/main/java/carpetextra/mixins/SculkCatalystMixin.java b/src/main/java/carpetextra/mixins/SculkCatalystMixin.java index 0e221194..18351099 100644 --- a/src/main/java/carpetextra/mixins/SculkCatalystMixin.java +++ b/src/main/java/carpetextra/mixins/SculkCatalystMixin.java @@ -1,8 +1,8 @@ package carpetextra.mixins; -import net.minecraft.block.SculkCatalystBlock; -import net.minecraft.util.math.intprovider.ConstantIntProvider; -import net.minecraft.util.math.intprovider.IntProvider; +import net.minecraft.util.valueproviders.ConstantInt; +import net.minecraft.util.valueproviders.IntProvider; +import net.minecraft.world.level.block.SculkCatalystBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; @@ -12,10 +12,10 @@ @Mixin(SculkCatalystBlock.class) public class SculkCatalystMixin { @ModifyArg( - method = "onStacksDropped", - at = @At(value="INVOKE", target = "Lnet/minecraft/block/SculkCatalystBlock;dropExperienceWhenMined(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/item/ItemStack;Lnet/minecraft/util/math/intprovider/IntProvider;)V") + method = "spawnAfterBreak", + at = @At(value="INVOKE", target = "Lnet/minecraft/world/level/block/SculkCatalystBlock;tryDropExperience(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/util/valueproviders/IntProvider;)V") ) private IntProvider xpModifier(IntProvider experience) { - return ConstantIntProvider.create(xpPerSculkCatalyst); + return ConstantInt.of(xpPerSculkCatalyst); } } diff --git a/src/main/java/carpetextra/mixins/SecondaryPointOfInterestSensor_wartFarmMixin.java b/src/main/java/carpetextra/mixins/SecondaryPointOfInterestSensor_wartFarmMixin.java index 259b3206..8ea80ee5 100644 --- a/src/main/java/carpetextra/mixins/SecondaryPointOfInterestSensor_wartFarmMixin.java +++ b/src/main/java/carpetextra/mixins/SecondaryPointOfInterestSensor_wartFarmMixin.java @@ -1,31 +1,31 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.ai.brain.Brain; -import net.minecraft.entity.ai.brain.MemoryModuleType; -import net.minecraft.entity.ai.brain.sensor.SecondaryPointsOfInterestSensor; -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.village.VillagerProfession; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.ai.Brain; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.sensing.SecondaryPoiSensor; +import net.minecraft.world.entity.npc.villager.Villager; +import net.minecraft.world.entity.npc.villager.VillagerProfession; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(SecondaryPointsOfInterestSensor.class) +@Mixin(SecondaryPoiSensor.class) public class SecondaryPointOfInterestSensor_wartFarmMixin { // this is just to prevent clerics wandering to soul sand if VANILLA // this might come in handy in general making sure villagers don't check 405 blocks around them every 2 seconds // for nothing, but hey? - @Inject(method = "sense", at = @At("HEAD"), cancellable = true) - private void notVanillaCleric(ServerWorld world, VillagerEntity villager, CallbackInfo ci) + @Inject(method = "doTick", at = @At("HEAD"), cancellable = true) + private void notVanillaCleric(ServerLevel world, Villager villager, CallbackInfo ci) { - if(!CarpetExtraSettings.clericsFarmWarts && villager.getVillagerData().profession().matchesKey(VillagerProfession.CLERIC)) + if(!CarpetExtraSettings.clericsFarmWarts && villager.getVillagerData().profession().is(VillagerProfession.CLERIC)) { // in vanilla we want not to find secondary POI for clerics Brain brain = villager.getBrain(); - brain.forget(MemoryModuleType.SECONDARY_JOB_SITE); + brain.eraseMemory(MemoryModuleType.SECONDARY_JOB_SITE); ci.cancel(); } diff --git a/src/main/java/carpetextra/mixins/ServerPlayNetworkHandlerMixin.java b/src/main/java/carpetextra/mixins/ServerPlayNetworkHandlerMixin.java index 1927ffea..bab76b07 100644 --- a/src/main/java/carpetextra/mixins/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/carpetextra/mixins/ServerPlayNetworkHandlerMixin.java @@ -3,22 +3,22 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.util.math.Vec3d; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.world.phys.Vec3; import carpetextra.CarpetExtraSettings; -@Mixin(ServerPlayNetworkHandler.class) +@Mixin(ServerGamePacketListenerImpl.class) public abstract class ServerPlayNetworkHandlerMixin { - @Redirect(method = "onPlayerInteractBlock", + @Redirect(method = "handleUseItemOn", at = @At(value = "INVOKE", - target = "Lnet/minecraft/util/math/Vec3d;subtract(Lnet/minecraft/util/math/Vec3d;)Lnet/minecraft/util/math/Vec3d;"), + target = "Lnet/minecraft/world/phys/Vec3;subtract(Lnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3;"), require = 0) - private Vec3d carpetextra_removeHitPosCheck(Vec3d hitVec, Vec3d blockCenter) + private Vec3 carpetextra_removeHitPosCheck(Vec3 hitVec, Vec3 blockCenter) { if (CarpetExtraSettings.accurateBlockPlacement) { - return Vec3d.ZERO; + return Vec3.ZERO; } return hitVec.subtract(blockCenter); diff --git a/src/main/java/carpetextra/mixins/SkeletonEntityMixin.java b/src/main/java/carpetextra/mixins/SkeletonEntityMixin.java index be940d77..87e06d08 100644 --- a/src/main/java/carpetextra/mixins/SkeletonEntityMixin.java +++ b/src/main/java/carpetextra/mixins/SkeletonEntityMixin.java @@ -1,34 +1,34 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LightningEntity; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.mob.AbstractSkeletonEntity; -import net.minecraft.entity.mob.SkeletonEntity; -import net.minecraft.entity.mob.WitherSkeletonEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.world.World; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySpawnReason; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.entity.monster.skeleton.AbstractSkeleton; +import net.minecraft.world.entity.monster.skeleton.Skeleton; +import net.minecraft.world.entity.monster.skeleton.WitherSkeleton; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; -@Mixin(SkeletonEntity.class) -public abstract class SkeletonEntityMixin extends AbstractSkeletonEntity +@Mixin(Skeleton.class) +public abstract class SkeletonEntityMixin extends AbstractSkeleton { - protected SkeletonEntityMixin(EntityType type, World world) + protected SkeletonEntityMixin(EntityType type, Level world) { super(type, world); } @Override - public void onStruckByLightning(ServerWorld world, LightningEntity entity) + public void thunderHit(ServerLevel world, LightningBolt entity) { - if (!world.isClient() && !this.isRemoved() && CarpetExtraSettings.renewableWitherSkeletons) + if (!world.isClientSide() && !this.isRemoved() && CarpetExtraSettings.renewableWitherSkeletons) { - WitherSkeletonEntity witherSkelly = new WitherSkeletonEntity(EntityType.WITHER_SKELETON, world); - witherSkelly.refreshPositionAndAngles(this.getX(), this.getY(), this.getZ(), this.getYaw(), this.getPitch()); - witherSkelly.initialize(world, world.getLocalDifficulty(witherSkelly.getBlockPos()), SpawnReason.CONVERSION, null); - witherSkelly.setAiDisabled(this.isAiDisabled()); + WitherSkeleton witherSkelly = new WitherSkeleton(EntityType.WITHER_SKELETON, world); + witherSkelly.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); + witherSkelly.finalizeSpawn(world, world.getCurrentDifficultyAt(witherSkelly.blockPosition()), EntitySpawnReason.CONVERSION, null); + witherSkelly.setNoAi(this.isNoAi()); if (this.hasCustomName()) { @@ -36,21 +36,21 @@ public void onStruckByLightning(ServerWorld world, LightningEntity entity) witherSkelly.setCustomNameVisible(this.isCustomNameVisible()); } - world.spawnEntity(witherSkelly); + world.addFreshEntity(witherSkelly); if (getVehicle() != null) { Entity mount = getVehicle(); this.stopRiding(); - witherSkelly.extinguish(); - mount.extinguish(); + witherSkelly.clearFire(); + mount.clearFire(); witherSkelly.startRiding(mount); } this.discard(); } else { - super.onStruckByLightning(world, entity); + super.thunderHit(world, entity); } } } diff --git a/src/main/java/carpetextra/mixins/SpiderEntityMixin.java b/src/main/java/carpetextra/mixins/SpiderEntityMixin.java index 7d32e6ec..dbb4ed58 100644 --- a/src/main/java/carpetextra/mixins/SpiderEntityMixin.java +++ b/src/main/java/carpetextra/mixins/SpiderEntityMixin.java @@ -1,34 +1,35 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.mob.SpiderEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.world.World; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.spider.Spider; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; -@Mixin(SpiderEntity.class) -public abstract class SpiderEntityMixin extends HostileEntity +@Mixin(Spider.class) +public abstract class SpiderEntityMixin extends Monster { - protected SpiderEntityMixin(EntityType type, World world) + protected SpiderEntityMixin(EntityType type, Level world) { super(type, world); } @Override - public void onDeath(DamageSource source) + @SuppressWarnings("resource") + public void die(DamageSource source) { - if (this.getEntityWorld() instanceof ServerWorld sw) + if (this.level() instanceof ServerLevel sw) { - if (this.hasPassengers() && this.random.nextInt(100) + 1 < CarpetExtraSettings.spiderJockeysDropGapples) + if (this.isVehicle() && this.random.nextInt(100) + 1 < CarpetExtraSettings.spiderJockeysDropGapples) { - this.dropStack(sw, new ItemStack(Items.ENCHANTED_GOLDEN_APPLE)); + this.spawnAtLocation(sw, new ItemStack(Items.ENCHANTED_GOLDEN_APPLE)); } - super.onDeath(source); + super.die(source); } } } diff --git a/src/main/java/carpetextra/mixins/SpongeBlockMixin.java b/src/main/java/carpetextra/mixins/SpongeBlockMixin.java index 4b8a601a..73376144 100644 --- a/src/main/java/carpetextra/mixins/SpongeBlockMixin.java +++ b/src/main/java/carpetextra/mixins/SpongeBlockMixin.java @@ -1,7 +1,7 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.SpongeBlock; +import net.minecraft.world.level.block.SpongeBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.ModifyConstant; @@ -10,7 +10,7 @@ public abstract class SpongeBlockMixin { @ModifyConstant( - method = "absorbWater", + method = "removeWaterBreadthFirstSearch", constant = @Constant(intValue = 65) ) private int onCheckBlockLimit(int blockLimit) { @@ -19,7 +19,7 @@ private int onCheckBlockLimit(int blockLimit) { @ModifyConstant( - method = "absorbWater", + method = "removeWaterBreadthFirstSearch", constant = @Constant(intValue = 6) ) private int onCheckOffsetLimit(int offsetLimit) { diff --git a/src/main/java/carpetextra/mixins/StrayEntityMixin.java b/src/main/java/carpetextra/mixins/StrayEntityMixin.java index ef68eeaa..f8b8c99a 100644 --- a/src/main/java/carpetextra/mixins/StrayEntityMixin.java +++ b/src/main/java/carpetextra/mixins/StrayEntityMixin.java @@ -1,29 +1,29 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.mob.StrayEntity; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.gen.structure.Structure; -import net.minecraft.world.gen.structure.StructureKeys; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.monster.skeleton.Stray; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.levelgen.structure.BuiltinStructures; +import net.minecraft.world.level.levelgen.structure.Structure; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -@Mixin(StrayEntity.class) +@Mixin(Stray.class) public abstract class StrayEntityMixin { - @Redirect(method = "canSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/ServerWorldAccess;isSkyVisible(Lnet/minecraft/util/math/BlockPos;)Z")) - private static boolean isSkylightOrIglooVisible(ServerWorldAccess world, BlockPos pos) + @Redirect(method = "checkStraySpawnRules", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/ServerLevelAccessor;canSeeSky(Lnet/minecraft/core/BlockPos;)Z")) + private static boolean isSkylightOrIglooVisible(ServerLevelAccessor world, BlockPos pos) { if (!CarpetExtraSettings.straySpawningInIgloos) { - return world.isSkyVisible(pos); + return world.canSeeSky(pos); } - Structure structure = world.getRegistryManager().getOrThrow(RegistryKeys.STRUCTURE).get(StructureKeys.IGLOO); - return world.isSkyVisible(pos) || - ((ServerWorld)world).getStructureAccessor().getStructureAt(pos,structure).hasChildren(); + Structure structure = world.registryAccess().lookupOrThrow(Registries.STRUCTURE).getValue(BuiltinStructures.IGLOO); + return world.canSeeSky(pos) || + ((ServerLevel)world).structureManager().getStructureAt(pos,structure).isValid(); } } diff --git a/src/main/java/carpetextra/mixins/SugarCaneBlock_fertilizerMixin.java b/src/main/java/carpetextra/mixins/SugarCaneBlock_fertilizerMixin.java index ec06b890..5ea7100c 100644 --- a/src/main/java/carpetextra/mixins/SugarCaneBlock_fertilizerMixin.java +++ b/src/main/java/carpetextra/mixins/SugarCaneBlock_fertilizerMixin.java @@ -1,52 +1,55 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.*; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldView; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.SugarCaneBlock; +import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; @Mixin(SugarCaneBlock.class) -public abstract class SugarCaneBlock_fertilizerMixin implements Fertilizable +public abstract class SugarCaneBlock_fertilizerMixin implements BonemealableBlock { @Override - public boolean isFertilizable(WorldView world, BlockPos pos, BlockState state) + public boolean isValidBonemealTarget(LevelReader world, BlockPos pos, BlockState state) { int i = this.countSugarCaneAbove(world, pos); int j = this.countSugarCaneBelow(world, pos); - return CarpetExtraSettings.betterBonemeal && i + j < 2 && world.getBlockState(pos.up(i + 1)).isAir(); + return CarpetExtraSettings.betterBonemeal && i + j < 2 && world.getBlockState(pos.above(i + 1)).isAir(); } @Override - public boolean canGrow(World world, Random random, BlockPos pos, BlockState state) + public boolean isBonemealSuccess(Level world, RandomSource random, BlockPos pos, BlockState state) { return true; } @Override - public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) + public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) { int i = this.countSugarCaneAbove(world, pos); - world.setBlockState(pos.up(i + 1), Blocks.SUGAR_CANE.getDefaultState()); + world.setBlockAndUpdate(pos.above(i + 1), Blocks.SUGAR_CANE.defaultBlockState()); } - private int countSugarCaneAbove(BlockView world, BlockPos pos) + private int countSugarCaneAbove(BlockGetter world, BlockPos pos) { int i; - for (i = 0; i < 2 && world.getBlockState(pos.up(i + 1)).isOf(Blocks.SUGAR_CANE); ++i) + for (i = 0; i < 2 && world.getBlockState(pos.above(i + 1)).is(Blocks.SUGAR_CANE); ++i) { } return i; } - private int countSugarCaneBelow(BlockView world, BlockPos pos) + private int countSugarCaneBelow(BlockGetter world, BlockPos pos) { int i; - for (i = 0; i < 2 && world.getBlockState(pos.down(i + 1)).isOf(Blocks.SUGAR_CANE); ++i) + for (i = 0; i < 2 && world.getBlockState(pos.below(i + 1)).is(Blocks.SUGAR_CANE); ++i) { } return i; diff --git a/src/main/java/carpetextra/mixins/SugarCaneBlock_syncMixin.java b/src/main/java/carpetextra/mixins/SugarCaneBlock_syncMixin.java index 60355442..159f39fa 100644 --- a/src/main/java/carpetextra/mixins/SugarCaneBlock_syncMixin.java +++ b/src/main/java/carpetextra/mixins/SugarCaneBlock_syncMixin.java @@ -1,8 +1,8 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.block.Block; -import net.minecraft.block.SugarCaneBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SugarCaneBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.Constant; import org.spongepowered.asm.mixin.injection.ModifyConstant; @@ -10,11 +10,11 @@ @Mixin(SugarCaneBlock.class) public abstract class SugarCaneBlock_syncMixin { - @ModifyConstant(method = "randomTick", require = 2, constant = @Constant(intValue = Block.SKIP_REDRAW_AND_BLOCK_ENTITY_REPLACED_CALLBACK)) + @ModifyConstant(method = "randomTick", require = 2, constant = @Constant(intValue = Block.UPDATE_NONE)) private int onOnScheduledTick1(int original) { if (CarpetExtraSettings.blockStateSyncing) - return original | Block.NOTIFY_LISTENERS; + return original | Block.UPDATE_CLIENTS; else return original; } diff --git a/src/main/java/carpetextra/mixins/TurtleMateGoalMixin.java b/src/main/java/carpetextra/mixins/TurtleMateGoalMixin.java index c194360c..347ca581 100644 --- a/src/main/java/carpetextra/mixins/TurtleMateGoalMixin.java +++ b/src/main/java/carpetextra/mixins/TurtleMateGoalMixin.java @@ -1,19 +1,19 @@ package carpetextra.mixins; import carpetextra.CarpetExtraSettings; -import net.minecraft.entity.ai.goal.AnimalMateGoal; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.ai.goal.BreedGoal; +import net.minecraft.world.entity.animal.Animal; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(targets = "net.minecraft.entity.passive.TurtleEntity$MateGoal") -public abstract class TurtleMateGoalMixin extends AnimalMateGoal { +@Mixin(targets = "net.minecraft.world.entity.animal.turtle.Turtle$TurtleBreedGoal") +public abstract class TurtleMateGoalMixin extends BreedGoal { - public TurtleMateGoalMixin(AnimalEntity animalEntity_1, double double_1) { + public TurtleMateGoalMixin(Animal animalEntity_1, double double_1) { super(animalEntity_1, double_1); } @@ -21,15 +21,15 @@ public TurtleMateGoalMixin(AnimalEntity animalEntity_1, double double_1) { method = "breed()V", at = @At( value = "INVOKE", - target = "Lnet/minecraft/server/world/ServerWorld;spawnEntity(Lnet/minecraft/entity/Entity;)Z", + target = "Lnet/minecraft/server/level/ServerLevel;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z", ordinal = 0 ), cancellable = true ) protected void preventDispenserSpawningExperience(CallbackInfo ci) { - ServerPlayerEntity player = super.animal.getLovingPlayer(); - if (player == null && super.mate != null) { - player = super.mate.getLovingPlayer(); + ServerPlayer player = super.animal.getLoveCause(); + if (player == null && super.partner != null) { + player = super.partner.getLoveCause(); } if(player == null && CarpetExtraSettings.dispensersFeedAnimals) { ci.cancel(); diff --git a/src/main/java/carpetextra/mixins/VillagerEntity_wartFarmMixin.java b/src/main/java/carpetextra/mixins/VillagerEntity_wartFarmMixin.java index fb427f01..b8a97b77 100644 --- a/src/main/java/carpetextra/mixins/VillagerEntity_wartFarmMixin.java +++ b/src/main/java/carpetextra/mixins/VillagerEntity_wartFarmMixin.java @@ -2,47 +2,47 @@ import carpetextra.CarpetExtraSettings; import com.google.common.collect.ImmutableSet; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.MerchantEntity; -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.village.VillagerData; -import net.minecraft.village.VillagerProfession; -import net.minecraft.world.World; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.npc.villager.AbstractVillager; +import net.minecraft.world.entity.npc.villager.Villager; +import net.minecraft.world.entity.npc.villager.VillagerData; +import net.minecraft.world.entity.npc.villager.VillagerProfession; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(VillagerEntity.class) -public abstract class VillagerEntity_wartFarmMixin extends MerchantEntity +@Mixin(Villager.class) +public abstract class VillagerEntity_wartFarmMixin extends AbstractVillager { - public VillagerEntity_wartFarmMixin(EntityType entityType, World world) + public VillagerEntity_wartFarmMixin(EntityType entityType, Level world) { super(entityType, world); } @Shadow public abstract VillagerData getVillagerData(); - @Inject(method = "canGather", at = @At("HEAD"), cancellable = true) - private void canClericGather(ServerWorld world, ItemStack stack, CallbackInfoReturnable cir) + @Inject(method = "wantsToPickUp", at = @At("HEAD"), cancellable = true) + private void canClericGather(ServerLevel world, ItemStack stack, CallbackInfoReturnable cir) { if (CarpetExtraSettings.clericsFarmWarts && stack.getItem() == Items.NETHER_WART && - getVillagerData().profession().matchesKey(VillagerProfession.CLERIC) ) + getVillagerData().profession().is(VillagerProfession.CLERIC) ) { cir.setReturnValue(true); } } - @Inject(method = "hasSeedToPlant", at = @At("HEAD"), cancellable = true) + @Inject(method = "hasFarmSeeds", at = @At("HEAD"), cancellable = true) private void hasWartsToPlant(CallbackInfoReturnable cir) { - if (CarpetExtraSettings.clericsFarmWarts && getVillagerData().profession().matchesKey(VillagerProfession.CLERIC )) + if (CarpetExtraSettings.clericsFarmWarts && getVillagerData().profession().is(VillagerProfession.CLERIC )) { - cir.setReturnValue(getInventory().containsAny(ImmutableSet.of(Items.NETHER_WART))); + cir.setReturnValue(getInventory().hasAnyOf(ImmutableSet.of(Items.NETHER_WART))); } } } diff --git a/src/main/java/carpetextra/mixins/VillagerProfession_wartFarmMixin.java b/src/main/java/carpetextra/mixins/VillagerProfession_wartFarmMixin.java index eb6bf07b..d98c53e7 100644 --- a/src/main/java/carpetextra/mixins/VillagerProfession_wartFarmMixin.java +++ b/src/main/java/carpetextra/mixins/VillagerProfession_wartFarmMixin.java @@ -1,15 +1,15 @@ package carpetextra.mixins; import com.google.common.collect.ImmutableSet; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.item.Item; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.sound.SoundEvent; -import net.minecraft.village.VillagerProfession; -import net.minecraft.world.poi.PointOfInterestType; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.ai.village.poi.PoiType; +import net.minecraft.world.entity.npc.villager.VillagerProfession; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -25,9 +25,9 @@ public abstract class VillagerProfession_wartFarmMixin @Shadow private static VillagerProfession register( Registry registry, - RegistryKey key, - Predicate> heldWorkstation, - Predicate> acquirableWorkstation, + ResourceKey key, + Predicate> heldWorkstation, + Predicate> acquirableWorkstation, ImmutableSet gatherableItems, ImmutableSet secondaryJobSites, @Nullable SoundEvent workSound @@ -36,8 +36,8 @@ private static VillagerProfession register( } private static boolean handled = false; - @Inject(method = "register(Lnet/minecraft/registry/Registry;Lnet/minecraft/registry/RegistryKey;Ljava/util/function/Predicate;Ljava/util/function/Predicate;Lcom/google/common/collect/ImmutableSet;Lcom/google/common/collect/ImmutableSet;Lnet/minecraft/sound/SoundEvent;)Lnet/minecraft/village/VillagerProfession;", cancellable = true, at = @At("HEAD")) - private static void registerCleric(Registry registry, RegistryKey key, Predicate> heldWorkstation, Predicate> acquirableWorkstation, ImmutableSet gatherableItems, ImmutableSet secondaryJobSites, @Nullable SoundEvent workSound, CallbackInfoReturnable cir) + @Inject(method = "register(Lnet/minecraft/core/Registry;Lnet/minecraft/resources/ResourceKey;Ljava/util/function/Predicate;Ljava/util/function/Predicate;Lcom/google/common/collect/ImmutableSet;Lcom/google/common/collect/ImmutableSet;Lnet/minecraft/sounds/SoundEvent;)Lnet/minecraft/world/entity/npc/villager/VillagerProfession;", cancellable = true, at = @At("HEAD")) + private static void registerCleric(Registry registry, ResourceKey key, Predicate> heldWorkstation, Predicate> acquirableWorkstation, ImmutableSet gatherableItems, ImmutableSet secondaryJobSites, @Nullable SoundEvent workSound, CallbackInfoReturnable cir) { if (key == VillagerProfession.CLERIC && !handled) { diff --git a/src/main/java/carpetextra/mixins/VillagerTaskListProvider_wartFarmMixin.java b/src/main/java/carpetextra/mixins/VillagerTaskListProvider_wartFarmMixin.java index d66bf44f..a5de583d 100644 --- a/src/main/java/carpetextra/mixins/VillagerTaskListProvider_wartFarmMixin.java +++ b/src/main/java/carpetextra/mixins/VillagerTaskListProvider_wartFarmMixin.java @@ -2,29 +2,29 @@ import carpetextra.CarpetExtraSettings; import com.mojang.datafixers.util.Pair; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.brain.task.Task; -import net.minecraft.entity.ai.brain.task.VillagerTaskListProvider; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.village.VillagerProfession; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.behavior.BehaviorControl; +import net.minecraft.world.entity.ai.behavior.VillagerGoalPackages; +import net.minecraft.world.entity.npc.villager.VillagerProfession; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -@Mixin(VillagerTaskListProvider.class) +@Mixin(VillagerGoalPackages.class) public abstract class VillagerTaskListProvider_wartFarmMixin { - @Shadow private static Pair> createBusyFollowTask() {return null;} + @Shadow private static Pair> getMinimalLookBehavior() {return null;} - @Redirect(method = "createWorkTasks", at = @At( + @Redirect(method = "getWorkPackage", at = @At( value = "FIELD", - target = "Lnet/minecraft/village/VillagerProfession;FARMER:Lnet/minecraft/registry/RegistryKey;" + target = "Lnet/minecraft/world/entity/npc/villager/VillagerProfession;FARMER:Lnet/minecraft/resources/ResourceKey;" )) - private static RegistryKey redirectFarmer(RegistryEntry profession, float speed) + private static ResourceKey redirectFarmer(Holder profession, float speed) { - if (CarpetExtraSettings.clericsFarmWarts && profession.matchesKey(VillagerProfession.CLERIC)) + if (CarpetExtraSettings.clericsFarmWarts && profession.is(VillagerProfession.CLERIC)) return VillagerProfession.CLERIC; return VillagerProfession.FARMER; } diff --git a/src/main/java/carpetextra/utils/BlockPlacer.java b/src/main/java/carpetextra/utils/BlockPlacer.java index 467c109d..a0f60bdd 100644 --- a/src/main/java/carpetextra/utils/BlockPlacer.java +++ b/src/main/java/carpetextra/utils/BlockPlacer.java @@ -1,30 +1,30 @@ package carpetextra.utils; import org.jetbrains.annotations.Nullable; -import net.minecraft.block.BedBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ComparatorBlock; -import net.minecraft.block.RepeaterBlock; -import net.minecraft.block.enums.BlockHalf; -import net.minecraft.block.enums.ComparatorMode; -import net.minecraft.block.enums.SlabType; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.property.EnumProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.state.property.Property; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.BedBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.ComparatorBlock; +import net.minecraft.world.level.block.RepeaterBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.ComparatorMode; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.block.state.properties.Half; +import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.phys.Vec3; public class BlockPlacer { - public static BlockState alternativeBlockPlacement(Block block, ItemPlacementContext context) + public static BlockState alternativeBlockPlacement(Block block, BlockPlaceContext context) { - Vec3d hitPos = context.getHitPos(); - BlockPos blockPos = context.getBlockPos(); + Vec3 hitPos = context.getClickLocation(); + BlockPos blockPos = context.getClickedPos(); double relativeHitX = hitPos.x - blockPos.getX(); - BlockState state = block.getPlacementState(context); + BlockState state = block.getStateForPlacement(context); if (relativeHitX < 2 || state == null) // vanilla handling return null; @@ -36,7 +36,7 @@ public static BlockState alternativeBlockPlacement(Block block, ItemPlacementCon if (directionProp != null) { - Direction origFacing = state.get(directionProp); + Direction origFacing = state.getValue(directionProp); Direction facing = origFacing; int facingIndex = protocolValue & 0xF; @@ -46,33 +46,33 @@ public static BlockState alternativeBlockPlacement(Block block, ItemPlacementCon } else if (facingIndex >= 0 && facingIndex <= 5) { - facing = Direction.byIndex(facingIndex); + facing = Direction.from3DDataValue(facingIndex); } - if (directionProp.getValues().contains(facing) == false) + if (directionProp.getPossibleValues().contains(facing) == false) { - facing = context.getPlayer().getHorizontalFacing().getOpposite(); + facing = context.getPlayer().getDirection().getOpposite(); } - if (facing != origFacing && directionProp.getValues().contains(facing)) + if (facing != origFacing && directionProp.getPossibleValues().contains(facing)) { if (state.getBlock() instanceof BedBlock) { - BlockPos headPos = blockPos.offset(facing); + BlockPos headPos = blockPos.relative(facing); - if (context.getWorld().getBlockState(headPos).canReplace(context) == false) + if (context.getLevel().getBlockState(headPos).canBeReplaced(context) == false) { return null; } } - state = state.with(directionProp, facing); + state = state.setValue(directionProp, facing); } } - else if (state.contains(Properties.AXIS)) + else if (state.hasProperty(BlockStateProperties.AXIS)) { Direction.Axis axis = Direction.Axis.VALUES[protocolValue % 3]; - state = state.with(Properties.AXIS, axis); + state = state.setValue(BlockStateProperties.AXIS, axis); } protocolValue &= 0xFFFFFFF0; @@ -83,26 +83,26 @@ else if (state.contains(Properties.AXIS)) { Integer delay = (protocolValue / 16); - if (RepeaterBlock.DELAY.getValues().contains(delay)) + if (RepeaterBlock.DELAY.getPossibleValues().contains(delay)) { - state = state.with(RepeaterBlock.DELAY, delay); + state = state.setValue(RepeaterBlock.DELAY, delay); } } else if (protocolValue == 16) { if (block instanceof ComparatorBlock) { - state = state.with(ComparatorBlock.MODE, ComparatorMode.SUBTRACT); + state = state.setValue(ComparatorBlock.MODE, ComparatorMode.SUBTRACT); } - else if (state.contains(Properties.BLOCK_HALF) && - state.get(Properties.BLOCK_HALF) == BlockHalf.BOTTOM) + else if (state.hasProperty(BlockStateProperties.HALF) && + state.getValue(BlockStateProperties.HALF) == Half.BOTTOM) { - state = state.with(Properties.BLOCK_HALF, BlockHalf.TOP); + state = state.setValue(BlockStateProperties.HALF, Half.TOP); } - else if (state.contains(Properties.SLAB_TYPE) && - state.get(Properties.SLAB_TYPE) == SlabType.BOTTOM) + else if (state.hasProperty(BlockStateProperties.SLAB_TYPE) && + state.getValue(BlockStateProperties.SLAB_TYPE) == SlabType.BOTTOM) { - state = state.with(Properties.SLAB_TYPE, SlabType.TOP); + state = state.setValue(BlockStateProperties.SLAB_TYPE, SlabType.TOP); } } } @@ -118,7 +118,7 @@ public static EnumProperty getFirstDirectionProperty(BlockState state { if (prop instanceof EnumProperty enumProperty) { - if (enumProperty.getType().equals(Direction.class)) + if (enumProperty.getValueClass().equals(Direction.class)) { return (EnumProperty) enumProperty; } diff --git a/src/main/java/carpetextra/utils/CarpetExtraTranslations.java b/src/main/java/carpetextra/utils/CarpetExtraTranslations.java index 20660e66..fe5736df 100644 --- a/src/main/java/carpetextra/utils/CarpetExtraTranslations.java +++ b/src/main/java/carpetextra/utils/CarpetExtraTranslations.java @@ -2,6 +2,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.Strictness; import com.google.gson.reflect.TypeToken; import org.apache.commons.io.IOUtils; @@ -26,7 +27,7 @@ public static Map getTranslationFromResourcePath(String lang) } catch (IOException e) { return Collections.emptyMap(); } - Gson gson = new GsonBuilder().setLenient().create(); // lenient allows for comments + Gson gson = new GsonBuilder().setStrictness(Strictness.LENIENT).create(); // lenient allows for comments return gson.fromJson(jsonData, new TypeToken>() {}.getType()); } } diff --git a/src/main/java/carpetextra/utils/InventoryUtils.java b/src/main/java/carpetextra/utils/InventoryUtils.java index 12a97c94..1546b539 100644 --- a/src/main/java/carpetextra/utils/InventoryUtils.java +++ b/src/main/java/carpetextra/utils/InventoryUtils.java @@ -1,8 +1,8 @@ package carpetextra.utils; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.ContainerComponent; -import net.minecraft.item.ItemStack; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemContainerContents; public class InventoryUtils { /** @@ -11,7 +11,7 @@ public class InventoryUtils { * @return true if the item's stored inventory has any items */ public static boolean shulkerBoxHasItems(ItemStack stackShulkerBox) { - ContainerComponent containerComponent = stackShulkerBox.get(DataComponentTypes.CONTAINER); - return containerComponent != null && !containerComponent.iterateNonEmpty().iterator().hasNext(); + ItemContainerContents containerComponent = stackShulkerBox.get(DataComponents.CONTAINER); + return containerComponent != null && !containerComponent.nonEmptyItems().iterator().hasNext(); } } diff --git a/src/main/java/carpetextra/utils/PlaceBlockDispenserBehavior.java b/src/main/java/carpetextra/utils/PlaceBlockDispenserBehavior.java index 4532d590..680bb2aa 100644 --- a/src/main/java/carpetextra/utils/PlaceBlockDispenserBehavior.java +++ b/src/main/java/carpetextra/utils/PlaceBlockDispenserBehavior.java @@ -2,142 +2,153 @@ import carpetextra.CarpetExtraSettings; -import net.minecraft.block.*; -import net.minecraft.block.dispenser.ItemDispenserBehavior; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.enums.BlockHalf; -import net.minecraft.block.enums.SlabType; -import net.minecraft.fluid.FluidState; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.sound.SoundCategory; -import net.minecraft.state.property.Properties; -import net.minecraft.state.property.Property; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseCoralPlantTypeBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.KelpBlock; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.ObserverBlock; +import net.minecraft.world.level.block.SeaPickleBlock; +import net.minecraft.world.level.block.SeagrassBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.TurtleEggBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.Half; +import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import java.util.Collection; -public class PlaceBlockDispenserBehavior extends ItemDispenserBehavior { +public class PlaceBlockDispenserBehavior extends DefaultDispenseItemBehavior { private static final PlaceBlockDispenserBehavior instance = new PlaceBlockDispenserBehavior(); public static PlaceBlockDispenserBehavior getInstance() {return instance;} @Override - public ItemStack dispenseSilently(BlockPointer blockPointer, ItemStack itemStack) { + public ItemStack execute(BlockSource blockPointer, ItemStack itemStack) { Item item = itemStack.getItem(); if (!CarpetExtraSettings.dispenserPlacesBlocks || !(item instanceof BlockItem)) { - return super.dispenseSilently(blockPointer, itemStack); + return super.execute(blockPointer, itemStack); } Block block = ((BlockItem) item).getBlock(); - Direction facing = blockPointer.state().get(DispenserBlock.FACING); + Direction facing = blockPointer.state().getValue(DispenserBlock.FACING); Direction.Axis axis = facing.getAxis(); - World world = blockPointer.world(); + Level world = blockPointer.level(); BlockPos pos = blockPointer.pos(); final Direction ffacing = facing; if (usePlacementContext(item, block)) { // no offset - BlockHitResult hitResult = new BlockHitResult(Vec3d.of(pos.offset(facing, 2)), facing, pos, false); // offset - ItemPlacementContext ipc = new ItemPlacementContext(world, null, Hand.MAIN_HAND, itemStack, hitResult) { + BlockHitResult hitResult = new BlockHitResult(Vec3.atLowerCornerOf(pos.relative(facing, 2)), facing, pos, false); // offset + BlockPlaceContext ipc = new BlockPlaceContext(world, null, InteractionHand.MAIN_HAND, itemStack, hitResult) { @Override - public Direction getPlayerLookDirection() { + public Direction getNearestLookingDirection() { return ffacing; } @Override - public Direction getHorizontalPlayerFacing() { + public Direction getHorizontalDirection() { return ffacing.getAxis() == Direction.Axis.Y ? Direction.NORTH : ffacing; } @Override - public Direction[] getPlacementDirections() { - return new Direction[] {getPlayerLookDirection(), Direction.UP, Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST}; + public Direction[] getNearestLookingDirections() { + return new Direction[] {getNearestLookingDirection(), Direction.UP, Direction.DOWN, Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST}; } }; - ActionResult result = ((BlockItem) item).place(ipc); - if (result.isAccepted()) { + InteractionResult result = ((BlockItem) item).place(ipc); + if (result.consumesAction()) { return itemStack; } else { - return super.dispenseSilently(blockPointer, itemStack); + return super.execute(blockPointer, itemStack); } } - pos = pos.offset(facing); + pos = pos.relative(facing); - BlockState state = block.getDefaultState(); - if (state == null) return super.dispenseSilently(blockPointer, itemStack); + BlockState state = block.defaultBlockState(); + if (state == null) return super.execute(blockPointer, itemStack); Collection> properties = state.getProperties(); - if (block instanceof StairsBlock) { + if (block instanceof StairBlock) { facing = facing.getOpposite(); } - if (properties.contains(Properties.FACING)) { - state = state.with(Properties.FACING, facing); - } else if (properties.contains(Properties.HORIZONTAL_FACING) && axis != Direction.Axis.Y) { - state = state.with(Properties.HORIZONTAL_FACING, facing); - } else if (properties.contains(Properties.HOPPER_FACING) && axis != Direction.Axis.Y) { - state = state.with(Properties.HOPPER_FACING, facing); - } else if (properties.contains(Properties.AXIS)) { - state = state.with(Properties.AXIS, axis); - } else if (properties.contains(Properties.HORIZONTAL_AXIS) && axis != Direction.Axis.Y) { - state = state.with(Properties.HORIZONTAL_AXIS, axis); + if (properties.contains(BlockStateProperties.FACING)) { + state = state.setValue(BlockStateProperties.FACING, facing); + } else if (properties.contains(BlockStateProperties.HORIZONTAL_FACING) && axis != Direction.Axis.Y) { + state = state.setValue(BlockStateProperties.HORIZONTAL_FACING, facing); + } else if (properties.contains(BlockStateProperties.FACING_HOPPER) && axis != Direction.Axis.Y) { + state = state.setValue(BlockStateProperties.FACING_HOPPER, facing); + } else if (properties.contains(BlockStateProperties.AXIS)) { + state = state.setValue(BlockStateProperties.AXIS, axis); + } else if (properties.contains(BlockStateProperties.HORIZONTAL_AXIS) && axis != Direction.Axis.Y) { + state = state.setValue(BlockStateProperties.HORIZONTAL_AXIS, axis); } - if (properties.contains(Properties.BLOCK_HALF)) { - state = state.with(Properties.BLOCK_HALF, facing == Direction.UP ? BlockHalf.TOP : BlockHalf.BOTTOM); - } else if (properties.contains(Properties.SLAB_TYPE)) { - state = state.with(Properties.SLAB_TYPE, facing == Direction.DOWN ? SlabType.TOP : SlabType.BOTTOM); + if (properties.contains(BlockStateProperties.HALF)) { + state = state.setValue(BlockStateProperties.HALF, facing == Direction.UP ? Half.TOP : Half.BOTTOM); + } else if (properties.contains(BlockStateProperties.SLAB_TYPE)) { + state = state.setValue(BlockStateProperties.SLAB_TYPE, facing == Direction.DOWN ? SlabType.TOP : SlabType.BOTTOM); } - if (properties.contains(Properties.WATERLOGGED)) { - state = state.with(Properties.WATERLOGGED, false); + if (properties.contains(BlockStateProperties.WATERLOGGED)) { + state = state.setValue(BlockStateProperties.WATERLOGGED, false); } if (block instanceof ObserverBlock) { - state = state.with(ObserverBlock.POWERED, true); + state = state.setValue(ObserverBlock.POWERED, true); } if (block instanceof LeavesBlock) { - state = state.with(Properties.PERSISTENT, true); + state = state.setValue(BlockStateProperties.PERSISTENT, true); } BlockState currentBlockState = world.getBlockState(pos); FluidState currentFluidState = world.getFluidState(pos); - if ((currentBlockState.isAir() || currentBlockState.isIn(BlockTags.REPLACEABLE)) && currentBlockState.getBlock() != block && state.canPlaceAt(world, pos)) { - state = Block.postProcessState(state, world, pos); - boolean blockWasPlaced = world.setBlockState(pos, state); - block.onPlaced(world, pos, state, null, itemStack); - world.updateNeighbor(pos, state.getBlock(), null); - BlockItem.writeNbtToBlockEntity(world, null, pos, itemStack); + if ((currentBlockState.isAir() || currentBlockState.is(BlockTags.REPLACEABLE)) && currentBlockState.getBlock() != block && state.canSurvive(world, pos)) { + state = Block.updateFromNeighbourShapes(state, world, pos); + boolean blockWasPlaced = world.setBlockAndUpdate(pos, state); + block.setPlacedBy(world, pos, state, null, itemStack); + world.neighborChanged(pos, state.getBlock(), null); + BlockItem.updateCustomBlockEntityTag(world, null, pos, itemStack); /* copy contents, mark it dirty to save & update comparators */ BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity != null) { - blockEntity.readComponents(itemStack); - blockEntity.markDirty(); + blockEntity.applyComponentsFromItemStack(itemStack); + blockEntity.setChanged(); } - if (currentFluidState.isStill() && block instanceof FluidFillable) { - ((FluidFillable) block).tryFillWithFluid(world, pos, state, currentFluidState); + if (currentFluidState.isSource() && block instanceof LiquidBlockContainer) { + ((LiquidBlockContainer) block).placeLiquid(world, pos, state, currentFluidState); } - BlockSoundGroup soundType = state.getSoundGroup(); - world.playSound(null, pos, soundType.getPlaceSound(), SoundCategory.BLOCKS, (soundType.getVolume() + 1.0F / 2.0F), soundType.getPitch() * 0.8F); + SoundType soundType = state.getSoundType(); + world.playSound(null, pos, soundType.getPlaceSound(), SoundSource.BLOCKS, (soundType.getVolume() + 1.0F / 2.0F), soundType.getPitch() * 0.8F); if (blockWasPlaced) { - itemStack.decrement(1); + itemStack.shrink(1); return itemStack; } } - return super.dispenseSilently(blockPointer, itemStack); + return super.execute(blockPointer, itemStack); } public static boolean canPlace(Block block) { @@ -150,6 +161,6 @@ public static boolean canPlace(Block block) { private static boolean usePlacementContext(Item item, Block block) { return item.getClass() != BlockItem.class || block instanceof SeaPickleBlock || block instanceof TurtleEggBlock || - block instanceof SeagrassBlock || block instanceof KelpBlock || block instanceof AbstractCoralBlock; + block instanceof SeagrassBlock || block instanceof KelpBlock || block instanceof BaseCoralPlantTypeBlock; } } diff --git a/src/main/java/carpetextra/utils/VoidContainer.java b/src/main/java/carpetextra/utils/VoidContainer.java index a02e4f22..e5d6cf2b 100644 --- a/src/main/java/carpetextra/utils/VoidContainer.java +++ b/src/main/java/carpetextra/utils/VoidContainer.java @@ -1,20 +1,20 @@ package carpetextra.utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.ScreenHandler; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; -public class VoidContainer extends ScreenHandler +public class VoidContainer extends AbstractContainerMenu { public VoidContainer() { super(null, 1); } @Override - public boolean canUse(PlayerEntity var1) { return false; } + public boolean stillValid(Player var1) { return false; } @Override - public void onContentChanged(Inventory inventory_1) { } + public void slotsChanged(Container inventory_1) { } @Override - public ItemStack quickMove(PlayerEntity player, int index) { + public ItemStack quickMoveStack(Player player, int index) { throw new IllegalStateException("Didn't expect transferSlot to be called in fake container"); } } \ No newline at end of file diff --git a/src/main/java/carpetextra/utils/WoodDelayMultipliers.java b/src/main/java/carpetextra/utils/WoodDelayMultipliers.java index dca19e39..94bd50e3 100644 --- a/src/main/java/carpetextra/utils/WoodDelayMultipliers.java +++ b/src/main/java/carpetextra/utils/WoodDelayMultipliers.java @@ -1,7 +1,7 @@ package carpetextra.utils; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; import java.util.Map; diff --git a/src/main/resources/carpet-extra.mixins.json b/src/main/resources/carpet-extra.mixins.json index 7f42b5d1..042286f5 100644 --- a/src/main/resources/carpet-extra.mixins.json +++ b/src/main/resources/carpet-extra.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "carpetextra.mixins", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "mixins": [ "DispenserBlockMixin", "FallingBlockEntityMixin", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index e78952b5..a50937b2 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -28,8 +28,8 @@ "depends": { "fabricloader": ">=0.16.10", - "carpet": ">=1.4.169", - "minecraft": ">=1.21.5", + "carpet": ">=1.4.193", + "minecraft": ">=1.21.11", "java": ">=21" }, "custom": {