Posted June 26, 20169 yr Hey, I made a "pan-flute" and it works. But there is a little problem: When I press very often, the flute sounds crappy because the sounds overlap... How can I toggle the "item use"? I mean, that just every second or something like that, a sound can be played. package item; import handler.SoundHandler; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; import net.minecraft.world.World; import proxy.SoundRegistry; public class ItemPanFlute extends ItemBase { public ItemPanFlute () { super( "pan_flute" , false ); this.setCreativeTab( CreativeTabs.tabTools ); } @Override public ActionResult < ItemStack > onItemRightClick ( ItemStack itemStack , World world , EntityPlayer player , EnumHand hand ) { float rotationPitch = ( ( - ( player.rotationPitch ) ) / 360 ); float soundPitch = ( float ) ( rotationPitch + 1.125 ); if ( !player.isSneaking() ) { SoundHandler.playSoundInRadius( player , 25 , SoundRegistry.record_flute , 1 , soundPitch ); } else { SoundHandler.playSoundInRadius( player , 25 , SoundRegistry.record_flute , 1 , ( float ) ( soundPitch + 0.25 ) ); } return super.onItemRightClick( itemStack , world , player , hand ); } } *Hug*
June 26, 20169 yr Author package item; import handler.SoundHandler; import net.minecraft.client.Minecraft; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; import net.minecraft.world.World; import proxy.SoundRegistry; public class ItemPanFlute extends ItemBase { public ItemPanFlute () { super( "pan_flute" , false ); this.setCreativeTab( CreativeTabs.tabTools ); this.setMaxStackSize( 1 ); this.setMaxDamage( 500 ); } @Override public ActionResult < ItemStack > onItemRightClick ( ItemStack itemstack , World world , EntityPlayer player , EnumHand hand ) { try { if ( itemstack.getTagCompound().hasNoTags() || ( world.getTotalWorldTime() - itemstack.getTagCompound().getLong( "world_time" ) ) >= 20 ) { float rotationPitch = ( ( - ( player.rotationPitch ) ) / 360 ); float soundPitch = ( float ) ( rotationPitch + 1.125 ); if ( !player.isSneaking() ) { SoundHandler.playSoundInRadius( player , 25 , SoundRegistry.record_flute , 1 , soundPitch ); } else { SoundHandler.playSoundInRadius( player , 25 , SoundRegistry.record_flute , 1 , ( float ) ( soundPitch + 0.25 ) ); } itemstack.getTagCompound().setLong( "world_time" , world.getTotalWorldTime() ); itemstack.damageItem( 1 , player ); } } catch ( Exception ex ) {} return super.onItemRightClick( itemstack , world , player , hand ); } @Override public void onUpdate ( ItemStack itemstack , World world , Entity entity , int metadata , boolean bool ) { if ( itemstack.getTagCompound() == null ) { itemstack.setTagCompound( new NBTTagCompound() ); } } } I did what you said and it worked, thank you Incidentally, I have noticed that the click method is called 2 times per click and sometimes a "ConcurrentModificationException" gets thrown. And that's because I want the click method just to call 1 time each click. xP java.util.ConcurrentModificationException at com.google.common.collect.HashBiMap$Itr.checkForConcurrentModification(HashBiMap.java:339) at com.google.common.collect.HashBiMap$Itr.hasNext(HashBiMap.java:345) at net.minecraft.client.audio.SoundManager.updateAllSounds(SoundManager.java:266) at net.minecraft.client.audio.SoundHandler.update(SoundHandler.java:269) at net.minecraft.client.Minecraft.runTick(Minecraft.java:1891) at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1114) at net.minecraft.client.Minecraft.run(Minecraft.java:401) at net.minecraft.client.main.Main.main(Main.java:118) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) at GradleStart.main(GradleStart.java:26) Can you help me there? This would be pretty nice. Danke im Vorraus Grüße, Lyras *Hug*
June 26, 20169 yr It's called once on the client and once on the server. Only damage the item, change NBT, etc. on the server (when the world is NOT remote), and play sound for the player to hear on the client. If you want others to hear the sound, you can also initiate a sound on the server view World#playSoundEffect or something like that and it will propagate to nearby clients. http://i.imgur.com/NdrFdld.png[/img]
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.