package joshie.harvest.crops.render; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import joshie.harvest.api.HFApi; import joshie.harvest.api.calendar.Season; import joshie.harvest.core.base.render.BakedHF; import joshie.harvest.core.helpers.MCClientHelper; import joshie.harvest.core.util.annotations.HFEvents; import joshie.harvest.crops.HFCrops; import joshie.harvest.crops.block.BlockLeavesFruit.LeavesFruit; import joshie.harvest.crops.block.BlockLeavesTropical.LeavesTropical; import net.minecraft.block.Block; import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BakedQuadRetextured; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.statemap.DefaultStateMapper; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.registry.IRegistry; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Map; import static joshie.harvest.core.lib.HFModInfo.MODID; import static net.minecraft.block.BlockLeaves.CHECK_DECAY; import static net.minecraft.block.BlockLeaves.DECAYABLE; @SuppressWarnings("unused") public class BakedLeaves extends BakedHF { private final TextureAtlasSprite sprite; private final IBakedModel base; public BakedLeaves(IBakedModel parent, IBakedModel base, TextureAtlasSprite sprite) { super(parent); this.base = base; this.sprite = sprite; } @Override public List<BakedQuad> getQuads(final @Nullable IBlockState state, final @Nullable EnumFacing side, final long rand) { List<BakedQuad> quads = new ArrayList<>(); if (MCClientHelper.getMinecraft().gameSettings.fancyGraphics) base.getQuads(state, side, rand).stream().forEachOrdered(quads::add); else base.getQuads(state, side, rand).stream().map(quad -> new BakedQuadRetextured(quad, sprite)).forEachOrdered(quads::add); if (HFApi.calendar.getDate(MCClientHelper.getWorld()).getSeason() == Season.SPRING) { BakedLeaves.super.getQuads(state, side, rand).stream().map(BakedTintedQuad :: new).forEachOrdered(quads::add); } return quads; } @HFEvents @SuppressWarnings("unused") public static class LeavesMapper extends DefaultStateMapper { private static final List <IProperty<?>> ignored = Lists.newArrayList(); static { ignored.add(CHECK_DECAY); ignored.add(DECAYABLE); } @Override @Nonnull protected ModelResourceLocation getModelResourceLocation(@Nonnull IBlockState state) { Map< IProperty<?>, Comparable<? >> map = Maps.newLinkedHashMap(state.getProperties()); String s = (Block.REGISTRY.getNameForObject(state.getBlock())).toString(); ignored.forEach(map::remove); return new ModelResourceLocation(s, getPropertyString(map)); } @SubscribeEvent public void onStitch(TextureStitchEvent event) { event.getMap().registerSprite(new ResourceLocation(MODID, "blocks/leaves_oak_black")); event.getMap().registerSprite(new ResourceLocation(MODID, "blocks/leaves_jungle_black")); } @SubscribeEvent public void onBaking(ModelBakeEvent event) { IRegistry<ModelResourceLocation, IBakedModel> registry = event.getModelRegistry(); IBakedModel oak = registry.getObject(new ModelResourceLocation("minecraft:oak_leaves#normal")); TextureAtlasSprite spriteOak = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("harvestfestival:blocks/leaves_oak_black"); for (LeavesFruit leaves: LeavesFruit.values()) { IBlockState state = HFCrops.LEAVES_FRUIT.getStateFromEnum(leaves); registry.putObject(getModelResourceLocation(state), new BakedLeaves(registry.getObject(getModelResourceLocation(state)), oak, spriteOak)); } IBakedModel jungle = registry.getObject(new ModelResourceLocation("minecraft:jungle_leaves#normal")); TextureAtlasSprite spriteJungle = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("harvestfestival:blocks/leaves_jungle_black"); for (LeavesTropical leaves: LeavesTropical.values()) { IBlockState state = HFCrops.LEAVES_TROPICAL.getStateFromEnum(leaves); registry.putObject(getModelResourceLocation(state), new BakedLeaves(registry.getObject(getModelResourceLocation(state)), jungle, spriteJungle)); } } } }