diff --git a/src/main/java/nl/requios/effortlessbuilding/BuildConfig.java b/src/main/java/nl/requios/effortlessbuilding/BuildConfig.java index 6b882e4..43eccaa 100644 --- a/src/main/java/nl/requios/effortlessbuilding/BuildConfig.java +++ b/src/main/java/nl/requios/effortlessbuilding/BuildConfig.java @@ -53,6 +53,16 @@ public class BuildConfig { @RangeInt(min = 0, max = 200) public int miningTimePercentage = 50; + @Comment({"Determines what blocks can be replaced in survival.", + "-1: only blocks that can be harvested by hand (default)", + "0: blocks that can be harvested with wooden or gold tools", + "1: blocks that can be harvested with stone tools", + "2: blocks that can be harvested with iron tools", + "3: blocks that can be harvested with diamond tools", + }) + @RangeInt(min = -1, max = 3) + public int quickReplaceMiningLevel = -1; + @Comment({"How many placements are remembered for the undo functionality."}) @RequiresMcRestart public int undoStackSize = 5; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java index b34687c..2ad99ec 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java @@ -6,6 +6,7 @@ import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import nl.requios.effortlessbuilding.EffortlessBuilding; +import nl.requios.effortlessbuilding.buildmode.ModeOptions.ActionEnum; import nl.requios.effortlessbuilding.buildmodifier.*; import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.helper.ReachHelper; @@ -26,22 +27,24 @@ public class BuildModes { public static Dictionary currentlyBreakingServer = new Hashtable<>(); public enum BuildModeEnum { - NORMAL("effortlessbuilding.mode.normal", new Normal()), - NORMAL_PLUS("effortlessbuilding.mode.normal_plus", new NormalPlus()), - LINE("effortlessbuilding.mode.line", new Line()), - WALL("effortlessbuilding.mode.wall", new Wall()), - FLOOR("effortlessbuilding.mode.floor", new Floor()), - DIAGONAL_LINE("effortlessbuilding.mode.diagonal_line", new DiagonalLine()), - DIAGONAL_WALL("effortlessbuilding.mode.diagonal_wall", new DiagonalWall()), - SLOPE_FLOOR("effortlessbuilding.mode.slope_floor", new SlopeFloor()), - CUBE("effortlessbuilding.mode.cube", new Cube()); + NORMAL("effortlessbuilding.mode.normal", new Normal(), new ActionEnum[]{}), + NORMAL_PLUS("effortlessbuilding.mode.normal_plus", new NormalPlus(), new ActionEnum[]{ActionEnum.NORMAL_SPEED, ActionEnum.FAST_SPEED}), + LINE("effortlessbuilding.mode.line", new Line(), new ActionEnum[]{ActionEnum.THICKNESS_1, ActionEnum.THICKNESS_3, ActionEnum.THICKNESS_5}), + WALL("effortlessbuilding.mode.wall", new Wall(), new ActionEnum[]{ActionEnum.FULL, ActionEnum.HOLLOW}), + FLOOR("effortlessbuilding.mode.floor", new Floor(), new ActionEnum[]{ActionEnum.FULL, ActionEnum.HOLLOW}), + DIAGONAL_LINE("effortlessbuilding.mode.diagonal_line", new DiagonalLine(), new ActionEnum[]{ActionEnum.THICKNESS_1, ActionEnum.THICKNESS_3, ActionEnum.THICKNESS_5}), + DIAGONAL_WALL("effortlessbuilding.mode.diagonal_wall", new DiagonalWall(), new ActionEnum[]{ActionEnum.FULL, ActionEnum.HOLLOW}), + SLOPE_FLOOR("effortlessbuilding.mode.slope_floor", new SlopeFloor(), new ActionEnum[]{ActionEnum.SHORT_EDGE, ActionEnum.LONG_EDGE}), + CUBE("effortlessbuilding.mode.cube", new Cube(), new ActionEnum[]{ActionEnum.CUBE_FULL, ActionEnum.CUBE_HOLLOW, ActionEnum.CUBE_SKELETON}); public String name; public IBuildMode instance; + public ActionEnum[] options; - BuildModeEnum(String name, IBuildMode instance) { + BuildModeEnum(String name, IBuildMode instance, ActionEnum[] options) { this.name = name; this.instance = instance; + this.options = options; } } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java index 34f3f31..a18725e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java @@ -1,6 +1,7 @@ package nl.requios.effortlessbuilding.buildmode; import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.relauncher.Side; @@ -14,23 +15,72 @@ import nl.requios.effortlessbuilding.gui.buildmodifier.ModifierSettingsGui; public class ModeOptions { public enum ActionEnum { - UNDO, - REDO, - REPLACE, - OPEN_MODIFIER_SETTINGS + UNDO("effortlessbuilding.action.undo"), + REDO("effortlessbuilding.action.redo"), + REPLACE("effortlessbuilding.action.replace"), + OPEN_MODIFIER_SETTINGS("effortlessbuilding.action.open_modifier_settings"), + + NORMAL_SPEED("effortlessbuilding.action.normal_speed"), + FAST_SPEED("effortlessbuilding.action.fast_speed"), + + FULL("effortlessbuilding.action.full"), + HOLLOW("effortlessbuilding.action.hollow"), + + CUBE_FULL("effortlessbuilding.action.full"), + CUBE_HOLLOW("effortlessbuilding.action.hollow"), + CUBE_SKELETON("effortlessbuilding.action.skeleton"), + + SHORT_EDGE("effortlessbuilding.action.short_edge"), + LONG_EDGE("effortlessbuilding.action.long_edge"), + + THICKNESS_1("effortlessbuilding.action.thickness_1"), + THICKNESS_3("effortlessbuilding.action.thickness_3"), + THICKNESS_5("effortlessbuilding.action.thickness_5"); + + public String name; + + ActionEnum(String name) { + this.name = name; + } + } + + private static ActionEnum buildSpeed = ActionEnum.NORMAL_SPEED; + private static ActionEnum fill = ActionEnum.FULL; + private static ActionEnum cubeFill = ActionEnum.CUBE_FULL; + private static ActionEnum raisedEdge = ActionEnum.SHORT_EDGE; + private static ActionEnum lineThickness = ActionEnum.THICKNESS_1; + + public static ActionEnum getBuildSpeed() { + return buildSpeed; + } + + public static ActionEnum getFill() { + return fill; + } + + public static ActionEnum getCubeFill() { + return cubeFill; + } + + public static ActionEnum getRaisedEdge() { + return raisedEdge; + } + + public static ActionEnum getLineThickness() { + return lineThickness; } //Called on both client and server public static void performAction(EntityPlayer player, ActionEnum action) { + if (action == null) return; + BuildModes.BuildModeEnum currentBuildMode = ModeSettingsManager.getModeSettings(Minecraft.getMinecraft().player).getBuildMode(); switch (action) { case UNDO: UndoRedo.undo(player); - EffortlessBuilding.log(player, "Undo", true); break; case REDO: UndoRedo.redo(player); - EffortlessBuilding.log(player, "Redo", true); break; case REPLACE: ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); @@ -42,13 +92,59 @@ public class ModeOptions { if (player.world.isRemote) openModifierSettings(); break; + + case NORMAL_SPEED: + buildSpeed = ActionEnum.NORMAL_SPEED; + break; + case FAST_SPEED: + buildSpeed = ActionEnum.FAST_SPEED; + break; + case FULL: + fill = ActionEnum.FULL; + break; + case HOLLOW: + fill = ActionEnum.HOLLOW; + break; + case CUBE_FULL: + cubeFill = ActionEnum.CUBE_FULL; + break; + case CUBE_HOLLOW: + cubeFill = ActionEnum.CUBE_HOLLOW; + break; + case CUBE_SKELETON: + cubeFill = ActionEnum.CUBE_SKELETON; + break; + case SHORT_EDGE: + raisedEdge = ActionEnum.SHORT_EDGE; + break; + case LONG_EDGE: + raisedEdge = ActionEnum.LONG_EDGE; + break; + case THICKNESS_1: + lineThickness = ActionEnum.THICKNESS_1; + break; + case THICKNESS_3: + lineThickness = ActionEnum.THICKNESS_3; + break; + case THICKNESS_5: + lineThickness = ActionEnum.THICKNESS_5; + break; + } + + if (player.world.isRemote && action != ActionEnum.REPLACE && action != ActionEnum.OPEN_MODIFIER_SETTINGS) { + logAction(action); } } + //TODO fix client class import giving error on server (nothing happens, it's just ugly) @SideOnly(Side.CLIENT) private static void openModifierSettings() { Minecraft.getMinecraft().displayGuiScreen(new ModifierSettingsGui()); RadialMenu.instance.setVisibility(0f); } + @SideOnly(Side.CLIENT) + private static void logAction(ActionEnum action) { + EffortlessBuilding.log(Minecraft.getMinecraft().player, I18n.format(action.name), true); + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java index 25d6472..f2711ef 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.concurrent.TimeUnit; import net.minecraft.client.resources.I18n; +import net.minecraft.client.settings.KeyBinding; import net.minecraft.util.text.TextFormatting; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.buildmode.ModeOptions; @@ -110,6 +111,8 @@ public class RadialMenu extends GuiScreen { public void drawScreen(final int mouseX, final int mouseY, final float partialTicks) { if (!isVisible()) return; + BuildModeEnum currentBuildMode = ModeSettingsManager.getModeSettings(Minecraft.getMinecraft().player).getBuildMode(); + GlStateManager.pushMatrix(); GlStateManager.translate( 0.0F, 0.0F, 200.0F ); @@ -148,15 +151,24 @@ public class RadialMenu extends GuiScreen { final ArrayList modes = new ArrayList(); final ArrayList buttons = new ArrayList(); - buttons.add(new MenuButton("effortlessbuilding.action.undo", ModeOptions.ActionEnum.UNDO, -buttonDistance - 26, -13, EnumFacing.UP)); - buttons.add(new MenuButton("effortlessbuilding.action.redo", ModeOptions.ActionEnum.REDO, -buttonDistance, -13, EnumFacing.UP)); - buttons.add(new MenuButton("effortlessbuilding.action.open_modifier_settings", ModeOptions.ActionEnum.OPEN_MODIFIER_SETTINGS, -buttonDistance - 26, 13, EnumFacing.DOWN)); - buttons.add(new MenuButton("effortlessbuilding.action.replace", ModeOptions.ActionEnum.REPLACE, -buttonDistance, 13, EnumFacing.DOWN)); - + //Add build modes for (final BuildModeEnum mode : BuildModeEnum.values()) { modes.add(new MenuRegion(mode)); } + //Add actions + buttons.add(new MenuButton(ModeOptions.ActionEnum.UNDO.name, ModeOptions.ActionEnum.UNDO, -buttonDistance - 26, -13, EnumFacing.UP)); + buttons.add(new MenuButton(ModeOptions.ActionEnum.REDO.name, ModeOptions.ActionEnum.REDO, -buttonDistance, -13, EnumFacing.UP)); + buttons.add(new MenuButton(ModeOptions.ActionEnum.OPEN_MODIFIER_SETTINGS.name, ModeOptions.ActionEnum.OPEN_MODIFIER_SETTINGS, -buttonDistance - 26, 13, EnumFacing.DOWN)); + buttons.add(new MenuButton(ModeOptions.ActionEnum.REPLACE.name, ModeOptions.ActionEnum.REPLACE, -buttonDistance, 13, EnumFacing.DOWN)); + + //Add buildmode dependent options + ModeOptions.ActionEnum[] options = currentBuildMode.options; + for (int i = 0; i < options.length; i++) { + ModeOptions.ActionEnum action = options[i]; + buttons.add(new MenuButton(action.name, action, buttonDistance + i * 26, -20, EnumFacing.DOWN)); + } + switchTo = null; doAction = null; @@ -193,7 +205,7 @@ public class RadialMenu extends GuiScreen { float a = 0.5f; //check if current mode - int buildMode = ModeSettingsManager.getModeSettings(Minecraft.getMinecraft().player).getBuildMode().ordinal(); + int buildMode = currentBuildMode.ordinal(); if (buildMode == i) { r = 0f; g = 0.5f; @@ -225,16 +237,29 @@ public class RadialMenu extends GuiScreen { } for (final MenuButton btn : buttons) { - float r = 0.8f; - float g = 0.8f; - float b = 0.8f; + float r = 0.5f; + float g = 0.5f; + float b = 0.5f; float a = 0.5f; - if (btn.x1 <= mouseXCenter && btn.x2 >= mouseXCenter && btn.y1 <= mouseYCenter && btn.y2 >= mouseYCenter) { + //highlight when active option + if (btn.action == ModeOptions.getBuildSpeed() || + btn.action == ModeOptions.getFill() || + btn.action == ModeOptions.getCubeFill() || + btn.action == ModeOptions.getRaisedEdge() || + btn.action == ModeOptions.getLineThickness()) { r = 0.0f; g = 0.5f; b = 1f; a = 0.6f; + } + + //highlight when mouse over + if (btn.x1 <= mouseXCenter && btn.x2 >= mouseXCenter && btn.y1 <= mouseYCenter && btn.y2 >= mouseYCenter) { + r = 0.6f; + g = 0.8f; + b = 1f; + a = 0.6f; btn.highlighted = true; doAction = btn.action; } @@ -311,6 +336,36 @@ public class RadialMenu extends GuiScreen { tessellator.draw(); + + //fontRenderer.drawStringWithShadow("Actions", (int) (middleX - buttonDistance - 13) - fontRenderer.getStringWidth("Actions") * 0.5f, (int) middleY - 38, 0xffffffff); + String title = ""; + if (currentBuildMode.options.length > 0) { + switch (currentBuildMode.options[0]) { + case NORMAL_SPEED: + case FAST_SPEED: + title = "Build Speed"; + break; + case FULL: + case HOLLOW: + case CUBE_FULL: + case CUBE_HOLLOW: + case CUBE_SKELETON: + title = "Fill"; + break; + case SHORT_EDGE: + case LONG_EDGE: + title = "Raised Edge"; + break; + case THICKNESS_1: + case THICKNESS_3: + case THICKNESS_5: + title = "Line Thickness"; + break; + } + } + fontRenderer.drawStringWithShadow(title, (int) (middleX + buttonDistance - 9), (int) middleY - 44, 0xffffffff); + + for (final MenuRegion menuRegion : modes) { if (menuRegion.highlighted) { @@ -335,7 +390,8 @@ public class RadialMenu extends GuiScreen { if (button.highlighted) { String text = TextFormatting.AQUA + button.name; int wrap = 120; - String keybind = "None"; + String keybind = ""; + String keybindFormatted = ""; //Add keybind in brackets if (button.action == ModeOptions.ActionEnum.UNDO) { @@ -350,7 +406,7 @@ public class RadialMenu extends GuiScreen { if (button.action == ModeOptions.ActionEnum.OPEN_MODIFIER_SETTINGS) { keybind = ClientProxy.keyBindings[0].getDisplayName(); } - String keybindFormatted = TextFormatting.GRAY + "(" + WordUtils.capitalizeFully(keybind) + ")"; + if (!keybind.isEmpty()) keybindFormatted = TextFormatting.GRAY + "(" + WordUtils.capitalizeFully(keybind) + ")"; if (button.textSide == EnumFacing.WEST) { @@ -373,10 +429,10 @@ public class RadialMenu extends GuiScreen { } else if (button.textSide == EnumFacing.DOWN || button.textSide == EnumFacing.SOUTH) { fontRenderer.drawSplitString(text, (int) (middleX + (button.x1 + button.x2) * 0.5 - fontRenderer.getStringWidth(text) * 0.5), - (int) (middleY + button.y1 + 24), wrap, 0xffffffff); + (int) (middleY + button.y1 + 26), wrap, 0xffffffff); fontRenderer.drawSplitString(keybindFormatted, (int) (middleX + (button.x1 + button.x2) * 0.5 - fontRenderer.getStringWidth(keybindFormatted) * 0.5), - (int) (middleY + button.y1 + 36), wrap, 0xffffffff); + (int) (middleY + button.y1 + 38), wrap, 0xffffffff); } @@ -404,6 +460,10 @@ public class RadialMenu extends GuiScreen { @Override protected void mouseClicked(int mouseX, int mouseY, int mouseButton ) { EffortlessBuilding.log("mouse clicked"); + +// KeyBinding.updateKeyBindState(); +// KeyBinding.setKeyBindState(ClientProxy.keyBindings[3].getKeyCode(), true); + // if (mouseButton == 0) { // this.mc.displayGuiScreen(null); // diff --git a/src/main/java/nl/requios/effortlessbuilding/helper/SurvivalHelper.java b/src/main/java/nl/requios/effortlessbuilding/helper/SurvivalHelper.java index 717c6d7..256c5ee 100644 --- a/src/main/java/nl/requios/effortlessbuilding/helper/SurvivalHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/helper/SurvivalHelper.java @@ -21,6 +21,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import nl.requios.effortlessbuilding.BuildConfig; import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.compatibility.CompatHelper; @@ -198,7 +199,14 @@ public class SurvivalHelper { IBlockState state = world.getBlockState(pos); state = state.getBlock().getActualState(state, world, pos); - if (state.getMaterial().isToolNotRequired()) return true; + + switch (BuildConfig.survivalBalancers.quickReplaceMiningLevel) { + case -1: return state.getMaterial().isToolNotRequired(); + case 0: return state.getBlock().getHarvestLevel(state) <= 0; + case 1: return state.getBlock().getHarvestLevel(state) <= 1; + case 2: return state.getBlock().getHarvestLevel(state) <= 2; + case 3: return state.getBlock().getHarvestLevel(state) <= 3; + } return false; } diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java index 95ae1fc..6089345 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -80,7 +80,7 @@ public class ClientProxy implements IProxy { @Override public void init(FMLInitializationEvent event) { // register key bindings - keyBindings = new KeyBinding[7]; + keyBindings = new KeyBinding[6]; // instantiate the key bindings keyBindings[0] = new KeyBinding("key.effortlessbuilding.hud.desc", KeyConflictContext.UNIVERSAL, Keyboard.KEY_ADD, "key.effortlessbuilding.category"); @@ -96,7 +96,7 @@ public class ClientProxy implements IProxy { }; keyBindings[4] = new KeyBinding("key.effortlessbuilding.undo.desc", KeyConflictContext.IN_GAME, KeyModifier.CONTROL, Keyboard.KEY_Z, "key.effortlessbuilding.category"); keyBindings[5] = new KeyBinding("key.effortlessbuilding.redo.desc", KeyConflictContext.IN_GAME, KeyModifier.CONTROL, Keyboard.KEY_Y, "key.effortlessbuilding.category"); - keyBindings[6] = new KeyBinding("Reload shaders", Keyboard.KEY_TAB, "key.effortlessbuilding.category"); +// keyBindings[6] = new KeyBinding("Reload shaders", Keyboard.KEY_TAB, "key.effortlessbuilding.category"); // register all the key bindings for (int i = 0; i < keyBindings.length; ++i) { diff --git a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java index 03ee075..dca14ae 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java @@ -210,7 +210,21 @@ public class RenderHandler implements IWorldEventListener { GlStateManager.rotate(-90.0F, 0.0F, 1.0F, 0.0F); GlStateManager.translate(-0.01f, -0.01f, 0.01f); GlStateManager.scale(1.02f, 1.02f, 1.02f); - dispatcher.renderBlockBrightness(blockState, 0.85f); + + try { + dispatcher.renderBlockBrightness(blockState, 0.85f); + } catch (NullPointerException e) { + EffortlessBuilding.logger.warn("RenderHandler::renderBlockPreview cannot render " + blockState.getBlock().toString()); + + //Render outline as backup + GlStateManager.popMatrix(); +// ShaderHandler.releaseShader(); + GL11.glDisable(GL11.GL_LIGHTING); + renderBlockOutline(blockPos, new Vec3d(1f, 1f, 1f)); + GL11.glEnable(GL11.GL_LIGHTING); + GlStateManager.pushMatrix(); + } + GlStateManager.popMatrix(); } diff --git a/src/main/resources/assets/effortlessbuilding/lang/en_us.lang b/src/main/resources/assets/effortlessbuilding/lang/en_us.lang index 0617f1d..51e173b 100644 --- a/src/main/resources/assets/effortlessbuilding/lang/en_us.lang +++ b/src/main/resources/assets/effortlessbuilding/lang/en_us.lang @@ -25,5 +25,15 @@ effortlessbuilding.action.undo=Undo effortlessbuilding.action.redo=Redo effortlessbuilding.action.replace=Replace effortlessbuilding.action.open_modifier_settings=Open Modifier Settings +effortlessbuilding.action.normal_speed=Normal +effortlessbuilding.action.fast_speed=Fast +effortlessbuilding.action.full=Full +effortlessbuilding.action.hollow=Hollow +effortlessbuilding.action.skeleton=Skeleton +effortlessbuilding.action.short_edge=Short Edge +effortlessbuilding.action.long_edge=Long Edge +effortlessbuilding.action.thickness_1=1 Block Thick +effortlessbuilding.action.thickness_3=3 Blocks Thick +effortlessbuilding.action.thickness_5=5 Blocks Thick commands.reach.usage=/reach \ No newline at end of file diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/cube_full.png b/src/main/resources/assets/effortlessbuilding/textures/icons/cube_full.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/cube_full.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/cube_hollow.png b/src/main/resources/assets/effortlessbuilding/textures/icons/cube_hollow.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/cube_hollow.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/cube_skeleton.png b/src/main/resources/assets/effortlessbuilding/textures/icons/cube_skeleton.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/cube_skeleton.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/fast_speed.png b/src/main/resources/assets/effortlessbuilding/textures/icons/fast_speed.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/fast_speed.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/full.png b/src/main/resources/assets/effortlessbuilding/textures/icons/full.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/full.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/hollow.png b/src/main/resources/assets/effortlessbuilding/textures/icons/hollow.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/hollow.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/long_edge.png b/src/main/resources/assets/effortlessbuilding/textures/icons/long_edge.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/long_edge.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/normal_speed.png b/src/main/resources/assets/effortlessbuilding/textures/icons/normal_speed.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/normal_speed.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/short_edge.png b/src/main/resources/assets/effortlessbuilding/textures/icons/short_edge.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/short_edge.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/thickness_1.png b/src/main/resources/assets/effortlessbuilding/textures/icons/thickness_1.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/thickness_1.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/thickness_3.png b/src/main/resources/assets/effortlessbuilding/textures/icons/thickness_3.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/thickness_3.png differ diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/thickness_5.png b/src/main/resources/assets/effortlessbuilding/textures/icons/thickness_5.png new file mode 100644 index 0000000..bcf4a22 Binary files /dev/null and b/src/main/resources/assets/effortlessbuilding/textures/icons/thickness_5.png differ