Added quickReplaceMiningLevel to survivalBalancers in config (issue #14).

Fixed crash when trying to preview some modded blocks that have special rendering code. Preview will show outline instead. (issue #9 and #35)
Added build mode options GUI.
This commit is contained in:
Christian Knaapen
2019-04-25 20:34:46 +02:00
parent 00eb42b88a
commit e3546f9c42
20 changed files with 235 additions and 34 deletions

View File

@@ -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;

View File

@@ -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<EntityPlayer, Boolean> 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;
}
}

View File

@@ -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);
}
}

View File

@@ -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<MenuRegion> modes = new ArrayList<MenuRegion>();
final ArrayList<MenuButton> buttons = new ArrayList<MenuButton>();
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);
//

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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();
}

View File

@@ -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 <level>

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B