diff options
Diffstat (limited to 'src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java')
-rw-r--r-- | src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java new file mode 100644 index 0000000000..325f583149 --- /dev/null +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java @@ -0,0 +1,208 @@ +package gregtech.api.multitileentity; + +import static gregtech.api.enums.GT_Values.NBT; + +import java.lang.ref.WeakReference; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Tuple; + +import gregtech.api.enums.Materials; +import gregtech.api.multitileentity.base.MultiTileEntity; +import gregtech.api.multitileentity.multiblock.casing.FunctionalCasing; +import gregtech.api.multitileentity.multiblock.casing.UpgradeCasing; +import gregtech.api.util.GT_Util; +import gregtech.common.tileentities.casings.upgrade.Inventory; +import gregtech.common.tileentities.casings.upgrade.Tank; + +public class MultiTileEntityClassContainer { + + private final WeakReference<MultiTileEntityRegistry> registry; + private String localized; + private String categoryName; + + private final short muteID; + private final Class<? extends MultiTileEntity> muteClass; + private MultiTileEntity referenceTileEntity; + private NBTTagCompound parameters; + + public boolean hidden = false; + + public MultiTileEntityClassContainer(MultiTileEntityRegistry aRegistry, int aID, + Class<? extends MultiTileEntity> aClass) { + /* Start the Builder */ + registry = new WeakReference<>(aRegistry); + muteID = (short) aID; + muteClass = aClass; + parameters = new NBTTagCompound(); + } + + public boolean register() { + /* End and register the Builder with the registry */ + final MultiTileEntityRegistry registry = this.registry.get(); + + if (parameters.hasKey(NBT.MATERIAL) && !parameters.hasKey(NBT.COLOR)) parameters.setInteger( + NBT.COLOR, + GT_Util.getRGBInt( + Materials.get(parameters.getString(NBT.MATERIAL)) + .getRGBA())); + + try { + referenceTileEntity = muteClass.getDeclaredConstructor() + .newInstance(); + } catch (Throwable e) { + throw new IllegalArgumentException(e); + } + referenceTileEntity.initFromNBT(parameters, muteID, (short) -1); + + return registry != null && registry.add(this.localized, this) != null; + } + + public MultiTileEntityClassContainer name(String aName) { + localized = aName; + return this; + } + + public MultiTileEntityClassContainer category(String aCategoryName) { + categoryName = aCategoryName; + return this; + } + + public MultiTileEntityClassContainer hide() { + hidden = true; + return this; + } + + /* These methods are builder methods for commonly used NBT tags */ + + // Need a base texture for the MTE machine, and then a separate texture set for the machine/active overlays + + public MultiTileEntityClassContainer material(Materials material) { + // Sets the material, and the color from the material, if not already set + parameters.setString(NBT.MATERIAL, material.toString()); + if (!parameters.hasKey(NBT.COLOR)) parameters.setInteger(NBT.COLOR, GT_Util.getRGBInt(material.getRGBA())); + return this; + } + + public MultiTileEntityClassContainer color(int rbg) { + parameters.setInteger(NBT.COLOR, rbg); + return this; + } + + public MultiTileEntityClassContainer color(short[] rgba) { + parameters.setInteger(NBT.COLOR, GT_Util.getRGBInt(rgba)); + return this; + } + + public MultiTileEntityClassContainer textureFolder(String texture) { + parameters.setString(NBT.TEXTURE_FOLDER, texture); + return this; + } + + public MultiTileEntityClassContainer inputInventorySize(int aSize) { + parameters.setInteger(NBT.INV_INPUT_SIZE, aSize); + return this; + } + + public MultiTileEntityClassContainer outputInventorySize(int aSize) { + parameters.setInteger(NBT.INV_OUTPUT_SIZE, aSize); + return this; + } + + public MultiTileEntityClassContainer tankCapacity(Long aCapacity) { + parameters.setLong(NBT.TANK_CAPACITY, aCapacity); + return this; + } + + public MultiTileEntityClassContainer tier(int aTier) { + verifyDescendentOfMultiple(true, UpgradeCasing.class, FunctionalCasing.class); + parameters.setInteger(NBT.TIER, aTier); + return this; + } + + public MultiTileEntityClassContainer upgradeInventorySize(int aSize) { + verifyDescendentOf(Inventory.class); + + parameters.setInteger(NBT.UPGRADE_INVENTORY_SIZE, aSize); + return this; + } + + public MultiTileEntityClassContainer upgradeTankCount(int count) { + verifyDescendentOf(Tank.class); + + parameters.setInteger(NBT.UPGRADE_TANK_COUNT, count); + return this; + } + + public MultiTileEntityClassContainer upgradeTankCapacity(Long aCapacity) { + parameters.setLong(NBT.UPGRADE_TANK_CAPACITY, aCapacity); + return this; + } + + public MultiTileEntityClassContainer upgradeAmperage(long amperage) { + parameters.setLong(NBT.UPGRADE_AMPERAGE, amperage); + return this; + } + + @SuppressWarnings("unused") + public MultiTileEntityClassContainer setNBT(String key, Object val) { + return setNBT(new Tuple(key, val)); + } + + public MultiTileEntityClassContainer setNBT(Tuple... aTags) { + /* + * Merge in arbitrary NBT tuples of (key, value). Useful for anything for which a custom method has not yet been + * exposed + */ + parameters = GT_Util.fuseNBT(parameters, GT_Util.makeNBT(aTags)); + return this; + } + + public WeakReference<MultiTileEntityRegistry> getRegistry() { + return registry; + } + + public Class<? extends MultiTileEntity> getMuteClass() { + return muteClass; + } + + public short getMuteID() { + return muteID; + } + + public MultiTileEntity getReferenceTileEntity() { + return referenceTileEntity; + } + + public NBTTagCompound getParameters() { + return parameters; + } + + private void verifyDescendentOf(Class<?> cls) { + // Check if cls is extended by mClass + if (!cls.isAssignableFrom(muteClass)) { + throw new IllegalArgumentException( + "Expected a descendent of " + cls.getName() + " got " + muteClass.getName() + " instead."); + } + } + + private void verifyDescendentOfMultiple(boolean onlyOne, Class<?>... classes) { + boolean atLeastOne = false; + final StringBuilder classNames = new StringBuilder(); + for (Class<?> cls : classes) { + classNames.append(cls.getName()) + .append(" "); + if (!onlyOne) { + verifyDescendentOf(cls); + atLeastOne = true; + } else if (cls.isAssignableFrom(muteClass)) { + atLeastOne = true; + } + } + + if (!atLeastOne) { + throw new IllegalArgumentException( + "Expected a descendent of any of these " + classNames + " got " + muteClass.getName() + " instead."); + } + } +} |