Jump to content

findContainerFor() returns null for core mods


Cuchaz

Recommended Posts

Hello,

 

I'm writing a core mod now. For some reason, FMLCommonHandler.instance().findContainerFor(mod) doesn't work on core mods. It can't find the container and just returns null. After glancing at the source, it seems this is by design. InjectedModContainers goes to great lengths to "override" the isImmutable() method and disable inclusion of the mod in the usual lookup list that findContainerFor() uses.

 

So my question is, how can my core mod use findContainerFor()? Or more importantly, how can my core mod use Forge functions that rely on findContainerFor() like entity registration, gui registration, etc?

 

Are core mods not supposed to register these things for some reason? Am I required to split my mod into two mods? One FML mod and one core mod? It would be nice to keep everything in one mod.

 

Thanks,

Cuchaz

Link to comment
Share on other sites

If for some reason it's not taboo to have core mods registering things like entities and guis, this small patch seems to resolve the issue:

 

in cpw.mods.fml.common.FMLCommonHandler:

public ModContainer findContainerFor(Object mod)
{
    if( mod instanceof ModContainer )
    {
        return (ModContainer)mod;
    }
    
    return Loader.instance().getReversedModObjectList().get(mod);
}

Link to comment
Share on other sites

And while I'm thinking of it, the event dispatcher for core mods seems to swallow exceptions. That makes debugging slightly more difficult, but it's not a huge problem.

 

ie, if my mod container has a method like this:

@Subscribe
public void construct( FMLConstruction event )
{
     throw new RuntimeException( "where does this go?" );
}

 

The exception appears nowhere in the log. =(

 

The easy workaround for now is to just remember to put a try/catch in all my event handlers.

Link to comment
Share on other sites

Let me think...

 

FML itself is a coremod and deals with the loading order of other coremods and mods...

 

I see three solutions to your problem (which actually is to not being able to register things through Forge methods):

-make a coremod part and a mod part

-load your own mod section in your coremod like FML does

-don't use Forge methods, make your own

Link to comment
Share on other sites

Thanks for the suggestions. The limitations of core mods seems to be a philosophy decision from cpw. There's no technical reason why core mods can't do these things. That's disappointing, but there doesn't seem to be anything I can do about it.

 

Your first suggestion is what I'll have to do. I'll just have to split my mod into two mods.

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

    • 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;     }  
    • It is an issue with quark - update it to this build: https://www.curseforge.com/minecraft/mc-mods/quark/files/3642325
    • Remove Instant Massive Structures Mod from your server     Add new crash-reports with sites like https://paste.ee/  
    • Update your drivers: https://www.amd.com/en/support/graphics/amd-radeon-r9-series/amd-radeon-r9-200-series/amd-radeon-r9-280x
  • Topics

×
×
  • Create New...

Important Information

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