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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
|
package gregtech.api.multitileentity;
import static gregtech.GT_Mod.GT_FML_LOGGER;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import appeng.core.CreativeTab;
import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap;
import cpw.mods.fml.common.registry.GameRegistry;
import gregtech.api.GregTech_API;
import gregtech.api.enums.GT_Values;
import gregtech.api.multitileentity.base.MultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity;
import gregtech.api.util.GT_LanguageManager;
import gregtech.api.util.GT_Util;
import gregtech.api.util.GT_Utility;
public class MultiTileEntityRegistry {
private static final HashMap<String, MultiTileEntityRegistry> NAMED_REGISTRIES = new HashMap<>();
// TODO: NBT sensitive or not? Starting with not for now
private static final ItemStackMap<MultiTileEntityRegistry> REGISTRIES = new ItemStackMap<>(false);
private static final HashSet<Class<?>> sRegisteredTileEntities = new HashSet<>();
public HashMap<Short, CreativeTab> mCreativeTabs = new HashMap<>();
public Map<Short, MultiTileEntityClassContainer> mRegistry = new HashMap<>();
public List<MultiTileEntityClassContainer> mRegistrations = new ArrayList<>();
public final String mNameInternal;
public final MultiTileEntityBlockInternal mBlock;
private static MultiTileEntityBlockInternal regblock(String aNameInternal, MultiTileEntityBlockInternal aBlock,
Class<? extends ItemBlock> aItemClass) {
GameRegistry.registerBlock(aBlock, aItemClass == null ? ItemBlock.class : aItemClass, aNameInternal);
return aBlock;
}
/**
* @param aNameInternal the internal Name of the Item
*/
public MultiTileEntityRegistry(String aNameInternal) {
this(aNameInternal, new MultiTileEntityBlockInternal(), MultiTileEntityItemInternal.class);
}
/**
* @param aNameInternal the internal Name of the Item
*/
public MultiTileEntityRegistry(String aNameInternal, MultiTileEntityBlockInternal aBlock,
Class<? extends ItemBlock> aItemClass) {
this(aNameInternal, regblock(aNameInternal, aBlock, aItemClass));
}
/**
* @param aNameInternal the internal Name of the Item
*/
public MultiTileEntityRegistry(String aNameInternal, MultiTileEntityBlockInternal aBlock) {
if (!GregTech_API.sPreloadStarted || GregTech_API.sPreloadFinished) throw new IllegalStateException(
"The MultiTileEntity Registry must be initialised during Preload Phase and not before");
mNameInternal = aNameInternal;
mBlock = aBlock;
GT_FML_LOGGER.info(aNameInternal + " " + Block.getIdFromBlock(aBlock) + "This is the answer");
mBlock.mMultiTileEntityRegistry = this;
REGISTRIES.put(new ItemStack(Item.getItemFromBlock(aBlock), 1, GT_Values.W), this);
NAMED_REGISTRIES.put(mNameInternal, this);
}
public static TileEntity getCanonicalTileEntity(int aRegistryID, int aMultiTileEntityID) {
final MultiTileEntityRegistry tRegistry = getRegistry(aRegistryID);
if (tRegistry == null) return null;
final MultiTileEntityClassContainer tClassContainer = tRegistry.getClassContainer(aMultiTileEntityID);
if (tClassContainer == null) return null;
return tClassContainer.mCanonicalTileEntity;
}
public static MultiTileEntityRegistry getRegistry(int aRegistryID) {
return REGISTRIES.get(new ItemStack(Item.getItemById(aRegistryID), 1, GT_Values.W));
}
public static MultiTileEntityRegistry getRegistry(String aRegistryName) {
return NAMED_REGISTRIES.get(aRegistryName);
}
public MultiTileEntityClassContainer create(int aID, Class<? extends MultiTileEntity> aClass) {
return new MultiTileEntityClassContainer(this, aID, aClass);
}
/**
* Adds a new MultiTileEntity. It is highly recommended to do this in either the PreInit or the Init Phase. PostInit
* might not work well.
*/
public ItemStack add(String aLocalised, String aCategoricalName, MultiTileEntityClassContainer aClassContainer) {
boolean tFailed = false;
if (GT_Utility.isStringInvalid(aLocalised)) {
GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Localisation Missing!");
tFailed = true;
}
if (aClassContainer == null) {
GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container is null!");
tFailed = true;
} else {
if (aClassContainer.mClass == null) {
GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class inside Class Container is null!");
tFailed = true;
}
if (aClassContainer.mID == GT_Values.W) {
GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses Wildcard MetaData!");
tFailed = true;
}
if (aClassContainer.mID < 0) {
GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses negative MetaData!");
tFailed = true;
}
if (mRegistry.containsKey(aClassContainer.mID)) {
GT_FML_LOGGER.error(
"MULTI-TILE REGISTRY ERROR: Class Container uses occupied MetaData! (" + aClassContainer.mID
+ ")");
tFailed = true;
}
}
if (tFailed) {
GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: STACKTRACE START");
int i = 0;
for (StackTraceElement tElement : new Exception().getStackTrace()) if (i++ < 5 && !tElement.getClassName()
.startsWith(
"sun"))
GT_FML_LOGGER.error("\tat " + tElement);
else break;
GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: STACKTRACE END");
return null;
}
GT_LanguageManager.addStringLocalization(
mNameInternal + "." + aClassContainer.mID + ".name",
aLocalised,
false);
mRegistry.put(aClassContainer.mID, aClassContainer);
mLastRegisteredID = aClassContainer.mID;
mRegistrations.add(aClassContainer);
if (sRegisteredTileEntities.add(aClassContainer.mCanonicalTileEntity.getClass())) {
aClassContainer.mCanonicalTileEntity.onRegistrationFirst(this, aClassContainer.mID);
}
// // TODO: Recipe
// if (aRecipe != null && aRecipe.length > 1) {
// if (aRecipe[0] instanceof Object[]) aRecipe = (Object[])aRecipe[0];
// if (aRecipe.length > 2) CR.shaped(getItem(aClassContainer.mID), CR.DEF_REV_NCC, aRecipe);
// }
// // A simple special case to make it easier to add a Machine to Recipe Lists without having to worry
// about anything.
// String tRecipeMapName = aClassContainer.mParameters.getString(NBT_RECIPEMAP);
// if (GT_Utility.isStringValid(tRecipeMapName)) {RecipeMap tMap =
// RecipeMap.RECIPE_MAPS.get(tRecipeMapName); if (tMap != null)
// tMap.mRecipeMachineList.add(getItem(aClassContainer.mID));}
// tRecipeMapName = aClassContainer.mParameters.getString(NBT_FUELMAP);
// if (GT_Utility.isStringValid(tRecipeMapName)) {RecipeMap tMap =
// RecipeMap.RECIPE_MAPS.get(tRecipeMapName); if (tMap != null)
// tMap.mRecipeMachineList.add(getItem(aClassContainer.mID));}
//
return getItem(aClassContainer.mID);
}
public short mLastRegisteredID = GT_Values.W;
public ItemStack getItem() {
return getItem(mLastRegisteredID, 1, null);
}
public ItemStack getItem(int aID) {
return getItem(aID, 1, null);
}
public ItemStack getItem(int aID, NBTTagCompound aNBT) {
return getItem(aID, 1, aNBT);
}
public ItemStack getItem(int aID, long aAmount) {
return getItem(aID, aAmount, null);
}
public ItemStack getItem(int aID, long aAmount, NBTTagCompound aNBT) {
final ItemStack rStack = new ItemStack(mBlock, (int) aAmount, aID);
if (aNBT == null || aNBT.hasNoTags()) {
aNBT = new NBTTagCompound();
final MultiTileEntityContainer tTileEntityContainer = getNewTileEntityContainer(aID, aNBT);
if (tTileEntityContainer != null) ((IMultiTileEntity) tTileEntityContainer.mTileEntity).writeItemNBT(aNBT);
}
rStack.setTagCompound(aNBT);
return rStack;
}
public String getLocal(int aID) {
return StatCollector.translateToLocal(mNameInternal + "." + aID + ".name");
}
public MultiTileEntityClassContainer getClassContainer(int aID) {
return mRegistry.get((short) aID);
}
public MultiTileEntityClassContainer getClassContainer(ItemStack aStack) {
return mRegistry.get((short) Items.feather.getDamage(aStack));
}
public TileEntity getNewTileEntity(int aID) {
final MultiTileEntityContainer tContainer = getNewTileEntityContainer(null, 0, 0, 0, aID, null);
return tContainer == null ? null : tContainer.mTileEntity;
}
public MultiTileEntityContainer getNewTileEntityContainer(World aWorld, int aX, int aY, int aZ, int aID,
NBTTagCompound aNBT) {
final MultiTileEntityClassContainer tClass = mRegistry.get((short) aID);
if (tClass == null || tClass.mBlock == null) return null;
final MultiTileEntityContainer rContainer = new MultiTileEntityContainer(
(TileEntity) GT_Utility.callConstructor(tClass.mClass, -1, null, true),
tClass.mBlock,
tClass.mBlockMetaData);
if (rContainer.mTileEntity == null) return null;
rContainer.mTileEntity.setWorldObj(aWorld);
rContainer.mTileEntity.xCoord = aX;
rContainer.mTileEntity.yCoord = aY;
rContainer.mTileEntity.zCoord = aZ;
((IMultiTileEntity) rContainer.mTileEntity).initFromNBT(
aNBT == null || aNBT.hasNoTags() ? tClass.mParameters : GT_Util.fuseNBT(aNBT, tClass.mParameters),
(short) aID,
(short) Block.getIdFromBlock(mBlock));
return rContainer;
}
public TileEntity getNewTileEntity(World aWorld, int aX, int aY, int aZ, int aID) {
final MultiTileEntityContainer tContainer = getNewTileEntityContainer(aWorld, aX, aY, aZ, aID, null);
return tContainer == null ? null : tContainer.mTileEntity;
}
public TileEntity getNewTileEntity(ItemStack aStack) {
final MultiTileEntityContainer tContainer = getNewTileEntityContainer(
null,
0,
0,
0,
Items.feather.getDamage(aStack),
aStack.getTagCompound());
return tContainer == null ? null : tContainer.mTileEntity;
}
public TileEntity getNewTileEntity(World aWorld, int aX, int aY, int aZ, ItemStack aStack) {
final MultiTileEntityContainer tContainer = getNewTileEntityContainer(
aWorld,
aX,
aY,
aZ,
Items.feather.getDamage(aStack),
aStack.getTagCompound());
return tContainer == null ? null : tContainer.mTileEntity;
}
public MultiTileEntityContainer getNewTileEntityContainer(ItemStack aStack) {
return getNewTileEntityContainer(null, 0, 0, 0, Items.feather.getDamage(aStack), aStack.getTagCompound());
}
public MultiTileEntityContainer getNewTileEntityContainer(World aWorld, int aX, int aY, int aZ, ItemStack aStack) {
return getNewTileEntityContainer(aWorld, aX, aY, aZ, Items.feather.getDamage(aStack), aStack.getTagCompound());
}
public MultiTileEntityContainer getNewTileEntityContainer(int aID, NBTTagCompound aNBT) {
return getNewTileEntityContainer(null, 0, 0, 0, aID, aNBT);
}
}
|