Jump to content

Recommended Posts

Posted (edited)

I am porting a mod from 1.7.10 to 1.10.2. (Parts of Witchery)

In a BlockXY.dropBlockAsItemWithChance (Server-side as far as I understand?), the dropped block sends a particle event and a SoundEvent to nearby players through SimpleNetworkWrapper.

The author does this with a custom IMessage that instantly plays a sound in onMessage (Must be executed on client side, right?).

 

I was breaking my head over how to implement this in 1.10.2 the last 30 minutes.

 

Now I had three ideas how to do this in 1.10.2:

 

  1. Couldn't you just let the nearby clients figure our theirselves that "dropBlockAsItemWithChance" is about to be called? Then every client would play that sound locally without receiving packets that tell them specifically to play packets. Or did I get the client/server concept of Minecraft completely wrong there?
  2. If you want do it exactly like how I described it at the beginning, you would find that SoundEvents don't have a corresponding numeric ID, only resource Strings. Do I need to create an enum that maps sound Resource Strings to numeric values?
  3. {Why not} / {how to} use SPacketSoundEffect? Does it work for vanilla sounds only? Can you send the SPacketSoundEffect through the SimpleNetworkWrapper?

 

Sorry for the nooby post, the last thing I wanted to do is annoy people in a forum.

 

But I'm desperate, I would really appreciate some help! :)

 

 — terorie

Edited by terorie
markup 2
Posted
12 minutes ago, terorie said:

1. Couldn't you just let the nearby clients figure our theirselves that "dropBlockAsItemWithChance" is about to be called? Then every client would play that sound locally without receiving packets that tell them specifically to play packets. Or did I get the client/server concept of Minecraft completely wrong there?

 

Block#dropBlockAsItemWithChance is only called on the server. Block#removedByPlayer is called just before that on both the server and the client, but only the client of the player who broke the block. The clients of other nearby players don't know that a block was broken by a player, the server just tells them to play the breaking effects and set the block to air.

 

 

12 minutes ago, terorie said:

2. If you want do it exactly like how I described it at the beginning, you would find that SoundEvents don't have a corresponding numeric ID, only resource Strings. Do I need to create an enum that maps sound Resource Strings to numeric values?

 

Why do you need a numeric ID? Packets can send other data types, including strings.

 

Every IForgeRegistryEntry implementation has a numeric ID, which you can access from the corresponding registry with RegistryNamespaced#getIDForObject. Vanilla implementations store their registry as a static field of the entry class, but mod implementations may not. If you only have the registry as an IForgeRegistry, you can't access the numeric IDs directly.

 

 

12 minutes ago, terorie said:

3. {Why not} / {how to} use SPacketSoundEffect? Does it work for vanilla sounds only? Can you send the SPacketSoundEffect through the SimpleNetworkWrapper?

 

There's nothing limiting SPacketSoundEffect to vanilla SoundEvents, it will work with any SoundEvent.

 

Forge's documentation explains the various methods that play sound here.

 

If you create a SoundType and set it as the Block's SoundType with Block#setSoundType, the SoundEvents will be automatically played at the appropriate times (including when the Block is broken).

 

You can also override Block#addDestroyEffects to add any custom effects (and optionally disable the vanilla particles) when the Block is destroyed.

  • Like 1

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.

Posted
4 minutes ago, Choonster said:

There's nothing limiting SPacketSoundEffect to vanilla SoundEvents, it will work with any SoundEvent.

 

Forge's documentation explains the various methods that play sound here.

How embarrassing, I read that documentation at least ten times.:/

 

4 minutes ago, Choonster said:

If you create a SoundType and set it as the Block's SoundType with Block#setSoundType, the SoundEvents will be automatically played at the appropriate times (including when the Block is broken).

 

You can also override Block#addDestroyEffects to add any custom effects (and optionally disable the vanilla particles) when the Block is destroyed.

Forge / Minecraft continues to amaze me!

 

Thank you, I got it to work `.`

 

– Have a nice Sunday, terorie

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



×
×
  • Create New...

Important Information

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