diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f811f6a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Disable autocrlf on generated files, they always generate with LF +# Add any extra files or paths here to make git stop saying they +# are changed when only line endings change. +src/generated/**/.cache/cache text eol=lf +src/generated/**/*.json text eol=lf diff --git a/build.gradle b/build.gradle index 57cc0cb..08f594f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,31 +1,24 @@ -buildscript { - repositories { - maven { url = 'https://files.minecraftforge.net/maven' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1+', changing: true - } +plugins { + id 'eclipse' + id 'maven-publish' + id 'net.minecraftforge.gradle' version '5.1.+' } -apply plugin: 'net.minecraftforge.gradle' -// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -apply plugin: 'eclipse' -apply plugin: 'maven-publish' -version = '1.19-2.36' -group = 'nl.requios.effortlessbuilding' // http://maven.apache.org/guides/mini/guide-naming-conventions.html +version = '1.19-2.37' +group = 'nl.requios.effortlessbuilding' archivesBaseName = 'effortlessbuilding' // Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. java.toolchain.languageVersion = JavaLanguageVersion.of(17) +println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" minecraft { // The mappings can be changed at any time, and must be in the following format. // snapshot_YYYYMMDD Snapshot are built nightly. // stable_# Stables are built at the discretion of the MCP team. // Use non-default mappings at your own risk. they may not always work. // Simply re-run your setup task after changing the mappings to update your workspace. - mappings channel: 'official', version: '1.19' + mappings channel: 'official', version: '1.19.2' accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. @@ -41,6 +34,9 @@ minecraft { // Recommended logging level for the console property 'forge.logging.console.level', 'debug' + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + property 'forge.enabledGameTestNamespaces', 'effortlessbuilding' + mods { effortlessbuilding { source sourceSets.main @@ -51,12 +47,31 @@ minecraft { server { workingDirectory project.file('run') - // Recommended logging data for a userdev environment (SCAN,REGISTRIES,REGISTRYDUMP) property 'forge.logging.markers', 'REGISTRIES' - // Recommended logging level for the console property 'forge.logging.console.level', 'debug' + property 'forge.enabledGameTestNamespaces', 'effortlessbuilding' + + mods { + effortlessbuilding { + source sourceSets.main + } + } + } + + // This run config launches GameTestServer and runs all registered gametests, then exits. + // By default, the server will crash when no gametests are provided. + // The gametest system is also enabled by default for other run configs under the /test command. + gameTestServer { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + + property 'forge.logging.console.level', 'debug' + + property 'forge.enabledGameTestNamespaces', 'effortlessbuilding' + mods { effortlessbuilding { source sourceSets.main @@ -65,12 +80,10 @@ minecraft { } data { - workingDirectory project.file('run') + workingDirectory project.file('run') - // Recommended logging data for a userdev environment (SCAN,REGISTRIES,REGISTRYDUMP) property 'forge.logging.markers', 'REGISTRIES' - // Recommended logging level for the console property 'forge.logging.console.level', 'debug' // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. @@ -85,11 +98,24 @@ minecraft { } } +// Include resources generated by data generators. +sourceSets.main.resources { srcDir 'src/generated/resources' } + +repositories { + // Put repositories for dependencies here + // ForgeGradle automatically adds the Forge maven and Maven Central for you + + // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: + // flatDir { + // dir 'libs' + // } +} + dependencies { - // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed - // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied. + // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft', it is assumed + // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied. // The userdev artifact is a special name and will get all sorts of transformations applied to it. - minecraft 'net.minecraftforge:forge:1.19-41.0.99' + minecraft 'net.minecraftforge:forge:1.19.2-43.1.47' // Real mod deobf dependency examples - these get remapped to your current mappings // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency @@ -102,7 +128,6 @@ dependencies { // For more info... // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html // http://www.gradle.org/docs/current/userguide/dependency_management.html - } // Example for how to get properties into the manifest for reading by the runtime.. @@ -113,18 +138,18 @@ jar { "Specification-Vendor": "requios", "Specification-Version": "1", // We are version 1 of ourselves "Implementation-Title": project.name, - "Implementation-Version": "${version}", + "Implementation-Version": project.jar.archiveVersion, "Implementation-Vendor" :"requios", "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") ]) } } -// Example configuration to allow publishing using the maven-publish task +// Example configuration to allow publishing using the maven-publish plugin // This is the preferred method to reobfuscate your jar file -jar.finalizedBy('reobfJar') +jar.finalizedBy('reobfJar') // However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing -//publish.dependsOn('reobfJar') +// publish.dependsOn('reobfJar') publishing { publications { @@ -134,7 +159,11 @@ publishing { } repositories { maven { - url "file:///${project.projectDir}/mcmodsrepo" + url "file://${project.projectDir}/mcmodsrepo" } } -} \ No newline at end of file +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..3703f36 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,6 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { url = 'https://maven.minecraftforge.net/' } + } +} \ No newline at end of file diff --git a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java index 0085774..3aec2e2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java @@ -1,5 +1,8 @@ package nl.requios.effortlessbuilding; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; @@ -19,6 +22,7 @@ import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.UndoRedo; import nl.requios.effortlessbuilding.capability.ModeCapabilityManager; import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager; +import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.network.AddUndoMessage; import nl.requios.effortlessbuilding.network.ClearUndoMessage; @@ -51,7 +55,15 @@ public class EventHandler { ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); if (buildMode != BuildModes.BuildModeEnum.NORMAL) { - event.setCanceled(true); + + //Only cancel if itemblock in hand + //Fixed issue with e.g. Create Wrench shift-rightclick disassembling being cancelled. + ItemStack currentItemStack = player.getItemInHand(InteractionHand.MAIN_HAND); + if (currentItemStack.getItem() instanceof BlockItem || + (CompatHelper.isItemBlockProxy(currentItemStack) && !player.isShiftKeyDown())) { + event.setCanceled(true); + } + } else if (modifierSettings.doQuickReplace()) { //Cancel event and send message if QuickReplace event.setCanceled(true); diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java index f77aa90..2812685 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java @@ -53,7 +53,6 @@ public class BuildModes { startPos = message.getBlockPos(); //Offset in direction of sidehit if not quickreplace and not replaceable - //TODO 1.13 replaceable boolean replaceable = player.level.getBlockState(startPos).getMaterial().isReplaceable(); boolean becomesDoubleSlab = SurvivalHelper.doesBecomeDoubleSlab(player, startPos, message.getSideHit()); if (!modifierSettings.doQuickReplace() && !replaceable && !becomesDoubleSlab) { @@ -99,7 +98,6 @@ public class BuildModes { //Only works when finishing a buildmode is equal to placing some blocks //No intermediate blocks allowed currentlyBreaking.remove(player); - } //Use a network message to break blocks in the distance using clientside mouse input diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/PlayerSettingsGui.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/PlayerSettingsGui.java index 586e58a..07a30d7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/PlayerSettingsGui.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/PlayerSettingsGui.java @@ -187,7 +187,7 @@ public class PlayerSettingsGui extends Screen { return right - 6; } - //From AbstractList, disabled parts + //From AbstractSelectionList, disabled parts @Override public void render(PoseStack ms, int p_render_1_, int p_render_2_, float p_render_3_) { this.renderBackground(ms); @@ -212,7 +212,7 @@ public class PlayerSettingsGui extends Screen { this.renderHeader(ms, k, l, tessellator); } - this.renderList(ms, k, l, p_render_1_, p_render_2_, p_render_3_); + this.renderList(ms, p_render_1_, p_render_2_, p_render_3_); RenderSystem.disableDepthTest(); // this.renderHoleBackground(0, this.y0, 255, 255); // this.renderHoleBackground(this.y1, this.height, 255, 255); diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java index 78829b6..5e5af73 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -121,7 +121,7 @@ public class ClientProxy implements IProxy { if (player == null) return; BuildModes.BuildModeEnum buildMode = ModeSettingsManager.getModeSettings(player).getBuildMode(); - if (Minecraft.getInstance().screen != null || + if (mc.screen != null || buildMode == BuildModes.BuildModeEnum.NORMAL || RadialMenu.instance.isVisible()) { return; diff --git a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java index be0f083..9122648 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviewRenderer.java @@ -76,7 +76,7 @@ public class BlockPreviewRenderer { lookingAt = Minecraft.getInstance().hitResult; ItemStack mainhand = player.getMainHandItem(); - boolean toolInHand = !(!mainhand.isEmpty() && CompatHelper.isItemBlockProxy(mainhand)); + boolean noBlockInHand = !(!mainhand.isEmpty() && CompatHelper.isItemBlockProxy(mainhand)); BlockPos startPos = null; Direction sideHit = null; @@ -91,12 +91,12 @@ public class BlockPreviewRenderer { //TODO 1.13 replaceable boolean replaceable = player.level.getBlockState(startPos).getMaterial().isReplaceable(); boolean becomesDoubleSlab = SurvivalHelper.doesBecomeDoubleSlab(player, startPos, blockLookingAt.getDirection()); - if (!modifierSettings.doQuickReplace() && !toolInHand && !replaceable && !becomesDoubleSlab) { + if (!modifierSettings.doQuickReplace() && !noBlockInHand && !replaceable && !becomesDoubleSlab) { startPos = startPos.relative(blockLookingAt.getDirection()); } //Get under tall grass and other replaceable blocks - if (modifierSettings.doQuickReplace() && !toolInHand && replaceable) { + if (modifierSettings.doQuickReplace() && !noBlockInHand && replaceable) { startPos = startPos.below(); } @@ -236,12 +236,13 @@ public class BlockPreviewRenderer { } - VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); - //Draw outlines if tool in hand + //Draw outlines if no block in hand //Find proper raytrace: either normal range or increased range depending on canBreakFar + VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); HitResult objectMouseOver = Minecraft.getInstance().hitResult; HitResult breakingRaytrace = ReachHelper.canBreakFar(player) ? lookingAt : objectMouseOver; - if (toolInHand && breakingRaytrace != null && breakingRaytrace.getType() == HitResult.Type.BLOCK) { + + if (player.isCreative() && noBlockInHand && breakingRaytrace != null && breakingRaytrace.getType() == HitResult.Type.BLOCK) { BlockHitResult blockBreakingRaytrace = (BlockHitResult) breakingRaytrace; List breakCoordinates = BuildModifiers.findCoordinates(player, blockBreakingRaytrace.getBlockPos());