eriknoe Posted December 30, 2017 Posted December 30, 2017 Can anyone explain me this error? Im at registering an Block btw. An error occurred trying to load an EventBusSubscriber amethyst for modid java.lang.IllegalArgumentException: Method public static void erik.mod.init.RegistrationHandler.registerBlocks(net.minecraftforge.event.RegistryEvent$Register,net.minecraft.block.Block) has @SubscribeEvent annotation, but requires 2 arguments. Event handler methods must require a single argument. and Fatal errors were detected during the transition from CONSTRUCTING to PREINITIALIZATION. Loading cannot continue+ Thanks <3 Quote
Ugdhar Posted December 30, 2017 Posted December 30, 2017 Need to see your code for your registration class, but I'm guessing that the method that's handling the event can only have the event argument, and you have an additional one declared. Remove the extra argument and see what happens. Quote
eriknoe Posted December 30, 2017 Author Posted December 30, 2017 Yes sure, here: https://pastebin.com/HUv8ZdTW Quote
Ugdhar Posted December 30, 2017 Posted December 30, 2017 public static void registerBlocks(final RegistryEvent.Register<Block> event, Block BlockModAmethystOre) { you cannot have that Block BlockModAmethystOre parameter on the method, because then it no longer matches the registration event. 1 Quote
eriknoe Posted December 30, 2017 Author Posted December 30, 2017 (edited) this public static void registerBlocks(final RegistryEvent.Register<Block> event, Block BlockModAmethystOre) { to this public static void registerBlocks(final RegistryEvent.Register<Block> event) { ? Edited December 30, 2017 by eriknoe Formatting Quote
Ugdhar Posted December 30, 2017 Posted December 30, 2017 I never used final in the method parameters, but besides that sure. Quote
eriknoe Posted December 30, 2017 Author Posted December 30, 2017 mhhh... I tried this: public static void registerBlocks (RegistryEvent.Register<Block> event) { but i get this error : Exception caught during firing event net.minecraftforge.event.RegistryEvent$Register@3e8a1137:java.lang.NullPointerException: null pls help me, im still pretty inexperienced Quote
Major Tuvok Posted December 30, 2017 Posted December 30, 2017 One thing, could you please post the stacktrace instead of one single line? Because it seems odd to get an NullPointer from Forge itself, it's probably some bug in your code inside the given Method Quote
Ugdhar Posted December 30, 2017 Posted December 30, 2017 When you run into an error, make sure you have the latest code posted, as well as the complete error, preferably the fml-client-latest.log. And just to warn you, if you don't really understand Java, you're going to have a very hard time modding without someone holding your hand, which will be tough on the forums, because people are not always here waiting to help people, and if it becomes apparent you are repeatedly having troubles with basic Java issues, you'll likely be asked to go learn the basics before coming here for help. Quote
eriknoe Posted December 30, 2017 Author Posted December 30, 2017 Just now, Ugdhar said: When you run into an error, make sure you have the latest code posted, as well as the complete error, preferably the fml-client-latest.log. And just to warn you, if you don't really understand Java, you're going to have a very hard time modding without someone holding your hand, which will be tough on the forums, because people are not always here waiting to help people, and if it becomes apparent you are repeatedly having troubles with basic Java issues, you'll likely be asked to go learn the basics before coming here for help. LearningByDoing Quote
Major Tuvok Posted December 30, 2017 Posted December 30, 2017 So if you want to get help, could you just provide some Information? Quote
eriknoe Posted December 30, 2017 Author Posted December 30, 2017 Yes sure, want did u want to see? Quote
eriknoe Posted December 30, 2017 Author Posted December 30, 2017 main class: https://pastebin.com/mSKcvTLJ Block class: https://pastebin.com/dnT14Xiv init class: https://pastebin.com/uGXeCdz8 client proxy: https://pastebin.com/dExAbDer serverproxy: https://pastebin.com/vt8p5GCh last crash report: https://pastebin.com/9uTmRMdu hope u can help me...I am new at programming, so I dont have so uch experience, but daily I learn more..so please dont slap me therfore Quote
Major Tuvok Posted December 30, 2017 Posted December 30, 2017 I'm quite experinced with java, but like theSieben just pointed out to me, programming since 2 (am) doesn't do anything good to your mind... But let's take a look anyway. Quote
Major Tuvok Posted December 30, 2017 Posted December 30, 2017 You register the Wrong Element... Currentl you are Creating a new Instance of your AmethystOre when you register your Blocks. But when you then register your Items you access your static reference. Just Change your Block registration, so that you store your Instance in your static final variable and then register that. (I hope you know, that your Java Code is a Mess, so I won't point all your mistakes out to you (that would take too much time)) (Pls learn too Code...) Quote
Major Tuvok Posted December 30, 2017 Posted December 30, 2017 (And one more thing, if you want to create your Instance during Block registration, you have to make your Field non-final, like I suggest you'd do with most-variables in this class too. Not every variable needs to be a constant.) Quote
eriknoe Posted December 30, 2017 Author Posted December 30, 2017 1 minute ago, Major Tuvok said: You register the Wrong Element... Currentl you are Creating a new Instance of your AmethystOre when you register your Blocks. But when you then register your Items you access your static reference. Just Change your Block registration, so that you store your Instance in your static final variable and then register that. (I hope you know, that your Java Code is a Mess, so I won't point all your mistakes out to you (that would take too much time)) (Pls learn too Code...) can u show me one of ur codes, so i can see what is a mess? Quote
Major Tuvok Posted December 30, 2017 Posted December 30, 2017 public class SpellcraftBlocks extends BaseContainer<Block> { private static final int GENERATOR_WEIGHT = 2; public static BlockWandCraftingTable WAND_CRAFTING_TABLE; private RegistryUtils<Item> itemRegistryUtils; public SpellcraftBlocks() { super(); itemRegistryUtils = new RegistryUtils<>(); } @Override @SubscribeEvent public void onRegistryEvent(RegistryEvent.Register<Block> e) { createBlocks(); super.onRegistryEvent(e); Log.info("Registering SpellcraftBlocks"); register(WAND_CRAFTING_TABLE); Log.info("Adding SpellcraftItemBlocks"); registerBlockItem(WAND_CRAFTING_TABLE); } @SubscribeEvent public void onItemRegistryEvent(RegistryEvent.Register<Item> e) { Log.info("Registering SpellcraftItemBlocks"); itemRegistryUtils.setRegistry(e.getRegistry()); for (Item item : getUtils().getRegisteredItems()) { itemRegistryUtils.register(item); } } @Override public void commonPreInit() { super.commonPreInit(); } @Override @SideOnly(Side.CLIENT) public void clientInit() { super.clientInit(); } public void registerWorldGen() { Log.info("Registering Ore Generation"); } public void registerBlockItem(Block entry) { if (entry != null) { RenderableBlockItem blockItem = new RenderableBlockItem(entry); addToItemMap(entry, blockItem); addToRenderable(entry); } else { Log.error("Cannot registerBlockItem with null Block!"); } } private static void createBlocks() { Log.info("Creating Blocks"); WAND_CRAFTING_TABLE = new BlockWandCraftingTable(); } private static final class RenderableBlockItem extends ItemBlock implements INamed, IRenderable { public RenderableBlockItem(Block block) { super(block); if (block.getRegistryName() != null) { setRegistryName(block.getRegistryName()); } } @Override public String getName() { if (block instanceof INamed) { return ((INamed) block).getName(); } else { return block.getUnlocalizedName().substring(5); } } @Nullable @Override public ResourceLocation getLocation() { return getRegistryName(); } @Override public boolean registerRenderer() { return true; } } } In conjuction with: public class BaseContainer<T extends IForgeRegistryEntry<T>> implements ILoggable { private final RegistryUtils<T> utils; public BaseContainer() { this.utils = new RegistryUtils<T>(); MinecraftForge.EVENT_BUS.register(this); } protected RegistryUtils<T> getUtils() { return utils; } @SubscribeEvent public void onRegistryEvent(RegistryEvent.Register<T> e) { getUtils().setRegistry(e.getRegistry()); } public void commonPreInit() { } public void postInit() { getUtils().postInit(); } public @Nullable Item getItem(T thing) { return getUtils().getItem(thing); } @SideOnly(Side.CLIENT) public void clientInit() { getUtils().clientInit(); } protected void register(T thing) { getUtils().register(thing); } @SideOnly(Side.CLIENT) protected void registerRenderer(@Nonnull T thing) { getUtils().registerRenderer(thing); } @SideOnly(Side.CLIENT) protected void registerItemRenderer(@Nonnull Item thing) { getUtils().registerItemRenderer(thing); } @SideOnly(Side.CLIENT) protected void registerItemRenderer(@Nonnull Item item, @Nonnegative int meta) { getUtils().registerItemRenderer(item, meta); } protected Object registerOreDict(@Nonnull Object thing, String name) { return getUtils().registerOreDict(thing, name); } @SubscribeEvent public void registerRender(ModelRegistryEvent registryEvent) { getUtils().registerRenders(registryEvent); } protected IOreDictNamed registerOreDict(@Nonnull IOreDictNamed thing) { return getUtils().registerOreDict(thing); } protected void addToRenderable(T t) { getUtils().addToRenderable(t); } protected void addToItemMap(T thing, Item item) { getUtils().addToItemMap(thing, item); } } public class RegistryUtils<T extends IForgeRegistryEntry<T>> implements ILoggable { private List<T> renderable; private List<Item> itemRenderables; private List<Tuple<Object, String>> postponedOredictEntries; private HashMap<T, Item> thingItemMap; private IForgeRegistry<T> registry; private boolean initWasCalled; public RegistryUtils() { renderable = new LinkedList<>(); thingItemMap = new HashMap<>(); itemRenderables = new LinkedList<>(); registry = null; postponedOredictEntries = new LinkedList<>(); initWasCalled = false; } public void clientInit() { initWasCalled = true; for (Tuple<Object, String> tuple : postponedOredictEntries) { registerOreDict(tuple.getFirst(), tuple.getSecond()); } } public void postInit() { renderable.clear(); itemRenderables.clear(); postponedOredictEntries.clear(); thingItemMap.clear(); renderable = null; itemRenderables = null; postponedOredictEntries = null; thingItemMap = null; registry = null; initWasCalled = false; } public void setRegistry(IForgeRegistry<T> registry) { this.registry = registry; } public void registerRenders(ModelRegistryEvent registryEvent) { for (T thing : renderable) { if (thing instanceof Item) { itemRenderables.add((Item) thing); } else { Item item = getItem(thing); if (item != null) { itemRenderables.add(item); } else { Log.warn("Failed to registerGameOverlayListener Renderer for " + getName(item) + "!"); } } } for (Item item : itemRenderables) { registerItemRenderer(item); } } public void register(RegistryEvent.Register<T> e, T toRegister) { setRegistry(e.getRegistry()); checkAdditionalRegistration(toRegister); } public void registerAll(RegistryEvent.Register<T> e, T... toRegister) { setRegistry(e.getRegistry()); registerAll(toRegister); } public void register(T toRegister) { if (this.registry != null && toRegister != null) { this.registry.register(toRegister); checkAdditionalRegistration(toRegister); } else { Log.error("Failed to registerGameOverlayListener thing(" + (toRegister != null ? getName(toRegister) + ") because there was no registry available!" : "null) because thing was null")); } } public void registerAll(T... toRegister) { if (this.registry != null && toRegister != null && toRegister.length > 0) { this.registry.registerAll(toRegister); for (T thing : toRegister) { checkAdditionalRegistration(thing); } } else { Log.error("Failed to registerGameOverlayListener thing(" + (toRegister != null ? (toRegister.length > 0 ? Arrays.toString(toRegister) + ") because there was no registry available!" : "void vaargs list)") : "null vaargs list)")); } } @SuppressWarnings("unchecked") private void checkAdditionalRegistration(T toRegister) { if (toRegister instanceof IOreDictNamed) { registerOreDict((IOreDictNamed) toRegister); } if (toRegister instanceof TileEntityContainer) { GameRegistry.registerTileEntity(((TileEntityContainer) toRegister).getTileEntityClass(), MODID + getName(toRegister)); } addToRenderable(toRegister); } public @Nullable Item getItem(T thing) { if (thing instanceof Item) { return (Item) thing; } else if (thingItemMap.containsKey(thing)) { return thingItemMap.get(thing); } return null; } protected Object registerOreDict(Object thing, String name) { if (name != null && thing != null) { if (initWasCalled) { if (thing instanceof Block) { OreDictionary.registerOre(name, (Block) thing); } else if (thing instanceof Item) { OreDictionary.registerOre(name, (Item) thing); } else if (thing instanceof ItemStack) { OreDictionary.registerOre(name, (ItemStack) thing); } else { Log.error("Cannot registerGameOverlayListener " + name + " in the GameRegistry because it is neither a Block, Item or ItemStack!"); } } else { postponedOredictEntries.add(new Tuple<>(thing, name)); } } else if (name == null) { Log.warn("Attempted to registerGameOverlayListener Object to OreDict with null OreDict Name!"); } else { Log.warn("Cannot registerGameOverlayListener null Object(" + name + ") to the OreDictionary!"); } return thing; } public IOreDictNamed registerOreDict(@Nonnull IOreDictNamed thing) { if (thing.getOreDictName() != null) { registerOreDict(thing, thing.getOreDictName()); } else { Log.warn("Attempted to registerGameOverlayListener IOreDictNamed to OreDictionary with null OreDict Name!"); } return thing; } @SideOnly(Side.CLIENT) public void registerRenderer(@Nonnull T thing) { if (thing instanceof Item) { itemRenderables.add((Item) thing); } else { Item item = thingItemMap.get(thing); if (item != null) { itemRenderables.add(item); } else if (thing instanceof Renderable) { addToRenderable(thing); } else { Log.warn("Could no registerGameOverlayListener Renderer for non-item and non-renderable"); } } } @SideOnly(Side.CLIENT) public void registerItemRenderer(@Nonnull Item thing) { if (thing.getHasSubtypes()) { Log.trace("Registering item with subtypes " + getName(thing)); CreativeTabs tabs; if (thing instanceof IRenderSubTabProvider) { tabs = ((IRenderSubTabProvider) thing).getSubTab(); } else { tabs = CTabs.TAB_MAIN; } NonNullList<ItemStack> itemStacks = NonNullList.create(); thing.getSubItems(tabs, itemStacks); for (ItemStack stack : itemStacks) { registerItemRenderer(stack.getItem(), stack.getMetadata()); } } else { registerItemRenderer(thing, 0); } } @SideOnly(Side.CLIENT) protected void registerItemRenderer(@Nonnull Item item, @Nonnegative int meta) { if (item.getRegistryName() != null) { ResourceLocation location = item.getRegistryName(); if (item instanceof IRenderable && ((IRenderable) item).getLocation() != null) { location = ((IRenderable) item).getLocation(); } String path = StringHelper.createResourceLocation(MODID, location.getResourcePath()); if (!(item instanceof IRenderable) || ((IRenderable) item).registerRenderer()) { ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(path, "inventory")); Log.trace("Registered renderer for " + getName(item) + " with meta " + meta + "."); } } else { Log.warn("Could not registerItemRenderer for " + getName(item) + " because Registry Name hasn't been set!"); } } public void addToRenderable(T t) { if (t instanceof IRenderable) { if (thingItemMap.containsKey(t) && thingItemMap.get(t) != null) { itemRenderables.add(thingItemMap.get(t)); } else { renderable.add(t); } } } protected void addToItemMap(T thing, Item item) { if (!thingItemMap.containsKey(thing)) { thingItemMap.put(thing, item); } } public Collection<Item> getRegisteredItems() { return thingItemMap.values(); } } As you can see: I Split up Code in multiple Files and don't create obsolete Arrays (use your varargs solution it is pretty elegant as long as you DON'T create a seperate array). I know that most peoble will call this overconstructed, but I am not that far with the Mod I copied that from, so there aren't enough Blocks to justify that much Code yet. In your case it would be more suitable to use a solution with less and much simpler Code, which doesn' declare all of your Variables as final Quote
Major Tuvok Posted December 30, 2017 Posted December 30, 2017 Also Log Errors if you have some (or warnings for that matter)! (You see how many Logs I have in there...) It will make tracing much easier. Quote
eriknoe Posted December 30, 2017 Author Posted December 30, 2017 1 minute ago, Major Tuvok said: Also Log Errors if you have some (or warnings for that matter)! (You see how many Logs I have in there...) It will make tracing much easier. Yes that is right, i try to make it better. i like ur "overconstructed" code Quote
Major Tuvok Posted December 30, 2017 Posted December 30, 2017 (In this Code it would be better to place the suppress unchecked in RegistryUtils: private void checkAdditionalRegistration(T toRegister) at the place where it is really needed) Quote
Major Tuvok Posted December 30, 2017 Posted December 30, 2017 (edited) Apperetnly I can't recall typing the GameOverlayListener things, I seem to have used auto-completion at that time. => This can server as an example how NOT to write a Log. Because it makes your Logs undescriptive and therefore hard to read. I'll quickly change this to simply register... More specifically it should be the Method name... (like registerRenderer) Edited December 30, 2017 by Major Tuvok Incomplete Quote
Draco18s Posted December 30, 2017 Posted December 30, 2017 You have this: final ResourceLocation registryName = Preconditions.checkNotNull(block.getRegistryName(), "Block %s has null registry name", block); That precondition is useless. Why? Because if the block's registry name was null, you'd have gotten an error when registering it. What you should do is check to see if the block is null. Because it will be: private static final Block AMETHYST_ORE = null; You never assign a value to this field. If you are intending to use Object Holders to fill it (good idea) you need to add the Object Holder annotation. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.