package com.cricketcraft.chisel.api.carving;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
/**
* Represents a registry of {@link ICarvingGroup}s
* <p>
* To obtain chisel's instance of this class, use {@link CarvingUtils#getChiselRegistry()}
*/
public interface ICarvingRegistry {
/* Getters */
/**
* Finds the group the block/meta pair belongs to in the registry.
*
* @param block
* The block of the variation
* @param meta
* The metadata of the variation
* @return The {@link ICarvingGroup} that the block/meta pair belongs to
*/
ICarvingGroup getGroup(Block block, int meta);
/**
* Gets an {@link ICarvingGroup} by its name.
*
* @param name
* The name of the group
* @return An {@link ICarvingGroup}
*/
ICarvingGroup getGroup(String name);
/**
* Gets the {@link ICarvingVariation} instance represented by this block/meta pair.
*
* @param block
* The block of the variatoin
* @param meta
* The metadata of the variation
* @return The {@link ICarvingVariation} containing this block/meta pair
*/
ICarvingVariation getVariation(Block block, int meta);
/**
* Gets the list of {@link ICarvingVariation}s from the group that contains this block/meta pair.
*
* @param block
* The block of the variation
* @param meta
* The metadata of the variation
* @return All of the {@link ICarvingVariation}s in the group that contains this block/meta pair
*/
List<ICarvingVariation> getGroupVariations(Block block, int meta);
/**
* Gets the oredict name for the group that contains this block/meta pair.
*
* @param block
* The block of the variation
* @param meta
* The metadata of the variation
* @return A string oredict name for the group
*/
String getOreName(Block block, int meta);
/**
* Gets the possible output items for this {@link ItemStack}. To be used for machines/GUIs that chisel items.
*
* @param chiseled
* The {@link ItemStack} being chiseled
* @return A list of stacks that can be chiseled from the passed {@link ItemStack stack}
*/
List<ItemStack> getItemsForChiseling(ItemStack chiseled);
/**
* Gets the sound resource string for the group represented by this block/meta pair.
*
* @param block
* The block of the variation
* @param metadata
* The metadata of the variation
* @return The string resource for the sound that can be used in {@link World#playSound(double, double, double, String, float, float, boolean)} and other methods.
*/
public String getVariationSound(Block block, int metadata);
/**
* Gets the sound resource string for the group represented by this item/meta pair.
* <p>
* Mostly a convenience for calling {@link #getVariationSound(Block, int)} with {@link Block#getBlockFromItem(Item)}.
*
* @param item
* The item of the variation
* @param metadata
* The metadata of the variation
* @return The string resource for the sound that can be used in {@link World#playSound(double, double, double, String, float, float, boolean)} and other methods.
*/
public String getVariationSound(Item item, int metadata);
/**
* @return A list of all registered group names, sorted alphabetically.
*/
List<String> getSortedGroupNames();
/* Setters */
/**
* Adds a variation to the registry.
*
* @param groupName
* The name of the group to add to.
* @param block
* The block of the variation
* @param metadata
* The metadata of the variation
* @param order
* The order of the variation in the list of all variations in the group. Higher numbers are sorted at the end.
*/
void addVariation(String groupName, Block block, int metadata, int order);
/**
* Adds a variation to the registry.
*
* @param groupName
* The name of the group to add to
* @param variation
* The {@link ICarvingVariation} to add
*/
void addVariation(String groupName, ICarvingVariation variation);
/**
* Adds a group to the registry.
*
* @param group
* The {@link ICarvingGroup} to add.
*/
void addGroup(ICarvingGroup group);
/**
* Removes a group from the registry.
* <p>
* This in effect removes all variations associated with the group, though they are not explicitly removed from the object. If you maintain a reference to the {@link ICarvingGroup} that is
* removed, it will still contain its variations.
*
* @param groupName
* The name of the group to remove.
* @return The {@link ICarvingGroup} that was removed.
*/
ICarvingGroup removeGroup(String groupName);
/**
* Removes a varaition with the passed {@link Block} and metadata from the registry. If this variation is registered with mutiple groups, it will remove it from all of them.
*
* @param block
* The {@link Block} of the {@link ICarvingVariation variation}
* @param metadata
* The metadata of the {@link ICarvingVariation variation}
* @return The ICarvingVariation that was removed. Null if nothing was removed.
*/
ICarvingVariation removeVariation(Block block, int metadata);
/**
* Removes a varaition with the passed {@link Block} and metadata from the registry, but only from the specified {@link ICarvingGroup} name.
*
* @param block
* The {@link Block} of the {@link ICarvingVariation variation}
* @param metadata
* The metadata of the {@link ICarvingVariation variation}
* @param group
* The name of the group that the variation should be removed from
* @return The ICarvingVariation that was removed. Null if nothing was removed.
*/
ICarvingVariation removeVariation(Block block, int metadata, String group);
/**
* Registers a group to an oredict name.
* <p>
* Doing this means that all blocks that are registered to this oredict name will act as if they are a part of this group.
*
* @param groupName
* The name of the group
* @param oreName
* The oredict name
*/
void registerOre(String groupName, String oreName);
/**
* Sets the sound resource for a group.
* <p>
* This is the sound that is used when a block from this group is chiseled. <br/>
* Does <i>not</i> need to be explicitly set.
*
* @param name
* The name of the group
* @param sound
* The resource string for the sound
*/
void setVariationSound(String name, String sound);
}