Jump to content

[1.7.10] [SOLVED]About cover NBT tag.


gkbm2013

Recommended Posts

I have two blocks. And I want to right click blockB to change blockA's NBT tag.

 

 

Here is my cod :

BlockA.java

 

package mod_io.blocks;


import mod_io.TileEntity.TileEntityVisitor;
import mod_io.main.Main;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;


public class BlockA extends BlockContainer {


   public BlockA() {
      super(Material.rock);
      setBlockName("BlockA");
      setCreativeTab(Main.ModIoTabs);
      setHarvestLevel("pickaxe", 1);
      setHardness(3);
   }
   
   public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9)
    {
                if(!world.isRemote)
                {
                        TileEntityA t = (TileEntityA) world.getTileEntity(x, y, z);
                        t.processActivate(par5EntityPlayer, world);
                }
                return true;
    }
   
    public boolean hasTileEntity(int metadata) {
        return true;
    }
    
   @Override
   public TileEntity createNewTileEntity(World world, int par1) {
           try
           {
               return new TileEntityA();
           }
           catch (Exception var3)
           {
               throw new RuntimeException(var3);
           }
   }   


}

TileEntityA.java




package mod_io.TileEntity;


import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChatComponentText;
import net.minecraft.world.World;
import mod_io.mainRegistry.BlockRegistry;


public class TileEntityA extends TileEntity{


   String visitor="none";
    
    public void processActivate(EntityPlayer player, World world) {
            if(!visitor1.equals(player.getDisplayName()))
            {


                    visitor=player.getDisplayName();
            }


            player.addChatMessage(new ChatComponentText("Visitor: " + visitor));
            world.notifyBlockChange(xCoord, yCoord, zCoord, BlockRegistry.ABlock);
    }
    
    @Override
    public void readFromNBT(NBTTagCompound nbt)
{
    super.readFromNBT(nbt);
    this.visitor = nbt.getString("visitor");


}


@Override
public void writeToNBT(NBTTagCompound nbt)
{
    super.writeToNBT(nbt);
    nbt.setString("visitor", visitor);


}
}


 

 

How can I encode in BlokB to change blockA's NBT tag ?

Link to comment
Share on other sites

Do you have some kind of item in hand when clicking the blocks? As Blocks only save NBT tags when placed down as that is when the tile entity is present. A block in hand has no tile entity and no NBT Tags.

 

You might an ItemStack which contains an NBT tag to transfer one block NBT to the other.

 

  • Place Block A (TE NBT = "Hello")
  • Place Block B (TE NBT = "")
  • Put transfer item in hand
  • Right click Block A, data "Hello" is saved to ItemStack NBT
  • Right click Block B, data is transferred from ItemStack to Block B Tile Entity NBT, (TE NBT = "Hello" now)

 

At least that is one way you could do it as there are different ways on what data is used to transfer the NBT tag, I just gave to simplest one I know. You could simply take the coordinates of the block and give them to the second block for processing. Or you could use packets to transfer the data but you would still need some kind of proxy between blocks simly to discover the tile entity coordinates. :)

I require Java, both the coffee and the code :)

Link to comment
Share on other sites

I think this solution would be fine.

 

1. When BlockB is right-clicked, first find nearby BlockA.

2. Get the TileEntity of BlockA. (using IBlockAccess#getTileEntity), and cast it to TileEntityA.

  (You might have to check before casting)

3. Call the NBT-changing method of TileEntityA.

4. In the NBT-changing method, changes the NBT.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

I think this solution would be fine.

 

1. When BlockB is right-clicked, first find nearby BlockA.

2. Get the TileEntity of BlockA. (using IBlockAccess#getTileEntity), and cast it to TileEntityA.

  (You might have to check before casting)

3. Call the NBT-changing method of TileEntityA.

4. In the NBT-changing method, changes the NBT.

 

That would technically work, but what if he has multiple blocks how would he tell which one to set? Or will they always be next to each other?

I require Java, both the coffee and the code :)

Link to comment
Share on other sites

This is the code of block B. But now, I can't right click on it.

This is the code of block B. But when I right click on Block B , it's crash.

package mod_io.blocks;

import mod_io.TileEntity.TileEntityA;
import tinker_io.main.Main;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class BlockB extends BlockContainer {

public BlockB() {
	super(Material.rock);
	setBlockName("blockB");
	setCreativeTab(Main.ModIoTabs);
	setHarvestLevel("pickaxe", 1);
	setHardness(3);
}

private static IBlockAccess access;
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
    {
                

	if(!world.isRemote)
                {
                       TileEntityA t = (TileEntityA) access.getTileEntity(x-1, y, z);
                        
                        if(t != null){
                        	t.processActivate(par5EntityPlayer, world);

                        }
                }
                return true;
    }

    public boolean hasTileEntity(int metadata) {
        return true;
    }
    
@Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
        try
        {
            return new TileEntityA();
        }
        catch (Exception var3)
        {
            throw new RuntimeException(var3);
        }
}   

}

Link to comment
Share on other sites

This is the code of block B. But now, I can't right click on it.

This is the code of block B. But when I right click on Block B , it's crash.

package mod_io.blocks;

import mod_io.TileEntity.TileEntityA;
import tinker_io.main.Main;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class BlockB extends BlockContainer {

public BlockB() {
	super(Material.rock);
	setBlockName("blockB");
	setCreativeTab(Main.ModIoTabs);
	setHarvestLevel("pickaxe", 1);
	setHardness(3);
}

private static IBlockAccess access;
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
    {
                

	if(!world.isRemote)
                {
                       TileEntityA t = (TileEntityA) access.getTileEntity(x-1, y, z);
                        
                        if(t != null){
                        	t.processActivate(par5EntityPlayer, world);

                        }
                }
                return true;
    }

    public boolean hasTileEntity(int metadata) {
        return true;
    }
    
@Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
        try
        {
            return new TileEntityA();
        }
        catch (Exception var3)
        {
            throw new RuntimeException(var3);
        }
}   

}

 

I bet that the TileEntity your getting "TileEntityA t = (TileEntityA) access.getTileEntity(x-1, y, z);" is not a type of TileEntityA, ClassCastException maybe?

 

Can you post your error log, please :)

I require Java, both the coffee and the code :)

Link to comment
Share on other sites

This is the code of block B. But now, I can't right click on it.

This is the code of block B. But when I right click on Block B , it's crash.

package mod_io.blocks;

import mod_io.TileEntity.TileEntityA;
import tinker_io.main.Main;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class BlockB extends BlockContainer {

public BlockB() {
	super(Material.rock);
	setBlockName("blockB");
	setCreativeTab(Main.ModIoTabs);
	setHarvestLevel("pickaxe", 1);
	setHardness(3);
}

private static IBlockAccess access;
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
    {
                

	if(!world.isRemote)
                {
                       TileEntityA t = (TileEntityA) access.getTileEntity(x-1, y, z);
                        
                        if(t != null){
                        	t.processActivate(par5EntityPlayer, world);

                        }
                }
                return true;
    }

    public boolean hasTileEntity(int metadata) {
        return true;
    }
    
@Override
public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) {
        try
        {
            return new TileEntityA();
        }
        catch (Exception var3)
        {
            throw new RuntimeException(var3);
        }
}   

}

 

The issue is that you make your own instance of IBlockAccess and use that, the

World world

that is passed into onBlockActivated implements IBlockAccess. Use that,

Link to comment
Share on other sites

I bet that the TileEntity your getting "TileEntityA t = (TileEntityA) access.getTileEntity(x-1, y, z);" is not a type of TileEntityA, ClassCastException maybe?

 

Can you post your error log, please :)

 

Hi, Here is the crash report

---- Minecraft Crash Report ----
// This doesn't make any sense!

Time: 2015/2/9 下午 7:15
Description: Ticking memory connection

java.lang.NullPointerException: Ticking memory connection
at mod_io.blocks.BlockB.onBlockActivated(BlockB.java:32)
at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:409)
at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Stacktrace:
at mod_io.blocks.BlockB.onBlockActivated(BlockB.java:32)
at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:409)
at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)

-- Ticking connection --
Details:
Connection: net.minecraft.network.NetworkManager@445b2772
Stacktrace:
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)

-- System Details --
Details:
Minecraft Version: 1.7.10
Operating System: Windows 8.1 (amd64) version 6.3
Java Version: 1.7.0_71, Oracle Corporation
Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
Memory: 767651528 bytes (732 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB)
JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used
IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
FML: MCP v9.05 FML v7.10.85.1277 Minecraft Forge 10.13.2.1277 9 mods loaded, 9 mods active
mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
FML{7.10.85.1277} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.2.1277.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
Forge{10.13.2.1277} [Minecraft Forge] (forgeSrc-1.7.10-10.13.2.1277.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
CodeChickenCore{1.0.4.29} [CodeChicken Core] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
NotEnoughItems{1.0.3.74} [Not Enough Items] (NotEnoughItems-1.7.10-1.0.3.74-dev.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
Waila{1.5.7} [Waila] (Waila-1.5.7_1.7.10.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
Mantle{1.7.10-0.3.2.jenkins184} [Mantle] (Mantle-1.7.10-0.3.2.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
TConstruct{1.7.10-1.8.2.build858} [Tinkers' Construct] (TConstruct-1.7.10-1.8.2a.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
mod_io{beta 1.0.0} [Tinker I/O] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
Mantle Environment: Environment healthy.
TConstruct Environment: Environment healthy.
Profiler Position: N/A (disabled)
Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used
Player Count: 1 / 8; [EntityPlayerMP['Player156'/132, l='Tinker IO Testing Word', x=1152.38, y=56.00, z=-576.87]]
Type: Integrated Server (map_client.txt)
Is Modded: Definitely; Client brand changed to 'fml,forge'

Link to comment
Share on other sites

The issue is that you make your own instance of IBlockAccess and use that, the

World world

that is passed into onBlockActivated implements IBlockAccess. Use that,

 

When I click Block B,it's called processActivate and work smoothly. And how can I designate the value in BlockB.java ?

Link to comment
Share on other sites

When I click Block B,it's called processActivate and work smoothly. And how can I designate the value in BlockB.java ?

... I said:

(You might have to check before casting)

& World class implements the IBlockAccess, so you can use the parameter "world" of the method "onBlockActivated".

 

You have to check first before casting, that if it is null or it is not instance of TileEntityA.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

... I said:

(You might have to check before casting)

& World class implements the IBlockAccess, so you can use the parameter "world" of the method "onBlockActivated".

 

You have to check first before casting, that if it is null or it is not instance of TileEntityA.

 

Like this?

 


public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
    {
                

	if(!world.isRemote)
                {
                       TileEntityA t = (TileEntityA) world.getTileEntity(x-1, y, z);
                        
                        if(t != null){
                        	t.processActivate(par5EntityPlayer, world);
                        }
                }
                return true;
    }

Link to comment
Share on other sites

I said:

You have to check first before casting, that if it is null or it is not instance of TileEntityA.

 

You have to check if the tileentity is your tile entity. try instanceof TileEntityA

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

I said:

You have to check first before casting, that if it is null or it is not instance of TileEntityA.

 

You have to check if the tileentity is your tile entity. try instanceof TileEntityA

 

Okay... Now, when I click block B, Block B can get NBT Tag form Block C and covered the NBT Tag of Block A.

 

 

But I don't want to use other blocks to cover the NBT Tag of Block A.

What should I do?

 

Link to comment
Share on other sites

 

Okay... Now, when I click block B, Block B can get NBT Tag form Block C and covered the NBT Tag of Block A.

 

 

But I don't want to use other blocks to cover the NBT Tag of Block A.

What should I do?

 

What is Block C, and what do you mean by "cover the NBT Tag of Block A"?

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

 

Okay... Now, when I click block B, Block B can get NBT Tag form Block C and covered the NBT Tag of Block A.

 

 

But I don't want to use other blocks to cover the NBT Tag of Block A.

What should I do?

 

What is Block C, and what do you mean by "cover the NBT Tag of Block A"?

Sorry for my poor English...

 

jrbdZWg.png

Block C is other block which next to Block B.

 

When I click Block B, it will get the NBT Tag form block C and write the NBT Tag of Block C into Block A .

 

Link to comment
Share on other sites

So.. What do you want? Getting the NBT Tag form block C and write the NBT Tag of Block C into Block A?

or just modifying NBT of Block B?

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

So is this what you want? :

when right click blockB, change the NBT Tag of blockA in specific way?

or using some information of blockB?

 

How do you modify the NBT Tag of blockA? You have to clarify your demand.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

So is this what you want? :

when right click blockB, change the NBT Tag of blockA in specific way?

or using some information of blockB?

 

How do you modify the NBT Tag of blockA? You have to clarify your demand.

 

 

When I click Block B, it will get the NBT Tag form Block A. And the NBT Tag of Block A will be adjusted then save into Block A.

For example, the value of block A is 35 . When I click Block B, it will get the value "35" , and the value will be subtract by 5, then save into Block A.

Link to comment
Share on other sites

Then what is problem? Just use your previous code in onBlockActivated.

If you want to change NBT of all nearby blockAs of blockB,

then you need to check all nearby blocks if it is BlockA.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

But , when Block B get the value , how can I edit the value  ??

What? Didn't you say that you want to modify "BlockA"'s NBT value?

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

But , when Block B get the value , how can I edit the value  ??

What? Didn't you say that you want to modify "BlockA"'s NBT value?

 

YES, I want to modify the NBT Tag of block A ...

When Block B get the value of block A , I want to edit it and save the new value into block A.

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.