gkbm2013 Posted February 9, 2015 Posted February 9, 2015 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 ? Quote
Belpois Posted February 9, 2015 Posted February 9, 2015 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. Quote I require Java, both the coffee and the code
gkbm2013 Posted February 9, 2015 Author Posted February 9, 2015 Thanks for Belpois's proposal ! But I can't find any tutorial for packet. Quote
Abastro Posted February 9, 2015 Posted February 9, 2015 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. Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
Belpois Posted February 9, 2015 Posted February 9, 2015 On 2/9/2015 at 9:24 AM, Abastro said: 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? Quote I require Java, both the coffee and the code
gkbm2013 Posted February 9, 2015 Author Posted February 9, 2015 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); } } } Quote
Belpois Posted February 9, 2015 Posted February 9, 2015 On 2/9/2015 at 9:52 AM, gkbm2013 said: 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 Quote I require Java, both the coffee and the code
tattyseal Posted February 9, 2015 Posted February 9, 2015 On 2/9/2015 at 9:52 AM, gkbm2013 said: 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, Quote
gkbm2013 Posted February 9, 2015 Author Posted February 9, 2015 Quote 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' Quote
gkbm2013 Posted February 9, 2015 Author Posted February 9, 2015 Quote 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 ? Quote
Abastro Posted February 10, 2015 Posted February 10, 2015 On 2/9/2015 at 1:21 PM, gkbm2013 said: When I click Block B,it's called processActivate and work smoothly. And how can I designate the value in BlockB.java ? ... I said: Quote (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. Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
gkbm2013 Posted February 10, 2015 Author Posted February 10, 2015 On 2/10/2015 at 9:48 AM, Abastro said: ... I said: Quote (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; } Quote
Abastro Posted February 10, 2015 Posted February 10, 2015 I said: Quote 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 Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
gkbm2013 Posted February 10, 2015 Author Posted February 10, 2015 On 2/10/2015 at 11:39 AM, Abastro said: I said: Quote 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? Quote
Abastro Posted February 11, 2015 Posted February 11, 2015 On 2/10/2015 at 2:09 PM, gkbm2013 said: 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"? Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
gkbm2013 Posted February 11, 2015 Author Posted February 11, 2015 On 2/11/2015 at 1:57 AM, Abastro said: Quote 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... 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 . Quote
Abastro Posted February 11, 2015 Posted February 11, 2015 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? Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
gkbm2013 Posted February 12, 2015 Author Posted February 12, 2015 On 2/11/2015 at 2:45 PM, Abastro said: 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 want to right click blockB to change the NBT Tag of block A. Quote
Abastro Posted February 12, 2015 Posted February 12, 2015 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. Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
gkbm2013 Posted February 12, 2015 Author Posted February 12, 2015 On 2/12/2015 at 11:54 AM, Abastro said: 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. Quote
Abastro Posted February 12, 2015 Posted February 12, 2015 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. Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
gkbm2013 Posted February 12, 2015 Author Posted February 12, 2015 On 2/12/2015 at 1:36 PM, Abastro said: 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. But , when Block B get the value , how can I edit the value ?? Quote
Abastro Posted February 13, 2015 Posted February 13, 2015 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? Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
gkbm2013 Posted February 13, 2015 Author Posted February 13, 2015 On 2/13/2015 at 9:38 AM, Abastro said: 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. Quote
Abastro Posted February 15, 2015 Posted February 15, 2015 What do you mean by "Block B get the value of block A"...? Quote I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
Recommended Posts
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.