Jump to content

[1.9][SOLVED] Toggle Item Use


Lyras

Recommended Posts

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*

Link to comment
Share on other sites

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*

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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



×
×
  • Create New...

Important Information

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