diff --git a/src/main/java/com/cricketcraft/chisel/Features.java b/src/main/java/com/cricketcraft/chisel/Features.java index 74920ccd..98d68dd0 100644 --- a/src/main/java/com/cricketcraft/chisel/Features.java +++ b/src/main/java/com/cricketcraft/chisel/Features.java @@ -1045,7 +1045,6 @@ public enum Features { ice_pillar.carverHelper.addVariation("tile.icePillar.5.desc", 5, "icepillar/carved"); ice_pillar.carverHelper.addVariation("tile.icePillar.6.desc", 6, "icepillar/ornamental"); ice_pillar.carverHelper.register(ice_pillar, "ice_pillar"); - Carving.chisel.setGroupClass("ice_pillar", "ice"); } @Override @@ -1465,7 +1464,6 @@ public enum Features { marble_pillar.carverHelper.addVariation("tile.marblePillar.15.desc", 15, "marblepillar/ornamental"); } marble_pillar.carverHelper.register(marble_pillar, "marble_pillar"); - Carving.chisel.setGroupClass("marble_pillar", "marble"); BlockCarvableSlab marble_pillar_slab = (BlockCarvableSlab) new BlockCarvableSlab(marble_pillar).setCreativeTab(ChiselTabs.tabStoneChiselBlocks).setHardness(2.0F).setResistance(10F) .setStepSound(Block.soundTypeStone); @@ -1639,7 +1637,6 @@ public enum Features { packedice_pillar.carverHelper.addVariation("tile.packedicePillar.5.desc", 5, "icepillar/carved"); packedice_pillar.carverHelper.addVariation("tile.packedicePillar.6.desc", 6, "icepillar/ornamental"); packedice_pillar.carverHelper.register(packedice_pillar, "packedice_pillar"); - Carving.chisel.setGroupClass("packedice_pillar", "packedice"); } }, diff --git a/src/main/java/com/cricketcraft/chisel/api/carving/CarvingUtils.java b/src/main/java/com/cricketcraft/chisel/api/carving/CarvingUtils.java new file mode 100644 index 00000000..f9950593 --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/api/carving/CarvingUtils.java @@ -0,0 +1,17 @@ +package com.cricketcraft.chisel.api.carving; + +public class CarvingUtils { + + /** + * The default implementation of {@link ICarvingVariation#compareTo(ICarvingVariation)} + * + * @param v1 + * The first {@link ICarvingVariation variation}. Usually 'this'. + * @param v2 + * The second {@link ICarvingVariation variation}. Usually the parameter to the {@code comapreTo} method. + * @return A positive integer if the first's order is greater, a negative integer if the second's is greater, and 0 if they are equal. + */ + public static int compare(ICarvingVariation v1, ICarvingVariation v2) { + return v1.getOrder() - v2.getOrder(); + } +} diff --git a/src/main/java/com/cricketcraft/chisel/api/carving/ICarvingGroup.java b/src/main/java/com/cricketcraft/chisel/api/carving/ICarvingGroup.java new file mode 100644 index 00000000..287929c8 --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/api/carving/ICarvingGroup.java @@ -0,0 +1,58 @@ +package com.cricketcraft.chisel.api.carving; + +import java.util.List; + +public interface ICarvingGroup { + + /** + * The name of this group. Used for internal identification. + * + * @return A string name for the group + */ + String getName(); + + /** + * Can return null. If null, fallback sound will be used (the standard chisel sound). + * + * @return The string resource path of the sound to use for chiseling items in this group + */ + String getSound(); + + /** + * Sets the sound of this group + * + * @param sound + * A string resource path for the sound this group makes when chiseled + */ + void setSound(String sound); + + /** + * The oredict name to match to this group. All items with this oredict name will be assumed to be part of this group. + * + * @return An ore dictionary name + */ + String getOreName(); + + /** + * Sets the oredict name for this group. + * + * @param oreName + * The String oredict name to be associated with this group. + */ + void setOreName(String oreName); + + /** + * Gets all carving variations associated with this group. + * + * @return A {@link List} of {@link ICarvingVariation}s + */ + List getVariations(); + + /** + * Adds a variation to this group. + * + * @param variation + * An {@link ICarvingVariation} to add to this group + */ + void addVariation(ICarvingVariation variation); +} diff --git a/src/main/java/com/cricketcraft/chisel/api/carving/ICarvingVariation.java b/src/main/java/com/cricketcraft/chisel/api/carving/ICarvingVariation.java new file mode 100644 index 00000000..6b09c259 --- /dev/null +++ b/src/main/java/com/cricketcraft/chisel/api/carving/ICarvingVariation.java @@ -0,0 +1,34 @@ +package com.cricketcraft.chisel.api.carving; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; + +/** + * Represents a variation of a chiselable block. + *

+ * Do note that while this interface extends {@link Comparable}, a default implementation of {@link Comparable#compareTo(Object)} is provided in + * {@link CarvingUtils#compare(ICarvingVariation, ICarvingVariation)} + */ +public interface ICarvingVariation extends Comparable { + + Block getBlock(); + + int getBlockMeta(); + + int getItemMeta(); + + /** + * Gets an {@link ItemStack} representing this variation. + * + * @return An {@link ItemStack} to represent this variation + */ + ItemStack getStack(); + + /** + * The "order" of this variation. Represents its position in the list of variations. + * + * @return An integer to represent the position of this variation in the list of all variations in the group + */ + int getOrder(); + +} diff --git a/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java b/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java index b495773b..cc79178a 100644 --- a/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java +++ b/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java @@ -284,7 +284,6 @@ public class CarvableHelper { if (!forbidChiseling) { Carving.chisel.addVariation(name + ".top", slab.top, variation.metadata, 0); - Carving.chisel.setGroupClass(name + ".top", name); } } } diff --git a/src/main/java/com/cricketcraft/chisel/carving/Carving.java b/src/main/java/com/cricketcraft/chisel/carving/Carving.java index 05366412..a62e0e6a 100644 --- a/src/main/java/com/cricketcraft/chisel/carving/Carving.java +++ b/src/main/java/com/cricketcraft/chisel/carving/Carving.java @@ -11,6 +11,7 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; import com.cricketcraft.chisel.Chisel; +import com.cricketcraft.chisel.api.carving.ICarvingVariation; public class Carving { @@ -29,26 +30,12 @@ public class Carving { return Block.blockRegistry.getNameForObject(block) + "|" + metadata; } - public boolean isVariationOfSameClass(Block target, int metadata1, Block block2, int metadata2) { - CarvingGroup group1 = carvingGroupsByVariation.get(key(target, metadata1)); - if (group1 == null) - return false; - - CarvingGroup group2 = carvingGroupsByVariation.get(key(block2, metadata2)); - if (group2 == null) - return false; - - return group1 == group2 || group1.className.equals(group2.className) && !group1.className.isEmpty(); - - } - - public CarvingVariation[] getVariations(Block block, int metadata) { + public List getVariations(Block block, int metadata) { CarvingGroup group = getGroup(block, metadata); if (group == null) return null; - CarvingVariation[] res = group.variations.toArray(new CarvingVariation[group.variations.size()]); - return res; + return group.getVariations(); } public String getOre(Block block, int metadata) { @@ -56,7 +43,7 @@ public class Carving { if (group == null) return null; - return group.oreName; + return group.getOreName(); } public ArrayList getItems(ItemStack chiseledItem) { @@ -70,20 +57,23 @@ public class Carving { HashMap mapping = new HashMap(); - if (group.variations != null) { - for (CarvingVariation v : group.variations) { + List variations = group.getVariations(); - String key = Block.getIdFromBlock(v.block) + "|" + v.damage; + if (!group.getVariations().isEmpty()) { + for (ICarvingVariation v : variations) { + + String key = Block.getIdFromBlock(v.getBlock()) + "|" + v.getItemMeta(); if (mapping.containsKey(key)) continue; mapping.put(key, 1); - items.add(new ItemStack(v.block, 1, v.damage)); + items.add(new ItemStack(v.getBlock(), 1, v.getItemMeta())); } } ArrayList ores; - if (group.oreName != null && ((ores = OreDictionary.getOres(group.oreName)) != null)) { + String oreName = group.getOreName(); + if (oreName != null && ((ores = OreDictionary.getOres(oreName)) != null)) { for (ItemStack stack : ores) { String key = Item.getIdFromItem(stack.getItem()) + "|" + stack.getItemDamage(); @@ -124,7 +114,6 @@ public class Carving { CarvingGroup group = carvingGroupsByName.get(name); if (group == null) { group = new CarvingGroup(name); - group.className = name; carvingGroupsByName.put(name, group); } @@ -139,8 +128,7 @@ public class Carving { return null; CarvingVariation variation = new CarvingVariation(block, metadata, order); - group.variations.add(variation); - Collections.sort(group.variations); + group.addVariation(variation); carvingGroupsByVariation.put(key(block, metadata), group); return variation; @@ -151,18 +139,12 @@ public class Carving { carvingGroupsByOre.put(oreName, group); - group.oreName = oreName; - } - - public void setGroupClass(String name, String className) { - CarvingGroup group = getGroup(name); - - group.className = className; + group.setOreName(oreName); } public void setVariationSound(String name, String sound) { CarvingGroup group = getGroup(name); - group.sound = sound; + group.setSound(sound); } public String getVariationSound(Block block, int metadata) { @@ -171,10 +153,10 @@ public class Carving { public String getVariationSound(Item item, int metadata) { CarvingGroup blockGroup = carvingGroupsByVariation.get(key(item, metadata)); - if (blockGroup == null || blockGroup.sound == null) + if (blockGroup == null || blockGroup.getSound() == null) return Chisel.MOD_ID + ":chisel.fallback"; - return blockGroup.sound; + return blockGroup.getSound(); } public List getSortedGroupNames() { diff --git a/src/main/java/com/cricketcraft/chisel/carving/CarvingGroup.java b/src/main/java/com/cricketcraft/chisel/carving/CarvingGroup.java index 09c40808..5f4ecf3f 100644 --- a/src/main/java/com/cricketcraft/chisel/carving/CarvingGroup.java +++ b/src/main/java/com/cricketcraft/chisel/carving/CarvingGroup.java @@ -1,33 +1,57 @@ package com.cricketcraft.chisel.carving; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import com.cricketcraft.chisel.api.carving.ICarvingGroup; +import com.cricketcraft.chisel.api.carving.ICarvingVariation; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; -public class CarvingGroup { +public class CarvingGroup implements ICarvingGroup { - public CarvingGroup(String n) { - name = n; + private String name; + private String sound; + private String oreName; + + private List variations = Lists.newArrayList(); + + public CarvingGroup(String name) { + this.name = name; } - String name; - String className; - String sound; - String oreName; - - List variations = new ArrayList(); - - public List getVariations() { + public List getVariations() { return ImmutableList.copyOf(variations); } + @Override + public void addVariation(ICarvingVariation variation) { + variations.add(variation); + Collections.sort(variations); + } + + @Override public String getName() { return name; } + @Override + public String getSound() { + return sound; + } + + @Override + public void setSound(String sound) { + this.sound = sound; + } + + @Override public String getOreName() { return oreName; } + @Override + public void setOreName(String oreName) { + this.oreName = oreName; + } } diff --git a/src/main/java/com/cricketcraft/chisel/carving/CarvingVariation.java b/src/main/java/com/cricketcraft/chisel/carving/CarvingVariation.java index 99da0f9e..42cc6d59 100644 --- a/src/main/java/com/cricketcraft/chisel/carving/CarvingVariation.java +++ b/src/main/java/com/cricketcraft/chisel/carving/CarvingVariation.java @@ -3,7 +3,15 @@ package com.cricketcraft.chisel.carving; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; -public class CarvingVariation implements Comparable { +import com.cricketcraft.chisel.api.carving.CarvingUtils; +import com.cricketcraft.chisel.api.carving.ICarvingVariation; + +public class CarvingVariation implements ICarvingVariation { + + private int order; + private Block block; + private int meta; + private int damage; public CarvingVariation(Block block, int metadata, int ord) { this.order = ord; @@ -13,17 +21,32 @@ public class CarvingVariation implements Comparable { } @Override - public int compareTo(CarvingVariation a) { - return order - a.order; - } - - public int order; - public Block block; - public int meta; - public int damage; - public ItemStack getStack() { return new ItemStack(block, 1, damage); } + @Override + public Block getBlock() { + return block; + } + + @Override + public int getBlockMeta() { + return meta; + } + + @Override + public int getItemMeta() { + return damage; + } + + @Override + public int getOrder() { + return order; + } + + @Override + public int compareTo(ICarvingVariation o) { + return CarvingUtils.compare(this, o); + } } diff --git a/src/main/java/com/cricketcraft/chisel/compat/nei/RecipeHandlerChisel.java b/src/main/java/com/cricketcraft/chisel/compat/nei/RecipeHandlerChisel.java index 572bf491..a3c686fc 100644 --- a/src/main/java/com/cricketcraft/chisel/compat/nei/RecipeHandlerChisel.java +++ b/src/main/java/com/cricketcraft/chisel/compat/nei/RecipeHandlerChisel.java @@ -15,6 +15,7 @@ import codechicken.nei.NEIServerUtils; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; +import com.cricketcraft.chisel.api.carving.ICarvingVariation; import com.cricketcraft.chisel.carving.Carving; import com.cricketcraft.chisel.carving.CarvingGroup; import com.cricketcraft.chisel.carving.CarvingVariation; @@ -164,7 +165,7 @@ public class RecipeHandlerChisel extends TemplateRecipeHandler { private static List getVariationStacks(CarvingGroup g) { List stacks = new ArrayList(); - for (CarvingVariation v : g.getVariations()) { + for (ICarvingVariation v : g.getVariations()) { stacks.add(v.getStack()); } String oreName = g.getOreName(); 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 e903fd56..b2b6fb18 100644 --- a/src/main/java/com/cricketcraft/chisel/item/chisel/ChiselController.java +++ b/src/main/java/com/cricketcraft/chisel/item/chisel/ChiselController.java @@ -49,28 +49,28 @@ public final class ChiselController { z = event.z; Block block = event.world.getBlock(x, y, z); int metadata = event.world.getBlockMetadata(x, y, z); - CarvingVariation[] variations = Carving.chisel.getVariations(block, metadata); + CarvingVariation[] variations = Carving.chisel.getVariations(block, metadata).toArray(new CarvingVariation[] {}); if (variations != null && chisel.canChiselBlock(event.world, x, y, z, block, metadata)) { ItemStack target = General.getChiselTarget(held); if (target != null) { for (CarvingVariation v : variations) { - if (v.block == Block.getBlockFromItem(target.getItem()) && v.meta == target.getItemDamage()) { + if (v.getBlock() == Block.getBlockFromItem(target.getItem()) && v.getBlockMeta() == target.getItemDamage()) { setVariation(event.entityPlayer, event.world, x, y, z, v, target); } } } else { for (int i = 0; i < variations.length; i++) { CarvingVariation v = variations[i]; - if (v.block == block && v.meta == metadata) { + if (v.getBlock() == block && v.getBlockMeta() == metadata) { variations = ArrayUtils.remove(variations, i--); } } int index = event.world.rand.nextInt(variations.length); CarvingVariation newVar = variations[index]; - setVariation(event.entityPlayer, event.world, x, y, z, newVar, new ItemStack(newVar.block, 1, newVar.damage)); + setVariation(event.entityPlayer, event.world, x, y, z, newVar, new ItemStack(newVar.getBlock(), 1, newVar.getItemMeta())); event.entityPlayer.inventory.currentItem = slot; } } @@ -89,8 +89,7 @@ public final class ChiselController { */ private void setVariation(EntityPlayer player, World world, int x, int y, int z, CarvingVariation v, ItemStack target) { PacketHandler.INSTANCE.sendTo(new MessageChiselSound(x, y, z, v), (EntityPlayerMP) player); - world.setBlock(x, y, z, v.block); - world.setBlockMetadataWithNotify(x, y, z, v.meta, 3); + world.setBlock(x, y, z, v.getBlock(), v.getBlockMeta(), 3); ((IChiselItem) player.getCurrentEquippedItem().getItem()).onChisel(world, player.inventory, player.inventory.currentItem, player.getCurrentEquippedItem(), target); } } diff --git a/src/main/java/com/cricketcraft/chisel/item/chisel/ItemChisel.java b/src/main/java/com/cricketcraft/chisel/item/chisel/ItemChisel.java index 16470d97..2eed31dc 100644 --- a/src/main/java/com/cricketcraft/chisel/item/chisel/ItemChisel.java +++ b/src/main/java/com/cricketcraft/chisel/item/chisel/ItemChisel.java @@ -17,7 +17,6 @@ import com.cricketcraft.chisel.api.ChiselMode; import com.cricketcraft.chisel.api.IChiselItem; import com.cricketcraft.chisel.carving.Carving; import com.cricketcraft.chisel.config.Configurations; -import com.cricketcraft.chisel.init.ChiselBlocks; import com.cricketcraft.chisel.utils.GeneralClient; public class ItemChisel extends Item implements IChiselItem { @@ -104,10 +103,8 @@ public class ItemChisel extends Item implements IChiselItem { String sound = carving.getVariationSound(target.getItem(), target.getItemDamage()); EntityPlayer player = Chisel.proxy.getClientPlayer(); GeneralClient.playChiselSound(world, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ), sound); - } else { - if (chisel.getItemDamage() >= chisel.getMaxDamage()) { - inv.decrStackSize(slot, 1); - } + } else if (chisel.getItemDamage() >= chisel.getMaxDamage()) { + inv.decrStackSize(slot, 1); } } diff --git a/src/main/java/com/cricketcraft/chisel/network/message/MessageChiselSound.java b/src/main/java/com/cricketcraft/chisel/network/message/MessageChiselSound.java index 5df9a879..8f7dee3c 100644 --- a/src/main/java/com/cricketcraft/chisel/network/message/MessageChiselSound.java +++ b/src/main/java/com/cricketcraft/chisel/network/message/MessageChiselSound.java @@ -23,8 +23,8 @@ public class MessageChiselSound extends MessageCoords { public MessageChiselSound(int x, int y, int z, CarvingVariation v) { super(x, y, z); - this.block = Block.getIdFromBlock(v.block); - this.meta = (byte) v.meta; + this.block = Block.getIdFromBlock(v.getBlock()); + this.meta = (byte) v.getBlockMeta(); } @Override