Sound-Looping Minecraft 1.7.10

Dieses Thema im Forum "Programmierung" wurde erstellt von Dhastan, 20. April 2016.

  1. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    Hi Leute , ich mal wieder....und gleich mit einer Frage zu meinem Problem.

    Sounds + Loop mit Forge 1.7.10

    Mein Vorhaben ist es, einem Generator zum laufen zu bekommen.
    Durch Rechtsklick auf das Objekt mit einem Schlüssel, wird er gestartet...
    ....hat er kein Benzin...geht er wieder aus....funktioniert.
    ...hat er Benzin...geht er an und bleibt an...funktioniert.

    Kurz darauf kommt der "Idle" Sound.....funktioniert auch.
    Wenn ich wieder Rechtsklicke geht er aus....funktioniert auch..

    Was nicht funktioniert ist , wenn ich den Generator laufen lasse und offline gehe.....wieder on komme....steht zwar alles auf true, jedoch der "Idle" Sound ist nicht zu hören.
    Nur wenn ich ihn ausschalte und wieder einschalte ist er wieder da, aber nur solange ich online bin....

    Weiß von euch jemand einen Rat? ich verzweifle so langsam ....
    Tutorials über SoundHandler finde ich nur sehr wenige bis garkeine.....

    mein Block (Auszug):
    Code (Text):
    1.  
    2.    @Override
    3.    public void keyRightClick(World world, int x, int y, int z)
    4.    {
    5.      TileEntityMachineGeneratorG100 tileE = (TileEntityMachineGeneratorG100) world.getTileEntity(x, y, z);
    6.      
    7.      if(!world.isRemote && world.getTileEntity(x, y, z) != null)
    8.      {
    9.        boolean machineStart = ((TileEntityMachineGeneratorG100)tileE).isActivateMachineStart();
    10.        ((TileEntityMachineGeneratorG100)tileE).setActivateMachineStart(!machineStart);
    11.      }
    12.    }
    13.  
    mein TileEntity:

    Code (Text):
    1.  
    2. public class TileEntityMachineGeneratorG100 extends TileEntity implements IInventory, ISidedInventory
    3. {
    4.    public boolean machineStart = false;
    5.    public boolean machineActive = false;
    6.  
    7.    public int fuelLevelPetrol = 0;
    8.    public int fuelLevelPetrolMax = 1000;
    9.  
    10.    private String machineGeneratorLoop = "cmm:machine_generator_loop";
    11.    private boolean isPlaying = false;
    12.    private boolean shouldStart = false;
    13.    private boolean shouldStop = false;
    14.    private float soundVolume = 1.0F;
    15.  
    16.    @Override
    17.    public void updateEntity()
    18.    {
    19.      updateFuelEngine();
    20.      
    21.      if(this.machineStart && this.fuelLevelPetrol > 0)
    22.      {
    23.        this.machineActive = true;
    24.      }
    25.      else if(!this.machineStart && this.machineActive)
    26.      {
    27.        this.machineActive = false;
    28.      }
    29.  
    30.      if(this.machineActive)
    31.      {
    32.        if(!this.isPlaying && this.shouldStart)
    33.        {
    34.          this.shouldStart = false;
    35.          this.shouldStop = false;
    36.          this.isPlaying = true;
    37.  
    38.   CMM.proxy.soundLooping(worldObj.getTileEntity(xCoord, yCoord, zCoord), machineGeneratorLoop);
    39.        }
    40.      }
    41.    }
    42.    
    43.    public Packet getDescriptionPacket()
    44.    {
    45.      NBTTagCompound tag = new NBTTagCompound();
    46.      writeToNBT(tag);
    47.      return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1 ,tag);
    48.    }
    49.    
    50.    public void onDataPacket(NetworkManager manager, S35PacketUpdateTileEntity packet)
    51.    {
    52.      readFromNBT(packet.func_148857_g());
    53.    }
    54.    
    55.    public void writeToNBT(NBTTagCompound tag)
    56.    {
    57.      super.writeToNBT(tag);
    58.      tag.setBoolean("machineStart", machineStart);
    59.      tag.setBoolean("machineActive", machineActive);
    60.      tag.setInteger("fuelLevelPetrol", fuelLevelPetrol);
    61.      tag.setInteger("fuelLevelPetrolMax", fuelLevelPetrolMax);
    62.      tag.setBoolean("shouldStart", shouldStart);
    63.      tag.setBoolean("isPlaying", isPlaying);
    64.      tag.setBoolean("shouldStop", shouldStop);
    65.      tag.setFloat("soundVolume", soundVolume);
    66.    }
    67.    
    68.    public void readFromNBT(NBTTagCompound tag)
    69.    {
    70.      super.readFromNBT(tag);
    71.      machineStart = tag.getBoolean("machineStart");
    72.      machineActive = tag.getBoolean("machineActive");
    73.      fuelLevelPetrol = tag.getInteger("fuelLevelPetrol");
    74.      fuelLevelPetrolMax = tag.getInteger("fuelLevelPetrolMax");
    75.      shouldStart = tag.getBoolean("shouldStart");
    76.      isPlaying = tag.getBoolean("isPlaying");
    77.      shouldStop = tag.getBoolean("shouldStop");
    78.      soundVolume = tag.getFloat("soundVolume");
    79.    }
    80.    
    81.    public boolean isActivateMachineStart()
    82.    {
    83.      return this.machineStart;
    84.    }
    85.    
    86.    public void setActivateMachineStart(boolean machineStartActivated)
    87.    {
    88.      if(this.machineStart != machineStartActivated)
    89.      {
    90.        if(!this.machineStart && this.fuelLevelPetrol <= 0)
    91.        {
    92.          this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "cmm:machine_generator_start_fail", 2.0F, 1.0F);
    93.          this.machineStart = false;
    94.          CMM.CMMNet.sendToAll(new PacketMachineGenerators(xCoord, yCoord, zCoord, false, false));
    95.        }
    96.        else if(!this.machineStart && this.fuelLevelPetrol > 0)
    97.        {
    98.          this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "cmm:machine_generator_start", 2.0F, 1.0F);
    99.          this.machineStart = true;
    100.          this.machineActive = true;
    101.          this.setShouldStart(true);
    102.          CMM.CMMNet.sendToAll(new PacketMachineGenerators(xCoord, yCoord, zCoord, true, true));
    103.        }
    104.        else if(this.machineStart)
    105.        {
    106.          this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "cmm:machine_generator_stop", 2.0F, 1.0F);
    107.          this.machineStart = false;
    108.          this.machineActive = false;
    109.          this.setShouldStop(true);
    110.          CMM.CMMNet.sendToAll(new PacketMachineGenerators(xCoord, yCoord, zCoord, false, false));
    111.        }
    112.      }
    113.    }
    114.    
    115.    public boolean isShouldStop()
    116.    {
    117.      return shouldStop;
    118.    }
    119.    
    120.    public boolean isPlaying()
    121.    {
    122.      return isPlaying;
    123.    }
    124.    
    125.    public void setShouldStart(boolean shouldStart)
    126.    {
    127.      this.shouldStart = shouldStart;
    128.    }
    129.    
    130.    public void setShouldStop(boolean shouldStop)
    131.    {
    132.      if(isPlaying)
    133.      {
    134.        isPlaying = false;
    135.        this.shouldStop = shouldStop;
    136.      }
    137.    }
    138. }
    139.  
    Handler:

    Code (Text):
    1.  
    2. public class AudioHandler extends MovingSound
    3. {
    4.    private final TileEntity tileE;
    5.    private TileEntityMachineGeneratorG100 tileEMachineGeneratorG100;
    6.    
    7.    public AudioHandler(TileEntity tileE, String soundName)
    8.    {
    9.      super(new ResourceLocation(CMM.modid + ":" + soundName));
    10.      this.tileE = tileE;
    11.      this.repeat = true;
    12.      this.volume = 1.0F;
    13.      this.xPosF = tileE.xCoord;
    14.      this.yPosF = tileE.yCoord;
    15.      this.zPosF = tileE.zCoord;
    16.      this.tileEMachineGeneratorG100 = (TileEntityMachineGeneratorG100) tileE;
    17.    }
    18.    
    19.    @Override
    20.    public void update()
    21.    {
    22.      if(tileEMachineGeneratorG100.isShouldStop())
    23.      {
    24.        this.donePlaying = true;
    25.      }
    26.    }
    27.    
    28.    @Override
    29.    public boolean isDonePlaying()
    30.    {
    31.      return this.donePlaying;
    32.    }
    33. }
    34.  
    Proxys:
    Common:

    Code (Text):
    1.  
    2. public class CommonProxy
    3. {
    4.    public void registerRenderer() {}
    5.    
    6.    public void soundLooping(TileEntity tileE, String soundName) {}
    7. }
    8.  
    Client:

    Code (Text):
    1.  
    2. public class ClientProxy extends CommonProxy
    3. {
    4.    @Override
    5.    public void registerRenderer()
    6.    {
    7.      ClientRegistry.registerTileEntity(TileEntityMachineGeneratorG100.class,CMM.modid + ":" + Names.FUELENGINE_ENERGY_GENERATOR_G100, new TileEntityMachineGeneratorG100Renderer());
    8.      
    9.      MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(RegisterCMMMachines.blockMachineGeneratorG100), ItemMachineGeneratorG100Renderer.instance);
    10.  
    11.    }
    12.    
    13.    @Override
    14.    public void soundLooping(TileEntity tileE, String soundName)
    15.    {
    16.      AudioHandler audioHandler = new AudioHandler(tileE , soundName);
    17.      Minecraft.getMinecraft().getSoundHandler().playSound(audioHandler);
    18.    }
    19. }
    20.  
    IProxy:

    Code (Text):
    1.  
    2. public interface IProxy
    3. {
    4.    public abstract void soundLooping(TileEntity tileE, String soundName);
    5. }
    6.  
     
    #1
  2. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Hast nicht gerade die beste Methode dafür...
    Sehe in deinem Code 2 Probleme, 1. das von dir genante.
    2. Nur der Spieler der den Block Aktiviert hört es.

    An deiner stelle würde ich den Sound in deiner Block Tick Methode abspielen lassen. Natürlich dann vorher überprüfen ob dieser bereits läuft.
    Dann sollte es gehen und ihn sollten auch alle Spieler in der nähe hören.

    Und außerdem ich würde dir empfehlen den Mod für 1.9/1.8 zu schreiben da hast du viel größere Chancen dass deine Mod bekannter wird.
    Und so schlimm ist das Updaten gar nicht wie viele es behauptet haben es ist zwar etwas arbeit aber mit Suchen und Ersetzten dann doch sehr schnell geregelt.

    P.s. die IProxy kannst du löschen 1. verwendest du diese nicht 2. ist sie unnötig da es pro Mod nur 2 Proxy objekte gibt von dem 1 von dem anderem erbt von daher...
     
    #2
  3. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    Danke für deine hilfreiche Antwort.....das mit 1.8 werde ich in erwägung ziehen :)
     
    #3
  4. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    Ich habe es ausgiebig getestet und muss sage, es funktioniert einfach nicht....mal geht es....mal nicht :(
     
    #4
  5. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    Kennt jemand von ein Tutorial , wo dies ausgiebig beschrieben wird?
    In den verschiedenen Foren gehen die Meinungen über das Them Sound sehr weit auseinander.
    Ich habe gelernt, dass bei "!world.isRemote) die Informationen darin zum Server gehen und mit
    "world.isRemote" ausschließlich zum Client.

    Warum in aller Welt schreiben sie dann alle im Block "!world.isRemote" vor dem Sound, wenn der doch vom Client verarbeitet werden soll.
     
    #5
  6. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Der wird vom Client verarbeitet aber einen Sound spielt in der Regel der Server ab und sendet die Infos nur zu dem Client.
     
    #6
  7. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    Ok....das habe ich soweit verstanden....jedoch weshalb wird dann der Sound nur für mich zu hören sein, wie ich es oben im code geschrieben habe?
    Über die Block Tick Methode....nun ja....Sound wird abgespielt...nur....ab und zu fällt er aus :/
     
    #7
  8. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Weil deine Sound Looping Methode sich in der Client Proxy befindet.
    Solange du diese Methode dann nicht via ClientProxy.soundLooping()
    aufrufst, was übrigens nicht der Sinn der Proxys ist, wird dieser Code auch 100% nur vom Client ausgeführt.
     
    #8
    jensIO gefällt das.
  9. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    Hättest du eine Alternative für mich? Mal weg von dem oben gesetzten....
    Ich habe den Code aus einem Tutorial....der wie es scheint Blödsinn ist.
    Das Problem ist, das ich im Google-Search nichts über SoundHandler und Loops finden kann....und ich in dieser Rubrik
    noch nicht wohl erhaben ins weiße Licht gerückt bin, um ein Jedi zu werden.
     
    #9
  10. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Also das ist die Code Zeile die ich zum abspielen von Sounds benutze:
    Code (Text):
    1. worldIn.playSoundEffect((double) ((float) pos.getX() + 0.5F), (double) ((float) pos.getY() + 0.5F), (double) ((float) pos.getZ() + 0.5F), this.stepSound.getPlaceSound(), (this.stepSound.getVolume() + 1.0F) / 2.0F, this.stepSound.getFrequency() * 0.8F);
    Dies aber ohne abzufragen ob es auf dem Server ist oder nicht wie ich eben sehe.
    Kannst ja beides Probieren. Leider ist dieser Code aus der 1.8.9 und weiß nicht ob dieser auf der 1.7.10 noch laufen wird.
    Eine extra Methode zum loopen brauchst du nicht einfach diese Zeile in das Block Tick event und es sollte gehen.
     
    #10
  11. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    Diesen ".playSoundEffect" gibt es in der 1.7 auch, jedoch ist da das Problem, dass der Sound bis zum Ende abgespielt wird.
    Wenn ich allerdings den Motor abstelle und der Sound hat eben von "vorn" begonnen, läuft der Sound noch aus, obwohl der Motor schon längst abgeschalten ist.
    Ich suche noch nach einer Möglichkeit, wo ich direkt dem SoundNamen sagen kann, geht , geht nicht.

    zB.:
    geht--->
    AudioHandler audioHandler = new AudioHandler(tileE , soundName);
    Minecraft.getMinecraft().getSoundHandler().playSound(audioHandler);

    geht nicht--->
    AudioHandler audioHandler = new AudioHandler(tileE , soundName);
    Minecraft.getMinecraft().getSoundHandler().stopSound(audioHandler);

    Bei deiner Methode geht aber nur : Minecraft.getMinecraft().stopSounds();
    Damit werden aber alle Sounds gestoppt.
     
    #11
  12. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    #12
  13. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    #13
  14. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    Nun gut...mit der Methode den SoundHandler zu integrieren...war ich ja schon soweit...nur das der Sound nicht mehr abgespielt wird, wenn ich offline war und wieder online komme (im SinglePlay), obwohl alles auf "true" stand.

    ich denk mal, ich werde die Methode, die ich jetzt habe behalten, da funktioniert auch das obengenannte. Jetzt muss ich nur noch einen Server-Test machen.
     
    #14
  15. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Also den Sound (ISound) Speicherst du iwo in einer Externen klasse.
    Im Block Tick event spielst du diesen nur ab, so kannst du diesen dann auch stoppen.
    Eine einfache kombi aus den 2 systemen
     
    #15
  16. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    ja, aber wie wird er dann als loop ausgeführt?
    mit einer Variable die auf true oder false gesetzt wird, geht es ja nicht.
    nur wenn ich einen timer-Cooldown setze wiederholt er ihn.

    Und im Block Tick event wird das ganze pro Sekunde ca. abgefragt.
    Weißt du wie das klingt....furchtbar :)
    Habe über das TE einen timer gesetzt und solange "machineActiv" ist, wiederholt er ihn.

    Aber ich lasse mich gern eines besseren belehren...learning by doing ;)
     
    #16
  17. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Dafür gibts ja die isSoundPlaying methode ;) Auch im obigen link zu finden.
     
    #17
  18. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    ?...bin ich doof?
    Mein Englisch ist zwar misserabel, aber über die "isSoundPlaying" finde ich nichts.
     
    #18
  19. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    Minecraft:
    JTK222
    Oh sorry hab die seite nur überflogen wusste nicht das sie nur angesprochen wurde.
    Naja mit Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(ISound) müsstest du überprüfen können ob ein Sound gerade Aktiv ist oder nicht.
     
    #19
  20. Dhastan
    Offline

    Dhastan

    Registriert seit:
    23. Februar 2016
    Beiträge:
    16
    Ok....ich mach mich an die Arbeit :) Danke dir.....erstmal :)
     
    #20