Jump to content

Using ResourceLocation for files outside of jar resources.


TheMCJavaFre4k

Recommended Posts

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

Link to comment
Share on other sites

26 minutes ago, TheMCJavaFre4k said:

Minecraft::defaultResourcePacks

 

In the Minecraft class.

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/

Link to comment
Share on other sites

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 by Matryoshika

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.

Link to comment
Share on other sites

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 by Matryoshika

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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