Jump to content

[1.16.5] Cancel Portal Sounds


Zeher_Monkey

Recommended Posts

Hi all,

 

I have a custom dimension which is accessed through a custom block. I am using

server_player.changeDimension(server_world, shifterIn);

To change the player dimension when shift-right clicking the block. 

 

I have my own custom Portal Sounds for entry and exit, but the original Nether Portal sounds are playing over the top. Without resorting to using

PlaySoundEvent event

And cancelling all Portal Sounds, which I don't want to do, how could I stop the original sound from being played?

 

PlaySoundEvent has a BlockPos, but when playing the Portal Sound, it is always (0, 0, 0), so I cannot differentiate between BlockPos.

 

I have looked into ServerPlayerEntity and found this:

this.connection.sendPacket(new SPlaySoundEventPacket(1032, BlockPos.ZERO, 0, false));

 

I have also tried replicating the code contained within

public Entity changeDimension(ServerWorld server, net.minecraftforge.common.util.ITeleporter teleporter) { }

 

But it fails everytime.

 

Any help is appreciated!

Link to comment
Share on other sites

4 minutes ago, diesieben07 said:

You could probably check the current dimension when the sound is played and replace it that way.

How would I go about doing that? I cant get an Entity from the SoundEvent, and I'm not entirely sure how to replace / sounds. I can only get the ISound, SoundCategory and the X,Y,Z of the sound Event.

Link to comment
Share on other sites

9 minutes ago, diesieben07 said:

PlaySoundEvent is a client side event, so you can just check Minecraft#world.

Okay thanks. That only solves half of the issue however, as:

Going from Overworld / Nether / End -> Custom Dimension now cancels correctly.

 

But going from Custom Dimension -> Overworld / Nether / End still plays the sound.

Link to comment
Share on other sites

2 minutes ago, diesieben07 said:

Not sure if there is a good way to do that. You could use WorldEvent.Unload to detect the old dimension unloading on the client and then remember that fact in a static field. However it's not fool proof.

Yeah that is what I was afraid of. I may just have to accept using the nether portal sound for now. I don't think your solution would work on servers with many people, and I cant think of any way to do it personally. Ill have to leave the sound playing one way.

Many thanks for your help!

Link to comment
Share on other sites

1 minute ago, diesieben07 said:

The sound is only played to the player using the portal and the detection/replacement would be purely client-side. I don't think there can be any issues with multiplayer.

The only time this would be an issue is if some other mod plays the 1032 level event as well, in which case you might inadvertently replace it with yours if you don't handle the "just came from my dimension" flag correctly.

Okay. That seems reasonable.

 

I have thought of an idea, which is to store a Previous Dimension [ResourceLocation] tag into the Players Persisted Data, and change that using PlayerEvent.PlayerChangedDimensionEvent. I can then use this to check when sound events are playing. I'm storing these tags under my MOD_ID so that no other mod can get confused.

Link to comment
Share on other sites

2 minutes ago, diesieben07 said:

That will not work for multiple reasons:

  • PlayerChangedDimensionEvent fires after the sound has been played.
  • PlayerChangedDimensionEvent is a server side event, but the sound is played client side (as a result of a packet).
  • The persisted data is not synced to the client by default.

Okay, that idea is scrapped then. I will have to accept that the standard sound will play when going from Custom -> Vanilla world. Which to be honest is not that bad, I'm not too happy with the Exit sound anyway. Maybe I could ask the Forge devs to see if they can work their magic and allow for custom sounds to be played via theS

SPlaySoundEffectPacket(SoundEvent event, SoundCategory category, double x, double y, double x, float volume, float pitch)

Instead of hard-coding the sound.

Maybe that's a longshot but who knows.

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.