[1.7.10 ] [SoundManager] Petit problème pour récupérer une information.
-
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.