├── logs ├── debug.log └── latest.log ├── src ├── generated │ └── resources │ │ └── .cache │ │ └── cache └── main │ ├── resources │ ├── blame_icon.png │ ├── pack.mcmeta │ ├── META-INF │ │ └── mods.toml │ └── blame.mixins.json │ └── java │ └── com │ └── telepathicgrunt │ └── blame │ ├── mixin │ ├── BiomeProviderAccessor.java │ ├── MinecraftServerAccessor.java │ ├── StructureAccessor.java │ ├── TemplateManagerAccessor.java │ ├── ForgeRegistriesMixin.java │ ├── DispenserBlockAccessor.java │ ├── SingleJigsawPieceAccessor.java │ ├── TemplateManagerMixin.java │ ├── WorldSettingsImportMixin.java │ ├── AbstractVillagePieceMixin.java │ ├── SingleJigsawPieceMixin.java │ ├── BootstrapMixin.java │ ├── BlameMixinPlugin.java │ ├── StructureMixin.java │ ├── DynamicRegistriesMixin.java │ ├── WorldSettingsImportInnerClassMixin.java │ ├── TemplateMixin.java │ ├── RecipeManagerMixin.java │ ├── JigsawPatternMixin.java │ ├── CommandsMixin.java │ ├── FlatGenerationSettingsMixin.java │ ├── TemplateStructurePieceMixin.java │ ├── LootTableManagerMixin.java │ ├── TagCollectionManagerMixin.java │ ├── JigsawManagerMixin.java │ ├── BiomeMixin.java │ ├── WorldEntitySpawnerMixin.java │ └── JigsawManagerAssemblerMixin.java │ ├── utils │ ├── GeneralUtils.java │ ├── ErrorHints.java │ └── PrettyPrintBrokenJSON.java │ ├── main │ ├── BiomeSourceBlame.java │ ├── MissingTemplatePoolBlame.java │ ├── TemplateStructurePieceBlame.java │ ├── JigsawStartPoolBlame.java │ ├── JigsawPatternBlame.java │ ├── FlatGenerationSettingsBlame.java │ ├── StructurePieceBlame.java │ ├── MissingNBTBlame.java │ ├── ProcessorBlame.java │ ├── MissingLoottableBlame.java │ ├── StructureFeatureBlame.java │ ├── WorldEntitySpawnerBlame.java │ ├── BiomeBlame.java │ ├── WorldSettingsImportBlame.java │ ├── BrokenCommandBlame.java │ └── DispenserBlockRegistry.java │ ├── BlameConfig.java │ └── Blame.java ├── publish.bat ├── .gitattributes ├── gradle ├── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── processresources.gradle ├── manifest.gradle ├── curseforge.gradle ├── modrinth.gradle └── maven.gradle ├── broken_datapacks_for_testing ├── broken_feature │ ├── pack.mcmeta │ └── data │ │ └── minecraft │ │ └── worldgen │ │ └── configured_feature │ │ └── ore_iron.json ├── broken_processor │ ├── pack.mcmeta │ └── data │ │ └── minecraft │ │ └── worldgen │ │ └── processor_list │ │ └── basalt_temple_randomizer.json ├── missing_loottable │ ├── pack.mcmeta │ └── data │ │ └── minecraft │ │ ├── structures │ │ └── village │ │ │ └── plains │ │ │ └── town_centers │ │ │ └── plains_fountain_01.nbt │ │ └── worldgen │ │ └── template_pool │ │ └── village │ │ ├── desert │ │ └── town_centers.json │ │ ├── plains │ │ └── town_centers.json │ │ ├── savanna │ │ └── town_centers.json │ │ ├── snowy │ │ └── town_centers.json │ │ └── taiga │ │ └── town_centers.json ├── broken_template_pool │ ├── pack.mcmeta │ └── data │ │ └── minecraft │ │ └── worldgen │ │ └── template_pool │ │ └── fake_structure │ │ └── fake_pool.json ├── extreme_template_pool │ ├── pack.mcmeta │ └── data │ │ └── minecraft │ │ └── worldgen │ │ └── template_pool │ │ └── fake_structure │ │ └── fake_pool.json ├── mega_broken_feature │ ├── pack.mcmeta │ └── data │ │ └── minecraft │ │ └── worldgen │ │ └── configured_feature │ │ └── ore_iron_super_bad.json ├── broken_processor_blockstate │ ├── pack.mcmeta │ └── data │ │ └── minecraft │ │ └── worldgen │ │ └── processor_list │ │ └── mossify_20_percent.json ├── broken_template_pool_nbt │ ├── pack.mcmeta │ └── data │ │ └── minecraft │ │ └── worldgen │ │ └── template_pool │ │ └── village │ │ ├── desert │ │ └── houses.json │ │ └── plains │ │ └── town_centers.json ├── broken_configured_feature_prop │ ├── pack.mcmeta │ └── data │ │ └── minecraft │ │ └── worldgen │ │ └── configured_feature │ │ └── ore_grass_block.json └── broken_feature_spread │ ├── pack.mcmeta │ └── data │ └── minecraft2 │ └── worldgen │ └── configured_feature │ ├── glowstone_extra.json │ ├── sea_pickle.json │ ├── patch_fire.json │ └── basalt_blobs.json ├── gradle.properties ├── .gitignore ├── .github └── FUNDING.yml ├── gradlew.bat ├── README.md ├── gradlew ├── LICENSE └── CHANGELOG.md /logs/debug.log: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /logs/latest.log: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/generated/resources/.cache/cache: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /publish.bat: -------------------------------------------------------------------------------- 1 | gradlew publish 2 | gradlew curseforge 3 | gradlew publishModrinth -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelepathicGrunt/Blame/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/main/resources/blame_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelepathicGrunt/Blame/HEAD/src/main/resources/blame_icon.png -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_feature/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 5, 4 | "description": "testdatapack" 5 | } 6 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_processor/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 5, 4 | "description": "testdatapack" 5 | } 6 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/missing_loottable/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 5, 4 | "description": "testdatapack" 5 | } 6 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_template_pool/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 5, 4 | "description": "testdatapack" 5 | } 6 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/extreme_template_pool/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 5, 4 | "description": "testdatapack" 5 | } 6 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/mega_broken_feature/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 5, 4 | "description": "testdatapack" 5 | } 6 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_processor_blockstate/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 5, 4 | "description": "testdatapack" 5 | } 6 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_template_pool_nbt/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 5, 4 | "description": "testdatapack" 5 | } 6 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_configured_feature_prop/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 5, 4 | "description": "testdatapack" 5 | } 6 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_feature_spread/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 6, 4 | "description": "broken_feature_spread" 5 | } 6 | } -------------------------------------------------------------------------------- /src/main/resources/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "description": "blame resources", 4 | "pack_format": 6, 5 | "_comment": "Blaming everyone lol" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /broken_datapacks_for_testing/missing_loottable/data/minecraft/structures/village/plains/town_centers/plains_fountain_01.nbt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TelepathicGrunt/Blame/HEAD/broken_datapacks_for_testing/missing_loottable/data/minecraft/structures/village/plains/town_centers/plains_fountain_01.nbt -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Sets default memory used for gradle commands. Can be overridden by user or command line properties. 2 | # This is required to provide enough me1ory for the Minecraft decompilation process. 3 | org.gradle.jvmargs=-Xmx3G 4 | org.gradle.daemon=false 5 | mod_version=3.7.0 6 | modid=blame 7 | mc_version=1.16.5 8 | forge_version=36.1.18 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # eclipse 2 | bin 3 | *.launch 4 | .settings 5 | .metadata 6 | .classpath 7 | .project 8 | 9 | # idea 10 | out 11 | *.ipr 12 | *.iws 13 | *.iml 14 | .idea 15 | 16 | # gradle 17 | build 18 | .gradle 19 | 20 | # other 21 | eclipse 22 | run 23 | .gitattributes 24 | /deps 25 | classes 26 | 27 | # Files from Forge MDK 28 | testdatapack 29 | deps 30 | -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_feature_spread/data/minecraft2/worldgen/configured_feature/glowstone_extra.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "feature": { 4 | "config": {}, 5 | "type": "minecraft:glowstone_blob" 6 | }, 7 | "decorator": { 8 | "config": { 9 | "count": 1000 10 | }, 11 | "type": "minecraft:glowstone" 12 | } 13 | }, 14 | "type": "minecraft:decorated" 15 | } -------------------------------------------------------------------------------- /src/main/java/com/telepathicgrunt/blame/mixin/BiomeProviderAccessor.java: -------------------------------------------------------------------------------- 1 | package com.telepathicgrunt.blame.mixin; 2 | 3 | import com.mojang.serialization.Codec; 4 | import net.minecraft.world.biome.provider.BiomeProvider; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Invoker; 7 | 8 | @Mixin(BiomeProvider.class) 9 | public interface BiomeProviderAccessor { 10 | @Invoker("codec") 11 | Codec blame_callCodec(); 12 | } 13 | -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_template_pool/data/minecraft/worldgen/template_pool/fake_structure/fake_pool.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minecraft:village/plains/town_centers", 3 | "fallback": "minecraft:empty", 4 | "elements": [ 5 | { 6 | "weight": 50, 7 | "element": { 8 | "location": "minecraft:village/plains/town_centers/plains_fountain_01", 9 | "processors": "minecraft:mossify_20_percent", 10 | "projection": "rigid", 11 | "element_type": "minecraft:lega" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_template_pool_nbt/data/minecraft/worldgen/template_pool/village/desert/houses.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minecraft:village/desert/houses", 3 | "fallback": "minecraft:village/desert/terminators", 4 | "elements": [ 5 | { 6 | "weight": 2, 7 | "element": { 8 | "location": "minecraft:village/desert/houses/missing_house_nbt", 9 | "processors": "minecraft:empty", 10 | "projection": "rigid", 11 | "element_type": "minecraft:legacy_single_pool_element" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_template_pool_nbt/data/minecraft/worldgen/template_pool/village/plains/town_centers.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minecraft:village/plains/town_centers", 3 | "fallback": "minecraft:empty", 4 | "elements": [ 5 | { 6 | "weight": 2, 7 | "element": { 8 | "location": "minecraft:village/plains/houses/missing_house_nbt", 9 | "processors": "minecraft:mossify_10_percent", 10 | "projection": "rigid", 11 | "element_type": "minecraft:legacy_single_pool_element" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/missing_loottable/data/minecraft/worldgen/template_pool/village/desert/town_centers.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minecraft:village/desert/town_centers", 3 | "fallback": "minecraft:empty", 4 | "elements": [ 5 | { 6 | "weight": 1, 7 | "element": { 8 | "location": "minecraft:village/plains/town_centers/plains_fountain_01", 9 | "processors": "minecraft:mossify_20_percent", 10 | "projection": "rigid", 11 | "element_type": "minecraft:legacy_single_pool_element" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/missing_loottable/data/minecraft/worldgen/template_pool/village/plains/town_centers.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minecraft:village/plains/town_centers", 3 | "fallback": "minecraft:empty", 4 | "elements": [ 5 | { 6 | "weight": 1, 7 | "element": { 8 | "location": "minecraft:village/plains/town_centers/plains_fountain_01", 9 | "processors": "minecraft:mossify_20_percent", 10 | "projection": "rigid", 11 | "element_type": "minecraft:legacy_single_pool_element" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/missing_loottable/data/minecraft/worldgen/template_pool/village/savanna/town_centers.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minecraft:village/savanna/town_centers", 3 | "fallback": "minecraft:empty", 4 | "elements": [ 5 | { 6 | "weight": 1, 7 | "element": { 8 | "location": "minecraft:village/plains/town_centers/plains_fountain_01", 9 | "processors": "minecraft:mossify_20_percent", 10 | "projection": "rigid", 11 | "element_type": "minecraft:legacy_single_pool_element" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/missing_loottable/data/minecraft/worldgen/template_pool/village/snowy/town_centers.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minecraft:village/snowy/town_centers", 3 | "fallback": "minecraft:empty", 4 | "elements": [ 5 | { 6 | "weight": 1, 7 | "element": { 8 | "location": "minecraft:village/plains/town_centers/plains_fountain_01", 9 | "processors": "minecraft:mossify_20_percent", 10 | "projection": "rigid", 11 | "element_type": "minecraft:legacy_single_pool_element" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/missing_loottable/data/minecraft/worldgen/template_pool/village/taiga/town_centers.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minecraft:village/taiga/town_centers", 3 | "fallback": "minecraft:empty", 4 | "elements": [ 5 | { 6 | "weight": 1, 7 | "element": { 8 | "location": "minecraft:village/plains/town_centers/plains_fountain_01", 9 | "processors": "minecraft:mossify_20_percent", 10 | "projection": "rigid", 11 | "element_type": "minecraft:legacy_single_pool_element" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /broken_datapacks_for_testing/extreme_template_pool/data/minecraft/worldgen/template_pool/fake_structure/fake_pool.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minecraft:village/plains/town_centers", 3 | "fallback": "minecraft:empty", 4 | "elements": [ 5 | { 6 | "weight": 2000000000, 7 | "element": { 8 | "location": "minecraft:village/plains/town_centers/plains_fountain_01", 9 | "processors": "minecraft:mossify_20_percent", 10 | "projection": "rigid", 11 | "element_type": "minecraft:legacy_single_pool_element" 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /src/main/java/com/telepathicgrunt/blame/mixin/MinecraftServerAccessor.java: -------------------------------------------------------------------------------- 1 | package com.telepathicgrunt.blame.mixin; 2 | 3 | import net.minecraft.server.MinecraftServer; 4 | import net.minecraft.world.gen.feature.template.TemplateManager; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | /* @author - TelepathicGrunt 9 | * 10 | */ 11 | @Mixin(MinecraftServer.class) 12 | public interface MinecraftServerAccessor { 13 | 14 | @Accessor("structureManager") 15 | TemplateManager blame_getStructureManager(); 16 | } 17 | -------------------------------------------------------------------------------- /gradle/processresources.gradle: -------------------------------------------------------------------------------- 1 | processResources { 2 | // This will ensure that this task is redone when the versions change. 3 | inputs.property 'version', project.version 4 | 5 | // Replace stuff in mods.toml, nothing else 6 | from(sourceSets.main.resources.srcDirs) { 7 | include 'META-INF/mods.toml' 8 | 9 | // Replace version 10 | expand 'version': project.version 11 | } 12 | 13 | // Copy everything else except the mods.toml 14 | from(sourceSets.main.resources.srcDirs) { 15 | exclude 'META-INF/mods.toml' 16 | } 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/telepathicgrunt/blame/mixin/StructureAccessor.java: -------------------------------------------------------------------------------- 1 | package com.telepathicgrunt.blame.mixin; 2 | 3 | import net.minecraft.world.gen.GenerationStage; 4 | import net.minecraft.world.gen.feature.structure.Structure; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | import java.util.Map; 9 | 10 | @Mixin(Structure.class) 11 | public interface StructureAccessor { 12 | @Accessor("STEP") 13 | static Map, GenerationStage.Decoration> blame_getSTEP() { 14 | throw new UnsupportedOperationException(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /gradle/manifest.gradle: -------------------------------------------------------------------------------- 1 | jar { 2 | manifest { 3 | attributes([ 4 | "Specification-Title": "${modid}", 5 | "Specification-Vendor": "TelepathicGrunt", 6 | "Specification-Version": "1", // We are version 1 of ourselves 7 | "Implementation-Title": project.name, 8 | "Implementation-Version": "${mod_version}", 9 | "Implementation-Vendor" :"TelepathicGrunt", 10 | "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), 11 | "MixinConfigs": "${modid}.mixins.json" 12 | ]) 13 | } 14 | } -------------------------------------------------------------------------------- /gradle/curseforge.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.matthewprenger.cursegradle" 2 | 3 | curseforge { 4 | project { 5 | apiKey = "$System.env.CURSEFORGEKEY" 6 | id = "406201" 7 | releaseType = "release" 8 | changelogType = 'markdown' 9 | changelog = file('CHANGELOG.md') 10 | addGameVersion("1.16.2") 11 | addGameVersion("1.16.3") 12 | addGameVersion("1.16.4") 13 | addGameVersion("1.16.5") 14 | addGameVersion("Forge") 15 | 16 | mainArtifact(jar) { 17 | displayName = "Blame v${project.mod_version} (${project.mc_version} MC)" 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/com/telepathicgrunt/blame/utils/GeneralUtils.java: -------------------------------------------------------------------------------- 1 | package com.telepathicgrunt.blame.utils; 2 | 3 | import java.util.Map; 4 | import java.util.stream.Stream; 5 | 6 | public class GeneralUtils { 7 | 8 | /** 9 | * Reverse the lookup of a map by finding all keys for a value 10 | * Source: https://www.baeldung.com/java-map-key-from-value 11 | */ 12 | public static Stream getKeysForMapValue(Map map, V value) { 13 | return map 14 | .entrySet() 15 | .stream() 16 | .filter(entry -> value.equals(entry.getValue())) 17 | .map(Map.Entry::getKey); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/mods.toml: -------------------------------------------------------------------------------- 1 | modLoader="javafml" #mandatory 2 | loaderVersion="[28,)" #mandatory (28 is current forge version) 3 | issueTrackerURL="https://github.com/TelepathicGrunt/Blame/issues" #optional 4 | license="GNU Lesser General Public License v3.0" 5 | 6 | [[mods]] #mandatory 7 | modId="blame" #mandatory 8 | version="${version}" #mandatory 9 | displayName="Blame!" #mandatory 10 | logoFile="blame_icon.png" #optional 11 | authors="TelepathicGrunt" #optional 12 | description=''' 13 | Crashing due to a feature or structure from a mod? Don't worry! 14 | This mod will find exactly which feature/structure and biome the crash is occurring from! 15 | 16 | TIME TO PLACE SOME BLAME!!! 17 | ''' -------------------------------------------------------------------------------- /src/main/java/com/telepathicgrunt/blame/mixin/TemplateManagerAccessor.java: -------------------------------------------------------------------------------- 1 | package com.telepathicgrunt.blame.mixin; 2 | 3 | import net.minecraft.util.ResourceLocation; 4 | import net.minecraft.world.gen.feature.template.Template; 5 | import net.minecraft.world.gen.feature.template.TemplateManager; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.gen.Accessor; 8 | 9 | import java.util.Map; 10 | 11 | /* @author - TelepathicGrunt 12 | * 13 | * LGPLv3 14 | */ 15 | @Mixin(TemplateManager.class) 16 | public interface TemplateManagerAccessor { 17 | 18 | @Accessor("structureRepository") 19 | Map blame_getStructureRepository(); 20 | } 21 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: telepathicgrunt 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /gradle/modrinth.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | maven { url "https://plugins.gradle.org/m2/" } 4 | } 5 | dependencies { 6 | classpath group: 'gradle.plugin.com.modrinth.minotaur', name: 'Minotaur', version: '1.2.1' 7 | } 8 | } 9 | 10 | apply plugin: "com.modrinth.minotaur" 11 | 12 | import com.modrinth.minotaur.TaskModrinthUpload 13 | 14 | String fileContents = new File("./", "CHANGELOG.md").text 15 | 16 | // Make sure it runs after build! 17 | task publishModrinth (type: TaskModrinthUpload){ 18 | token = "$System.env.MODRINTH" 19 | projectId = 'kMcXd3F5' 20 | versionName = "Blame" 21 | versionNumber = project.version 22 | uploadFile = jar 23 | changelog = fileContents 24 | addGameVersion('1.16.2') 25 | addGameVersion('1.16.3') 26 | addGameVersion('1.16.4') 27 | addGameVersion('1.16.5') 28 | addLoader('forge') 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/telepathicgrunt/blame/mixin/ForgeRegistriesMixin.java: -------------------------------------------------------------------------------- 1 | package com.telepathicgrunt.blame.mixin; 2 | 3 | import com.telepathicgrunt.blame.Blame; 4 | import net.minecraftforge.registries.ForgeRegistries; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Inject; 8 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 9 | 10 | /* @author - TelepathicGrunt 11 | * 12 | * Find who is calling createOptional too early and breaking Forge 13 | * 14 | * LGPLv3 15 | */ 16 | @Mixin(value = ForgeRegistries.class, remap = false) 17 | public class ForgeRegistriesMixin { 18 | 19 | @Inject(method = "init()V", remap = false, 20 | at = @At(value = "RETURN")) 21 | private static void blame_forgeInitTags(CallbackInfo ci) { 22 | Blame.MAIN_TAG_INIT = true; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/telepathicgrunt/blame/mixin/DispenserBlockAccessor.java: -------------------------------------------------------------------------------- 1 | package com.telepathicgrunt.blame.mixin; 2 | 3 | import net.minecraft.block.DispenserBlock; 4 | import net.minecraft.dispenser.IDispenseItemBehavior; 5 | import net.minecraft.item.Item; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.gen.Accessor; 8 | 9 | import java.util.Map; 10 | 11 | /* @author - TelepathicGrunt 12 | * 13 | * LGPLv3 14 | */ 15 | @Mixin(DispenserBlock.class) 16 | public interface DispenserBlockAccessor { 17 | 18 | @Accessor("DISPENSER_REGISTRY") 19 | static void blame_setDISPENSER_REGISTRY(Map map) { 20 | throw new UnsupportedOperationException(); 21 | } 22 | 23 | @Accessor("DISPENSER_REGISTRY") 24 | static Map blame_getDISPENSER_REGISTRY() { 25 | throw new UnsupportedOperationException(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /broken_datapacks_for_testing/broken_feature_spread/data/minecraft2/worldgen/configured_feature/sea_pickle.json: -------------------------------------------------------------------------------- 1 | { 2 | "config": { 3 | "feature": { 4 | "config": { 5 | "feature": { 6 | "config": { 7 | "count": 520 8 | }, 9 | "type": "minecraft:sea_pickle" 10 | }, 11 | "decorator": { 12 | "config": { 13 | "outer": { 14 | "config": {}, 15 | "type": "minecraft:square" 16 | }, 17 | "inner": { 18 | "config": {}, 19 | "type": "minecraft:top_solid_heightmap" 20 | } 21 | }, 22 | "type": "minecraft:decorated" 23 | } 24 | }, 25 | "type": "minecraft:decorated" 26 | }, 27 | "decorator": { 28 | "config": { 29 | "chance": 1456 30 | }, 31 | "type": "minecraft:chance" 32 | } 33 | }, 34 | "type": "minecraft:decorated" 35 | } -------------------------------------------------------------------------------- /src/main/java/com/telepathicgrunt/blame/mixin/SingleJigsawPieceAccessor.java: -------------------------------------------------------------------------------- 1 | package com.telepathicgrunt.blame.mixin; 2 | 3 | import com.mojang.datafixers.util.Either; 4 | import net.minecraft.util.ResourceLocation; 5 | import net.minecraft.world.gen.feature.jigsaw.SingleJigsawPiece; 6 | import net.minecraft.world.gen.feature.template.StructureProcessorList; 7 | import net.minecraft.world.gen.feature.template.Template; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.gen.Accessor; 10 | 11 | import java.util.function.Supplier; 12 | 13 | /* @author - TelepathicGrunt 14 | * 15 | * Make it so TemplateManager actually states what nbt file was unable to be found. 16 | * 17 | * LGPLv3 18 | */ 19 | @Mixin(SingleJigsawPiece.class) 20 | public interface SingleJigsawPieceAccessor { 21 | 22 | @Accessor("template") 23 | Either blame_getTemplateRL(); 24 | 25 | @Accessor("processors") 26 | Supplier blame_getProcessors(); 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/telepathicgrunt/blame/mixin/TemplateManagerMixin.java: -------------------------------------------------------------------------------- 1 | package com.telepathicgrunt.blame.mixin; 2 | 3 | import com.telepathicgrunt.blame.main.MissingNBTBlame; 4 | import net.minecraft.util.ResourceLocation; 5 | import net.minecraft.world.gen.feature.template.Template; 6 | import net.minecraft.world.gen.feature.template.TemplateManager; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 11 | 12 | /* @author - TelepathicGrunt 13 | * 14 | * Make it so TemplateManager actually states what nbt file was unable to be found. 15 | * 16 | * LGPLv3 17 | */ 18 | @Mixin(TemplateManager.class) 19 | public class TemplateManagerMixin { 20 | 21 | @Inject(method = "loadFromResource(Lnet/minecraft/util/ResourceLocation;)Lnet/minecraft/world/gen/feature/template/Template;", 22 | at = @At(value = "RETURN")) 23 | private void blame_addMissingnbtDetails(ResourceLocation miniRL, CallbackInfoReturnable