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
  On 4/23/2018 at 9:07 PM, 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 :)

Expand  

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)
  On 4/24/2018 at 6:57 AM, jabelar said:

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

Expand  

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...

 

  On 4/24/2018 at 6:57 AM, 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.

Expand  

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
  On 4/24/2018 at 7:55 PM, 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... ;)

Expand  

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
  On 4/24/2018 at 8:01 PM, 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?

Expand  

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
  On 4/25/2018 at 12:39 PM, 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?

Expand  

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
  On 4/25/2018 at 5:51 PM, 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.

Expand  

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • whenever I try to get this item to render into the game it appears with the not texture purple and black squares and calls itself by the lang translation file path instead of the name i gave it.   { "item.testmod.alexandrite": "Alexandrite" } this is the lang json file package net.Hurst.testmod.item; import net.Hurst.testmod.TestMod; import net.minecraft.world.item.Item; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class ModItems { public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, TestMod.MOD_ID); public static final RegistryObject<Item> ALEXANDRITE = ITEMS.register("alexandrite", () -> new Item(new Item.Properties())); public static void register(IEventBus eventBus){ ITEMS.register(eventBus); } } this is my ModItems.java file package net.Hurst.testmod; import com.mojang.logging.LogUtils; import net.Hurst.testmod.item.ModItems; import net.minecraft.world.item.CreativeModeTabs; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.slf4j.Logger; // The value here should match an entry in the META-INF/mods.toml file @Mod(TestMod.MOD_ID) public class TestMod { public static final String MOD_ID = "testmod"; private static final Logger LOGGER = LogUtils.getLogger(); public TestMod() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); modEventBus.addListener(this::commonSetup); ModItems.register(modEventBus); MinecraftForge.EVENT_BUS.register(this); modEventBus.addListener(this::addCreative); ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.SPEC); } private void commonSetup(final FMLCommonSetupEvent event) { } // Add the example block item to the building blocks tab private void addCreative(BuildCreativeModeTabContentsEvent event) { if(event.getTabKey() == CreativeModeTabs.INGREDIENTS){ event.accept(ModItems.ALEXANDRITE); } } // You can use SubscribeEvent and let the Event Bus discover methods to call @SubscribeEvent public void onServerStarting(ServerStartingEvent event) { } // You can use EventBusSubscriber to automatically register all static methods in the class annotated with @SubscribeEvent @Mod.EventBusSubscriber(modid = MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public static class ClientModEvents { @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { } } } this is my TestMod.java file { "parent": "minecraft:item/generated", "textures": { "layer0": "testmod:item/generated" } } this is my model file for the item. I am using intellij 2025.1.2 with fdk 1.21 and java 21 I would appreciate the help.
    • Also remove VS Create Armor, createbigcannons and The Factory Must Grow
    • Add the latest.log (logs-folder) with sites like https://mclo.gs/ and paste the link to it here  
    • You are using Create 6 - some addons are not compatible with this version - add the addons one by one to find the incompatible ones Or Use Create 5 - but you also have to use older builds of the addons - addons updated March 2025 or later are usually for Create 6  
  • Topics

×
×
  • Create New...

Important Information

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