From a1d30fd752d2eeb187c69d12dad5bea6379ac320 Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Sat, 12 Feb 2022 20:55:29 +0100 Subject: [PATCH] Added descriptions to radial menu. Added pyramid, cone and dome buttons, icons and placeholder classes. Fixed leftclicking to cancel in survival. --- build.gradle | 2 +- .../effortlessbuilding/EventHandler.java | 84 +++++----- .../buildmode/BuildModes.java | 39 +++-- .../buildmode/buildmodes/Cone.java | 31 ++++ .../buildmode/buildmodes/Dome.java | 31 ++++ .../buildmode/buildmodes/Pyramid.java | 34 ++++ .../{CommandReach.java => ReachCommand.java} | 14 +- .../gui/buildmode/RadialMenu.java | 148 +++++++++--------- .../effortlessbuilding/proxy/ClientProxy.java | 6 - .../assets/effortlessbuilding/lang/en_us.json | 19 +++ .../textures/icons/cone.png | Bin 0 -> 361 bytes .../textures/icons/dome.png | Bin 0 -> 361 bytes .../textures/icons/pyramid.png | Bin 0 -> 361 bytes 13 files changed, 268 insertions(+), 140 deletions(-) create mode 100644 src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cone.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Dome.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Pyramid.java rename src/main/java/nl/requios/effortlessbuilding/command/{CommandReach.java => ReachCommand.java} (82%) create mode 100644 src/main/resources/assets/effortlessbuilding/textures/icons/cone.png create mode 100644 src/main/resources/assets/effortlessbuilding/textures/icons/dome.png create mode 100644 src/main/resources/assets/effortlessbuilding/textures/icons/pyramid.png diff --git a/build.gradle b/build.gradle index 8939965..987bab1 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = '1.18.1-2.31' +version = '1.18.1-2.32' 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/EventHandler.java b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java index ea2dbbf..3e83e3c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java @@ -10,8 +10,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -23,7 +23,7 @@ import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.UndoRedo; import nl.requios.effortlessbuilding.capability.ModeCapabilityManager; import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager; -import nl.requios.effortlessbuilding.command.CommandReach; +import nl.requios.effortlessbuilding.command.ReachCommand; import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.network.AddUndoMessage; @@ -46,8 +46,8 @@ public class EventHandler { } @SubscribeEvent - public void onServerStarting(ServerStartingEvent event) { - CommandReach.register(event.getServer().getCommands().getDispatcher()); + public void onRegisterCommands(RegisterCommandsEvent event) { + ReachCommand.register(event.getDispatcher()); } @SubscribeEvent @@ -111,44 +111,44 @@ public class EventHandler { } } - @SubscribeEvent - public static void breakSpeed(PlayerEvent.BreakSpeed event) { - //Disable if config says so - if (!BuildConfig.survivalBalancers.increasedMiningTime.get()) return; - - if (event.getPlayer() instanceof FakePlayer) return; - - Player player = event.getPlayer(); - Level world = player.level; - BlockPos pos = event.getPos(); - - //EffortlessBuilding.log(player, String.valueOf(event.getNewSpeed())); - - float originalBlockHardness = event.getState().getDestroySpeed(world, pos); - if (originalBlockHardness < 0) return; //Dont break bedrock - float totalBlockHardness = 0; - //get coordinates - List coordinates = BuildModifiers.findCoordinates(player, pos); - for (int i = 1; i < coordinates.size(); i++) { - BlockPos coordinate = coordinates.get(i); - //get existing blockstates at those coordinates - BlockState blockState = world.getBlockState(coordinate); - //add hardness for each blockstate, if can break - if (SurvivalHelper.canBreak(world, player, coordinate)) - totalBlockHardness += blockState.getDestroySpeed(world, coordinate); - } - - //Grabbing percentage from config - float percentage = (float) BuildConfig.survivalBalancers.miningTimePercentage.get() / 100; - totalBlockHardness *= percentage; - totalBlockHardness += originalBlockHardness; - - float newSpeed = event.getOriginalSpeed() / totalBlockHardness * originalBlockHardness; - if (Float.isNaN(newSpeed) || newSpeed == 0f) newSpeed = 1f; - event.setNewSpeed(newSpeed); - - //EffortlessBuilding.log(player, String.valueOf(event.getNewSpeed())); - } +// @SubscribeEvent +// public static void breakSpeed(PlayerEvent.BreakSpeed event) { +// //Disable if config says so +// if (!BuildConfig.survivalBalancers.increasedMiningTime.get()) return; +// +// if (event.getPlayer() instanceof FakePlayer) return; +// +// Player player = event.getPlayer(); +// Level world = player.level; +// BlockPos pos = event.getPos(); +// +// //EffortlessBuilding.log(player, String.valueOf(event.getNewSpeed())); +// +// float originalBlockHardness = event.getState().getDestroySpeed(world, pos); +// if (originalBlockHardness < 0) return; //Dont break bedrock +// float totalBlockHardness = 0; +// //get coordinates +// List coordinates = BuildModifiers.findCoordinates(player, pos); +// for (int i = 1; i < coordinates.size(); i++) { +// BlockPos coordinate = coordinates.get(i); +// //get existing blockstates at those coordinates +// BlockState blockState = world.getBlockState(coordinate); +// //add hardness for each blockstate, if can break +// if (SurvivalHelper.canBreak(world, player, coordinate)) +// totalBlockHardness += blockState.getDestroySpeed(world, coordinate); +// } +// +// //Grabbing percentage from config +// float percentage = (float) BuildConfig.survivalBalancers.miningTimePercentage.get() / 100; +// totalBlockHardness *= percentage; +// totalBlockHardness += originalBlockHardness; +// +// float newSpeed = event.getOriginalSpeed() / totalBlockHardness * originalBlockHardness; +// if (Float.isNaN(newSpeed) || newSpeed == 0f) newSpeed = 1f; +// event.setNewSpeed(newSpeed); +// +// //EffortlessBuilding.log(player, String.valueOf(event.getNewSpeed())); +// } @SubscribeEvent public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java index 3be215e..eb4ca8d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java @@ -117,6 +117,8 @@ public class BuildModes { return; } + if (!ReachHelper.canBreakFar(player)) return; + //If first click if (currentlyBreaking.get(player) == null) { //If startpos is null, dont do anything @@ -245,20 +247,23 @@ public class BuildModes { } public enum BuildModeEnum { - NORMAL("effortlessbuilding.mode.normal", new Normal()), - NORMAL_PLUS("effortlessbuilding.mode.normal_plus", new NormalPlus(), OptionEnum.BUILD_SPEED), - LINE("effortlessbuilding.mode.line", new Line() /*, OptionEnum.THICKNESS*/), - WALL("effortlessbuilding.mode.wall", new Wall(), OptionEnum.FILL), - FLOOR("effortlessbuilding.mode.floor", new Floor(), OptionEnum.FILL), - DIAGONAL_LINE("effortlessbuilding.mode.diagonal_line", new DiagonalLine() /*, OptionEnum.THICKNESS*/), - DIAGONAL_WALL("effortlessbuilding.mode.diagonal_wall", new DiagonalWall() /*, OptionEnum.FILL*/), - SLOPE_FLOOR("effortlessbuilding.mode.slope_floor", new SlopeFloor(), OptionEnum.RAISED_EDGE), - CIRCLE("effortlessbuilding.mode.circle", new Circle(), OptionEnum.CIRCLE_START, OptionEnum.FILL), - CYLINDER("effortlessbuilding.mode.cylinder", new Cylinder(), OptionEnum.CIRCLE_START, OptionEnum.FILL), - SPHERE("effortlessbuilding.mode.sphere", new Sphere(), OptionEnum.CIRCLE_START, OptionEnum.FILL), - CUBE("effortlessbuilding.mode.cube", new Cube(), OptionEnum.CUBE_FILL); + NORMAL("normal", new Normal()), + NORMAL_PLUS("normal_plus", new NormalPlus(), OptionEnum.BUILD_SPEED), + LINE("line", new Line() /*, OptionEnum.THICKNESS*/), + WALL("wall", new Wall(), OptionEnum.FILL), + FLOOR("floor", new Floor(), OptionEnum.FILL), + DIAGONAL_LINE("diagonal_line", new DiagonalLine() /*, OptionEnum.THICKNESS*/), + DIAGONAL_WALL("diagonal_wall", new DiagonalWall() /*, OptionEnum.FILL*/), + SLOPE_FLOOR("slope_floor", new SlopeFloor(), OptionEnum.RAISED_EDGE), + CIRCLE("circle", new Circle(), OptionEnum.CIRCLE_START, OptionEnum.FILL), + CYLINDER("cylinder", new Cylinder(), OptionEnum.CIRCLE_START, OptionEnum.FILL), + SPHERE("sphere", new Sphere(), OptionEnum.CIRCLE_START, OptionEnum.FILL), + CUBE("cube", new Cube(), OptionEnum.CUBE_FILL), + PYRAMID("pyramid", new Pyramid()), + CONE("cone", new Cone()), + DOME("dome", new Dome()); - public String name; + private String name; public IBuildMode instance; public OptionEnum[] options; @@ -267,5 +272,13 @@ public class BuildModes { this.instance = instance; this.options = options; } + + public String getNameKey() { + return "effortlessbuilding.mode." + name; + } + + public String getDescriptionKey() { + return "effortlessbuilding.modedescription." + name; + } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cone.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cone.java new file mode 100644 index 0000000..78b91a6 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cone.java @@ -0,0 +1,31 @@ +package nl.requios.effortlessbuilding.buildmode.buildmodes; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; + +import java.util.List; + +public class Cone extends ThreeClicksBuildMode { + + @Override + protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { + return Floor.findFloor(player, firstPos, skipRaytrace); + } + + @Override + protected BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) { + return findHeight(player, secondPos, skipRaytrace); + } + + @Override + protected List getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { + return Floor.getFloorBlocks(player, x1, y1, z1, x2, y2, z2); + } + + @Override + protected List getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { + //TODO + return SlopeFloor.getSlopeFloorBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3); + } +} \ No newline at end of file diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Dome.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Dome.java new file mode 100644 index 0000000..8845413 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Dome.java @@ -0,0 +1,31 @@ +package nl.requios.effortlessbuilding.buildmode.buildmodes; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; + +import java.util.List; + +public class Dome extends ThreeClicksBuildMode { + + @Override + protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { + return Floor.findFloor(player, firstPos, skipRaytrace); + } + + @Override + protected BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) { + return findHeight(player, secondPos, skipRaytrace); + } + + @Override + protected List getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { + return Floor.getFloorBlocks(player, x1, y1, z1, x2, y2, z2); + } + + @Override + protected List getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { + //TODO + return SlopeFloor.getSlopeFloorBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3); + } +} \ No newline at end of file diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Pyramid.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Pyramid.java new file mode 100644 index 0000000..25bb7d1 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Pyramid.java @@ -0,0 +1,34 @@ +package nl.requios.effortlessbuilding.buildmode.buildmodes; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import nl.requios.effortlessbuilding.buildmode.ModeOptions; +import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; +import nl.requios.effortlessbuilding.helper.ReachHelper; + +import java.util.ArrayList; +import java.util.List; + +public class Pyramid extends ThreeClicksBuildMode { + + @Override + protected BlockPos findSecondPos(Player player, BlockPos firstPos, boolean skipRaytrace) { + return Floor.findFloor(player, firstPos, skipRaytrace); + } + + @Override + protected BlockPos findThirdPos(Player player, BlockPos firstPos, BlockPos secondPos, boolean skipRaytrace) { + return findHeight(player, secondPos, skipRaytrace); + } + + @Override + protected List getIntermediateBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { + return Floor.getFloorBlocks(player, x1, y1, z1, x2, y2, z2); + } + + @Override + protected List getFinalBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { + //TODO + return SlopeFloor.getSlopeFloorBlocks(player, x1, y1, z1, x2, y2, z2, x3, y3, z3); + } +} \ No newline at end of file diff --git a/src/main/java/nl/requios/effortlessbuilding/command/CommandReach.java b/src/main/java/nl/requios/effortlessbuilding/command/ReachCommand.java similarity index 82% rename from src/main/java/nl/requios/effortlessbuilding/command/CommandReach.java rename to src/main/java/nl/requios/effortlessbuilding/command/ReachCommand.java index e2030c4..53a8578 100644 --- a/src/main/java/nl/requios/effortlessbuilding/command/CommandReach.java +++ b/src/main/java/nl/requios/effortlessbuilding/command/ReachCommand.java @@ -2,6 +2,7 @@ package nl.requios.effortlessbuilding.command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.server.level.ServerPlayer; @@ -12,14 +13,19 @@ import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.network.ModifierSettingsMessage; import nl.requios.effortlessbuilding.network.PacketHandler; -public class CommandReach { +public class ReachCommand { public static void register(CommandDispatcher dispatcher) { - dispatcher.register(Commands.literal("reach").then(Commands.literal("set").then(Commands.argument("level", IntegerArgumentType.integer(0, 3)).executes((context) -> { + dispatcher.register( + Commands.literal("reach") + .then(Commands.literal("set") + .then(Commands.argument("level", IntegerArgumentType.integer(0, 3)) + .executes((context) -> { return setReachLevel(context.getSource().getPlayerOrException(), IntegerArgumentType.getInteger(context, "level")); - }))).then(Commands.literal("get").executes((context -> { + }))) + .then(Commands.literal("get").executes((context -> { return getReachLevel(context.getSource().getPlayerOrException()); - })))); + })))); } private static int setReachLevel(ServerPlayer player, int level) { 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 e83cf07..dbbd671 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java @@ -2,6 +2,7 @@ package nl.requios.effortlessbuilding.gui.buildmode; import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.math.Vector4f; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; @@ -44,10 +45,29 @@ import nl.requios.effortlessbuilding.buildmode.ModeOptions.OptionEnum; @MethodsReturnNonnullByDefault public class RadialMenu extends Screen { + private final Vector4f radialButtonColor = new Vector4f(0f, 0f, 0f, .5f); + private final Vector4f sideButtonColor = new Vector4f(.5f, .5f, .5f, .5f); + private final Vector4f highlightColor = new Vector4f(.6f, .8f, 1f, .6f); + private final Vector4f selectedColor = new Vector4f(0f, .5f, 1f, .5f); + private final Vector4f highlightSelectedColor = new Vector4f(0.2f, .7f, 1f, .7f); + + private final int whiteTextColor = 0xffffffff; + private final int watermarkTextColor = 0x88888888; + private final int descriptionTextColor = 0xdd888888; + private final int optionTextColor = 0xeeeeeeff; + + private final double ringInnerEdge = 40; + private final double ringOuterEdge = 80; + private final double textDistance = 90; + private final double buttonDistance = 120; + private final float fadeSpeed = 0.3f; + private final int descriptionHeight = 100; + public static final RadialMenu instance = new RadialMenu(); public BuildModeEnum switchTo = null; public ActionEnum doAction = null; public boolean performedActionUsingMouse; + private float visibility; public RadialMenu() { @@ -81,7 +101,7 @@ public class RadialMenu extends Screen { ms.pushPose(); ms.translate(0, 0, 200); - visibility += 0.3f * partialTicks; + visibility += fadeSpeed * partialTicks; if (visibility > 1f) visibility = 1f; final int startColor = (int) (visibility * 98) << 24; @@ -109,10 +129,6 @@ public class RadialMenu extends Screen { final double mouseYCenter = mouseYY - middleY; double mouseRadians = Math.atan2(mouseYCenter, mouseXCenter); - final double ringInnerEdge = 30; - final double ringOuterEdge = 65; - final double textDistance = 75; - final double buttonDistance = 105; final double quarterCircle = Math.PI / 2.0; if (mouseRadians < -quarterCircle) { @@ -147,10 +163,10 @@ public class RadialMenu extends Screen { doAction = null; //Draw buildmode backgrounds - drawBuildModeBackgrounds(currentBuildMode, buffer, middleX, middleY, mouseXCenter, mouseYCenter, mouseRadians, ringInnerEdge, ringOuterEdge, quarterCircle, modes); + drawRadialButtonBackgrounds(currentBuildMode, buffer, middleX, middleY, mouseXCenter, mouseYCenter, mouseRadians, ringInnerEdge, ringOuterEdge, quarterCircle, modes); //Draw action backgrounds - drawActionBackgrounds(buffer, middleX, middleY, mouseXCenter, mouseYCenter, buttons); + drawSideButtonBackgrounds(buffer, middleX, middleY, mouseXCenter, mouseYCenter, buttons); tessellator.end(); RenderSystem.disableBlend(); @@ -163,7 +179,7 @@ public class RadialMenu extends Screen { ms.popPose(); } - private void drawBuildModeBackgrounds(BuildModeEnum currentBuildMode, BufferBuilder buffer, double middleX, double middleY, double mouseXCenter, double mouseYCenter, double mouseRadians, double ringInnerEdge, double ringOuterEdge, double quarterCircle, ArrayList modes) { + private void drawRadialButtonBackgrounds(BuildModeEnum currentBuildMode, BufferBuilder buffer, double middleX, double middleY, double mouseXCenter, double mouseYCenter, double mouseRadians, double ringInnerEdge, double ringOuterEdge, double quarterCircle, ArrayList modes) { if (!modes.isEmpty()) { final int totalModes = Math.max(3, modes.size()); int currentMode = 0; @@ -191,78 +207,58 @@ public class RadialMenu extends Screen { final double y1m2 = Math.sin(beginRadians + fragment2) * ringOuterEdge; final double y2m2 = Math.sin(endRadians - fragment2) * ringOuterEdge; - float r = 0.0f; - float g = 0.0f; - float b = 0.0f; - float a = 0.5f; - - //check if current mode - int buildMode = currentBuildMode.ordinal(); - if (buildMode == i) { - r = 0f; - g = 0.5f; - b = 1f; - a = 0.5f; - //menuRegion.highlighted = true; //draw text - } - - //check if mouse is over this region + final boolean isSelected = currentBuildMode.ordinal() == i; final boolean isMouseInQuad = inTriangle(x1m1, y1m1, x2m2, y2m2, x2m1, y2m1, mouseXCenter, mouseYCenter) || inTriangle(x1m1, y1m1, x1m2, y1m2, x2m2, y2m2, mouseXCenter, mouseYCenter); + final boolean isHighlighted = beginRadians <= mouseRadians && mouseRadians <= endRadians && isMouseInQuad; - if (beginRadians <= mouseRadians && mouseRadians <= endRadians && isMouseInQuad) { - r = 0.6f; - g = 0.8f; - b = 1f; - a = 0.6f; + Vector4f color = radialButtonColor; + if (isSelected) color = selectedColor; + if (isHighlighted) color = highlightColor; + if (isSelected && isHighlighted) color = highlightSelectedColor; + + if (isHighlighted) { menuRegion.highlighted = true; switchTo = menuRegion.mode; } - buffer.vertex(middleX + x1m1, middleY + y1m1, getBlitOffset()).color(r, g, b, a).endVertex(); - buffer.vertex(middleX + x2m1, middleY + y2m1, getBlitOffset()).color(r, g, b, a).endVertex(); - buffer.vertex(middleX + x2m2, middleY + y2m2, getBlitOffset()).color(r, g, b, a).endVertex(); - buffer.vertex(middleX + x1m2, middleY + y1m2, getBlitOffset()).color(r, g, b, a).endVertex(); + buffer.vertex(middleX + x1m1, middleY + y1m1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); + buffer.vertex(middleX + x2m1, middleY + y2m1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); + buffer.vertex(middleX + x2m2, middleY + y2m2, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); + buffer.vertex(middleX + x1m2, middleY + y1m2, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); currentMode++; } } } - private void drawActionBackgrounds(BufferBuilder buffer, double middleX, double middleY, double mouseXCenter, double mouseYCenter, ArrayList buttons) { + private void drawSideButtonBackgrounds(BufferBuilder buffer, double middleX, double middleY, double mouseXCenter, double mouseYCenter, ArrayList buttons) { for (final MenuButton btn : buttons) { - float r = 0.5f; - float g = 0.5f; - float b = 0.5f; - float a = 0.5f; - //highlight when active option - if (btn.action == getBuildSpeed() || - btn.action == getFill() || - btn.action == getCubeFill() || - btn.action == getRaisedEdge() || - btn.action == getLineThickness() || - btn.action == getCircleStart()) { - r = 0.0f; - g = 0.5f; - b = 1f; - a = 0.6f; - } + final boolean isSelected = + btn.action == getBuildSpeed() || + btn.action == getFill() || + btn.action == getCubeFill() || + btn.action == getRaisedEdge() || + btn.action == getLineThickness() || + btn.action == getCircleStart(); - //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; + final boolean isHighlighted = btn.x1 <= mouseXCenter && btn.x2 >= mouseXCenter && btn.y1 <= mouseYCenter && btn.y2 >= mouseYCenter; + + Vector4f color = sideButtonColor; + if (isSelected) color = selectedColor; + if (isHighlighted) color = highlightColor; + if (isSelected && isHighlighted) color = highlightSelectedColor; + + if (isHighlighted) { btn.highlighted = true; doAction = btn.action; } - buffer.vertex(middleX + btn.x1, middleY + btn.y1, getBlitOffset()).color(r, g, b, a).endVertex(); - buffer.vertex(middleX + btn.x1, middleY + btn.y2, getBlitOffset()).color(r, g, b, a).endVertex(); - buffer.vertex(middleX + btn.x2, middleY + btn.y2, getBlitOffset()).color(r, g, b, a).endVertex(); - buffer.vertex(middleX + btn.x2, middleY + btn.y1, getBlitOffset()).color(r, g, b, a).endVertex(); + buffer.vertex(middleX + btn.x1, middleY + btn.y1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); + buffer.vertex(middleX + btn.x1, middleY + btn.y2, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); + buffer.vertex(middleX + btn.x2, middleY + btn.y2, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); + buffer.vertex(middleX + btn.x2, middleY + btn.y1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); } } @@ -275,8 +271,8 @@ public class RadialMenu extends Screen { //Draw buildmode icons for (final MenuRegion menuRegion : modes) { - final double x = (menuRegion.x1 + menuRegion.x2) * 0.5 * (ringOuterEdge * 0.6 + 0.4 * ringInnerEdge); - final double y = (menuRegion.y1 + menuRegion.y2) * 0.5 * (ringOuterEdge * 0.6 + 0.4 * ringInnerEdge); + final double x = (menuRegion.x1 + menuRegion.x2) * 0.5 * (ringOuterEdge * 0.55 + 0.45 * ringInnerEdge); + final double y = (menuRegion.y1 + menuRegion.y2) * 0.5 * (ringOuterEdge * 0.55 + 0.45 * ringInnerEdge); RenderSystem.setShaderTexture(0, new ResourceLocation(EffortlessBuilding.MODID, "textures/icons/" + menuRegion.mode.name().toLowerCase() + ".png")); blit(ms, (int) (middleX + x - 8), (int) (middleY + y - 8), 16, 16, 0, 0, 18, 18, 18, 18); @@ -301,11 +297,11 @@ public class RadialMenu extends Screen { //Draw option strings for (int i = 0; i < currentBuildMode.options.length; i++) { OptionEnum option = options[i]; - font.drawShadow(ms, I18n.get(option.name), (int) (middleX + buttonDistance - 9), (int) middleY - 37 + i * 39, 0xeeeeeeff); + font.drawShadow(ms, I18n.get(option.name), (int) (middleX + buttonDistance - 9), (int) middleY - 37 + i * 39, optionTextColor); } String credits = "Effortless Building"; - font.drawShadow(ms, credits, width - font.width(credits) - 4, height - 10, 0x88888888); + font.drawShadow(ms, credits, width - font.width(credits) - 4, height - 10, watermarkTextColor); //Draw buildmode text for (final MenuRegion menuRegion : modes) { @@ -315,8 +311,8 @@ public class RadialMenu extends Screen { final double y = (menuRegion.y1 + menuRegion.y2) * 0.5; int fixed_x = (int) (x * textDistance); - final int fixed_y = (int) (y * textDistance) - font.lineHeight / 2; - final String text = I18n.get(menuRegion.mode.name); + int fixed_y = (int) (y * textDistance) - font.lineHeight / 2; + String text = I18n.get(menuRegion.mode.getNameKey()); if (x <= -0.2) { fixed_x -= font.width(text); @@ -324,7 +320,11 @@ public class RadialMenu extends Screen { fixed_x -= font.width(text) / 2; } - font.drawShadow(ms, text, (int) middleX + fixed_x, (int) middleY + fixed_y, 0xffffffff); + font.drawShadow(ms, text, (int) middleX + fixed_x, (int) middleY + fixed_y, whiteTextColor); + + //Draw description + text = I18n.get(menuRegion.mode.getDescriptionKey()); + font.drawShadow(ms, text, (int) middleX - font.width(text) / 2f, (int) middleY + descriptionHeight, descriptionTextColor); } } @@ -342,28 +342,28 @@ public class RadialMenu extends Screen { if (button.textSide == Direction.WEST) { font.draw(ms, text, (int) (middleX + button.x1 - 8) - font.width(text), - (int) (middleY + button.y1 + 6), 0xffffffff); + (int) (middleY + button.y1 + 6), whiteTextColor); } else if (button.textSide == Direction.EAST) { font.draw(ms, text, (int) (middleX + button.x2 + 8), - (int) (middleY + button.y1 + 6), 0xffffffff); + (int) (middleY + button.y1 + 6), whiteTextColor); } else if (button.textSide == Direction.UP || button.textSide == Direction.NORTH) { font.draw(ms, keybindFormatted, (int) (middleX + (button.x1 + button.x2) * 0.5 - font.width(keybindFormatted) * 0.5), - (int) (middleY + button.y1 - 26), 0xffffffff); + (int) (middleY + button.y1 - 26), whiteTextColor); font.draw(ms, text, (int) (middleX + (button.x1 + button.x2) * 0.5 - font.width(text) * 0.5), - (int) (middleY + button.y1 - 14), 0xffffffff); + (int) (middleY + button.y1 - 14), whiteTextColor); } else if (button.textSide == Direction.DOWN || button.textSide == Direction.SOUTH) { font.draw(ms, text, (int) (middleX + (button.x1 + button.x2) * 0.5 - font.width(text) * 0.5), - (int) (middleY + button.y1 + 26), 0xffffffff); + (int) (middleY + button.y1 + 26), whiteTextColor); font.draw(ms, keybindFormatted, (int) (middleX + (button.x1 + button.x2) * 0.5 - font.width(keybindFormatted) * 0.5), - (int) (middleY + button.y1 + 38), 0xffffffff); + (int) (middleY + button.y1 + 38), whiteTextColor); } @@ -442,7 +442,7 @@ public class RadialMenu extends Screen { ModeSettingsManager.setModeSettings(player, modeSettings); PacketHandler.INSTANCE.sendToServer(new ModeSettingsMessage(modeSettings)); - EffortlessBuilding.log(player, I18n.get(modeSettings.getBuildMode().name), true); + EffortlessBuilding.log(player, I18n.get(modeSettings.getBuildMode().getNameKey()), true); if (fromMouseClick) performedActionUsingMouse = true; } diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java index de0166d..43a2f87 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -192,12 +192,6 @@ public class ClientProxy implements IProxy { if (breakCooldown <= 0) { breakCooldown = 4; - //Early out if cant break far, coming from own mouse event (not block broken event) - //To make breaking blocks in survival possible like array - //TODO this causes not being able to cancel placement in survival - // moving it to after buildmodes fixes that, but introduces this bug - if (!ReachHelper.canBreakFar(player)) return; - HitResult lookingAt = getLookingAt(player); if (lookingAt != null && lookingAt.getType() == HitResult.Type.BLOCK) { BlockHitResult blockLookingAt = (BlockHitResult) lookingAt; diff --git a/src/main/resources/assets/effortlessbuilding/lang/en_us.json b/src/main/resources/assets/effortlessbuilding/lang/en_us.json index aebc911..1bac531 100644 --- a/src/main/resources/assets/effortlessbuilding/lang/en_us.json +++ b/src/main/resources/assets/effortlessbuilding/lang/en_us.json @@ -30,6 +30,25 @@ "effortlessbuilding.mode.circle": "Circle", "effortlessbuilding.mode.cylinder": "Cylinder", "effortlessbuilding.mode.sphere": "Sphere", + "effortlessbuilding.mode.pyramid": "Pyramid", + "effortlessbuilding.mode.cone": "Cone", + "effortlessbuilding.mode.dome": "Dome", + + "effortlessbuilding.modedescription.normal": "Disable mod and use vanilla placement rules", + "effortlessbuilding.modedescription.normal_plus": "Single block, but with increased reach and placement preview", + "effortlessbuilding.modedescription.line": "", + "effortlessbuilding.modedescription.wall": "", + "effortlessbuilding.modedescription.floor": "", + "effortlessbuilding.modedescription.diagonal_line": "", + "effortlessbuilding.modedescription.diagonal_wall": "", + "effortlessbuilding.modedescription.slope_floor": "", + "effortlessbuilding.modedescription.cube": "", + "effortlessbuilding.modedescription.circle": "", + "effortlessbuilding.modedescription.cylinder": "", + "effortlessbuilding.modedescription.sphere": "", + "effortlessbuilding.modedescription.pyramid": "", + "effortlessbuilding.modedescription.cone": "", + "effortlessbuilding.modedescription.dome": "", "effortlessbuilding.action.undo": "Undo", "effortlessbuilding.action.redo": "Redo", diff --git a/src/main/resources/assets/effortlessbuilding/textures/icons/cone.png b/src/main/resources/assets/effortlessbuilding/textures/icons/cone.png new file mode 100644 index 0000000000000000000000000000000000000000..0444196c342e45b790117696411a4db77f6beb34 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAQ1G~? zi(`mI@7mylyv+tYHsOEWH?-PLNdL%|!n-e$z0*|U;NL5PQyf;F@|>vj{Mi{37p#MinvzYRHy|izIGPSeR($mtPsl6|Zc`lWa>+Z73(Ae3F zv-bYt*H$aE7y<+qsn=U)s1_LCX7$!&*zo$x!saPKclA#f-E`diYi9TFDg~wGSNmh` z{NkEY{7)+&bV|@G8=LFxX>OM3>Jc6OXBMix%E?1 zD%u~1eOUtZ5`(9!pUXO@gr=|en%+OUEmW@f>AvKxo8M)#bEs=~oBoH%uMv3D8uhw(%KF1k92L(}_@UYd*yrLnhX zT$4I%Fu{D*3b_Vd~oE!(FU-RcyV wPTtYG>3^8~8i6;hQLl@qtUvt3QSppK^R-`fGyYkh+kZr?Rh@gj(tBt48apNgWj!d3-P<=)a@DJ}YaT97s#@jVsn+fh z?0KN>DY)mLvS-9J)&!2@68Vo;aS1F_|FKr+fH&)bRH?;WpI$N~o=a$0%CJMVGG z)l1EFqJecDyb;{)O>QhLb{pUSp7`T;{vXDQjnRwMl@u=m-Ok|Y>gTe~DWS>sfbanc z=iA#NvKjr%k``sKpWC_qcHH%^_nO{6x-C?$`02jnt()IvvvtqyRAxV~ebKUgiqWl3 yap~k8y_^1r$*&Q3(;D@