diff --git a/build.gradle b/build.gradle index 8021589..ff7fcc2 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ apply plugin: 'net.minecraftforge.gradle.forge' //Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -version = "0.5" +version = "0.6" group = "nl.requios.effortlessbuilding" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "effortlessbuilding" diff --git a/src/main/java/nl/requios/effortlessbuilding/Array.java b/src/main/java/nl/requios/effortlessbuilding/Array.java index a3e7a00..2aa40b2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/Array.java +++ b/src/main/java/nl/requios/effortlessbuilding/Array.java @@ -1,6 +1,5 @@ package nl.requios.effortlessbuilding; -import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -9,11 +8,7 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; -import net.minecraft.world.World; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.items.IItemHandler; -import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; import java.util.ArrayList; diff --git a/src/main/java/nl/requios/effortlessbuilding/BuildModifiers.java b/src/main/java/nl/requios/effortlessbuilding/BuildModifiers.java index 9504cd5..45f6d15 100644 --- a/src/main/java/nl/requios/effortlessbuilding/BuildModifiers.java +++ b/src/main/java/nl/requios/effortlessbuilding/BuildModifiers.java @@ -18,7 +18,8 @@ import nl.requios.effortlessbuilding.item.ItemRandomizerBag; import nl.requios.effortlessbuilding.network.BlockBrokenMessage; import nl.requios.effortlessbuilding.network.BlockPlacedMessage; -import java.util.*; +import java.util.ArrayList; +import java.util.List; public class BuildModifiers { @@ -125,9 +126,11 @@ public class BuildModifiers { List arrayCoordinates = Array.findCoordinates(player, startPos); coordinates.addAll(arrayCoordinates); coordinates.addAll(Mirror.findCoordinates(player, startPos)); - //get array for each coordinate + coordinates.addAll(RadialMirror.findCoordinates(player, startPos)); + //get mirror for each array coordinate for (BlockPos coordinate : arrayCoordinates) { coordinates.addAll(Mirror.findCoordinates(player, coordinate)); + coordinates.addAll(RadialMirror.findCoordinates(player, coordinate)); } return coordinates; @@ -160,12 +163,14 @@ public class BuildModifiers { List arrayBlockStates = Array.findBlockStates(player, startPos, blockState, itemStack, itemStacks); blockStates.addAll(arrayBlockStates); blockStates.addAll(Mirror.findBlockStates(player, startPos, blockState, itemStack, itemStacks)); - //add array for each mirror coordinate + blockStates.addAll(RadialMirror.findBlockStates(player, startPos, blockState, itemStack, itemStacks)); + //add mirror for each array coordinate List arrayCoordinates = Array.findCoordinates(player, startPos); for (int i = 0; i < arrayCoordinates.size(); i++) { BlockPos coordinate = arrayCoordinates.get(i); IBlockState blockState1 = arrayBlockStates.get(i); blockStates.addAll(Mirror.findBlockStates(player, coordinate, blockState1, itemStack, itemStacks)); + blockStates.addAll(RadialMirror.findBlockStates(player, coordinate, blockState1, itemStack, itemStacks)); } //Adjust blockstates for torches and ladders etc to place on a valid side @@ -183,6 +188,7 @@ public class BuildModifiers { public static boolean isEnabled(BuildSettingsManager.BuildSettings buildSettings, BlockPos startPos) { return Mirror.isEnabled(buildSettings.getMirrorSettings(), startPos) || Array.isEnabled(buildSettings.getArraySettings()) || + RadialMirror.isEnabled(buildSettings.getRadialMirrorSettings(), startPos) || buildSettings.doQuickReplace(); } diff --git a/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java b/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java index ff10181..e8d52ee 100644 --- a/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java +++ b/src/main/java/nl/requios/effortlessbuilding/BuildSettingsManager.java @@ -48,23 +48,39 @@ public class BuildSettingsManager { Mirror.MirrorSettings m = buildSettings.getMirrorSettings(); if (m.radius < 1) { m.radius = 1; - error += "Mirror size is too small. Size has been set to 1. "; + error += "Mirror size has to be at least 1. This has been corrected. "; } if (m.getReach() > maxReach) { m.radius = maxReach / 2; - error += "Mirror exceeds your maximum reach. Reach has been set to max. "; + error += "Mirror exceeds your maximum reach of " + (maxReach / 2) + ". Radius has been set to "+ (maxReach / 2) + ". "; } //Array settings Array.ArraySettings a = buildSettings.getArraySettings(); if (a.count < 0) { a.count = 0; - error += "Array count cannot be negative. Count has been set to 0. "; + error += "Array count may not be negative. It has been reset to 0."; } if (a.getReach() > maxReach) { a.count = 0; - error += "Array exceeds your maximum reach. Count has been set to 0. "; + error += "Array exceeds your maximum reach of " + maxReach + ". Array count has been reset to 0. "; + } + + //Radial mirror settings + RadialMirror.RadialMirrorSettings r = buildSettings.getRadialMirrorSettings(); + if (r.slices < 2) { + r.slices = 2; + error += "Radial mirror needs to have at least 2 slices. Slices has been set to 2."; + } + + if (r.radius < 1) { + r.radius = 1; + error += "Radial mirror radius has to be at least 1. This has been corrected. "; + } + if (r.getReach() > maxReach) { + r.radius = maxReach / 2; + error += "Radial mirror exceeds your maximum reach of " + (maxReach / 2) + ". Radius has been set to "+ (maxReach / 2) + ". "; } //Other @@ -81,6 +97,7 @@ public class BuildSettingsManager { public static class BuildSettings { private Mirror.MirrorSettings mirrorSettings; private Array.ArraySettings arraySettings; + private RadialMirror.RadialMirrorSettings radialMirrorSettings; private boolean quickReplace = false; private int reachUpgrade = 0; @@ -89,9 +106,11 @@ public class BuildSettingsManager { arraySettings = new Array.ArraySettings(); } - public BuildSettings(Mirror.MirrorSettings mirrorSettings, Array.ArraySettings arraySettings, boolean quickReplace, int reachUpgrade) { + public BuildSettings(Mirror.MirrorSettings mirrorSettings, Array.ArraySettings arraySettings, + RadialMirror.RadialMirrorSettings radialMirrorSettings, boolean quickReplace, int reachUpgrade) { this.mirrorSettings = mirrorSettings; this.arraySettings = arraySettings; + this.radialMirrorSettings = radialMirrorSettings; this.quickReplace = quickReplace; this.reachUpgrade = reachUpgrade; } @@ -112,6 +131,14 @@ public class BuildSettingsManager { this.arraySettings = arraySettings; } + public RadialMirror.RadialMirrorSettings getRadialMirrorSettings() { + return radialMirrorSettings; + } + + public void setRadialMirrorSettings(RadialMirror.RadialMirrorSettings radialMirrorSettings) { + this.radialMirrorSettings = radialMirrorSettings; + } + public boolean doQuickReplace() { return quickReplace; } diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java index 490b96f..99c0bdf 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java @@ -3,12 +3,10 @@ package nl.requios.effortlessbuilding; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; -import net.minecraft.item.crafting.CraftingManager; import net.minecraft.util.text.TextComponentString; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.config.Config; import net.minecraftforge.common.config.ConfigManager; -import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.SidedProxy; @@ -19,7 +17,7 @@ import net.minecraftforge.fml.common.event.FMLServerStartingEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; import net.minecraftforge.fml.relauncher.Side; -import nl.requios.effortlessbuilding.capability.*; +import nl.requios.effortlessbuilding.capability.BuildModifierCapabilityManager; import nl.requios.effortlessbuilding.command.CommandReach; import nl.requios.effortlessbuilding.gui.RandomizerBagGuiHandler; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; @@ -27,8 +25,8 @@ import nl.requios.effortlessbuilding.item.ItemReachUpgrade1; import nl.requios.effortlessbuilding.item.ItemReachUpgrade2; import nl.requios.effortlessbuilding.item.ItemReachUpgrade3; import nl.requios.effortlessbuilding.network.BlockBrokenMessage; -import nl.requios.effortlessbuilding.network.BuildSettingsMessage; import nl.requios.effortlessbuilding.network.BlockPlacedMessage; +import nl.requios.effortlessbuilding.network.BuildSettingsMessage; import nl.requios.effortlessbuilding.proxy.IProxy; import org.apache.logging.log4j.Logger; @@ -38,7 +36,7 @@ public class EffortlessBuilding { public static final String MODID = "effortlessbuilding"; public static final String NAME = "Effortless Building"; - public static final String VERSION = "0.5"; + public static final String VERSION = "0.6"; @Mod.Instance(EffortlessBuilding.MODID) public static EffortlessBuilding instance; diff --git a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java index edda012..e182218 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java @@ -6,11 +6,8 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.common.config.Config; import net.minecraftforge.common.config.ConfigManager; @@ -21,11 +18,9 @@ import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.fml.client.event.ConfigChangedEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; import nl.requios.effortlessbuilding.capability.BuildModifierCapabilityManager; import nl.requios.effortlessbuilding.helper.SurvivalHelper; -import java.util.ArrayList; import java.util.List; @Mod.EventBusSubscriber diff --git a/src/main/java/nl/requios/effortlessbuilding/Mirror.java b/src/main/java/nl/requios/effortlessbuilding/Mirror.java index cc0c986..7767673 100644 --- a/src/main/java/nl/requios/effortlessbuilding/Mirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/Mirror.java @@ -1,6 +1,9 @@ package nl.requios.effortlessbuilding; -import net.minecraft.block.*; +import net.minecraft.block.BlockDirectional; +import net.minecraft.block.BlockDispenser; +import net.minecraft.block.BlockSlab; +import net.minecraft.block.BlockStairs; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -8,12 +11,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; -import net.minecraft.world.World; -import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.items.IItemHandler; -import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; import java.util.ArrayList; @@ -175,7 +173,7 @@ public class Mirror { public static boolean isEnabled(MirrorSettings m, BlockPos startPos) { if (m == null || !m.enabled || (!m.mirrorX && !m.mirrorY && !m.mirrorZ)) return false; - //if within mirror distance, mirror + //within mirror distance if (startPos.getX() + 0.5 < m.position.x - m.radius || startPos.getX() + 0.5 > m.position.x + m.radius || startPos.getY() + 0.5 < m.position.y - m.radius || startPos.getY() + 0.5 > m.position.y + m.radius || startPos.getZ() + 0.5 < m.position.z - m.radius || startPos.getZ() + 0.5 > m.position.z + m.radius) diff --git a/src/main/java/nl/requios/effortlessbuilding/RadialMirror.java b/src/main/java/nl/requios/effortlessbuilding/RadialMirror.java new file mode 100644 index 0000000..d64dc68 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/RadialMirror.java @@ -0,0 +1,122 @@ +package nl.requios.effortlessbuilding; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.items.IItemHandler; +import nl.requios.effortlessbuilding.item.ItemRandomizerBag; + +import java.util.ArrayList; +import java.util.List; + +public class RadialMirror { + + public static class RadialMirrorSettings { + public boolean enabled = false; + public Vec3d position = new Vec3d(0.5, 64.5, 0.5); + public int slices = 4; + public boolean alternate = false; + public int radius = 20; + public boolean drawLines = true, drawPlanes = false; + + public RadialMirrorSettings() { + } + + public RadialMirrorSettings(boolean enabled, Vec3d position, int slices, boolean alternate, int radius, boolean drawLines, boolean drawPlanes) { + this.enabled = enabled; + this.position = position; + this.slices = slices; + this.alternate = alternate; + this.radius = radius; + this.drawLines = drawLines; + this.drawPlanes = drawPlanes; + } + + public int getReach() { + return radius * 2; + } + } + + public static List findCoordinates(EntityPlayer player, BlockPos startPos) { + List coordinates = new ArrayList<>(); + + //find radial mirror settings for the player + RadialMirrorSettings r = BuildSettingsManager.getBuildSettings(player).getRadialMirrorSettings(); + if (!isEnabled(r, startPos)) return coordinates; + + //get angle + float angle = 2f * ((float) Math.PI) / r.slices; + + Vec3d startVec = new Vec3d(startPos.getX() + 0.5f, startPos.getY() + 0.5f, startPos.getZ() + 0.5f); + Vec3d relStartVec = startVec.subtract(r.position); + + for (int i = 1; i < r.slices; i++) { + float curAngle = angle * i; + if (r.alternate) { + //TODO alternate + // get angle in slice + } + Vec3d relNewVec = relStartVec.rotateYaw(curAngle); + Vec3d newVec = r.position.add(relNewVec); + coordinates.add(new BlockPos(newVec)); + } + + return coordinates; + } + + public static List findBlockStates(EntityPlayer player, BlockPos startPos, IBlockState blockState, ItemStack itemStack, List itemStacks) { + List blockStates = new ArrayList<>(); + + //find radial mirror settings for the player that placed the block + RadialMirrorSettings r = BuildSettingsManager.getBuildSettings(player).getRadialMirrorSettings(); + if (!isEnabled(r, startPos)) return blockStates; + + + //get angle + float angle = 2f * ((float) Math.PI) / r.slices; + + Vec3d startVec = new Vec3d(startPos.getX() + 0.5f, startPos.getY() + 0.5f, startPos.getZ() + 0.5f); + Vec3d relStartVec = startVec.subtract(r.position); + + //Randomizer bag synergy + IItemHandler bagInventory = null; + if (!itemStack.isEmpty() && itemStack.getItem() instanceof ItemRandomizerBag) { + bagInventory = ItemRandomizerBag.getBagInventory(itemStack); + } + + for (int i = 1; i < r.slices; i++) { + Vec3d relNewVec = relStartVec.rotateYaw(angle * i); + Vec3d newVec = startVec.add(relNewVec); + + //Randomizer bag synergy + if (bagInventory != null) { + itemStack = ItemRandomizerBag.pickRandomStack(bagInventory); + blockState = BuildModifiers.getBlockStateFromItem(itemStack, player, startPos, EnumFacing.UP, new Vec3d(0, 0, 0), EnumHand.MAIN_HAND); + } + + //TODO rotate + + blockStates.add(blockState); + itemStacks.add(itemStack); + } + + return blockStates; + } + + public static boolean isEnabled(RadialMirrorSettings r, BlockPos startPos) { + if (r == null || !r.enabled) return false; + + //within mirror distance + if (startPos.getX() + 0.5 < r.position.x - r.radius || startPos.getX() + 0.5 > r.position.x + r.radius || + startPos.getY() + 0.5 < r.position.y - r.radius || startPos.getY() + 0.5 > r.position.y + r.radius || + startPos.getZ() + 0.5 < r.position.z - r.radius || startPos.getZ() + 0.5 > r.position.z + r.radius) + return false; + + return true; + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapabilityManager.java b/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapabilityManager.java index 3d38f91..9666079 100644 --- a/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapabilityManager.java +++ b/src/main/java/nl/requios/effortlessbuilding/capability/BuildModifierCapabilityManager.java @@ -14,6 +14,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import nl.requios.effortlessbuilding.Array; import nl.requios.effortlessbuilding.BuildSettingsManager.BuildSettings; import nl.requios.effortlessbuilding.Mirror; +import nl.requios.effortlessbuilding.RadialMirror; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -75,6 +76,17 @@ public class BuildModifierCapabilityManager { compound.setInteger("reachUpgrade", buildSettings.getReachUpgrade()); //compound.setBoolean("quickReplace", buildSettings.doQuickReplace()); dont save quickreplace + + //RADIAL MIRROR + RadialMirror.RadialMirrorSettings r = buildSettings.getRadialMirrorSettings(); + compound.setBoolean("radialMirrorEnabled", r.enabled); + compound.setDouble("radialMirrorPosX", r.position.x); + compound.setDouble("radialMirrorPosY", r.position.y); + compound.setDouble("radialMirrorPosZ", r.position.z); + compound.setInteger("radialMirrorSlices", r.slices); + compound.setBoolean("radialMirrorAlternate", r.alternate); + compound.setInteger("radialMirrorRadius", r.radius); + return compound; } @@ -103,7 +115,18 @@ public class BuildModifierCapabilityManager { //boolean quickReplace = compound.getBoolean("quickReplace"); //dont load quickreplace - BuildSettings buildSettings = new BuildSettings(mirrorSettings, arraySettings, false, reachUpgrade); + //RADIAL MIRROR + boolean radialMirrorEnabled = compound.getBoolean("radialMirrorEnabled"); + Vec3d radialMirrorPosition = new Vec3d(compound.getDouble("radialMirrorPosX"), compound.getDouble("radialMirrorPosY"), compound.getDouble("radialMirrorPosZ")); + int radialMirrorSlices = compound.getInteger("radialMirrorSlices"); + boolean radialMirrorAlternate = compound.getBoolean("radialMirrorAlternate"); + int radialMirrorRadius = compound.getInteger("radialMirrorRadius"); + boolean radialMirrorDrawLines = compound.getBoolean("radialMirrorDrawLines"); + boolean radialMirrorDrawPlanes = compound.getBoolean("radialMirrorDrawPlanes"); + RadialMirror.RadialMirrorSettings radialMirrorSettings = new RadialMirror.RadialMirrorSettings(radialMirrorEnabled, radialMirrorPosition, + radialMirrorSlices, radialMirrorAlternate, radialMirrorRadius, radialMirrorDrawLines, radialMirrorDrawPlanes); + + BuildSettings buildSettings = new BuildSettings(mirrorSettings, arraySettings, radialMirrorSettings, false, reachUpgrade); instance.setBuildModifierData(buildSettings); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/ArraySettingsGui.java b/src/main/java/nl/requios/effortlessbuilding/gui/ArraySettingsGui.java index af587c6..2b528b6 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/ArraySettingsGui.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/ArraySettingsGui.java @@ -168,14 +168,14 @@ public class ArraySettingsGui extends GuiCollapsibleScrollEntry { try { arrayOffset = new BlockPos(textArrayOffsetX.getNumber(), textArrayOffsetY.getNumber(), textArrayOffsetZ.getNumber()); } catch (NumberFormatException | NullPointerException ex) { - EffortlessBuilding.log(mc.player, "Array offset not valid."); + EffortlessBuilding.log(mc.player, "Array offset not a valid number."); } int arrayCount = 5; try { arrayCount = (int) textArrayCount.getNumber(); } catch (NumberFormatException | NullPointerException ex) { - EffortlessBuilding.log(mc.player, "Array count not valid."); + EffortlessBuilding.log(mc.player, "Array count not a valid number."); } return new Array.ArraySettings(arrayEnabled, arrayOffset, arrayCount); diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/GuiNumberField.java b/src/main/java/nl/requios/effortlessbuilding/gui/GuiNumberField.java index 4c41027..ac0fd2a 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/GuiNumberField.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/GuiNumberField.java @@ -3,9 +3,6 @@ package nl.requios.effortlessbuilding.gui; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.*; import net.minecraft.util.text.TextFormatting; -import nl.requios.effortlessbuilding.EffortlessBuilding; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; import java.io.IOException; import java.text.DecimalFormat; diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/MirrorSettingsGui.java b/src/main/java/nl/requios/effortlessbuilding/gui/MirrorSettingsGui.java index 78d0777..4ef30d2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/MirrorSettingsGui.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/MirrorSettingsGui.java @@ -162,7 +162,7 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry { buttonMirrorX.y = yy; buttonMirrorY.y = yy; buttonMirrorZ.y = yy; - fontRenderer.drawString("Reach", left + 176 + offset, yy + 2, 0xFFFFFF, true); + fontRenderer.drawString("Radius", left + 176 + offset, yy + 2, 0xFFFFFF, true); textMirrorRadius.y = yy - 3; yy = y + 72; @@ -266,7 +266,7 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry { try { mirrorPos = new Vec3d(textMirrorPosX.getNumber(), textMirrorPosY.getNumber(), textMirrorPosZ.getNumber()); } catch (NumberFormatException | NullPointerException ex) { - EffortlessBuilding.log(mc.player, "Mirror position not valid."); + EffortlessBuilding.log(mc.player, "Mirror position not a valid number."); } boolean mirrorX = buttonMirrorX.isChecked(); @@ -277,7 +277,7 @@ public class MirrorSettingsGui extends GuiCollapsibleScrollEntry { try { mirrorRadius = (int) textMirrorRadius.getNumber(); } catch (NumberFormatException | NullPointerException ex) { - EffortlessBuilding.log(mc.player, "Mirror radius not valid."); + EffortlessBuilding.log(mc.player, "Mirror radius not a valid number."); } return new Mirror.MirrorSettings(mirrorEnabled, mirrorPos, mirrorX, mirrorY, mirrorZ, mirrorRadius, drawLines, drawPlanes); diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/RadialMirrorSettingsGui.java b/src/main/java/nl/requios/effortlessbuilding/gui/RadialMirrorSettingsGui.java new file mode 100644 index 0000000..7573416 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/gui/RadialMirrorSettingsGui.java @@ -0,0 +1,302 @@ +package nl.requios.effortlessbuilding.gui; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fml.client.config.GuiCheckBox; +import nl.requios.effortlessbuilding.BuildSettingsManager; +import nl.requios.effortlessbuilding.EffortlessBuilding; +import nl.requios.effortlessbuilding.RadialMirror; +import nl.requios.effortlessbuilding.helper.ReachHelper; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class RadialMirrorSettingsGui extends GuiCollapsibleScrollEntry { + + protected static final ResourceLocation BUILDING_ICONS = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/building_icons.png"); + + protected List radialMirrorButtonList = new ArrayList<>(); + protected List radialMirrorIconButtonList = new ArrayList<>(); + protected List radialMirrorNumberFieldList = new ArrayList<>(); + + private GuiNumberField textRadialMirrorPosX, textRadialMirrorPosY, textRadialMirrorPosZ, textRadialMirrorSlices, textRadialMirrorRadius; + private GuiCheckBox buttonRadialMirrorEnabled, buttonRadialMirrorAlternate; + private GuiIconButton buttonCurrentPosition, buttonToggleOdd, buttonDrawPlanes, buttonDrawLines; + private boolean drawPlanes, drawLines, toggleOdd; + + public RadialMirrorSettingsGui(GuiScrollPane scrollPane) { + super(scrollPane); + } + + @Override + public int initGui(int id, List buttonList) { + id = super.initGui(id, buttonList); + + int y = top - 2; + buttonRadialMirrorEnabled = new GuiCheckBox(id++, left - 15 + 8, y, "", false); + buttonList.add(buttonRadialMirrorEnabled); + + y = top + 18; + textRadialMirrorPosX = new GuiNumberField(id++, id++, id++, fontRenderer, buttonList, left + 58, y, 62, 18); + textRadialMirrorPosX.setNumber(0); + textRadialMirrorPosX.setTooltip( + Arrays.asList("The position of the radial mirror.", TextFormatting.GRAY + "For odd numbered builds add 0.5.")); + radialMirrorNumberFieldList.add(textRadialMirrorPosX); + + textRadialMirrorPosY = new GuiNumberField(id++, id++, id++, fontRenderer, buttonList, left + 138, y, 62, 18); + textRadialMirrorPosY.setNumber(64); + textRadialMirrorPosY.setTooltip(Arrays.asList("The position of the radial mirror.", TextFormatting.GRAY + "For odd numbered builds add 0.5.")); + radialMirrorNumberFieldList.add(textRadialMirrorPosY); + + textRadialMirrorPosZ = new GuiNumberField(id++, id++, id++, fontRenderer, buttonList, left + 218, y, 62, 18); + textRadialMirrorPosZ.setNumber(0); + textRadialMirrorPosZ.setTooltip(Arrays.asList("The position of the radial mirror.", TextFormatting.GRAY + "For odd numbered builds add 0.5.")); + radialMirrorNumberFieldList.add(textRadialMirrorPosZ); + + y = top + 47; + textRadialMirrorSlices = new GuiNumberField(id++, id++, id++, fontRenderer, buttonList, left + 55, y, 50, 18); + textRadialMirrorSlices.setNumber(4); + textRadialMirrorSlices.setTooltip(Arrays.asList("The number of repeating slices.", TextFormatting.GRAY + "Minimally 2.")); + radialMirrorNumberFieldList.add(textRadialMirrorSlices); + + textRadialMirrorRadius = new GuiNumberField(id++, id++, id++, fontRenderer, buttonList, left + 218, y, 62, 18); + textRadialMirrorRadius.setNumber(50); + //TODO change to diameter (remove /2) + textRadialMirrorRadius.setTooltip(Arrays.asList("How far the radial mirror reaches from its center position.", + TextFormatting.GRAY + "Max: " + TextFormatting.GOLD + ReachHelper.getMaxReach(mc.player) / 2, + TextFormatting.GRAY + "Upgradeable in survival with reach upgrades.")); + radialMirrorNumberFieldList.add(textRadialMirrorRadius); + + + y = top + 72; + buttonCurrentPosition = new GuiIconButton(id++, left + 5, y, 0, 0, BUILDING_ICONS); + buttonCurrentPosition.setTooltip("Set radial mirror position to current player position"); + radialMirrorIconButtonList.add(buttonCurrentPosition); + + buttonToggleOdd = new GuiIconButton(id++, left + 35, y, 0, 20, BUILDING_ICONS); + buttonToggleOdd.setTooltip(Arrays.asList("Set radial mirror position to middle of block", "for odd numbered builds")); + radialMirrorIconButtonList.add(buttonToggleOdd); + + buttonDrawLines = new GuiIconButton(id++, left + 65, y, 0, 40, BUILDING_ICONS); + buttonDrawLines.setTooltip("Show lines"); + radialMirrorIconButtonList.add(buttonDrawLines); + + buttonDrawPlanes = new GuiIconButton(id++, left + 95, y, 0, 60, BUILDING_ICONS); + buttonDrawPlanes.setTooltip("Show area"); + radialMirrorIconButtonList.add(buttonDrawPlanes); + + y = top + 76; + buttonRadialMirrorAlternate = new GuiCheckBox(id++, left + 140, y, " Alternate", false); + radialMirrorButtonList.add(buttonRadialMirrorAlternate); + + BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(mc.player); + if (buildSettings != null) { + RadialMirror.RadialMirrorSettings r = buildSettings.getRadialMirrorSettings(); + buttonRadialMirrorEnabled.setIsChecked(r.enabled); + textRadialMirrorPosX.setNumber(r.position.x); + textRadialMirrorPosY.setNumber(r.position.y); + textRadialMirrorPosZ.setNumber(r.position.z); + textRadialMirrorSlices.setNumber(r.slices); + buttonRadialMirrorAlternate.setIsChecked(r.alternate); + textRadialMirrorRadius.setNumber(r.radius); + drawLines = r.drawLines; + drawPlanes = r.drawPlanes; + buttonDrawLines.setUseAlternateIcon(drawLines); + buttonDrawPlanes.setUseAlternateIcon(drawPlanes); + buttonDrawLines.setTooltip(drawLines ? "Hide lines" : "Show lines"); + buttonDrawPlanes.setTooltip(drawPlanes ? "Hide area" : "Show area"); + if (textRadialMirrorPosX.getNumber() == Math.floor(textRadialMirrorPosX.getNumber())) { + toggleOdd = false; + buttonToggleOdd.setTooltip(Arrays.asList("Set radial mirror position to middle of block", "for odd numbered builds")); + } else { + toggleOdd = true; + buttonToggleOdd.setTooltip(Arrays.asList("Set radial mirror position to corner of block", "for even numbered builds")); + } + buttonToggleOdd.setUseAlternateIcon(toggleOdd); + } + + buttonList.addAll(radialMirrorButtonList); + buttonList.addAll(radialMirrorIconButtonList); + + setCollapsed(!buttonRadialMirrorEnabled.isChecked()); + + return id; + } + + @Override + public void updateScreen() { + super.updateScreen(); + radialMirrorNumberFieldList.forEach(GuiNumberField::update); + } + + @Override + public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, + boolean isSelected, float partialTicks) { + super.drawEntry(slotIndex, x, y, listWidth, slotHeight, mouseX, mouseY, isSelected, partialTicks); + + int yy = y; + int offset = 8; + + buttonRadialMirrorEnabled.drawButton(this.mc, mouseX, mouseY, partialTicks); + if (buttonRadialMirrorEnabled.isChecked()) { + buttonRadialMirrorEnabled.y = yy; + fontRenderer.drawString("Radial mirror enabled", left + offset, yy + 2, 0xFFFFFF, true); + + yy = y + 18; + fontRenderer.drawString("Position", left + offset, yy + 5, 0xFFFFFF, true); + fontRenderer.drawString("X", left + 40 + offset, yy + 5, 0xFFFFFF, true); + textRadialMirrorPosX.y = yy; + fontRenderer.drawString("Y", left + 120 + offset, yy + 5, 0xFFFFFF, true); + textRadialMirrorPosY.y = yy; + fontRenderer.drawString("Z", left + 200 + offset, yy + 5, 0xFFFFFF, true); + textRadialMirrorPosZ.y = yy; + + yy = y + 50; + fontRenderer.drawString("Slices", left + offset, yy + 2, 0xFFFFFF, true); + textRadialMirrorSlices.y = yy - 3; + fontRenderer.drawString("Radius", left + 176 + offset, yy + 2, 0xFFFFFF, true); + textRadialMirrorRadius.y = yy - 3; + + yy = y + 72; + buttonCurrentPosition.y = yy; + buttonToggleOdd.y = yy; + buttonDrawLines.y = yy; + buttonDrawPlanes.y = yy; + + yy = y + 76; + buttonRadialMirrorAlternate.y = yy; + + radialMirrorButtonList.forEach(button -> button.drawButton(this.mc, mouseX, mouseY, partialTicks)); + radialMirrorIconButtonList.forEach(button -> button.drawButton(this.mc, mouseX, mouseY, partialTicks)); + radialMirrorNumberFieldList + .forEach(numberField -> numberField.drawNumberField(this.mc, mouseX, mouseY, partialTicks)); + } else { + buttonRadialMirrorEnabled.y = yy; + fontRenderer.drawString("Radial mirror disabled", left + offset, yy + 2, 0x999999, true); + } + + } + + public void drawTooltip(GuiScreen guiScreen, int mouseX, int mouseY) { + //Draw tooltips last + if (buttonRadialMirrorEnabled.isChecked()) + { + radialMirrorIconButtonList.forEach(iconButton -> iconButton.drawTooltip(scrollPane.parent, mouseX, mouseY)); + radialMirrorNumberFieldList.forEach(numberField -> numberField.drawTooltip(scrollPane.parent, mouseX, mouseY)); + } + } + + @Override + public void updatePosition(int slotIndex, int x, int y, float partialTicks) { + super.updatePosition(slotIndex, x, y, partialTicks); + } + + @Override + public void keyTyped(char typedChar, int keyCode) throws IOException { + super.keyTyped(typedChar, keyCode); + for (GuiNumberField numberField : radialMirrorNumberFieldList) { + numberField.keyTyped(typedChar, keyCode); + } + } + + @Override + public boolean mousePressed(int slotIndex, int mouseX, int mouseY, int mouseEvent, int relativeX, int relativeY) { + super.mousePressed(slotIndex, mouseX, mouseY, mouseEvent, relativeX, relativeY); + radialMirrorNumberFieldList.forEach(numberField -> numberField.mouseClicked(mouseX, mouseY, mouseEvent)); + + boolean insideRadialMirrorEnabledLabel = mouseX >= left && mouseX < right && relativeY >= -2 && relativeY < 12; + + if (insideRadialMirrorEnabledLabel) { + buttonRadialMirrorEnabled.setIsChecked(!buttonRadialMirrorEnabled.isChecked()); + buttonRadialMirrorEnabled.playPressSound(this.mc.getSoundHandler()); + actionPerformed(buttonRadialMirrorEnabled); + } + + return true; + } + + @Override + public void actionPerformed(GuiButton button) { + super.actionPerformed(button); + if (button == buttonRadialMirrorEnabled) { + setCollapsed(!buttonRadialMirrorEnabled.isChecked()); + } + if (button == buttonCurrentPosition) { + Vec3d pos = new Vec3d(Math.floor(mc.player.posX) + 0.5, Math.floor(mc.player.posY) + 0.5, Math.floor(mc.player.posZ) + 0.5); + textRadialMirrorPosX.setNumber(pos.x); + textRadialMirrorPosY.setNumber(pos.y); + textRadialMirrorPosZ.setNumber(pos.z); + } + if (button == buttonToggleOdd) { + toggleOdd = !toggleOdd; + buttonToggleOdd.setUseAlternateIcon(toggleOdd); + if (toggleOdd) { + buttonToggleOdd.setTooltip(Arrays.asList("Set mirror position to corner of block", "for even numbered builds")); + textRadialMirrorPosX.setNumber(textRadialMirrorPosX.getNumber() + 0.5); + textRadialMirrorPosY.setNumber(textRadialMirrorPosY.getNumber() + 0.5); + textRadialMirrorPosZ.setNumber(textRadialMirrorPosZ.getNumber() + 0.5); + } else { + buttonToggleOdd.setTooltip(Arrays.asList("Set mirror position to middle of block", "for odd numbered builds")); + textRadialMirrorPosX.setNumber(Math.floor(textRadialMirrorPosX.getNumber())); + textRadialMirrorPosY.setNumber(Math.floor(textRadialMirrorPosY.getNumber())); + textRadialMirrorPosZ.setNumber(Math.floor(textRadialMirrorPosZ.getNumber())); + } + } + if (button == buttonDrawLines) { + drawLines = !drawLines; + buttonDrawLines.setUseAlternateIcon(drawLines); + buttonDrawLines.setTooltip(drawLines ? "Hide lines" : "Show lines"); + } + if (button == buttonDrawPlanes) { + drawPlanes = !drawPlanes; + buttonDrawPlanes.setUseAlternateIcon(drawPlanes); + buttonDrawPlanes.setTooltip(drawPlanes ? "Hide area" : "Show area"); + } + radialMirrorNumberFieldList.forEach(numberField -> numberField.actionPerformed(button)); + } + + public RadialMirror.RadialMirrorSettings getRadialMirrorSettings() { + boolean radialMirrorEnabled = buttonRadialMirrorEnabled.isChecked(); + + Vec3d radialMirrorPos = new Vec3d(0, 64, 0); + try { + radialMirrorPos = new Vec3d(textRadialMirrorPosX.getNumber(), textRadialMirrorPosY.getNumber(), textRadialMirrorPosZ + .getNumber()); + } catch (NumberFormatException | NullPointerException ex) { + EffortlessBuilding.log(mc.player, "Radial mirror position not a valid number."); + } + + int radialMirrorSlices = 4; + try { + radialMirrorSlices = (int) textRadialMirrorSlices.getNumber(); + } catch (NumberFormatException | NullPointerException ex) { + EffortlessBuilding.log(mc.player, "Radial mirror slices not a valid number."); + } + + boolean radialMirrorAlternate = buttonRadialMirrorAlternate.isChecked(); + + int radialMirrorRadius = 50; + try { + radialMirrorRadius = (int) textRadialMirrorRadius.getNumber(); + } catch (NumberFormatException | NullPointerException ex) { + EffortlessBuilding.log(mc.player, "Mirror radius not a valid number."); + } + + return new RadialMirror.RadialMirrorSettings(radialMirrorEnabled, radialMirrorPos, radialMirrorSlices, radialMirrorAlternate, radialMirrorRadius, drawLines, drawPlanes); + } + + @Override + protected String getName() { + return "Radial mirror"; + } + + @Override + protected int getExpandedHeight() { + return 100; + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagContainer.java b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagContainer.java index 50d51db..7dec5ae 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagContainer.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagContainer.java @@ -4,7 +4,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.ClickType; import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagGuiHandler.java b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagGuiHandler.java index e0b0998..ded862c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagGuiHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagGuiHandler.java @@ -1,7 +1,6 @@ package nl.requios.effortlessbuilding.gui; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.EnumHand; import net.minecraft.world.World; import net.minecraftforge.fml.common.network.IGuiHandler; import net.minecraftforge.fml.relauncher.Side; diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java b/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java index 778e863..ddc379d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/SettingsGui.java @@ -2,10 +2,7 @@ package nl.requios.effortlessbuilding.gui; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; -import nl.requios.effortlessbuilding.Array; -import nl.requios.effortlessbuilding.BuildSettingsManager; -import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.Mirror; +import nl.requios.effortlessbuilding.*; import nl.requios.effortlessbuilding.network.BuildSettingsMessage; import nl.requios.effortlessbuilding.proxy.ClientProxy; @@ -18,6 +15,7 @@ public class SettingsGui extends GuiScreen { private MirrorSettingsGui mirrorSettingsGui; private ArraySettingsGui arraySettingsGui; + private RadialMirrorSettingsGui radialMirrorSettingsGui; @Override //Create buttons and labels and add them to buttonList/labelList @@ -32,6 +30,9 @@ public class SettingsGui extends GuiScreen { arraySettingsGui = new ArraySettingsGui(scrollPane); scrollPane.listEntries.add(arraySettingsGui); + radialMirrorSettingsGui = new RadialMirrorSettingsGui(scrollPane); + scrollPane.listEntries.add(radialMirrorSettingsGui); + id = scrollPane.initGui(id, buttonList); //Close button @@ -110,11 +111,13 @@ public class SettingsGui extends GuiScreen { //save everything Mirror.MirrorSettings m = mirrorSettingsGui.getMirrorSettings(); Array.ArraySettings a = arraySettingsGui.getArraySettings(); + RadialMirror.RadialMirrorSettings r = radialMirrorSettingsGui.getRadialMirrorSettings(); BuildSettingsManager.BuildSettings buildSettings = BuildSettingsManager.getBuildSettings(mc.player); if (buildSettings == null) buildSettings = new BuildSettingsManager.BuildSettings(); buildSettings.setMirrorSettings(m); buildSettings.setArraySettings(a); + buildSettings.setRadialMirrorSettings(r); //Sanitize String error = BuildSettingsManager.sanitize(buildSettings, mc.player); diff --git a/src/main/java/nl/requios/effortlessbuilding/helper/RenderHelper.java b/src/main/java/nl/requios/effortlessbuilding/helper/RenderHelper.java index ae16909..4162366 100644 --- a/src/main/java/nl/requios/effortlessbuilding/helper/RenderHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/helper/RenderHelper.java @@ -1,6 +1,5 @@ package nl.requios.effortlessbuilding.helper; -import com.google.common.collect.Maps; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; @@ -11,14 +10,10 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemTool; import net.minecraft.util.EnumFacing; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.*; import net.minecraft.world.IWorldEventListener; import net.minecraft.world.World; import net.minecraftforge.client.event.RenderWorldLastEvent; @@ -27,7 +22,6 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.relauncher.Side; import nl.requios.effortlessbuilding.*; import nl.requios.effortlessbuilding.item.ItemRandomizerBag; -import nl.requios.effortlessbuilding.item.ItemReachUpgrade1; import nl.requios.effortlessbuilding.proxy.ClientProxy; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; @@ -36,7 +30,6 @@ import org.lwjgl.util.Color; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -import java.util.Map; @Mod.EventBusSubscriber(Side.CLIENT) public class RenderHelper implements IWorldEventListener { @@ -44,6 +37,7 @@ public class RenderHelper implements IWorldEventListener { private static final Color colorX = new Color(255, 72, 52); private static final Color colorY = new Color(67, 204, 51); private static final Color colorZ = new Color(52, 247, 255); + private static final Color colorRadial = new Color(52, 247, 255); private static final int lineAlpha = 200; private static final int planeAlpha = 75; private static final Vec3d epsilon = new Vec3d(0.001, 0.001, 0.001); //prevents z-fighting @@ -130,8 +124,8 @@ public class RenderHelper implements IWorldEventListener { begin(event.getPartialTicks()); - //Mirror lines and areas beginLines(); + //Mirror lines and areas Mirror.MirrorSettings m = buildSettings.getMirrorSettings(); if (m != null && m.enabled && (m.mirrorX || m.mirrorY || m.mirrorZ)) { @@ -143,7 +137,7 @@ public class RenderHelper implements IWorldEventListener { Vec3d posA = new Vec3d(pos.x, pos.y - radius, pos.z - radius); Vec3d posB = new Vec3d(pos.x, pos.y + radius, pos.z + radius); - drawMirrorPlane(posA, posB, colorX, m.drawLines, m.drawPlanes); + drawMirrorPlane(posA, posB, colorX, m.drawLines, m.drawPlanes, true); } if (m.mirrorY) { @@ -157,7 +151,7 @@ public class RenderHelper implements IWorldEventListener { Vec3d posA = new Vec3d(pos.x - radius, pos.y - radius, pos.z); Vec3d posB = new Vec3d(pos.x + radius, pos.y + radius, pos.z); - drawMirrorPlane(posA, posB, colorZ, m.drawLines, m.drawPlanes); + drawMirrorPlane(posA, posB, colorZ, m.drawLines, m.drawPlanes, true); } //Draw axis coordinated colors if two or more axes are enabled @@ -167,6 +161,26 @@ public class RenderHelper implements IWorldEventListener { drawMirrorLines(m); } } + + //Radial mirror lines and areas + RadialMirror.RadialMirrorSettings r = buildSettings.getRadialMirrorSettings(); + if (r != null && r.enabled) + { + Vec3d pos = r.position.add(epsilon); + int radius = r.radius; + + float angle = 2f * ((float) Math.PI) / r.slices; + Vec3d relStartVec = new Vec3d(radius, 0, 0); + + for (int i = 0; i < r.slices; i++) { + Vec3d relNewVec = relStartVec.rotateYaw(angle * i); + Vec3d newVec = pos.add(relNewVec); + + Vec3d posA = new Vec3d(pos.x, pos.y - radius, pos.z); + Vec3d posB = new Vec3d(newVec.x, pos.y + radius, newVec.z); + drawMirrorPlane(posA, posB, colorRadial, r.drawLines, r.drawPlanes, false); + } + } endLines(); //Render block previews @@ -256,7 +270,7 @@ public class RenderHelper implements IWorldEventListener { //----Mirror---- - public static void drawMirrorPlane(Vec3d posA, Vec3d posB, Color c, boolean drawLines, boolean drawPlanes) { + public static void drawMirrorPlane(Vec3d posA, Vec3d posB, Color c, boolean drawLines, boolean drawPlanes, boolean drawVerticalLines) { GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); Tessellator tessellator = Tessellator.getInstance(); @@ -279,8 +293,10 @@ public class RenderHelper implements IWorldEventListener { bufferBuilder.pos(posA.x, middle.y, posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); bufferBuilder.pos(posB.x, middle.y, posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); - bufferBuilder.pos(middle.x, posA.y, middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); - bufferBuilder.pos(middle.x, posB.y, middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + if (drawVerticalLines) { + bufferBuilder.pos(middle.x, posA.y, middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + bufferBuilder.pos(middle.x, posB.y, middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + } tessellator.draw(); } diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ItemReachUpgrade1.java b/src/main/java/nl/requios/effortlessbuilding/item/ItemReachUpgrade1.java index d1f6c1c..b3b2ad3 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ItemReachUpgrade1.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ItemReachUpgrade1.java @@ -9,7 +9,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.*; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildSettingsManager; import nl.requios.effortlessbuilding.EffortlessBuilding; diff --git a/src/main/java/nl/requios/effortlessbuilding/network/BuildSettingsMessage.java b/src/main/java/nl/requios/effortlessbuilding/network/BuildSettingsMessage.java index c44e385..76906a7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/BuildSettingsMessage.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/BuildSettingsMessage.java @@ -8,11 +8,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import nl.requios.effortlessbuilding.Array; -import nl.requios.effortlessbuilding.BuildSettingsManager; +import nl.requios.effortlessbuilding.*; import nl.requios.effortlessbuilding.BuildSettingsManager.BuildSettings; -import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.Mirror; public class BuildSettingsMessage implements IMessage { @@ -51,6 +48,18 @@ public class BuildSettingsMessage implements IMessage { buf.writeBoolean(buildSettings.doQuickReplace()); buf.writeInt(buildSettings.getReachUpgrade()); + + //RADIAL MIRROR + RadialMirror.RadialMirrorSettings r = buildSettings.getRadialMirrorSettings(); + buf.writeBoolean(r.enabled); + buf.writeDouble(r.position.x); + buf.writeDouble(r.position.y); + buf.writeDouble(r.position.z); + buf.writeInt(r.slices); + buf.writeBoolean(r.alternate); + buf.writeInt(r.radius); + buf.writeBoolean(r.drawLines); + buf.writeBoolean(r.drawPlanes); } @Override @@ -76,7 +85,18 @@ public class BuildSettingsMessage implements IMessage { int reachUpgrade = buf.readInt(); - buildSettings = new BuildSettings(m, a, quickReplace, reachUpgrade); + //RADIAL MIRROR + boolean radialMirrorEnabled = buf.readBoolean(); + Vec3d radialMirrorPosition = new Vec3d(buf.readDouble(), buf.readDouble(), buf.readDouble()); + int radialMirrorSlices = buf.readInt(); + boolean radialMirrorAlternate = buf.readBoolean(); + int radialMirrorRadius = buf.readInt(); + boolean radialMirrorDrawLines = buf.readBoolean(); + boolean radialMirrorDrawPlanes = buf.readBoolean(); + RadialMirror.RadialMirrorSettings r = new RadialMirror.RadialMirrorSettings(radialMirrorEnabled, radialMirrorPosition, radialMirrorSlices, + radialMirrorAlternate, radialMirrorRadius, radialMirrorDrawLines, radialMirrorDrawPlanes); + + buildSettings = new BuildSettings(m, a, r, quickReplace, reachUpgrade); } // The params of the IMessageHandler are diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java index 69d18d6..c298cde 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -17,15 +17,16 @@ import net.minecraft.util.IThreadListener; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.TextFormatting; -import net.minecraft.world.World; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.event.*; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -33,11 +34,9 @@ import net.minecraftforge.fml.common.gameevent.InputEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import net.minecraftforge.fml.relauncher.Side; -import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.BuildModifiers; import nl.requios.effortlessbuilding.BuildSettingsManager; import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.command.CommandReach; import nl.requios.effortlessbuilding.gui.SettingsGui; import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.RenderHelper; diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java index 6d20174..ada60ea 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java @@ -8,7 +8,6 @@ import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLServerStartingEvent; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import nl.requios.effortlessbuilding.command.CommandReach; public class ServerProxy implements IProxy {