aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java
blob: e6740a0663784f8d6e6d6acb7b73e41b1205e6bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package gregtech.api.multitileentity;

import gregtech.api.enums.Materials;
import gregtech.api.multitileentity.base.BaseMultiTileEntity;
import gregtech.api.util.GT_Util;
import net.minecraft.block.material.Material;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.Tuple;

import java.lang.ref.WeakReference;

import static gregtech.api.enums.GT_Values.NBT;

public class MultiTileEntityClassContainer {
    private final WeakReference<MultiTileEntityRegistry> mRegistry;
    private String mLocalized;
    private String mCategoryName;

    public final short mID;
    public Class<? extends BaseMultiTileEntity> mClass;
    public MultiTileEntityBlock mBlock;
    public BaseMultiTileEntity mCanonicalTileEntity;
    public NBTTagCompound mParameters;

    // These have defaults
    public byte mBlockMetaData = 1;
    public byte mStackSize = 64;
    public boolean mHidden = false;


    public MultiTileEntityClassContainer(MultiTileEntityRegistry aRegistry, int aID, Class<? extends BaseMultiTileEntity> aClass) {
        /* Start the Builder */
        mRegistry = new WeakReference<>(aRegistry);
        mID = (short) aID;
        mClass = aClass;
        mParameters = new NBTTagCompound();
    }

    public boolean register() {
        /* End and register the Builder with the registry */
        final MultiTileEntityRegistry registry = mRegistry.get();

        if (mParameters.hasKey(NBT.MATERIAL) && !mParameters.hasKey(NBT.COLOR))
            mParameters.setInteger(NBT.COLOR, GT_Util.getRGBInt(Materials.get(mParameters.getString(NBT.MATERIAL)).getRGBA()));

        try {mCanonicalTileEntity = mClass.newInstance();} catch (Throwable e) {throw new IllegalArgumentException(e);}
        mCanonicalTileEntity.initFromNBT(mParameters, mID, (short) -1);

        return registry != null && registry.add(this.mLocalized, this.mCategoryName, this) != null;
    }

    public MultiTileEntityClassContainer name(String aName) {
        mLocalized = aName;
        return this;
    }

    public MultiTileEntityClassContainer category(String aCategoryName) {
        mCategoryName = aCategoryName;
        return this;
    }

    public MultiTileEntityClassContainer meta(int aMeta) {
        mBlockMetaData = (byte) aMeta;
        return this;
    }

    public MultiTileEntityClassContainer stackSize(int aStackSize) {
        mStackSize = (byte) aStackSize;
        return this;
    }

    public MultiTileEntityClassContainer hide() {
        mHidden = true;
        return this;
    }

    public MultiTileEntityClassContainer setBlock(MultiTileEntityBlock aBlock) {
        mBlock = aBlock;
        return this;
    }

    /* These methods are builder methods for commonly used NBT tags */

    public MultiTileEntityClassContainer material(Material aMaterial) {
        mParameters.setString(NBT.MATERIAL, aMaterial.toString());
        return this;
    }

    public MultiTileEntityClassContainer texture(String aTexture) {
        mParameters.setString(NBT.TEXTURE, aTexture);
        return this;
    }

    public MultiTileEntityClassContainer tankCapacity(Long aCapacity) {
        mParameters.setLong(NBT.TANK_CAPACITY, aCapacity);
        return this;
    }

    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 */
        mParameters = GT_Util.fuseNBT(mParameters, GT_Util.makeNBT(aTags));
        return this;
    }

}