From 5bea5cde996e1f702db30114ae40bdb9a87e92d5 Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Fri, 5 May 2017 10:57:34 +0200 Subject: [PATCH 1/7] error reporting for unexpected registry misses --- .../mods/betterfoliage/client/Client.kt | 23 +++++++++++++++++++ .../client/render/AbstractRenderColumn.kt | 7 +++++- .../client/render/RenderGrass.kt | 7 +++++- .../client/render/RenderLeaves.kt | 8 ++++++- .../mods/octarinecore/client/gui/Utils.kt | 11 ++++++++- .../assets/betterfoliage/lang/en_US.lang | 4 +++- 6 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/mods/betterfoliage/client/Client.kt b/src/main/kotlin/mods/betterfoliage/client/Client.kt index 8510e74..61e95af 100644 --- a/src/main/kotlin/mods/betterfoliage/client/Client.kt +++ b/src/main/kotlin/mods/betterfoliage/client/Client.kt @@ -6,9 +6,16 @@ import mods.betterfoliage.client.integration.* import mods.betterfoliage.client.render.* import mods.betterfoliage.client.texture.* import mods.octarinecore.client.KeyHandler +import mods.octarinecore.client.gui.textComponent import mods.octarinecore.client.resource.CenteringTextureGenerator import mods.octarinecore.client.resource.GeneratorPack +import net.minecraft.block.Block +import net.minecraft.block.state.IBlockState import net.minecraft.client.Minecraft +import net.minecraft.util.math.BlockPos +import net.minecraft.util.text.TextComponentString +import net.minecraft.util.text.TextComponentTranslation +import net.minecraft.util.text.TextFormatting import net.minecraftforge.fml.client.FMLClientHandler import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly @@ -71,6 +78,8 @@ object Client { StandardLogSupport // add _after_ all other log registries ) + val suppressRenderErrors = mutableSetOf() + fun log(level: Level, msg: String) { BetterFoliageMod.log.log(level, "[BetterFoliage] $msg") BetterFoliageMod.logDetail.log(level, msg) @@ -79,5 +88,19 @@ object Client { fun logDetail(msg: String) { BetterFoliageMod.logDetail.log(Level.DEBUG, msg) } + + fun logRenderError(state: IBlockState, location: BlockPos) { + if (state in suppressRenderErrors) return + suppressRenderErrors.add(state) + + val blockName = Block.REGISTRY.getNameForObject(state.block).toString() + val blockLoc = "${location.x},${location.y},${location.z}" + Minecraft.getMinecraft().thePlayer.addChatMessage(TextComponentTranslation( + "betterfoliage.rendererror", + textComponent(blockName, TextFormatting.GOLD), + textComponent(blockLoc, TextFormatting.GOLD) + )) + logDetail("Error rendering block $state at $blockLoc") + } } diff --git a/src/main/kotlin/mods/betterfoliage/client/render/AbstractRenderColumn.kt b/src/main/kotlin/mods/betterfoliage/client/render/AbstractRenderColumn.kt index aac2086..0ea7e7a 100644 --- a/src/main/kotlin/mods/betterfoliage/client/render/AbstractRenderColumn.kt +++ b/src/main/kotlin/mods/betterfoliage/client/render/AbstractRenderColumn.kt @@ -1,5 +1,6 @@ package mods.betterfoliage.client.render +import mods.betterfoliage.client.Client import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.integration.OptifineCTM import mods.betterfoliage.client.integration.ShadersModIntegration @@ -140,7 +141,11 @@ abstract class AbstractRenderColumn(modId: String) : AbstractBlockRenderingHandl override fun render(ctx: BlockContext, dispatcher: BlockRendererDispatcher, renderer: VertexBuffer, layer: BlockRenderLayer): Boolean { if (ctx.isSurroundedBy(surroundPredicate) ) return false - val columnTextures = registry[ctx.blockState(Int3.zero)] ?: return false + val columnTextures = registry[ctx.blockState(Int3.zero)] + if (columnTextures == null) { + Client.logRenderError(ctx.blockState(Int3.zero), ctx.pos) + return renderWorldBlockBase(ctx, dispatcher, renderer, null) + } // get AO data modelRenderer.updateShading(Int3.zero, allFaces) diff --git a/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt b/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt index 887d491..3909c9d 100644 --- a/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt +++ b/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt @@ -57,7 +57,12 @@ class RenderGrass : AbstractBlockRenderingHandler(BetterFoliageMod.MOD_ID) { val isSnowed = ctx.blockState(up1).isSnow val connectedGrass = isConnected && Config.connectedGrass.enabled && (!isSnowed || Config.connectedGrass.snowEnabled) - val grassInfo = GrassRegistry[ctx, UP]!! + val grassInfo = GrassRegistry[ctx, UP] + if (grassInfo == null) { + // shouldn't happen + Client.logRenderError(ctx.blockState(Int3.zero), ctx.pos) + return renderWorldBlockBase(ctx, dispatcher, renderer, null) + } val blockColor = ctx.blockData(Int3.zero).color if (connectedGrass) { diff --git a/src/main/kotlin/mods/betterfoliage/client/render/RenderLeaves.kt b/src/main/kotlin/mods/betterfoliage/client/render/RenderLeaves.kt index 5fe8baf..a10da6b 100644 --- a/src/main/kotlin/mods/betterfoliage/client/render/RenderLeaves.kt +++ b/src/main/kotlin/mods/betterfoliage/client/render/RenderLeaves.kt @@ -1,6 +1,7 @@ package mods.betterfoliage.client.render import mods.betterfoliage.BetterFoliageMod +import mods.betterfoliage.client.Client import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.integration.ShadersModIntegration import mods.betterfoliage.client.texture.LeafRegistry @@ -50,7 +51,12 @@ class RenderLeaves : AbstractBlockRenderingHandler(BetterFoliageMod.MOD_ID) { val isSnowed = ctx.blockState(up1).material.let { it == Material.SNOW || it == Material.CRAFTED_SNOW } - val leafInfo = LeafRegistry[ctx, DOWN] ?: return false + val leafInfo = LeafRegistry[ctx, DOWN] + if (leafInfo == null) { + // shouldn't happen + Client.logRenderError(ctx.blockState(Int3.zero), ctx.pos) + return renderWorldBlockBase(ctx, dispatcher, renderer, null) + } val blockColor = ctx.blockData(Int3.zero).color renderWorldBlockBase(ctx, dispatcher, renderer, null) diff --git a/src/main/kotlin/mods/octarinecore/client/gui/Utils.kt b/src/main/kotlin/mods/octarinecore/client/gui/Utils.kt index c823738..b001332 100644 --- a/src/main/kotlin/mods/octarinecore/client/gui/Utils.kt +++ b/src/main/kotlin/mods/octarinecore/client/gui/Utils.kt @@ -1,7 +1,11 @@ @file:JvmName("Utils") package mods.octarinecore.client.gui -import net.minecraft.util.text.TextFormatting.* +import net.minecraft.util.text.Style +import net.minecraft.util.text.TextComponentString +import net.minecraft.util.text.TextFormatting +import net.minecraft.util.text.TextFormatting.AQUA +import net.minecraft.util.text.TextFormatting.GRAY fun stripTooltipDefaultText(tooltip: MutableList) { var defaultRows = false @@ -10,4 +14,9 @@ fun stripTooltipDefaultText(tooltip: MutableList) { if (iter.next().startsWith(AQUA.toString())) defaultRows = true if (defaultRows) iter.remove() } +} + +fun textComponent(msg: String, color: TextFormatting = GRAY): TextComponentString { + val style = Style().apply { this.color = color } + return TextComponentString(msg).apply { this.style = style } } \ No newline at end of file diff --git a/src/main/resources/assets/betterfoliage/lang/en_US.lang b/src/main/resources/assets/betterfoliage/lang/en_US.lang index cbbded9..580050b 100644 --- a/src/main/resources/assets/betterfoliage/lang/en_US.lang +++ b/src/main/resources/assets/betterfoliage/lang/en_US.lang @@ -20,7 +20,9 @@ betterfoliage.population.tooltip=Chance (N in 64) that an eligible block will ha betterfoliage.shaderWind=Shader wind effects betterfoliage.shaderWind.tooltip=Apply wind effects from ShaderMod shaders to this element? betterfoliage.distance=Distance limit -betterfoliage.distance.tooltip=Maximum distance from player at which to render this feature +betterfoliage.distance.tooltip=Maximum distance from player at which to render this feature + +betterfoliage.rendererror=§a[BetterFoliage]§f Error rendering block %s at position %s betterfoliage.blocks=Block Types betterfoliage.blocks.tooltip=Configure lists of block classes that will have specific features applied to them From 6d62cb9ac047f9ef1d783d319e6c0ba0df80ffc6 Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Fri, 5 May 2017 10:58:48 +0200 Subject: [PATCH 2/7] dev-only debug code for ASM transformer incompatibilities --- .../mods/octarinecore/metaprog/Transformation.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/kotlin/mods/octarinecore/metaprog/Transformation.kt b/src/main/kotlin/mods/octarinecore/metaprog/Transformation.kt index 3fdf620..e67fc81 100644 --- a/src/main/kotlin/mods/octarinecore/metaprog/Transformation.kt +++ b/src/main/kotlin/mods/octarinecore/metaprog/Transformation.kt @@ -8,6 +8,8 @@ import org.objectweb.asm.ClassReader import org.objectweb.asm.ClassWriter import org.objectweb.asm.Opcodes import org.objectweb.asm.tree.* +import java.io.File +import java.io.FileOutputStream @IFMLLoadingPlugin.TransformerExclusions( "mods.octarinecore.metaprog", @@ -55,6 +57,15 @@ open class Transformer : IClassTransformer { MCP -> log.info("Found method ${targetMethod.parentClass.name}.${targetMethod.name(MCP)} ${targetMethod.asmDescriptor(MCP)}") SRG -> log.info("Found method ${targetMethod.parentClass.name}.${targetMethod.name(namespace)} ${targetMethod.asmDescriptor(namespace)} (matching ${targetMethod.name(MCP)})") } + + // write input bytecode for debugging - definitely not in production... + //File("BF_debug").mkdir() + //FileOutputStream(File("BF_debug/$transformedName.class")).apply { + // write(classData) + // close() + //} + + // transform MethodTransformContext(method, namespace).transform() workDone = true } From 568549e260d62244874fa67d3bf1afaba6778726 Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Fri, 5 May 2017 11:15:55 +0200 Subject: [PATCH 3/7] added population option to short grass as well (for non-full coverage) --- src/main/kotlin/mods/betterfoliage/client/config/Config.kt | 1 + .../kotlin/mods/betterfoliage/client/render/RenderGrass.kt | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/main/kotlin/mods/betterfoliage/client/config/Config.kt b/src/main/kotlin/mods/betterfoliage/client/config/Config.kt index 47ae564..4abf14f 100644 --- a/src/main/kotlin/mods/betterfoliage/client/config/Config.kt +++ b/src/main/kotlin/mods/betterfoliage/client/config/Config.kt @@ -71,6 +71,7 @@ object Config : DelegatingConfig(BetterFoliageMod.MOD_ID, BetterFoliageMod.DOMAI val heightMin by double(min=0.1, max=2.5, default=0.6).lang("heightMin") val heightMax by double(min=0.1, max=2.5, default=0.8).lang("heightMax") val size by double(min=0.5, max=1.5, default=1.0).lang("size") + val population by int(max=64, default=64).lang("population") val useGenerated by boolean(false) val shaderWind by boolean(true).lang("shaderWind") val saturationThreshold by double(default=0.1) diff --git a/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt b/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt index 3909c9d..7d5a8cc 100644 --- a/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt +++ b/src/main/kotlin/mods/betterfoliage/client/render/RenderGrass.kt @@ -31,6 +31,8 @@ class RenderGrass : AbstractBlockRenderingHandler(BetterFoliageMod.MOD_ID) { } } + val noise = simplexNoise() + val normalIcons = iconSet(BetterFoliageMod.LEGACY_DOMAIN, "blocks/better_grass_long_%d") val snowedIcons = iconSet(BetterFoliageMod.LEGACY_DOMAIN, "blocks/better_grass_snowed_%d") val normalGenIcon = iconStatic(Client.genGrass.generatedResource("minecraft:blocks/tallgrass", "snowed" to false)) @@ -97,6 +99,7 @@ class RenderGrass : AbstractBlockRenderingHandler(BetterFoliageMod.MOD_ID) { if (!Config.shortGrass.grassEnabled) return true if (isSnowed && !Config.shortGrass.snowEnabled) return true if (ctx.blockState(up1).isOpaqueCube) return true + if (Config.shortGrass.population < 64 && noise[ctx.pos] >= Config.shortGrass.population) return true // render grass quads val iconset = if (isSnowed) snowedIcons else normalIcons From 381b15441342cc5c938e97776eac1494eda3615f Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Fri, 5 May 2017 12:08:55 +0200 Subject: [PATCH 4/7] change short grass override color to work better with dark textures --- .../kotlin/mods/betterfoliage/client/texture/GrassRegistry.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/mods/betterfoliage/client/texture/GrassRegistry.kt b/src/main/kotlin/mods/betterfoliage/client/texture/GrassRegistry.kt index f716a57..509e809 100644 --- a/src/main/kotlin/mods/betterfoliage/client/texture/GrassRegistry.kt +++ b/src/main/kotlin/mods/betterfoliage/client/texture/GrassRegistry.kt @@ -23,6 +23,7 @@ import net.minecraftforge.common.MinecraftForge import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly import org.apache.logging.log4j.Level +import java.lang.Math.min const val defaultGrassColor = 0 @@ -96,8 +97,9 @@ object StandardGrassSupport : logger.log(Level.DEBUG, "$logName: texture ${texture.iconName}") val hsb = HSB.fromColor(texture.averageColor ?: defaultGrassColor) val overrideColor = if (hsb.saturation >= Config.shortGrass.saturationThreshold) { + logger.log(Level.DEBUG, "$logName: brightness ${hsb.brightness}") logger.log(Level.DEBUG, "$logName: saturation ${hsb.saturation} >= ${Config.shortGrass.saturationThreshold}, using texture color") - hsb.copy(brightness = 0.9f).asColor + hsb.copy(brightness = min(0.9f, hsb.brightness * 2.0f)).asColor } else { logger.log(Level.DEBUG, "$logName: saturation ${hsb.saturation} < ${Config.shortGrass.saturationThreshold}, using block color") null From 674d22fdbbf6d6531042042226e4eae4b55ad7e5 Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Fri, 5 May 2017 12:10:25 +0200 Subject: [PATCH 5/7] add AbyssalCraft grass blocks to default whitelist --- .../resources/assets/betterfoliage/GrassBlocksDefault.cfg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/assets/betterfoliage/GrassBlocksDefault.cfg b/src/main/resources/assets/betterfoliage/GrassBlocksDefault.cfg index e54e87a..bc144c2 100644 --- a/src/main/resources/assets/betterfoliage/GrassBlocksDefault.cfg +++ b/src/main/resources/assets/betterfoliage/GrassBlocksDefault.cfg @@ -12,3 +12,7 @@ enhancedbiomes.blocks.BlockGrassEB // TerraFirmaCraft com.bioxx.tfc.Blocks.Terrain.BlockGrass + +// AbyssalCraft +com.shinoow.abyssalcraft.common.blocks.BlockDreadGrass +com.shinoow.abyssalcraft.common.blocks.BlockDarklandsgrass From 81ef954524507c5633943816204f1ffdc6b0f581 Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Sat, 6 May 2017 09:36:32 +0200 Subject: [PATCH 6/7] add support for multipart models --- .../client/integration/RubberIntegration.kt | 3 ++- .../kotlin/mods/betterfoliage/loader/Refs.kt | 6 ++--- .../client/resource/ModelProcessor.kt | 27 ++++++++++--------- .../octarinecore/client/resource/Utils.kt | 16 +++++------ 4 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/main/kotlin/mods/betterfoliage/client/integration/RubberIntegration.kt b/src/main/kotlin/mods/betterfoliage/client/integration/RubberIntegration.kt index a663afb..2bb3c70 100644 --- a/src/main/kotlin/mods/betterfoliage/client/integration/RubberIntegration.kt +++ b/src/main/kotlin/mods/betterfoliage/client/integration/RubberIntegration.kt @@ -21,6 +21,7 @@ import mods.octarinecore.common.rotate import mods.octarinecore.metaprog.ClassRef import mods.octarinecore.metaprog.MethodRef import mods.octarinecore.metaprog.allAvailable +import mods.octarinecore.tryDefault import net.minecraft.block.properties.PropertyDirection import net.minecraft.block.state.IBlockState import net.minecraft.client.renderer.block.model.ModelResourceLocation @@ -133,7 +134,7 @@ object IC2LogSupport : RubberLogSupportBase() { override fun processModelLoad(state: IBlockState, modelLoc: ModelResourceLocation, model: IModel): RubberLogModelInfo? { // check for proper block class, existence of ModelBlock, and "state" blockstate property if (!IC2Integration.BlockRubWood.isInstance(state.block)) return null - val blockLoc = model.modelBlockAndLoc ?: return null + val blockLoc = model.modelBlockAndLoc.firstOrNull() ?: return null val type = state.properties.entries.find { it.key.getName() == "state" }?.value?.toString() ?: return null // logs with no rubber spot diff --git a/src/main/kotlin/mods/betterfoliage/loader/Refs.kt b/src/main/kotlin/mods/betterfoliage/loader/Refs.kt index ae9376e..a5de296 100644 --- a/src/main/kotlin/mods/betterfoliage/loader/Refs.kt +++ b/src/main/kotlin/mods/betterfoliage/loader/Refs.kt @@ -63,14 +63,12 @@ object Refs { val VanillaModelWrapper = ClassRef("net.minecraftforge.client.model.ModelLoader\$VanillaModelWrapper") val model_VMW = FieldRef(VanillaModelWrapper, "model", ModelBlock) val location_VMW = FieldRef(VanillaModelWrapper, "location", ModelBlock) -// val WeightedPartWrapper = ClassRef("net.minecraftforge.client.model.ModelLoader\$WeightedPartWrapper") -// val model_WPW = FieldRef(WeightedPartWrapper, "model", IModel) val WeightedRandomModel = ClassRef("net.minecraftforge.client.model.ModelLoader\$WeightedRandomModel") val models_WRM = FieldRef(WeightedRandomModel, "models", List) val MultiModel = ClassRef("net.minecraftforge.client.model.MultiModel") val base_MM = FieldRef(MultiModel, "base", IModel) - val WeightedBakedModel = ClassRef("net.minecraft.client.renderer.block.model.WeightedBakedModel") - val models_WBM = FieldRef(WeightedBakedModel, "models", List) + val MultipartModel = ClassRef("net.minecraftforge.client.model.ModelLoader\$MultipartModel") + val partModels_MPM = FieldRef(MultipartModel, "partModels", List) val resetChangedState = MethodRef(ClassRef("net.minecraftforge.common.config.Configuration"), "resetChangedState", ClassRef.void) diff --git a/src/main/kotlin/mods/octarinecore/client/resource/ModelProcessor.kt b/src/main/kotlin/mods/octarinecore/client/resource/ModelProcessor.kt index c575a8a..5527f09 100644 --- a/src/main/kotlin/mods/octarinecore/client/resource/ModelProcessor.kt +++ b/src/main/kotlin/mods/octarinecore/client/resource/ModelProcessor.kt @@ -75,23 +75,24 @@ interface TextureListModelProcessor : ModelProcessor, T2> { logger?.log(Level.DEBUG, "$logName: block state ${state.toString()}") logger?.log(Level.DEBUG, "$logName: class ${state.block.javaClass.name} matches ${matchClass.name}") - val blockLoc = model.modelBlockAndLoc - if (blockLoc == null) { + val allModels = model.modelBlockAndLoc + if (allModels.isEmpty()) { logger?.log(Level.DEBUG, "$logName: no models found") return null } - val modelMatch = modelTextures.firstOrNull { blockLoc.derivesFrom(it.modelLocation) } - if (modelMatch == null) { - logger?.log(Level.DEBUG, "$logName: no matching models found") - return null + allModels.forEach { blockLoc -> + modelTextures.firstOrNull { blockLoc.derivesFrom(it.modelLocation) }?.let{ modelMatch -> + logger?.log(Level.DEBUG, "$logName: model ${blockLoc.second} matches ${modelMatch.modelLocation.toString()}") + + val textures = modelMatch.textureNames.map { it to blockLoc.first.resolveTextureName(it) } + val texMapString = Joiner.on(", ").join(textures.map { "${it.first}=${it.second}" }) + logger?.log(Level.DEBUG, "$logName: textures [$texMapString]") + + return if (textures.all { it.second != "missingno" }) textures.map { it.second } else null + } } - logger?.log(Level.DEBUG, "$logName: model ${blockLoc.second} matches ${modelMatch.modelLocation.toString()}") - - val textures = modelMatch.textureNames.map { it to blockLoc.first.resolveTextureName(it) } - val texMapString = Joiner.on(", ").join(textures.map { "${it.first}=${it.second}" }) - logger?.log(Level.DEBUG, "$logName: textures [$texMapString]") - - return if (textures.all { it.second != "missingno" }) textures.map { it.second } else null + logger?.log(Level.DEBUG, "$logName: no matching models found") + return null } } diff --git a/src/main/kotlin/mods/octarinecore/client/resource/Utils.kt b/src/main/kotlin/mods/octarinecore/client/resource/Utils.kt index 56a9fac..499f43c 100644 --- a/src/main/kotlin/mods/octarinecore/client/resource/Utils.kt +++ b/src/main/kotlin/mods/octarinecore/client/resource/Utils.kt @@ -100,19 +100,19 @@ fun textureLocation(iconName: String) = ResourceLocation(iconName).let { } @Suppress("UNCHECKED_CAST") -val IModel.modelBlockAndLoc: Pair? get() { +val IModel.modelBlockAndLoc: List> get() { if (Refs.VanillaModelWrapper.isInstance(this)) - return Pair(Refs.model_VMW.get(this) as ModelBlock, Refs.location_VMW.get(this) as ResourceLocation) + return listOf(Pair(Refs.model_VMW.get(this) as ModelBlock, Refs.location_VMW.get(this) as ResourceLocation)) else if (Refs.WeightedRandomModel.isInstance(this)) Refs.models_WRM.get(this)?.let { - (it as List).forEach { - it.modelBlockAndLoc.let { if (it != null) return it } - } + return (it as List).flatMap(IModel::modelBlockAndLoc) } else if (Refs.MultiModel.isInstance(this)) Refs.base_MM.get(this)?.let { return (it as IModel).modelBlockAndLoc } - // TODO support net.minecraftforge.client.model.ModelLoader.MultipartModel - return null + else if (Refs.MultipartModel.isInstance(this)) Refs.partModels_MPM.get(this)?.let { + return (it as Map).flatMap { it.value.modelBlockAndLoc } + } + return listOf() } fun Pair.derivesFrom(targetLocation: ResourceLocation): Boolean { @@ -121,5 +121,3 @@ fun Pair.derivesFrom(targetLocation: ResourceLocat return Pair(first.parent, first.parentLocation!!).derivesFrom(targetLocation) return false } - -fun IModel.derivesFromModel(modelLoc: String) = modelBlockAndLoc?.derivesFrom(ResourceLocation(modelLoc)) ?: false From a9fba1a18ef68575139fad7fc0e63c8e3a615fd4 Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Sat, 6 May 2017 09:36:47 +0200 Subject: [PATCH 7/7] bump version to 2.1.5 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6147de6..0927c35 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ apply plugin: "net.minecraftforge.gradle.forge" apply plugin: 'kotlin' group = 'com.github.octarine-noise' -version = "2.1.4" +version = "2.1.5" archivesBaseName = rootProject.name + '-MC1.10.2' buildscript {