diff --git a/patches/minecraft/net/minecraft/util/registry/RegistryNamespacedDefaultedByKey.java.patch b/patches/minecraft/net/minecraft/util/registry/RegistryNamespacedDefaultedByKey.java.patch deleted file mode 100644 index a6441f767..000000000 --- a/patches/minecraft/net/minecraft/util/registry/RegistryNamespacedDefaultedByKey.java.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- ../src-base/minecraft/net/minecraft/util/registry/RegistryNamespacedDefaultedByKey.java -+++ ../src-work/minecraft/net/minecraft/util/registry/RegistryNamespacedDefaultedByKey.java -@@ -63,4 +63,11 @@ - V v = (V)super.func_186801_a(p_186801_1_); - return (V)(v == null ? this.field_148761_e : v); - } -+ -+ //Bypass functions to allow querying this registry WITHOUT getting the defaulted value. -+ // MODDERS DO NOT USE THIS IS FOR FORGE INTERNAL CHECKS -+ public int getIDForObjectBypass(@Nullable V bypass) { return super.func_148757_b(bypass); } -+ @Nullable public K getNameForObjectBypass(V value) { return super.func_177774_c(value); } -+ @Nullable public V getObjectBypass(K name) { return super.func_82594_a(name); } -+ @Nullable public V getObjectByIdBypass(int id){ return super.func_148754_a(id); } - } diff --git a/src/main/java/net/minecraftforge/client/event/ModelRegistryEvent.java b/src/main/java/net/minecraftforge/client/event/ModelRegistryEvent.java index b14025ceb..be3e5968a 100644 --- a/src/main/java/net/minecraftforge/client/event/ModelRegistryEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ModelRegistryEvent.java @@ -20,10 +20,11 @@ package net.minecraftforge.client.event; import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.fml.common.eventhandler.IContextSetter; /** * Fired when the {@link net.minecraftforge.client.model.ModelLoader} is ready to receive registrations */ -public class ModelRegistryEvent extends Event +public class ModelRegistryEvent extends Event implements IContextSetter { } diff --git a/src/main/java/net/minecraftforge/common/ForgeModContainer.java b/src/main/java/net/minecraftforge/common/ForgeModContainer.java index d15089886..42f14ee7d 100644 --- a/src/main/java/net/minecraftforge/common/ForgeModContainer.java +++ b/src/main/java/net/minecraftforge/common/ForgeModContainer.java @@ -82,12 +82,14 @@ import com.google.common.eventbus.Subscribe; import net.minecraftforge.fml.client.FMLFileResourcePack; import net.minecraftforge.fml.client.FMLFolderResourcePack; import net.minecraftforge.fml.client.event.ConfigChangedEvent.OnConfigChangedEvent; +import net.minecraftforge.fml.common.AutomaticEventSubscriber; import net.minecraftforge.fml.common.DummyModContainer; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.ICrashCallable; import net.minecraftforge.fml.common.LoadController; import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.ModMetadata; import net.minecraftforge.fml.common.WorldAccessContainer; import net.minecraftforge.fml.common.discovery.ASMDataTable.ASMData; @@ -103,6 +105,7 @@ import net.minecraftforge.fml.common.network.NetworkRegistry; import javax.annotation.Nullable; +@EventBusSubscriber(modid = "forge") public class ForgeModContainer extends DummyModContainer implements WorldAccessContainer { public static final String VERSION_CHECK_CAT = "version_checking"; @@ -444,6 +447,7 @@ public class ForgeModContainer extends DummyModContainer implements WorldAccessC NetworkRegistry.INSTANCE.register(this, this.getClass(), "*", evt.getASMHarvestedData()); ForgeNetworkHandler.registerChannel(this, evt.getSide()); ConfigManager.sync(this.getModId(), Config.Type.INSTANCE); + MinecraftForge.EVENT_BUS.register(this); } @Subscribe diff --git a/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java b/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java index 7d6e909c9..0b9673b43 100644 --- a/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java +++ b/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java @@ -29,9 +29,6 @@ import net.minecraftforge.fml.common.discovery.asm.ModAnnotation; import net.minecraftforge.fml.relauncher.Side; import org.apache.logging.log4j.Level; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.Arrays; import java.util.EnumSet; import java.util.List; import java.util.Set; @@ -56,6 +53,7 @@ public class AutomaticEventSubscriber try { //noinspection unchecked + @SuppressWarnings("unchecked") List sidesEnum = (List)targ.getAnnotationInfo().get("value"); EnumSet sides = DEFAULT; if (sidesEnum != null) { @@ -65,7 +63,7 @@ public class AutomaticEventSubscriber } } if (sides == DEFAULT || sides.contains(side)) { - FMLLog.log.debug("Found @EventBusSubscriber class {}", targ.getClassName()); + //FMLLog.log.debug("Found @EventBusSubscriber class {}", targ.getClassName()); String amodid = (String)targ.getAnnotationInfo().get("modid"); if (Strings.isNullOrEmpty(amodid)) { amodid = ASMDataTable.getOwnerModID(mods, targ); @@ -79,6 +77,7 @@ public class AutomaticEventSubscriber FMLLog.log.debug("Skipping @EventBusSubscriber injection for {} since it is not for mod {}", targ.getClassName(), mod.getModId()); continue; //We're not injecting this guy } + FMLLog.log.debug("Registering @EventBusSubscriber for {} for mod {}", targ.getClassName(), mod.getModId()); Class subscriptionTarget = Class.forName(targ.getClassName(), true, mcl); MinecraftForge.EVENT_BUS.register(subscriptionTarget); FMLLog.log.debug("Injected @EventBusSubscriber class {}", targ.getClassName()); diff --git a/src/main/java/net/minecraftforge/fml/common/Loader.java b/src/main/java/net/minecraftforge/fml/common/Loader.java index 54efe5f02..2cca00e63 100644 --- a/src/main/java/net/minecraftforge/fml/common/Loader.java +++ b/src/main/java/net/minecraftforge/fml/common/Loader.java @@ -642,9 +642,9 @@ public class Loader ObjectHolderRegistry.INSTANCE.findObjectHolders(discoverer.getASMTable()); ItemStackHolderInjector.INSTANCE.findHolders(discoverer.getASMTable()); CapabilityManager.INSTANCE.injectCapabilities(discoverer.getASMTable()); + modController.distributeStateMessage(LoaderState.PREINITIALIZATION, discoverer.getASMTable(), canonicalConfigDir); GameData.fireRegistryEvents(); FMLCommonHandler.instance().fireSidedRegistryEvents(); - modController.distributeStateMessage(LoaderState.PREINITIALIZATION, discoverer.getASMTable(), canonicalConfigDir); ObjectHolderRegistry.INSTANCE.applyObjectHolders(); ItemStackHolderInjector.INSTANCE.inject(); modController.transition(LoaderState.INITIALIZATION, false); @@ -1003,11 +1003,11 @@ public class Loader return true; } - public void fireRemapEvent(Map remapBlocks, Map remapItems, boolean isFreezing) + public void fireRemapEvent(Map> remaps, boolean isFreezing) { if (modController!=null) { - modController.propogateStateMessage(new FMLModIdMappingEvent(remapBlocks, remapItems, isFreezing)); + modController.propogateStateMessage(new FMLModIdMappingEvent(remaps, isFreezing)); } } diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLModIdMappingEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLModIdMappingEvent.java index 073d44a76..0477dc9b3 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLModIdMappingEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLModIdMappingEvent.java @@ -20,13 +20,13 @@ package net.minecraftforge.fml.common.event; import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; - import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + import net.minecraft.util.ResourceLocation; /** @@ -42,48 +42,49 @@ import net.minecraft.util.ResourceLocation; * @see net.minecraftforge.fml.common.Mod.EventHandler for how to subscribe to this event * @author cpw */ -public class FMLModIdMappingEvent extends FMLEvent { - public enum RemapTarget { BLOCK, ITEM } +public class FMLModIdMappingEvent extends FMLEvent +{ public class ModRemapping { + public final ResourceLocation registry; + public final ResourceLocation key; public final int oldId; public final int newId; - public final String tag; - public final RemapTarget remapTarget; - public final ResourceLocation resourceLocation; - public ModRemapping(int oldId, int newId, ResourceLocation tag, RemapTarget type) + private ModRemapping(ResourceLocation registry, ResourceLocation key, int oldId, int newId) { + this.registry = registry; + this.key = key; this.oldId = oldId; this.newId = newId; - this.tag = tag.toString(); - this.remapTarget = type; - this.resourceLocation = tag; } - } - public final ImmutableList remappedIds; + + private final Map> remaps; + private final ImmutableSet keys; + public final boolean isFrozen; - public FMLModIdMappingEvent(Map blocks, Map items, boolean isFrozen) + public FMLModIdMappingEvent(Map> remaps, boolean isFrozen) { this.isFrozen = isFrozen; - List remappings = Lists.newArrayList(); - for (Entry mapping : blocks.entrySet()) + this.remaps = Maps.newHashMap(); + remaps.forEach((name, rm) -> { - remappings.add(new ModRemapping(mapping.getValue()[0], mapping.getValue()[1], mapping.getKey(), RemapTarget.BLOCK)); - } - for (Entry mapping : items.entrySet()) - { - remappings.add(new ModRemapping(mapping.getValue()[0], mapping.getValue()[1], mapping.getKey(), RemapTarget.ITEM)); - } - - Collections.sort(remappings, new Comparator() { - @Override - public int compare(ModRemapping o1, ModRemapping o2) - { - return (o1.newId < o2.newId) ? -1 : ((o1.newId == o2.newId) ? 0 : 1); - } + List tmp = Lists.newArrayList(); + rm.entrySet().forEach(e -> tmp.add(new ModRemapping(name, e.getKey(), e.getValue()[0], e.getValue()[1]))); + Collections.sort(tmp, (o1, o2) -> (o1.newId < o2.newId) ? -1 : ((o1.newId == o2.newId) ? 0 : 1)); + this.remaps.put(name, ImmutableList.copyOf(tmp)); }); - remappedIds = ImmutableList.copyOf(remappings); + this.keys = ImmutableSet.copyOf(this.remaps.keySet()); + } + + public ImmutableSet getRegistries() + { + return this.keys; + } + + public ImmutableList getRemaps(ResourceLocation registry) + { + return this.remaps.get(registry); } } diff --git a/src/main/java/net/minecraftforge/fml/common/registry/GameRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/GameRegistry.java index 35c57403f..f22474d33 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/GameRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/GameRegistry.java @@ -241,8 +241,7 @@ public class GameRegistry public static void registerTileEntity(Class tileEntityClass, String key) { - throw new RuntimeException("TODO: TileEntity registration"); - //TileEntity.register(key, tileEntityClass); + TileEntity.register(key, tileEntityClass); } public static void registerFuelHandler(IFuelHandler handler) diff --git a/src/main/java/net/minecraftforge/registries/ForgeRegistry.java b/src/main/java/net/minecraftforge/registries/ForgeRegistry.java index 758e202da..b54a8d8f0 100644 --- a/src/main/java/net/minecraftforge/registries/ForgeRegistry.java +++ b/src/main/java/net/minecraftforge/registries/ForgeRegistry.java @@ -40,7 +40,7 @@ public class ForgeRegistry> implements IForgeRe private final BiMap names = HashBiMap.create(); private final Class superType; private final Map aliases = Maps.newHashMap(); - private final Map slaves = Maps.newHashMap(); + final Map slaves = Maps.newHashMap(); private final ResourceLocation defaultKey; private final CreateCallback create; private final AddCallback add; @@ -427,13 +427,14 @@ public class ForgeRegistry> implements IForgeRe this.ids.clear(); this.names.clear(); this.availabilityMap.clear(0, this.availabilityMap.length()); + this.defaultValue = null; this.isFrozen = false; boolean errored = false; for (Entry entry : from.names.entrySet()) { - int id = from.ids.inverse().get(entry.getKey()); + int id = from.getID(entry.getKey()); int realId = add(id, entry.getValue()); if (id != realId && id != -1) { @@ -501,11 +502,20 @@ public class ForgeRegistry> implements IForgeRe return this.isFrozen; } + /** + * Used to control the times where people can modify this registry. + * Users should only ever register things in the Register events! + */ public void freeze() { this.isFrozen = true; } + public void unfreeze() + { + this.isFrozen = false; + } + RegistryEvent.Register getRegisterEvent(ResourceLocation name) { return new RegistryEvent.Register(name, this); diff --git a/src/main/java/net/minecraftforge/registries/GameData.java b/src/main/java/net/minecraftforge/registries/GameData.java index 90fbc424f..02f885948 100644 --- a/src/main/java/net/minecraftforge/registries/GameData.java +++ b/src/main/java/net/minecraftforge/registries/GameData.java @@ -63,6 +63,7 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -101,6 +102,7 @@ public class GameData private static final ResourceLocation BLOCKSTATE_TO_ID = new ResourceLocation("minecraft:blockstatetoid"); private static boolean hasInit = false; private static final boolean DISABLE_VANILLA_REGISTRIES = Boolean.parseBoolean(System.getProperty("forge.disableVanillaGameData", "false")); // Use for unit tests/debugging + private static final BiConsumer> LOCK_VANILLA = (name, reg) -> reg.slaves.values().stream().filter(o -> o instanceof ILockableRegistry).forEach(o -> ((ILockableRegistry)o).lock()); static { init(); @@ -192,8 +194,13 @@ public class GameData final Class clazz = RegistryManager.ACTIVE.getSuperType(r.getKey()); loadRegistry(r.getKey(), RegistryManager.ACTIVE, RegistryManager.VANILLA, clazz, true); } - RegistryManager.VANILLA.registries.forEach((name, reg) -> reg.validateContent(name)); - RegistryManager.ACTIVE.registries.forEach((name, reg) -> reg.freeze()); + RegistryManager.VANILLA.registries.forEach((name, reg) -> + { + reg.validateContent(name); + reg.freeze(); + }); + RegistryManager.VANILLA.registries.forEach(LOCK_VANILLA); + RegistryManager.ACTIVE.registries.forEach(LOCK_VANILLA); FMLLog.fine("Vanilla freeze snapshot created"); } @@ -206,7 +213,11 @@ public class GameData final Class clazz = RegistryManager.ACTIVE.getSuperType(r.getKey()); loadRegistry(r.getKey(), RegistryManager.ACTIVE, RegistryManager.FROZEN, clazz, true); } - RegistryManager.FROZEN.registries.forEach((name, reg) -> reg.validateContent(name)); + RegistryManager.FROZEN.registries.forEach((name, reg) -> + { + reg.validateContent(name); + reg.freeze(); + }); RegistryManager.ACTIVE.registries.forEach((name, reg) -> reg.freeze()); FMLLog.fine("All registries frozen"); } @@ -227,7 +238,7 @@ public class GameData loadRegistry(r.getKey(), RegistryManager.FROZEN, RegistryManager.ACTIVE, clazz, true); } // the id mapping has reverted, fire remap events for those that care about id changes - Loader.instance().fireRemapEvent(ImmutableMap.of(), ImmutableMap.of(), true); + Loader.instance().fireRemapEvent(ImmutableMap.of(), true); // the id mapping has reverted, ensure we sync up the object holders ObjectHolderRegistry.INSTANCE.applyObjectHolders(); @@ -574,30 +585,25 @@ public class GameData }); } - /* // Validate that all the STAGING data is good - forAllRegistries(PersistentRegistry.STAGING, ValidateRegistryFunction.OPERATION); + STAGING.registries.forEach((name, reg) -> reg.validateContent(name)); // Load the STAGING registry into the ACTIVE registry - for (Map.Entry> r : PersistentRegistry.ACTIVE.registries.entrySet()) + for (Map.Entry>> r : RegistryManager.ACTIVE.registries.entrySet()) { - final Class registrySuperType = PersistentRegistry.ACTIVE.getRegistrySuperType(r.getKey()); - loadRegistry(r.getKey(), PersistentRegistry.STAGING, PersistentRegistry.ACTIVE, registrySuperType); + final Class registrySuperType = RegistryManager.ACTIVE.getSuperType(r.getKey()); + loadRegistry(r.getKey(), STAGING, RegistryManager.ACTIVE, registrySuperType, true); } // Dump the active registry - forAllRegistries(PersistentRegistry.ACTIVE, DumpRegistryFunction.OPERATION); + RegistryManager.ACTIVE.registries.forEach((name, reg) -> reg.dump(name)); // Tell mods that the ids have changed - Loader.instance().fireRemapEvent(remaps.get(BLOCKS), remaps.get(ITEMS), false); + Loader.instance().fireRemapEvent(remaps, false); // The id map changed, ensure we apply object holders ObjectHolderRegistry.INSTANCE.applyObjectHolders(); - // Clean out the staging registry now, we're done with it - PersistentRegistry.STAGING.clean(); - */ - // Return an empty list, because we're good return ArrayListMultimap.create(); } @@ -648,6 +654,10 @@ public class GameData { List keys = Lists.newArrayList(RegistryManager.ACTIVE.registries.keySet()); Collections.sort(keys, (o1, o2) -> o1.toString().compareToIgnoreCase(o2.toString())); + RegistryManager.ACTIVE.registries.forEach((name, reg) -> { + if (filter.test(name)) + ((ForgeRegistry)reg).unfreeze(); + }); if (filter.test(BLOCKS)) { @@ -666,5 +676,11 @@ public class GameData MinecraftForge.EVENT_BUS.post(RegistryManager.ACTIVE.getRegistry(rl).getRegisterEvent(rl)); } ObjectHolderRegistry.INSTANCE.applyObjectHolders(); // inject everything else + + + RegistryManager.ACTIVE.registries.forEach((name, reg) -> { + if (filter.test(name)) + ((ForgeRegistry)reg).freeze(); + }); } } diff --git a/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java b/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java index b241f62bf..855eff1fb 100644 --- a/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java +++ b/src/main/java/net/minecraftforge/registries/NamespacedDefaultedWrapper.java @@ -10,6 +10,8 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.Validate; +import com.google.common.collect.Maps; + import net.minecraft.util.ResourceLocation; import net.minecraft.util.registry.RegistryNamespacedDefaultedByKey; import net.minecraftforge.fml.common.FMLLog; @@ -108,9 +110,6 @@ class NamespacedDefaultedWrapper> extends Regis } //internal - @Override //We override all public methods, this should be fine as null. - protected Map createUnderlyingMap(){ return null; } - @Override public void lock(){ this.locked = true; } diff --git a/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java b/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java index be6d8924d..2d42fce05 100644 --- a/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java +++ b/src/main/java/net/minecraftforge/registries/NamespacedWrapper.java @@ -104,9 +104,6 @@ class NamespacedWrapper> extends RegistryNamesp } //internal - @Override //We override all public methods, this should be fine as null. - protected Map createUnderlyingMap(){ return null; } - @Override public void lock(){ this.locked = true; } diff --git a/src/main/java/net/minecraftforge/registries/ObjectHolderRef.java b/src/main/java/net/minecraftforge/registries/ObjectHolderRef.java index cd650f69d..4636fb2c2 100644 --- a/src/main/java/net/minecraftforge/registries/ObjectHolderRef.java +++ b/src/main/java/net/minecraftforge/registries/ObjectHolderRef.java @@ -164,6 +164,7 @@ class ObjectHolderRef private static Method fieldAccessorSet; static Field makeWritable(Field f) throws Exception { + f.setAccessible(true); if (modifiersField == null) { Method getReflectionFactory = Class.forName("sun.reflect.ReflectionFactory").getDeclaredMethod("getReflectionFactory"); diff --git a/src/main/java/net/minecraftforge/registries/ObjectHolderRegistry.java b/src/main/java/net/minecraftforge/registries/ObjectHolderRegistry.java index f0ca8d248..20d4191de 100644 --- a/src/main/java/net/minecraftforge/registries/ObjectHolderRegistry.java +++ b/src/main/java/net/minecraftforge/registries/ObjectHolderRegistry.java @@ -27,6 +27,7 @@ import java.util.Set; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.FMLLog; +import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.discovery.ASMDataTable; import net.minecraftforge.fml.common.discovery.ASMDataTable.ASMData; import net.minecraftforge.fml.common.registry.GameRegistry; @@ -52,6 +53,11 @@ public enum ObjectHolderRegistry Set allObjectHolders = table.getAll(GameRegistry.ObjectHolder.class.getName()); Map classModIds = Maps.newHashMap(); Map> classCache = Maps.newHashMap(); + for (ASMData data : table.getAll(Mod.class.getName())) + { + String modid = (String)data.getAnnotationInfo().get("modid"); + classModIds.put(data.getClassName(), modid); + } for (ASMData data : allObjectHolders) { String className = data.getClassName(); @@ -119,7 +125,7 @@ public enum ObjectHolderRegistry } try { - Field f = clazz.getField(annotationTarget); + Field f = clazz.getDeclaredField(annotationTarget); addHolderReference(new ObjectHolderRef(f, new ResourceLocation(value), extractFromValue)); } catch (Exception ex) diff --git a/src/main/resources/forge_at.cfg b/src/main/resources/forge_at.cfg index 5708de8f8..1b131ba21 100644 --- a/src/main/resources/forge_at.cfg +++ b/src/main/resources/forge_at.cfg @@ -284,6 +284,9 @@ public net.minecraft.potion.PotionHelper func_193354_a(Lnet/minecraft/item/ItemP public net.minecraft.potion.PotionHelper func_193357_a(Lnet/minecraft/potion/PotionType;Lnet/minecraft/item/Item;Lnet/minecraft/potion/PotionType;)V # registerPotionTypeConversion public net.minecraft.potion.PotionHelper func_193356_a(Lnet/minecraft/potion/PotionType;Lnet/minecraft/item/crafting/Ingredient;Lnet/minecraft/potion/PotionType;)V # registerPotionTypeConversion +# TileEntity +public net.minecraft.tileentity.TileEntity func_190560_a(Ljava/lang/String;Ljava/lang/Class;)V # register + # TileEntityHopper public net.minecraft.tileentity.TileEntityHopper func_174914_o()Z # mayTransfer public net.minecraft.tileentity.TileEntityHopper func_145896_c(I)V # setTransferCooldown diff --git a/src/test/java/net/minecraftforge/debug/DynBucketTest.java b/src/test/java/net/minecraftforge/debug/DynBucketTest.java index c92b31444..cb0675fed 100644 --- a/src/test/java/net/minecraftforge/debug/DynBucketTest.java +++ b/src/test/java/net/minecraftforge/debug/DynBucketTest.java @@ -31,6 +31,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; +import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.common.ForgeVersion; import net.minecraftforge.common.MinecraftForge; @@ -93,82 +94,62 @@ public class DynBucketTest } } - @SuppressWarnings("unused") - public DynBucketTest() + @SubscribeEvent + public void setupModels(ModelRegistryEvent event) { - if (!ENABLE || !ModelFluidDebug.ENABLE) - MinecraftForge.EVENT_BUS.register(this); - } + ModelLoader.setBucketModelDefinition(DYN_BOTTLE); - @SidedProxy - public static CommonProxy proxy; - - public static class CommonProxy { void setupModels(){} } - public static class ServerProxy extends CommonProxy{} - public static class ClientProxy extends CommonProxy - { - @SuppressWarnings("unused") - @Override - void setupModels() + final ModelResourceLocation bottle = new ModelResourceLocation(new ResourceLocation(ForgeVersion.MOD_ID, "dynbottle"), "inventory"); + ModelLoader.setCustomMeshDefinition(DYN_BOTTLE, new ItemMeshDefinition() { - if (!ENABLE || !ModelFluidDebug.ENABLE) + @Override + public ModelResourceLocation getModelLocation(@Nonnull ItemStack stack) { - return; + return bottle; } - - ModelLoader.setBucketModelDefinition(DYN_BOTTLE); - - final ModelResourceLocation bottle = new ModelResourceLocation(new ResourceLocation(ForgeVersion.MOD_ID, "dynbottle"), "inventory"); - ModelLoader.setCustomMeshDefinition(DYN_BOTTLE, new ItemMeshDefinition() - { - @Override - public ModelResourceLocation getModelLocation(@Nonnull ItemStack stack) - { - return bottle; - } - }); - ModelBakery.registerItemVariants(DYN_BOTTLE, bottle); - ModelLoader.setCustomModelResourceLocation(Item.REGISTRY.getObject(simpleTankName), 0, new ModelResourceLocation(simpleTankName, "normal")); - ModelLoader.setCustomModelResourceLocation(Item.REGISTRY.getObject(testItemName), 0, new ModelResourceLocation(new ResourceLocation("minecraft", "stick"), "inventory")); - } + }); + ModelBakery.registerItemVariants(DYN_BOTTLE, bottle); + ModelLoader.setCustomModelResourceLocation(Item.REGISTRY.getObject(simpleTankName), 0, new ModelResourceLocation(simpleTankName, "normal")); + ModelLoader.setCustomModelResourceLocation(Item.REGISTRY.getObject(testItemName), 0, new ModelResourceLocation(new ResourceLocation("minecraft", "stick"), "inventory")); } - @Mod.EventBusSubscriber(modid = MODID) - public static class Registration + @SubscribeEvent + public void registrBlocks(RegistryEvent.Register event) { - @SubscribeEvent - public static void registrBlocks(RegistryEvent.Register event) - { - event.getRegistry().register(new BlockSimpleTank().setRegistryName(simpleTankName)); - } - - @SubscribeEvent - public static void registrItems(RegistryEvent.Register event) - { - FluidRegistry.addBucketForFluid(FluidRegistry.getFluid(TestFluid.name)); - FluidRegistry.addBucketForFluid(FluidRegistry.getFluid(TestGas.name)); - - event.getRegistry().registerAll( - new TestItem().setRegistryName(testItemName), - new ItemBlock(TANK_BLOCK).setRegistryName(simpleTankName), - new DynBottle() - ); - } - - @SubscribeEvent - public static void registrRecipes(RegistryEvent.Register event) - { - ItemStack filledBucket = FluidUtil.getFilledBucket(new FluidStack(TestFluid.instance, Fluid.BUCKET_VOLUME)); - GameRegistry.addShapelessRecipe(new ResourceLocation(MODID, "diamond_to_fluid"), null, filledBucket, Ingredient.func_193368_a(Items.DIAMOND)); - } + event.getRegistry().register(new BlockSimpleTank().setRegistryName(simpleTankName)); + GameRegistry.registerTileEntity(TileSimpleTank.class, "simpletank"); } + @SubscribeEvent + public void registrItems(RegistryEvent.Register event) + { + FluidRegistry.addBucketForFluid(FluidRegistry.getFluid(TestFluid.name)); + FluidRegistry.addBucketForFluid(FluidRegistry.getFluid(TestGas.name)); + + event.getRegistry().registerAll( + new TestItem().setRegistryName(testItemName), + new ItemBlock(TANK_BLOCK).setRegistryName(simpleTankName), + new DynBottle() + ); + } + + @SubscribeEvent + public void registrRecipes(RegistryEvent.Register event) + { + ItemStack filledBucket = FluidUtil.getFilledBucket(new FluidStack(TestFluid.instance, Fluid.BUCKET_VOLUME)); + GameRegistry.addShapelessRecipe(new ResourceLocation(MODID, "diamond_to_fluid"), null, filledBucket, Ingredient.func_193368_a(Items.DIAMOND)); + } + + @SuppressWarnings("unused") @EventHandler public void preInit(FMLPreInitializationEvent event) { logger = event.getModLog(); - GameRegistry.registerTileEntity(TileSimpleTank.class, "simpletank"); - proxy.setupModels(); + + if (!ENABLE || !ModelFluidDebug.ENABLE) + { + MinecraftForge.EVENT_BUS.register(this); + } } @SubscribeEvent diff --git a/src/test/java/net/minecraftforge/debug/ForgeBlockStatesLoaderDebug.java b/src/test/java/net/minecraftforge/debug/ForgeBlockStatesLoaderDebug.java index 49297cb4d..ebba6c792 100644 --- a/src/test/java/net/minecraftforge/debug/ForgeBlockStatesLoaderDebug.java +++ b/src/test/java/net/minecraftforge/debug/ForgeBlockStatesLoaderDebug.java @@ -11,7 +11,9 @@ import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemMultiTexture; import net.minecraft.item.ItemStack; +import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; @@ -25,7 +27,6 @@ import java.util.Map; import java.util.Map.Entry; @Mod(modid = ForgeBlockStatesLoaderDebug.MODID, name = "ForgeBlockStatesLoader", version = "1.0", acceptableRemoteVersions = "*") -@Mod.EventBusSubscriber public class ForgeBlockStatesLoaderDebug { public static final String MODID = "forgeblockstatesloader"; @@ -44,25 +45,25 @@ public class ForgeBlockStatesLoaderDebug } @SubscribeEvent - public static void registerBlocks(RegistryEvent.Register event) + public void registerBlocks(RegistryEvent.Register event) { event.getRegistry().registerAll( - new BlockWall(Blocks.COBBLESTONE).setUnlocalizedName(MODID + ".customWall").setRegistryName(MODID, "custom_wall") + new BlockWall(Blocks.COBBLESTONE).setUnlocalizedName(MODID + ".customWall").setRegistryName(MODID, "custom_wall") ); } @SubscribeEvent - public static void registerItems(RegistryEvent.Register event) + public void registerItems(RegistryEvent.Register event) { event.getRegistry().registerAll( - new ItemMultiTexture(BLOCKS.custom_wall, BLOCKS.custom_wall, new ItemMultiTexture.Mapper() + new ItemMultiTexture(BLOCKS.custom_wall, BLOCKS.custom_wall, new ItemMultiTexture.Mapper() + { + @Override + public String apply(ItemStack stack) { - @Override - public String apply(ItemStack stack) - { - return BlockWall.EnumType.byMetadata(stack.getMetadata()).getUnlocalizedName(); - } - }).setRegistryName(BLOCKS.custom_wall.getRegistryName()) + return BlockWall.EnumType.byMetadata(stack.getMetadata()).getUnlocalizedName(); + } + }).setRegistryName(BLOCKS.custom_wall.getRegistryName()) ); } @@ -73,15 +74,11 @@ public class ForgeBlockStatesLoaderDebug { //blockCustom.setUnlocalizedName(MODID + ".customBlock").setRegistryName("customBlock"); //GameRegistry.registerBlock(blockCustom); - - if (event.getSide() == Side.CLIENT) - { - preInitClient(event); - } + MinecraftForge.EVENT_BUS.register(this); } - @SideOnly(Side.CLIENT) - public void preInitClient(FMLPreInitializationEvent event) + @SubscribeEvent + public void registerModels(ModelRegistryEvent event) { //ModelLoader.setCustomStateMapper(blockCustom, new StateMap.Builder().withName(CustomMappedBlock.VARIANT).build()); diff --git a/src/test/java/net/minecraftforge/debug/ItemTileDebug.java b/src/test/java/net/minecraftforge/debug/ItemTileDebug.java index c597af24b..32b283836 100644 --- a/src/test/java/net/minecraftforge/debug/ItemTileDebug.java +++ b/src/test/java/net/minecraftforge/debug/ItemTileDebug.java @@ -16,6 +16,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.event.ModelBakeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.debug.ObjectHolderTest.CustomRegistryEntry; @@ -42,21 +43,6 @@ public class ItemTileDebug @ObjectHolder(TestBlock.name) public static final Block TEST_BLOCK = null; - @SidedProxy - public static CommonProxy proxy; - - @EventHandler - public void preInit(FMLPreInitializationEvent event) - { - proxy.preInit(event); - } - - @EventHandler - public void init(FMLInitializationEvent event) - { - proxy.init(event); - } - @Mod.EventBusSubscriber(modid = MODID) public static class Registration { @@ -64,6 +50,7 @@ public class ItemTileDebug public static void registerBlocks(RegistryEvent.Register event) { event.getRegistry().register(new TestBlock()); + GameRegistry.registerTileEntity(CustomTileEntity.class, MODID.toLowerCase() + ":custom_tile_entity"); } @SubscribeEvent @@ -71,38 +58,17 @@ public class ItemTileDebug { event.getRegistry().register(new ItemBlock(TEST_BLOCK).setRegistryName(TEST_BLOCK.getRegistryName())); } - } - - public static class CommonProxy - { - public void preInit(FMLPreInitializationEvent event) + @SubscribeEvent + public static void registerModels(ModelRegistryEvent event) { - GameRegistry.registerTileEntity(CustomTileEntity.class, MODID.toLowerCase() + ":custom_tile_entity"); - } - public void init(FMLInitializationEvent event){} - } + final ModelResourceLocation itemLocation = new ModelResourceLocation(TEST_BLOCK.getRegistryName(), "normal"); - public static class ServerProxy extends CommonProxy{} - - public static class ClientProxy extends CommonProxy - { - private static ModelResourceLocation itemLocation = new ModelResourceLocation(TEST_BLOCK.getRegistryName(), "normal"); - - @SuppressWarnings("deprecation") - @Override - public void preInit(FMLPreInitializationEvent event) - { - super.preInit(event); Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(MODID, TestBlock.name)); ForgeHooksClient.registerTESRItemStack(item, 0, CustomTileEntity.class); ModelLoader.setCustomModelResourceLocation(item, 0, itemLocation); MinecraftForge.EVENT_BUS.register(BakeEventHandler.instance); - } - - @Override - public void init(FMLInitializationEvent event) - { ClientRegistry.bindTileEntitySpecialRenderer(CustomTileEntity.class, TestTESR.instance); + } } diff --git a/src/test/java/net/minecraftforge/debug/ModelAnimationDebug.java b/src/test/java/net/minecraftforge/debug/ModelAnimationDebug.java index 0340a6444..fc5034776 100644 --- a/src/test/java/net/minecraftforge/debug/ModelAnimationDebug.java +++ b/src/test/java/net/minecraftforge/debug/ModelAnimationDebug.java @@ -28,6 +28,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.client.model.animation.Animation; @@ -91,6 +92,7 @@ public class ModelAnimationDebug @SubscribeEvent public static void registerBlocks(RegistryEvent.Register event) { + GameRegistry.registerTileEntity(Chest.class, MODID + ":" + "tile_" + blockName); event.getRegistry().register( new Block(Material.WOOD) { @@ -196,77 +198,66 @@ public class ModelAnimationDebug } } + + @SubscribeEvent + public void registerModels(ModelRegistryEvent event) + { + B3DLoader.INSTANCE.addDomain(MODID); + ModelLoader.setCustomModelResourceLocation(TEST_ITEM, 0, new ModelResourceLocation(TEST_ITEM.getRegistryName(), "inventory")); + ClientRegistry.bindTileEntitySpecialRenderer(Chest.class, new AnimationTESR() + { + @Override + public void handleEvents(Chest chest, float time, Iterable pastEvents) + { + chest.handleEvents(time, pastEvents); + } + }); + String entityName = MODID + ":entity_chest"; + //EntityRegistry.registerGlobalEntityID(EntityChest.class, entityName, EntityRegistry.findGlobalUniqueEntityId()); + EntityRegistry.registerModEntity(new ResourceLocation(entityName), EntityChest.class, entityName, 0, ModelAnimationDebug.instance, 64, 20, true, 0xFFAAAA00, 0xFFDDDD00); + RenderingRegistry.registerEntityRenderingHandler(EntityChest.class, new IRenderFactory() + { + @SuppressWarnings("deprecation") + public Render createRenderFor(RenderManager manager) + { + /*model = ModelLoaderRegistry.getModel(new ResourceLocation(ModelLoaderRegistryDebug.MODID, "block/chest.b3d")); + if(model instanceof IRetexturableModel) + { + model = ((IRetexturableModel)model).retexture(ImmutableMap.of("#chest", "entity/chest/normal")); + } + if(model instanceof IModelCustomData) + { + model = ((IModelCustomData)model).process(ImmutableMap.of("mesh", "[\"Base\", \"Lid\"]")); + }*/ + ResourceLocation location = new ModelResourceLocation(new ResourceLocation(MODID, blockName), "entity"); + return new RenderLiving(manager, new net.minecraftforge.client.model.animation.AnimationModelBase(location, new VertexLighterSmoothAo(Minecraft.getMinecraft().getBlockColors())) + { + @Override + public void handleEvents(EntityChest chest, float time, Iterable pastEvents) + { + chest.handleEvents(time, pastEvents); + } + }, 0.5f) + { + protected ResourceLocation getEntityTexture(EntityChest entity) + { + return TextureMap.LOCATION_BLOCKS_TEXTURE; + } + }; + } + }); + } + public static abstract class CommonProxy { - public void preInit(FMLPreInitializationEvent event) - { - GameRegistry.registerTileEntity(Chest.class, MODID + ":" + "tile_" + blockName); - } - @Nullable - public abstract IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters); + public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters){ return null; }; } - public static class ServerProxy extends CommonProxy - { - @Nullable - public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) - { - return null; - } - } + public static class ServerProxy extends CommonProxy {} public static class ClientProxy extends CommonProxy { - @Override - public void preInit(FMLPreInitializationEvent event) - { - super.preInit(event); - B3DLoader.INSTANCE.addDomain(MODID); - ModelLoader.setCustomModelResourceLocation(TEST_ITEM, 0, new ModelResourceLocation(TEST_ITEM.getRegistryName(), "inventory")); - ClientRegistry.bindTileEntitySpecialRenderer(Chest.class, new AnimationTESR() - { - @Override - public void handleEvents(Chest chest, float time, Iterable pastEvents) - { - chest.handleEvents(time, pastEvents); - } - }); - String entityName = MODID + ":entity_chest"; - //EntityRegistry.registerGlobalEntityID(EntityChest.class, entityName, EntityRegistry.findGlobalUniqueEntityId()); - EntityRegistry.registerModEntity(new ResourceLocation(entityName), EntityChest.class, entityName, 0, ModelAnimationDebug.instance, 64, 20, true, 0xFFAAAA00, 0xFFDDDD00); - RenderingRegistry.registerEntityRenderingHandler(EntityChest.class, new IRenderFactory() - { - @SuppressWarnings("deprecation") - public Render createRenderFor(RenderManager manager) - { - /*model = ModelLoaderRegistry.getModel(new ResourceLocation(ModelLoaderRegistryDebug.MODID, "block/chest.b3d")); - if(model instanceof IRetexturableModel) - { - model = ((IRetexturableModel)model).retexture(ImmutableMap.of("#chest", "entity/chest/normal")); - } - if(model instanceof IModelCustomData) - { - model = ((IModelCustomData)model).process(ImmutableMap.of("mesh", "[\"Base\", \"Lid\"]")); - }*/ - ResourceLocation location = new ModelResourceLocation(new ResourceLocation(MODID, blockName), "entity"); - return new RenderLiving(manager, new net.minecraftforge.client.model.animation.AnimationModelBase(location, new VertexLighterSmoothAo(Minecraft.getMinecraft().getBlockColors())) - { - @Override - public void handleEvents(EntityChest chest, float time, Iterable pastEvents) - { - chest.handleEvents(time, pastEvents); - } - }, 0.5f) - { - protected ResourceLocation getEntityTexture(EntityChest entity) - { - return TextureMap.LOCATION_BLOCKS_TEXTURE; - } - }; - } - }); - } public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) { @@ -305,7 +296,6 @@ public class ModelAnimationDebug public void preInit(FMLPreInitializationEvent event) { logger = event.getModLog(); - proxy.preInit(event); } public static class Chest extends TileEntity diff --git a/src/test/java/net/minecraftforge/debug/ModelFluidDebug.java b/src/test/java/net/minecraftforge/debug/ModelFluidDebug.java index 16bc4ad02..f3091f4b9 100644 --- a/src/test/java/net/minecraftforge/debug/ModelFluidDebug.java +++ b/src/test/java/net/minecraftforge/debug/ModelFluidDebug.java @@ -52,17 +52,6 @@ public class ModelFluidDebug public static final Fluid GAS = new TestGas(); - @EventHandler - public void preInit(FMLPreInitializationEvent event) - { - if (ENABLE) - { - FluidRegistry.registerFluid(FLUID); - FluidRegistry.registerFluid(GAS); - FluidRegistry.registerFluid(MILK); - } - } - @Mod.EventBusSubscriber(modid = MODID) public static class Registration { @@ -71,6 +60,13 @@ public class ModelFluidDebug { if (!ENABLE) return; + + //TODO: Make FluidRegistry a full registry? + //Make a delegate system for FluidBlocks/Fluid Stacks? + //Fluids must be registered before a FluidStack can be made. Which is done in the block constructor + FluidRegistry.registerFluid(FLUID); + FluidRegistry.registerFluid(GAS); + FluidRegistry.registerFluid(MILK); event.getRegistry().registerAll( new TestFluidBlock(), new TestGasBlock(), diff --git a/src/test/java/net/minecraftforge/debug/PotionRegistryDebug.java b/src/test/java/net/minecraftforge/debug/PotionRegistryDebug.java index 52ead16f6..5bdb86a76 100644 --- a/src/test/java/net/minecraftforge/debug/PotionRegistryDebug.java +++ b/src/test/java/net/minecraftforge/debug/PotionRegistryDebug.java @@ -28,10 +28,10 @@ public class PotionRegistryDebug @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { - Potion forge = new PotionForge(new ResourceLocation(ForgeVersion.MOD_ID, "forge"), false, 0xff00ff).setRegistryName(new ResourceLocation(ForgeVersion.MOD_ID, "forge")); // test automatic id distribution - Potion forgy = new PotionForge(new ResourceLocation(ForgeVersion.MOD_ID, "forgy"), true, 0x00ff00).setRegistryName(new ResourceLocation(ForgeVersion.MOD_ID, "forgy")); // test that ids above 127 work + Potion forge = new PotionForge(new ResourceLocation(ForgeVersion.MOD_ID, "forge"), false, 0xff00ff).setRegistryName(new ResourceLocation(MODID, "forge")); // test automatic id distribution + Potion forgy = new PotionForge(new ResourceLocation(ForgeVersion.MOD_ID, "forgy"), true, 0x00ff00).setRegistryName(new ResourceLocation(MODID, "forgy")); // test that ids above 127 work ForgeRegistries.POTIONS.register(forge); - Potion.REGISTRY.register(200, forgy.getRegistryName(), forgy); + //((ForgeRegistry)ForgeRegistries.POTIONS).register(200, forgy.getRegistryName(), forgy); Random rand = new Random(); TIntSet taken = new TIntHashSet(100); diff --git a/src/test/java/net/minecraftforge/fml/common/registry/SubstitutionInjectionTest.java b/src/test/java/net/minecraftforge/fml/common/registry/SubstitutionInjectionTest.java index f18e42218..793641ce5 100644 --- a/src/test/java/net/minecraftforge/fml/common/registry/SubstitutionInjectionTest.java +++ b/src/test/java/net/minecraftforge/fml/common/registry/SubstitutionInjectionTest.java @@ -72,7 +72,7 @@ public class SubstitutionInjectionTest // TEST 0a: Validate that the ItemBlock for Dirt points at vanilla dirt ItemBlock dirtitem = (ItemBlock) itemRegistry.getValue(MC_DIRT); - assertEquals("ItemBlock points at my block", currDirt, dirtitem.block); + assertEquals("ItemBlock points at my block", currDirt, dirtitem.getBlock()); blockRegistry.register(toSub); //Register a new object, with the same vanilla name, Should cause the item to be replaced GameData.freezeData();