diff --git a/build.gradle.kts b/build.gradle.kts index a62bac2..8aa317f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ import net.fabricmc.loom.task.RemapJarTask import org.ajoberstar.grgit.Grgit plugins { - id("fabric-loom").version("0.2.6-SNAPSHOT") + id("fabric-loom").version("0.6-SNAPSHOT") kotlin("jvm").version("1.4.31") id("org.ajoberstar.grgit").version("3.1.1") } @@ -13,9 +13,10 @@ val semVer = "${project.version}+$gitHash" val jarName = "BetterFoliage-$semVer-Fabric-${properties["mcVersion"]}" repositories { - maven("http://maven.fabricmc.net/") + maven("https://maven.fabricmc.net/") maven("https://minecraft.curseforge.com/api/maven") - maven("http://maven.modmuss50.me/") + maven("https://maven.modmuss50.me/") + maven("https://maven.shedaniel.me/") maven("https://grondag-repo.appspot.com").credentials { username = "guest"; password = "" } maven("https://jitpack.io") } @@ -32,7 +33,7 @@ dependencies { // configuration handling "modImplementation"("io.github.prospector:modmenu:${properties["modMenuVersion"]}") listOf("modImplementation", "include").forEach { configuration -> - configuration("me.shedaniel.cloth:config-2:${properties["clothConfigVersion"]}") + configuration("me.shedaniel.cloth:cloth-config-fabric:${properties["clothConfigVersion"]}") configuration("me.zeroeightsix:fiber:${properties["fiberVersion"]}") } diff --git a/gradle.properties b/gradle.properties index 1acbe04..276ecb2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,16 +5,16 @@ group = com.github.octarine-noise name = betterfoliage jarName = BetterFoliage-Forge -version = 2.6.0 +version = 2.6.2 -mcVersion = 1.15.2 -yarnMappings=1.15.2+build.17 +mcVersion = 1.16.5 +yarnMappings=1.16.5+build.6 loaderVersion=0.11.3 -fabricVersion=0.28.5+1.15 +fabricVersion=0.32.5+1.16 kotlinVersion=1.3.60 fabricKotlinVersion=1.5.0+kotlin.1.4.31 -clothConfigVersion=2.14.2 -modMenuVersion=1.10.6 +clothConfigVersion=4.11.24 +modMenuVersion=1.16.9 fiberVersion=0.8.0-2 \ No newline at end of file diff --git a/src/main/java/mods/betterfoliage/mixin/MixinBlockState.java b/src/main/java/mods/betterfoliage/mixin/MixinBlockState.java index 8490581..f8f25ec 100644 --- a/src/main/java/mods/betterfoliage/mixin/MixinBlockState.java +++ b/src/main/java/mods/betterfoliage/mixin/MixinBlockState.java @@ -1,6 +1,7 @@ package mods.betterfoliage.mixin; import mods.betterfoliage.Hooks; +import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; @@ -14,10 +15,11 @@ import org.spongepowered.asm.mixin.injection.Redirect; * * Needed to avoid excessive darkening of Round Logs at the corners, now that they are not full blocks. */ -@Mixin(BlockState.class) -@SuppressWarnings({"UnnecessaryQualifiedMemberReference", "deprecation"}) +@Mixin(AbstractBlock.AbstractBlockState.class) +@SuppressWarnings({"deprecation"}) public class MixinBlockState { - private static final String callFrom = "Lnet/minecraft/block/BlockState;getAmbientOcclusionLightLevel(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;)F"; + private static final String callFrom = "Lnet/minecraft/block/AbstractBlock$AbstractBlockState;getAmbientOcclusionLightLevel(Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;)F"; + // why is the INVOKEVIRTUAL target class Block in the bytecode, not AbstractBlock? private static final String callTo = "Lnet/minecraft/block/Block;getAmbientOcclusionLightLevel(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;)F"; @Redirect(method = callFrom, at = @At(value = "INVOKE", target = callTo)) diff --git a/src/main/java/mods/betterfoliage/mixin/MixinClientChunkManager.java b/src/main/java/mods/betterfoliage/mixin/MixinClientChunkManager.java index 2b01e9a..db87c5d 100644 --- a/src/main/java/mods/betterfoliage/mixin/MixinClientChunkManager.java +++ b/src/main/java/mods/betterfoliage/mixin/MixinClientChunkManager.java @@ -3,10 +3,10 @@ package mods.betterfoliage.mixin; import mods.betterfoliage.ClientChunkLoadCallback; import net.minecraft.client.world.ClientChunkManager; import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.PacketByteBuf; -import net.minecraft.world.World; +import net.minecraft.network.PacketByteBuf; import net.minecraft.world.biome.source.BiomeArray; import net.minecraft.world.chunk.WorldChunk; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -15,10 +15,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ClientChunkManager.class) public class MixinClientChunkManager { - private static final String onLoadChunkFromPacket = "loadChunkFromPacket(IILnet/minecraft/world/biome/source/BiomeArray;Lnet/minecraft/util/PacketByteBuf;Lnet/minecraft/nbt/CompoundTag;I)Lnet/minecraft/world/chunk/WorldChunk;"; + private static final String onLoadChunkFromPacket = "Lnet/minecraft/client/world/ClientChunkManager;loadChunkFromPacket(IILnet/minecraft/world/biome/source/BiomeArray;Lnet/minecraft/network/PacketByteBuf;Lnet/minecraft/nbt/CompoundTag;IZ)Lnet/minecraft/world/chunk/WorldChunk;"; @Inject(method = onLoadChunkFromPacket, at = @At(value = "RETURN", ordinal = 2)) - void onLoadChunkFromPacket(int chunkX, int chunkZ, BiomeArray biomeArray, PacketByteBuf data, CompoundTag nbt, int updatedSectionsBits, CallbackInfoReturnable ci) { + void onLoadChunkFromPacket(int x, int z, @Nullable BiomeArray biomes, PacketByteBuf buf, CompoundTag tag, int verticalStripBitmask, boolean complete, CallbackInfoReturnable ci) { ClientChunkLoadCallback.EVENT.invoker().loadChunk(ci.getReturnValue()); } } diff --git a/src/main/java/mods/betterfoliage/mixin/MixinClientWorld.java b/src/main/java/mods/betterfoliage/mixin/MixinClientWorld.java index 4c7c022..d929376 100644 --- a/src/main/java/mods/betterfoliage/mixin/MixinClientWorld.java +++ b/src/main/java/mods/betterfoliage/mixin/MixinClientWorld.java @@ -8,6 +8,8 @@ import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.world.ClientWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.util.profiler.Profiler; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.World; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.level.LevelInfo; import org.spongepowered.asm.mixin.Mixin; @@ -16,12 +18,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; +import java.util.function.Supplier; @Mixin(ClientWorld.class) public class MixinClientWorld { - private static final String ctor = "(Lnet/minecraft/client/network/ClientPlayNetworkHandler;Lnet/minecraft/world/level/LevelInfo;Lnet/minecraft/world/dimension/DimensionType;ILnet/minecraft/util/profiler/Profiler;Lnet/minecraft/client/render/WorldRenderer;)V"; - private static final String checkBlockRender = "Lnet/minecraft/client/world/ClientWorld;checkBlockRerender(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/block/BlockState;)V"; + private static final String ctor = "Lnet/minecraft/client/world/ClientWorld;(Lnet/minecraft/client/network/ClientPlayNetworkHandler;Lnet/minecraft/client/world/ClientWorld$Properties;Lnet/minecraft/util/registry/RegistryKey;Lnet/minecraft/world/dimension/DimensionType;ILjava/util/function/Supplier;Lnet/minecraft/client/render/WorldRenderer;ZJ)V"; + private static final String scheduleBlockRerenderIfNeeded = "Lnet/minecraft/client/world/ClientWorld;scheduleBlockRerenderIfNeeded(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/block/BlockState;)V"; private static final String rendererNotify = "Lnet/minecraft/client/render/WorldRenderer;method_21596(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/block/BlockState;)V"; private static final String worldDisplayTick = "randomBlockDisplayTick(IIIILjava/util/Random;ZLnet/minecraft/util/math/BlockPos$Mutable;)V"; private static final String blockDisplayTick = "Lnet/minecraft/block/Block;randomDisplayTick(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Ljava/util/Random;)V"; @@ -30,13 +33,13 @@ public class MixinClientWorld { * Inject callback to get notified of client-side blockstate changes. * Used to invalidate caches in the {@link mods.betterfoliage.chunk.ChunkOverlayManager} */ - @Inject(method = checkBlockRender, at = @At(value = "HEAD")) + @Inject(method = scheduleBlockRerenderIfNeeded, at = @At(value = "HEAD")) void onClientBlockChanged(BlockPos pos, BlockState oldState, BlockState newState, CallbackInfo ci) { Hooks.onClientBlockChanged((ClientWorld) (Object) this, pos, oldState, newState); } @Inject(method = ctor, at = @At("RETURN")) - void onClientWorldCreated(ClientPlayNetworkHandler netHandler, LevelInfo levelInfo, DimensionType dimensionType, int i, Profiler profiler, WorldRenderer worldRenderer, CallbackInfo ci) { + void onClientWorldCreated(ClientPlayNetworkHandler networkHandler, ClientWorld.Properties properties, RegistryKey registryRef, DimensionType dimensionType, int loadDistance, Supplier profiler, WorldRenderer worldRenderer, boolean debugWorld, long seed, CallbackInfo ci) { ClientWorldLoadCallback.EVENT.invoker().loadWorld((ClientWorld) (Object) this); } diff --git a/src/main/kotlin/mods/betterfoliage/BetterFoliage.kt b/src/main/kotlin/mods/betterfoliage/BetterFoliage.kt index 477145b..af2e9f5 100644 --- a/src/main/kotlin/mods/betterfoliage/BetterFoliage.kt +++ b/src/main/kotlin/mods/betterfoliage/BetterFoliage.kt @@ -13,6 +13,7 @@ import mods.betterfoliage.resource.discovery.BlockTypeCache import mods.betterfoliage.resource.generated.GeneratedBlockTexturePack import net.fabricmc.api.ClientModInitializer import net.fabricmc.fabric.api.resource.ResourceManagerHelper +import net.fabricmc.fabric.mixin.resource.loader.ResourcePackManagerAccessor import net.fabricmc.loader.api.FabricLoader import net.minecraft.block.BlockState import net.minecraft.client.MinecraftClient @@ -56,7 +57,8 @@ object BetterFoliage : ClientModInitializer { override fun onInitializeClient() { // Register generated resource pack ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(generatedPack.reloader) - MinecraftClient.getInstance().resourcePackManager.registerProvider(generatedPack.finder) + (MinecraftClient.getInstance().resourcePackManager as ResourcePackManagerAccessor) + .providers.add(generatedPack.finder) ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(blockConfig) diff --git a/src/main/kotlin/mods/betterfoliage/CommonRefs.kt b/src/main/kotlin/mods/betterfoliage/CommonRefs.kt index f85d89d..867ad35 100644 --- a/src/main/kotlin/mods/betterfoliage/CommonRefs.kt +++ b/src/main/kotlin/mods/betterfoliage/CommonRefs.kt @@ -2,15 +2,9 @@ package mods.betterfoliage import it.unimi.dsi.fastutil.ints.IntList import mods.betterfoliage.util.YarnHelper -import net.minecraft.client.render.model.BakedModel import net.minecraft.client.texture.Sprite -import net.minecraft.util.WeightedPicker import net.minecraft.world.World -val WeightedBakedModel_totalWeight = YarnHelper.requiredField("net.minecraft.class_1097", "field_5433", "I") -val WeightedBakedModel_models = YarnHelper.requiredField>("net.minecraft.class_1097", "field_5434", "Ljava/util/List;") -val WeightedBakedModelEntry_model = YarnHelper.requiredField("net.minecraft.class_1097\$class_1099", "field_5437", "Lnet/minecraft/class_1087;") -val WeightedPickerEntry_weight = YarnHelper.requiredField("net.minecraft.class_3549\$class_3550", "field_15774", "I") val VertexFormat_offsets = YarnHelper.requiredField("net.minecraft.class_293", "field_1597", "Lit/unimi/dsi/fastutil/ints/IntList;") val BakedQuad_sprite = YarnHelper.requiredField("net.minecraft.class_777", "field_4176", "Lnet/minecraft/class_1058;") val WorldChunk_world = YarnHelper.requiredField("net.minecraft.class_2818", "field_12858", "Lnet/minecraft/class_1937;") diff --git a/src/main/kotlin/mods/betterfoliage/Hooks.kt b/src/main/kotlin/mods/betterfoliage/Hooks.kt index 004caef..471aa22 100644 --- a/src/main/kotlin/mods/betterfoliage/Hooks.kt +++ b/src/main/kotlin/mods/betterfoliage/Hooks.kt @@ -52,7 +52,7 @@ fun onRandomDisplayTick(world: ClientWorld, pos: BlockPos) { world.isAir(pos + Direction.DOWN.offset) && randomD() < BetterFoliage.config.fallingLeaves.chance) { BetterFoliage.blockTypes.getTyped(state)?.let { key -> - val blockColor = MinecraftClient.getInstance().blockColorMap.getColor(state, world, pos, 0) + val blockColor = MinecraftClient.getInstance().blockColors.getColor(state, world, pos, 0) FallingLeafParticle(world, pos, key, blockColor, random).addIfValid() } } diff --git a/src/main/kotlin/mods/betterfoliage/chunk/BlockContext.kt b/src/main/kotlin/mods/betterfoliage/chunk/BlockContext.kt index d8d9efc..93e47c3 100644 --- a/src/main/kotlin/mods/betterfoliage/chunk/BlockContext.kt +++ b/src/main/kotlin/mods/betterfoliage/chunk/BlockContext.kt @@ -34,7 +34,7 @@ interface BlockCtx { (world as? WorldView)?.getBiome(pos) ?: (world as? ChunkRendererRegion)?.let { ChunkRendererRegion_world[it]?.getBiome(pos) } - val isNormalCube: Boolean get() = state.isSimpleFullBlock(world, pos) + val isNormalCube: Boolean get() = state.isOpaqueFullCube(world, pos) fun shouldSideBeRendered(side: Direction) = Block.shouldDrawSide(state, world, pos, side) diff --git a/src/main/kotlin/mods/betterfoliage/chunk/Overlay.kt b/src/main/kotlin/mods/betterfoliage/chunk/Overlay.kt index 6332045..4b42faf 100644 --- a/src/main/kotlin/mods/betterfoliage/chunk/Overlay.kt +++ b/src/main/kotlin/mods/betterfoliage/chunk/Overlay.kt @@ -22,8 +22,8 @@ import kotlin.collections.mutableMapOf import kotlin.collections.set val BlockRenderView.dimType: DimensionType get() = when { - this is WorldView -> dimension.type - this is ChunkRendererRegion -> this[ChunkRendererRegion_world]!!.dimension.type + this is WorldView -> dimension + this is ChunkRendererRegion -> this[ChunkRendererRegion_world]!!.dimension // this.isInstance(ChunkCacheOF) -> this[ChunkCacheOF.chunkCache]!!.dimType else -> throw IllegalArgumentException("DimensionType of world with class ${this::class.qualifiedName} cannot be determined!") } diff --git a/src/main/kotlin/mods/betterfoliage/config/Delegate.kt b/src/main/kotlin/mods/betterfoliage/config/Delegate.kt index 88135c3..a13c21f 100644 --- a/src/main/kotlin/mods/betterfoliage/config/Delegate.kt +++ b/src/main/kotlin/mods/betterfoliage/config/Delegate.kt @@ -8,12 +8,16 @@ import me.zeroeightsix.fiber.tree.ConfigLeaf import me.zeroeightsix.fiber.tree.ConfigNode import me.zeroeightsix.fiber.tree.ConfigValue import net.minecraft.client.resource.language.I18n +import net.minecraft.text.LiteralText import java.util.* import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty const val MAX_LINE_LEN = 30 +fun textify(string: String) = LiteralText(string) +fun textify(strings: Array) = strings.map(::LiteralText).toTypedArray() + sealed class DelegatingConfigNode(val fiberNode: N) { abstract fun createClothNode(names: List): AbstractConfigListEntry<*> } @@ -24,9 +28,9 @@ open class DelegatingConfigGroup(fiberNode: ConfigNode) : DelegatingConfigNode>() override fun createClothNode(names: List): SubCategoryListEntry { val builder = ConfigEntryBuilder.create() - .startSubCategory(names.joinToString(".").translate()) - .setTooltip(*names.joinToString(".").translateTooltip()) - .setExpended(false) + .startSubCategory(textify(names.joinToString(".").translate())) + .setTooltip(*textify(names.joinToString(".").translateTooltip())) + .setExpanded(false) children.forEach { builder.add(it.createClothNode(names + it.fiberNode.name!!)) } return builder.build() } @@ -85,8 +89,8 @@ fun boolean( .build() override fun createClothNode(node: ConfigValue, names: List) = ConfigEntryBuilder.create() - .startBooleanToggle(langKey(names).translate(), node.value!!) - .setTooltip(langKey(names).let { if (I18n.hasTranslation("$it.tooltip")) Optional.of(it.translateTooltip()) else Optional.empty() }) + .startBooleanToggle(textify(langKey(names).translate()), node.value!!) + .setTooltip(langKey(names).let { if (I18n.hasTranslation("$it.tooltip")) Optional.of(textify(it.translateTooltip())) else Optional.empty() }) .setSaveConsumer { node.value = valueOverride(it) } .build() } @@ -104,8 +108,8 @@ fun integer( .build() override fun createClothNode(node: ConfigValue, names: List) = ConfigEntryBuilder.create() - .startIntField(langKey(names).translate(), node.value!!) - .setTooltip(langKey(names).let { if (I18n.hasTranslation("$it.tooltip")) Optional.of(it.translateTooltip()) else Optional.empty() }) + .startIntField(textify(langKey(names).translate()), node.value!!) + .setTooltip(langKey(names).let { if (I18n.hasTranslation("$it.tooltip")) Optional.of(textify(it.translateTooltip())) else Optional.empty() }) .setMin(min).setMax(max) .setSaveConsumer { node.value = valueOverride(it) } .build() @@ -124,8 +128,8 @@ fun double( .build() override fun createClothNode(node: ConfigValue, names: List) = ConfigEntryBuilder.create() - .startDoubleField(langKey(names).translate(), node.value!!) - .setTooltip(langKey(names).let { if (I18n.hasTranslation("$it.tooltip")) Optional.of(it.translateTooltip()) else Optional.empty() }) + .startDoubleField(textify(langKey(names).translate()), node.value!!) + .setTooltip(langKey(names).let { if (I18n.hasTranslation("$it.tooltip")) Optional.of(textify(it.translateTooltip())) else Optional.empty() }) .setMin(min).setMax(max) .setSaveConsumer { node.value = valueOverride(it) } .build() diff --git a/src/main/kotlin/mods/betterfoliage/integration/ModMenu.kt b/src/main/kotlin/mods/betterfoliage/integration/ModMenu.kt index 2942f9b..606f247 100644 --- a/src/main/kotlin/mods/betterfoliage/integration/ModMenu.kt +++ b/src/main/kotlin/mods/betterfoliage/integration/ModMenu.kt @@ -8,6 +8,7 @@ import mods.betterfoliage.resource.discovery.BakeWrapperManager import net.minecraft.client.MinecraftClient import net.minecraft.client.gui.screen.Screen import net.minecraft.client.resource.language.I18n +import net.minecraft.text.LiteralText import java.util.function.Function object ModMenu : ModMenuApi { @@ -16,9 +17,9 @@ object ModMenu : ModMenuApi { override fun getConfigScreenFactory() = Function { screen: Screen -> val builder = ConfigBuilder.create() .setParentScreen(screen) - .setTitle(I18n.translate("betterfoliage.title")) + .setTitle(LiteralText(I18n.translate("betterfoliage.title"))) BetterFoliage.config.createClothNode(listOf("betterfoliage")).value.forEach { rootOption -> - builder.getOrCreateCategory("main").addEntry(rootOption) + builder.getOrCreateCategory(LiteralText("main")).addEntry(rootOption) } builder.savingRunnable = Runnable { JanksonSettings().serialize(BetterFoliage.config.fiberNode, BetterFoliage.configFile.outputStream(), false) diff --git a/src/main/kotlin/mods/betterfoliage/model/Meshify.kt b/src/main/kotlin/mods/betterfoliage/model/Meshify.kt index 7f57cec..f044935 100644 --- a/src/main/kotlin/mods/betterfoliage/model/Meshify.kt +++ b/src/main/kotlin/mods/betterfoliage/model/Meshify.kt @@ -100,7 +100,7 @@ fun unbakeQuads(model: BakedModel, state: BlockState?, random: Random, unshade: /** Get the byte offset of the [VertexFormatElement] matching the given criteria */ fun VertexFormat.getByteOffset(type: VertexFormatElement.Type, format: VertexFormatElement.Format, count: Int, index: Int = 0): Int? { elements.forEachIndexed { idx, element -> - if (element.type == type && element.format == format && element.count == count && element.index == index) + if (element == VertexFormatElement(index, format, type, count)) return VertexFormat_offsets[this]!!.getInt(idx) } return null diff --git a/src/main/kotlin/mods/betterfoliage/model/Quads.kt b/src/main/kotlin/mods/betterfoliage/model/Quads.kt index ed61752..bd7e3f5 100644 --- a/src/main/kotlin/mods/betterfoliage/model/Quads.kt +++ b/src/main/kotlin/mods/betterfoliage/model/Quads.kt @@ -167,7 +167,7 @@ fun Array>.withOpposites() = map { it.withOpposites() }.toTypedArray( * Pour quad data into a fabric-renderer-api Mesh */ fun List.build(blendMode: BlendMode, noDiffuse: Boolean = false, flatLighting: Boolean = false): Mesh { - val renderer = RendererAccess.INSTANCE.renderer + val renderer = RendererAccess.INSTANCE.renderer!! val material = renderer.materialFinder().blendMode(0, blendMode).disableAo(0, flatLighting).disableDiffuse(0, noDiffuse).find() val builder = renderer.meshBuilder() builder.emitter.apply { diff --git a/src/main/kotlin/mods/betterfoliage/model/TuftMeshes.kt b/src/main/kotlin/mods/betterfoliage/model/TuftMeshes.kt index c0274be..a435e63 100644 --- a/src/main/kotlin/mods/betterfoliage/model/TuftMeshes.kt +++ b/src/main/kotlin/mods/betterfoliage/model/TuftMeshes.kt @@ -46,7 +46,7 @@ fun fullCubeTextured(spriteId: Identifier, tintIndex: Int, scrambleUV: Boolean = .map { if (!scrambleUV) it else it.rotateUV(randomI(max = 4)) } .map { it.sprite(sprite) } .map { it.colorIndex(tintIndex) } - .build(BlendMode.SOLID) + .build(BlendMode.SOLID, noDiffuse = true) } fun crossModelsRaw(num: Int, size: Double, hOffset: Double, vOffset: Double): Array> { diff --git a/src/main/kotlin/mods/betterfoliage/model/VanillaWrappers.kt b/src/main/kotlin/mods/betterfoliage/model/VanillaWrappers.kt index 9babe6e..6d2bb7d 100644 --- a/src/main/kotlin/mods/betterfoliage/model/VanillaWrappers.kt +++ b/src/main/kotlin/mods/betterfoliage/model/VanillaWrappers.kt @@ -12,7 +12,7 @@ import net.minecraft.client.render.RenderLayers import net.minecraft.client.render.model.BakedModel import net.minecraft.client.render.model.BasicBakedModel import net.minecraft.item.ItemStack -import net.minecraft.util.WeightedPicker +import net.minecraft.util.collection.WeightedPicker import net.minecraft.util.math.BlockPos import net.minecraft.world.BlockRenderView import java.util.* diff --git a/src/main/kotlin/mods/betterfoliage/render/block/vanilla/Grass.kt b/src/main/kotlin/mods/betterfoliage/render/block/vanilla/Grass.kt index 35964f1..48f55e8 100644 --- a/src/main/kotlin/mods/betterfoliage/render/block/vanilla/Grass.kt +++ b/src/main/kotlin/mods/betterfoliage/render/block/vanilla/Grass.kt @@ -109,7 +109,7 @@ class StandardGrassModel(wrapped: BakedModel, val key: StandardGrassKey) : Wrapp Array(64) { fullCubeTextured(key.grassLocation, key.tintIndex) } } val snowFullBlockMeshes by LazyInvalidatable(BakeWrapperManager) { - Array(64) { fullCubeTextured(Identifier("block/snow"), Color.white.asInt) } + Array(64) { fullCubeTextured(Identifier("block/snow"), -1) } } } } diff --git a/src/main/kotlin/mods/betterfoliage/render/block/vanilla/RoundLog.kt b/src/main/kotlin/mods/betterfoliage/render/block/vanilla/RoundLog.kt index ad71eac..07c37bd 100644 --- a/src/main/kotlin/mods/betterfoliage/render/block/vanilla/RoundLog.kt +++ b/src/main/kotlin/mods/betterfoliage/render/block/vanilla/RoundLog.kt @@ -3,7 +3,6 @@ package mods.betterfoliage.render.block.vanilla import mods.betterfoliage.BetterFoliage import mods.betterfoliage.model.ModelWrapKey import mods.betterfoliage.model.meshifySolid -import mods.betterfoliage.model.meshifyStandard import mods.betterfoliage.render.column.ColumnBlockKey import mods.betterfoliage.render.column.ColumnMeshSet import mods.betterfoliage.render.column.ColumnModelBase @@ -19,7 +18,7 @@ import mods.betterfoliage.util.Atlas import mods.betterfoliage.util.LazyMap import mods.betterfoliage.util.tryDefault import net.minecraft.block.BlockState -import net.minecraft.block.LogBlock +import net.minecraft.block.PillarBlock import net.minecraft.client.render.model.BakedModel import net.minecraft.client.render.model.BasicBakedModel import net.minecraft.util.Identifier @@ -49,7 +48,7 @@ object StandardRoundLogDiscovery : ConfigurableModelDiscovery() { } fun getAxis(state: BlockState): Axis? { - val axis = tryDefault(null) { state.get(LogBlock.AXIS).toString() } ?: + val axis = tryDefault(null) { state.get(PillarBlock.AXIS).toString() } ?: state.entries.entries.find { it.key.getName().toLowerCase() == "axis" }?.value?.toString() return when (axis) { "x" -> Axis.X diff --git a/src/main/kotlin/mods/betterfoliage/render/particle/AbstractParticle.kt b/src/main/kotlin/mods/betterfoliage/render/particle/AbstractParticle.kt index 8046446..6ef96d4 100644 --- a/src/main/kotlin/mods/betterfoliage/render/particle/AbstractParticle.kt +++ b/src/main/kotlin/mods/betterfoliage/render/particle/AbstractParticle.kt @@ -7,10 +7,11 @@ import net.minecraft.client.render.Camera import net.minecraft.client.render.VertexConsumer import net.minecraft.client.texture.Sprite import net.minecraft.client.util.math.Vector3f +import net.minecraft.client.world.ClientWorld import net.minecraft.util.math.MathHelper import net.minecraft.world.World -abstract class AbstractParticle(world: World, x: Double, y: Double, z: Double) : SpriteBillboardParticle(world, x, y, z) { +abstract class AbstractParticle(world: ClientWorld, x: Double, y: Double, z: Double) : SpriteBillboardParticle(world, x, y, z) { companion object { // @JvmStatic val sin = Array(64) { idx -> Math.sin(PI2 / 64.0 * idx) } diff --git a/src/main/kotlin/mods/betterfoliage/render/particle/FallingLeaves.kt b/src/main/kotlin/mods/betterfoliage/render/particle/FallingLeaves.kt index 3f3dc84..95ef47a 100644 --- a/src/main/kotlin/mods/betterfoliage/render/particle/FallingLeaves.kt +++ b/src/main/kotlin/mods/betterfoliage/render/particle/FallingLeaves.kt @@ -11,7 +11,6 @@ import mods.betterfoliage.util.randomD import mods.betterfoliage.util.randomF import mods.betterfoliage.util.randomI import net.fabricmc.fabric.api.event.world.WorldTickCallback -import net.minecraft.client.MinecraftClient import net.minecraft.client.particle.ParticleTextureSheet import net.minecraft.client.world.ClientWorld import net.minecraft.util.math.BlockPos @@ -23,7 +22,7 @@ import kotlin.math.cos import kotlin.math.sin class FallingLeafParticle( - world: World, pos: BlockPos, leaf: LeafParticleKey, blockColor: Int, random: Random + world: ClientWorld, pos: BlockPos, leaf: LeafParticleKey, blockColor: Int, random: Random ) : AbstractParticle( world, pos.x.toDouble() + 0.5, pos.y.toDouble(), pos.z.toDouble() + 0.5 ) { diff --git a/src/main/kotlin/mods/betterfoliage/render/particle/LeafParticleRegistry.kt b/src/main/kotlin/mods/betterfoliage/render/particle/LeafParticleRegistry.kt index 95c221c..a65f5c5 100644 --- a/src/main/kotlin/mods/betterfoliage/render/particle/LeafParticleRegistry.kt +++ b/src/main/kotlin/mods/betterfoliage/render/particle/LeafParticleRegistry.kt @@ -70,7 +70,7 @@ object LeafParticleRegistry : HasLogger(), ClientSpriteRegistryCallback, VeryEar } init { - ClientSpriteRegistryCallback.event(SpriteAtlasTexture.PARTICLE_ATLAS_TEX).register(this) + ClientSpriteRegistryCallback.event(SpriteAtlasTexture.PARTICLE_ATLAS_TEXTURE).register(this) } } diff --git a/src/main/kotlin/mods/betterfoliage/render/particle/RisingSouls.kt b/src/main/kotlin/mods/betterfoliage/render/particle/RisingSouls.kt index 6b011a5..11b656a 100644 --- a/src/main/kotlin/mods/betterfoliage/render/particle/RisingSouls.kt +++ b/src/main/kotlin/mods/betterfoliage/render/particle/RisingSouls.kt @@ -3,20 +3,26 @@ package mods.betterfoliage.render.particle import mods.betterfoliage.BetterFoliage import mods.betterfoliage.model.SpriteDelegate import mods.betterfoliage.model.SpriteSetDelegate -import mods.betterfoliage.util.* +import mods.betterfoliage.util.Atlas +import mods.betterfoliage.util.Double3 +import mods.betterfoliage.util.PI2 +import mods.betterfoliage.util.forEachPairIndexed +import mods.betterfoliage.util.randomD +import mods.betterfoliage.util.randomI import net.minecraft.client.particle.ParticleTextureSheet import net.minecraft.client.render.Camera import net.minecraft.client.render.VertexConsumer +import net.minecraft.client.world.ClientWorld import net.minecraft.util.Identifier import net.minecraft.util.math.BlockPos import net.minecraft.util.math.MathHelper -import net.minecraft.world.World -import java.util.* +import java.util.Deque +import java.util.LinkedList import kotlin.math.cos import kotlin.math.sin class RisingSoulParticle( - world: World, pos: BlockPos + world: ClientWorld, pos: BlockPos ) : AbstractParticle( world, pos.x.toDouble() + 0.5, pos.y.toDouble() + 1.0, pos.z.toDouble() + 0.5 ) { diff --git a/src/main/kotlin/mods/betterfoliage/resource/discovery/BakingLifecycle.kt b/src/main/kotlin/mods/betterfoliage/resource/discovery/BakingLifecycle.kt index dcb8a1a..47c6981 100644 --- a/src/main/kotlin/mods/betterfoliage/resource/discovery/BakingLifecycle.kt +++ b/src/main/kotlin/mods/betterfoliage/resource/discovery/BakingLifecycle.kt @@ -66,7 +66,7 @@ interface ModelBakingKey { object BakeWrapperManager : HasLogger(), Invalidator, ModelLoadingCallback, ClientSpriteRegistryCallback, BlockModelsReloadCallback { init { ModelLoadingCallback.EVENT.register(this) - ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEX).register(this) + ClientSpriteRegistryCallback.event(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE).register(this) } val discoverers = mutableListOf() override val callbacks = mutableListOfUnit>>() diff --git a/src/main/kotlin/mods/betterfoliage/resource/discovery/ModelDiscovery.kt b/src/main/kotlin/mods/betterfoliage/resource/discovery/ModelDiscovery.kt index 0afb9ae..385e4fc 100644 --- a/src/main/kotlin/mods/betterfoliage/resource/discovery/ModelDiscovery.kt +++ b/src/main/kotlin/mods/betterfoliage/resource/discovery/ModelDiscovery.kt @@ -4,6 +4,7 @@ import com.google.common.base.Joiner import mods.betterfoliage.util.HasLogger import mods.betterfoliage.util.YarnHelper import mods.betterfoliage.util.get +import net.minecraft.block.Block import net.minecraft.client.render.block.BlockModels import net.minecraft.client.render.model.ModelLoader import net.minecraft.client.render.model.json.JsonUnbakedModel @@ -19,7 +20,7 @@ abstract class AbstractModelDiscovery : HasLogger(), ModelDiscovery { sprites: MutableSet, replacements: MutableMap ) { - Registry.BLOCK + (Registry.BLOCK as Iterable) .flatMap { block -> block.stateManager.states } .forEach { state -> val location = BlockModels.getModelId(state) diff --git a/src/main/kotlin/mods/betterfoliage/resource/generated/GeneratedBlockTexturePack.kt b/src/main/kotlin/mods/betterfoliage/resource/generated/GeneratedBlockTexturePack.kt index 678ae65..8f39607 100644 --- a/src/main/kotlin/mods/betterfoliage/resource/generated/GeneratedBlockTexturePack.kt +++ b/src/main/kotlin/mods/betterfoliage/resource/generated/GeneratedBlockTexturePack.kt @@ -3,24 +3,20 @@ package mods.betterfoliage.resource.generated import mods.betterfoliage.util.Atlas import mods.betterfoliage.util.HasLogger import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener -import net.minecraft.client.resource.ClientResourcePackProfile import net.minecraft.resource.* import net.minecraft.resource.ResourceType.CLIENT_RESOURCES import net.minecraft.resource.metadata.ResourceMetadataReader import net.minecraft.text.LiteralText import net.minecraft.util.Identifier import net.minecraft.util.profiler.Profiler -import org.apache.logging.log4j.Level import org.apache.logging.log4j.Level.INFO -import org.apache.logging.log4j.Logger import java.io.IOException -import java.lang.IllegalStateException import java.util.* import java.util.concurrent.CompletableFuture import java.util.concurrent.ExecutionException import java.util.concurrent.Executor +import java.util.function.Consumer import java.util.function.Predicate -import java.util.function.Supplier /** * [ResourcePack] containing generated block textures @@ -69,21 +65,18 @@ class GeneratedBlockTexturePack( type == CLIENT_RESOURCES && resources.containsKey(id) /** - * Supplier for this resource pack. Adds pack as always-on and hidden. + * Provider for this resource pack. Adds pack as always-on and hidden. */ val finder = object : ResourcePackProvider { - val packInfo = ClientResourcePackProfile( - packName, true, Supplier { this@GeneratedBlockTexturePack }, + val packInfo = ResourcePackProfile( + packName, true, { this@GeneratedBlockTexturePack }, LiteralText(packName), LiteralText(packDesc), ResourcePackCompatibility.COMPATIBLE, ResourcePackProfile.InsertionPosition.TOP, true, null ) - override fun register( - registry: MutableMap, - factory: ResourcePackProfile.Factory - ) { - (registry as MutableMap)[reloadId.toString()] = packInfo + override fun register(consumer: Consumer, factory: ResourcePackProfile.Factory) { + consumer.accept(packInfo) } } diff --git a/src/main/kotlin/mods/betterfoliage/util/Geometry.kt b/src/main/kotlin/mods/betterfoliage/util/Geometry.kt index 712c4ca..38ae7bd 100644 --- a/src/main/kotlin/mods/betterfoliage/util/Geometry.kt +++ b/src/main/kotlin/mods/betterfoliage/util/Geometry.kt @@ -73,9 +73,9 @@ data class Double3(var x: Double, var y: Double, var z: Double) { /** Rotate vector by the given [Quaternion] */ fun rotate(quat: Quaternion) = quat.copy() - .apply { hamiltonProduct(Quaternion(x.toFloat(), y.toFloat(), z.toFloat(), 0.0F)) } + .apply { hamiltonProduct(Quaternion(this@Double3.x.toFloat(), this@Double3.y.toFloat(), this@Double3.z.toFloat(), 0.0F)) } .apply { hamiltonProduct(quat.copy().apply(Quaternion::conjugate)) } - .let { Double3(it.b, it.c, it.d) } + .let { Double3(it.x, it.y, it.z) } // mutable operations fun setTo(other: Double3): Double3 { x = other.x; y = other.y; z = other.z; return this } diff --git a/src/main/kotlin/mods/betterfoliage/util/Misc.kt b/src/main/kotlin/mods/betterfoliage/util/Misc.kt index 043d802..e9e5118 100644 --- a/src/main/kotlin/mods/betterfoliage/util/Misc.kt +++ b/src/main/kotlin/mods/betterfoliage/util/Misc.kt @@ -8,8 +8,6 @@ import net.minecraft.util.Formatting import net.minecraft.util.Identifier import net.minecraft.util.math.BlockPos import net.minecraft.world.World -import org.apache.logging.log4j.Level -import org.apache.logging.log4j.Logger import java.lang.Math.* import kotlin.reflect.KProperty @@ -71,6 +69,6 @@ abstract class HasLogger { } fun textComponent(msg: String, color: Formatting = Formatting.GRAY): LiteralText { - val style = Style().apply { this.color = color } + val style = Style.EMPTY.withColor(color) return LiteralText(msg).apply { this.style = style } } \ No newline at end of file diff --git a/src/main/kotlin/mods/betterfoliage/util/Sprites.kt b/src/main/kotlin/mods/betterfoliage/util/Sprites.kt index 8ccb3d6..b2acd00 100644 --- a/src/main/kotlin/mods/betterfoliage/util/Sprites.kt +++ b/src/main/kotlin/mods/betterfoliage/util/Sprites.kt @@ -18,8 +18,8 @@ import javax.imageio.ImageIO import kotlin.math.atan2 enum class Atlas(val resourceId: Identifier) { - BLOCKS(SpriteAtlasTexture.BLOCK_ATLAS_TEX), - PARTICLES(SpriteAtlasTexture.PARTICLE_ATLAS_TEX); + BLOCKS(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE), + PARTICLES(SpriteAtlasTexture.PARTICLE_ATLAS_TEXTURE); /** Get the fully-qualified resource name for sprites belonging to this atlas */ fun file(resource: Identifier) = Identifier(resource.namespace, "textures/${resource.path}.png") @@ -62,7 +62,7 @@ val Sprite.averageColor: HSB get() { var sumBrightness = 0.0f for (x in 0 until width) for (y in 0 until height) { - val pixel = this[Sprite_images]!![0].getPixelRgba(x, y) + val pixel = this[Sprite_images]!![0].getPixelColor(x, y) val alpha = (pixel shr 24) and 255 val hsb = HSB.fromColor(pixel) if (alpha == 255) { diff --git a/src/main/kotlin/net/fabricmc/fabric/impl/client/indigo/renderer/render/ModifiedTerrainMeshConsumer.kt b/src/main/kotlin/net/fabricmc/fabric/impl/client/indigo/renderer/render/ModifiedTerrainMeshConsumer.kt index 56917fc..1b6f91f 100644 --- a/src/main/kotlin/net/fabricmc/fabric/impl/client/indigo/renderer/render/ModifiedTerrainMeshConsumer.kt +++ b/src/main/kotlin/net/fabricmc/fabric/impl/client/indigo/renderer/render/ModifiedTerrainMeshConsumer.kt @@ -18,7 +18,7 @@ import net.minecraft.util.math.Direction val AoCalculator_computeFace = YarnHelper.requiredMethod( "net.fabricmc.fabric.impl.client.indigo.renderer.aocalc.AoCalculator", "computeFace", - "(Lnet/minecraft/util/math/Direction;Z)Lnet/fabricmc/fabric/impl/client/indigo/renderer/aocalc/AoFaceData;" + "(Lnet/minecraft/util/math/Direction;ZZ)Lnet/fabricmc/fabric/impl/client/indigo/renderer/aocalc/AoFaceData;" ) val AoFaceData_toArray = YarnHelper.requiredMethod( "net.fabricmc.fabric.impl.client.indigo.renderer.aocalc.AoFaceData", "toArray", @@ -78,7 +78,7 @@ open class ModifiedTerrainMeshConsumer( override fun fillAoData(lightFace: Direction) { if (!aoValid[lightFace.ordinal]) { AoFaceData_toArray.invoke( - AoCalculator_computeFace.invoke(aoCalc, lightFace, true), + AoCalculator_computeFace.invoke(aoCalc, lightFace, true, false), aoFull, lightFull, cornerDirFromAo[lightFace.ordinal] diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index b026dc1..7e179ca 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -42,6 +42,6 @@ "fabricloader": ">=0.11.3", "fabric": "*", "fabric-language-kotlin": "*", - "minecraft": "1.15.2" + "minecraft": "1.16.5" } } \ No newline at end of file