Jump to content

[1.12] Make custom potion not display potion particles


Lyeoj

Recommended Posts

Alright, so I have a bunch of cool potion effects that I have made, but I don't like the potion particles showing up when they are active. The easiest way I could find to make the potions not display particles was to set the liquid color to pure black (0). However, I have now decided that I want to register a bunch of my potion effects as PotionTypes so I can make them into drinkable or splash potions relatively easily. For these potions, I want them to have a liquid color that isn't just pure black, but changing the color would make them display particles again. So I want to know if there is an easy way to turn off the potion particles while still having a colored potion liquid. 

Link to comment
Share on other sites

You can use the PotionEffect(Potion potionIn, int durationIn, int amplifierIn, boolean ambientIn, boolean showParticlesIn) constructor to control whether or not particles are displayed for a PotionEffect.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

So I thought that constructor was just what I was looking for, but then I tried using it to make a custom PotionType, and setting showParticlesIn to false turns the liquid color to black.

This PotionType shows particles and has a colored liquid:

public static final PotionType FROZEN = new PotionType(new PotionEffect[] {new PotionEffect(AMPotion.FROZEN, 600, 0, false, true)}).setRegistryName("frozen");

And this one doesn't show particles but has a black liquid:

public static final PotionType FROZEN = new PotionType(new PotionEffect[] {new PotionEffect(AMPotion.FROZEN, 600, 0, false, false)}).setRegistryName("frozen");

Additionally, setting the particles to false messes with another aspect of my potion effect. So this particular effect has an overlay drawn on the screen that is called using an overridden renderHUDEffect from the Potion class and it is no longer visible using the new PotionEffect constructor with showParticlesIn set to false. This seems odd.

Link to comment
Share on other sites

Well I did some looking through the code and found the reason for one of my issues. So the HUD effect not showing up is due to a check in the GuiIngame class, as the call to the Forge renderHUDEffect is within a conditional block that checks if the potion shows particles. I haven't found the place where the potion's liquid color is set for the potion item, but I assume that it will also check if the potion shows particles when setting the liquid color as well. Regardless of the reason for the liquid color, I think I won't be able to just turn off the particles in the constructor and still get the desired behavior for my potion effects. The only thing I can think of to do now is make a bunch of brand new items to mimic the vanilla potions, although it will be annoying since I want to give them splash and lingering variants as well. If anyone has an idea on a better way to do this, it would be appreciated.

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.