TheMCJavaFre4k Posted February 8, 2017 Posted February 8, 2017 Ive just started modding again since 1.6.4 and I'm trying to figure out how i would go about reading a file and loading assets from an external locations such as another file in the mods folder. Ive seen a few posts saying that you need to either create a class that implements IResourceManager or to use FolderResourcePack to set a folder as a default resource pack location. From my understanding, the FolderResourcePack should be ideal as i am following the normal minecraft resource layout of Directory/assets/modid/textures.. etc. Im just not sure where to start with using FolderResourcePack as I've always been used to just using standard directories as the mods never used to be packaged. Could anyone show me a barebones way of doing this or point me in the right direction. Thanks Quote
TheMCJavaFre4k Posted February 8, 2017 Author Posted February 8, 2017 3 minutes ago, diesieben07 said: You make an instance of FolderResourcePack and then put it into Minecraft::defaultResourcePacks on startup. How would i go about performing the latter. Ive got a new FolderResourcePack pain ting to my root folder. Quote
TheMCJavaFre4k Posted February 8, 2017 Author Posted February 8, 2017 3 minutes ago, diesieben07 said: defaultResourcePacks is a List, you add to it. How to i access the list? What class is it in. Quote
larsgerrits Posted February 8, 2017 Posted February 8, 2017 26 minutes ago, TheMCJavaFre4k said: Minecraft::defaultResourcePacks In the Minecraft class. Quote Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support. 1.12 -> 1.13 primer by williewillus. 1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support. http://www.howoldisminecraft1710.today/
Matryoshika Posted February 8, 2017 Posted February 8, 2017 (edited) In 1.10 at least, Minecraft::defaultResourcePacks is private, last I checked, so he'll need to use Reflection to get it, add his own IResourcePack instance (the FolderResourcePack) and then, most importantly, refresh the resources with Minecraft::refreshResources. I'm doing it prior to block initialization, but could be done just prior to model initialization. Edited February 8, 2017 by Matryoshika Quote Also previously known as eAndPi. "Pi, is there a station coming up where we can board your train of thought?" -Kronnn Published Mods: Underworld Handy links: Vic_'s Forge events Own WIP Tutorials.
Matryoshika Posted February 8, 2017 Posted February 8, 2017 (edited) 13 minutes ago, diesieben07 said: You don't need to refresh resources if you do it in preInit. Huh, that's odd... I was doing it during the RegistryEvent.Register<Block> event. Shouldn't that still work then, as it's been added before preInit? As your statement infers that Minecraft::refreshResources is called at the end/after preInit. Edited February 8, 2017 by Matryoshika Quote Also previously known as eAndPi. "Pi, is there a station coming up where we can board your train of thought?" -Kronnn Published Mods: Underworld Handy links: Vic_'s Forge events Own WIP Tutorials.
TheMCJavaFre4k Posted February 8, 2017 Author Posted February 8, 2017 20 minutes ago, Matryoshika said: In 1.10 at least, Minecraft::defaultResourcePacks is private, last I checked, so he'll need to use Reflection to get it, add his own IResourcePack instance (the FolderResourcePack) and then, most importantly, refresh the resources with Minecraft::refreshResources. I'm doing it prior to block initialization, but could be done just prior to model initialization. I'm totally lost now. So ill look into reflection as i haven't used the technique before and have no clue what to do unless i know it by a different name. And if I'm using IResourcePack now, how do i specify the root folder? Quote
Matryoshika Posted February 9, 2017 Posted February 9, 2017 1 minute ago, TheMCJavaFre4k said: I'm totally lost now. So ill look into reflection as i haven't used the technique before and have no clue what to do unless i know it by a different name. And if I'm using IResourcePack now, how do i specify the root folder? No, stay with FolderResourcePack. It implements IResourcePack, which is what the list contains. Create a List<IResourcePack>, in a method in your client proxy (name the method registerResourcepack or whatever) and initialize it to null. I recommend you try either FieldUtils from Apache Commons Lang3 (already packed with Forge) or ReflectionHelper, which originates from Forge directly, and I've heard it is the best alternative with all of the obfuscation/deobfuscation/obfuscation happening. The two things I just mentioned are great tools to help you get fields (and more) that are private, or final, or really, "untouchable". Reflections really just "unlocks" the wanted thing, if it exists, though it is more demanding on resources compared to just getting a normal field. Quote Also previously known as eAndPi. "Pi, is there a station coming up where we can board your train of thought?" -Kronnn Published Mods: Underworld Handy links: Vic_'s Forge events Own WIP Tutorials.
TheMCJavaFre4k Posted February 9, 2017 Author Posted February 9, 2017 27 minutes ago, Matryoshika said: No, stay with FolderResourcePack. It implements IResourcePack, which is what the list contains. Create a List<IResourcePack>, in a method in your client proxy (name the method registerResourcepack or whatever) and initialize it to null. I recommend you try either FieldUtils from Apache Commons Lang3 (already packed with Forge) or ReflectionHelper, which originates from Forge directly, and I've heard it is the best alternative with all of the obfuscation/deobfuscation/obfuscation happening. The two things I just mentioned are great tools to help you get fields (and more) that are private, or final, or really, "untouchable". Reflections really just "unlocks" the wanted thing, if it exists, though it is more demanding on resources compared to just getting a normal field. I think I've got more of an understanding now. What i have so far: public void registerResources(){ List<IResourcePack> defaultResourcePacks = null; defaultResourcePacks = ReflectionHelper.getPrivateValue(Minecraft.class, Minecraft.getMinecraft(), "defaultResourcePacks"); defaultResourcePacks.add(new FolderResourcePack(new File("/mods"))); } Im not sure if this is working because I'm not entirely sure how to use this now to load an asset. Quote
TheMCJavaFre4k Posted February 9, 2017 Author Posted February 9, 2017 1 minute ago, diesieben07 said: Why are you adding the mods folder as a resource pack? I am starting to question this whole ordeal, why are you trying to do this? You will also need to add the SRG name (using MCPBot) for the field, or you mod will not work outside of the development environment. Well i was using the mods folder back in 1.6.4 as the assets because the mod could be run as a folder and thats just the code i was following. I will probably move it to a seperate file if i know it works. Quote
TheMCJavaFre4k Posted February 9, 2017 Author Posted February 9, 2017 Just now, diesieben07 said: Uhm, what? "Mod as a folder" is a terrible idea and as far as I know FML will not even allow it anymore. That has not answered the question for an additional resource pack though. I was using just a folder but i can't anymore hence why I'm stuck at the moment. Im wanting people to be able to dump images and sounds into a file within .minecraft then in game can use custom blocks to either play the sounds or use the textures etc. Quote
TheMCJavaFre4k Posted February 9, 2017 Author Posted February 9, 2017 Just now, diesieben07 said: So... a resource pack? Why can they not use a normal resource pack? because in the custom block I'm creating, it will have its own gui to allow the player to play sounds and do all these things, not just replace the base minecraft ones. Quote
TheMCJavaFre4k Posted February 9, 2017 Author Posted February 9, 2017 Just now, diesieben07 said: They could still use a normal resource pack for that. And even then, the mods folder is a terrible place for that. Do it in a specialized folder. so I've got it pointed to another folder called ModAssets within the .minecraft folder and within that i have the standard file system of assets/modid/sounds etc.. but how do i then use this new FolderResourcePack in a resource location? Im trying to eliminate the need for people to head into the resource pack option and choose the mod one just for simplicity. Quote
TheMCJavaFre4k Posted February 9, 2017 Author Posted February 9, 2017 Just now, diesieben07 said: You use it like any other resource. Resources in that folder will behave as if they were part of your mod, part of the Minecraft assets or part of an active resource pack. so i just use something like: new ResourceLocation("ModAssets", nameOfFile) Quote
TheMCJavaFre4k Posted February 9, 2017 Author Posted February 9, 2017 6 minutes ago, diesieben07 said: That would point at assets/ModAssets/<nameOfFile> inside the ModAssets directory. I can't seem to get it to look in the custom resource file, It just keep looking in the resources for the mod. Quote
TheMCJavaFre4k Posted February 9, 2017 Author Posted February 9, 2017 I believe i have it all working now, thanks everyone for there help. Quote
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.