Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

(SOLVED)MovingSound, ITickableSound and SoundManager: starting-stopping sounds.


Darkona
 Share

Recommended Posts

Hello fellow modders and Forge coders.

 

In trying to implement a looping, moving sound, I came across a seemingly unresolvable problem.

If you use a MovingSound to, let's say, make a constant jetpack sound on a player, that moves with it, you're better off using a moving sound, logically, than making very short, continuous calls to world.playsound();

 

Case example:

The sound should start when the player turns the jetpack on and stops when he turns it off, but it should loop as long as the jetpack is working.

This can be apparently done by implementing a custom Moving sound, with the "loop" variable set to true, and an onUpdate() method setting the position of the sound to the player. No mystery here. The problem arises when you want to make the sound stop. Let's call setDonePlaying() when the jetpack is off, to indicate the system that the sound should stop.

 

Then we go to the SoundManager class, where all the sounds are processed for playing.

In the updateAllSounds method, there is a check for isDonePlaying(), and if it is set to true, there's a call to stopSound().

Making the call to stopSound() does indeed stop it, but for some reason you are not able to start it again, not even creating a new Isound object and telling SoundHandler to play it.

 

The sound manager has two methods for stopping sounds, "stopAllSounds" and "stopSound".

 

updateAllSounds() iterates across multiple lists of sounds:

- playingSounds

- tickableSounds

- delayedSounds

and others.

 

updateAllSounds does iterate over all these lists and removes the sound appropiately from each of them, as well as executes paulscode's removeSource(), so I'm at a loss at what could be preventing the sound from being played again. For some reason a reference to the ResouceLocation where the sound file is, stays around somewhere and prevents the sound from being played again, until some time has passed.

 

Any insight on this matter would be very appreciatted.

Link to comment
Share on other sites

Apparently the fact of analyzing (again) the whole deal, made me realize the answer!

 

I'll leave the solution here to help others:

 

When the updateAllSounds method detects a sound that has donePlaying set to true, it does indeed stop the sound, and it also removes the source.

HOWEVER, if the repeat variable is set to true, it will add it to the delayedSounds list AFTER it stops it and removes the source. So it will muck up the whole playing lists, making you unable to start or stop the sound again.

 

To avoid this, if your sound is a looping one, you must set the repeat variable to false as well as the donePlaying to true, at the same time.

 

Below is my CopterPackSound class, that works corectly and can be started, stopped and loops as long as the item is in use.

 

Note that it is better in my opinion to override both the fields and all the methods you need to ensure that the ones in your class are the ones actually being called. I know its not THAT necessary in some cases due to inheritance, but I find this approach a "safer" route.

 

public class CopterPackSound extends MovingSound
{

    public EntityPlayer thePlayer;
    protected boolean repeat = true;
    protected int repeatDelay = 0;

    protected float pitch;

    public CopterPackSound()
    {
        super(new ResourceLocation(ModInfo.MOD_ID, "helicopter"));
        this.repeat = true;
        this.volume = 0.8f;
        this.pitch = 1.0F;
    }

    public CopterPackSound(EntityPlayer player)
    {
        super(new ResourceLocation(ModInfo.MOD_ID, "helicopter"));
        volume = 0.8f;
        pitch = 1.0F;
        thePlayer = player;
        LogHelper.info("Sound Created");
    }

    public void setDonePlaying()
    {
        this.repeat = false;
        this.donePlaying = true;
        this.repeatDelay = 0;
    }

    @Override
    public boolean isDonePlaying()
    {
        return this.donePlaying;
    }

    @Override
    public void update()
    {
        ItemStack copter = Wearing.getWearingCopter(thePlayer);
        byte status = 0;
       if(thePlayer == null || thePlayer.worldObj == null)
        {
            setDonePlaying();
        }
        if (copter != null&& copter.hasTagCompound() && copter.getTagCompound().hasKey("status"))
        {
            status = copter.getTagCompound().getByte("status");
            if (status == ItemCopterPack.OFF_MODE)
            {
                setDonePlaying();
            }else{
                if(status == ItemCopterPack.HOVER_MODE)
                {
                    pitch = (thePlayer.motionY == 0) ? 1.0f : (thePlayer.motionY > 0) ? 1.2f : 0.8f;
                }
                else
                {
                    pitch = (thePlayer.onGround || thePlayer.motionY == 0) ?  0.8f : (thePlayer.isSneaking()) ? 0.8f : (thePlayer.motionY > 0) ? 1.2f : 1.0F;
                }
            }
        }else{
            setDonePlaying();
        }
        xPosF = (float)thePlayer.posX;
        yPosF = (float)thePlayer.posY;
        zPosF = (float)thePlayer.posZ;
    }

    @Override
    public boolean canRepeat()
    {
        return this.repeat;
    }

    @Override
    public float getVolume()
    {
        return this.volume;
    }

    @Override
    public float getPitch()
    {
        return this.pitch;
    }

    @Override
    public int getRepeatDelay(){ return this.repeatDelay; }

    @Override
    public AttenuationType getAttenuationType()
    {
        return AttenuationType.LINEAR;
    }

Link to comment
Share on other sites

  • 1 year later...

Don't hijack old threads. Make your own.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Also I have method for add thirst by pushing the keybord button. public boolean handle(Supplier<NetworkEvent.Context> supplier) { NetworkEvent.Context context = supplier.get(); context.enqueueWork(() -> { ServerPlayer player = context.getSender(); ServerLevel level = player.getLevel(); if(hasWaterAroundThem(player, level, 2)) { player.sendSystemMessage(Component.translatable(MESSAGE_DRINK_WATER).withStyle(ChatFormatting.DARK_AQUA)); level.playSound(null, player.getOnPos(), SoundEvents.GENERIC_DRINK, SoundSource.PLAYERS, 0.5F, level.random.nextFloat() * 0.1F + 0.9F); player.getCapability(PlayerThirstProvider.PLAYER_THIRST).ifPresent(thirst -> { thirst.addThirst(1); player.sendSystemMessage(Component.literal("Current Thirst " + thirst.getThirst()) .withStyle(ChatFormatting.AQUA)); ModMessages.sendToPlayer(new ThirstDataSyncS2CPacket(thirst.getThirst()), player); }); } else { player.sendSystemMessage(Component.translatable(MESSAGE_NO_WATER).withStyle(ChatFormatting.RED)); player.getCapability(PlayerThirstProvider.PLAYER_THIRST).ifPresent(thirst -> { player.sendSystemMessage(Component.literal("Current Thirst " + thirst.getThirst()) .withStyle(ChatFormatting.AQUA)); ModMessages.sendToPlayer(new ThirstDataSyncS2CPacket(thirst.getThirst()), player); }); } }); return true; } Maybe that can be made in this method?
    • Crash report.   ---- Minecraft Crash Report ---- // I bet Cylons wouldn't have this problem. Time: 10/5/22, 2:58 AM Description: Exception in server tick loop java.lang.NoSuchMethodError: 'void net.minecraft.server.level.DistanceManager.addRegionTicket(net.minecraft.server.level.TicketType, net.minecraft.world.level.ChunkPos, int, java.lang.Object, boolean)'     at net.minecraft.server.level.ServerChunkCache.addRegionTicket(ServerChunkCache.java:429) ~[client-1.18.2-20220404.173914-srg.jar%2381!/:?] {re:classloading,pl:accesstransformer:B}     at net.minecraft.server.level.ServerChunkCache.m_8387_(ServerChunkCache.java:425) ~[client-1.18.2-20220404.173914-srg.jar%2381!/:?] {re:classloading,pl:accesstransformer:B}     at net.minecraft.server.MinecraftServer.m_129940_(MinecraftServer.java:471) ~[client-1.18.2-20220404.173914-srg.jar%2381!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:APP:byg.mixins.json:access.MinecraftServerAccess,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_130006_(MinecraftServer.java:318) ~[client-1.18.2-20220404.173914-srg.jar%2381!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:APP:byg.mixins.json:access.MinecraftServerAccess,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at net.minecraft.client.server.IntegratedServer.m_7038_(IntegratedServer.java:84) ~[client-1.18.2-20220404.173914-srg.jar%2381!/:?] {re:classloading,xf:OptiFine:default}     at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:661) ~[client-1.18.2-20220404.173914-srg.jar%2381!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:APP:byg.mixins.json:access.MinecraftServerAccess,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_177918_(MinecraftServer.java:261) ~[client-1.18.2-20220404.173914-srg.jar%2381!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:APP:byg.mixins.json:access.MinecraftServerAccess,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at java.lang.Thread.run(Thread.java:833) [?:?] {re:mixin} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details:     Minecraft Version: 1.18.2     Minecraft Version ID: 1.18.2     Operating System: Windows 10 (amd64) version 10.0     Java Version: 17.0.1, Microsoft     Java VM Version: OpenJDK 64-Bit Server VM (mixed mode), Microsoft     Memory: 888081408 bytes (846 MiB) / 2126512128 bytes (2028 MiB) up to 4294967296 bytes (4096 MiB)     CPUs: 8     Processor Vendor: GenuineIntel     Processor Name: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz     Identifier: Intel64 Family 6 Model 158 Stepping 13     Microarchitecture: Coffee Lake     Frequency (GHz): 3.60     Number of physical packages: 1     Number of physical CPUs: 8     Number of logical CPUs: 8     Graphics card #0 name: NVIDIA GeForce RTX 2060 SUPER     Graphics card #0 vendor: NVIDIA (0x10de)     Graphics card #0 VRAM (MB): 4095.00     Graphics card #0 deviceId: 0x1f06     Graphics card #0 versionInfo: DriverVersion=31.0.15.1748     Memory slot #0 capacity (MB): 8192.00     Memory slot #0 clockSpeed (GHz): 2.13     Memory slot #0 type: DDR4     Memory slot #1 capacity (MB): 8192.00     Memory slot #1 clockSpeed (GHz): 2.13     Memory slot #1 type: DDR4     Virtual memory max (MB): 20267.54     Virtual memory used (MB): 10935.73     Swap memory total (MB): 3968.00     Swap memory used (MB): 13.47     JVM Flags: 4 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xss1M -Xmx4096m -Xms256m     Server Running: true     Player Count: 0 / 8; []     Data Packs: vanilla, mod:terrablender (incompatible), mod:swingthroughgrass (incompatible), mod:humancompanions (incompatible), mod:mobz (incompatible), mod:creativecore (incompatible), mod:trolls, mod:jei (incompatible), mod:yungsbridges, mod:kingvillager, mod:kobolds, mod:waystones (incompatible), mod:epicfight, mod:enhancedvisuals (incompatible), mod:yungsextras, mod:zombieawareness (incompatible), mod:yungsapi, mod:betterthirdperson (incompatible), mod:magistuarmory, mod:guardvillagers (incompatible), mod:coroutil (incompatible), mod:balm (incompatible), mod:enhancedcelestials (incompatible), mod:byg (incompatible), mod:cameraoverhaul (incompatible), mod:cloth_config (incompatible), mod:forge, mod:travelerstitles, mod:dsurround     World Generation: Stable     Type: Integrated Server (map_client.txt)     Is Modded: Definitely; Client brand changed to 'forge'; Server brand changed to 'forge'     OptiFine Version: OptiFine_1.18.2_HD_U_H7     OptiFine Build: 20220410-185216     Render Distance Chunks: 8     Mipmaps: 4     Anisotropic Filtering: 1     Antialiasing: 0     Multitexture: false     Shaders: null     OpenGlVersion: 3.2.0 NVIDIA 517.48     OpenGlRenderer: NVIDIA GeForce RTX 2060 SUPER/PCIe/SSE2     OpenGlVendor: NVIDIA Corporation     CpuCount: 8     ModLauncher: 9.1.3+9.1.3+main.9b69c82a     ModLauncher launch target: forgeclient     ModLauncher naming: srg     ModLauncher services:          mixin PLUGINSERVICE          eventbus PLUGINSERVICE          slf4jfixer PLUGINSERVICE          object_holder_definalize PLUGINSERVICE          runtime_enum_extender PLUGINSERVICE          capability_token_subclass PLUGINSERVICE          accesstransformer PLUGINSERVICE          runtimedistcleaner PLUGINSERVICE          mixin TRANSFORMATIONSERVICE          OptiFine TRANSFORMATIONSERVICE          fml TRANSFORMATIONSERVICE     FML Language Providers:         minecraft@1.0         lowcodefml@null         javafml@null     Mod List:         client-1.18.2-20220404.173914-srg.jar             |Minecraft                     |minecraft                     |1.18.2              |DONE      |Manifest: a1:d4:5e:04:4f:d3:d6:e0:7b:37:97:cf:77:b0:de:ad:4a:47:ce:8c:96:49:5f:0a:cf:8c:ae:b2:6d:4b:8a:3f         TerraBlender-forge-1.18.2-1.2.0.126.jar           |TerraBlender                  |terrablender                  |1.2.0.126           |DONE      |Manifest: NOSIGNATURE         swingthroughgrass-1.18.2-1.9.0.jar                |SwingThroughGrass             |swingthroughgrass             |1.18.2-1.9.0        |DONE      |Manifest: NOSIGNATURE         humancompanions-1.18.2-1.4.7.jar                  |Human Companions              |humancompanions               |1.18.2-1.4.7        |DONE      |Manifest: NOSIGNATURE         mobz-3.3.4-forge.jar                              |MobZ                          |mobz                          |3.3.4               |DONE      |Manifest: NOSIGNATURE         CreativeCore_FORGE_v2.6.15_mc1.18.2.jar           |CreativeCore                  |creativecore                  |0.0NONE             |DONE      |Manifest: NOSIGNATURE         trolls-0.3.jar                                    |trolls                        |trolls                        |1.0.0               |DONE      |Manifest: NOSIGNATURE         jei-1.18.2-9.7.1.255.jar                          |Just Enough Items             |jei                           |9.7.1.255           |DONE      |Manifest: NOSIGNATURE         YungsBridges-1.18.2-Forge-2.1.0.jar               |YUNG's Bridges                |yungsbridges                  |1.18.2-Forge-2.1.0  |DONE      |Manifest: NOSIGNATURE         kingvillager-1.10.jar                             |The King of the Village       |kingvillager                  |1.10                |DONE      |Manifest: NOSIGNATURE         Kobolds-2.1.0.jar                                 |Kobolds                       |kobolds                       |2.1.0               |DONE      |Manifest: NOSIGNATURE         waystones-forge-1.18.2-10.1.0.jar                 |Waystones                     |waystones                     |10.1.0              |DONE      |Manifest: NOSIGNATURE         EpicFight-18.3.6.jar                              |Epic Fight                    |epicfight                     |18.3.6              |DONE      |Manifest: NOSIGNATURE         EnhancedVisuals_FORGE_v1.5.5_mc1.18.2.jar         |EnhancedVisuals               |enhancedvisuals               |1.5.5               |DONE      |Manifest: NOSIGNATURE         YungsExtras-1.18.2-Forge-2.1.0.jar                |YUNG's Extras                 |yungsextras                   |1.18.2-Forge-2.1.0  |DONE      |Manifest: NOSIGNATURE         zombieawareness-1.18.1-1.12.3.jar                 |Zombie Awareness              |zombieawareness               |1.18.1-1.12.3       |DONE      |Manifest: NOSIGNATURE         YungsApi-1.18.2-Forge-2.0.8.jar                   |YUNG's API                    |yungsapi                      |1.18.2-Forge-2.0.8  |DONE      |Manifest: NOSIGNATURE         BetterThirdPerson-Forge-1.18.2-1.8.1.jar          |Better Third Person           |betterthirdperson             |1.8.1               |DONE      |Manifest: NOSIGNATURE         [1.18.x]-Epic-Knights-Armor-and-Weapons-6.6v.jar  |Epic Knights: Armor and Weapon|magistuarmory                 |1.0                 |DONE      |Manifest: NOSIGNATURE         guardvillagers-1.18.2.1.4.3.jar                   |Guard Villagers               |guardvillagers                |1.4.3               |DONE      |Manifest: NOSIGNATURE         coroutil-1.18.1-1.2.38.jar                        |CoroUtil                      |coroutil                      |1.18.1-1.2.38       |DONE      |Manifest: NOSIGNATURE         balm-3.2.0+0.jar                                  |Balm                          |balm                          |3.2.0+0             |DONE      |Manifest: NOSIGNATURE         Enhanced_Celestials-forge-1.18.2-2.0.7.jar        |Enhanced Celestials           |enhancedcelestials            |2.0.7               |DONE      |Manifest: NOSIGNATURE         Oh_The_Biomes_You'll_Go-forge-1.18.2-1.4.4.jar    |Oh The Biomes You'll Go       |byg                           |1.4                 |DONE      |Manifest: NOSIGNATURE         cameraoverhaul-1.0-1.18.2.jar                     |Camera Overhaul               |cameraoverhaul                |1.0.0               |DONE      |Manifest: NOSIGNATURE         cloth-config-6.4.90-forge.jar                     |Cloth Config v4 API           |cloth_config                  |6.4.90              |DONE      |Manifest: NOSIGNATURE         forge-1.18.2-40.1.80-universal.jar                |Forge                         |forge                         |40.1.80             |DONE      |Manifest: 84:ce:76:e8:45:35:e4:0e:63:86:df:47:59:80:0f:67:6c:c1:5f:6e:5f:4d:b3:54:47:1a:9f:7f:ed:5e:f2:90         TravelersTitles-1.18.2-Forge-2.1.1.jar            |Traveler's Titles             |travelerstitles               |1.18.2-Forge-2.1.1  |DONE      |Manifest: NOSIGNATURE         DynamicSurroundings-5.0.0.4.jar                   |§3Dynamic Surroundings: Resurr|dsurround                     |5.0.0.4             |DONE      |Manifest: NOSIGNATURE     Crash Report UUID: 2bc32199-3d7c-43e8-84ef-530961eda183     FML: 40.1     Forge: net.minecraftforge:40.1.80
    • I have attached capability.  @SubscribeEvent public static void OnAttachCapabilitiesPlayer(AttachCapabilitiesEvent<Entity> event) { if(event.getObject() instanceof Player) { if(!event.getObject().getCapability(PlayerThirstProvider.PLAYER_THIRST).isPresent()) { event.addCapability(new ResourceLocation(HardLife.MODID, "properties"), new PlayerThirstProvider()); } } } This capability working, but I can't understand how to add thirst points via using items such food or bottle of water.
    • I'm currently playing through Harmonious Engineering 3 with a couple of extra mods installed. Today when I was playing, I suddenly realized I couldn't mine, at all. It's been a little while since the last time I was mining as I'd just been crafting components for machines so I've no idea when it started.  However I can't find a solution. It's like the game doesn't recognize any pickaxe as a pickaxe? Like a drill item worked, but nothing else has been able to mine stone. Dirt is fine, wood is fine, but anything meant for pickaxes is like mining with a open hand, it doesn't even drop. Please let me know how to fix this.
    • Hey, I'm having the exact same issue! Grass, wood, dirt anything not meant for pickaxes works fine. But all pickaxes are just duds. Have you found a solution? What mods do you have?
  • Topics

×
×
  • Create New...

Important Information

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