From bef19466cf8dd9352fcbbebc6a95204606b54dc7 Mon Sep 17 00:00:00 2001 From: tterrag1098 Date: Wed, 21 Jan 2015 14:02:47 -0500 Subject: [PATCH] Add ability for chisels to define their own chisel modes --- .../chisel/api/carving/IAdvancedChisel.java | 33 +++++++++++++++++++ .../chisel/api/carving/IChiselMode.java | 18 ++++++++++ .../chisel/client/gui/GuiChisel.java | 16 ++++++--- .../chisel/item/chisel/ChiselController.java | 3 +- .../chisel/item/chisel/ChiselMode.java | 14 ++++---- .../network/message/MessageChiselMode.java | 13 +++++--- .../cricketcraft/chisel/utils/General.java | 11 +++++-- 7 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/cricketcraft/chisel/api/carving/IAdvancedChisel.java create mode 100644 src/main/java/com/cricketcraft/chisel/api/carving/IChiselMode.java diff --git a/src/main/java/com/cricketcraft/chisel/api/carving/IAdvancedChisel.java b/src/main/java/com/cricketcraft/chisel/api/carving/IAdvancedChisel.java new file mode 100644 index 00000000..1079807c --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/api/carving/IAdvancedChisel.java @@ -0,0 +1,33 @@ +package com.cricketcraft.chisel.api.carving; + +import net.minecraft.item.ItemStack; + +/** + * Implement this on chisel items which require more control over chisel modes + * (including adding new modes). + */ +public interface IAdvancedChisel { + + /** + * Gets the next mode the button in the GUI should switch to given the + * current mode. + * + * @param stack + * The {@link ItemStack} representing the chisel + * @param current + * The {@link IChiselMode} that is currently active + * @return The next {@link IChiselMode} in the loop + */ + public IChiselMode getNextMode(ItemStack stack, IChiselMode current); + + /** + * Gets an {@link IChiselMode} instance from a String name + * + * @param chisel + * The {@link ItemStack} representing the chisel + * @param name + * The name of the {@link IChiselMode mode} + * @return An {@link IChiselMode} that has the name {@code name} + */ + public IChiselMode getMode(ItemStack chisel, String name); +} diff --git a/src/main/java/com/cricketcraft/chisel/api/carving/IChiselMode.java b/src/main/java/com/cricketcraft/chisel/api/carving/IChiselMode.java new file mode 100644 index 00000000..2db9afad --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/api/carving/IChiselMode.java @@ -0,0 +1,18 @@ +package com.cricketcraft.chisel.api.carving; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public interface IChiselMode { + + void chiselAll(EntityPlayer player, World world, int x, int y, int z, ForgeDirection side, ICarvingVariation variation); + + /** + * Implemented implicitly by enums. If your IChiselMode is not an enum + * constant, this needs to be implemented explicitly. + * + * @return The name of the mode. + */ + String name(); +} diff --git a/src/main/java/com/cricketcraft/chisel/client/gui/GuiChisel.java b/src/main/java/com/cricketcraft/chisel/client/gui/GuiChisel.java index a1c54edd..febbfddf 100644 --- a/src/main/java/com/cricketcraft/chisel/client/gui/GuiChisel.java +++ b/src/main/java/com/cricketcraft/chisel/client/gui/GuiChisel.java @@ -10,6 +10,8 @@ import net.minecraft.inventory.Slot; import org.lwjgl.opengl.GL11; import com.cricketcraft.chisel.api.IChiselItem; +import com.cricketcraft.chisel.api.carving.IAdvancedChisel; +import com.cricketcraft.chisel.api.carving.IChiselMode; import com.cricketcraft.chisel.inventory.ContainerChisel; import com.cricketcraft.chisel.inventory.InventoryChiselSelection; import com.cricketcraft.chisel.inventory.SlotChiselInput; @@ -23,7 +25,7 @@ public class GuiChisel extends GuiContainer { public EntityPlayer player; public ContainerChisel container; - private ChiselMode currentMode; + private IChiselMode currentMode; public GuiChisel(InventoryPlayer iinventory, InventoryChiselSelection menu) { super(new ContainerChisel(iinventory, menu)); @@ -103,9 +105,15 @@ public class GuiChisel extends GuiContainer { @Override protected void actionPerformed(GuiButton button) { if (button.id == 0) { - PacketHandler.INSTANCE.sendToServer(new MessageChiselMode(currentMode)); - currentMode = currentMode.next(); - setButtonText(); + if (container.chisel != null && container.chisel.getItem() instanceof IAdvancedChisel) { + IAdvancedChisel item = (IAdvancedChisel) container.chisel.getItem(); + currentMode = item.getNextMode(container.chisel, currentMode); + PacketHandler.INSTANCE.sendToServer(new MessageChiselMode(currentMode)); + } else { + currentMode = ChiselMode.next(currentMode); + PacketHandler.INSTANCE.sendToServer(new MessageChiselMode(currentMode)); + setButtonText(); + } } super.actionPerformed(button); } diff --git a/src/main/java/com/cricketcraft/chisel/item/chisel/ChiselController.java b/src/main/java/com/cricketcraft/chisel/item/chisel/ChiselController.java index 15b9a24c..f5f96690 100644 --- a/src/main/java/com/cricketcraft/chisel/item/chisel/ChiselController.java +++ b/src/main/java/com/cricketcraft/chisel/item/chisel/ChiselController.java @@ -13,6 +13,7 @@ import com.cricketcraft.chisel.Chisel; import com.cricketcraft.chisel.api.IChiselItem; import com.cricketcraft.chisel.api.carving.ICarvingGroup; import com.cricketcraft.chisel.api.carving.ICarvingVariation; +import com.cricketcraft.chisel.api.carving.IChiselMode; import com.cricketcraft.chisel.carving.Carving; import com.cricketcraft.chisel.carving.CarvingVariation; import com.cricketcraft.chisel.utils.General; @@ -72,7 +73,7 @@ public final class ChiselController { if (chisel.canChiselBlock(event.world, x, y, z, block, metadata)) { ItemStack target = General.getChiselTarget(held); - ChiselMode mode = General.getChiselMode(held); + IChiselMode mode = General.getChiselMode(held); ForgeDirection sideHit = ForgeDirection.VALID_DIRECTIONS[event.face]; if (target != null) { diff --git a/src/main/java/com/cricketcraft/chisel/item/chisel/ChiselMode.java b/src/main/java/com/cricketcraft/chisel/item/chisel/ChiselMode.java index b58129b2..0d2446c5 100644 --- a/src/main/java/com/cricketcraft/chisel/item/chisel/ChiselMode.java +++ b/src/main/java/com/cricketcraft/chisel/item/chisel/ChiselMode.java @@ -10,10 +10,11 @@ import net.minecraftforge.common.util.ForgeDirection; import com.cricketcraft.chisel.api.IChiselItem; import com.cricketcraft.chisel.api.carving.ICarvingVariation; +import com.cricketcraft.chisel.api.carving.IChiselMode; import com.cricketcraft.chisel.network.PacketHandler; import com.cricketcraft.chisel.network.message.MessageChiselSound; -public enum ChiselMode { +public enum ChiselMode implements IChiselMode { SINGLE { @@ -86,8 +87,6 @@ public enum ChiselMode { } }; - public abstract void chiselAll(EntityPlayer player, World world, int x, int y, int z, ForgeDirection side, ICarvingVariation variation); - /** * Assumes that the player is holding a chisel */ @@ -116,8 +115,11 @@ public enum ChiselMode { } } - public ChiselMode next() { - ChiselMode[] values = values(); - return values[(ordinal() + 1) % values.length]; + public static ChiselMode next(IChiselMode currentMode) { + if (currentMode instanceof ChiselMode) { + ChiselMode[] values = values(); + return values[(((ChiselMode) currentMode).ordinal() + 1) % values.length]; + } + return SINGLE; } } diff --git a/src/main/java/com/cricketcraft/chisel/network/message/MessageChiselMode.java b/src/main/java/com/cricketcraft/chisel/network/message/MessageChiselMode.java index db2ab62f..926c8a37 100644 --- a/src/main/java/com/cricketcraft/chisel/network/message/MessageChiselMode.java +++ b/src/main/java/com/cricketcraft/chisel/network/message/MessageChiselMode.java @@ -4,6 +4,8 @@ import io.netty.buffer.ByteBuf; import net.minecraft.item.ItemStack; import com.cricketcraft.chisel.api.IChiselItem; +import com.cricketcraft.chisel.api.carving.IAdvancedChisel; +import com.cricketcraft.chisel.api.carving.IChiselMode; import com.cricketcraft.chisel.item.chisel.ChiselMode; import com.cricketcraft.chisel.utils.General; @@ -12,7 +14,6 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; - public class MessageChiselMode implements IMessage { public MessageChiselMode(){ @@ -20,8 +21,8 @@ public class MessageChiselMode implements IMessage { private String mode; - public MessageChiselMode(ChiselMode current) { - this.mode = current.next().name(); + public MessageChiselMode(IChiselMode iChiselMode) { + this.mode = iChiselMode.name(); } public void toBytes(ByteBuf buf) { @@ -38,7 +39,11 @@ public class MessageChiselMode implements IMessage { public IMessage onMessage(MessageChiselMode message, MessageContext ctx) { ItemStack stack = ctx.getServerHandler().playerEntity.getCurrentEquippedItem(); if (stack != null && stack.getItem() instanceof IChiselItem) { - General.setChiselMode(stack, ChiselMode.valueOf(message.mode)); + if (stack.getItem() instanceof IAdvancedChisel) { + General.setChiselMode(stack, ((IAdvancedChisel) stack.getItem()).getMode(stack, message.mode)); + } else { + General.setChiselMode(stack, ChiselMode.valueOf(message.mode)); + } } return null; } diff --git a/src/main/java/com/cricketcraft/chisel/utils/General.java b/src/main/java/com/cricketcraft/chisel/utils/General.java index 5bff0697..fe37df73 100644 --- a/src/main/java/com/cricketcraft/chisel/utils/General.java +++ b/src/main/java/com/cricketcraft/chisel/utils/General.java @@ -15,7 +15,9 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; +import com.cricketcraft.chisel.api.carving.IAdvancedChisel; import com.cricketcraft.chisel.api.carving.ICarvingVariation; +import com.cricketcraft.chisel.api.carving.IChiselMode; import com.cricketcraft.chisel.carving.Carving; import com.cricketcraft.chisel.carving.CarvingVariation; import com.cricketcraft.chisel.item.chisel.ChiselMode; @@ -123,16 +125,21 @@ public class General { } private static final String MODE_KEY = "chiselMode"; - public static ChiselMode getChiselMode(ItemStack chisel) { + public static IChiselMode getChiselMode(ItemStack chisel) { if (chisel.stackTagCompound == null || Strings.isNullOrEmpty(chisel.stackTagCompound.getString(MODE_KEY))) { initTag(chisel); chisel.stackTagCompound.setString(MODE_KEY, ChiselMode.SINGLE.name()); } + + String name = chisel.stackTagCompound.getString(MODE_KEY); + if (chisel.getItem() instanceof IAdvancedChisel) { + return ((IAdvancedChisel)chisel.getItem()).getMode(chisel, name); + } return Enum.valueOf(ChiselMode.class, chisel.stackTagCompound.getString(MODE_KEY)); } - public static void setChiselMode(ItemStack chisel, ChiselMode mode) { + public static void setChiselMode(ItemStack chisel, IChiselMode mode) { initTag(chisel); chisel.stackTagCompound.setString(MODE_KEY, mode.name()); }