diff --git a/build.gradle b/build.gradle index d82d2de9..c4c859ee 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,13 @@ plugins { id "me.shedaniel.unified-publishing" version "0.1.+" } +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) +// vendor = JvmVendorSpec.ANY + } +} + tasks.named('wrapper', Wrapper).configure { // Define wrapper values here so as to not have to always do so when updating gradlew.properties. // Switching this to Wrapper.DistributionType.ALL will download the full gradle sources that comes with @@ -56,6 +63,10 @@ tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } +static def isJetBrainsRuntime() { + return System.getProperty('java.vm.vendor').contains('JetBrains') +} + neoForge { // Specify the version of NeoForge to use. version = project.neo_version @@ -76,6 +87,16 @@ neoForge { sourceSet(sourceSets.main) } } + + if (isJetBrainsRuntime()) { + runs { + client { + jvmArgument("-XX:+AllowEnhancedClassRedefinition") + jvmArgument("-XX:HotswapAgent=fatjar") + } + } + } + runs { client { client() @@ -89,6 +110,9 @@ neoForge { systemProperty 'mixin.env.remapRefMap', 'true' systemProperty 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" +// jvmArgument("-Dmixin.debug.verbose=true") +// jvmArgument("-Dmixin.debug.export=true") + // These arguments allow for optional authentication with Mojang servers. // If you want to authenticate, put these properties in GRADLE_HOME/gradle.properties. // By default, this is C:\Users\\.gradle\gradle.properties on Windows or ~/.gradle/gradle.properties on Linux/MacOS. @@ -107,8 +131,8 @@ neoForge { } // Add mixin config to runtime - // programArgument('-mixin.config=' + project.getProperty('mod_id') + '.mixins.json') - // programArgument('-mixin.config=' + project.getProperty('mod_id') + '.data.mixins.json') + programArgument('-mixin.config=' + project.getProperty('mod_id') + '.mixins.json') + programArgument('-mixin.config=' + project.getProperty('mod_id') + '.data.mixins.json') } server { @@ -122,7 +146,7 @@ neoForge { systemProperty 'mixin.debug.export', 'true' // Add mixin config to runtime - // programArgument('-mixin.config=' + project.getProperty('mod_id') + '.mixins.json') + programArgument('-mixin.config=' + project.getProperty('mod_id') + '.mixins.json') programArgument('-mixin.config=' + project.getProperty('mod_id') + '.data.mixins.json') } @@ -137,7 +161,7 @@ neoForge { systemProperty 'mixin.debug.export', 'true' // Add mixin config to runtime - // programArgument('-mixin.config=' + project.getProperty('mod_id') + '.mixins.json') + programArgument('-mixin.config=' + project.getProperty('mod_id') + '.mixins.json') programArgument('-mixin.config=' + project.getProperty('mod_id') + '.data.mixins.json') // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. diff --git a/src/main/java/org/teacon/xkdeco/mixin/air_duct/EntityMixin.java b/src/main/java/org/teacon/xkdeco/mixin/air_duct/EntityMixin.java index 1c419794..a709e2f8 100644 --- a/src/main/java/org/teacon/xkdeco/mixin/air_duct/EntityMixin.java +++ b/src/main/java/org/teacon/xkdeco/mixin/air_duct/EntityMixin.java @@ -1,11 +1,13 @@ package org.teacon.xkdeco.mixin.air_duct; +import org.spongepowered.asm.mixin.Debug; 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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.teacon.xkdeco.XKDeco; import org.teacon.xkdeco.block.AirDuctBlock; import org.teacon.xkdeco.duck.XKDPlayer; import org.teacon.xkdeco.util.CommonProxy; @@ -37,7 +39,7 @@ public abstract class EntityMixin { private BlockPos blockPosition; @Shadow - public abstract BlockState getFeetBlockState(); + public abstract BlockState getInBlockState(); @Shadow public abstract AABB getBoundingBox(); @@ -45,19 +47,6 @@ public abstract class EntityMixin { @Shadow public abstract boolean hasPose(Pose pPose); - @Inject(method = "canEnterPose", at = @At("HEAD"), cancellable = true) - private void xkdeco$canEnterPose(Pose pPose, CallbackInfoReturnable cir) { - if (pPose != Pose.STANDING && pPose != Pose.CROUCHING) { - return; - } - if (!(this instanceof XKDPlayer player)) { - return; - } - if (player.xkdeco$forceSwimmingPose() || getFeetBlockState().getBlock() instanceof AirDuctBlock) { - cir.setReturnValue(false); - } - } - @Inject(method = "isInvisible", at = @At("HEAD"), cancellable = true) private void xkdeco$isInvisible(CallbackInfoReturnable cir) { if (this instanceof XKDPlayer player && player.xkdeco$isHidingInAirDuct()) { diff --git a/src/main/java/org/teacon/xkdeco/mixin/air_duct/PlayerMixin.java b/src/main/java/org/teacon/xkdeco/mixin/air_duct/PlayerMixin.java index 65bcb8bf..5ca06c32 100644 --- a/src/main/java/org/teacon/xkdeco/mixin/air_duct/PlayerMixin.java +++ b/src/main/java/org/teacon/xkdeco/mixin/air_duct/PlayerMixin.java @@ -1,10 +1,16 @@ package org.teacon.xkdeco.mixin.air_duct; +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.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.teacon.xkdeco.XKDeco; +import org.teacon.xkdeco.block.AirDuctBlock; import org.teacon.xkdeco.block.XKDBlock; import org.teacon.xkdeco.duck.XKDPlayer; @@ -54,6 +60,19 @@ protected PlayerMixin(EntityType pEntityType, Level pLev } } + @Inject(method = "canPlayerFitWithinBlocksAndEntitiesWhen", at = @At("HEAD"), cancellable = true) + private void xkdeco$canPlayerFitWithinBlocksAndEntitiesWhen(Pose pose, CallbackInfoReturnable cir) { + if (pose != Pose.STANDING && pose != Pose.CROUCHING) { + return; + } + if (!(this instanceof XKDPlayer player)) { + return; + } + if (player.xkdeco$forceSwimmingPose() || getInBlockState().getBlock() instanceof AirDuctBlock) { + cir.setReturnValue(false); + } + } + @Override public boolean xkdeco$isHidingInAirDuct() { return xkdeco$isHidingInAirDuct; diff --git a/src/main/resources/assets/xkdeco/kiwi/placement/link/roof_ridge.yaml b/src/main/resources/assets/xkdeco/kiwi/placement/link/roof_ridge.yaml new file mode 100644 index 00000000..e69de29b