Jump to content

Play sound / particle effects to nearby players


terorie

Recommended Posts

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
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

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

    • Right now im trying to make an own mod for minecraft for the version 1.16.5 with forge but whatever i do it still doesnt fix the error this is my build.gradle : buildscript { repositories { maven { url = "https://maven.minecraftforge.net" } mavenCentral() } dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:5.1.+' } } apply plugin: 'net.minecraftforge.gradle' apply plugin: 'java' group = 'com.example' // Modify to your package name version = '1.0' archivesBaseName = 'flippermod' java { toolchain { languageVersion = JavaLanguageVersion.of(8) } } minecraft { version = "1.16.5-36.2.42" // Ensure this matches your Forge version mappings channel: 'official', version: '1.16.5' runs { client { workingDirectory project.file('run') property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' property 'forge.logging.console.level', 'debug' mods { flipper_mod { sourceSets.main.output } } } } } repositories { maven { url = "https://maven.minecraftforge.net/" } mavenCentral() } dependencies { minecraft "net.minecraftforge:forge:1.16.5-36.2.42" } and this one is my settings.gradle:  pluginManagement { repositories { gradlePluginPortal() maven { name = 'MinecraftForge' url = 'https://maven.minecraftforge.net/' } } } plugins { id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' } rootProject.name = 'flippermod' this one is the mods.tml    modLoader="javafml" loaderVersion="[36,)" modId="flippermod" version="1.0.0" displayName="Flippermod" and the last one is the gradle-wrapper.properties distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip dc :"code_slivki"
    • Today I tried downloading 1.16.5 forge (the recommended version) and when installing I selected "download client". At the end just before appeared "These libraries failed to download. Try again." and at the bottom there were "org.apache.logging.log4j:log4j-api:2.15.0 ; org.apache.logging.log4j:log4j-core:2.15.0 and org.apache.logging.log4j:log4j-slf4j18-impl2.15.0" I tried the newest version and the same thing appeared
    • I think the problem is the server doesn't have enough ram, but I need to be sure before buying more. The modpack I use is Craft of exile 2 and the server has 4gb ram. When I try to turn it on I get a bunch of warns and at the end it just says "[Multicraft] Skipped 564 lines due to rate limit (160/s)" Is there a way to increase the rate limit? One time it did start, but without half of the mods. The modpack works perfectly fine on my computer even if I have the launch ram limit to 4gb.
    • Nevermind, RedstoneWireBlock.java had what I needed. Surprised I didn't try looking there until now.
    • I tried to open my Minecraft world normally and got the error "Errors in currently selected data pacts prevented the world from loading." Trying to start in safe mode gives the error "This world contains invalid or corrupted save data." My recent log is too large to make a Pastebin link. Any help would be much appreciated. 
  • Topics

×
×
  • Create New...

Important Information

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