Jump to content

TheA13X

Members
  • Posts

    30
  • Joined

  • Last visited

Everything posted by TheA13X

  1. No. No they are not. I Debugged Forge's building process line by line, so I know that the all registry events are fired after the FMLPreInitializationEvent. Also if the Registry Events were fired before the lists are populated, there would be no exception in the first place.
  2. Hi there! I'm currently updating one of my mods to 1.12 (and 1.12.2). While doing that I ran into this exception: Here's what I found out so far: The exception is caused, because the Lambda Functions, given to the Search Tree as an argument, returned null: //Citing Minecraft.java /*618*/SearchTree<ItemStack> searchtree = new SearchTree<ItemStack>( /* */(p_193988_0_) -> /*619*/{ /*620*/ return (List)p_193988_0_.getTooltip((EntityPlayer)null, ITooltipFlag.TooltipFlags.NORMAL).stream().map(TextFormatting::getTextWithoutFormattingCodes).map(String::trim).filter((p_193984_0_) -> { /*621*/ return !p_193984_0_.isEmpty(); /*622*/ }).collect(Collectors.toList()); /*623*/}, /* */(p_193985_0_) -> /*624*/{ /*625*/ return Collections.singleton(Item.REGISTRY.getNameForObject(p_193985_0_.getItem())); /*626*/}); -> Item.REGISTRY.getNameForObject(ItemStack.getItem) returned null. The question that remains is, why? It must have something to do with the registration process. Therefore I have to tell you How the Registration works: 1.Loading When the FMLPreInitializationEvent is fired, all blocks/"pure" Items get constructed and loaded into static lists located in my ModBlocks/ModItems class 2. Registering On the Register<Item>-Event the following code is executed: //Citing Registrator.java /*17*/@SubscribeEvent /*18*/public static void registerItems(RegistryEvent.Register<Item> event){ /*19*/ event.getRegistry().register(ModItems.parcelInstance()); //Register the only "pure" Item in this Mod. Does not throw the NullPointerException in the Search Tree /*20*/ ModBlocks.registerAllItems(event.getRegistry());//Register all the Block Items in this Mod } RegisterAllItems: public static void registerAllItems(IForgeRegistry<Item> reg) { registerAllLogItems(reg); registerAllLeavesItems(reg); registerAllSaplingItems(reg); registerAllWoodItems(reg); registerAllStairsItems(reg); registerAllDoorItems(reg); registerAllSingleSlabItems(reg); } Example for a Registering function: //Citing ModBlocks.java /*208*/private static void registerAllLogItems(IForgeRegistry<Item> reg) //It crashed on the Log Block Item btw. /*209*/{ /*210*/ int logCount = 0; /*211*/ for (final LogBlock block : logBlocks)//for every Log Block... /*212*/ { /*213*/ String name = String.format("log%d", logCount);//...define registry name... /*214*/ ImmutableList<String> subblockNames = block.getSubBlockNames();//...get all the Subblock names... /*215*/ if(block instanceof ModLogBlock){//... if type 1... /*216*/ reg.register(new ModLogItem(block,(ModLogBlock)block,subblockNames.toArray(new String[subblockNames.size()])).setRegistryName(name));//...register Item using the Type 1 item constructor after setting the registry name /*217*/ } /*218*/ else if(block instanceof ModLog2Block){//... if type 2... /*219*/ reg.register(new ModLogItem(block,(ModLog2Block)block,subblockNames.toArray(new String[subblockNames.size()])).setRegistryName(name));//...register Item using the Type 2 item constructor after setting the registry name /*220*/ } /*221*/ else if(block instanceof ModLog3Block){//... if type 3... /*222*/ reg.register(new ModLogItem(block,(ModLog3Block)block,subblockNames.toArray(new String[subblockNames.size()])).setRegistryName(name));//...register Item using the Type 3 item constructor after setting the registry name /*223*/ } /*224*/ else{//... if type 4... /*225*/ reg.register(new ModLogItem(block,(ModLog4Block)block,subblockNames.toArray(new String[subblockNames.size()])).setRegistryName(name));//...register Item using the Type 4 item constructor after setting the registry name /*226*/ } /*227*/ logCount++; /*228*/ } /*229*/} The Block registration works in the same way, only with on the Register<Block>-Event, instead of the item one. I guess it's also important How the Block Classes look like Essentially I have a mod (Koresample) containing all the "basic" block/item classes and my specialized Mod (Dendrology) containing Classes with logic for the specific tree types. Pasting all of them would be way to much so I'll just link my GitHub. Koresample Dendrology: I know it's a bit much, but this problem seems quite unusual... Thanks for trying and help me out. I got nothin'
  3. So there's an abstract function called getWoodtype which returns a BlockPlanks.EnumType and I wanted to return the enum type of my Mod's Planks, but that's completely unnecessary. I extended the class and it works now (apart from a visual glich due to the transparency, but that's another story) Thanks
  4. Yes I can. Sure it's a matter of trust since it could break if someone calls the function outside of a client-only class, but I'm the only author, so it won't happen. It's in the part of the class I left out and replaced it with I don't even know anymore. Let me check this
  5. You misunderstood me. They do NOT Decay, but I want them to. Also I just noticed I forgot to paste the properties in there. It's fixed now. I just updated 1.7.10 code from another author. I thought about recoding it completely to make it more uncomplicated, but this can wait. Also registerBlockModelsis called from the client proxy. It's just positioned in the block class to allow different behaviour for every single block. It's just clearer that way. Like the comments say I cloned MCs BlockLeaves Class and cut out the old functions, since they are the same, as the ones from the original. The randomTick function is there.
  6. Wow that was fast. Thanks man ^^ Well, first we have the Superclass: public abstract class LeavesBlock extends Block implements net.minecraftforge.common.IShearable { public static final int CAPACITY = 4; private static final int METADATA_MASK = CAPACITY - 1; int[] surroundings; private final ImmutableList<DefinesLeaves> subBlocks; protected LeavesBlock(Collection<? extends DefinesLeaves> subBlocks) { super(Material.LEAVES); checkArgument(!subBlocks.isEmpty()); checkArgument(subBlocks.size() <= CAPACITY); this.subBlocks = ImmutableList.copyOf(subBlocks); this.setTickRandomly(true); this.setHardness(0.2F); this.setLightOpacity(1); this.setSoundType(SoundType.PLANT); setUnlocalizedName("leaves"); } private static int mask(int metadata) {return metadata & METADATA_MASK;} protected static String getUnwrappedUnlocalizedName(String unlocalizedName) { return unlocalizedName.substring(unlocalizedName.indexOf('.') + 1); } protected final List<DefinesLeaves> subBlocks() { return Collections.unmodifiableList(subBlocks); } @Override public final Item getItemDropped(IBlockState state, Random unused, int unused2) { return Item.getItemFromBlock(subBlocks.get(mask(this.getMetaFromState(state))).saplingDefinition().saplingBlock()); } @Override public int damageDropped(IBlockState state) { return subBlocks.get(mask(this.getMetaFromState(state))).saplingDefinition().saplingSubBlockVariant().ordinal(); } public final String[] getSpeciesNames() //func_150125_e { final List<String> names = Lists.newArrayList(); for (final DefinesLeaves subBlock : subBlocks) names.add(subBlock.speciesName()); return names.toArray(new String[names.size()]); } public final String getUnlocalizedName() { return String.format("tile.%s%s", resourcePrefix(), getUnwrappedUnlocalizedName(super.getUnlocalizedName())); } public final int getDamageValue(World world, BlockPos pos) { return this.getMetaFromState(world.getBlockState(pos)) & 3; } public final void getSubBlocks(Item item, CreativeTabs unused, List subBlocks) { for (int i = 0; i < this.subBlocks.size(); i++) subBlocks.add(new ItemStack(item, 1, i)); } public void registerBlockModels() { for (DefinesLeaves define : subBlocks()) { ModelResourceLocation typeLocation = new ModelResourceLocation(getRegistryName(),"check_decay=true,decayable=true,variant="+define.leavesSubBlockVariant().name().toLowerCase()); Item blockItem = Item.getItemFromBlock(define.leavesBlock()); ModelLoader.setCustomModelResourceLocation(blockItem,define.leavesSubBlockVariant().ordinal(),typeLocation); } } protected abstract String resourcePrefix(); //Stuff cloned from BlockLeaves... public abstract Enum getWoodType(int meta); //Stuff cloned from BlockLeaves... } And then several Mod Classes which only difference is the Enum used for getWoodType() Here is one of them public final class ModLeavesBlock extends LeavesBlock { public static final PropertyEnum VARIANT = PropertyEnum.create("variant", ModLogBlock.EnumType.class); public ModLeavesBlock(Iterable<? extends DefinesLeaves> subBlocks) { super(ImmutableList.copyOf(subBlocks)); setCreativeTab(TheMod.INSTANCE.creativeTab()); this.setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, ModLogBlock.EnumType.ACEMUS).withProperty(CHECK_DECAY, Boolean.TRUE).withProperty(DECAYABLE, Boolean.TRUE)); } @Override public int quantityDropped(Random random) { final int rarity = Settings.INSTANCE.saplingDropRarity(); return rarity == 0 || random.nextInt(rarity) != 0 ? 0 : 1; } @Override protected BlockStateContainer createBlockState(){ BlockStateContainer bs = new BlockStateContainer(this, new IProperty[]{VARIANT,CHECK_DECAY,DECAYABLE}); return bs; } @Override public ModLogBlock.EnumType getWoodType(int meta) { return ModLogBlock.EnumType.fromId(meta); } @Override protected String resourcePrefix() { return TheMod.getResourcePrefix(); } @Override public List<ItemStack> onSheared(ItemStack item, IBlockAccess world, BlockPos pos, int fortune) { ArrayList<ItemStack> list=new ArrayList<ItemStack>(); list.add(new ItemStack(Item.getItemFromBlock(this),1,getMetaFromState(world.getBlockState(pos)))); return list; } @Override public IBlockState getStateFromMeta(int meta) { IBlockState state = getDefaultState(); switch(meta/4){ case 0: state = state.withProperty(CHECK_DECAY,true).withProperty(DECAYABLE,true); break; case 1: state = state.withProperty(CHECK_DECAY,true).withProperty(DECAYABLE,false); break; case 2: state = state.withProperty(CHECK_DECAY,false).withProperty(DECAYABLE,true); break; case 3: state = state.withProperty(CHECK_DECAY,false).withProperty(DECAYABLE,false); break; } state = state.withProperty(VARIANT,ModLogBlock.EnumType.fromId(meta%4)); return state; } @Override public int getMetaFromState(IBlockState state) { ModLogBlock.EnumType type = (ModLogBlock.EnumType) state.getValue(ModLogBlock.VARIANT); boolean check = (Boolean) state.getValue(CHECK_DECAY); boolean dcable = (Boolean) state.getValue(CHECK_DECAY); int par = check?dcable?0:1:dcable?2:3; return par*4+type.ordinal(); } protected boolean needMask(){ return false; } @Override public int damageDropped(IBlockState state) { return getMetaFromState(state.withProperty(CHECK_DECAY,true).withProperty(DECAYABLE,true)); } @Override protected int getSaplingDropChance(IBlockState state) { return Settings.INSTANCE.saplingDropRarity(); } }
  7. Hello world. I'm making a Tree Mod and it turns out, that my leaves won't decay. When a tree get generated, all leaves are set with the standard block state (aka with decayable and check_decay set to true). After the generation most leaves have check_dekay set to false. Since this is also the case with vanilla leaves I guess that's normal though. When chopping down a tree (minecraft style) the leaves won't decay and after restarting the game the leaves have both decayable and check_decay set to false Things that may be important to notice, is that my Leaves are multitextured. The Blockstate also contains a variant variable. I also don't really know what code I should post here. Any Suggestions?
  8. Oh, sorry. I used the wrong jars. Starting the mod with the obfuscated versions worked.
  9. Hello world. Another error I don't understand, but may be easy to solve if knowing how forge works. When starting the mod on forge 2228 in IDE everything is fine, but if its loaded in the client I get There was a severe problem during mod loading that has caused the game to fail net.minecraftforge.fml.common.LoaderExceptionModCrash: Caught exception from Ancient Trees (dendrology) Caused by: java.lang.NoSuchFieldError: CHESTS_VILLAGE_BLACKSMITH CHESTS_VILLAGE_BLACKSMITH is a static field from the LootTableList, which definitely does exist. Code where the error is thrown: final Map<ResourceLocation, Integer> map = Maps.newHashMap(); map.put(CHESTS_VILLAGE_BLACKSMITH, 0); map.put(CHESTS_SPAWN_BONUS_CHEST, 0); map.put(CHESTS_DESERT_PYRAMID, 1); map.put(CHESTS_SIMPLE_DUNGEON, 1); map.put(CHESTS_JUNGLE_TEMPLE, 1); map.put(CHESTS_JUNGLE_TEMPLE_DISPENSER, 0); map.put(CHESTS_ABANDONED_MINESHAFT, 1); map.put(CHESTS_STRONGHOLD_CORRIDOR, 1); map.put(CHESTS_STRONGHOLD_CROSSING, 1); map.put(CHESTS_STRONGHOLD_LIBRARY, 1); map.put(CHESTS_END_CITY_TREASURE, 5); map.put(CHESTS_NETHER_BRIDGE, 5); map.put(CHESTS_IGLOO_CHEST, 1); return map; It seems that none of these Fields exist in client. If I remove CHESTS_VILLAGE_BLACKSMITH, I get the same error on CHESTS_SPAWN_BONUS_CHEST ...
  10. Great. I'll switch to that method, when making the mod for 1.10+
  11. Oops. I'm sorry for making you so much work. At least the outdated build.gradle and the obsolete ProvidesPotionEffect implementation could be avoided if I had a Git client I can handle. Thank you for the tips though. My code is pretty chaotic regarding the location of proxied functions, but I works. I never had a crash because of some non-server code. Well that's interesting. I'll keep it in mind. See, I implemented the Item spawning on both the common and the client proxy. The common one just returns the Item, the client side adds a translation first. Maybe it isn't ought to be used this way, but it seemed to work.
  12. I know. That's what I normally do, I just had to do it this way, because the client told me that "everything is up to date"
  13. Oh yeah. Didn't notice, sorry. I fixed it now (for 1.9) Not in the git repository. I have a multi-project-workspace in IntelliJ, so the settings file is in the superdirectory. I'll add the KoreSample repository as a submodule after I figured out how, but you'll have to create the settings.gradle yourself. I just didn't know it's possible back then.
  14. IntelliJ's output directory is project/build/classes I have a git repository for the mod LOOK Wait. it hasn't updated to 1.9... Now it has. (1.9 branch) You'll also need it's dependency. Found here (1.9 branch)
  15. Are you sure? It's a FileNotFoundException which usually contains the path used for an I/O operation which is usually the real path. Anyways. The assets folder is in src/main/resources like it should. It's also included in to the root folder of the mod's jar file. I've run the mod only over the IDE though and while the assets folder does exists in build/resources/main the IDE's output folder is build/classes/main. But it should work anyway right? I mean the assets is copied to the build folder. Also I have a custom LanguageMapper who reads the lang files on pre-init and if the assets were missing, minecraft would crash here. if(test.getLocation().toString().startsWith("jar:")) fallback = Optional.of(new LangMap(TheMod.class.getResourceAsStream("/assets/dendrology/lang/en_US.lang"))); else{ String pathToCode = "../build/resources/main"; File test2 = new File(pathToCode); fallback = Optional.of(new LangMap(new FileInputStream(pathToCode+"/assets/dendrology/lang/en_US.lang"))); }
  16. All right. I finally managed to look in the console output and I found THIS [16:10:53] [Client thread/ERROR] [FML]: Exception loading model for variant dendrology:leaves3#check_decay=true,decayable=false,variant=cedrum for blockstate "dendrology:leaves3[check_decay=true,decayable=false,variant=cedrum]" net.minecraftforge.client.model.ModelLoaderRegistry$LoaderException: Exception loading model dendrology:leaves3#check_decay=true,decayable=false,variant=cedrum with loader VariantLoader.INSTANCE, skipping at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:134) ~[ModelLoaderRegistry.class:?] at net.minecraftforge.client.model.ModelLoader.registerVariant(ModelLoader.java:222) ~[ModelLoader.class:?] at net.minecraft.client.renderer.block.model.ModelBakery.loadBlock(ModelBakery.java:145) ~[ModelBakery.class:?] at net.minecraftforge.client.model.ModelLoader.loadBlocks(ModelLoader.java:210) ~[ModelLoader.class:?] at net.minecraftforge.client.model.ModelLoader.setupModelRegistry(ModelLoader.java:127) ~[ModelLoader.class:?] at net.minecraft.client.renderer.block.model.ModelManager.onResourceManagerReload(ModelManager.java:28) [ModelManager.class:?] at net.minecraft.client.resources.SimpleReloadableResourceManager.registerReloadListener(SimpleReloadableResourceManager.java:121) [SimpleReloadableResourceManager.class:?] at net.minecraft.client.Minecraft.startGame(Minecraft.java:538) [Minecraft.class:?] at net.minecraft.client.Minecraft.run(Minecraft.java:384) [Minecraft.class:?] at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_111] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_111] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_111] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_111] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_111] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_111] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_111] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_111] at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?] at GradleStart.main(GradleStart.java:26) [start/:?] Caused by: net.minecraft.client.renderer.block.model.ModelBlockDefinition$MissingVariantException at net.minecraft.client.renderer.block.model.ModelBlockDefinition.getVariant(ModelBlockDefinition.java:78) ~[ModelBlockDefinition.class:?] at net.minecraftforge.client.model.ModelLoader$VariantLoader.loadModel(ModelLoader.java:1164) ~[ModelLoader$VariantLoader.class:?] at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:130) ~[ModelLoaderRegistry.class:?] ... 21 more [16:10:53] [Client thread/ERROR] [FML]: Exception loading blockstate for the variant dendrology:leaves3#check_decay=true,decayable=false,variant=cedrum: java.lang.Exception: Could not load model definition for variant dendrology:leaves3 at net.minecraftforge.client.model.ModelLoader.getModelBlockDefinition(ModelLoader.java:255) ~[ModelLoader.class:?] at net.minecraft.client.renderer.block.model.ModelBakery.loadBlock(ModelBakery.java:121) ~[ModelBakery.class:?] at net.minecraftforge.client.model.ModelLoader.loadBlocks(ModelLoader.java:210) ~[ModelLoader.class:?] at net.minecraftforge.client.model.ModelLoader.setupModelRegistry(ModelLoader.java:127) ~[ModelLoader.class:?] at net.minecraft.client.renderer.block.model.ModelManager.onResourceManagerReload(ModelManager.java:28) [ModelManager.class:?] at net.minecraft.client.resources.SimpleReloadableResourceManager.registerReloadListener(SimpleReloadableResourceManager.java:121) [SimpleReloadableResourceManager.class:?] at net.minecraft.client.Minecraft.startGame(Minecraft.java:538) [Minecraft.class:?] at net.minecraft.client.Minecraft.run(Minecraft.java:384) [Minecraft.class:?] at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_111] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_111] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_111] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_111] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_111] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_111] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_111] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_111] at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?] at GradleStart.main(GradleStart.java:26) [start/:?] Caused by: java.lang.RuntimeException: Encountered an exception when loading model definition of model dendrology:blockstates/leaves3.json at net.minecraft.client.renderer.block.model.ModelBakery.loadMultipartMBD(ModelBakery.java:205) ~[ModelBakery.class:?] at net.minecraft.client.renderer.block.model.ModelBakery.getModelBlockDefinition(ModelBakery.java:185) ~[ModelBakery.class:?] at net.minecraftforge.client.model.ModelLoader.getModelBlockDefinition(ModelLoader.java:251) ~[ModelLoader.class:?] ... 20 more Caused by: java.io.FileNotFoundException: dendrology:blockstates/leaves3.json at net.minecraft.client.resources.SimpleReloadableResourceManager.getAllResources(SimpleReloadableResourceManager.java:83) ~[SimpleReloadableResourceManager.class:?] at net.minecraft.client.renderer.block.model.ModelBakery.loadMultipartMBD(ModelBakery.java:198) ~[ModelBakery.class:?] at net.minecraft.client.renderer.block.model.ModelBakery.getModelBlockDefinition(ModelBakery.java:185) ~[ModelBakery.class:?] at net.minecraftforge.client.model.ModelLoader.getModelBlockDefinition(ModelLoader.java:251) ~[ModelLoader.class:?] ... 20 more Notice the line "Caused by: java.io.FileNotFoundException: dendrology:blockstates/leaves3.json" This is true, since the path is "dendrology/blockstates/leaves3.json" ...huh?
  17. Thank you for the help. I changed my code to: That's what I did: registering block and blockitem (on preinit) private static void registerLeavesBlock(Block block, String name) { block.setRegistryName(name);//value: UnlocalizedName<number> GameRegistry.register(block); GameRegistry.register(new ModLeavesItem(block).setRegistryName(block.getRegistryName())); Blocks.FIRE.setFireInfo(block, DEFAULT_LEAVES_FIRE_ENCOURAGEMENT, DEFAULT_LEAVES_FLAMMABILITY); } register block variants (using the Client Proxy and executed on init) public void registerBlockModels() { for (DefinesLeaves define : subBlocks()) { ModelResourceLocation typeLocation = new ModelResourceLocation(getRegistryName(),"check_decay=true,decayable=true,variant="+define.leavesSubBlockVariant().name().toLowerCase()); //added all properties to the variant string. This is, how the key in the blockstate file looks like //ModelResourceLocation typeItemLocation = new ModelResourceLocation(getRegistryName().toString().substring(0,getRegistryName().toString().length()-1)+"_"+define.leavesSubBlockVariant().name().toLowerCase(),"inventory"); Item blockItem = Item.getItemFromBlock(define.leavesBlock()); ModelLoader.setCustomModelResourceLocation(blockItem,define.leavesSubBlockVariant().ordinal(),typeLocation); } } Unfortunately it still doesn't work as you can see in the attached images Regarding translation: The Constructor //-------------------Superclass--------------------// protected LeavesBlock(Collection<? extends DefinesLeaves> subBlocks) { super(Material.LEAVES); checkArgument(!subBlocks.isEmpty()); checkArgument(subBlocks.size() <= CAPACITY); this.subBlocks = ImmutableList.copyOf(subBlocks); this.setTickRandomly(true); this.setHardness(0.2F); this.setLightOpacity(1); this.setSoundType(SoundType.PLANT); setUnlocalizedName("leaves"); } //------------------Subclass----------------------// public ModLeavesBlock(Iterable<? extends DefinesLeaves> subBlocks) { super(ImmutableList.copyOf(subBlocks)); setCreativeTab(TheMod.INSTANCE.creativeTab()); this.setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, ModLogBlock.EnumType.ACEMUS).withProperty(CHECK_DECAY, Boolean.TRUE).withProperty(DECAYABLE, Boolean.TRUE)); } The custom getUnlocalizedName() function: //-------------Block Class--------------------// public final String getUnlocalizedName() { return String.format("tile.%s%s", domainPrefix(), getUnwrappedUnlocalizedName(super.getUnlocalizedName()));//domainPrefix() = "dendrology:", super.getUnlocalizedName() = "tile.leaves" //getUnwrappedUnlocalizedName(...) gets only the last part of the Unlocalized name path } //-------------Item Class-------------------// @Override public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName() + "." + ((LeavesBlock)block).getWoodType(stack.getMetadata()).name().toLowerCase(); } The langfile is located in /assets/lang and looks like this: ############################## # Dendrology # # English - UNITED STATES (US) (en_US) localization # Author: Scott Killen # #Blocks ### Logs tile.dendrology:log.acemus.name=Acemus Wood tile.dendrology:log.cedrum.name=Cedrum Wood tile.dendrology:log.cerasu.name=Cerasu Wood tile.dendrology:log.delnas.name=Delnas Wood tile.dendrology:log.ewcaly.name=Ewcaly Wood tile.dendrology:log.hekur.name=Hekur Wood tile.dendrology:log.kiparis.name=Kiparis Wood tile.dendrology:log.kulist.name=Kulist Wood tile.dendrology:log.lata.name=Lata Wood tile.dendrology:log.nucis.name=Nucis Wood tile.dendrology:log.porffor.name=Porffor Wood tile.dendrology:log.salyx.name=Salyx Wood tile.dendrology:log.tuopa.name=Tuopa Wood ### Leaves tile.dendrology:leaves.acemus.name=Acemus Leaves tile.dendrology:leaves.cedrum.name=Cedrum Leaves tile.dendrology:leaves.cerasu.name=Cerasu Leaves tile.dendrology:leaves.delnas.name=Delnas Leaves tile.dendrology:leaves.ewcaly.name=Ewcaly Leaves tile.dendrology:leaves.hekur.name=Hekur Leaves tile.dendrology:leaves.kiparis.name=Kiparis Leaves tile.dendrology:leaves.kulist.name=Kulist Leaves tile.dendrology:leaves.lata.name=Lata Leaves tile.dendrology:leaves.nucis.name=Nucis Leaves tile.dendrology:leaves.porffor.name=Porffor Leaves tile.dendrology:leaves.salyx.name=Salyx Leaves tile.dendrology:leaves.tuopa.name=Tuopa Leaves #... # Creatibe Tabs itemGroup.dendrology=Ancient Trees #... # Config file comments #... # Items item.dendrology:parcel.name=Ancient Parcel dendrology:parcel.tooltip=What have the Ancients hidden within? # Parcel contents #...
  18. Look, I'm sorry. Guess I'll open an issue for EVERY major MC Version... I have a 1.8(.9) Mod and want to update it to 1.9(.4). Choonster's TestMod3 is a pretty good reference , but it doesn't work for me. Tell me what I've done wrong once again, please. That's what I did: registering block and blockitem (on preinit) private static void registerLeavesBlock(Block block, String name) { block.setRegistryName(name); //<-sets Registry name HERE to make it more dynamic //GameRegistry.register(block,block.getRegistryName()); //<- is not needed I guess? I get something like a double registration error when using it GameRegistry.register(new ModLeavesItem(block),block.getRegistryName());//Uses a custom item class for some custumized behaviours. Yes it does extend ItemBlock Blocks.FIRE.setFireInfo(block, DEFAULT_LEAVES_FIRE_ENCOURAGEMENT, DEFAULT_LEAVES_FLAMMABILITY); } register block variants (using the Client Proxy and executed on init) public void registerBlockModels() { for (DefinesLeaves define : subBlocks())//contains the block instance and some additional information { ModelResourceLocation typeLocation = new ModelResourceLocation(getRegistryName(),"variant="+define.leavesSubBlockVariant().name().toLowerCase()); ModLeavesItem blockItem = new ModLeavesItem(define.leavesBlock()); ModelLoader.setCustomModelResourceLocation(blockItem,define.leavesSubBlockVariant().ordinal(),typeLocation); //ModelResourceLocation typeItemLocation = new ModelResourceLocation(getRegistryName().toString().substring(0,getRegistryName().toString().length()-1)+"_"+define.leavesSubBlockVariant().name().toLowerCase(),"inventory"); // //ModelBakery.registerItemVariants(blockItem,typeItemLocation); //isn't needed as well, I guess, as setCustomModelResourceLocation already registeres the model into the bakery. I tried to use it anyway though, since my item model is saved in a file with the pattern "<block>_<variant>.json" while the blockstate is not. } } My assets layout: |-assets |-modid |-blockstates |-leaves0 |-leaves1 |-... |-models |-block |-leaves_type1 |-leaves_type2 |-leaves_type3 |-... |-item |-leaves_type1 |-leaves_type2 |-leaves_type3 |-item |-... By the way, the localizing is broken too. I have a custom LangMap to fix that, but it shouldn't be broken in the first place. I assume it has to do with the same problem. Thanks and stuff.
  19. All right. Found a solution. Learning by example is more interesting, than pure theory after all.
  20. You are right. I'd still rather make a mod for every MC release having a stable Forge version. Since I plan to "resurrect" more mods and there are people, who can't or don't want to play the newer versions (e.g. because of modpack compatibility), I need to know how mod in 1.8 as well
  21. No. As far as I know 1.8 is still supported. It's just that moderators normally don't try to persuade you to use newer versions, if the one you are working for is still supported.
  22. Yes it does. I'm talking about research, man. If I selled the mod, I would just need to know how to work with the newest version, since there are more people using it, but as a gamedev I want to learn how the different versions of forge/minecraft work. Not by looking at the deobfuscated code, the practical way. Alright, since this version is not supported anymore, I will ask the question in an unofficial forum, no problem. Thank you nevertheless.
  23. Sorry. You know how we germans are But seriously. I just want to know. Every knowledge can be useful, even how to mod outdated MC versions
  24. I'm updating an old Mod and I would like to update it to EVERY version. Already finished with 1.8. So 1.8.8 or 1.8.9 are next.
  25. Hi again. Does anyone know how exactly the Block/item registering in 1.8.9 works? The Problem I have with this, is that addVariantName is depreceated (doesn't work anymore) and replaced by registerItemVariants, like in 1.9. But most of 1.9's API like manual Registration (setRegistryName etc.) isn't implemented yet. At the moment I have: the actual block registration on server and client side in the pre-init phase: GameRegistry.registerBlock(block, ModWoodItem.class, name, block, subblockNames.toArray(new String[subblockNames.size()])); //name = Blockstatename ...the Item Variant Model Registration on the client side in the pre-init phase: ModelBakery.registerItemVariants(Item.getItemFromBlock(block), new ResourceLocation(iconName)); //iconName = modid:unwrappedandunlocalizedname_variant and the "Block-To-Model" Registration on the Client side in the pre-init phase: for (DefinesWood type:subBlocks()) { final String subName = type.speciesName(); final int dMD=((ModWoodBlock.EnumType)type.woodSubBlockVariant()).getId(); final String iconName = getUnlocalizedName().substring(getUnlocalizedName().indexOf('.')+1)+"_"+subName; // iconName = modid:unwrappedandunlocalizedname_variant ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this),dMD,new ModelResourceLocation(iconName,"inventory")); } The Blocks are registered, but the Models are not and forge says Model definition for location dendrology:planks0#variant=acemus not found ... Model definition for location dendrology:planks_acemus#inventory not found ... I know it must be something simple I overlooked (like the last time), but I just don't get it So I post it here. "Driven by hope that there is hope again" - random guy in an RPG Maker Trashgame The fact that there isn't ANYTHING about 1.8.8 and 1.8.9 on the web except finished mods bothers me for some reason...
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.