[1.7.10 ] [SoundManager] Petit problème pour récupérer une information.
-
Salut, Je voudrais savoir comment je pourrai faire pour récupérer une information du genre si un ItemRecord est en cour de lecture.
J’utilise ça pour lancer la musique
public boolean SoundPlaye = false; @Override public void updateEntity() { if(contents[0] != null && !SoundPlaye == true) { System.out.println("Play Music !"); Item x = contents[0].getItem(); this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1005, this.xCoord, this.yCoord, this.zCoord, Item.getIdFromItem(x)); SoundPlaye = true; } }
Merci de votre aide
-
Tu as sûrement un event SoundRecordPlayed event ou un truc du genre. Au pire tu prends un de ces event et tu check le nom du son joué.
-
Gras à toi je suis parti chercher avec mot clé (SoundRecordPlayed) je suis tomber sur ça
https://dl.dropboxusercontent.com/s/h777x7ugherqs0w/forgeevents.html
après ça
http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/modification-development/2142490-how-to-test-if-a-sound-is-being-played
Et ça !
http://pastebin.com/jC7dyMxrJe donne pour les gens qui cherche aussi comment faire !
-
Hé bien ? À partir de là, c’est bon tu as juste à faire une condition avec le boolean et fais attention au nom du cd !
-
Le problème c’est que en multijoueur SoundManager existe pas
j’ai réglé les problème pour le multijoueur pour pas ça crash mais je sais pas comment faire pour que la musique fonctionne en multijoueur…
Mon Main
package re.aurelien.mod; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.ISound; import net.minecraft.client.audio.SoundManager; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.Item.ToolMaterial; import net.minecraftforge.client.event.sound.SoundLoadEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.EnumHelper; import re.aurelien.mod.MusicBlock.MusicBlock; import re.aurelien.mod.MusicBlock.TileEntityMusicBlock; import java.lang.reflect.Field; import com.google.common.collect.HashBiMap; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @Mod(modid = AurelienMod.MODID, version = AurelienMod.VERSION) public class AurelienMod { public static HashBiMap <string, isound="">playing = null; public static ToolMaterial SuperMaterial = EnumHelper.addToolMaterial("SuperMaterial", 5, 1000, 15.0F, 20.0F, 30); public static final String MODID = "aurelienmod"; public static final String VERSION = "0.0.1"; Item ItemSwordSkyQueen; public static Item ItemSwordAurelien; @Instance(MODID) public static AurelienMod instance; @SidedProxy(clientSide = "re.aurelien.mod.client.ClientProxy", serverSide = "re.aurelien.mod.CommonProxy") public static CommonProxy proxy; public static Block _MusicBlock; @EventHandler public void preinit(FMLPreInitializationEvent event) { ItemSwordSkyQueen = new ItemSword_SkyQueen(SuperMaterial).setCreativeTab(MyCreativeTabs); ItemSwordAurelien = new ItemSword_Aurelien(SuperMaterial).setCreativeTab(MyCreativeTabs); _MusicBlock = new MusicBlock(Material.wood).setBlockName("MusicBlock").setBlockTextureName(AurelienMod.MODID + ":MusicBlock").setCreativeTab(MyCreativeTabs); GameRegistry.registerBlock(_MusicBlock, "MusicBlock"); GameRegistry.registerTileEntity(TileEntityMusicBlock.class, "TileEntityMusicBlock"); FMLCommonHandler.instance().bus().register(this); MinecraftForge.EVENT_BUS.register(this); } @SideOnly(Side.CLIENT) @SubscribeEvent public void onSoundsLoaded(SoundLoadEvent event) { SoundManager manager = null; try { // handler -> manager -> playingList // gets SoundHandler net.minecraft.client.audio.SoundHandler handler; Field field_handler = Minecraft.class.getDeclaredField("mcSoundHandler"); field_handler.setAccessible(true); handler = (net.minecraft.client.audio.SoundHandler) field_handler.get(Minecraft.getMinecraft()); // gets SoundManager Field field_manager = net.minecraft.client.audio.SoundHandler.class.getDeclaredField("sndManager"); field_manager.setAccessible(true); manager = (SoundManager) field_manager.get(handler); // gets playing list Field field_playing = SoundManager.class.getDeclaredField("playingSounds"); field_playing.setAccessible(true); AurelienMod.playing = (HashBiMap<string, isound="">) field_playing.get(manager); } catch (Exception ex) { ex.printStackTrace(); } } @EventHandler public void init(FMLInitializationEvent event) { NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandlerAurelienMod()); proxy.registerRenderers(); } @EventHandler public void postInit(FMLPostInitializationEvent event) { } public static CreativeTabs MyCreativeTabs = new CreativeTabs("SkyQueenMod") { @Override @SideOnly(Side.CLIENT) public Item getTabIconItem() { return Item.getItemFromBlock(_MusicBlock); } }; }
TileEntityMusicBlock.java
package re.aurelien.mod.MusicBlock; import com.google.common.collect.HashBiMap; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.ISound; import net.minecraft.client.audio.ISound.AttenuationType; import net.minecraft.client.audio.SoundManager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemRecord; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import re.aurelien.mod.AurelienMod; import sun.util.logging.resources.logging_fr; import java.lang.reflect.Field; public class TileEntityMusicBlock extends TileEntity implements ISidedInventory { private ItemStack[] contents = new ItemStack[9]; private int indexMusic = 0; private int IdMusic; private ResourceLocation SoundPlayeResourceLocation; private boolean SoundPlaye = false; public void PlayeurList() { if(SoundPlaye == true) { if(this.contents[IdMusic] == null) { this.worldObj.playAuxSFX(1005, this.xCoord, this.yCoord, this.zCoord, 0); this.worldObj.playRecord((String)null, this.xCoord, this.yCoord, this.zCoord); } boolean d = isSoundPlaying(SoundPlayeResourceLocation); if(d == false) { System.out.println("On passe le cd !"); if(indexMusic < 7) { indexMusic = indexMusic + 1; } else { indexMusic = 0; } SoundPlaye = false; } } else { try { if(this.contents[indexMusic] != null) { PlayeMusic(indexMusic); } else { if(indexMusic < 7) { indexMusic = indexMusic + 1; } else { indexMusic = 0; } } } catch(Exception ex) { System.out.println(ex); } } } private void PlayeMusic(int index) { System.out.println("Play : " + index); if (AurelienMod.playing != null) { if(SoundPlaye != true) { Item item = contents[index].getItem(); ItemRecord ItemRecord = (ItemRecord) item; String Name = ItemRecord.recordName; String RecordResource = ItemRecord.getRecordResource(Name).toString(); RecordResource = RecordResource.replace("minecraft:","minecraft:records."); this.SoundPlayeResourceLocation = new ResourceLocation(RecordResource); this.IdMusic = index; System.out.println("Play : " + RecordResource); this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1005, this.xCoord, this.yCoord, this.zCoord, Item.getIdFromItem(item)); SoundPlaye = true; } } } private boolean isSoundPlaying(ResourceLocation res) { if (AurelienMod.playing != null) { ISound[] array_playing = AurelienMod.playing.values().toArray(new ISound[AurelienMod.playing.values().size()]); for (int i = 0; i < array_playing.length; i++) { //System.out.println(array_playing*.getPositionedSoundLocation() + "==" + res ); if (array_playing*.getPositionedSoundLocation().equals(res)) { return true; } } } return false; } public void readFromNBT(NBTTagCompound nBTTagCompound) { super.readFromNBT(nBTTagCompound); NBTTagList var2 = nBTTagCompound.getTagList("Items", 10); this.contents = new ItemStack[this.getSizeInventory()]; for (int var3 = 0; var3 < var2.tagCount(); ++var3) { NBTTagCompound var4 = var2.getCompoundTagAt(var3); byte var5 = var4.getByte("Slot"); if (var5 >= 0 && var5 < this.contents.length) { this.contents[var5] = ItemStack.loadItemStackFromNBT(var4); } } } public void writeToNBT(NBTTagCompound nBTTagCompound) { super.writeToNBT(nBTTagCompound); NBTTagList var2 = new NBTTagList(); for (int var3 = 0; var3 < this.contents.length; ++var3) { if (this.contents[var3] != null) { NBTTagCompound var4 = new NBTTagCompound(); var4.setByte("Slot", (byte)var3); this.contents[var3].writeToNBT(var4); var2.appendTag(var4); } } nBTTagCompound.setTag("Items", var2); } @Override public void updateEntity() { this.worldObj.scheduleBlockUpdate(this.xCoord, this.yCoord, this.zCoord, this.getBlockType(), 5); } @Override public int getSizeInventory() { return this.contents.length; } @Override public ItemStack getStackInSlot(int SlotIndex) { return this.contents[SlotIndex]; } @Override public ItemStack decrStackSize(int Itemindex, int number) { if (this.contents[Itemindex] != null) { ItemStack itemStack; if (this.contents[Itemindex].stackSize <= number) { itemStack = this.contents[Itemindex]; this.contents[Itemindex] = null; return itemStack; } else { itemStack = this.contents[Itemindex].splitStack(number); if (this.contents[Itemindex].stackSize == 0) { this.contents[Itemindex] = null; } return itemStack; } } else { return null; } } @Override public ItemStack getStackInSlotOnClosing(int SlotIndex) { if (this.contents[SlotIndex] != null) { ItemStack var2 = this.contents[SlotIndex]; this.contents[SlotIndex] = null; return var2; } else { return null; } } @Override public void setInventorySlotContents(int slotIndex, ItemStack stack) { this.contents[slotIndex] = stack; // met l'item stack dans le tableau if(stack != null && stack.stackSize > this.getInventoryStackLimit()) // si la taille de l'item stack dépasse la limite maximum de l'inventaire { stack.stackSize = this.getInventoryStackLimit(); // on le remet sur la limite } this.markDirty(); // met à jour le tile entity } @Override public String getInventoryName() { return "tile.BlockLavaFabricator"; } @Override public boolean hasCustomInventoryName() { // TODO Auto-generated method stub return false; } @Override public int getInventoryStackLimit() { return 1; } @Override public boolean isUseableByPlayer(EntityPlayer player) { return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : player.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D; } @Override public void openInventory() { } @Override public void closeInventory() { } @Override public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) { return true; } @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { return null; } @Override public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { return false; } @Override public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { return false; } }
MusicBlock.java
package re.aurelien.mod.MusicBlock; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.audio.ISound; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemRecord; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import re.aurelien.mod.AurelienMod; public class MusicBlock extends BlockContainer { public MusicBlock(Material p_i45386_1_) { super(p_i45386_1_); } @Override public void updateTick(World world, int x, int y, int z, Random rand) { TileEntityMusicBlock TileEntity = (TileEntityMusicBlock) world.getTileEntity(x, y, z); TileEntity.PlayeurList(); world.scheduleBlockUpdate(x, y, z, this, 5); } @Override public boolean getTickRandomly() { return true; } @Override public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int meta) { world.scheduleBlockUpdate(x, y, z, this, 5); return meta; } public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX,float hitY, float hitZ) { if (world.isRemote) { return true; } else { player.openGui(AurelienMod.instance, 0, world, x, y, z); return true; } } private final Random field_149955_b = new Random(); @Override public void breakBlock(World worldObj, int x, int y, int z, Block p_149749_5_, int p_149749_6_) { worldObj.playAuxSFX(1005, x , y , z, 0); worldObj.playRecord((String)null, x , y, z); TileEntityMusicBlock TileEntity = (TileEntityMusicBlock) worldObj.getTileEntity(x, y, z); if ( TileEntity != null) { for (int var8 = 0; var8 < TileEntity.getSizeInventory(); ++var8) { ItemStack var9 = TileEntity.getStackInSlot(var8); if (var9 != null) { float var10 = this.field_149955_b.nextFloat() * 0.8F + 0.1F; float var11 = this.field_149955_b.nextFloat() * 0.8F + 0.1F; EntityItem var14; for (float var12 = this.field_149955_b.nextFloat() * 0.8F + 0.1F; var9.stackSize > 0; worldObj.spawnEntityInWorld(var14)) { int var13 = this.field_149955_b.nextInt(21) + 10; if (var13 > var9.stackSize) { var13 = var9.stackSize; } var9.stackSize -= var13; var14 = new EntityItem(worldObj, (double)((float)x + var10), (double)((float)y + var11), (double)((float)z + var12), new ItemStack(var9.getItem(), var13, var9.getItemDamage())); float var15 = 0.05F; var14.motionX = (double)((float)this.field_149955_b.nextGaussian() * var15); var14.motionY = (double)((float)this.field_149955_b.nextGaussian() * var15 + 0.2F); var14.motionZ = (double)((float)this.field_149955_b.nextGaussian() * var15); if (var9.hasTagCompound()) { var14.getEntityItem().setTagCompound((NBTTagCompound)var9.getTagCompound().copy()); } } } } worldObj.func_147453_f(x, y, z, p_149749_5_); } } @Override public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return new TileEntityMusicBlock(); } }
ContainerMusicBlock.java
package re.aurelien.mod.MusicBlock; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemRecord; import net.minecraft.item.ItemStack; public class ContainerMusicBlock extends Container { private final TileEntityMusicBlock Tile; public ContainerMusicBlock (TileEntityMusicBlock tile, InventoryPlayer inventory) { this.Tile = tile; for (int i=1; i <9; ++i) { this.addSlotToContainer(new Slot(tile, i - 1, (19 * i) - 6, 15){ @Override public boolean isItemValid(ItemStack Stack) { if(Stack.getItem() instanceof ItemRecord) { return true; } else { return false; } } }); } //this.addSlotToContainer(new Slot(tile, 8, 80, 35) //{ // @Override // public boolean isItemValid(ItemStack Stack) // { // return false; //} //}); this.bindPlayerInventory(inventory); } private void bindPlayerInventory(InventoryPlayer inventory) { int i; for(i = 0; i < 3; ++i) { for(int j = 0; j < 9; ++j) { this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } for(i = 0; i < 9; ++i) { this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 142)); } } public boolean canInteractWith(EntityPlayer player) { return this.Tile.isUseableByPlayer(player); } public ItemStack transferStackInSlot(EntityPlayer Player, int slotIndex) { ItemStack var3 = null; Slot var4 = (Slot)this.inventorySlots.get(slotIndex); if (var4 != null && var4.getHasStack()) { ItemStack var5 = var4.getStack(); if (var5.getItem() instanceof ItemRecord) { var3 = var5.copy(); } else { return null; } if (slotIndex < 8) { if (!this.mergeItemStack(var5, 8, this.inventorySlots.size(), true)) { return null; } } else if (!this.mergeItemStack(var5, 0, 8, false)) { return null; } if (var5.stackSize == 0) { var4.putStack((ItemStack)null); } else { var4.onSlotChanged(); } } return var3; } } ```</string,></string,>
-
Tu pourrais mettre les balises java pour faciliter l’aperçu du code ?
De + si tu respectais la convention, ça serait aussi + apréciable niveau lecture.
Et quand souhaites-tu vérifier que le son est joué, dans ta TE ? Je te rappelle que les musiques ne sont gérées que côté server, du coup tu n’as pas à t’embêter au niveau de ton serveur, c’est le client qui s’en occupera -
Reuh Salut,
(De + si tu respectais la convention, ça serait aussi + apréciable niveau lecture.) Désolé je suis pas un vrais programmeur je bricole comme je peux x’)Alors j’ai trouvé mais le problème c’est que je me demander si le fait de refresh se petit boue code la
@SideOnly(Side.CLIENT) @SubscribeEvent public void PlaySoundSource(PlaySoundSourceEvent event) { SoundManager manager = null; try { // handler -> manager -> playingList // gets SoundHandler net.minecraft.client.audio.SoundHandler handler; Field field_handler = Minecraft.class.getDeclaredField("mcSoundHandler"); field_handler.setAccessible(true); handler = (net.minecraft.client.audio.SoundHandler) field_handler.get(Minecraft.getMinecraft()); // gets SoundManager Field field_manager = net.minecraft.client.audio.SoundHandler.class.getDeclaredField("sndManager"); field_manager.setAccessible(true); manager = (SoundManager) field_manager.get(handler); // gets playing list Field field_playing = SoundManager.class.getDeclaredField("playingSounds"); field_playing.setAccessible(true); AurelienMod.playing = (HashBiMap<string, isound="">) field_playing.get(manager); } catch (Exception ex) { ex.printStackTrace(); } }
Pause pas problème de performance ??
Au début je les ajouter dans une fonction qui load les sound du cout coté client ça fonctionner mais pas coté server !
C’était suis la
@SideOnly(Side.CLIENT) @SubscribeEvent public void onSoundsLoaded(SoundLoadEvent event) { ```</string,>
-
En solo tout fonction bien, juste que sur le server je peux pas utilisé ( import net.minecraft.client.audio.SoundManager; )
Du coup la fonction
private boolean isSoundPlaying(ResourceLocation res) { if (AurelienMod.playing != null) { ISound[] array_playing = AurelienMod.playing.values().toArray(new ISound[AurelienMod.playing.values().size()]); for (int i = 0; i < array_playing.length; i++) { if (array_playing*.getPositionedSoundLocation().equals(res)) { return true; } } } return false; }
Du coup il return false coté server parce que la variable (AurelienMod.playing) est null
parce que le server utilise pas de SoundManager. c’est que coté client.
-
~~Si les TE ne sont pas des 2 côtés alors packet obligatoire ~~
Les TE sont gérés des 2 côtés donc suis le message de robin au-dessus -
Oui et c’est normal, le son n’est que géré côté client. Il n’a aucun intérêt côté serveur. Tout ce qui concerne le son ne doit que être fait sur le client.
-
Du coup je vais essayer nettoyer mon code, est aller après tester les Packet ^^ je vous tient au courant.
-
Nan regarde mon message (je l’ai édité). Pas besoin de packet, rajoute juste une condition de ce genre
if(this.worldObj.isRemote)
{
//Ta méthode qui check si un disque est joué
} -
je peux pas le mettre dans isSoundPlaying parce que coté server il va return false quand même ^^ du coup il va coupé la musique est remettre un autre en boucle sans que la musique soie fini ^^
Est quand tu parler de TE sa va dit ?
(Les TE sont gérés des 2 côtés)
En plus par IMessage je peux pas le faire non plus,
Le updateTick fonctionne que sur server est pas sur client
-
Les TileEntity sont des 2 côtés : client et serveur. Du coup tu peux très bien vérifier dans la méthode updateEntity de ta TE si une musique est jouée. Et comme on te le dit depuis plusieurs messages, occupe toi que du client ^^ Le serveur n’en a rien à faire de ta musique. Du coup rajoute cette condition :
if(this.worldObj.isRemote) -
J’ai déjà teste ^^ le problème c’est que quand le mod est sur le server le client utilise pas la fonction updateTick, il y a que le serveur. j’ai teste avec un System.out.println est il y à que le server qui l’affiche dans le console le client non
-
Est-ce que t’as essayé mon code au moins avant de dire qu’il ne marche pas ? Si c’est le cas, alors packet obligatoire !
-
Juste un problème c’est que le updateTick marche pas sur le client quand j’ajoute le mod sur un server forge.
Il y à que le server qui updateTick le blockJe comprend pas
@Override public void updateTick(World world, int x, int y, int z, Random rand) { if (world.isRemote == true) { System.out.println("Client updateTick"); // Quand le mod est sur le server ça marche pas ! } else { System.out.println("Server updateTick"); } world.markBlockForUpdate(x, y, z); }
-
C’est tout à fait normal. Sur serveur il y a que les fonctions serveurs qui sont exécutés et world.isRemote est toujours faux.
Sur ton client c’est l’inverse.
Et lorsque tu joues en solo tu as les deux, car il y a un serveur intégré qui tourne. -
J’ai trouvé un moyen plus simple, j’ai créer 2 classe pour géré la duré des musique, faut juste l’ajoute dans un fichier json mais du coup ça fonction des 2 coté est j’ai plus besoin de SoundManager. j’ai juste encore quelque problème avec les ticks. parce que le sound s’arrête 3 seconde en avance ^^
Je passerai le code.