Jump to content

Recommended Posts

Posted (edited)

Does anyone know a way to detect if a certain sound is being played that will work on a server? When googling it the only thing I found was a liteloader AutoFish mod that mentioned sound-based detection in its forum.

 

Edit: Since they have added Subtitles (I don't know when though, I don't remember seeing them haha) could you use code similar to the subtitles to detect what sound is being played?

Edited by Ceras
Posted

I don't think I explained it properly, sorry. What I meant was the mod will work on a server or in SP, but the sound detection only has to be for the client-side. If that explained it any better I actually don't know .-.

Posted

Not to sound like Im a new at Java, since Im not but it has been a year since I did anything in it, and then it was Spigot plugins not modding. Anyway, how do I access the SoundManager::playingSounds? I feel like the :: is a Java 8 operator, right? If it is then I haven't done much in Java 8 either..

Posted

Hi so I started using the playingSounds, I am using access transformers to change it from a private final to a public, I chose this method since I've never used reflection and apparently ATs are faster. If you think reflection would work better here then I'll look into that. Anyway after setting up the AT for playingSounds I started using it, however everything I've done to use it ends up returning "Cannot make a static reference to the non-static field SoundManager.playingSounds" however I am not calling it from a static method... 
 

Detection Systems:

package net.ceras.minecraft.detection;

import java.util.Map;

import net.minecraft.client.audio.ISound;
import net.minecraft.client.audio.SoundManager;

public class DetectionSystems {
    public boolean soundBasedDetection() {
		Map<String, ISound> playingSounds = SoundManager.playingSounds;
		
    }
}

 

SoundManager:

package net.minecraft.client.audio;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import io.netty.util.internal.ThreadLocalRandom;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import paulscode.sound.SoundSystem;
import paulscode.sound.SoundSystemConfig;
import paulscode.sound.SoundSystemException;
import paulscode.sound.SoundSystemLogger;
import paulscode.sound.Source;
import paulscode.sound.codecs.CodecJOrbis;
import paulscode.sound.libraries.LibraryLWJGLOpenAL;

@SideOnly(Side.CLIENT)
public class SoundManager
{
    /** The marker used for logging */
    private static final Marker LOG_MARKER = MarkerManager.getMarker("SOUNDS");
    private static final Logger LOGGER = LogManager.getLogger();
    private static final Set<ResourceLocation> UNABLE_TO_PLAY = Sets.<ResourceLocation>newHashSet();
    /** A reference to the sound handler. */
    public final SoundHandler sndHandler;
    /** Reference to the GameSettings object. */
    private final GameSettings options;
    /** A reference to the sound system. */
    private SoundManager.SoundSystemStarterThread sndSystem;
    /** Set to true when the SoundManager has been initialised. */
    private boolean loaded;
    /** A counter for how long the sound manager has been running */
    private int playTime;
    public Map<String, ISound> playingSounds = HashBiMap.<String, ISound>create();
    private final Map<ISound, String> invPlayingSounds;
    private final Multimap<SoundCategory, String> categorySounds;
    private final List<ITickableSound> tickableSounds;
    private final Map<ISound, Integer> delayedSounds;
    private final Map<String, Integer> playingSoundsStopTime;
    private final List<ISoundEventListener> listeners;
    private final List<String> pausedChannels;

    public SoundManager(SoundHandler p_i45119_1_, GameSettings p_i45119_2_)
    {
        this.invPlayingSounds = ((BiMap)this.playingSounds).inverse();
        this.categorySounds = HashMultimap.<SoundCategory, String>create();
        this.tickableSounds = Lists.<ITickableSound>newArrayList();
        this.delayedSounds = Maps.<ISound, Integer>newHashMap();
        this.playingSoundsStopTime = Maps.<String, Integer>newHashMap();
        this.listeners = Lists.<ISoundEventListener>newArrayList();
        this.pausedChannels = Lists.<String>newArrayList();
        this.sndHandler = p_i45119_1_;
        this.options = p_i45119_2_;

        try
        {
            SoundSystemConfig.addLibrary(LibraryLWJGLOpenAL.class);
            SoundSystemConfig.setCodec("ogg", CodecJOrbis.class);
            net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.sound.SoundSetupEvent(this));
        }
        catch (SoundSystemException soundsystemexception)
        {
            LOGGER.error(LOG_MARKER, (String)"Error linking with the LibraryJavaSound plug-in", (Throwable)soundsystemexception);
        }
    }

    public void reloadSoundSystem()
    {
        UNABLE_TO_PLAY.clear();

        for (SoundEvent soundevent : SoundEvent.REGISTRY)
        {
            ResourceLocation resourcelocation = soundevent.getSoundName();

            if (this.sndHandler.getAccessor(resourcelocation) == null)
            {
                LOGGER.warn("Missing sound for event: {}", new Object[] {SoundEvent.REGISTRY.getNameForObject(soundevent)});
                UNABLE_TO_PLAY.add(resourcelocation);
            }
        }

        this.unloadSoundSystem();
        this.loadSoundSystem();
        net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.sound.SoundLoadEvent(this));
    }

    /**
     * Tries to add the paulscode library and the relevant codecs. If it fails, the master volume  will be set to zero.
     */
    private synchronized void loadSoundSystem()
    {
        if (!this.loaded)
        {
            try
            {
                (new Thread(new Runnable()
                {
                    public void run()
                    {
                        SoundSystemConfig.setLogger(new SoundSystemLogger()
                        {
                            public void message(String p_message_1_, int p_message_2_)
                            {
                                if (!p_message_1_.isEmpty())
                                {
                                    SoundManager.LOGGER.info(p_message_1_);
                                }
                            }
                            public void importantMessage(String p_importantMessage_1_, int p_importantMessage_2_)
                            {
                                if (!p_importantMessage_1_.isEmpty())
                                {
                                    SoundManager.LOGGER.warn(p_importantMessage_1_);
                                }
                            }
                            public void errorMessage(String p_errorMessage_1_, String p_errorMessage_2_, int p_errorMessage_3_)
                            {
                                if (!p_errorMessage_2_.isEmpty())
                                {
                                    SoundManager.LOGGER.error("Error in class \'{}\'", new Object[] {p_errorMessage_1_});
                                    SoundManager.LOGGER.error(p_errorMessage_2_);
                                }
                            }
                        });
                        SoundManager.this.sndSystem = SoundManager.this.new SoundSystemStarterThread();
                        SoundManager.this.loaded = true;
                        SoundManager.this.sndSystem.setMasterVolume(SoundManager.this.options.getSoundLevel(SoundCategory.MASTER));
                        SoundManager.LOGGER.info(SoundManager.LOG_MARKER, "Sound engine started");
                    }
                }, "Sound Library Loader")).start();
            }
            catch (RuntimeException runtimeexception)
            {
                LOGGER.error(LOG_MARKER, (String)"Error starting SoundSystem. Turning off sounds & music", (Throwable)runtimeexception);
                this.options.setSoundLevel(SoundCategory.MASTER, 0.0F);
                this.options.saveOptions();
            }
        }
    }

    private float getVolume(SoundCategory category)
    {
        return category != null && category != SoundCategory.MASTER ? this.options.getSoundLevel(category) : 1.0F;
    }

    public void setVolume(SoundCategory category, float volume)
    {
        if (this.loaded)
        {
            if (category == SoundCategory.MASTER)
            {
                this.sndSystem.setMasterVolume(volume);
            }
            else
            {
                for (String s : this.categorySounds.get(category))
                {
                    ISound isound = (ISound)this.playingSounds.get(s);
                    float f = this.getClampedVolume(isound);

                    if (f <= 0.0F)
                    {
                        this.stopSound(isound);
                    }
                    else
                    {
                        this.sndSystem.setVolume(s, f);
                    }
                }
            }
        }
    }

    /**
     * Cleans up the Sound System
     */
    public void unloadSoundSystem()
    {
        if (this.loaded)
        {
            this.stopAllSounds();
            this.sndSystem.cleanup();
            this.loaded = false;
        }
    }

    /**
     * Stops all currently playing sounds
     */
    public void stopAllSounds()
    {
        if (this.loaded)
        {
            for (String s : this.playingSounds.keySet())
            {
                this.sndSystem.stop(s);
            }

            this.pausedChannels.clear(); //Forge: MC-35856 Fixed paused sounds repeating when switching worlds
            this.playingSounds.clear();
            this.delayedSounds.clear();
            this.tickableSounds.clear();
            this.categorySounds.clear();
            this.playingSoundsStopTime.clear();
        }
    }

    public void addListener(ISoundEventListener listener)
    {
        this.listeners.add(listener);
    }

    public void removeListener(ISoundEventListener listener)
    {
        this.listeners.remove(listener);
    }

    public void updateAllSounds()
    {
        ++this.playTime;

        for (ITickableSound itickablesound : this.tickableSounds)
        {
            itickablesound.update();

            if (itickablesound.isDonePlaying())
            {
                this.stopSound(itickablesound);
            }
            else
            {
                String s = (String)this.invPlayingSounds.get(itickablesound);
                this.sndSystem.setVolume(s, this.getClampedVolume(itickablesound));
                this.sndSystem.setPitch(s, this.getClampedPitch(itickablesound));
                this.sndSystem.setPosition(s, itickablesound.getXPosF(), itickablesound.getYPosF(), itickablesound.getZPosF());
            }
        }

        Iterator<Entry<String, ISound>> iterator = this.playingSounds.entrySet().iterator();

        while (iterator.hasNext())
        {
            Entry<String, ISound> entry = (Entry)iterator.next();
            String s1 = (String)entry.getKey();
            ISound isound = (ISound)entry.getValue();

            if (!this.sndSystem.playing(s1))
            {
                int i = ((Integer)this.playingSoundsStopTime.get(s1)).intValue();

                if (i <= this.playTime)
                {
                    int j = isound.getRepeatDelay();

                    if (isound.canRepeat() && j > 0)
                    {
                        this.delayedSounds.put(isound, Integer.valueOf(this.playTime + j));
                    }

                    iterator.remove();
                    LOGGER.debug(LOG_MARKER, "Removed channel {} because it\'s not playing anymore", new Object[] {s1});
                    this.sndSystem.removeSource(s1);
                    this.playingSoundsStopTime.remove(s1);

                    try
                    {
                        this.categorySounds.remove(isound.getCategory(), s1);
                    }
                    catch (RuntimeException var8)
                    {
                        ;
                    }

                    if (isound instanceof ITickableSound)
                    {
                        this.tickableSounds.remove(isound);
                    }
                }
            }
        }

        Iterator<Entry<ISound, Integer>> iterator1 = this.delayedSounds.entrySet().iterator();

        while (iterator1.hasNext())
        {
            Entry<ISound, Integer> entry1 = (Entry)iterator1.next();

            if (this.playTime >= ((Integer)entry1.getValue()).intValue())
            {
                ISound isound1 = (ISound)entry1.getKey();

                if (isound1 instanceof ITickableSound)
                {
                    ((ITickableSound)isound1).update();
                }

                this.playSound(isound1);
                iterator1.remove();
            }
        }
    }

    /**
     * Returns true if the sound is playing or still within time
     */
    public boolean isSoundPlaying(ISound sound)
    {
        if (!this.loaded)
        {
            return false;
        }
        else
        {
            String s = (String)this.invPlayingSounds.get(sound);
            return s == null ? false : this.sndSystem.playing(s) || this.playingSoundsStopTime.containsKey(s) && ((Integer)this.playingSoundsStopTime.get(s)).intValue() <= this.playTime;
        }
    }

    public void stopSound(ISound sound)
    {
        if (this.loaded)
        {
            String s = (String)this.invPlayingSounds.get(sound);

            if (s != null)
            {
                this.sndSystem.stop(s);
            }
        }
    }

    public void playSound(ISound p_sound)
    {
        if (this.loaded)
        {
            p_sound = net.minecraftforge.client.ForgeHooksClient.playSound(this, p_sound);
            if (p_sound == null) return;

            SoundEventAccessor soundeventaccessor = p_sound.createAccessor(this.sndHandler);
            ResourceLocation resourcelocation = p_sound.getSoundLocation();

            if (soundeventaccessor == null)
            {
                if (UNABLE_TO_PLAY.add(resourcelocation))
                {
                    LOGGER.warn(LOG_MARKER, "Unable to play unknown soundEvent: {}", new Object[] {resourcelocation});
                }
            }
            else
            {
                if (!this.listeners.isEmpty())
                {
                    for (ISoundEventListener isoundeventlistener : this.listeners)
                    {
                        isoundeventlistener.soundPlay(p_sound, soundeventaccessor);
                    }
                }

                if (this.sndSystem.getMasterVolume() <= 0.0F)
                {
                    LOGGER.debug(LOG_MARKER, "Skipped playing soundEvent: {}, master volume was zero", new Object[] {resourcelocation});
                }
                else
                {
                    Sound sound = p_sound.getSound();

                    if (sound == SoundHandler.MISSING_SOUND)
                    {
                        if (UNABLE_TO_PLAY.add(resourcelocation))
                        {
                            LOGGER.warn(LOG_MARKER, "Unable to play empty soundEvent: {}", new Object[] {resourcelocation});
                        }
                    }
                    else
                    {
                        float f3 = p_sound.getVolume();
                        float f = 16.0F;

                        if (f3 > 1.0F)
                        {
                            f *= f3;
                        }

                        SoundCategory soundcategory = p_sound.getCategory();
                        float f1 = this.getClampedVolume(p_sound);
                        float f2 = this.getClampedPitch(p_sound);

                        if (f1 == 0.0F)
                        {
                            LOGGER.debug(LOG_MARKER, "Skipped playing sound {}, volume was zero.", new Object[] {sound.getSoundLocation()});
                        }
                        else
                        {
                            boolean flag = p_sound.canRepeat() && p_sound.getRepeatDelay() == 0;
                            String s = MathHelper.getRandomUUID(ThreadLocalRandom.current()).toString();
                            ResourceLocation resourcelocation1 = sound.getSoundAsOggLocation();

                            if (sound.isStreaming())
                            {
                                this.sndSystem.newStreamingSource(false, s, getURLForSoundResource(resourcelocation1), resourcelocation1.toString(), flag, p_sound.getXPosF(), p_sound.getYPosF(), p_sound.getZPosF(), p_sound.getAttenuationType().getTypeInt(), f);
                                net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.sound.PlayStreamingSourceEvent(this, p_sound, s));
                            }
                            else
                            {
                                this.sndSystem.newSource(false, s, getURLForSoundResource(resourcelocation1), resourcelocation1.toString(), flag, p_sound.getXPosF(), p_sound.getYPosF(), p_sound.getZPosF(), p_sound.getAttenuationType().getTypeInt(), f);
                                net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.sound.PlaySoundSourceEvent(this, p_sound, s));
                            }

                            LOGGER.debug(LOG_MARKER, "Playing sound {} for event {} as channel {}", new Object[] {sound.getSoundLocation(), resourcelocation, s});
                            this.sndSystem.setPitch(s, f2);
                            this.sndSystem.setVolume(s, f1);
                            this.sndSystem.play(s);
                            this.playingSoundsStopTime.put(s, Integer.valueOf(this.playTime + 20));
                            this.playingSounds.put(s, p_sound);
                            this.categorySounds.put(soundcategory, s);

                            if (p_sound instanceof ITickableSound)
                            {
                                this.tickableSounds.add((ITickableSound)p_sound);
                            }
                        }
                    }
                }
            }
        }
    }

    private float getClampedPitch(ISound soundIn)
    {
        return MathHelper.clamp(soundIn.getPitch(), 0.5F, 2.0F);
    }

    private float getClampedVolume(ISound soundIn)
    {
        return MathHelper.clamp(soundIn.getVolume() * this.getVolume(soundIn.getCategory()), 0.0F, 1.0F);
    }

    /**
     * Pauses all currently playing sounds
     */
    public void pauseAllSounds()
    {
        for (Entry<String, ISound> entry : this.playingSounds.entrySet())
        {
            String s = (String)entry.getKey();
            boolean flag = this.isSoundPlaying((ISound)entry.getValue());

            if (flag)
            {
                LOGGER.debug(LOG_MARKER, "Pausing channel {}", new Object[] {s});
                this.sndSystem.pause(s);
                this.pausedChannels.add(s);
            }
        }
    }

    /**
     * Resumes playing all currently playing sounds (after pauseAllSounds)
     */
    public void resumeAllSounds()
    {
        for (String s : this.pausedChannels)
        {
            LOGGER.debug(LOG_MARKER, "Resuming channel {}", new Object[] {s});
            this.sndSystem.play(s);
        }

        this.pausedChannels.clear();
    }

    /**
     * Adds a sound to play in n tick
     */
    public void playDelayedSound(ISound sound, int delay)
    {
        this.delayedSounds.put(sound, Integer.valueOf(this.playTime + delay));
    }

    private static URL getURLForSoundResource(final ResourceLocation p_148612_0_)
    {
        String s = String.format("%s:%s:%s", new Object[] {"mcsounddomain", p_148612_0_.getResourceDomain(), p_148612_0_.getResourcePath()});
        URLStreamHandler urlstreamhandler = new URLStreamHandler()
        {
            protected URLConnection openConnection(final URL p_openConnection_1_)
            {
                return new URLConnection(p_openConnection_1_)
                {
                    public void connect() throws IOException
                    {
                    }
                    public InputStream getInputStream() throws IOException
                    {
                        return Minecraft.getMinecraft().getResourceManager().getResource(p_148612_0_).getInputStream();
                    }
                };
            }
        };

        try
        {
            return new URL((URL)null, s, urlstreamhandler);
        }
        catch (MalformedURLException var4)
        {
            throw new Error("TODO: Sanely handle url exception! :D");
        }
    }

    /**
     * Sets the listener of sounds
     */
    public void setListener(EntityPlayer player, float p_148615_2_)
    {
        if (this.loaded && player != null)
        {
            float f = player.prevRotationPitch + (player.rotationPitch - player.prevRotationPitch) * p_148615_2_;
            float f1 = player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * p_148615_2_;
            double d0 = player.prevPosX + (player.posX - player.prevPosX) * (double)p_148615_2_;
            double d1 = player.prevPosY + (player.posY - player.prevPosY) * (double)p_148615_2_ + (double)player.getEyeHeight();
            double d2 = player.prevPosZ + (player.posZ - player.prevPosZ) * (double)p_148615_2_;
            float f2 = MathHelper.cos((f1 + 90.0F) * 0.017453292F);
            float f3 = MathHelper.sin((f1 + 90.0F) * 0.017453292F);
            float f4 = MathHelper.cos(-f * 0.017453292F);
            float f5 = MathHelper.sin(-f * 0.017453292F);
            float f6 = MathHelper.cos((-f + 90.0F) * 0.017453292F);
            float f7 = MathHelper.sin((-f + 90.0F) * 0.017453292F);
            float f8 = f2 * f4;
            float f9 = f3 * f4;
            float f10 = f2 * f6;
            float f11 = f3 * f6;
            this.sndSystem.setListenerPosition((float)d0, (float)d1, (float)d2);
            this.sndSystem.setListenerOrientation(f8, f5, f9, f10, f7, f11);
        }
    }

    public void stop(String p_189567_1_, SoundCategory p_189567_2_)
    {
        if (p_189567_2_ != null)
        {
            for (String s : this.categorySounds.get(p_189567_2_))
            {
                ISound isound = (ISound)this.playingSounds.get(s);

                if (p_189567_1_.isEmpty())
                {
                    this.stopSound(isound);
                }
                else if (isound.getSoundLocation().equals(new ResourceLocation(p_189567_1_)))
                {
                    this.stopSound(isound);
                }
            }
        }
        else if (p_189567_1_.isEmpty())
        {
            this.stopAllSounds();
        }
        else
        {
            for (ISound isound1 : this.playingSounds.values())
            {
                if (isound1.getSoundLocation().equals(new ResourceLocation(p_189567_1_)))
                {
                    this.stopSound(isound1);
                }
            }
        }
    }

    @SideOnly(Side.CLIENT)
    class SoundSystemStarterThread extends SoundSystem
    {
        private SoundSystemStarterThread()
        {
        }

        public boolean playing(String p_playing_1_)
        {
            synchronized (SoundSystemConfig.THREAD_SYNC)
            {
                if (this.soundLibrary == null)
                {
                    return false;
                }
                else
                {
                    Source source = (Source)this.soundLibrary.getSources().get(p_playing_1_);
                    return source == null ? false : source.playing() || source.paused() || source.preLoad;
                }
            }
        }
    }
}

 

Posted
  On 3/1/2017 at 10:37 AM, Ceras said:

Hi so I started using the playingSounds, I am using access transformers to change it from a private final to a public, I chose this method since I've never used reflection and apparently ATs are faster. If you think reflection would work better here then I'll look into that. Anyway after setting up the AT for playingSounds I started using it, however everything I've done to use it ends up returning "Cannot make a static reference to the non-static field SoundManager.playingSounds" however I am not calling it from a static method... 
 

Detection Systems:

package net.ceras.minecraft.detection;

import java.util.Map;

import net.minecraft.client.audio.ISound;
import net.minecraft.client.audio.SoundManager;

public class DetectionSystems {
    public boolean soundBasedDetection() {
		Map<String, ISound> playingSounds = SoundManager.playingSounds;
		
    }
}
Expand  

 

 

You're trying to access the field through the class (SoundManager) rather than an instance of it (the one stored in the private SoundHandler#sndManager field, you can use Minecraft#getSoundHandler to get the SoundHandler instance). It's not a static field, so you can't do this.

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
  On 3/1/2017 at 10:43 AM, Choonster said:

 

 

You're trying to access the field through the class (SoundManager) rather than an instance of it (the one stored in the private SoundHandler#sndManager field, you can use Minecraft#getSoundHandler to get the SoundHandler instance). It's not a static field, so you can't do this.

Expand  
 

Ok so now I have getSoundHandler() however the sndManager is private and before going and getting all the AT stuff for it I want to make sure that it would be right to unprivate that? Or am I missing something still since I can't see another way through to the sndManager or playingSounds?

Posted (edited)
  On 3/1/2017 at 10:56 AM, Ceras said:

Ok so now I have getSoundHandler() however the sndManager is private and before going and getting all the AT stuff for it I want to make sure that it would be right to unprivate that? Or am I missing something still since I can't see another way through to the sndManager or playingSounds?

Expand  

 

You'd need to use an AT or reflection to access the field, yes. I'd personally recommend using reflection to avoid modifying the vanilla code, but either method should work.

 

Another way to gain access to the SoundManager instance without ATs/reflection is by subscribing to SoundSetupEvent and storing the instance. This is probably the best option.

Edited by Choonster

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

Hi, so I've setup the code now to access sndManager and pull the playingSounds map, however I don't know how this is going to help with what the original post was about since all it returns is: 
 

  Reveal hidden contents
 

The above is, of course a bite-sized version of what I received, the original post was about detecting certain sounds and I did a quick test a few times in a row to see if I could get the same results while playing a sound, however, nothing seemed to repeat after it had finished once (even though I didn't expect it to work) any ideas...?

Posted

SoundManager#playingSounds is a Map with String keys and ISound values. Printing it to the log won't help you much, since PositionedSoundRecord (an ISound implementation) doesn't override Object#toString to provide custom output.

 

The ISound#getSoundLocation returns the name of the SoundEvent that the ISound represents, this is the smae name that's returned by SoundEvent#getSoundName,

 

What exactly are you trying to do? Are you trying to take an action when a sound starts playing, or are you trying to detect whether a sound is playing at an arbitrary point in time?

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

 

  On 2/27/2017 at 9:59 PM, Ceras said:

I don't think I explained it properly, sorry. What I meant was the mod will work on a server or in SP, but the sound detection only has to be for the client-side. If that explained it any better I actually don't know .-.

Expand  

It seems he is wondering about Side.CLIENT and Side.SERVER.  A stab in the dark, but maybe he is having an issue with his mod being installed server side and trying to access client side only logic.

Posted
  On 3/1/2017 at 2:39 PM, Choonster said:

SoundManager#playingSounds is a Map with String keys and ISound values. Printing it to the log won't help you much, since PositionedSoundRecord (an ISound implementation) doesn't override Object#toString to provide custom output.

 

The ISound#getSoundLocation returns the name of the SoundEvent that the ISound represents, this is the smae name that's returned by SoundEvent#getSoundName,

 

What exactly are you trying to do? Are you trying to take an action when a sound starts playing, or are you trying to detect whether a sound is playing at an arbitrary point in time?

Expand  
2

I am trying to detect when a sound is playing at an arbitrary point in time.
 

  On 3/1/2017 at 2:45 PM, OreCruncher said:

 

It seems he is wondering about Side.CLIENT and Side.SERVER.  A stab in the dark, but maybe he is having an issue with his mod being installed server side and trying to access client side only logic.

Expand  
 

Yes I am trying to access client side only logic, since the server side will never have a use for it

Posted
  On 3/1/2017 at 3:02 PM, Ceras said:

I am trying to detect when a sound is playing at an arbitrary point in time.

Expand  

To what end, though?  The reason it is being asked is that the more detail/requirements that we have about the problem you are trying to solve the better we can answer your question.

Posted
  On 3/1/2017 at 3:02 PM, Ceras said:

I am trying to detect when a sound is playing at an arbitrary point in time.

Expand  

 

Then iterate through the values of SoundManager#playingSounds (or use a Stream) and check if any of the ISounds match the SoundEvent you're checking for.

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.

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

    • Verified user can get a $100 off Temu   Coupon code using the code ((“aci789589”)). This Temu   $100 Off code is specifically for new and existing customers both and can be redeemed to receive a $100 discount on your purchase. Our exclusive Temu   Coupon code offers a flat $100 off your purchase, plus an additional 100% discount on top of that. You can slash prices by up to $100 as a new Temu   customer using code ((“aci789589”)). Existing users can enjoy $100 off their next haul with this code. But that’s not all! With our Temu   Coupon codes for 2025, you can get up to 90% discount on select items and clearance sales. Whether you’re a new customer or an existing shopper, our Temu   codes provide extra discounts tailored just for you. Save up to 100% with these current Temu   Coupons ["^"aci789589 "^"] for April 2025. The latest Temu   coupon codes at here. New users at Temu   receive a $100 discount on orders over $100 Use the code ((“aci789589”)) during checkout to get Temu   Coupon $100 Off For New Users. You can save $100 Off your first order with the coupon code available for a limited time only. Temu   90% Off promo code ((“aci789589”)) will save you $100 on your order. To get a discount, click on the item to purchase and enter the code. Yes, Temu   offers $100 Off coupon code “aci789589” for first time users. You can get a $100 bonus plus $100 Off any purchase at Temu   with the $100 Coupon Bundle at Temu   if you sign up with the referral code ((“aci789589”)) and make a first purchase of $100 or more. Free Temu   codes $100 off — ((“aci789589”)) Temu Coupon $100 off — ((“aci789589”)) Temu Coupon 100% off — ((“aci789589”)) Temu Memorial Day Sale $100 off — ((“aci789589”)) Temu Coupon code today — ((“aci789589”)) Temu free gift code — ["^"aci789589"^"](Without inviting friends or family member) Temu Coupon code for  USA      - $100 Off— ((“aci789589”)) Temu Coupon code  USA     - $100 Off— ((“aci789589”)) Temu Coupon code USA  - $100 Off — ((“aci789589”)) Temu Coupon code Japan - $100 Off — ((“aci789589”)) Temu Coupon code Mexico - $100 Off — ((“aci789589”)) Temu Coupon code Chile - $100 Off — ((“aci789589”)) Temu Coupon code USA - $100 Off — ((“aci789589”)) Temu Coupon code Colombia - $100 Off — ((“aci789589”)) Temu Coupon code Malaysia - $100 Off — ((“aci789589”)) Temu Coupon code Philippines - $100 Off — ((“aci789589”)) Temu Coupon code South Korea - $100 Off — ((“aci789589”)) Redeem Free Temu   Coupon Code ["^"aci789589"^"] for first-time users Get a $100 discount on your Temu   order with the promo code "aci789589". You can get a discount by clicking on the item to purchase and entering this Temu   Coupon code $100 off ((“aci789589”)). Temu   New User Coupon ((“aci789589)): Up To $100 OFF For First-Time Users Our Temu   first-time user coupon codes are designed just for new customers, offering the biggest discounts and the best deals currently available on Temu  . To maximize your savings, download the Temu   app and apply our Temu   new user coupon during checkout. Temu   Coupon Codes For Existing Users ((“aci789589”)): $100 Price Slash Have you been shopping on Temu   for a while? Our Temu   Coupon for existing customers is here to reward you for your continued support, offering incredible discounts on your favorite products. Temu   Coupon For $100 Off ((“aci789589”)): Get A Flat $100 Discount On Order Value Get ready to save big with our incredible Temu   Coupon for $100 off! Our amazing Temu   $100 off coupon code will give you a flat $100 discount on your order value, making your shopping experience even more rewarding. Temu   Coupon Code For $100 Off ((“aci789589”)): For Both New And Existing Customers Our incredible Temu   Coupon code for $100 off is here to help you save big on your purchases. Whether you’re a new user or an existing customer, our $100 off code for Temu   will give you an additional discount! Temu   Coupon Bundle ((“aci789589”)): Flat $100 Off + Up To $100 Discount Get ready for an unbelievable deal with our Temu   Coupon bundle for 2025! Our Temu   Coupon bundles will give you a flat $100 discount and an additional $100 off on top of it. Free Temu   Coupons ((“aci789589”)): Unlock Unlimited Savings! Get ready to unlock a world of savings with our free Temu   Coupons! We’ve got you covered with a wide range of Temu   Coupon code options that will help you maximize your shopping experience. 100% Off Temu   Coupons, Promo Codes + 25% Cash Back ((“aci789589”)) Redeem Temu   Coupon Code ((“aci789589”)) Temu Coupon $100 OFF ((“aci789589”)) Temu Coupon $100 OFF FOR EXISTING CUSTOMERS ((“aci789589”)) Temu Coupon $100 OFF FIRST ORDER ((“aci789589”)) Temu Coupon $100 OFF REDDIT ((“aci789589”)) Temu Coupon $100 OFF FOR EXISTING CUSTOMERS REDDIT ((“aci789589”)) Temu $100 OFF CODE ((“aci789589”)) Temu 70 OFF COUPON 2025 ((“aci789589”)) DOMINOS 70 RS OFF COUPON CODE ((“aci789589”)) WHAT IS A COUPON RATE ((“aci789589”)) Temu $100 OFF FOR EXISTING CUSTOMERS ((“aci789589”)) Temu $100 OFF FIRST ORDER ((“aci789589”)) Temu $100 OFF FREE SHIPPING ((“aci789589”)) You can get an exclusive $100 off discount on your Temu   purchase with the code [aci789589] Or [aci789589].This code is specially designed for new customers and offers a significant price cut on your shopping. Make your first purchase on Temu   more rewarding by using this code to get $100 off instantly. Temu   Coupon Code For $100 Off [aci789589] Or [aci789589]: Get A Flat $100 Discount On Order Value Get ready to save big with our incredible Temu   coupon for $100 off! Our coupon code will give you a flat $100 discount on your order value, making your shopping experience even more rewarding. Exclusive Temu   Discount Code [aci789589] Or [aci789589]: Flat $200 OFF for New and Existing Customers Using our Temu   promo code you can get A$ 200 off your order and 100% off using our Temu   promo code [aci789589] Or [aci789589]. As a new Temu   customer, you can save up to $100 using this promo code. For returning users, our Temu   promo code offers a $100 price slash on your next shopping spree. This is our way of saying thank you for shopping with us! Best Temu   Deals and Coupons [aci789589] Or [aci789589]: During 2025, Temu   coupon codes offer discounts of up to 90% on select items, making it possible for both new and existing users to get incredible deals. From $100 off deals to 100% discounts, our Temu   promo codes make shopping more affordable than ever. Temu   Coupon Code For $100% Off [aci789589] Or [aci789589]: For Both New And Existing Customers Free Temu   $100 Off Code — [aci789589] Or [aci789589] Temu Coupon 100% Off — [aci789589] Or [aci789589] Temu Memorial Day Sale - $100 Off — [aci789589] Or [aci789589] Temu Free Gift Code — [aci789589] Or [aci789589] Temu $500 Off Code — [aci789589 ] Or [aci789589] Best Temu   $200 Off Code — [aci789589 ] Or [aci789589] Temu Coupon Code first order — [aci789589] Or [aci789589] Temu Coupon Code for New user — [aci789589] Or [aci789589] Temu Coupon Code A$100 off — [aci789589] Or [aci789589] Temu Coupon Code $50 off — [aci789589] Or [aci789589] Temu Coupon Code $100 off — [aci789589] Or [aci789589] Temu Promo Code 2025 — [aci789589] Or [aci789589] Temu Coupon Code $200 off — [aci789589] Or [aci789589] Temu Coupon Code $90 off — [aci789589] Or [aci789589] Temu Sign up Bonus Code — [aci789589] Or [aci789589] Temu Coupon Code A$120 off — [aci789589] Or [aci789589] Our exclusive Temu   coupon code allows you to take a flat $200 off your purchase with an added 100% discount on top. As a new Temu   shopper, you can save up to $100 using code [aci789589] Or [aci789589]. Returning customers can also enjoy a $100 discount on their next purchases with this code. Temu Coupon Code for Your Country Sign-up Bonus Temu $100 Off Code  USA      [aci789589] Or [aci789589] - 100% off Temu $100 Off Code  USA     [aci789589] Or [aci789589] - 100% off Temu $100 Off Code USA  [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Japan [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Mexico [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Chile [aci789589] Or [aci789589] - 100% off Temu $100 Off Code USA [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Colombia [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Malaysia [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Philippines [aci789589] Or [aci789589] - 100% off Temu $100 Off Code South Korea [aci789589] Or [aci789589] - 100% off Temu $100 Off Code  USA      [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Pakistan [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Finland [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Saudi Arabia [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Qatar [aci789589] Or [aci789589] - 100% off Temu $100 Off Code France [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Germany [aci789589] Or [aci789589] - 100% off Temu $100 Off Code  USA   [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Israel [aci789589] Or [aci789589] - 100% off Get a $100 discount on your Temu   order with the promo code [aci789589] Or [aci789589]. You can get a discount by clicking on the item to purchase and entering this Temu   coupon code $100 off [aci789589] Or [aci789589]. Temu   Coupon Code [aci789589] Or [aci789589]: Get Up To 90% OFF In NOV 2025 Are you looking for the best Temu   coupon codes to get amazing discounts? Our Temu   coupons are perfect for getting those extra savings you crave. We regularly test our coupon codes for Temu   to ensure they work flawlessly, giving you a guaranteed discount every time. Temu   New User Coupon [aci789589] Or [aci789589]: Up To $100 OFF For First-Time Users Our Temu   first-time user coupon codes are designed just for new customers, offering the biggest discounts and the best deals currently available on Temu  . To maximize your savings, download the Temu   app and apply our Temu   new user coupon during checkout.
    • Verified user can get a $100 off Temu   Coupon code using the code ((“aci789589”)). This Temu   $100 Off code is specifically for new and existing customers both and can be redeemed to receive a $100 discount on your purchase. Our exclusive Temu   Coupon code offers a flat $100 off your purchase, plus an additional 100% discount on top of that. You can slash prices by up to $100 as a new Temu   customer using code ((“aci789589”)). Existing users can enjoy $100 off their next haul with this code. But that’s not all! With our Temu   Coupon codes for 2025, you can get up to 90% discount on select items and clearance sales. Whether you’re a new customer or an existing shopper, our Temu   codes provide extra discounts tailored just for you. Save up to 100% with these current Temu   Coupons ["^"aci789589 "^"] for April 2025. The latest Temu   coupon codes at here. New users at Temu   receive a $100 discount on orders over $100 Use the code ((“aci789589”)) during checkout to get Temu   Coupon $100 Off For New Users. You can save $100 Off your first order with the coupon code available for a limited time only. Temu   90% Off promo code ((“aci789589”)) will save you $100 on your order. To get a discount, click on the item to purchase and enter the code. Yes, Temu   offers $100 Off coupon code “aci789589” for first time users. You can get a $100 bonus plus $100 Off any purchase at Temu   with the $100 Coupon Bundle at Temu   if you sign up with the referral code ((“aci789589”)) and make a first purchase of $100 or more. Free Temu   codes $100 off — ((“aci789589”)) Temu Coupon $100 off — ((“aci789589”)) Temu Coupon 100% off — ((“aci789589”)) Temu Memorial Day Sale $100 off — ((“aci789589”)) Temu Coupon code today — ((“aci789589”)) Temu free gift code — ["^"aci789589"^"](Without inviting friends or family member) Temu Coupon code for  USA      - $100 Off— ((“aci789589”)) Temu Coupon code  USA     - $100 Off— ((“aci789589”)) Temu Coupon code USA  - $100 Off — ((“aci789589”)) Temu Coupon code Japan - $100 Off — ((“aci789589”)) Temu Coupon code Mexico - $100 Off — ((“aci789589”)) Temu Coupon code Chile - $100 Off — ((“aci789589”)) Temu Coupon code USA - $100 Off — ((“aci789589”)) Temu Coupon code Colombia - $100 Off — ((“aci789589”)) Temu Coupon code Malaysia - $100 Off — ((“aci789589”)) Temu Coupon code Philippines - $100 Off — ((“aci789589”)) Temu Coupon code South Korea - $100 Off — ((“aci789589”)) Redeem Free Temu   Coupon Code ["^"aci789589"^"] for first-time users Get a $100 discount on your Temu   order with the promo code "aci789589". You can get a discount by clicking on the item to purchase and entering this Temu   Coupon code $100 off ((“aci789589”)). Temu   New User Coupon ((“aci789589)): Up To $100 OFF For First-Time Users Our Temu   first-time user coupon codes are designed just for new customers, offering the biggest discounts and the best deals currently available on Temu  . To maximize your savings, download the Temu   app and apply our Temu   new user coupon during checkout. Temu   Coupon Codes For Existing Users ((“aci789589”)): $100 Price Slash Have you been shopping on Temu   for a while? Our Temu   Coupon for existing customers is here to reward you for your continued support, offering incredible discounts on your favorite products. Temu   Coupon For $100 Off ((“aci789589”)): Get A Flat $100 Discount On Order Value Get ready to save big with our incredible Temu   Coupon for $100 off! Our amazing Temu   $100 off coupon code will give you a flat $100 discount on your order value, making your shopping experience even more rewarding. Temu   Coupon Code For $100 Off ((“aci789589”)): For Both New And Existing Customers Our incredible Temu   Coupon code for $100 off is here to help you save big on your purchases. Whether you’re a new user or an existing customer, our $100 off code for Temu   will give you an additional discount! Temu   Coupon Bundle ((“aci789589”)): Flat $100 Off + Up To $100 Discount Get ready for an unbelievable deal with our Temu   Coupon bundle for 2025! Our Temu   Coupon bundles will give you a flat $100 discount and an additional $100 off on top of it. Free Temu   Coupons ((“aci789589”)): Unlock Unlimited Savings! Get ready to unlock a world of savings with our free Temu   Coupons! We’ve got you covered with a wide range of Temu   Coupon code options that will help you maximize your shopping experience. 100% Off Temu   Coupons, Promo Codes + 25% Cash Back ((“aci789589”)) Redeem Temu   Coupon Code ((“aci789589”)) Temu Coupon $100 OFF ((“aci789589”)) Temu Coupon $100 OFF FOR EXISTING CUSTOMERS ((“aci789589”)) Temu Coupon $100 OFF FIRST ORDER ((“aci789589”)) Temu Coupon $100 OFF REDDIT ((“aci789589”)) Temu Coupon $100 OFF FOR EXISTING CUSTOMERS REDDIT ((“aci789589”)) Temu $100 OFF CODE ((“aci789589”)) Temu 70 OFF COUPON 2025 ((“aci789589”)) DOMINOS 70 RS OFF COUPON CODE ((“aci789589”)) WHAT IS A COUPON RATE ((“aci789589”)) Temu $100 OFF FOR EXISTING CUSTOMERS ((“aci789589”)) Temu $100 OFF FIRST ORDER ((“aci789589”)) Temu $100 OFF FREE SHIPPING ((“aci789589”)) You can get an exclusive $100 off discount on your Temu   purchase with the code [aci789589] Or [aci789589].This code is specially designed for new customers and offers a significant price cut on your shopping. Make your first purchase on Temu   more rewarding by using this code to get $100 off instantly. Temu   Coupon Code For $100 Off [aci789589] Or [aci789589]: Get A Flat $100 Discount On Order Value Get ready to save big with our incredible Temu   coupon for $100 off! Our coupon code will give you a flat $100 discount on your order value, making your shopping experience even more rewarding. Exclusive Temu   Discount Code [aci789589] Or [aci789589]: Flat $200 OFF for New and Existing Customers Using our Temu   promo code you can get A$ 200 off your order and 100% off using our Temu   promo code [aci789589] Or [aci789589]. As a new Temu   customer, you can save up to $100 using this promo code. For returning users, our Temu   promo code offers a $100 price slash on your next shopping spree. This is our way of saying thank you for shopping with us! Best Temu   Deals and Coupons [aci789589] Or [aci789589]: During 2025, Temu   coupon codes offer discounts of up to 90% on select items, making it possible for both new and existing users to get incredible deals. From $100 off deals to 100% discounts, our Temu   promo codes make shopping more affordable than ever. Temu   Coupon Code For $100% Off [aci789589] Or [aci789589]: For Both New And Existing Customers Free Temu   $100 Off Code — [aci789589] Or [aci789589] Temu Coupon 100% Off — [aci789589] Or [aci789589] Temu Memorial Day Sale - $100 Off — [aci789589] Or [aci789589] Temu Free Gift Code — [aci789589] Or [aci789589] Temu $500 Off Code — [aci789589 ] Or [aci789589] Best Temu   $200 Off Code — [aci789589 ] Or [aci789589] Temu Coupon Code first order — [aci789589] Or [aci789589] Temu Coupon Code for New user — [aci789589] Or [aci789589] Temu Coupon Code A$100 off — [aci789589] Or [aci789589] Temu Coupon Code $50 off — [aci789589] Or [aci789589] Temu Coupon Code $100 off — [aci789589] Or [aci789589] Temu Promo Code 2025 — [aci789589] Or [aci789589] Temu Coupon Code $200 off — [aci789589] Or [aci789589] Temu Coupon Code $90 off — [aci789589] Or [aci789589] Temu Sign up Bonus Code — [aci789589] Or [aci789589] Temu Coupon Code A$120 off — [aci789589] Or [aci789589] Our exclusive Temu   coupon code allows you to take a flat $200 off your purchase with an added 100% discount on top. As a new Temu   shopper, you can save up to $100 using code [aci789589] Or [aci789589]. Returning customers can also enjoy a $100 discount on their next purchases with this code. Temu Coupon Code for Your Country Sign-up Bonus Temu $100 Off Code  USA      [aci789589] Or [aci789589] - 100% off Temu $100 Off Code  USA     [aci789589] Or [aci789589] - 100% off Temu $100 Off Code USA  [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Japan [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Mexico [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Chile [aci789589] Or [aci789589] - 100% off Temu $100 Off Code USA [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Colombia [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Malaysia [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Philippines [aci789589] Or [aci789589] - 100% off Temu $100 Off Code South Korea [aci789589] Or [aci789589] - 100% off Temu $100 Off Code  USA      [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Pakistan [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Finland [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Saudi Arabia [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Qatar [aci789589] Or [aci789589] - 100% off Temu $100 Off Code France [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Germany [aci789589] Or [aci789589] - 100% off Temu $100 Off Code  USA   [aci789589] Or [aci789589] - 100% off Temu $100 Off Code Israel [aci789589] Or [aci789589] - 100% off Get a $100 discount on your Temu   order with the promo code [aci789589] Or [aci789589]. You can get a discount by clicking on the item to purchase and entering this Temu   coupon code $100 off [aci789589] Or [aci789589]. Temu   Coupon Code [aci789589] Or [aci789589]: Get Up To 90% OFF In NOV 2025 Are you looking for the best Temu   coupon codes to get amazing discounts? Our Temu   coupons are perfect for getting those extra savings you crave. We regularly test our coupon codes for Temu   to ensure they work flawlessly, giving you a guaranteed discount every time. Temu   New User Coupon [aci789589] Or [aci789589]: Up To $100 OFF For First-Time Users Our Temu   first-time user coupon codes are designed just for new customers, offering the biggest discounts and the best deals currently available on Temu  . To maximize your savings, download the Temu   app and apply our Temu   new user coupon during checkout.
    • New users at Temu receive a $100 discount on orders over $100 Use the code [aci789589] during checkout to get Temu Coupon Code $100 off For New Users. Yes, Temu offers $100 off coupon code “aci789589” for first-time users. Temu 100% Off coupon code "aci789589" will save you $100 on your order. To get a discount, click on the item to purchase and enter the code. Yes, Temu offers $100 off coupon code “aci789589” for first-time users. You can get a$100 bonus plus 30% off any purchase at Temu with the$100 Coupon Bundle at Temu if you sign up with the referral code [aci789589] and make a first purchase of$50 or more. The Temu $100 Off coupon code (aci789589) will save you $100 on your order. To get a discount, click on the item to purchase and enter the code. Yes Temu offers $100 Off Coupon Code “aci789589” for First Time Users. Yes, Temu offers $100 off coupon code {aci789589} for first-time users. You can get a $100 bonus plus 100% off any purchase at Temu with the $100 Coupon Bundle if you sign up with the referral code [aci789589] and make a first purchase of $100 or more. If you are who wish to join Temu, then you should use this exclusive Temu coupon code $100 off (aci789589) and get $100 off on your purchase with Temu. You can get a $100 discount with Temu coupon code {aci789589}. This exclusive offer is for existing customers and can be used for a $100 reduction on your total purchase. Enter coupon code {aci789589} at checkout to avail of the discount. You can use the code {aci789589} to get a $100 off Temu coupon as a new customer. Apply this Temu coupon code $100 off (aci789589) to get a $100 discount on your shopping with Temu. If you’re a first-time user and looking for a Temu coupon code $100 first time user(aci789589) then using this code will give you a flat $100 Off and a 90% discount on your Temu shopping. Temu $100% Off Coupon Code "aci789589" will save you $100 on your order. To get a discount, click on the item to purchase and enter the code. Temu coupon code$100off-{aci789589} Temu coupon code -{aci789589} Temu coupon code$50 off-{aci789589} Temu Coupon code [aci789589] for existing users can get up to 50% discount on product during checkout. Temu Coupon Codes for Existing Customers-aci789589 Temu values its loyal customers and offers various promo codes, including the Legit Temu Coupon Code (aci789589]) or (aci789589), which existing users can use. This ensures that repeat shoppers can also benefit from significant discounts on their purchases. Keep an eye out for special promotions and offers that are periodically available to enhance your shopping experience.
    • not too sure what the issue is as i got no idea how to read these logs  https://paste.ee/p/yT39ed47#goHy1J7L0S8m3mFCUGnIhNkxaGrm8gEM
    • Even though I defined this in my gradle.properties, it still gives me the same error, even when I change it in my mods.toml, where:   Exception in thread "main" java.lang.reflect.InvocationTargetException ... Caused by: com.electronwill.nightconfig.core.io.ParsingException: Invalid bare key: '${mod_id}'   And my mods.toml worked fine before that
  • Topics

  • Who's Online (See full list)

    • There are no registered users currently online
×
×
  • Create New...

Important Information

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