diff --git a/build.gradle b/build.gradle index 04583d9..aa4fbe7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,147 +1,259 @@ -buildscript { - repositories { - maven { url = 'https://files.minecraftforge.net/maven' } - jcenter() - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true - } -} -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 = '0.1.0' -group = 'com.vanilla.experience' -archivesBaseName = 'vanillaexperience' - -sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. - -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: 'snapshot', version: '20200707-1.16.1' - // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. - - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - - // Default run configurations. - // These can be tweaked, removed, or duplicated as needed. - runs { - client { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - mods { - examplemod { - source sourceSets.main - } - } - } - - server { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - mods { - examplemod { - source sourceSets.main - } - } - } - - data { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - args '--mod', 'examplemod', '--all', '--output', file('src/generated/resources/') - - mods { - examplemod { - source sourceSets.main - } - } - } - } -} - -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. - // The userdev artifact is a special name and will get all sorts of transformations applied to it. - minecraft 'net.minecraftforge:forge:1.16.1-32.0.59' - - // You may put jars on which you depend on in ./libs or you may define them like so.. - // compile "some.group:artifact:version:classifier" - // compile "some.group:artifact:version" - - // Real examples - // compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env - // compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env - - // The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. - // provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' - - // These dependencies get remapped to your current MCP mappings - // deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev' - - // 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.. -jar { - manifest { - attributes([ - "Specification-Title": "vanillaexperience", - "Specification-Vendor": "vanillaexperience", - "Specification-Version": "1", // We are version 1 of ourselves - "Implementation-Title": project.name, - "Implementation-Version": "${version}", - "Implementation-Vendor" :"vanillaexperience", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } -} - -// Example configuration to allow publishing using the maven-publish task -// This is the preferred method to reobfuscate your jar file -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') - -publishing { - publications { - mavenJava(MavenPublication) { - artifact jar - } - } - repositories { - maven { - url "file:///${project.projectDir}/mcmodsrepo" - } - } -} \ No newline at end of file +import java.util.jar.Manifest +import java.nio.file.* +import java.nio.file.attribute.BasicFileAttributes +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream + +import org.apache.tools.ant.taskdefs.condition.Os + +buildscript { + repositories { + maven { + name = "Modmuss50" + url = "http://maven.modmuss50.me/" + } + jcenter() + } +} +plugins { + id 'java' + id "com.matthewprenger.cursegradle" version "1.4.0" +} + +version = "${mod_version}" +group = "com.vanilla.experience" +archivesBaseName = "${mod_id}-${mc_version}" + +curseforge { + apiKey = project.hasProperty("curseForgeApiKey") ? project.curseForgeApiKey : "c1dbff3f-4cfc-4eee-81bf-7406d1e3c5d1" + project { + + id = "${curseforge_id}" + changelog = file('changelog.txt') + + //release/beta/alpha + releaseType = 'release' + addGameVersion '1.16.1' + addGameVersion 'Java 8' + addGameVersion 'Forge' + addGameVersion 'Fabric' + mainArtifact(new File(new File(buildDir, "libs"), "$archivesBaseName-${version}.jar")) { + displayName = "$archivesBaseName-$version" + relations { + requiredDependency 'mixinbootstrap' + requiredDependency 'fabric-api' + } + } + /* addArtifact(new File(new File(buildDir, "libs"), "$archivesBaseName-$version-forge-deobf.jar")) { + displayName = "$archivesBaseName-$version-forge-deobf" + changelog = "*This is a file for mod developers. If you don't know what to do with it, don't use it!*" + } + addArtifact(new File(new File(buildDir, "libs"), "$archivesBaseName-$version-fabric-dev.jar")) { + displayName = "$archivesBaseName-$version-fabric-dev" + changelog = "*This is a file for mod developers. If you don't know what to do with it, don't use it!*" + } + addArtifact(new File(new File(buildDir, "libs"), "$archivesBaseName-$version-fabric-sources.jar")) { + displayName = "$archivesBaseName-$version-fabric-sources" + changelog = "*This is a file for mod developers. If you don't know what to do with it, don't use it!*" + } + addArtifact(new File(new File(buildDir, "libs"), "$archivesBaseName-$version-fabric-sources-dev.jar")) { + displayName = "$archivesBaseName-$version-fabric-sources-dev" + changelog = "*This is a file for mod developers. If you don't know what to do with it, don't use it!*" + } */ + } + options { + javaIntegration = false + forgeGradleIntegration = false + } +} + +task cfpublish(dependsOn: ['build', 'curseforge']) + +static boolean isWindows() { + return Os.isFamily(Os.FAMILY_WINDOWS); +} + +String appendPrefix(String dir) { + if(isWindows()) + dir = buildscript.sourceFile.getParentFile().getPath().toString()+"\\"+dir + return dir +} + +void copyFiles(String dir) { + println("Copying $dir files...") + File outDir = new File("$buildDir/libs/$dir") + //Dev files are not merged, to help avoid developer confusion and/or accidentally importing the wrong loaders' files when developing for one loader or the other. + //So in the case of dev files, move them to the final output folder + File devOutDir = new File("$buildDir/libs") + if(!outDir.exists()) + outDir.mkdirs() + String inDirPath = appendPrefix(dir) + File inDir = new File("$inDirPath/build/libs") + inDir.listFiles().each { file -> + File outFile = null; + //Main file from either one + if(file.getName() == "$archivesBaseName-${version}.jar") + outFile = new File(outDir, file.getName()) + //Developer file - include which loader it is for in the output filename + else + outFile = new File(devOutDir, file.getName().replaceAll("$archivesBaseName-$version", "$archivesBaseName-$version-$dir")) + if(outFile.exists()) + outFile.delete() + Files.copy(file.toPath(), outFile.toPath()) + } +} + +void deleteDir(File file) { + File[] contents = file.listFiles(); + if (contents != null) + for (File f: contents) + if (!Files.isSymbolicLink(f.toPath())) + deleteDir(f) + file.delete() +} + +task createFinalJar(type: Zip) { + from "$buildDir/rebuild" + include '**/' + archiveName "$archivesBaseName-${version}.jar" + destinationDir(file("$buildDir/libs/")) +} + +/* +task createFinalJar { + + inputs.files(fileTree("$buildDir/rebuild")) + outputs.file("$buildDir/libs/$archivesBaseName-${version}.jar") + doLast { + println("Creating the final jar...") + File f = new File("$buildDir/libs/$archivesBaseName-${version}.jar") + + final Path sourceDir = Paths.get("$buildDir/rebuild"); + try { + final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(f)) + Files.walkFileTree(sourceDir, new SimpleFileVisitor() { + @Override + FileVisitResult visitFile(Path file, BasicFileAttributes attributes) { + try { + Path targetFile = sourceDir.relativize(file) + outputStream.putNextEntry(new ZipEntry(targetFile.toString())) + byte[] bytes = Files.readAllBytes(file) + outputStream.write(bytes, 0, bytes.length) + outputStream.closeEntry() + } catch (IOException e) { + e.printStackTrace() + } + return FileVisitResult.CONTINUE + } + }) + outputStream.close() + } catch (IOException e) { + e.printStackTrace() + } + } +}*/ + +task extractMainJars { + inputs.files(fileTree("$buildDir/libs")) + outputs.files(fileTree("$buildDir/rebuild")) + outputs.files(fileTree("$buildDir/tmp/expandedArchives")) + finalizedBy createFinalJar + doLast { + FileTree fabricTree = zipTree(new File("$buildDir/libs/fabric/$archivesBaseName-${version}.jar")) + FileTree forgeTree = zipTree(new File("$buildDir/libs/forge/$archivesBaseName-${version}.jar")) + File rebuildDir = new File("$buildDir/rebuild") + if (rebuildDir.exists()) { + println("Clearing old data...") + deleteDir(rebuildDir) + } + rebuildDir.mkdirs() + println("Extracting jars to merge...") + Manifest manifest = null + String regexSafeBuildDir = buildDir.toString().replaceAll('\\\\', '\\\\\\\\') + fabricTree.getFiles().each { file -> + String rebuildPath = isWindows() ? file.getPath().replaceAll("$regexSafeBuildDir\\\\tmp\\\\expandedArchives\\\\$archivesBaseName-${version}\\.jar_[0-9a-z]+\\\\", '') : file.getPath().replaceAll("$regexSafeBuildDir/tmp/expandedArchives/$archivesBaseName-${version}.jar_[0-z]+/", '') + //Make sure to properly merge the manifests of the jars + if (rebuildPath == "META-INF/MANIFEST.MF" || rebuildPath == "META-INF\\MANIFEST.MF") { + FileInputStream inputStream = new FileInputStream(file) + manifest = new Manifest(inputStream) + inputStream.close() + } else { + File outFile = new File("$buildDir/rebuild/" + rebuildPath) + outFile.getParentFile().mkdirs() + //println("Extracting file to "+outFile.getPath()) + Files.copy(file.toPath(), outFile.toPath()) + } + } + forgeTree.getFiles().each { file -> + String rebuildPath = isWindows() ? file.getPath().replaceAll("$regexSafeBuildDir\\\\tmp\\\\expandedArchives\\\\$archivesBaseName-${version}\\.jar_[0-9a-z]+\\\\", '') : file.getPath().replaceAll("$regexSafeBuildDir/tmp/expandedArchives/$archivesBaseName-${version}.jar_[0-z]+/", '') + //Make sure to properly merge the manifests of the jars + if (rebuildPath == "META-INF/MANIFEST.MF" || rebuildPath == "META-INF\\MANIFEST.MF") { + FileInputStream inputStream = new FileInputStream(file) + if (manifest == null) + manifest = new Manifest(inputStream) + else + manifest.read(inputStream) + inputStream.close() + } else { + File outFile = new File("$buildDir/rebuild/" + rebuildPath) + outFile.getParentFile().mkdirs() + //println("Extracting file to "+outFile.getPath()) + if (!outFile.exists()) + Files.copy(file.toPath(), outFile.toPath()) + else if (outFile.getPath().contains("assets")) + println("Skipping duplicate asset: " + outFile.toPath()) + else + System.err.println("Warning: Skipping duplicate file: " + outFile.toPath()) + } + } + if (manifest != null) { + println("Creating manifest...") + File outFile = new File("$buildDir/rebuild/META-INF/MANIFEST.MF") + outFile.getParentFile().mkdirs() + FileOutputStream outputStream = new FileOutputStream(outFile) + manifest.write(outputStream) + outputStream.close() + } + + //Do this because otherwise we end up with a lot of temporary files that never get cleared + deleteDir(new File("$buildDir/tmp/expandedArchives")) + } +} + +task copyFiles { + inputs.files(fileTree("forge/build/libs")) + inputs.files(fileTree("fabric/build/libs")) + outputs.files(fileTree("$buildDir/libs/forge")) + outputs.files(fileTree("$buildDir/libs/fabric")) + finalizedBy extractMainJars + doLast { + copyFiles("forge") + copyFiles("fabric") + } +} + +task execBuilds { + inputs.files(fileTree('fabric')) + inputs.files(fileTree('forge')) + outputs.files(fileTree("forge/build/libs")) + outputs.files(fileTree("fabric/build/libs")) + finalizedBy copyFiles + doLast { + def gradleFile = isWindows() ? "./gradlew.bat" : "./gradlew" + def sout = System.out, serr = System.err + def procFabric = "$gradleFile build -Pversion=$version -Pgroup=$group -PoutputJarBaseName=$archivesBaseName".execute(null, new File("fabric")) + procFabric.consumeProcessOutput(sout, serr) + //TODO Test if concurrent even does it any differently + if (!project.hasProperty("concurrent") || !project.concurrent) + procFabric.waitForOrKill(1800000) + def procForge = "$gradleFile build -Pversion=$version -Pgroup=$group -PoutputJarBaseName=$archivesBaseName".execute(null, new File("forge")) + procForge.consumeProcessOutput(sout, serr) + if (project.hasProperty("concurrent") && project.concurrent) + procFabric.waitForOrKill(1800000) + procForge.waitForOrKill(1800000) + } +} + +build { + finalizedBy execBuilds +} diff --git a/changelog.txt b/changelog.txt new file mode 100644 index 0000000..fa380a6 --- /dev/null +++ b/changelog.txt @@ -0,0 +1 @@ +This version now supports Fabric AND Forge with SAME JAR. Enjoy. \ No newline at end of file diff --git a/common/src/main/java/com/vanilla/experience/CommonUtils.java b/common/src/main/java/com/vanilla/experience/CommonUtils.java new file mode 100644 index 0000000..5c477f6 --- /dev/null +++ b/common/src/main/java/com/vanilla/experience/CommonUtils.java @@ -0,0 +1,6 @@ +package com.vanilla.experience; + +public class CommonUtils { + public static int zeroTickVersionPatch = 2524; + public static int witherRosesVersionPatch = 2554; +} \ No newline at end of file diff --git a/common/src/main/java/com/vanilla/experience/HelloMessage.java b/common/src/main/java/com/vanilla/experience/HelloMessage.java new file mode 100644 index 0000000..5626dd8 --- /dev/null +++ b/common/src/main/java/com/vanilla/experience/HelloMessage.java @@ -0,0 +1,12 @@ +package com.vanilla.experience; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class HelloMessage { + private static final Logger LOGGER = LogManager.getLogger(); + + public HelloMessage(){ + LOGGER.info("[VEX] Starting Vanilla Experience, thanks for downloading!"); + } +} diff --git a/src/main/resources/data/vanillaexperience/recipes/chainmail_boots.json b/common/src/main/resources/data/vanillaexperience/recipes/chainmail_boots.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/chainmail_boots.json rename to common/src/main/resources/data/vanillaexperience/recipes/chainmail_boots.json diff --git a/src/main/resources/data/vanillaexperience/recipes/chainmail_chestplate.json b/common/src/main/resources/data/vanillaexperience/recipes/chainmail_chestplate.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/chainmail_chestplate.json rename to common/src/main/resources/data/vanillaexperience/recipes/chainmail_chestplate.json diff --git a/src/main/resources/data/vanillaexperience/recipes/chainmail_helmet.json b/common/src/main/resources/data/vanillaexperience/recipes/chainmail_helmet.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/chainmail_helmet.json rename to common/src/main/resources/data/vanillaexperience/recipes/chainmail_helmet.json diff --git a/src/main/resources/data/vanillaexperience/recipes/chainmail_leggings.json b/common/src/main/resources/data/vanillaexperience/recipes/chainmail_leggings.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/chainmail_leggings.json rename to common/src/main/resources/data/vanillaexperience/recipes/chainmail_leggings.json diff --git a/src/main/resources/data/vanillaexperience/recipes/coal_ore.json b/common/src/main/resources/data/vanillaexperience/recipes/coal_ore.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/coal_ore.json rename to common/src/main/resources/data/vanillaexperience/recipes/coal_ore.json diff --git a/src/main/resources/data/vanillaexperience/recipes/cobweb.json b/common/src/main/resources/data/vanillaexperience/recipes/cobweb.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/cobweb.json rename to common/src/main/resources/data/vanillaexperience/recipes/cobweb.json diff --git a/src/main/resources/data/vanillaexperience/recipes/diamond_horse_armor.json b/common/src/main/resources/data/vanillaexperience/recipes/diamond_horse_armor.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/diamond_horse_armor.json rename to common/src/main/resources/data/vanillaexperience/recipes/diamond_horse_armor.json diff --git a/src/main/resources/data/vanillaexperience/recipes/diamond_ore.json b/common/src/main/resources/data/vanillaexperience/recipes/diamond_ore.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/diamond_ore.json rename to common/src/main/resources/data/vanillaexperience/recipes/diamond_ore.json diff --git a/src/main/resources/data/vanillaexperience/recipes/elytra.json b/common/src/main/resources/data/vanillaexperience/recipes/elytra.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/elytra.json rename to common/src/main/resources/data/vanillaexperience/recipes/elytra.json diff --git a/src/main/resources/data/vanillaexperience/recipes/emerald_ore.json b/common/src/main/resources/data/vanillaexperience/recipes/emerald_ore.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/emerald_ore.json rename to common/src/main/resources/data/vanillaexperience/recipes/emerald_ore.json diff --git a/src/main/resources/data/vanillaexperience/recipes/enchanted_golden_apple.json b/common/src/main/resources/data/vanillaexperience/recipes/enchanted_golden_apple.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/enchanted_golden_apple.json rename to common/src/main/resources/data/vanillaexperience/recipes/enchanted_golden_apple.json diff --git a/src/main/resources/data/vanillaexperience/recipes/ender_pearl.json b/common/src/main/resources/data/vanillaexperience/recipes/ender_pearl.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/ender_pearl.json rename to common/src/main/resources/data/vanillaexperience/recipes/ender_pearl.json diff --git a/src/main/resources/data/vanillaexperience/recipes/gold_ore.json b/common/src/main/resources/data/vanillaexperience/recipes/gold_ore.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/gold_ore.json rename to common/src/main/resources/data/vanillaexperience/recipes/gold_ore.json diff --git a/src/main/resources/data/vanillaexperience/recipes/gold_horse_armor.json b/common/src/main/resources/data/vanillaexperience/recipes/golden_horse_armor.json similarity index 66% rename from src/main/resources/data/vanillaexperience/recipes/gold_horse_armor.json rename to common/src/main/resources/data/vanillaexperience/recipes/golden_horse_armor.json index 06c47d6..73f9d7a 100644 --- a/src/main/resources/data/vanillaexperience/recipes/gold_horse_armor.json +++ b/common/src/main/resources/data/vanillaexperience/recipes/golden_horse_armor.json @@ -10,7 +10,7 @@ { "h": { - "item": "minecraft:gold_helmet" + "item": "minecraft:golden_helmet" }, "g": { @@ -22,12 +22,12 @@ }, "b": { - "item": "minecraft:gold_boots" + "item": "minecraft:golden_boots" } }, "result": { - "item": "minecraft:gold_horse_armor", + "item": "minecraft:golden_horse_armor", "count": 1 } } \ No newline at end of file diff --git a/src/main/resources/data/vanillaexperience/recipes/grass.json b/common/src/main/resources/data/vanillaexperience/recipes/grass.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/grass.json rename to common/src/main/resources/data/vanillaexperience/recipes/grass.json diff --git a/src/main/resources/data/vanillaexperience/recipes/iron_horse_armor.json b/common/src/main/resources/data/vanillaexperience/recipes/iron_horse_armor.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/iron_horse_armor.json rename to common/src/main/resources/data/vanillaexperience/recipes/iron_horse_armor.json diff --git a/src/main/resources/data/vanillaexperience/recipes/iron_ore.json b/common/src/main/resources/data/vanillaexperience/recipes/iron_ore.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/iron_ore.json rename to common/src/main/resources/data/vanillaexperience/recipes/iron_ore.json diff --git a/src/main/resources/data/vanillaexperience/recipes/lapis_ore.json b/common/src/main/resources/data/vanillaexperience/recipes/lapis_ore.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/lapis_ore.json rename to common/src/main/resources/data/vanillaexperience/recipes/lapis_ore.json diff --git a/src/main/resources/data/vanillaexperience/recipes/leather_horse_armor.json b/common/src/main/resources/data/vanillaexperience/recipes/leather_horse_armor.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/leather_horse_armor.json rename to common/src/main/resources/data/vanillaexperience/recipes/leather_horse_armor.json diff --git a/src/main/resources/data/vanillaexperience/recipes/name_tag.json b/common/src/main/resources/data/vanillaexperience/recipes/name_tag.json similarity index 90% rename from src/main/resources/data/vanillaexperience/recipes/name_tag.json rename to common/src/main/resources/data/vanillaexperience/recipes/name_tag.json index 6498ac6..b235c62 100644 --- a/src/main/resources/data/vanillaexperience/recipes/name_tag.json +++ b/common/src/main/resources/data/vanillaexperience/recipes/name_tag.json @@ -16,7 +16,7 @@ { "item": "minecraft:paper" }, - "p": + "d": { "item": "minecraft:diamond_block" } diff --git a/src/main/resources/data/vanillaexperience/recipes/redstone_ore.json b/common/src/main/resources/data/vanillaexperience/recipes/redstone_ore.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/redstone_ore.json rename to common/src/main/resources/data/vanillaexperience/recipes/redstone_ore.json diff --git a/src/main/resources/data/vanillaexperience/recipes/saddle.json b/common/src/main/resources/data/vanillaexperience/recipes/saddle.json similarity index 100% rename from src/main/resources/data/vanillaexperience/recipes/saddle.json rename to common/src/main/resources/data/vanillaexperience/recipes/saddle.json diff --git a/src/main/resources/pack.mcmeta b/common/src/main/resources/pack.mcmeta similarity index 78% rename from src/main/resources/pack.mcmeta rename to common/src/main/resources/pack.mcmeta index 700e07e..b34e030 100644 --- a/src/main/resources/pack.mcmeta +++ b/common/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { - "description": "examplemod resources", + "description": "VanillaExperience resources", "pack_format": 5, "_comment": "A pack_format of 5 requires json lang files and some texture changes from 1.15. Note: we require v5 pack meta for all mods." } diff --git a/src/main/resources/vex.png b/common/src/main/resources/vex.png similarity index 100% rename from src/main/resources/vex.png rename to common/src/main/resources/vex.png diff --git a/fabric/.gitignore b/fabric/.gitignore new file mode 100644 index 0000000..8673c0d --- /dev/null +++ b/fabric/.gitignore @@ -0,0 +1,21 @@ +# gradle +.gradle/ +build/ +out/ +classes/ + +# idea +.idea/ +*.iml +*.ipr +*.iws + +# vscode +.settings/ +.vscode/ +bin/ +.classpath +.project + +# fabric +run/ diff --git a/fabric/build.gradle b/fabric/build.gradle new file mode 100644 index 0000000..6e63dfa --- /dev/null +++ b/fabric/build.gradle @@ -0,0 +1,74 @@ +plugins { + id 'fabric-loom' version '0.4-SNAPSHOT' +} + +sourceCompatibility = JavaVersion.VERSION_1_8 +targetCompatibility = JavaVersion.VERSION_1_8 + +sourceSets { + main { + java { + srcDir 'src/main/java' + srcDir '../common/src/main/java' + } + resources { + srcDir 'src/main/resources' + srcDir '../common/src/main/resources' + } + } +} + +archivesBaseName = project.hasProperty("outputJarBaseName") ? project.outputJarBaseName : "fabric" + +minecraft { +} + +repositories { + maven { url 'https://jitpack.io' } +} + +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" + modCompile "net.fabricmc:fabric-loader:${project.loader_version}" + + // Fabric API. This is technically optional, but you probably want it anyway. + modCompile "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + + modCompile "com.github.Chocohead:Fabric-ASM:${project.fabric_asm_version}" + include "com.github.Chocohead:Fabric-ASM:${project.fabric_asm_version}" + +} + +processResources { + inputs.property "version", project.version + + from(sourceSets.main.resources.srcDirs) { + include "fabric.mod.json" + expand "version": project.version + } + + from(sourceSets.main.resources.srcDirs) { + exclude "fabric.mod.json" + } +} + +// ensure that the encoding is set to UTF-8, no matter what the system default is +// this fixes some edge cases with special characters not displaying correctly +// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html +tasks.withType(JavaCompile) { + options.encoding = "UTF-8" +} + +// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task +// if it is present. +// If you remove this task, sources will not be generated. +task sourcesJar(type: Jar, dependsOn: classes) { + classifier = "sources" + from sourceSets.main.allSource +} + +jar { + from "../LICENSE" +} diff --git a/fabric/gradle.properties b/fabric/gradle.properties new file mode 100644 index 0000000..6cca140 --- /dev/null +++ b/fabric/gradle.properties @@ -0,0 +1,13 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G + +# Fabric Properties + # check these on https://fabricmc.net/use + minecraft_version=1.16.1 + yarn_mappings=1.16.1+build.21 + loader_version=0.8.8+build.203 + +# Dependencies + # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api + fabric_version=0.14.1+build.372-1.16 + fabric_asm_version=v2.0 \ No newline at end of file diff --git a/fabric/gradle/wrapper/gradle-wrapper.jar b/fabric/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..5c2d1cf Binary files /dev/null and b/fabric/gradle/wrapper/gradle-wrapper.jar differ diff --git a/fabric/gradle/wrapper/gradle-wrapper.properties b/fabric/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..613cda6 --- /dev/null +++ b/fabric/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Jul 12 22:30:14 BRT 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/fabric/gradlew b/fabric/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/fabric/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/fabric/gradlew.bat b/fabric/gradlew.bat new file mode 100644 index 0000000..e95643d --- /dev/null +++ b/fabric/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +: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 %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/main/resources/data/vanillaexperience/.test b/fabric/logs/debug.log similarity index 100% rename from src/main/resources/data/vanillaexperience/.test rename to fabric/logs/debug.log diff --git a/fabric/logs/latest.log b/fabric/logs/latest.log new file mode 100644 index 0000000..e69de29 diff --git a/fabric/settings.gradle b/fabric/settings.gradle new file mode 100644 index 0000000..5b60df3 --- /dev/null +++ b/fabric/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + jcenter() + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + gradlePluginPortal() + } +} diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/VanillaExperience.java b/fabric/src/main/java/com/vanilla/experience/fabric/VanillaExperience.java new file mode 100644 index 0000000..259911f --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/VanillaExperience.java @@ -0,0 +1,20 @@ +package com.vanilla.experience.fabric; + +import com.vanilla.experience.fabric.enhancedbonemeal.EnhancedBoneMeal; +import com.vanilla.experience.fabric.enhancedbonemeal.EnhancedBoneMealDispenserBehaviour; +import com.vanilla.experience.fabric.enhancedseeds.EnhancedSeeds; +import com.vanilla.experience.fabric.enhancedseeds.EnhancedSeedsDispenserBehaviour; +import com.vanilla.experience.HelloMessage; +import net.fabricmc.api.ModInitializer; + +public class VanillaExperience implements ModInitializer { + + @Override + public void onInitialize() { + new HelloMessage(); + new EnhancedBoneMeal(); + new EnhancedSeeds(); + new EnhancedBoneMealDispenserBehaviour(); + new EnhancedSeedsDispenserBehaviour(); + } +} diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/enhancedberries/mixin/SweetBerryBushBlockMixin.java b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedberries/mixin/SweetBerryBushBlockMixin.java new file mode 100644 index 0000000..16bea3c --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedberries/mixin/SweetBerryBushBlockMixin.java @@ -0,0 +1,28 @@ +package com.vanilla.experience.fabric.enhancedberries.mixin; + +import net.minecraft.block.BlockState; +import net.minecraft.block.PlantBlock; +import net.minecraft.block.SweetBerryBushBlock; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +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(SweetBerryBushBlock.class) +public abstract class SweetBerryBushBlockMixin extends PlantBlock { + protected SweetBerryBushBlockMixin(Settings settings) { super(settings); } + + @Inject(method = "onEntityCollision", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;damage(Lnet/minecraft/entity/damage/DamageSource;F)Z"), cancellable = true) + private void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity, CallbackInfo ci) { + if (entity instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) entity; + if(!player.getEquippedStack(EquipmentSlot.FEET).isEmpty() && !player.getEquippedStack(EquipmentSlot.LEGS).isEmpty()) ci.cancel(); + } + if (entity.isSneaking()) ci.cancel(); + } +} \ No newline at end of file diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/enhancedbonemeal/EnhancedBoneMeal.java b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedbonemeal/EnhancedBoneMeal.java new file mode 100644 index 0000000..bc49dc2 --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedbonemeal/EnhancedBoneMeal.java @@ -0,0 +1,67 @@ +package com.vanilla.experience.fabric.enhancedbonemeal; + +import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +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; + +public class EnhancedBoneMeal implements UseBlockCallback { + + public EnhancedBoneMeal(){ + UseBlockCallback.EVENT.register(this); + } + + @Override + public ActionResult interact(PlayerEntity player, World world, Hand hand, BlockHitResult block) { + ItemStack stack = player.getStackInHand(hand); + + if(stack.getItem().equals(Items.BONE_MEAL)){ + BlockPos blockPos = block.getBlockPos(); + BlockState blockState = world.getBlockState(blockPos); + Block currentBlock = blockState.getBlock(); + + if(currentBlock.equals(Blocks.CACTUS) || currentBlock.equals((Blocks.SUGAR_CANE))) { + for(int y = blockPos.getY(); y <= 256; y++) { + BlockPos upperPos = new BlockPos(blockPos.getX(), y, blockPos.getZ()); + Block upperBlock = world.getBlockState(upperPos).getBlock(); + if(upperBlock.equals(Blocks.AIR)) { + world.setBlockState(upperPos, currentBlock.getDefaultState()); + if (!world.isClient) { + world.syncWorldEvent(2005, upperPos, 0); + world.syncWorldEvent(2005, upperPos.up(), 0); + } + if(!player.isCreative()) + stack.decrement(1); + return ActionResult.SUCCESS; + } + } + } + if(currentBlock.equals(Blocks.VINE)) { + for(int y = blockPos.getY(); y > 0; y--) { + BlockPos downPos = new BlockPos(blockPos.getX(), y, blockPos.getZ()); + Block downBlock = world.getBlockState(downPos).getBlock(); + if(downBlock.equals(Blocks.AIR)) { + world.setBlockState(downPos, currentBlock.getDefaultState()); + if (!world.isClient) { + world.syncWorldEvent(2005, downPos, 0); + world.syncWorldEvent(2005, downPos.down(), 0); + } + if(!player.isCreative()) + stack.decrement(1); + return ActionResult.SUCCESS; + } + } + } + + } + return ActionResult.PASS; + } +} diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/enhancedbonemeal/EnhancedBoneMealDispenserBehaviour.java b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedbonemeal/EnhancedBoneMealDispenserBehaviour.java new file mode 100644 index 0000000..2672e42 --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedbonemeal/EnhancedBoneMealDispenserBehaviour.java @@ -0,0 +1,67 @@ +package com.vanilla.experience.fabric.enhancedbonemeal; + +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.BoneMealItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; + +public class EnhancedBoneMealDispenserBehaviour extends FallibleItemDispenserBehavior { + + public EnhancedBoneMealDispenserBehaviour() { + DispenserBlock.registerBehavior(Items.BONE_MEAL, this); + } + + protected ItemStack dispenseSilently(BlockPointer block, ItemStack stack) { + this.setSuccess(true); + ServerWorld world = (ServerWorld) block.getWorld(); + BlockPos blockPos = block.getBlockPos().offset(block.getBlockState().get(DispenserBlock.FACING)); + if (BoneMealItem.useOnFertilizable(stack, world, blockPos) || BoneMealItem.useOnGround(stack, world, blockPos, null)) { + if (!world.isClient) { + world.syncWorldEvent(2005, blockPos, 0); + } + } else { + BlockState blockState = world.getBlockState(blockPos); + Block currentBlock = blockState.getBlock(); + + if(currentBlock.equals(Blocks.SUGAR_CANE) || currentBlock.equals(Blocks.CACTUS)) { + for(int y = blockPos.getY(); y <= 256; y++) { + BlockPos upperPos = new BlockPos(blockPos.getX(), y, blockPos.getZ()); + Block upperBlock = world.getBlockState(upperPos).getBlock(); + if(upperBlock.equals(Blocks.AIR)) { + world.setBlockState(upperPos, blockState.getBlock().getDefaultState()); + if (!world.isClient) { + world.syncWorldEvent(2005, upperPos, 0); + world.syncWorldEvent(2005, upperPos.up(), 0); + } + stack.decrement(1); + break; + } + } + } else if(blockState.getBlock().equals(Blocks.VINE)) { + for(int y = blockPos.getY(); y > 0; y--) { + BlockPos downPos = new BlockPos(blockPos.getX(), y, blockPos.getZ()); + Block downBlock = world.getBlockState(downPos).getBlock(); + if (downBlock.equals(Blocks.AIR)) { + world.setBlockState(downPos, blockState.getBlock().getDefaultState()); + if (!world.isClient) { + world.syncWorldEvent(2005, downPos, 0); + world.syncWorldEvent(2005, downPos.down(), 0); + } + stack.decrement(1); + break; + } + } + } else { + this.setSuccess(false); + } + } + return stack; + } +} \ No newline at end of file diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/enhancedseeds/EnhancedSeeds.java b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedseeds/EnhancedSeeds.java new file mode 100644 index 0000000..a815e76 --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedseeds/EnhancedSeeds.java @@ -0,0 +1,73 @@ +package com.vanilla.experience.fabric.enhancedseeds; + +import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.TallPlantBlock; +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; + +public class EnhancedSeeds implements UseBlockCallback { + + public EnhancedSeeds(){ + UseBlockCallback.EVENT.register(this); + } + + @Override + public ActionResult interact(PlayerEntity player, World world, Hand hand, BlockHitResult block) { + ItemStack stack = player.getStackInHand(hand); + + if(stack.getItem().equals(Items.WHEAT_SEEDS)){ + BlockPos blockPos = block.getBlockPos(); + BlockState blockState = world.getBlockState(blockPos); + Block currentBlock = blockState.getBlock(); + + if(currentBlock.equals(Blocks.DIRT)) { + world.setBlockState(blockPos, Blocks.GRASS_BLOCK.getDefaultState()); + if(!player.isCreative()) + stack.decrement(1); + return ActionResult.SUCCESS; + } else if(currentBlock.equals(Blocks.GRASS_BLOCK)) { + BlockPos upperPos = blockPos.up(); + Block upperBlock = world.getBlockState(upperPos).getBlock(); + if(upperBlock.equals(Blocks.AIR)) { + world.setBlockState(upperPos, Blocks.GRASS.getDefaultState()); + if(!player.isCreative()) + stack.decrement(1); + return ActionResult.SUCCESS; + } else if(upperBlock.equals(Blocks.GRASS)) { + if(upgrade(world, upperPos)) { + if(!player.isCreative()) + stack.decrement(1); + return ActionResult.SUCCESS; + } + } + } else if(currentBlock.equals(Blocks.GRASS)) { + if(upgrade(world, blockPos)) { + if(!player.isCreative()) + stack.decrement(1); + return ActionResult.SUCCESS; + } + } + + } + return ActionResult.PASS; + } + + public boolean upgrade(World world, BlockPos pos) { + TallPlantBlock blockDoublePlant = (TallPlantBlock) Blocks.TALL_GRASS; + + if(world.isAir(pos.up())) { + blockDoublePlant.placeAt(world, pos, 2); + return true; + } + return false; + } +} diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/enhancedseeds/EnhancedSeedsDispenserBehaviour.java b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedseeds/EnhancedSeedsDispenserBehaviour.java new file mode 100644 index 0000000..825d937 --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedseeds/EnhancedSeedsDispenserBehaviour.java @@ -0,0 +1,58 @@ +package com.vanilla.experience.fabric.enhancedseeds; + +import net.minecraft.block.*; +import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; +import net.minecraft.item.BoneMealItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class EnhancedSeedsDispenserBehaviour extends FallibleItemDispenserBehavior { + + public EnhancedSeedsDispenserBehaviour() { + DispenserBlock.registerBehavior(Items.WHEAT_SEEDS, this); + } + + protected ItemStack dispenseSilently(BlockPointer block, ItemStack stack) { + this.setSuccess(true); + ServerWorld world = (ServerWorld) block.getWorld(); + BlockPos blockPos = block.getBlockPos().offset(block.getBlockState().get(DispenserBlock.FACING)); + BlockState blockState = world.getBlockState(blockPos); + Block currentBlock = blockState.getBlock(); + + if(currentBlock.equals(Blocks.DIRT)) { + world.setBlockState(blockPos, Blocks.GRASS_BLOCK.getDefaultState()); + stack.decrement(1); + } else if(currentBlock.equals(Blocks.GRASS_BLOCK)) { + BlockPos upperPos = blockPos.up(); + Block upperBlock = world.getBlockState(upperPos).getBlock(); + if(upperBlock.equals(Blocks.AIR)) { + world.setBlockState(upperPos, Blocks.GRASS.getDefaultState()); + stack.decrement(1); + } else if(upperBlock.equals(Blocks.GRASS)) { + if(upgrade(world, upperPos)) + stack.decrement(1); + } + } else if(currentBlock.equals(Blocks.GRASS)) { + if(upgrade(world, blockPos)) + stack.decrement(1); + } else { + this.setSuccess(false); + } + + return stack; + } + + public boolean upgrade(World world, BlockPos pos) { + TallPlantBlock blockDoublePlant = (TallPlantBlock) Blocks.TALL_GRASS; + + if(world.isAir(pos.up())) { + blockDoublePlant.placeAt(world, pos, 2); + return true; + } + return false; + } +} \ No newline at end of file diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/enhancedtotem/mixin/LivingEntityMixin.java b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedtotem/mixin/LivingEntityMixin.java new file mode 100644 index 0000000..47c0413 --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/enhancedtotem/mixin/LivingEntityMixin.java @@ -0,0 +1,61 @@ +package com.vanilla.experience.fabric.enhancedtotem.mixin; + +import net.minecraft.advancement.criterion.Criteria; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.stat.Stats; +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(LivingEntity.class) +public abstract class LivingEntityMixin { + + @Inject(method = "tryUseTotem", at = @At("HEAD")) + private void tryUseTotem(DamageSource source, CallbackInfoReturnable info) { + LivingEntity livingEntity = ((LivingEntity)(Object)this); + + if(livingEntity instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) livingEntity; + + ItemStack itemStack = null; + + PlayerInventory inventory = player.inventory; + + for(int i = 0; i < inventory.size(); i++) { + ItemStack stack = inventory.getStack(i); + if (stack.getItem().equals(Items.TOTEM_OF_UNDYING)) { + itemStack = stack; + break; + } + } + + if(itemStack != null) { + if (player instanceof ServerPlayerEntity) { + ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity)player; + serverPlayerEntity.incrementStat(Stats.USED.getOrCreateStat(Items.TOTEM_OF_UNDYING)); + Criteria.USED_TOTEM.trigger(serverPlayerEntity, itemStack); + } + + itemStack.decrement(1); + + player.setHealth(1.0F); + player.clearStatusEffects(); + player.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 900, 1)); + player.addStatusEffect(new StatusEffectInstance(StatusEffects.ABSORPTION, 100, 1)); + player.addStatusEffect(new StatusEffectInstance(StatusEffects.FIRE_RESISTANCE, 800, 2)); // 1.16.2 + player.world.sendEntityStatus(player, (byte)35); + + info.setReturnValue(true); + } + } + } +} \ No newline at end of file diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/utils/MixinLoader.java b/fabric/src/main/java/com/vanilla/experience/fabric/utils/MixinLoader.java new file mode 100644 index 0000000..68b54cc --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/utils/MixinLoader.java @@ -0,0 +1,24 @@ +package com.vanilla.experience.fabric.utils; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.Mixins; + +public class MixinLoader implements Runnable { + private static final Logger LOGGER = LogManager.getLogger(); + + @Override + public void run() { + LOGGER.info("[VEX] Patching EnhancedTotem with Fabric Mixin."); + Mixins.addConfiguration("mixin/fabric/enhancedtotem.mixins.json"); + + if (VexUtils.isZeroTickPatched()) { + LOGGER.info("[VEX] Unpatching ZeroTick with Fabric Mixin."); + Mixins.addConfiguration("mixin/fabric/zerotickunpatch.mixins.json"); + } + if (VexUtils.isWitherRosesSpawnPatched()) { + LOGGER.info("[VEX] Unpatching Wither Rose spawning with Fabric Mixin."); + Mixins.addConfiguration("mixin/fabric/witherrosesunpatch.mixins.json"); + } + } +} diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/utils/VexUtils.java b/fabric/src/main/java/com/vanilla/experience/fabric/utils/VexUtils.java new file mode 100644 index 0000000..1234bd5 --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/utils/VexUtils.java @@ -0,0 +1,14 @@ +package com.vanilla.experience.fabric.utils; + +import net.minecraft.SharedConstants; +import com.vanilla.experience.CommonUtils; + +public class VexUtils { + public static boolean isZeroTickPatched() { + return SharedConstants.getGameVersion().getWorldVersion() >= CommonUtils.zeroTickVersionPatch; + } + + public static boolean isWitherRosesSpawnPatched() { + return SharedConstants.getGameVersion().getWorldVersion() >= CommonUtils.witherRosesVersionPatch; + } +} diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/witherrosesunpatch/mixin/EntityTypeMixin.java b/fabric/src/main/java/com/vanilla/experience/fabric/witherrosesunpatch/mixin/EntityTypeMixin.java new file mode 100644 index 0000000..3eb7508 --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/witherrosesunpatch/mixin/EntityTypeMixin.java @@ -0,0 +1,17 @@ +package com.vanilla.experience.fabric.witherrosesunpatch.mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.EntityType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(EntityType.class) +public class EntityTypeMixin { + + @Redirect(method = "method_29496", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;isOf(Lnet/minecraft/block/Block;)Z", ordinal = 2)) + private boolean restoreWitherRoseSpawning(BlockState blockState, Block block) { + return false; // return false to method that checks if is inside a Whiter Rose + } +} \ No newline at end of file diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickAbstractPlantStemBlock.java b/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickAbstractPlantStemBlock.java new file mode 100644 index 0000000..b33586c --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickAbstractPlantStemBlock.java @@ -0,0 +1,27 @@ +package com.vanilla.experience.fabric.zerotickunpatch.mixin; + +import net.minecraft.block.BlockState; +import net.minecraft.block.AbstractPlantStemBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.server.world.ServerWorld; +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 java.util.Random; + +// this abstracts Kelp, TwistingVines and WeepingVines +@Mixin(AbstractPlantStemBlock.class) +public class ZeroTickAbstractPlantStemBlock { + @Shadow + public void randomTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random) {} + + @Inject(at = @At("TAIL"), method = "scheduledTick") + public void scheduledTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random, CallbackInfo info) { + if(!world.isAir(pos.down())) { + this.randomTick(state, world, pos, random); + } + } +} \ No newline at end of file diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickBambooBlock.java b/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickBambooBlock.java new file mode 100644 index 0000000..a18a4d8 --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickBambooBlock.java @@ -0,0 +1,31 @@ +package com.vanilla.experience.fabric.zerotickunpatch.mixin; + +import net.minecraft.block.BambooBlock; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.server.world.ServerWorld; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +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 java.util.Random; + +@Mixin(BambooBlock.class) +public class ZeroTickBambooBlock { + private static final Logger LOGGER = LogManager.getLogger(); + + @Shadow + public void randomTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random) {} + + @Inject(at = @At("TAIL"), method = "scheduledTick") + public void scheduledTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random, CallbackInfo info) { + if(!world.isAir(pos.down())) { + this.randomTick(state, world, pos, random); + } + } + +} \ No newline at end of file diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickCactusBlock.java b/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickCactusBlock.java new file mode 100644 index 0000000..176fd53 --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickCactusBlock.java @@ -0,0 +1,26 @@ +package com.vanilla.experience.fabric.zerotickunpatch.mixin; + +import net.minecraft.block.BlockState; +import net.minecraft.block.CactusBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.server.world.ServerWorld; +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 java.util.Random; + +@Mixin(CactusBlock.class) +public class ZeroTickCactusBlock { + @Shadow + public void randomTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random) {} + + @Inject(at = @At("TAIL"), method = "scheduledTick") + public void scheduledTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random, CallbackInfo info) { + if(!world.isAir(pos.down())) { + this.randomTick(state, world, pos, random); + } + } +} \ No newline at end of file diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickChorusFlowerBlock.java b/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickChorusFlowerBlock.java new file mode 100644 index 0000000..8217806 --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickChorusFlowerBlock.java @@ -0,0 +1,26 @@ +package com.vanilla.experience.fabric.zerotickunpatch.mixin; + +import net.minecraft.block.BlockState; +import net.minecraft.block.ChorusFlowerBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.server.world.ServerWorld; +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 java.util.Random; + +@Mixin(ChorusFlowerBlock.class) +public class ZeroTickChorusFlowerBlock { + @Shadow + public void randomTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random) {} + + @Inject(at = @At("TAIL"), method = "scheduledTick") + public void scheduledTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random, CallbackInfo info) { + if(!world.isAir(pos.down())) { + this.randomTick(state, world, pos, random); + } + } +} \ No newline at end of file diff --git a/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickSugarCaneBlock.java b/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickSugarCaneBlock.java new file mode 100644 index 0000000..437669d --- /dev/null +++ b/fabric/src/main/java/com/vanilla/experience/fabric/zerotickunpatch/mixin/ZeroTickSugarCaneBlock.java @@ -0,0 +1,26 @@ +package com.vanilla.experience.fabric.zerotickunpatch.mixin; + +import net.minecraft.block.BlockState; +import net.minecraft.block.SugarCaneBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.server.world.ServerWorld; +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 java.util.Random; + +@Mixin(SugarCaneBlock.class) +public class ZeroTickSugarCaneBlock { + @Shadow + public void randomTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random) {} + + @Inject(at = @At("TAIL"), method = "scheduledTick") + public void tick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random, CallbackInfo info) { + if(!world.isAir(pos.down())) { + this.randomTick(state, world, pos, random); + } + } +} \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..ba9e810 --- /dev/null +++ b/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,37 @@ +{ + "schemaVersion": 1, + "id": "vanillaexperience", + "version": "${version}", + + "name": "Vanilla Experience", + "description": "Thanks for downloading Vanilla Experience for Fabric!", + "authors": [ + "AugustoResende" + ], + "contact": { + "homepage": "https://mods.augustoresende.com/vanillaexperience/", + "sources": "https://mods.augustoresende.com/vanillaexperience/source", + "issues": "https://mods.augustoresende.com/vanillaexperience/issues" + }, + + "license": "WTFPL", + "icon": "vex.png", + + "environment": "*", + "entrypoints": { + "mm:early_risers": [ + "com.vanilla.experience.fabric.utils.MixinLoader" + ], + "main": [ + "com.vanilla.experience.fabric.VanillaExperience" + ] + }, + "mixins": [], + + "depends": { + "fabricloader": ">=0.7.2", + "fabric": "*", + "minecraft": "1.16.x", + "mm": ">=2.0" + } +} diff --git a/fabric/src/main/resources/mixin/fabric/enhancedtotem.mixins.json b/fabric/src/main/resources/mixin/fabric/enhancedtotem.mixins.json new file mode 100644 index 0000000..5a7d85e --- /dev/null +++ b/fabric/src/main/resources/mixin/fabric/enhancedtotem.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "com.vanilla.experience.fabric.enhancedtotem.mixin", + "compatibilityLevel": "JAVA_8", + "refmap": "vanillaexperience-1.16.1-refmap.json", + "mixins": [ + "LivingEntityMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" +} \ No newline at end of file diff --git a/fabric/src/main/resources/mixin/fabric/witherrosesunpatch.mixins.json b/fabric/src/main/resources/mixin/fabric/witherrosesunpatch.mixins.json new file mode 100644 index 0000000..f294114 --- /dev/null +++ b/fabric/src/main/resources/mixin/fabric/witherrosesunpatch.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "com.vanilla.experience.fabric.witherrosesunpatch.mixin", + "compatibilityLevel": "JAVA_8", + "refmap": "vanillaexperience-1.16.1-refmap.json", + "mixins": [ + "EntityTypeMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" +} \ No newline at end of file diff --git a/fabric/src/main/resources/mixin/fabric/zerotickunpatch.mixins.json b/fabric/src/main/resources/mixin/fabric/zerotickunpatch.mixins.json new file mode 100644 index 0000000..fcebf80 --- /dev/null +++ b/fabric/src/main/resources/mixin/fabric/zerotickunpatch.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "package": "com.vanilla.experience.fabric.zerotickunpatch.mixin", + "compatibilityLevel": "JAVA_8", + "refmap": "vanillaexperience-1.16.1-refmap.json", + "mixins": [ + "ZeroTickAbstractPlantStemBlock", + "ZeroTickBambooBlock", + "ZeroTickCactusBlock", + "ZeroTickChorusFlowerBlock", + "ZeroTickSugarCaneBlock" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/forge/.gitignore b/forge/.gitignore new file mode 100644 index 0000000..8673c0d --- /dev/null +++ b/forge/.gitignore @@ -0,0 +1,21 @@ +# gradle +.gradle/ +build/ +out/ +classes/ + +# idea +.idea/ +*.iml +*.ipr +*.iws + +# vscode +.settings/ +.vscode/ +bin/ +.classpath +.project + +# fabric +run/ diff --git a/forge/build.gradle b/forge/build.gradle new file mode 100644 index 0000000..d2c8a98 --- /dev/null +++ b/forge/build.gradle @@ -0,0 +1,102 @@ +buildscript { + repositories { + maven { url = 'https://files.minecraftforge.net/maven' } + jcenter() + mavenCentral() + maven { url = 'https://dist.creeper.host/Sponge/maven' } + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true + classpath group: 'org.spongepowered', name:'mixingradle', version: '0.7-SNAPSHOT' + } +} +apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'org.spongepowered.mixin' + +sourceSets { + main { + java { + srcDir 'src/main/java' + srcDir '../common/src/main/java' + } + resources { + srcDir 'src/main/resources' + srcDir '../common/src/main/resources' + } + } +} + +archivesBaseName = project.hasProperty("outputJarBaseName") ? project.outputJarBaseName : "${mod_id}-${mod_version}-${mc_version}" + +minecraft { + + mappings channel: 'snapshot', version: "${forge_mappings}" + + runs { + client { + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + property 'forge.logging.console.level', 'debug' + + workingDirectory project.file('run').canonicalPath + + mods { + vanillaexperience { + source sourceSets.main + } + } + } + + server { + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + property 'forge.logging.console.level', 'debug' + + workingDirectory project.file('run').canonicalPath + + mods { + vanillaexperience { + source sourceSets.main + } + } + } + } +} + +repositories { + maven { url = 'https://files.minecraftforge.net/maven' } + jcenter() + mavenCentral() + maven { url='https://dist.creeper.host/Sponge/maven' } + flatDir { + dirs 'libs' + } +} + +dependencies { + minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}" + + compile 'org.spongepowered:mixin:0.8.1-SNAPSHOT' +} + +jar { + inputs.property "version", project.version + + manifest { + attributes([ + "Specification-Title": "${mod_id}", + "Specification-Vendor": "${mod_id}", + "Specification-Version": "${project.version}", + "Implementation-Title": "${mod_id}", + "Implementation-Version": "${project.version}", + "Implementation-Vendor": "${mod_id}", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), + "MixinConnector": "com.vanilla.experience.forge.utils.MixinLoader" + ]) + } +} + +jar.finalizedBy('reobfJar') + +task deobfJar(type: Jar) { + from sourceSets.main.output + classifier = 'deobf' +} diff --git a/forge/gradle.properties b/forge/gradle.properties new file mode 100644 index 0000000..d6c0096 --- /dev/null +++ b/forge/gradle.properties @@ -0,0 +1,9 @@ +org.gradle.jvmargs=-Xmx4G +org.gradle.daemon=false + +mod_version=0.1.6 +mod_id=vanillaexperience +mc_version=1.16.1 +forge_version=32.0.59 +forge_mappings=20200707-1.16.1 +curseforge_id=393896 \ No newline at end of file diff --git a/forge/gradle/wrapper/gradle-wrapper.jar b/forge/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..94336fc Binary files /dev/null and b/forge/gradle/wrapper/gradle-wrapper.jar differ diff --git a/forge/gradle/wrapper/gradle-wrapper.properties b/forge/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..339ee4d --- /dev/null +++ b/forge/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Jul 12 19:05:19 BRT 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/forge/gradlew b/forge/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/forge/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/forge/gradlew.bat b/forge/gradlew.bat new file mode 100644 index 0000000..e95643d --- /dev/null +++ b/forge/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +: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 %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/forge/logs/debug.log b/forge/logs/debug.log new file mode 100644 index 0000000..e69de29 diff --git a/forge/logs/latest.log b/forge/logs/latest.log new file mode 100644 index 0000000..e69de29 diff --git a/forge/src/main/java/com/vanilla/experience/forge/VanillaExperience.java b/forge/src/main/java/com/vanilla/experience/forge/VanillaExperience.java new file mode 100644 index 0000000..2260905 --- /dev/null +++ b/forge/src/main/java/com/vanilla/experience/forge/VanillaExperience.java @@ -0,0 +1,35 @@ +package com.vanilla.experience.forge; + +import com.vanilla.experience.forge.enhancedberries.*; +import com.vanilla.experience.forge.enhancedbonemeal.*; +import com.vanilla.experience.forge.enhancedseeds.*; +import com.vanilla.experience.forge.enhancedtotem.*; +import com.vanilla.experience.forge.utils.OverrideLoader; +import com.vanilla.experience.forge.utils.VexUtils; +import com.vanilla.experience.HelloMessage; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +@Mod("vanillaexperience") +public class VanillaExperience { + private static final Logger LOGGER = LogManager.getLogger(); + + public VanillaExperience() { + new HelloMessage(); + + new OverrideLoader(VexUtils.mixinExists()); + + new EnhancedBoneMealDispenserBehaviour(); + new EnhancedSeedsDispenserBehaviour(); + + FMLJavaModLoadingContext.get().getModEventBus().addListener((FMLLoadCompleteEvent e) -> { + new EnhancedBoneMeal(); + new EnhancedSeeds(); + new EnhancedBerries(); + new EnhancedTotem(); + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/vanilla/experience/enhancedberries/EnhancedBerries.java b/forge/src/main/java/com/vanilla/experience/forge/enhancedberries/EnhancedBerries.java similarity index 91% rename from src/main/java/com/vanilla/experience/enhancedberries/EnhancedBerries.java rename to forge/src/main/java/com/vanilla/experience/forge/enhancedberries/EnhancedBerries.java index 63f2060..ef1b097 100644 --- a/src/main/java/com/vanilla/experience/enhancedberries/EnhancedBerries.java +++ b/forge/src/main/java/com/vanilla/experience/forge/enhancedberries/EnhancedBerries.java @@ -1,4 +1,4 @@ -package com.vanilla.experience.enhancedberries; +package com.vanilla.experience.forge.enhancedberries; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.EquipmentSlotType; diff --git a/src/main/java/com/vanilla/experience/enhancedbonemeal/EnhancedBoneMeal.java b/forge/src/main/java/com/vanilla/experience/forge/enhancedbonemeal/EnhancedBoneMeal.java similarity index 90% rename from src/main/java/com/vanilla/experience/enhancedbonemeal/EnhancedBoneMeal.java rename to forge/src/main/java/com/vanilla/experience/forge/enhancedbonemeal/EnhancedBoneMeal.java index 684314b..b903b6e 100644 --- a/src/main/java/com/vanilla/experience/enhancedbonemeal/EnhancedBoneMeal.java +++ b/forge/src/main/java/com/vanilla/experience/forge/enhancedbonemeal/EnhancedBoneMeal.java @@ -1,18 +1,23 @@ -package com.vanilla.experience.enhancedbonemeal; +package com.vanilla.experience.forge.enhancedbonemeal; import net.minecraft.block.*; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.BonemealEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber public class EnhancedBoneMeal { + + public EnhancedBoneMeal(){ + MinecraftForge.EVENT_BUS.register(this); + } + @SubscribeEvent public void onBoneMeal(BonemealEvent e) { diff --git a/src/main/java/com/vanilla/experience/enhancedbonemeal/EnhancedBoneMealDispenserBehaviour.java b/forge/src/main/java/com/vanilla/experience/forge/enhancedbonemeal/EnhancedBoneMealDispenserBehaviour.java similarity index 90% rename from src/main/java/com/vanilla/experience/enhancedbonemeal/EnhancedBoneMealDispenserBehaviour.java rename to forge/src/main/java/com/vanilla/experience/forge/enhancedbonemeal/EnhancedBoneMealDispenserBehaviour.java index 05d2a0a..0dab483 100644 --- a/src/main/java/com/vanilla/experience/enhancedbonemeal/EnhancedBoneMealDispenserBehaviour.java +++ b/forge/src/main/java/com/vanilla/experience/forge/enhancedbonemeal/EnhancedBoneMealDispenserBehaviour.java @@ -1,4 +1,4 @@ -package com.vanilla.experience.enhancedbonemeal; +package com.vanilla.experience.forge.enhancedbonemeal; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -8,12 +8,17 @@ import net.minecraft.dispenser.IBlockSource; import net.minecraft.item.BoneMealItem; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class EnhancedBoneMealDispenserBehaviour extends DefaultDispenseItemBehavior -{ +public class EnhancedBoneMealDispenserBehaviour extends DefaultDispenseItemBehavior { + + public EnhancedBoneMealDispenserBehaviour(){ + DispenserBlock.registerDispenseBehavior(Items.BONE_MEAL, this); + } + @Override public ItemStack dispenseStack(IBlockSource source, ItemStack stack) { World world = source.getWorld(); diff --git a/src/main/java/com/vanilla/experience/enhancedseeds/EnhancedSeeds.java b/forge/src/main/java/com/vanilla/experience/forge/enhancedseeds/EnhancedSeeds.java similarity index 87% rename from src/main/java/com/vanilla/experience/enhancedseeds/EnhancedSeeds.java rename to forge/src/main/java/com/vanilla/experience/forge/enhancedseeds/EnhancedSeeds.java index 9d7315c..98f6aac 100644 --- a/src/main/java/com/vanilla/experience/enhancedseeds/EnhancedSeeds.java +++ b/forge/src/main/java/com/vanilla/experience/forge/enhancedseeds/EnhancedSeeds.java @@ -1,4 +1,4 @@ -package com.vanilla.experience.enhancedseeds; +package com.vanilla.experience.forge.enhancedseeds; import net.minecraft.block.Block; import net.minecraft.block.Blocks; @@ -8,12 +8,18 @@ import net.minecraft.item.Items; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber public class EnhancedSeeds { + + public EnhancedSeeds(){ + MinecraftForge.EVENT_BUS.register(this); + } + @SubscribeEvent public void onDirtGrassClick(RightClickBlock e) { World world = e.getWorld(); @@ -35,7 +41,7 @@ public void onDirtGrassClick(RightClickBlock e) { if(!player.isCreative()) hand.shrink(1); } else if(upperBlock.equals(Blocks.GRASS)) { - if(upgrade(world, blockPos) && !player.isCreative()) + if(upgrade(world, blockPos.up()) && !player.isCreative()) hand.shrink(1); } } else if(currentBlock.equals(Blocks.GRASS)) { diff --git a/src/main/java/com/vanilla/experience/enhancedseeds/EnhancedSeedsDispenserBehaviour.java b/forge/src/main/java/com/vanilla/experience/forge/enhancedseeds/EnhancedSeedsDispenserBehaviour.java similarity index 87% rename from src/main/java/com/vanilla/experience/enhancedseeds/EnhancedSeedsDispenserBehaviour.java rename to forge/src/main/java/com/vanilla/experience/forge/enhancedseeds/EnhancedSeedsDispenserBehaviour.java index 486ae5e..b023ae9 100644 --- a/src/main/java/com/vanilla/experience/enhancedseeds/EnhancedSeedsDispenserBehaviour.java +++ b/forge/src/main/java/com/vanilla/experience/forge/enhancedseeds/EnhancedSeedsDispenserBehaviour.java @@ -1,15 +1,20 @@ -package com.vanilla.experience.enhancedseeds; +package com.vanilla.experience.forge.enhancedseeds; import net.minecraft.block.*; import net.minecraft.dispenser.DefaultDispenseItemBehavior; import net.minecraft.dispenser.IBlockSource; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public class EnhancedSeedsDispenserBehaviour extends DefaultDispenseItemBehavior -{ +public class EnhancedSeedsDispenserBehaviour extends DefaultDispenseItemBehavior { + + public EnhancedSeedsDispenserBehaviour(){ + DispenserBlock.registerDispenseBehavior(Items.WHEAT_SEEDS, this); + } + @Override public ItemStack dispenseStack(IBlockSource source, ItemStack stack) { Direction facing = source.getBlockState().get(DispenserBlock.FACING); diff --git a/src/main/java/com/vanilla/experience/enhancedtotem/EnhancedTotem.java b/forge/src/main/java/com/vanilla/experience/forge/enhancedtotem/EnhancedTotem.java similarity index 86% rename from src/main/java/com/vanilla/experience/enhancedtotem/EnhancedTotem.java rename to forge/src/main/java/com/vanilla/experience/forge/enhancedtotem/EnhancedTotem.java index a748efe..140c279 100644 --- a/src/main/java/com/vanilla/experience/enhancedtotem/EnhancedTotem.java +++ b/forge/src/main/java/com/vanilla/experience/forge/enhancedtotem/EnhancedTotem.java @@ -1,7 +1,6 @@ -package com.vanilla.experience.enhancedtotem; +package com.vanilla.experience.forge.enhancedtotem; import net.minecraft.advancements.CriteriaTriggers; -import net.minecraft.client.particle.TotemOfUndyingParticle; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -12,6 +11,7 @@ import net.minecraft.potion.Effects; import net.minecraft.stats.Stats; import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @@ -19,6 +19,10 @@ @EventBusSubscriber public class EnhancedTotem { + public EnhancedTotem(){ + MinecraftForge.EVENT_BUS.register(this); + } + @SubscribeEvent public void onPlayerDeath(LivingDeathEvent e){ Entity entity = e.getEntity(); @@ -38,7 +42,7 @@ public void onPlayerDeath(LivingDeathEvent e){ if(inventory == null); - for (int i = 0; i < inventory.getSizeInventory(); i++) { + for(int i = 0; i < inventory.getSizeInventory(); i++) { ItemStack stack = inventory.getStackInSlot(i); if (stack.getItem().equals(Items.TOTEM_OF_UNDYING)) { itemStack = stack; @@ -48,7 +52,7 @@ public void onPlayerDeath(LivingDeathEvent e){ if(itemStack == null) return; e.setCanceled(true); - if (player instanceof ServerPlayerEntity) { + if(player instanceof ServerPlayerEntity) { ServerPlayerEntity entityPlayer = (ServerPlayerEntity) player; entityPlayer.addStat(Stats.ITEM_USED.get(Items.TOTEM_OF_UNDYING)); CriteriaTriggers.USED_TOTEM.trigger(entityPlayer, itemStack); diff --git a/forge/src/main/java/com/vanilla/experience/forge/utils/MixinLoader.java b/forge/src/main/java/com/vanilla/experience/forge/utils/MixinLoader.java new file mode 100644 index 0000000..cac1aea --- /dev/null +++ b/forge/src/main/java/com/vanilla/experience/forge/utils/MixinLoader.java @@ -0,0 +1,23 @@ +package com.vanilla.experience.forge.utils; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.Mixins; +import org.spongepowered.asm.mixin.connect.IMixinConnector; + +public class MixinLoader implements IMixinConnector { + + private static final Logger LOGGER = LogManager.getLogger(); + + @Override + public void connect() { + if(VexUtils.isZeroTickPatched()) { + LOGGER.info("[VEX] Unpatching ZeroTick with MixinBootstrap."); + Mixins.addConfiguration("mixin/forge/zerotickunpatch.mixins.json"); + } + if(VexUtils.isWitherRosesSpawnPatched()) { + LOGGER.info("[VEX] Unpatching Wither Rose spawning with MixinBootstrap."); + Mixins.addConfiguration("mixin/forge/witherrosesunpatch.mixins.json"); + } + } +} \ No newline at end of file diff --git a/forge/src/main/java/com/vanilla/experience/forge/utils/OverrideLoader.java b/forge/src/main/java/com/vanilla/experience/forge/utils/OverrideLoader.java new file mode 100644 index 0000000..67d307a --- /dev/null +++ b/forge/src/main/java/com/vanilla/experience/forge/utils/OverrideLoader.java @@ -0,0 +1,66 @@ +package com.vanilla.experience.forge.utils; + +import com.vanilla.experience.forge.witherrosesunpatch.override.WitherRose; +import com.vanilla.experience.forge.zerotickunpatch.override.*; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +@EventBusSubscriber(bus=EventBusSubscriber.Bus.MOD) +public class OverrideLoader { + private static final Logger LOGGER = LogManager.getLogger(); + + public OverrideLoader(boolean mixinExists){ + if(!mixinExists) MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + public static void onBlocksRegistry(final RegistryEvent.Register blockRegistryEvent) { + if(VexUtils.isZeroTickPatched()) { + LOGGER.info("[VEX] Unpatching ZeroTick, ignore the 'Potentially Dangerous' messages."); + LOGGER.info("[VEX] If you want to disable the block overrides, please install MixinBootstrap or use Fabric version."); + blockRegistryEvent.getRegistry().register(new ZeroTickBambooBlock(Block.Properties.from(Blocks.BAMBOO)).setRegistryName("minecraft", "bamboo")); + blockRegistryEvent.getRegistry().register(new ZeroTickCactusBlock(Block.Properties.from(Blocks.CACTUS)).setRegistryName("minecraft", "cactus")); + blockRegistryEvent.getRegistry().register(new ZeroTickSugarCaneBlock(Block.Properties.from(Blocks.SUGAR_CANE)).setRegistryName("minecraft", "sugar_cane")); + blockRegistryEvent.getRegistry().register(new ZeroTickKelpTopBlock(Block.Properties.from(Blocks.KELP)).setRegistryName("minecraft", "kelp")); + blockRegistryEvent.getRegistry().register(new ZeroTickWeepingVinesTopBlock(Block.Properties.from(Blocks.WEEPING_VINES)).setRegistryName("minecraft", "weeping_vines")); + blockRegistryEvent.getRegistry().register(new ZeroTickTwistingVinesTopBlock(Block.Properties.from(Blocks.TWISTING_VINES)).setRegistryName("minecraft", "twisting_vines")); + blockRegistryEvent.getRegistry().register(new ZeroTickChorusFlowerBlock(Block.Properties.from(Blocks.CHORUS_FLOWER)).setRegistryName("minecraft", "chorus_flower")); + } + + if(VexUtils.isWitherRosesSpawnPatched()) { + LOGGER.info("[VEX] Unpatching Wither Rose spawning, ignore the 'Potentially Dangerous' messages."); + LOGGER.info("[VEX] If you want to disable the block overrides, please install MixinBootstrap or use Fabric version."); + blockRegistryEvent.getRegistry().register(new WitherRose(Block.Properties.from(Blocks.WITHER_ROSE)).setRegistryName("minecraft", "wither_rose")); + } + } + + @SubscribeEvent + public static void onItemsRegistry(final RegistryEvent.Register itemRegistryEvent) { + if(VexUtils.isZeroTickPatched()) { + LOGGER.info("[VEX] Restoring ZeroTick Block Items"); + LOGGER.info("[VEX] If you want to disable the block overrides, please install MixinBootstrap or use Fabric version."); + itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.BAMBOO, new Item.Properties().group(Items.BAMBOO.getGroup())).setRegistryName("minecraft", "bamboo")); + itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.CACTUS, new Item.Properties().group(Items.CACTUS.getGroup())).setRegistryName("minecraft", "cactus")); + itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.SUGAR_CANE, new Item.Properties().group(Items.SUGAR_CANE.getGroup())).setRegistryName("minecraft", "sugar_cane")); + itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.KELP, new Item.Properties().group(Items.KELP.getGroup())).setRegistryName("minecraft", "kelp")); + itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.WEEPING_VINES, new Item.Properties().group(Items.WEEPING_VINES.getGroup())).setRegistryName("minecraft", "weeping_vines")); + itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.TWISTING_VINES, new Item.Properties().group(Items.TWISTING_VINES.getGroup())).setRegistryName("minecraft", "twisting_vines")); + itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.CHORUS_FLOWER, new Item.Properties().group(Items.CHORUS_FLOWER.getGroup())).setRegistryName("minecraft", "chorus_flower")); + } + + if(VexUtils.isWitherRosesSpawnPatched()) { + LOGGER.info("[VEX] Restoring Wither Rose Block Item"); + LOGGER.info("[VEX] If you want to disable the block overrides, please install MixinBootstrap or use Fabric version."); + itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.WITHER_ROSE, new Item.Properties().group(Items.CHORUS_FLOWER.getGroup())).setRegistryName("minecraft", "wither_rose")); + } + } +} diff --git a/forge/src/main/java/com/vanilla/experience/forge/utils/VexUtils.java b/forge/src/main/java/com/vanilla/experience/forge/utils/VexUtils.java new file mode 100644 index 0000000..9677736 --- /dev/null +++ b/forge/src/main/java/com/vanilla/experience/forge/utils/VexUtils.java @@ -0,0 +1,23 @@ +package com.vanilla.experience.forge.utils; + +import com.vanilla.experience.CommonUtils; +import net.minecraft.util.SharedConstants; + +public class VexUtils { + public static boolean mixinExists() { + try { + Class.forName("org.spongepowered.asm.launch.MixinBootstrap"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + + public static boolean isZeroTickPatched() { + return SharedConstants.getVersion().getWorldVersion() >= CommonUtils.zeroTickVersionPatch; + } + + public static boolean isWitherRosesSpawnPatched() { + return SharedConstants.getVersion().getWorldVersion() >= CommonUtils.witherRosesVersionPatch; + } +} diff --git a/forge/src/main/java/com/vanilla/experience/forge/witherrosesunpatch/mixin/EntityTypeMixin.java b/forge/src/main/java/com/vanilla/experience/forge/witherrosesunpatch/mixin/EntityTypeMixin.java new file mode 100644 index 0000000..01304d8 --- /dev/null +++ b/forge/src/main/java/com/vanilla/experience/forge/witherrosesunpatch/mixin/EntityTypeMixin.java @@ -0,0 +1,16 @@ +package com.vanilla.experience.forge.witherrosesunpatch.mixin; + +import net.minecraft.block.*; +import net.minecraft.entity.EntityType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(EntityType.class) +public class EntityTypeMixin { + + @Redirect(method = "func_233597_a_(Lnet/minecraft/block/BlockState;)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;isIn(Lnet/minecraft/block/Block;)Z", ordinal = 2)) + private boolean restoreWitherRoseSpawning(BlockState blockState, Block block) { + return false; // return false to method that checks if is inside a Whiter Rose + } +} \ No newline at end of file diff --git a/src/main/java/com/vanilla/experience/enhancedwitherroses/EnhancedWitherRoses.java b/forge/src/main/java/com/vanilla/experience/forge/witherrosesunpatch/override/WitherRose.java similarity index 59% rename from src/main/java/com/vanilla/experience/enhancedwitherroses/EnhancedWitherRoses.java rename to forge/src/main/java/com/vanilla/experience/forge/witherrosesunpatch/override/WitherRose.java index 4221c69..3fceeae 100644 --- a/src/main/java/com/vanilla/experience/enhancedwitherroses/EnhancedWitherRoses.java +++ b/forge/src/main/java/com/vanilla/experience/forge/witherrosesunpatch/override/WitherRose.java @@ -1,20 +1,16 @@ -package com.vanilla.experience.enhancedwitherroses; +package com.vanilla.experience.forge.witherrosesunpatch.override; import net.minecraft.block.BlockState; -import net.minecraft.block.FlowerBlock; import net.minecraft.block.WitherRoseBlock; import net.minecraft.entity.EntitySpawnPlacementRegistry; import net.minecraft.entity.EntityType; import net.minecraft.potion.Effects; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -public class EnhancedWitherRoses extends WitherRoseBlock { - private static final Logger LOGGER = LogManager.getLogger(); +public class WitherRose extends WitherRoseBlock { - public EnhancedWitherRoses(Properties properties) { + public WitherRose(Properties properties) { super(Effects.WITHER, properties); } diff --git a/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickAbstractTopPlantBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickAbstractTopPlantBlock.java new file mode 100644 index 0000000..7fa7d82 --- /dev/null +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickAbstractTopPlantBlock.java @@ -0,0 +1,27 @@ +package com.vanilla.experience.forge.zerotickunpatch.mixin; + +import net.minecraft.block.BlockState; +import net.minecraft.block.AbstractTopPlantBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +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 java.util.Random; + +// this abstracts Kelp, TwistingVines and WeepingVines +@Mixin(AbstractTopPlantBlock.class) +public class ZeroTickAbstractTopPlantBlock { + @Shadow + public void randomTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random) {} + + @Inject(at = @At("TAIL"), method = "tick") + public void tick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random, CallbackInfo info) { + if(!world.isAirBlock(pos.down())) { + this.randomTick(state, world, pos, random); + } + } +} \ No newline at end of file diff --git a/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickBambooBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickBambooBlock.java new file mode 100644 index 0000000..d750848 --- /dev/null +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickBambooBlock.java @@ -0,0 +1,31 @@ +package com.vanilla.experience.forge.zerotickunpatch.mixin; + +import net.minecraft.block.BlockState; +import net.minecraft.block.BambooBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +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 java.util.Random; + +@Mixin(BambooBlock.class) +public class ZeroTickBambooBlock { + private static final Logger LOGGER = LogManager.getLogger(); + + @Shadow + public void randomTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random) {} + + @Inject(at = @At("TAIL"), method = "tick") + public void tick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random, CallbackInfo info) { + if(!world.isAirBlock(pos.down())) { + this.randomTick(state, world, pos, random); + } + } + +} \ No newline at end of file diff --git a/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickCactusBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickCactusBlock.java new file mode 100644 index 0000000..1325775 --- /dev/null +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickCactusBlock.java @@ -0,0 +1,26 @@ +package com.vanilla.experience.forge.zerotickunpatch.mixin; + +import net.minecraft.block.CactusBlock; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +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 java.util.Random; + +@Mixin(CactusBlock.class) +public class ZeroTickCactusBlock { + @Shadow + public void randomTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random) {} + + @Inject(at = @At("TAIL"), method = "tick") + public void tick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random, CallbackInfo info) { + if(!world.isAirBlock(pos.down())) { + this.randomTick(state, world, pos, random); + } + } +} \ No newline at end of file diff --git a/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickChorusFlowerBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickChorusFlowerBlock.java new file mode 100644 index 0000000..0e010e7 --- /dev/null +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickChorusFlowerBlock.java @@ -0,0 +1,26 @@ +package com.vanilla.experience.forge.zerotickunpatch.mixin; + +import net.minecraft.block.BlockState; +import net.minecraft.block.ChorusFlowerBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +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 java.util.Random; + +@Mixin(ChorusFlowerBlock.class) +public class ZeroTickChorusFlowerBlock { + @Shadow + public void randomTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random) {} + + @Inject(at = @At("TAIL"), method = "tick") + public void tick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random, CallbackInfo info) { + if(!world.isAirBlock(pos.down())) { + this.randomTick(state, world, pos, random); + } + } +} \ No newline at end of file diff --git a/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickSugarCaneBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickSugarCaneBlock.java new file mode 100644 index 0000000..15cf529 --- /dev/null +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/mixin/ZeroTickSugarCaneBlock.java @@ -0,0 +1,26 @@ +package com.vanilla.experience.forge.zerotickunpatch.mixin; + +import net.minecraft.block.BlockState; +import net.minecraft.block.SugarCaneBlock; +import net.minecraft.world.server.ServerWorld; +import net.minecraft.util.math.BlockPos; +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 java.util.Random; + +@Mixin(SugarCaneBlock.class) +public class ZeroTickSugarCaneBlock { + @Shadow + public void randomTick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random) {} + + @Inject(at = @At("TAIL"), method = "tick") + public void tick(final BlockState state, final ServerWorld world, final BlockPos pos, final Random random, CallbackInfo info) { + if(!world.isAirBlock(pos.down())) { + this.randomTick(state, world, pos, random); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickBambooBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickBambooBlock.java similarity index 80% rename from src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickBambooBlock.java rename to forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickBambooBlock.java index e6de112..9281f2b 100644 --- a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickBambooBlock.java +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickBambooBlock.java @@ -1,4 +1,4 @@ -package com.vanilla.experience.zerotickunpatch; +package com.vanilla.experience.forge.zerotickunpatch.override; import net.minecraft.block.BambooBlock; import net.minecraft.block.BlockState; @@ -7,8 +7,7 @@ import java.util.Random; -public class ZeroTickBambooBlock extends BambooBlock -{ +public class ZeroTickBambooBlock extends BambooBlock { public ZeroTickBambooBlock(Properties properties) { super(properties); } diff --git a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickCactusBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickCactusBlock.java similarity index 80% rename from src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickCactusBlock.java rename to forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickCactusBlock.java index 0657636..62b6cd2 100644 --- a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickCactusBlock.java +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickCactusBlock.java @@ -1,4 +1,4 @@ -package com.vanilla.experience.zerotickunpatch; +package com.vanilla.experience.forge.zerotickunpatch.override; import net.minecraft.block.CactusBlock; import net.minecraft.block.BlockState; @@ -7,8 +7,7 @@ import java.util.Random; -public class ZeroTickCactusBlock extends CactusBlock -{ +public class ZeroTickCactusBlock extends CactusBlock { public ZeroTickCactusBlock(Properties properties) { super(properties); } diff --git a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickChorusFlowerBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickChorusFlowerBlock.java similarity index 89% rename from src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickChorusFlowerBlock.java rename to forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickChorusFlowerBlock.java index 8cde80d..ac48378 100644 --- a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickChorusFlowerBlock.java +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickChorusFlowerBlock.java @@ -1,4 +1,4 @@ -package com.vanilla.experience.zerotickunpatch; +package com.vanilla.experience.forge.zerotickunpatch.override; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -9,7 +9,6 @@ import java.util.Random; - public class ZeroTickChorusFlowerBlock extends ChorusFlowerBlock { public ZeroTickChorusFlowerBlock(Properties builder) { diff --git a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickKelpTopBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickKelpTopBlock.java similarity index 79% rename from src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickKelpTopBlock.java rename to forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickKelpTopBlock.java index 32970c5..43e17a4 100644 --- a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickKelpTopBlock.java +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickKelpTopBlock.java @@ -1,4 +1,4 @@ -package com.vanilla.experience.zerotickunpatch; +package com.vanilla.experience.forge.zerotickunpatch.override; import net.minecraft.block.KelpTopBlock; import net.minecraft.block.BlockState; @@ -7,8 +7,7 @@ import java.util.Random; -public class ZeroTickKelpTopBlock extends KelpTopBlock -{ +public class ZeroTickKelpTopBlock extends KelpTopBlock { public ZeroTickKelpTopBlock(Properties properties) { super(properties); } diff --git a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickSugarCaneBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickSugarCaneBlock.java similarity index 79% rename from src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickSugarCaneBlock.java rename to forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickSugarCaneBlock.java index aa2c682..433e98d 100644 --- a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickSugarCaneBlock.java +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickSugarCaneBlock.java @@ -1,4 +1,4 @@ -package com.vanilla.experience.zerotickunpatch; +package com.vanilla.experience.forge.zerotickunpatch.override; import net.minecraft.block.BlockState; import net.minecraft.block.SugarCaneBlock; @@ -7,8 +7,7 @@ import java.util.Random; -public class ZeroTickSugarCaneBlock extends SugarCaneBlock -{ +public class ZeroTickSugarCaneBlock extends SugarCaneBlock { public ZeroTickSugarCaneBlock(Properties properties) { super(properties); } diff --git a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickTwistingVinesTopBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickTwistingVinesTopBlock.java similarity index 79% rename from src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickTwistingVinesTopBlock.java rename to forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickTwistingVinesTopBlock.java index b17b4ca..75a4cfc 100644 --- a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickTwistingVinesTopBlock.java +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickTwistingVinesTopBlock.java @@ -1,16 +1,13 @@ -package com.vanilla.experience.zerotickunpatch; +package com.vanilla.experience.forge.zerotickunpatch.override; import net.minecraft.block.BlockState; import net.minecraft.block.TwistingVinesTopBlock; import net.minecraft.util.math.BlockPos; import net.minecraft.world.server.ServerWorld; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import java.util.Random; -public class ZeroTickTwistingVinesTopBlock extends TwistingVinesTopBlock -{ +public class ZeroTickTwistingVinesTopBlock extends TwistingVinesTopBlock { public ZeroTickTwistingVinesTopBlock(Properties properties) { super(properties); } diff --git a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickWeepingVinesTopBlock.java b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickWeepingVinesTopBlock.java similarity index 79% rename from src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickWeepingVinesTopBlock.java rename to forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickWeepingVinesTopBlock.java index dad7bcb..413de44 100644 --- a/src/main/java/com/vanilla/experience/zerotickunpatch/ZeroTickWeepingVinesTopBlock.java +++ b/forge/src/main/java/com/vanilla/experience/forge/zerotickunpatch/override/ZeroTickWeepingVinesTopBlock.java @@ -1,16 +1,13 @@ -package com.vanilla.experience.zerotickunpatch; +package com.vanilla.experience.forge.zerotickunpatch.override; import net.minecraft.block.WeepingVinesTopBlock; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.server.ServerWorld; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import java.util.Random; -public class ZeroTickWeepingVinesTopBlock extends WeepingVinesTopBlock -{ +public class ZeroTickWeepingVinesTopBlock extends WeepingVinesTopBlock { public ZeroTickWeepingVinesTopBlock(Properties properties) { super(properties); } diff --git a/forge/src/main/resources/META-INF/MANIFEST.MF b/forge/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000..70fce8a --- /dev/null +++ b/forge/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Specification-Vendor: vanillaexperience +Specification-Title: vanillaexperience +Specification-Version: 1 +Implementation-Title: vanillaexperience +Implementation-Version: 1.0 +Implementation-Vendor: vanillaexperience +MixinConnector: com.vanilla.experience.forge.utils.MixinLoader + diff --git a/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml similarity index 56% rename from src/main/resources/META-INF/mods.toml rename to forge/src/main/resources/META-INF/mods.toml index 3df497c..3419921 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,14 +1,12 @@ -modLoader="javafml" #mandatory - -loaderVersion="[32,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. +modLoader="javafml" +loaderVersion="[32,)" issueTrackerURL="https://mods.augustoresende.com/vanillaexperience/issues" - [[mods]] modId="vanillaexperience" -version="0.0.1" +version="${file.jarVersion}" displayName="Vanilla Experience" @@ -17,19 +15,16 @@ updateJSONURL="https://mods.augustoresende.com/vanillaexperience/updates.json" displayURL="https://mods.augustoresende.com/vanillaexperience/" logoFile="vex.png" -credits="Vanilla Experience Mod!" +credits="AugustoResende" -authors="AugustoResende" #optional +authors="AugustoResende" -description=''' -Thanks for downloading! - -''' +description='''Thanks for downloading Vanilla Experience for Forge!''' [[dependencies.forge]] - modId="forge" #mandatory - mandatory=true #mandatory - versionRange="[32,)" #mandatory + modId="forge" + mandatory=true + versionRange="[32,)" ordering="NONE" side="BOTH" diff --git a/forge/src/main/resources/mixin/forge/witherrosesunpatch.mixins.json b/forge/src/main/resources/mixin/forge/witherrosesunpatch.mixins.json new file mode 100644 index 0000000..4ea9d28 --- /dev/null +++ b/forge/src/main/resources/mixin/forge/witherrosesunpatch.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "package": "com.vanilla.experience.forge.witherrosesunpatch.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "EntityTypeMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" +} \ No newline at end of file diff --git a/forge/src/main/resources/mixin/forge/zerotickunpatch.mixins.json b/forge/src/main/resources/mixin/forge/zerotickunpatch.mixins.json new file mode 100644 index 0000000..55a3a1e --- /dev/null +++ b/forge/src/main/resources/mixin/forge/zerotickunpatch.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "package": "com.vanilla.experience.forge.zerotickunpatch.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "ZeroTickAbstractTopPlantBlock", + "ZeroTickBambooBlock", + "ZeroTickCactusBlock", + "ZeroTickChorusFlowerBlock", + "ZeroTickSugarCaneBlock" + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 5927faf..bab2658 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,9 @@ # Sets default memory used for gradle commands. Can be overridden by user or command line properties. # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx4G -org.gradle.daemon=false \ No newline at end of file +org.gradle.daemon=false +mod_version=0.1.6 +mod_id=vanillaexperience +mc_version=1.16.1 +forge_version=32.0.59 +curseforge_id=393896 \ No newline at end of file diff --git a/src/main/java/com/vanilla/experience/VanillaExperience.java b/src/main/java/com/vanilla/experience/VanillaExperience.java deleted file mode 100644 index 1f75e02..0000000 --- a/src/main/java/com/vanilla/experience/VanillaExperience.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.vanilla.experience; - -import com.vanilla.experience.enhancedberries.*; -import com.vanilla.experience.enhancedbonemeal.*; -import com.vanilla.experience.enhancedseeds.*; -import com.vanilla.experience.enhancedtotem.*; -import com.vanilla.experience.enhancedwitherroses.*; -import com.vanilla.experience.zerotickunpatch.*; -import net.minecraft.block.*; -import net.minecraft.item.*; -import net.minecraft.util.SharedConstants; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; -import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent; -import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.minecraftforge.fml.event.server.FMLServerStartingEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// The value here should match an entry in the META-INF/mods.toml file -@Mod("vanillaexperience") -public class VanillaExperience -{ - // Directly reference a log4j logger. - private static final Logger LOGGER = LogManager.getLogger(); - - public VanillaExperience() { - /* // Register the setup method for modloading - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); - // Register the enqueueIMC method for modloading - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueIMC); - // Register the processIMC method for modloading - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::processIMC); - // Register the doClientStuff method for modloading - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff); */ - - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::loadCompleted); - - MinecraftForge.EVENT_BUS.register(this); - - DispenserBlock.registerDispenseBehavior(Items.BONE_MEAL, new EnhancedBoneMealDispenserBehaviour()); - DispenserBlock.registerDispenseBehavior(Items.WHEAT_SEEDS, new EnhancedSeedsDispenserBehaviour()); - } - - private void loadCompleted(FMLLoadCompleteEvent e){ - MinecraftForge.EVENT_BUS.register(new EnhancedBoneMeal()); - MinecraftForge.EVENT_BUS.register(new EnhancedBerries()); - MinecraftForge.EVENT_BUS.register(new EnhancedSeeds()); - MinecraftForge.EVENT_BUS.register(new EnhancedTotem()); - } - - @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD) - public static class RegistryEvents { - @SubscribeEvent - public static void onBlocksRegistry(final RegistryEvent.Register blockRegistryEvent) { - if(SharedConstants.getVersion().getWorldVersion() >= 2524){ - LOGGER.info("Unpatching ZeroTick, ignore the 'Potentially Dangerous' messages."); - blockRegistryEvent.getRegistry().register(new ZeroTickBambooBlock(Block.Properties.from(Blocks.BAMBOO)).setRegistryName("minecraft", "bamboo")); - blockRegistryEvent.getRegistry().register(new ZeroTickCactusBlock(Block.Properties.from(Blocks.CACTUS)).setRegistryName("minecraft", "cactus")); - blockRegistryEvent.getRegistry().register(new ZeroTickSugarCaneBlock(Block.Properties.from(Blocks.SUGAR_CANE)).setRegistryName("minecraft", "sugar_cane")); - blockRegistryEvent.getRegistry().register(new ZeroTickKelpTopBlock(Block.Properties.from(Blocks.KELP)).setRegistryName("minecraft", "kelp")); - blockRegistryEvent.getRegistry().register(new ZeroTickWeepingVinesTopBlock(Block.Properties.from(Blocks.WEEPING_VINES)).setRegistryName("minecraft", "weeping_vines")); - blockRegistryEvent.getRegistry().register(new ZeroTickTwistingVinesTopBlock(Block.Properties.from(Blocks.TWISTING_VINES)).setRegistryName("minecraft", "twisting_vines")); - blockRegistryEvent.getRegistry().register(new ZeroTickChorusFlowerBlock(Block.Properties.from(Blocks.CHORUS_FLOWER)).setRegistryName("minecraft", "chorus_flower")); - LOGGER.info("Unpatching Wither Rose spawning."); - blockRegistryEvent.getRegistry().register(new EnhancedWitherRoses(Block.Properties.from(Blocks.WITHER_ROSE)).setRegistryName("minecraft", "wither_rose")); - } - } - - @SubscribeEvent - public static void onItemsRegistry(final RegistryEvent.Register itemRegistryEvent) { - if (SharedConstants.getVersion().getWorldVersion() >= 2524) { - itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.BAMBOO, new Item.Properties().group(Items.BAMBOO.getGroup())).setRegistryName("minecraft", "bamboo")); - itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.CACTUS, new Item.Properties().group(Items.CACTUS.getGroup())).setRegistryName("minecraft", "cactus")); - itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.SUGAR_CANE, new Item.Properties().group(Items.SUGAR_CANE.getGroup())).setRegistryName("minecraft", "sugar_cane")); - itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.KELP, new Item.Properties().group(Items.KELP.getGroup())).setRegistryName("minecraft", "kelp")); - itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.WEEPING_VINES, new Item.Properties().group(Items.WEEPING_VINES.getGroup())).setRegistryName("minecraft", "weeping_vines")); - itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.TWISTING_VINES, new Item.Properties().group(Items.TWISTING_VINES.getGroup())).setRegistryName("minecraft", "twisting_vines")); - itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.CHORUS_FLOWER, new Item.Properties().group(Items.CHORUS_FLOWER.getGroup())).setRegistryName("minecraft", "chorus_flower")); - itemRegistryEvent.getRegistry().register(new BlockItem(Blocks.WITHER_ROSE, new Item.Properties().group(Items.CHORUS_FLOWER.getGroup())).setRegistryName("minecraft", "wither_rose")); - } - } - } - - /* private void setup(final FMLCommonSetupEvent event) - { - // some preinit code - //LOGGER.info("HELLO FROM PREINIT"); - //LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName()); - } - - private void doClientStuff(final FMLClientSetupEvent event) { - // do something that can only be done on the client - //LOGGER.info("Got game settings {}", event.getMinecraftSupplier().get().gameSettings); - } - - private void enqueueIMC(final InterModEnqueueEvent event) - { - // some example code to dispatch IMC to another mod - //InterModComms.sendTo("examplemod", "helloworld", () -> { LOGGER.info("Hello world from the MDK"); return "Hello world";}); - } - - private void processIMC(final InterModProcessEvent event) - { - // some example code to receive and process InterModComms from other mods - //LOGGER.info("Got IMC {}", event.getIMCStream(). - // map(m->m.getMessageSupplier().get()). - // collect(Collectors.toList())); - } - // You can use SubscribeEvent and let the Event Bus discover methods to call - @SubscribeEvent - public void onServerStarting(FMLServerStartingEvent event) { - // do something when the server starts - //LOGGER.info("HELLO from server starting"); - } */ - - // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD - // Event bus for receiving Registry Events) -} - diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF deleted file mode 100644 index b21f14e..0000000 --- a/src/main/resources/META-INF/MANIFEST.MF +++ /dev/null @@ -1,8 +0,0 @@ -Manifest-Version: 1.0 -Implementation-Title: VanillaExperience -Implementation-Version: 1.0 -Specification-Vendor: test -Specification-Title: vanillaexperience -Specification-Version: 1 -Implementation-Vendor: test -