Jump to content

Recommended Posts

Posted

Sounds need to be converted to the .ogg format, last I checked.

In assets/modid/sounds, add the .ogg files.

In assets/modid, add a sounds.json

In that, you would add something like this, if you have a file called testSound.ogg

{
"testSound": { "category": "block", "sounds": ["modid:testSound"], "subtitle": "modid.subtitle.testSound" }
}

You will have to look up the various categories inside SoundCategory.

Subtitle is the unlocalized string presented to those that have subtitles enable.

 

You then need to create a SoundHandler, that registers the sounds.

Vazkii's Psi has one you can look at: https://github.com/Vazkii/Psi/blob/98d44ba9e7852739e11515d53f6c0f21cef418d1/src/main/java/vazkii/psi/common/core/handler/PsiSoundHandler.java

 

Then in the various world#sound.... methods, you'd just call your SoundHandler#SoundYouWant along with the other variables (x,y,z, category, pitch, volume etc )

Also previously known as eAndPi.

"Pi, is there a station coming up where we can board your train of thought?" -Kronnn

Published Mods: Underworld

Handy links: Vic_'s Forge events Own WIP Tutorials.

Posted

So, I've done everything and it's all there and working, but......

 

It only plays the sound when I run the command. (It does take a little for the sound to load, but that's because it's a big audio file)

 

I am using a playersleepevent for example:

package com.fire.testmodclient.Events;

import com.fire.testmodclient.SoundHandler;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;

public class PlayerSleep {

@SubscribeEvent
public void onPlayerSleep(PlayerSleepInBedEvent event){
	final Minecraft minecraft = Minecraft.getMinecraft();
	final EntityPlayer player = event.getEntityPlayer();
	final World world = player.worldObj;

	world.playSound(player, player.getPosition(), SoundHandler.testSound, SoundCategory.MUSIC, 1, 1);

	System.out.println("Player Sleeping");

	event.setResult(EntityPlayer.SleepResult.OTHER_PROBLEM);
}

}

 

The command I used that worked:

/playsound testmodclient:testSound music FireControl1847

 

Edit: Also, how do I get the sound to follow the player, and only the player can hear?

 

Edit 2: Also also, is there an event for when a sound ends?

I am on my journey of making a remake of matmos, as explained here.

Posted

1. I'm not sure how to tell the difference between EntityPlayer and EntityPlayerSP. The only way I can get EntityPlayer is event.getEntityPlayer();

 

2. The code below is not working:

 

PlayerSleepInBedEvent

package com.fire.testmodclient.Events;

import com.fire.testmodclient.Reference;
import com.fire.testmodclient.SoundHandler;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayer.SleepResult;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;

public class PlayerSleep {

@SubscribeEvent
public void onPlayerSleep(PlayerSleepInBedEvent event){
	final EntityPlayer player = event.getEntityPlayer();
	final World world = player.worldObj;

	// world.playSound(player, player.getPosition(), SoundHandler.testSound, SoundCategory.MUSIC, 0.5F, 1F);
	// player.playSound(SoundHandler.testSound, 1, 1);

	if (event.getResultStatus() == SleepResult.OK) {
		player.playSound(SoundHandler.testSound, 1.0F, 1.0F);
	}

}

}

 

SoundHandler

package com.fire.testmodclient;

import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundEvent;

public class SoundHandler {

public static SoundEvent testSound;
public static SoundEvent testSound2;

private static int size = 0;

public static void init() {
	size = SoundEvent.REGISTRY.getKeys().size();

	testSound = register(null, "testSound");
}

public static SoundEvent register(String folder, String name) {
	ResourceLocation location = new ResourceLocation(Reference.MOD_ID + ":" + name);
	SoundEvent event = new SoundEvent(location);

	SoundEvent.REGISTRY.register(size, location, event);
	size++;
	return event;
}

}

 

Sounds Json

{
"testSound": { 
        "category": "music", 
        "sounds": ["testmodclient:testSound"], 
        "subtitle": "testmodclient.subtitle.testSound" ,
        "stream": true
    }
}

I am on my journey of making a remake of matmos, as explained here.

Posted

I am trying to make a client side mod, not a regular mod, that's why I asked about the EntityPlayerSP.

 

I'm trying to make what my signature says.

 

Edit: Also, is it possible to put the sounds in folders? I'm having trouble doing that...

I am on my journey of making a remake of matmos, as explained here.

Posted

I mean... I'm pretty sure. All I know is what you guys tell me... That's why I asked how to play custom sounds  ;)

 

This is what I've tried:

 

SoundHandler

package com.fire.testmodclient;

import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundEvent;

public class SoundHandler {

public static SoundEvent testSound;
public static SoundEvent testSound2;

private static int size = 0;

public static void init() {
	size = SoundEvent.REGISTRY.getKeys().size();

	testSound = register(null, "testSound");
	testSound2 = register("test", "testSound2");
}

public static SoundEvent register(String folder, String name) {
	ResourceLocation location;
	if (folder != null) {
		location = new ResourceLocation(Reference.MOD_ID + ":" + folder + "\\" + name);
	} else {
		location = new ResourceLocation(Reference.MOD_ID + ":" + name);
	}

	SoundEvent event = new SoundEvent(location);

	SoundEvent.REGISTRY.register(size, location, event);
	size++;
	return event;
}

}

 

Sounds Json

{
"testSound": { 
        "category": "music", 
        "sounds": ["testmodclient:testSound"], 
        "subtitle": "testmodclient.subtitle.testSound" ,
        "stream": true
    },
    "testSound2": { 
        "category": "music", 
        "sounds": ["testmodclient:test\testSound2"], 
        "subtitle": "testmodclient.subtitle.testSound" ,
        "stream": true
    }
}

 

Console Output

[12:58:01] [Client thread/INFO]: [CHAT] Played sound 'testmodclient:testSound' to FireControl1847
[12:58:05] [Client thread/WARN]: Unable to play unknown soundEvent: testmodclient:test\testSound
[12:58:05] [Client thread/INFO]: [CHAT] Played sound 'testmodclient:test\testSound' to FireControl1847
[12:58:09] [Client thread/WARN]: Unable to play unknown soundEvent: testmodclient:test/testSound
[12:58:09] [Client thread/INFO]: [CHAT] Played sound 'testmodclient:test/testSound' to FireControl1847
[12:58:16] [Client thread/WARN]: Unable to play unknown soundEvent: testmodclient:test/testSound2
[12:58:16] [Client thread/INFO]: [CHAT] Played sound 'testmodclient:test/testSound2' to FireControl1847
[12:58:20] [Client thread/INFO]: [CHAT] Played sound 'testmodclient:test\testSound2' to FireControl1847

I am on my journey of making a remake of matmos, as explained here.

Posted

Okay, I'll try that.

 

Back to playing a custom sound: I have no idea how to do it... Please help me >.<

^ Considering my whole mod is based around this, let's let this be our main priority.

 

Edit: That didn't work. It says it played the sound but it's not.

 

[13:05:49] [server thread/INFO]: [FireControl1847: Played sound 'testmodclient:testSound' to FireControl1847]
[13:05:49] [Client thread/INFO]: [CHAT] Played sound 'testmodclient:testSound' to FireControl1847
[13:05:53] [server thread/INFO]: [FireControl1847: Played sound 'testmodclient:test/testSound' to FireControl1847]
[13:05:53] [Client thread/WARN]: Unable to play unknown soundEvent: testmodclient:test/testSound
[13:05:53] [Client thread/INFO]: [CHAT] Played sound 'testmodclient:test/testSound' to FireControl1847
[13:05:59] [server thread/INFO]: [FireControl1847: Played sound 'testmodclient:test/testSound2' to FireControl1847]
[13:05:59] [Client thread/INFO]: [CHAT] Played sound 'testmodclient:test/testSound2' to FireControl1847
[13:06:10] [server thread/INFO]: [FireControl1847: Played sound 'testmodclient:test/testSound2' to FireControl1847]
[13:06:10] [Client thread/INFO]: [CHAT] Played sound 'testmodclient:test/testSound2' to FireControl1847

I am on my journey of making a remake of matmos, as explained here.

Posted

Okay.....

 

How do I get EntityPlayerSP instead of EntityPlayer?

 

Also, Quotes of what this article was/is about:

 

I mean... I'm pretty sure. All I know is what you guys tell me... That's why I asked how to play custom sounds  ;)

 

1. I'm not sure how to tell the difference between EntityPlayer and EntityPlayerSP. The only way I can get EntityPlayer is event.getEntityPlayer();

 

2. The code below is not working:

 

PlayerSleepInBedEvent

package com.fire.testmodclient.Events;

import com.fire.testmodclient.Reference;
import com.fire.testmodclient.SoundHandler;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayer.SleepResult;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;

public class PlayerSleep {

@SubscribeEvent
public void onPlayerSleep(PlayerSleepInBedEvent event){
	final EntityPlayer player = event.getEntityPlayer();
	final World world = player.worldObj;

	// world.playSound(player, player.getPosition(), SoundHandler.testSound, SoundCategory.MUSIC, 0.5F, 1F);
	// player.playSound(SoundHandler.testSound, 1, 1);

	if (event.getResultStatus() == SleepResult.OK) {
		player.playSound(SoundHandler.testSound, 1.0F, 1.0F);
	}

}

}

 

SoundHandler

package com.fire.testmodclient;

import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundEvent;

public class SoundHandler {

public static SoundEvent testSound;
public static SoundEvent testSound2;

private static int size = 0;

public static void init() {
	size = SoundEvent.REGISTRY.getKeys().size();

	testSound = register(null, "testSound");
}

public static SoundEvent register(String folder, String name) {
	ResourceLocation location = new ResourceLocation(Reference.MOD_ID + ":" + name);
	SoundEvent event = new SoundEvent(location);

	SoundEvent.REGISTRY.register(size, location, event);
	size++;
	return event;
}

}

 

Sounds Json

{
"testSound": { 
        "category": "music", 
        "sounds": ["testmodclient:testSound"], 
        "subtitle": "testmodclient.subtitle.testSound" ,
        "stream": true
    }
}

 

So, I've done everything and it's all there and working, but......

 

It only plays the sound when I run the command. (It does take a little for the sound to load, but that's because it's a big audio file)

 

I am using a playersleepevent for example:

package com.fire.testmodclient.Events;

import com.fire.testmodclient.SoundHandler;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;

public class PlayerSleep {

@SubscribeEvent
public void onPlayerSleep(PlayerSleepInBedEvent event){
	final Minecraft minecraft = Minecraft.getMinecraft();
	final EntityPlayer player = event.getEntityPlayer();
	final World world = player.worldObj;

	world.playSound(player, player.getPosition(), SoundHandler.testSound, SoundCategory.MUSIC, 1, 1);

	System.out.println("Player Sleeping");

	event.setResult(EntityPlayer.SleepResult.OTHER_PROBLEM);
}

}

 

The command I used that worked:

/playsound testmodclient:testSound music FireControl1847

 

Edit: Also, how do I get the sound to follow the player, and only the player can hear?

 

Edit 2: Also also, is there an event for when a sound ends?

I am on my journey of making a remake of matmos, as explained here.

Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Version 1.19 - Forge 41.0.63 I want to create a wolf entity that I can ride, so far it seems to be working, but the problem is that when I get on the wolf, I can’t control it. I then discovered that the issue is that the server doesn’t detect that I’m riding the wolf, so I’m struggling with synchronization. However, it seems to not be working properly. As I understand it, the server receives the packet but doesn’t register it correctly. I’m a bit new to Java, and I’ll try to provide all the relevant code and prints *The comments and prints are translated by chatgpt since they were originally in Spanish* Thank you very much in advance No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. MountableWolfEntity package com.vals.valscraft.entity; import com.vals.valscraft.network.MountSyncPacket; import com.vals.valscraft.network.NetworkHandler; import net.minecraft.client.Minecraft; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.network.PacketDistributor; public class MountableWolfEntity extends Wolf { private boolean hasSaddle; private static final EntityDataAccessor<Byte> DATA_ID_FLAGS = SynchedEntityData.defineId(MountableWolfEntity.class, EntityDataSerializers.BYTE); public MountableWolfEntity(EntityType<? extends Wolf> type, Level level) { super(type, level); this.hasSaddle = false; } @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DATA_ID_FLAGS, (byte)0); } public static AttributeSupplier.Builder createAttributes() { return Wolf.createAttributes() .add(Attributes.MAX_HEALTH, 20.0) .add(Attributes.MOVEMENT_SPEED, 0.3); } @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemstack = player.getItemInHand(hand); if (itemstack.getItem() == Items.SADDLE && !this.hasSaddle()) { if (!player.isCreative()) { itemstack.shrink(1); } this.setSaddle(true); return InteractionResult.SUCCESS; } else if (!level.isClientSide && this.hasSaddle()) { player.startRiding(this); MountSyncPacket packet = new MountSyncPacket(true); // 'true' means the player is mounted NetworkHandler.CHANNEL.sendToServer(packet); // Ensure the server handles the packet return InteractionResult.SUCCESS; } return InteractionResult.PASS; } @Override public void travel(Vec3 travelVector) { if (this.isVehicle() && this.getControllingPassenger() instanceof Player) { System.out.println("The wolf has a passenger."); System.out.println("The passenger is a player."); Player player = (Player) this.getControllingPassenger(); // Ensure the player is the controller this.setYRot(player.getYRot()); this.yRotO = this.getYRot(); this.setXRot(player.getXRot() * 0.5F); this.setRot(this.getYRot(), this.getXRot()); this.yBodyRot = this.getYRot(); this.yHeadRot = this.yBodyRot; float forward = player.zza; float strafe = player.xxa; if (forward <= 0.0F) { forward *= 0.25F; } this.flyingSpeed = this.getSpeed() * 0.1F; this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * 1.5F); this.setDeltaMovement(new Vec3(strafe, travelVector.y, forward).scale(this.getSpeed())); this.calculateEntityAnimation(this, false); } else { // The wolf does not have a passenger or the passenger is not a player System.out.println("No player is mounted, or the passenger is not a player."); super.travel(travelVector); } } public boolean hasSaddle() { return this.hasSaddle; } public void setSaddle(boolean hasSaddle) { this.hasSaddle = hasSaddle; } @Override protected void dropEquipment() { super.dropEquipment(); if (this.hasSaddle()) { this.spawnAtLocation(Items.SADDLE); this.setSaddle(false); } } @SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.START) { MinecraftServer server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); if (server != null) { for (ServerPlayer player : server.getPlayerList().getPlayers()) { if (player.isPassenger() && player.getVehicle() instanceof MountableWolfEntity) { MountableWolfEntity wolf = (MountableWolfEntity) player.getVehicle(); System.out.println("Tick: " + player.getName().getString() + " is correctly mounted on " + wolf); } } } } } private boolean lastMountedState = false; @Override public void tick() { super.tick(); if (!this.level.isClientSide) { // Only on the server boolean isMounted = this.isVehicle() && this.getControllingPassenger() instanceof Player; // Only print if the state changed if (isMounted != lastMountedState) { if (isMounted) { Player player = (Player) this.getControllingPassenger(); // Verify the passenger is a player System.out.println("Server: Player " + player.getName().getString() + " is now mounted."); } else { System.out.println("Server: The wolf no longer has a passenger."); } lastMountedState = isMounted; } } } @Override public void addPassenger(Entity passenger) { super.addPassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(true)); } } } @Override public void removePassenger(Entity passenger) { super.removePassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is no longer mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(false)); } } } @Override public boolean isControlledByLocalInstance() { Entity entity = this.getControllingPassenger(); return entity instanceof Player; } @Override public void positionRider(Entity passenger) { if (this.hasPassenger(passenger)) { double xOffset = Math.cos(Math.toRadians(this.getYRot() + 90)) * 0.4; double zOffset = Math.sin(Math.toRadians(this.getYRot() + 90)) * 0.4; passenger.setPos(this.getX() + xOffset, this.getY() + this.getPassengersRidingOffset() + passenger.getMyRidingOffset(), this.getZ() + zOffset); } } } MountSyncPacket package com.vals.valscraft.network; import com.vals.valscraft.entity.MountableWolfEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class MountSyncPacket { private final boolean isMounted; public MountSyncPacket(boolean isMounted) { this.isMounted = isMounted; } public void encode(FriendlyByteBuf buffer) { buffer.writeBoolean(isMounted); } public static MountSyncPacket decode(FriendlyByteBuf buffer) { return new MountSyncPacket(buffer.readBoolean()); } public void handle(NetworkEvent.Context context) { context.enqueueWork(() -> { ServerPlayer player = context.getSender(); // Get the player from the context if (player != null) { // Verifies if the player has dismounted if (!isMounted) { Entity vehicle = player.getVehicle(); if (vehicle instanceof MountableWolfEntity wolf) { // Logic to remove the player as a passenger wolf.removePassenger(player); System.out.println("Server: Player " + player.getName().getString() + " is no longer mounted."); } } } }); context.setPacketHandled(true); // Marks the packet as handled } } networkHandler package com.vals.valscraft.network; import com.vals.valscraft.valscraft; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class NetworkHandler { private static final String PROTOCOL_VERSION = "1"; public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( new ResourceLocation(valscraft.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals ); public static void init() { int packetId = 0; // Register the mount synchronization packet CHANNEL.registerMessage( packetId++, MountSyncPacket.class, MountSyncPacket::encode, MountSyncPacket::decode, (msg, context) -> msg.handle(context.get()) // Get the context with context.get() ); } }  
    • Do you use features of inventory profiles next (ipnext) or is there a change without it?
    • Remove rubidium - you are already using embeddium, which is a fork of rubidium
  • Topics

×
×
  • Create New...

Important Information

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