diff --git a/src/main/java/mods/betterfoliage/client/BetterFoliageClient.java b/src/main/java/mods/betterfoliage/client/BetterFoliageClient.java index 67c7ec5..400373b 100644 --- a/src/main/java/mods/betterfoliage/client/BetterFoliageClient.java +++ b/src/main/java/mods/betterfoliage/client/BetterFoliageClient.java @@ -8,6 +8,7 @@ import mods.betterfoliage.BetterFoliage; import mods.betterfoliage.client.render.IRenderBlockDecorator; import mods.betterfoliage.client.render.impl.RenderBlockBetterAlgae; import mods.betterfoliage.client.render.impl.RenderBlockBetterCactus; +import mods.betterfoliage.client.render.impl.RenderBlockBetterCoral; import mods.betterfoliage.client.render.impl.RenderBlockBetterGrass; import mods.betterfoliage.client.render.impl.RenderBlockBetterLeaves; import mods.betterfoliage.client.render.impl.RenderBlockBetterLilypad; @@ -46,6 +47,7 @@ public class BetterFoliageClient { registerRenderer(new RenderBlockBetterLilypad()); registerRenderer(new RenderBlockBetterReed()); registerRenderer(new RenderBlockBetterAlgae()); + registerRenderer(new RenderBlockBetterCoral()); leaves.load(new File(BetterFoliage.configDir, "classesLeaves.cfg"), new ResourceLocation("betterfoliage:classesLeavesDefault.cfg")); MinecraftForge.EVENT_BUS.register(leaves); diff --git a/src/main/java/mods/betterfoliage/client/gui/ConfigGuiCoral.java b/src/main/java/mods/betterfoliage/client/gui/ConfigGuiCoral.java new file mode 100644 index 0000000..98bd7ff --- /dev/null +++ b/src/main/java/mods/betterfoliage/client/gui/ConfigGuiCoral.java @@ -0,0 +1,34 @@ +package mods.betterfoliage.client.gui; + +import cpw.mods.fml.client.FMLClientHandler; +import mods.betterfoliage.BetterFoliage; +import mods.betterfoliage.client.gui.widget.OptionDoubleWidget; +import mods.betterfoliage.client.gui.widget.OptionIntegerWidget; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.resources.I18n; + +public class ConfigGuiCoral extends ConfigGuiScreenBase { + + public ConfigGuiCoral(GuiScreen parent) { + super(parent); + int id = 10; + widgets.add(new OptionDoubleWidget(BetterFoliage.config.coralCrustSize, -100, -100, 200, 50, id++, id++, "message.betterfoliage.crustSize", "%.2f")); + widgets.add(new OptionDoubleWidget(BetterFoliage.config.coralVOffset, -100, -70, 200, 50, id++, id++, "message.betterfoliage.vOffset", "%.3f")); + widgets.add(new OptionDoubleWidget(BetterFoliage.config.coralSize, -100, -40, 200, 50, id++, id++, "message.betterfoliage.size", "%.2f")); + widgets.add(new OptionDoubleWidget(BetterFoliage.config.coralHOffset, -100, -10, 200, 50, id++, id++, "message.betterfoliage.hOffset", "%.3f")); + widgets.add(new OptionIntegerWidget(BetterFoliage.config.coralPopulation, -100, 20, 200, 50, id++, id++, "message.betterfoliage.coralPopulation")); + widgets.add(new OptionIntegerWidget(BetterFoliage.config.coralChance, -100, 50, 200, 50, id++, id++, "message.betterfoliage.coralChance")); + } + + @SuppressWarnings("unchecked") + @Override + public void addButtons(int x, int y) { + buttonList.add(new GuiButton(0, x - 50, y + 80, 100, 20, I18n.format("message.betterfoliage.back"))); + } + + @Override + protected void onButtonPress(int id) { + if (id == 0) FMLClientHandler.instance().showGuiScreen(parent); + } +} diff --git a/src/main/java/mods/betterfoliage/client/gui/ConfigGuiMain.java b/src/main/java/mods/betterfoliage/client/gui/ConfigGuiMain.java index e95e4b9..fcb8c51 100644 --- a/src/main/java/mods/betterfoliage/client/gui/ConfigGuiMain.java +++ b/src/main/java/mods/betterfoliage/client/gui/ConfigGuiMain.java @@ -18,7 +18,8 @@ public class ConfigGuiMain extends ConfigGuiScreenBase { TOGGLE_CACTUS, CONFIG_CACTUS, TOGGLE_LILYPAD, CONFIG_LILYPAD, TOGGLE_REED, CONFIG_REED, - TOGGLE_ALGAE, CONFIG_ALGAE} + TOGGLE_ALGAE, CONFIG_ALGAE, + TOGGLE_CORAL, CONFIG_CORAL} public ConfigGuiMain(GuiScreen parent) { super(parent); @@ -28,7 +29,7 @@ public class ConfigGuiMain extends ConfigGuiScreenBase { @SuppressWarnings("unchecked") @Override protected void addButtons(int x, int y) { - buttonList.add(new GuiButton(Button.CLOSE.ordinal(), x - 50, y + 80, 100, 20, I18n.format("message.betterfoliage.close"))); + buttonList.add(new GuiButton(Button.CLOSE.ordinal(), x - 50, y + 110, 100, 20, I18n.format("message.betterfoliage.close"))); buttonList.add(new GuiButton(Button.TOGGLE_LEAVES.ordinal(), x - 100, y - 100, 150, 20, "")); buttonList.add(new GuiButton(Button.CONFIG_LEAVES.ordinal(), x + 60, y - 100, 40, 20, I18n.format("message.betterfoliage.config"))); @@ -47,6 +48,9 @@ public class ConfigGuiMain extends ConfigGuiScreenBase { buttonList.add(new GuiButton(Button.TOGGLE_ALGAE.ordinal(), x - 100, y + 50, 150, 20, "")); buttonList.add(new GuiButton(Button.CONFIG_ALGAE.ordinal(), x + 60, y + 50, 40, 20, I18n.format("message.betterfoliage.config"))); + + buttonList.add(new GuiButton(Button.TOGGLE_CORAL.ordinal(), x - 100, y + 80, 150, 20, "")); + buttonList.add(new GuiButton(Button.CONFIG_CORAL.ordinal(), x + 60, y + 80, 40, 20, I18n.format("message.betterfoliage.config"))); } protected void updateButtons() { @@ -56,6 +60,7 @@ public class ConfigGuiMain extends ConfigGuiScreenBase { setButtonOptionBoolean(Button.TOGGLE_LILYPAD.ordinal(), "message.betterfoliage.betterLilypad", BetterFoliage.config.lilypadEnabled); setButtonOptionBoolean(Button.TOGGLE_REED.ordinal(), "message.betterfoliage.betterReed", BetterFoliage.config.reedEnabled); setButtonOptionBoolean(Button.TOGGLE_ALGAE.ordinal(), "message.betterfoliage.betterAlgae", BetterFoliage.config.algaeEnabled); + setButtonOptionBoolean(Button.TOGGLE_CORAL.ordinal(), "message.betterfoliage.betterCoral", BetterFoliage.config.coralEnabled); ((GuiButton) buttonList.get(Button.CONFIG_CACTUS.ordinal())).enabled = false; } @@ -72,12 +77,14 @@ public class ConfigGuiMain extends ConfigGuiScreenBase { if (id == Button.TOGGLE_LILYPAD.ordinal()) BetterFoliage.config.lilypadEnabled = !BetterFoliage.config.lilypadEnabled; if (id == Button.TOGGLE_REED.ordinal()) BetterFoliage.config.reedEnabled = !BetterFoliage.config.reedEnabled; if (id == Button.TOGGLE_ALGAE.ordinal()) BetterFoliage.config.algaeEnabled = !BetterFoliage.config.algaeEnabled; + if (id == Button.TOGGLE_CORAL.ordinal()) BetterFoliage.config.coralEnabled = !BetterFoliage.config.coralEnabled; if (id== Button.CONFIG_LEAVES.ordinal()) FMLClientHandler.instance().showGuiScreen(new ConfigGuiLeaves(this)); if (id== Button.CONFIG_GRASS.ordinal()) FMLClientHandler.instance().showGuiScreen(new ConfigGuiGrass(this)); if (id== Button.CONFIG_LILYPAD.ordinal()) FMLClientHandler.instance().showGuiScreen(new ConfigGuiLilypad(this)); if (id== Button.CONFIG_REED.ordinal()) FMLClientHandler.instance().showGuiScreen(new ConfigGuiReed(this)); if (id== Button.CONFIG_ALGAE.ordinal()) FMLClientHandler.instance().showGuiScreen(new ConfigGuiAlgae(this)); + if (id== Button.CONFIG_CORAL.ordinal()) FMLClientHandler.instance().showGuiScreen(new ConfigGuiCoral(this)); } } diff --git a/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterCoral.java b/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterCoral.java new file mode 100644 index 0000000..dfe9f01 --- /dev/null +++ b/src/main/java/mods/betterfoliage/client/render/impl/RenderBlockBetterCoral.java @@ -0,0 +1,96 @@ +package mods.betterfoliage.client.render.impl; + +import java.util.Random; + +import mods.betterfoliage.BetterFoliage; +import mods.betterfoliage.client.render.IRenderBlockDecorator; +import mods.betterfoliage.client.render.IconSet; +import mods.betterfoliage.client.render.RenderBlockAOBase; +import mods.betterfoliage.common.util.Double3; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.init.Blocks; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.gen.NoiseGeneratorSimplex; +import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.world.WorldEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class RenderBlockBetterCoral extends RenderBlockAOBase implements IRenderBlockDecorator { + + public IconSet coralCrustIcons = new IconSet("bettergrassandleaves", "better_crust_%d"); + public IconSet coralCrossIcons = new IconSet("bettergrassandleaves", "better_coral_%d"); + public NoiseGeneratorSimplex noise; + + public boolean isBlockAccepted(IBlockAccess blockAccess, int x, int y, int z, Block block, int original) { + if (!BetterFoliage.config.coralEnabled) return false; + if (block != Blocks.sand) return false; + int terrainVariation = MathHelper.floor_double((noise.func_151605_a(x * 0.1, z * 0.1) + 1.0) * 32.0); + return terrainVariation < BetterFoliage.config.coralPopulation.value; + } + + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + // store world for later use + blockAccess = world; + + // render sand block + setPassCounters(1); + setRenderBoundsFromBlock(block); + renderStandardBlock(block, x, y, z); + + Double3 blockCenter = new Double3(x + 0.5, y + 0.5, z + 0.5); + double offset = pRand[getSemiRandomFromPos(x, y, z, 6)] * BetterFoliage.config.coralVOffset.value; + double halfSize = BetterFoliage.config.coralSize.value * 0.5; + double halfCrustSize = BetterFoliage.config.coralCrustSize.value * 0.5; + + Tessellator.instance.setBrightness(getBrightness(block, x, y, z)); + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if (blockAccess.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ).getMaterial() != Material.water) continue; + if (blockAccess.isAirBlock(x + dir.offsetX, y + dir.offsetY + 1, z + dir.offsetZ)) continue; + + int variation = getSemiRandomFromPos(x, y, z, dir.ordinal()); + if (variation < BetterFoliage.config.coralChance.value) { + renderCoralCrust(blockCenter, dir, offset, halfCrustSize, coralCrustIcons.get(variation), variation); + renderCrossedSideQuads(blockCenter.add(new Double3(dir).scale(0.5)), dir, + halfSize, halfSize, + pRot[variation], BetterFoliage.config.coralHOffset.value, + coralCrossIcons.get(variation), 0, false); + } + } + + return true; + } + + protected void renderCoralCrust(Double3 blockCenter, ForgeDirection dir, double offset, double scale, IIcon icon, int uvRot) { + Double3 face1 = new Double3(faceDir1[dir.ordinal()]).scale(scale); + Double3 face2 = new Double3(faceDir2[dir.ordinal()]).scale(scale); + Double3 drawCenter = blockCenter.add(new Double3(dir).scale(0.5 + offset)); + if (Minecraft.isAmbientOcclusionEnabled()) { + setShadingForFace(dir); + renderQuadWithShading(icon, drawCenter, face1, face2, uvRot, faceAOPP, faceAONP, faceAONN, faceAOPN); + } else { + renderQuad(icon, drawCenter, face1, face2, uvRot); + } + } + + @SubscribeEvent + public void handleTextureReload(TextureStitchEvent.Pre event) { + if (event.map.getTextureType() != 0) return; + + coralCrustIcons.registerIcons(event.map); + coralCrossIcons.registerIcons(event.map); + BetterFoliage.log.info(String.format("Found %d coral crust textures", coralCrustIcons.numLoaded)); + BetterFoliage.log.info(String.format("Found %d coral textures", coralCrossIcons.numLoaded)); + } + + @SubscribeEvent + public void handleWorldLoad(WorldEvent.Load event) { + noise = new NoiseGeneratorSimplex(new Random(event.world.getWorldInfo().getSeed() + 2)); + } +} diff --git a/src/main/java/mods/betterfoliage/common/config/BetterFoliageConfig.java b/src/main/java/mods/betterfoliage/common/config/BetterFoliageConfig.java index 8e03e82..4728685 100644 --- a/src/main/java/mods/betterfoliage/common/config/BetterFoliageConfig.java +++ b/src/main/java/mods/betterfoliage/common/config/BetterFoliageConfig.java @@ -26,6 +26,9 @@ public class BetterFoliageConfig extends ConfigBase { @CfgElement(category="algae", key="enabled") public boolean algaeEnabled = true; + @CfgElement(category="coral", key="enabled") + public boolean coralEnabled = true; + @CfgElement(category="leaves", key="horizontalOffset") public OptionDouble leavesHOffset = new OptionDouble(0.0, 0.4, 0.025, 0.2); @@ -82,4 +85,22 @@ public class BetterFoliageConfig extends ConfigBase { @CfgElement(category="algae", key="chance") public OptionInteger algaeChance = new OptionInteger(0, 64, 1, 48); + + @CfgElement(category="coral", key="population") + public OptionInteger coralPopulation = new OptionInteger(0, 64, 1, 32); + + @CfgElement(category="coral", key="chance") + public OptionInteger coralChance = new OptionInteger(0, 64, 1, 32); + + @CfgElement(category="coral", key="verticalOffset") + public OptionDouble coralVOffset = new OptionDouble(0.0, 0.25, 0.025, 0.1); + + @CfgElement(category="coral", key="horizontalOffset") + public OptionDouble coralHOffset = new OptionDouble(0.0, 0.4, 0.025, 0.2); + + @CfgElement(category="coral", key="crustSize") + public OptionDouble coralCrustSize = new OptionDouble(0.75, 1.75, 0.05, 1.4); + + @CfgElement(category="coral", key="size") + public OptionDouble coralSize = new OptionDouble(0.25, 1.0, 0.05, 0.7); } diff --git a/src/main/resources/assets/betterfoliage/lang/en_US.lang b/src/main/resources/assets/betterfoliage/lang/en_US.lang index 38ba03d..e2e5d8e 100644 --- a/src/main/resources/assets/betterfoliage/lang/en_US.lang +++ b/src/main/resources/assets/betterfoliage/lang/en_US.lang @@ -12,6 +12,7 @@ message.betterfoliage.betterCactus=Better Cactus: %s message.betterfoliage.betterLilypad=Better Lilypad: %s message.betterfoliage.betterReed=Reeds: %s message.betterfoliage.betterAlgae=Algae: %s +message.betterfoliage.betterCoral=Coral: %s message.betterfoliage.size=Size message.betterfoliage.hOffset=H.Offset @@ -19,9 +20,12 @@ message.betterfoliage.vOffset=V.Offset message.betterfoliage.minHeight=Min.Height message.betterfoliage.maxHeight=Max.Height message.betterfoliage.flowerChance=Flower Chance -message.betterfoliage.reedChance=Reed Chance +message.betterfoliage.reedChance=Reed Population message.betterfoliage.leavesMode=Leaves Offset: %s message.betterfoliage.genShortgrass=Use generated: %s message.betterfoliage.leavesSkew=Skew message.betterfoliage.leavesTranslate=Translate -message.betterfoliage.algaeChance=Algae Chance \ No newline at end of file +message.betterfoliage.algaeChance=Algae Population +message.betterfoliage.crustSize=Crust Size +message.betterfoliage.coralChance=Coral Chance +message.betterfoliage.coralPopulation=Coral Population \ No newline at end of file