Jump to content

Recommended Posts

Posted (edited)

Hello!

I would like to know how can I "detect" if the block is water (flowing and static).

        if (worldIn.[??????](???))

{

}

So I would like to know if I can replace [?] by something to detect a water block.

Thank you for your help!

Edited by iKreal
[SOLVED]
Posted

getBlockState(pos)

Where pos is a BlockPos representing the location in the world you want to check

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Hhmm I would like to test "if the player is facing a water block", whereas there, you get the blockstate and after?

I tried this:

	            if (worldIn.isBlockTickPending(pos, Blocks.WATER))
	

But it doesn't work...

More help please?

Thank you very much :)

Posted

Ok thank you but what is the code to get the IBlockState of the block I'm facing? You said it's (World::getBlockState) but what have I to write on the line exactly? :|

Thanks for your answers!

Posted

Yes, in fact I would like to do an item that you can use (like a flint and steel).

This is my code:

	 public EnumActionResult onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
        {
            pos = pos.offset(facing);
            
            if ".........."
            {
                    worldIn.playSound(playerIn, pos, SoundEvents.ENTITY_PLAYER_SPLASH, SoundCategory.PLAYERS, 1.0F, itemRand.nextFloat() * 0.4F + 0.8F);
                    worldIn.spawnEntityInWorld(new EntityItem(worldIn, playerIn.posX, playerIn.posY, playerIn.posZ, new ItemStack(net.dev.premiermod.init.ModItems.speck_gold, 1)));
                stack.damageItem(1, playerIn);
            return EnumActionResult.SUCCESS;
            }
            else
            {
                return EnumActionResult.FAIL;
                
            }
            
            }
	

And I need to fix the problem with the condition "if the block is water"

Posted

Hhmmm I've had a look at the empty bucket class, I found this:

	 public ActionResult<ItemStack> onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn, EnumHand hand)
    {
        boolean flag = this.containedBlock == Blocks.AIR;
        RayTraceResult raytraceresult = this.rayTrace(worldIn, playerIn, flag);
        ActionResult<ItemStack> ret = net.minecraftforge.event.ForgeEventFactory.onBucketUse(playerIn, worldIn, itemStackIn, raytraceresult);
        if (ret != null) return ret;
	        if (raytraceresult == null)
        {
            return new ActionResult(EnumActionResult.PASS, itemStackIn);
        }
        else if (raytraceresult.typeOfHit != RayTraceResult.Type.BLOCK)
        {
            return new ActionResult(EnumActionResult.PASS, itemStackIn);
        }
        else
        {
            BlockPos blockpos = raytraceresult.getBlockPos();
	            if (!worldIn.isBlockModifiable(playerIn, blockpos))
            {
                return new ActionResult(EnumActionResult.FAIL, itemStackIn);
            }
            else if (flag)
            {
                if (!playerIn.canPlayerEdit(blockpos.offset(raytraceresult.sideHit), raytraceresult.sideHit, itemStackIn))
                {
                    return new ActionResult(EnumActionResult.FAIL, itemStackIn);
                }
                else
                {
                    IBlockState iblockstate = worldIn.getBlockState(blockpos);
                    Material material = iblockstate.getMaterial();
	                    if (material == Material.WATER && ((Integer)iblockstate.getValue(BlockLiquid.LEVEL)).intValue() == 0)
                    {
                        worldIn.setBlockState(blockpos, Blocks.AIR.getDefaultState(), 11);
                        playerIn.addStat(StatList.getObjectUseStats(this));
                        playerIn.playSound(SoundEvents.ITEM_BUCKET_FILL, 1.0F, 1.0F);
                        return new ActionResult(EnumActionResult.SUCCESS, this.fillBucket(itemStackIn, playerIn, Items.WATER_BUCKET));
                    }
                    else if (material == Material.LAVA && ((Integer)iblockstate.getValue(BlockLiquid.LEVEL)).intValue() == 0)
                    {
                        playerIn.playSound(SoundEvents.ITEM_BUCKET_FILL_LAVA, 1.0F, 1.0F);
                        worldIn.setBlockState(blockpos, Blocks.AIR.getDefaultState(), 11);
                        playerIn.addStat(StatList.getObjectUseStats(this));
                        return new ActionResult(EnumActionResult.SUCCESS, this.fillBucket(itemStackIn, playerIn, Items.LAVA_BUCKET));
                    }
                    else
                    {
                        return new ActionResult(EnumActionResult.FAIL, itemStackIn);
                    }
                }
            }
            else
            {
                boolean flag1 = worldIn.getBlockState(blockpos).getBlock().isReplaceable(worldIn, blockpos);
                BlockPos blockpos1 = flag1 && raytraceresult.sideHit == EnumFacing.UP ? blockpos : blockpos.offset(raytraceresult.sideHit);
	                if (!playerIn.canPlayerEdit(blockpos1, raytraceresult.sideHit, itemStackIn))
                {
                    return new ActionResult(EnumActionResult.FAIL, itemStackIn);
                }
                else if (this.tryPlaceContainedLiquid(playerIn, worldIn, blockpos1))
                {
                    playerIn.addStat(StatList.getObjectUseStats(this));
                    return !playerIn.capabilities.isCreativeMode ? new ActionResult(EnumActionResult.SUCCESS, new ItemStack(Items.BUCKET)) : new ActionResult(EnumActionResult.SUCCESS, itemStackIn);
                }
                else
                {
                    return new ActionResult(EnumActionResult.FAIL, itemStackIn);
                }
            }
        }
    }
	

The problem is that the method used is "onBucketUse", and if I replace it with "onItemRightClick", there is no the arguments "blockpos" anymore and you said that i can't use that.

Can you help me a bit more please? :S

Thank you very much :)

Posted (edited)

I worked on that, and I have this:

	 public EnumActionResult onItemRightClick(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
        {
                IBlockState iblockstate = worldIn.getBlockState(pos);
                Block block = iblockstate.getBlock();
	                if (worldIn.getBlockState(pos.up()).getMaterial() == Material.AIR && block == Blocks.WATER || block == Blocks.FLOWING_WATER)
                {
                    worldIn.playSound(playerIn, pos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
	                    if(!worldIn.isRemote) {
                        worldIn.spawnEntityInWorld(new EntityItem(worldIn, playerIn.posX, playerIn.posY, playerIn.posZ, new ItemStack(net.dev.premiermod.init.ModItems.speck_gold, 1)));
                        stack.damageItem(1, playerIn);
                    }
	                    return EnumActionResult.SUCCESS;
                }
                else
                {
                    return EnumActionResult.PASS;
                }
            }
	

Although, it doesn't work! Could you find the problem?

Thank you for your help :)

Edited by iKreal
Posted
9 hours ago, iKreal said:

I worked on that, and I have this:Although, it doesn't work! Could you find the problem?

Thank you for your help :)

What do you mean it "doesn't work"?

 

And have you done regular debug. Like did you either use print statements to trace the execution to see what your code is doing, or did you use breakpoints and debug mode in Eclipse. If you want to know why code isn't working, simply follow the execution and see if it is doing what you expect.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Posted (edited)
1 hour ago, jabelar said:

What do you mean it "doesn't work"?

Err... I mean when I click with the item in the hand (right click) on water, there is no sound and I don't get "speckles of gold"...

So the "system" doesn't work...

 

1 hour ago, jabelar said:

And have you done regular debug. Like did you either use print statements to trace the execution to see what your code is doing, or did you use breakpoints and debug mode in Eclipse. If you want to know why code isn't working, simply follow the execution and see if it is doing what you expect.

Ok I'll try this but it seems a little hard for me. I'll see!

Anyway, thanks for your response. :)

 

Edit: I launched a debug "mode" and this is the console log:

	[10:26:16] [main/INFO] [GradleStart]: Extra: []
[10:26:16] [main/INFO] [GradleStart]: Running with arguments: [--userProperties, {}, --assetsDir, C:/Users/antoi_000/.gradle/caches/minecraft/assets, --assetIndex, 1.10, --accessToken{REDACTED}, --version, 1.10.2, --tweakClass, net.minecraftforge.fml.common.launcher.FMLTweaker, --tweakClass, net.minecraftforge.gradle.tweakers.CoremodTweaker]
[10:26:16] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
[10:26:17] [main/INFO] [LaunchWrapper]: Using primary tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
[10:26:17] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.CoremodTweaker
[10:26:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLTweaker
[10:26:17] [main/INFO] [FML]: Forge Mod Loader version 12.18.3.2185 for Minecraft 1.10.2 loading
[10:26:17] [main/INFO] [FML]: Java is Java HotSpot(TM) 64-Bit Server VM, version 1.8.0_171, running on Windows 10:amd64:10.0, installed at C:\Program Files\Java\jre1.8.0_171
[10:26:17] [main/INFO] [FML]: Managed to load a deobfuscated Minecraft name- we are in a deobfuscated environment. Skipping runtime deobfuscation
[10:26:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.CoremodTweaker
[10:26:17] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.fml.relauncher.FMLCorePlugin
[10:26:17] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.classloading.FMLForgePlugin
[10:26:17] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[10:26:17] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
[10:26:17] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
[10:26:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[10:26:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
[10:26:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
[10:26:17] [main/ERROR] [FML]: The binary patch set is missing. Either you are in a development environment, or things are not going to work!
[10:26:21] [main/ERROR] [FML]: FML appears to be missing any signature data. This is not a good thing
[10:26:21] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
[10:26:21] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
[10:26:22] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
[10:26:22] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.TerminalTweaker
[10:26:22] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.TerminalTweaker
[10:26:22] [main/INFO] [LaunchWrapper]: Launching wrapped minecraft {net.minecraft.client.main.Main}
2018-04-24 10:26:24,626 WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
2018-04-24 10:26:24,682 WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
2018-04-24 10:26:24,686 WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
[10:26:25] [Client thread/INFO]: Setting user: Player348
[10:26:34] [Client thread/WARN]: Skipping bad option: lastServer:
[10:26:34] [Client thread/INFO]: LWJGL Version: 2.9.4
[10:26:37] [Client thread/INFO] [STDOUT]: [net.minecraftforge.fml.client.SplashProgress:start:221]: ---- Minecraft Crash Report ----
// Hey, that tickles! Hehehe!
	Time: 24/04/18 10:26
Description: Loading screen debug info
	This is just a prompt for computer specs to be printed. THIS IS NOT A ERROR
	
A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------
	-- System Details --
Details:
    Minecraft Version: 1.10.2
    Operating System: Windows 10 (amd64) version 10.0
    Java Version: 1.8.0_171, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 171791432 bytes (163 MB) / 392691712 bytes (374 MB) up to 913833984 bytes (871 MB)
    JVM Flags: 0 total; 
    IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
    FML: 
    Loaded coremods (and transformers): 
    GL info: ' Vendor: 'Intel' Version: '4.0.0 - Build 10.18.10.4358' Renderer: 'Intel(R) HD Graphics 4000'
[10:26:37] [Client thread/INFO] [FML]: MinecraftForge v12.18.3.2185 Initialized
[10:26:37] [Client thread/INFO] [FML]: Replaced 231 ore recipes
[10:26:38] [Client thread/INFO] [FML]: Found 0 mods from the command line. Injecting into mod discoverer
[10:26:38] [Client thread/INFO] [FML]: Searching C:\Users\antoi_000\Desktop\Minecraft\Mes mods\PremierMod\run\mods for mods
[10:26:42] [Client thread/INFO] [FML]: Forge Mod Loader has identified 4 mods to load
[10:26:42] [Client thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, premod] at CLIENT
[10:26:42] [Client thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, premod] at SERVER
[10:26:45] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Premier Mod
[10:26:45] [Client thread/INFO] [FML]: Processing ObjectHolder annotations
[10:26:45] [Client thread/INFO] [FML]: Found 423 ObjectHolder annotations
[10:26:45] [Client thread/INFO] [FML]: Identifying ItemStackHolder annotations
[10:26:45] [Client thread/INFO] [FML]: Found 0 ItemStackHolder annotations
[10:26:45] [Client thread/INFO] [FML]: Applying holder lookups
[10:26:45] [Client thread/INFO] [FML]: Holder lookups applied
[10:26:45] [Client thread/INFO] [FML]: Applying holder lookups
[10:26:45] [Client thread/INFO] [FML]: Holder lookups applied
[10:26:45] [Client thread/INFO] [FML]: Applying holder lookups
[10:26:45] [Client thread/INFO] [FML]: Holder lookups applied
[10:26:45] [Client thread/INFO] [FML]: Configured a dormant chunk cache size of 0
[10:26:45] [Forge Version Check/INFO] [ForgeVersionCheck]: [Forge] Starting version check at http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json
[10:26:45] [Client thread/INFO] [FML]: Applying holder lookups
[10:26:45] [Client thread/INFO] [FML]: Holder lookups applied
[10:26:45] [Client thread/INFO] [FML]: Injecting itemstacks
[10:26:45] [Client thread/INFO] [FML]: Itemstack injection complete
[10:26:46] [Forge Version Check/INFO] [ForgeVersionCheck]: [Forge] Found status: UP_TO_DATE Target: null
[10:27:23] [Sound Library Loader/INFO]: Starting up SoundSystem...
[10:27:23] [Thread-8/INFO]: Initializing LWJGL OpenAL
[10:27:23] [Thread-8/INFO]: (The LWJGL binding of OpenAL.  For more information, see http://www.lwjgl.org)
[10:27:24] [Thread-8/INFO]: OpenAL initialized.
[10:27:24] [Sound Library Loader/INFO]: Sound engine started
[10:27:32] [Client thread/INFO] [FML]: Max texture size: 8192
[10:27:32] [Client thread/INFO]: Created: 16x16 textures-atlas
[10:27:35] [Client thread/INFO] [FML]: Injecting itemstacks
[10:27:35] [Client thread/INFO] [FML]: Itemstack injection complete
[10:27:36] [Client thread/INFO] [FML]: Forge Mod Loader has successfully loaded 4 mods
[10:27:36] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:Premier Mod
[10:28:01] [Client thread/INFO]: SoundSystem shutting down...
[10:28:01] [Client thread/WARN]: Author: Paul Lamb, www.paulscode.com
[10:28:01] [Sound Library Loader/INFO]: Starting up SoundSystem...
[10:28:02] [Thread-10/INFO]: Initializing LWJGL OpenAL
[10:28:02] [Thread-10/INFO]: (The LWJGL binding of OpenAL.  For more information, see http://www.lwjgl.org)
[10:28:02] [Thread-10/INFO]: OpenAL initialized.
[10:28:02] [Sound Library Loader/INFO]: Sound engine started
[10:28:09] [Client thread/INFO] [FML]: Max texture size: 8192
[10:28:09] [Client thread/INFO]: Created: 512x512 textures-atlas
[10:28:11] [Client thread/WARN]: Skipping bad option: lastServer:
[10:28:13] [Realms Notification Availability checker #1/INFO]: Could not authorize you against Realms server: Invalid session id
	

I don't see any error...

So how can I do to check the code?

 

2nd Edit: I launched the Client with Coverage and in the following lines, a line has been missed:

	 IBlockState iblockstate = worldIn.getBlockState(pos);
                Block block = iblockstate.getBlock();
	                if (worldIn.getBlockState(pos.up()).getMaterial() == Material.AIR && block == Blocks.WATER || block == Blocks.FLOWING_WATER)
                {
                    worldIn.playSound(playerIn, pos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
	                    if(!worldIn.isRemote) {
                        worldIn.spawnEntityInWorld(new EntityItem(worldIn, playerIn.posX, playerIn.posY, playerIn.posZ, new ItemStack(net.dev.premiermod.init.ModItems.speck_gold, 1)));
                        stack.damageItem(1, playerIn);
                }
	                    return EnumActionResult.SUCCESS;
                }
                else
                {
                    return EnumActionResult.PASS;
	

...This line:

                if (worldIn.getBlockState(pos.up()).getMaterial() == Material.AIR && block == Blocks.WATER || block == Blocks.FLOWING_WATER)

It's written "All 6 branched missed."...

I don't know how to fix that.

And this is the Coverage (I don't know what it represents):

instructions.JPG

 

Thanks for your help! :)

Edited by iKreal
Posted

Okay, that wasn't quite what I meant by debug mode. Assuming you're using Eclipse you would set a breakpoint (google how to do that) on the first line of code in your onItemRightClick() method. Then use a debug run configuration to run the game. Eclipse should then reorganize into a debug view and what will happen is that you can start to play but as soon as you do a right click interaction with your item the execution of the game should halt and a bunch of information should show up in Eclipse that allows you to see what the values of all the fields are. Then there are buttons in Eclipse that allow you to progress one "step" at time (meaning one line of code) and again you can check what is happening.

 

If that is too advanced for you, the other way is to add your own console print statements to give you information about what is going on. For example, using your previous code as an example, I would do something like this:

 

	 public EnumActionResult onItemRightClick(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
        {
                System.out.println("onItemRightClick with item = "+stack.getItem()+" at position = "+pos);
                IBlockState iblockstate = worldIn.getBlockState(pos);
                Block block = iblockstate.getBlock();
	        if (worldIn.getBlockState(pos.up()).getMaterial() == Material.AIR && block == Blocks.WATER || block == Blocks.FLOWING_WATER)
                {
                    System.out.println("Condition met -- block pos is surface water");
                    worldIn.playSound(playerIn, pos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
	                    if(!worldIn.isRemote) {
                        worldIn.spawnEntityInWorld(new EntityItem(worldIn, playerIn.posX, playerIn.posY, playerIn.posZ, new ItemStack(net.dev.premiermod.init.ModItems.speck_gold, 1)));
                        stack.damageItem(1, playerIn);
                    }
	            return EnumActionResult.SUCCESS;
                }
                else
                {
                    System.out.println("Condition not met -- block pos isn't surface water");
                    return EnumActionResult.PASS;
                }
            }

 

With the added lines above, run the game normally but look at the console when you right click. It will tell you firstly whether your code is running at all and secondly it will tell you which code path it is taking. Depending on what you see, then you can dig in further to figure out what is going wrong.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Posted (edited)

Hi,

Thank you so much for your help.

Although, no any message is displayed when I right click with the item. So the problem is at start... and it's frightening...

The class of the item contains exactly this:

	package net.dev.premiermod.items;
	import net.minecraft.block.Block;
	import net.minecraft.block.material.Material;
	import net.minecraft.block.state.IBlockState;
	import net.minecraft.creativetab.CreativeTabs;
	import net.minecraft.entity.item.EntityItem;
	import net.minecraft.entity.player.EntityPlayer;
	import net.minecraft.init.Blocks;
	import net.minecraft.init.SoundEvents;
	import net.minecraft.item.Item;
	import net.minecraft.item.ItemStack;
	import net.minecraft.util.EnumActionResult;
	import net.minecraft.util.EnumFacing;
	import net.minecraft.util.EnumHand;
	import net.minecraft.util.SoundCategory;
	import net.minecraft.util.math.BlockPos;
	import net.minecraft.world.World;
	public class pan extends Item {
	    public pan() {
        this.maxStackSize = 1;
        this.setMaxDamage(40);
        this.setCreativeTab(CreativeTabs.TOOLS);
        this.setRegistryName("pan");
        this.setUnlocalizedName("pan");
        
    }
	 
	 public EnumActionResult onItemRightClick(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
     {
             System.out.println("onItemRightClick with item = "+stack.getItem()+" at position = "+pos);
             IBlockState iblockstate = worldIn.getBlockState(pos);
             Block block = iblockstate.getBlock();
            if (worldIn.getBlockState(pos.up()).getMaterial() == Material.AIR && block == Blocks.WATER || block == Blocks.FLOWING_WATER)
             {
                 System.out.println("Condition met -- block pos is surface water");
                 worldIn.playSound(playerIn, pos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
                        if(!worldIn.isRemote) {
                     worldIn.spawnEntityInWorld(new EntityItem(worldIn, playerIn.posX, playerIn.posY, playerIn.posZ, new ItemStack(net.dev.premiermod.init.ModItems.speck_gold, 1)));
                     stack.damageItem(1, playerIn);
                 }
                return EnumActionResult.SUCCESS;
             }
             else
             {
                 System.out.println("Condition not met -- block pos isn't surface water");
                 return EnumActionResult.PASS;
             }
         }
   
        }
    

So what should I do? It's in principle an easy "system" but it doesn't work.  ???

Thanks for the future helps :)

 

EDIT: I tried to replace "blocks.WATER" and "blocks.FLOWING_WATER" with "blocks.GRASS", and it works!! :D But the current problem is how will I do??

Edited by iKreal
Posted (edited)

Okay, so I think the problem goes back to what someone said earlier -- the regular right click does not interact with the fluid block. So you need to look at how the buckets do it. So look at the ItemBucket source code.

 

I looked at it briefly and here is what I think. I think that the position that is passed to the onItemRightClick() method isn't right in the case of water. So what the bucket code does its own "ray trace" to double check if there is any water in the path to the position.

 

You might be able to mostly copy the code for the bucket, but instead of filling the bucket and replacing the water with air you can do whatever you want with your item.

Edited by jabelar

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Posted

Hi,

i tried to copy the code and change it but actually I'm lost '-'

This is the code:

	public ActionResult<ItemStack> onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn, EnumHand hand)
    {
        RayTraceResult raytraceresult = this.rayTracePan(worldIn, playerIn);
        ActionResult<ItemStack> ret = onPanUse(playerIn, worldIn, itemStackIn, raytraceresult);
        if (ret != null) return ret;
	        if (raytraceresult == null)
        {
            return new ActionResult<ItemStack>(EnumActionResult.PASS, itemStackIn);
        }
        else if (raytraceresult.typeOfHit != RayTraceResult.Type.BLOCK)
        {
            return new ActionResult<ItemStack>(EnumActionResult.PASS, itemStackIn);
        }
        else
        {
            BlockPos blockpos = raytraceresult.getBlockPos();
	            { 
                if (!playerIn.canPlayerEdit(blockpos.offset(raytraceresult.sideHit), raytraceresult.sideHit, itemStackIn))
                {
                    return new ActionResult<ItemStack>(EnumActionResult.FAIL, itemStackIn);
                }
                else
                {
                    IBlockState iblockstate = worldIn.getBlockState(blockpos);
                    Material material = iblockstate.getMaterial();
	                    if (material == Material.WATER && ((Integer)iblockstate.getValue(BlockLiquid.LEVEL)).intValue() == 0)
                    {
                        worldIn.spawnEntityInWorld(new EntityItem(worldIn, playerIn.posX, playerIn.posY, playerIn.posZ, new ItemStack(net.dev.premiermod.init.ModItems.speck_gold, 1)));
                          worldIn.playSound(playerIn, blockpos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
                          itemStackIn.damageItem(1, playerIn);
                    }
                    
                    else
                    {
                        return new ActionResult<ItemStack>(EnumActionResult.FAIL, itemStackIn);
                    }
                
                }
            }
        }
        return ret;
    }
	    private ActionResult<ItemStack> onPanUse(EntityPlayer playerIn, World worldIn, ItemStack itemStackIn,
            RayTraceResult raytraceresult) {
        // TODO Auto-generated method stub
        return null;
    }
	    private RayTraceResult rayTracePan(World worldIn, EntityPlayer playerIn) {
        // TODO Auto-generated method stub
        return null;
    }
	

I don't understand a lot of lines, so could you help me to delete ones and to modify things wrong please? I know I'm a dimwit... but I really want that thing works!!

Thanks for your help :)

Posted (edited)

I would like to get a piece of speckles of gold. In fact, I would like to get randomly speckles, for example:

5% speckles of diamond

50% speckles of iron

35% speckles of gold

4% speckles of emerald

And the percents aren't complementary, so you can get speckles of iron and speckles of gold with one right click.

The item is a (miner's) pan, to get speckles from water... ;)

Edited by iKreal
Posted
4 minutes ago, iKreal said:

I would like to get a piece of speckles of gold. In fact, I would like to get randomly speckles, for example:

5% speckles of diamond

50% speckles of iron

35% speckles of gold

4% speckles of emerald

And the percents aren't complementary, so you can get speckles of iron and speckles of gold with one right click.

The item is a (miner's) pan, to get speckles from water... ;)

Question:

Is your speckles related to ore nearby, or is it just a chance to get "some speckles" of that material, which can then be crafted/smelted into ingots?

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted
3 minutes ago, Draco18s said:

Question:

Is your speckles related to ore nearby, or is it just a chance to get "some speckles" of that material, which can then be crafted/smelted into ingots?

It's simply a chance to get "some speckles" of some materials :) (it's not really logic but it's cool, isn't it?)

Posted

Just checking. Because I've worked on mechanics to get nearby ores and only do "speckles" of those ores.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Ok it looks cool but hard, and it is not my goal :)

And it would be very sympathetic if you could help me about the code, because I'm stuck.. Maybe you have the solution?

Thank you :D

Posted

Ok, I'll change the operation. I would like to detect a right click on dirt, gravel, sand, coarse dirt, clay on water. So I put this code:

	public EnumActionResult onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
    {
        if (!playerIn.canPlayerEdit(pos.offset(facing), facing, stack))
        {
            return EnumActionResult.FAIL;
        }
        else
        {
            IBlockState iblockstate = worldIn.getBlockState(pos);
            Block block = iblockstate.getBlock();
	            if (facing != EnumFacing.DOWN && worldIn.getBlockState(pos.up()).getMaterial() == Material.WATER && (block == Blocks.DIRT || block == Blocks.GRAVEL || block == Blocks.SAND || block == Blocks.CLAY))
            {
                
                worldIn.spawnEntityInWorld(new EntityItem(worldIn, playerIn.posX, playerIn.posY, playerIn.posZ, new ItemStack(net.dev.premiermod.init.ModItems.speck_gold, 1)));
                worldIn.playSound(playerIn, pos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
	                if (!worldIn.isRemote)
                {
                    stack.damageItem(1, playerIn);
                }
	                return EnumActionResult.SUCCESS;
            }
            else
            {
                return EnumActionResult.PASS;
            }
        }
    }
	

It's more simple, and it works! But I didn't tell you one other problem... There are 2 items which spawn, including one that we cannot pick up and we can't kill it...

Do you know what's the problem there? Or maybe we can give the item instead of summoning it?

:) 

Posted
5 hours ago, iKreal said:

There are 2 items which spawn, including one that we cannot pick up and we can't kill it...

Do you know what's the problem there?

It's a ghost item. You spawned it on the client.

Because only the client knows about it, it can't be picked up (server action) or killed (server action). If you log out and log in again, it'll be gone.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted
13 minutes ago, Draco18s said:

It's a ghost item. You spawned it on the client.

Because only the client knows about it, it can't be picked up (server action) or killed (server action). If you log out and log in again, it'll be gone.

So how can I do to don't spawn it? I don't understand "You spawned it on the client" ???

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.