95 lines
3.9 KiB
Kotlin
95 lines
3.9 KiB
Kotlin
@file:JvmName("Hooks")
|
|
@file:SideOnly(Side.CLIENT)
|
|
package mods.betterfoliage.client
|
|
|
|
import mods.betterfoliage.BetterFoliageMod
|
|
import mods.betterfoliage.client.config.Config
|
|
import mods.betterfoliage.client.render.*
|
|
import mods.octarinecore.client.render.blockContext
|
|
import mods.octarinecore.client.resource.LoadModelDataEvent
|
|
import mods.octarinecore.common.plus
|
|
import net.minecraft.block.Block
|
|
import net.minecraft.block.state.IBlockState
|
|
import net.minecraft.client.renderer.BlockRendererDispatcher
|
|
import net.minecraft.client.renderer.VertexBuffer
|
|
import net.minecraft.init.Blocks
|
|
import net.minecraft.util.BlockRenderLayer
|
|
import net.minecraft.util.BlockRenderLayer.CUTOUT
|
|
import net.minecraft.util.BlockRenderLayer.CUTOUT_MIPPED
|
|
import net.minecraft.util.EnumFacing
|
|
import net.minecraft.util.math.BlockPos
|
|
import net.minecraft.world.IBlockAccess
|
|
import net.minecraft.world.World
|
|
import net.minecraftforge.client.model.ModelLoader
|
|
import net.minecraftforge.common.MinecraftForge
|
|
import net.minecraftforge.fml.relauncher.Side
|
|
import net.minecraftforge.fml.relauncher.SideOnly
|
|
|
|
fun doesSideBlockRenderingOverride(original: Boolean, blockAccess: IBlockAccess, pos: BlockPos, side: EnumFacing): Boolean {
|
|
return original && !(Config.enabled && Config.roundLogs.enabled && Config.blocks.logClasses.matchesClass(blockAccess.getBlockState(pos).block));
|
|
}
|
|
|
|
fun isOpaqueCubeOverride(original: Boolean, state: IBlockState): Boolean {
|
|
// caution: blocks are initialized and the method called during startup
|
|
if (!BetterFoliageMod.isAfterPostInit) return original
|
|
return original && !(Config.enabled && Config.roundLogs.enabled && Config.blocks.logClasses.matchesClass(state.block))
|
|
}
|
|
|
|
fun getAmbientOcclusionLightValueOverride(original: Float, state: IBlockState): Float {
|
|
if (Config.enabled && Config.roundLogs.enabled && Config.blocks.logClasses.matchesClass(state.block)) return Config.roundLogs.dimming;
|
|
return original;
|
|
}
|
|
|
|
fun getUseNeighborBrightnessOverride(original: Boolean, state: IBlockState): Boolean {
|
|
return original || (Config.enabled && Config.roundLogs.enabled && Config.blocks.logClasses.matchesClass(state.block));
|
|
}
|
|
|
|
fun onRandomDisplayTick(world: World, state: IBlockState, pos: BlockPos) {
|
|
if (Config.enabled &&
|
|
Config.risingSoul.enabled &&
|
|
state.block == Blocks.SOUL_SAND &&
|
|
world.isAirBlock(pos + up1) &&
|
|
Math.random() < Config.risingSoul.chance) {
|
|
EntityRisingSoulFX(world, pos).addIfValid()
|
|
}
|
|
|
|
if (Config.enabled &&
|
|
Config.fallingLeaves.enabled &&
|
|
Config.blocks.leavesClasses.matchesClass(state.block) &&
|
|
world.isAirBlock(pos + down1) &&
|
|
Math.random() < Config.fallingLeaves.chance) {
|
|
EntityFallingLeavesFX(world, pos).addIfValid()
|
|
}
|
|
}
|
|
|
|
fun onAfterLoadModelDefinitions(loader: ModelLoader) {
|
|
MinecraftForge.EVENT_BUS.post(LoadModelDataEvent(loader))
|
|
}
|
|
|
|
fun renderWorldBlock(dispatcher: BlockRendererDispatcher,
|
|
state: IBlockState,
|
|
pos: BlockPos,
|
|
blockAccess: IBlockAccess,
|
|
worldRenderer: VertexBuffer,
|
|
layer: BlockRenderLayer
|
|
): Boolean {
|
|
blockContext.let { ctx ->
|
|
ctx.set(blockAccess, pos)
|
|
Client.renderers.forEach { renderer ->
|
|
if (renderer.isEligible(ctx)) {
|
|
if (state.canRenderInLayer(layer) || (layer.isCutout && renderer.addToCutout)) {
|
|
return renderer.render(ctx, dispatcher, worldRenderer, layer)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return if (state.canRenderInLayer(layer)) dispatcher.renderBlock(state, pos, blockAccess, worldRenderer) else false
|
|
}
|
|
|
|
fun canRenderBlockInLayer(block: Block, state: IBlockState, layer: BlockRenderLayer): Boolean {
|
|
if (layer == CUTOUT_MIPPED && !block.canRenderInLayer(state, CUTOUT)) {
|
|
return true
|
|
}
|
|
return block.canRenderInLayer(state, layer)
|
|
|
|
} |