Jump to content

JimiIT92

Members
  • Posts

    867
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by JimiIT92

  1. I've just payed more attention at how banners are created and adapted that code to work with the chest and it worked So now i can create a chest with whatever i want inside, even a chest with another filled chest in it You're right, it wasn't hard, but just a little tricky to understand in the beginning
  2. Not too much As i said i'm really new to nbt tags so i'm not sure how to use them Anyway i removed that line, so i now have this for(int i = 0; i < list.size(); i++) { NBTTagCompound compound = result.getSubCompound("BlockEntityTag", true); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)0); new ItemStack(list.get(i)).writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); nbttagcompound1.setTag("Items", nbttaglist); manager.addRecipe(result, new Object[] {"###", "#I#", "###", '#', Blocks.wool, 'I', new ItemStack(list.get(i))}); } And what the crafting result give is this so an nbt tag is applied but is not the nbt tag that i want since the chest is still empty
  3. Sooo... should i do this? NBTTagCompound compound = result.getSubCompound("BlockEntityTag", true); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)0); new ItemStack(list.get(i)).writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); nbttagcompound1.setTag("Items", nbttaglist); result.setTagCompound(nbttagcompound1);
  4. Ok, i've changed that to this NBTTagCompound compound = result.getSubCompound("BlockEntityTag", true); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)0); new ItemStack(list.get(i)).writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); compound.setTag("Items", nbttaglist); result.setTagCompound(compound); but still doesn't work
  5. Quick update: for the recipe i come to this ItemStack result = new ItemStack(MWBlocks.gift); manager.addRecipe(new ItemStack(MWBlocks.gift), new Object[] {"###", "# #", "###", '#', Blocks.wool}); for(int i = 0; i < list.size(); i++) { NBTTagCompound compound = new NBTTagCompound(); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)0); new ItemStack(list.get(i)).writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); compound.setTag("Items", nbttaglist); result.setTagCompound(compound); manager.addRecipe(result, new Object[] {"###", "#I#", "###", '#', Blocks.wool, 'I', list.get(i)}); } so i've got 2 recipes, one for the standard chest and one including the additional item or block, and it works, execpt for the fact that the item isn't in the chest when placed down
  6. I've looked into the TileEntityChest class and see how the writeToNBT function works. So just for test i've tried doing this, to give a chest filled with a diamond shovel in result of crafting ItemStack stack = new ItemStack(MWBlocks.gift); ItemStack shovel = new ItemStack(Items.diamond_shovel); NBTTagCompound compound = new NBTTagCompound(); NBTTagList nbttaglist = new NBTTagList(); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte)0); shovel.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); compound.setTag("Items", nbttaglist); stack.setTagCompound(compound); GameRegistry.addRecipe(stack, new Object[] {this.recipePattern[0], 'X', Blocks.wool}); using F3+H it says that the chest given in result has 1 nbt tag but when placed down is empty
  7. yes, i've readed it, but i'm sorry because i've never worked with nbt tags So far i know that i should do this ItemStack stack = new ItemStack(MWBlocks.gift); NBTTagCompound nbttag = new NBTTagCompound(); stack.setTagCompound(nbttag); but what i don't know is how to set the chest content (if any). Because the crafting should give in result an empty chest if no item/block is in the middle, a chest with the entire stack of the items/blocks in the middle if there are (so for example, if there are 32 diamonds in the middle slot it should return a chest with 32 diamonds inside) and it should work with any items (so i don't know before wich items should go in the middle slot)
  8. mmm, so i've looked how the craftings for banners works, and so i do this package mw.craftings; import mw.core.MWBlocks; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntityBanner; import net.minecraft.world.World; public class CraftingGifts { public void func_179534_a(CraftingManager manager) { manager.addRecipe(new ItemStack(MWBlocks.gift, 1), new Object[] {"###", "# #", "###", '#', new ItemStack(Item.getItemFromBlock(Blocks.wool), 1)}); manager.addRecipe(new CraftingGifts.AddItemToGift(null)); } public static class AddItemToGift implements IRecipe { private AddItemToGift() {} /** * Used to check if a recipe matches current crafting inventory */ public boolean matches(InventoryCrafting inventory, World worldIn) { boolean flag = false; for (int i = 0; i < inventory.getSizeInventory(); ++i) { ItemStack itemstack = inventory.getStackInSlot(i); if (itemstack != null && itemstack.getItem() == Item.getItemFromBlock(MWBlocks.gift)) { if (flag) { return false; } flag = true; } } return flag; } /** * Returns an Item that is the result of this recipe */ public ItemStack getCraftingResult(InventoryCrafting inventory) { ItemStack itemstack = null; for (int i = 0; i < inventory.getSizeInventory(); ++i) { ItemStack itemstack1 = inventory.getStackInSlot(i); if (itemstack1 != null && itemstack1.getItem() == Item.getItemFromBlock(MWBlocks.gift)) { itemstack = itemstack1.copy(); itemstack.stackSize = 1; break; } } int k = 0; ItemStack itemstack2; for (int j = 0; j < inventory.getSizeInventory(); ++j) { itemstack2 = inventory.getStackInSlot(j); if (itemstack2 != null) { k = itemstack2.getMetadata(); break; } } NBTTagCompound nbttagcompound1 = itemstack.getSubCompound("BlockEntityTag", true); itemstack2 = null; NBTTagList nbttaglist; nbttaglist = new NBTTagList(); nbttagcompound1.setTag("Items", nbttaglist); NBTTagCompound nbttagcompound = new NBTTagCompound(); nbttagcompound.setByte("Sloy", (byte)0); nbttaglist.appendTag(nbttagcompound); return itemstack; } /** * Returns the size of the recipe area */ public int getRecipeSize() { return 10; } public ItemStack getRecipeOutput() { return null; } public ItemStack[] getRemainingItems(InventoryCrafting p_179532_1_) { ItemStack[] aitemstack = new ItemStack[p_179532_1_.getSizeInventory()]; for (int i = 0; i < aitemstack.length; ++i) { ItemStack itemstack = p_179532_1_.getStackInSlot(i); aitemstack[i] = net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack); } return aitemstack; } private TileEntityBanner.EnumBannerPattern func_179533_c(InventoryCrafting p_179533_1_) { TileEntityBanner.EnumBannerPattern[] aenumbannerpattern = TileEntityBanner.EnumBannerPattern.values(); int i = aenumbannerpattern.length; for (int j = 0; j < i; ++j) { TileEntityBanner.EnumBannerPattern enumbannerpattern = aenumbannerpattern[j]; if (enumbannerpattern.hasValidCrafting()) { boolean flag = true; int i1; if (enumbannerpattern.hasCraftingStack()) { boolean flag1 = false; boolean flag2 = false; for (i1 = 0; i1 < p_179533_1_.getSizeInventory() && flag; ++i1) { ItemStack itemstack1 = p_179533_1_.getStackInSlot(i1); if (itemstack1 != null && itemstack1.getItem() != Items.banner) { if (itemstack1.getItem() == Items.dye) { if (flag2) { flag = false; break; } flag2 = true; } else { if (flag1 || !itemstack1.isItemEqual(enumbannerpattern.getCraftingStack())) { flag = false; break; } flag1 = true; } } } if (!flag1) { flag = false; } } else if (p_179533_1_.getSizeInventory() != enumbannerpattern.getCraftingLayers().length * enumbannerpattern.getCraftingLayers()[0].length()) { flag = false; } else { int k = -1; for (int l = 0; l < p_179533_1_.getSizeInventory() && flag; ++l) { i1 = l / 3; int j1 = l % 3; ItemStack itemstack = p_179533_1_.getStackInSlot(l); if (itemstack != null && itemstack.getItem() != Items.banner) { if (itemstack.getItem() != Items.dye) { flag = false; break; } if (k != -1 && k != itemstack.getMetadata()) { flag = false; break; } if (enumbannerpattern.getCraftingLayers()[i1].charAt(j1) == 32) { flag = false; break; } k = itemstack.getMetadata(); } else if (enumbannerpattern.getCraftingLayers()[i1].charAt(j1) != 32) { flag = false; break; } } } if (flag) { return enumbannerpattern; } } } return null; } AddItemToGift(Object p_i45780_1_) { this(); } } } but nothing changes, i get the chest (the gift) in result of normal crafting but when i add an item in the middle of the crafting table i get nothing in result of crafting
  9. For example, i have a crafting recipe like this how can i return in result of the crafting a chest but with already the item in the central slot inside, so when the chest is placed down it has this item inside?
  10. I understand For the block part i have done it with a tile entity that only store the player UUID, it doesn't do anything else. For the redstone part, i think i should handle multiple events (entity collides with a pressur plate, entity interact with a lever/button, ...) and in there check if is a player who activate them. For multiple player instances, once the player hits the pressure plate is done, is not a block that works "until the player is on the pressure plate", it just need a single impulse of any type, so in that case both players will receive the output because both have activated it. The hard part is to see if what they press (lever,pressure plate, ecc...) is connected to the block, wich i think is a bit hard to code and sure will require a good pc to run (wich is not good). Anyway here is the updated code, just in case there is something wrong with it This is the block class package mw.blocks; import java.util.List; import java.util.Random; import java.util.UUID; import mw.core.utils.Utils; import mw.entities.tileentity.TileEntityDetector; import mw.entities.tileentity.TileEntityDynamicLamp; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockState; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.IStringSerializable; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class BlockDetector extends Block { private Block block; private int metadata; private boolean powered; private String language; private String name; private String no_block_found; private String one_block_found; private String some_blocks_found; private String blocks_found; private String one_block_found_at; private String some_blocks_found_at; private String nearest_block; public static final PropertyEnum VARIANT = PropertyEnum.create("variant", BlockDetector.EnumType.class); @Override public boolean hasTileEntity(IBlockState state) { return true; } /** * Returns a new instance of a block's tile entity class. Called on placing the block. */ @Override public TileEntity createTileEntity(World worldIn, IBlockState meta) { return new TileEntityDetector(); } public BlockDetector(Block block, int metadata, String name) { super(Material.rock); this.setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, BlockDetector.EnumType.LV1)); Utils.setDetectorBlockInfo(this, name); this.block = block; this.metadata = metadata; this.powered = false; this.language = Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage().toString(); this.name = name; } @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack stack) { super.onBlockPlacedBy(world, pos, state, entity, stack); TileEntity tileentity = world.getTileEntity(pos); if(entity instanceof EntityPlayer) ((TileEntityDetector)tileentity).setUUID(entity.getUniqueID()); } public void onBlockAdded(World par1, BlockPos pos, IBlockState state) { if (!par1.isRemote) { if (this.powered && par1.isBlockIndirectlyGettingPowered(pos) == 0) { par1.scheduleUpdate(pos, this, 4); } else if (!this.powered && par1.isBlockIndirectlyGettingPowered(pos) != 0) { TileEntity tileentity = par1.getTileEntity(pos); UUID id = ((TileEntityDetector)tileentity).getUUID(); if(id != null) this.onBlockActivated(par1, pos, state, par1.getPlayerEntityByUUID(id), null, 0.0F, 0.0F, 0.0F); else this.onBlockActivated(par1, pos, state, par1.getClosestPlayer(pos.getX(), pos.getY(), pos.getZ(), 10.0F), null, 0.0F, 0.0F, 0.0F); } } } /** * Called when a neighboring block changes. */ public void onNeighborBlockChange(World par1, BlockPos pos, IBlockState state, Block neighborBlock) { if (!par1.isRemote) { if (this.powered && par1.isBlockIndirectlyGettingPowered(pos) == 0) { par1.scheduleUpdate(pos, this, 4); } else if (!this.powered && par1.isBlockIndirectlyGettingPowered(pos) != 0) { TileEntity tileentity = par1.getTileEntity(pos); UUID id = ((TileEntityDetector)tileentity).getUUID(); if(id != null) this.onBlockActivated(par1, pos, state, par1.getPlayerEntityByUUID(id), null, 0.0F, 0.0F, 0.0F); else this.onBlockActivated(par1, pos, state, par1.getClosestPlayer(pos.getX(), pos.getY(), pos.getZ(), 10.0F), null, 0.0F, 0.0F, 0.0F); } } } @Override public boolean onBlockActivated(World par1World, BlockPos pos, IBlockState state, EntityPlayer par5EntityPlayer, EnumFacing side, float par7, float par8, float par9) { int par2 = pos.getX(); int par3 = pos.getY(); int par4 = pos.getZ(); this.sparkle(par1World, par2, par3, par4); if(!par1World.isRemote) { int min = -5 + (-5 * par1World.getBlockState(pos).getBlock().getMetaFromState(state)); int max = 6 + (6 * par1World.getBlockState(pos).getBlock().getMetaFromState(state)); boolean flag = false; int count = 0; int x = 0, y = 0, z = 0; for(int i = min; i < max; i++) for(int j = min; j < max; j++) for(int k = min; k < max; k++) { if(par1World.getBlockState(pos.add(i, j, k)).getBlock().equals(this.block) && par1World.getBlockState(pos.add(i, j, k)) == block.getStateFromMeta(this.metadata)) { flag = true; count++; if(par2+1 < 0) x = par2 + i + 1; else x = par2 + i; y = par3 + j; if(par4+k < 0) z = par4 + k + 1; else z = par4 + k; } } String block_name = this.block.getLocalizedName(); if(this.language.equals("Italiano (Italia)")) { if(block_name.equals("tile.marble.name") && this.metadata == 0) block_name = "Marmo Bianco"; if(block_name.equals("tile.marble.name") && this.metadata == 1) block_name = "Marmo Rosa"; this.one_block_found = "E' stato trovato un blocco di " + block_name + " qui intorno"; this.no_block_found = "Non e' stato trovato alcun blocco di " + block_name + " qui intorno"; this.some_blocks_found = "Sono stati trovati alcuni blocchi di " + block_name + " qui intorno"; this.blocks_found = "Sono stati trovati " + count + " blocchi di " + block_name + " qui intorno"; this.one_block_found_at = "E' stato trovato un blocco di " + block_name + " alle coordinate " + "X = " + x + " Y = " + y + " Z = " + z; this.some_blocks_found_at = "Sono stati trovati " + count + " blocchi di " + block_name + " qui intorno"; this.nearest_block = "Il piu' vicino si trova intorno alle coordinate X = " + x + " Y = " + y + " Z = " + z; } else { if(block_name.equals("tile.marble.name") && this.metadata == 0) block_name = "White Marble"; if(block_name.equals("tile.marble.name") && this.metadata == 1) block_name = "Pink Marble"; this.one_block_found = "Found a block of " + block_name + " hereabouts"; this.no_block_found = "Found no block of " + block_name + " hereabouts"; this.some_blocks_found = "Found some blocks of " + block_name + " hereabouts"; this.blocks_found = "Found " + count + " blocks of " + block_name + " hereabouts"; this.one_block_found_at = "Found one block of " + block_name + " to the coordinates " + "X = " + x + " Y = " + y + " Z = " + z; this.some_blocks_found_at = "Found " + count + " blocks of " + block_name + " hereabouts"; this.nearest_block = "The nearest is around the coordinates X = " + x + " Y = " + y + " Z = " + z; } if(!par1World.isRemote) { if(flag == true) { switch(par1World.getBlockState(pos).getBlock().getMetaFromState(state)) { case 0: if(count == 1) par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.one_block_found)); else par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.some_blocks_found)); break; case 1: if(count == 1) par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.one_block_found)); else par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.blocks_found)); break; case 2: if(count == 1) par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.one_block_found_at)); else { par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.some_blocks_found_at)); par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.nearest_block)); } break; } } else par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.no_block_found)); } return true; } return true; } private void sparkle(World par1, int par2, int par3, int par4) { Random random = par1.rand; double d0 = 0.0625D; for (int l = 0; l < 6; ++l) { double d1 = (double)((float)par2 + random.nextFloat()); double d2 = (double)((float)par3 + random.nextFloat()); double d3 = (double)((float)par4 + random.nextFloat()); if (l == 0 && !par1.getBlockState(new BlockPos(par2, par3+l, par4)).getBlock().isOpaqueCube()) { d2 = (double)(par3 + 1) + d0; } if (l == 1 && !par1.getBlockState(new BlockPos(par2, par3 - 1, par4)).getBlock().isOpaqueCube()) { d2 = (double)(par3 + 0) - d0; } if (l == 2 && !par1.getBlockState(new BlockPos(par2, par3, par4 + 1)).getBlock().isOpaqueCube()) { d3 = (double)(par4 + 1) + d0; } if (l == 3 && !par1.getBlockState(new BlockPos(par2, par3, par4 - 1)).getBlock().isOpaqueCube()) { d3 = (double)(par4 + 0) - d0; } if (l == 4 && !par1.getBlockState(new BlockPos(par2 + 1, par3, par4)).getBlock().isOpaqueCube()) { d1 = (double)(par2 + 1) + d0; } if (l == 5 && !par1.getBlockState(new BlockPos(par2 - 1, par3, par4)).getBlock().isOpaqueCube()) { d1 = (double)(par2 + 0) - d0; } if (d1 < (double)par2 || d1 > (double)(par2 + 1) || d2 < 0.0D || d2 > (double)(par3 + 1) || d3 < (double)par4 || d3 > (double)(par4 + 1)) { par1.spawnParticle(EnumParticleTypes.REDSTONE, d1, d2, d3, 0.0D, 0.0D, 0.0D); } } } /** * Get the damage value that this Block should drop */ public int damageDropped(IBlockState state) { return ((BlockDetector.EnumType)state.getValue(VARIANT)).getMetadata(); } /** * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) */ @SideOnly(Side.CLIENT) public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { BlockDetector.EnumType[] aenumtype = BlockDetector.EnumType.values(); int i = aenumtype.length; for (int j = 0; j < i; ++j) { BlockDetector.EnumType enumtype = aenumtype[j]; list.add(new ItemStack(itemIn, 1, enumtype.getMetadata())); } } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(VARIANT, BlockDetector.EnumType.byMetadata(meta)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { return ((BlockDetector.EnumType)state.getValue(VARIANT)).getMetadata(); } protected BlockState createBlockState() { return new BlockState(this, new IProperty[] {VARIANT}); } public static enum EnumType implements IStringSerializable { LV1(0, "lv1"), LV2(1, "lv2"), LV3(2, "lv3"); private static final BlockDetector.EnumType[] META_LOOKUP = new BlockDetector.EnumType[values().length]; private final int meta; private final String name; private final String unlocalizedName; private EnumType(int meta, String name) { this(meta, name, name); } private EnumType(int meta, String name, String unlocalizedName) { this.meta = meta; this.name = name; this.unlocalizedName = unlocalizedName; } public int getMetadata() { return this.meta; } public String toString() { return this.name; } public static BlockDetector.EnumType byMetadata(int meta) { if (meta < 0 || meta >= META_LOOKUP.length) { meta = 0; } return META_LOOKUP[meta]; } public String getName() { return this.name; } public String getUnlocalizedName() { return this.unlocalizedName; } static { BlockDetector.EnumType[] var0 = values(); int var1 = var0.length; for (int var2 = 0; var2 < var1; ++var2) { BlockDetector.EnumType var3 = var0[var2]; META_LOOKUP[var3.getMetadata()] = var3; } } } } And this is the tile entity package mw.entities.tileentity; import java.util.UUID; import mw.blocks.BlockDynamicLamp; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.server.gui.IUpdatePlayerListBox; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class TileEntityDetector extends TileEntity { private UUID player; public TileEntityDetector() { super(); } public void setUUID(UUID par1) { this.player = par1; } public UUID getUUID() { return this.player; } public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); NBTTagList nbttaglist = new NBTTagList(); this.player = UUID.fromString(compound.getString("Player")); } public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); NBTTagList nbttaglist = new NBTTagList(); compound.setString("Player", this.player.toString()); } } Also here's a short video to explain better how the block works right now https://www.youtube.com/watch?v=CrdJvXmufNQ
  11. as for what i know (not to much really) you should have a "run" folder in to the main mod folder (or pearhaps a folder that looks like he minecraft folder). In here there is a folder called "mods", try putting the other mods there and see if they works
  12. mmm, alright, i'll change it to work with a tile entity
  13. Without using a TileEntity i have done this @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack stack) { super.onBlockPlacedBy(world, pos, state, entity, stack); if(entity instanceof EntityPlayer) this.player = (EntityPlayer) entity; } saving the entity uuid in a local variable (this.player). Then in the onBlockAdded/onNeighborBlockChange functions i do this if(this.player != null) this.onBlockActivated(par1, pos, state, par1.getPlayerEntityByUUID(this.player), null, 0.0F, 0.0F, 0.0F); else this.onBlockActivated(par1, pos, state, par1.getClosestPlayer(pos.getX(), pos.getY(), pos.getZ(), 10.0F), null, 0.0F, 0.0F, 0.0F); so if a player place this block than only that player will have a message in chat, even if is not him to activate the block via redstone (it's weird and possibly wrong, but since it would be very disadvantaged check where a redstone circuit ends up, i'll leave this), and if it's not a player to place the block (for example via setblock command) than give the output to the closest player Thanks Choonster for giving me the tip to save the player uuid
  14. So there's absolutely no way to find that? Maybe some event to handle?
  15. I have a block that when powered by redstone (or anything related like buttons, levers....) or right clicked do some stuff and than send a message to the player in the chat. Now, for the right click no problem, the message is displayed only to who actually right clicked the block. BUt for the redstone related part? Since i don't know how to check (or even if it is possible to check) who placed/activated the block how can i send the right message to the right player? By now i check the nearest player to block, wich it works assuming that the only player in a radius of 5 blocks from the powered block is actually who powered the block. But of course i want to avoid this because if there is another player near the block, the chat message will be showned to that player instead of the "legal" one. So this is the whole class for the block package mw.blocks; import java.util.List; import java.util.Random; import mw.core.MWBlocks; import mw.core.utils.Utils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockState; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.IStringSerializable; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class BlockDetector extends Block { private Block block; private int metadata; private boolean powered; private String language; private String name; private String no_block_found; private String one_block_found; private String some_blocks_found; private String blocks_found; private String one_block_found_at; private String some_blocks_found_at; private String nearest_block; public static final PropertyEnum VARIANT = PropertyEnum.create("variant", BlockDetector.EnumType.class); public BlockDetector(Block block, int metadata, String name) { super(Material.rock); this.setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, BlockDetector.EnumType.LV1)); Utils.setDetectorBlockInfo(this, name); this.block = block; this.metadata = metadata; this.powered = false; this.language = Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage().toString(); this.name = name; } public void onBlockAdded(World par1, BlockPos pos, IBlockState state) { if (!par1.isRemote) { if (this.powered && par1.isBlockIndirectlyGettingPowered(pos) == 0) { par1.scheduleUpdate(pos, this, 4); } else if (!this.powered && par1.isBlockIndirectlyGettingPowered(pos) != 0) { this.onBlockActivated(par1, pos, state, par1.getClosestPlayer(pos.getX(), pos.getY(), pos.getZ(), 5.0F), null, 0.0F, 0.0F, 0.0F); } } } /** * Called when a neighboring block changes. */ public void onNeighborBlockChange(World par1, BlockPos pos, IBlockState state, Block neighborBlock) { if (!par1.isRemote) { if (this.powered && par1.isBlockIndirectlyGettingPowered(pos) == 0) { par1.scheduleUpdate(pos, this, 4); } else if (!this.powered && par1.isBlockIndirectlyGettingPowered(pos) != 0) { this.onBlockActivated(par1, pos, state, par1.getClosestPlayer(pos.getX(), pos.getY(), pos.getZ(), 5.0F), null, 0.0F, 0.0F, 0.0F); } } } @Override public boolean onBlockActivated(World par1World, BlockPos pos, IBlockState state, EntityPlayer par5EntityPlayer, EnumFacing side, float par7, float par8, float par9) { int par2 = pos.getX(); int par3 = pos.getY(); int par4 = pos.getZ(); this.sparkle(par1World, par2, par3, par4); if(!par1World.isRemote) { int min = -5 + (-5 * par1World.getBlockState(pos).getBlock().getMetaFromState(state)); int max = 6 + (6 * par1World.getBlockState(pos).getBlock().getMetaFromState(state)); boolean flag = false; int count = 0; int x = 0, y = 0, z = 0; for(int i = min; i < max; i++) for(int j = min; j < max; j++) for(int k = min; k < max; k++) { if(par1World.getBlockState(pos.add(i, j, k)).getBlock().equals(this.block) && par1World.getBlockState(pos.add(i, j, k)) == block.getStateFromMeta(this.metadata)) { flag = true; count++; if(par2+1 < 0) x = par2 + i + 1; else x = par2 + i; y = par3 + j; if(par4+k < 0) z = par4 + k + 1; else z = par4 + k; } } String block_name = this.block.getLocalizedName(); if(this.language.equals("Italiano (Italia)")) { if(block_name.equals("tile.marble.name") && this.metadata == 0) block_name = "Marmo Bianco"; if(block_name.equals("tile.marble.name") && this.metadata == 1) block_name = "Marmo Rosa"; this.one_block_found = "E' stato trovato un blocco di " + block_name + " qui intorno"; this.no_block_found = "Non e' stato trovato alcun blocco di " + block_name + " qui intorno"; this.some_blocks_found = "Sono stati trovati alcuni blocchi di " + block_name + " qui intorno"; this.blocks_found = "Sono stati trovati " + count + " blocchi di " + block_name + " qui intorno"; this.one_block_found_at = "E' stato trovato un blocco di " + block_name + " alle coordinate " + "X = " + x + " Y = " + y + " Z = " + z; this.some_blocks_found_at = "Sono stati trovati " + count + " blocchi di " + block_name + " qui intorno"; this.nearest_block = "Il piu' vicino si trova intorno alle coordinate X = " + x + " Y = " + y + " Z = " + z; } else { if(block_name.equals("tile.marble.name") && this.metadata == 0) block_name = "White Marble"; if(block_name.equals("tile.marble.name") && this.metadata == 1) block_name = "Pink Marble"; this.one_block_found = "Found a block of " + block_name + " hereabouts"; this.no_block_found = "Found no block of " + block_name + " hereabouts"; this.some_blocks_found = "Found some blocks of " + block_name + " hereabouts"; this.blocks_found = "Found " + count + " blocks of " + block_name + " hereabouts"; this.one_block_found_at = "Found one block of " + block_name + " to the coordinates " + "X = " + x + " Y = " + y + " Z = " + z; this.some_blocks_found_at = "Found " + count + " blocks of " + block_name + " hereabouts"; this.nearest_block = "The nearest is around the coordinates X = " + x + " Y = " + y + " Z = " + z; } if(!par1World.isRemote) { if(flag == true) { switch(par1World.getBlockState(pos).getBlock().getMetaFromState(state)) { case 0: if(count == 1) par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.one_block_found)); else par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.some_blocks_found)); break; case 1: if(count == 1) par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.one_block_found)); else par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.blocks_found)); break; case 2: if(count == 1) par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.one_block_found_at)); else { par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.some_blocks_found_at)); par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.nearest_block)); } break; } } else par5EntityPlayer.addChatComponentMessage(new ChatComponentText(this.no_block_found)); } return true; } return true; } private void sparkle(World par1, int par2, int par3, int par4) { Random random = par1.rand; double d0 = 0.0625D; for (int l = 0; l < 6; ++l) { double d1 = (double)((float)par2 + random.nextFloat()); double d2 = (double)((float)par3 + random.nextFloat()); double d3 = (double)((float)par4 + random.nextFloat()); if (l == 0 && !par1.getBlockState(new BlockPos(par2, par3+l, par4)).getBlock().isOpaqueCube()) { d2 = (double)(par3 + 1) + d0; } if (l == 1 && !par1.getBlockState(new BlockPos(par2, par3 - 1, par4)).getBlock().isOpaqueCube()) { d2 = (double)(par3 + 0) - d0; } if (l == 2 && !par1.getBlockState(new BlockPos(par2, par3, par4 + 1)).getBlock().isOpaqueCube()) { d3 = (double)(par4 + 1) + d0; } if (l == 3 && !par1.getBlockState(new BlockPos(par2, par3, par4 - 1)).getBlock().isOpaqueCube()) { d3 = (double)(par4 + 0) - d0; } if (l == 4 && !par1.getBlockState(new BlockPos(par2 + 1, par3, par4)).getBlock().isOpaqueCube()) { d1 = (double)(par2 + 1) + d0; } if (l == 5 && !par1.getBlockState(new BlockPos(par2 - 1, par3, par4)).getBlock().isOpaqueCube()) { d1 = (double)(par2 + 0) - d0; } if (d1 < (double)par2 || d1 > (double)(par2 + 1) || d2 < 0.0D || d2 > (double)(par3 + 1) || d3 < (double)par4 || d3 > (double)(par4 + 1)) { par1.spawnParticle(EnumParticleTypes.REDSTONE, d1, d2, d3, 0.0D, 0.0D, 0.0D); } } } /** * Get the damage value that this Block should drop */ public int damageDropped(IBlockState state) { return ((BlockDetector.EnumType)state.getValue(VARIANT)).getMetadata(); } /** * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) */ @SideOnly(Side.CLIENT) public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) { BlockDetector.EnumType[] aenumtype = BlockDetector.EnumType.values(); int i = aenumtype.length; for (int j = 0; j < i; ++j) { BlockDetector.EnumType enumtype = aenumtype[j]; list.add(new ItemStack(itemIn, 1, enumtype.getMetadata())); } } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(VARIANT, BlockDetector.EnumType.byMetadata(meta)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { return ((BlockDetector.EnumType)state.getValue(VARIANT)).getMetadata(); } protected BlockState createBlockState() { return new BlockState(this, new IProperty[] {VARIANT}); } public static enum EnumType implements IStringSerializable { LV1(0, "lv1"), LV2(1, "lv2"), LV3(2, "lv3"); private static final BlockDetector.EnumType[] META_LOOKUP = new BlockDetector.EnumType[values().length]; private final int meta; private final String name; private final String unlocalizedName; private EnumType(int meta, String name) { this(meta, name, name); } private EnumType(int meta, String name, String unlocalizedName) { this.meta = meta; this.name = name; this.unlocalizedName = unlocalizedName; } public int getMetadata() { return this.meta; } public String toString() { return this.name; } public static BlockDetector.EnumType byMetadata(int meta) { if (meta < 0 || meta >= META_LOOKUP.length) { meta = 0; } return META_LOOKUP[meta]; } public String getName() { return this.name; } public String getUnlocalizedName() { return this.unlocalizedName; } static { BlockDetector.EnumType[] var0 = values(); int var1 = var0.length; for (int var2 = 0; var2 < var1; ++var2) { BlockDetector.EnumType var3 = var0[var2]; META_LOOKUP[var3.getMetadata()] = var3; } } } } The function that send a message to the player is the onBlockActivated function. Also, when i powered a block with a lever, the message is sended twice.
  16. Ok, so updating the Forge version to the latest or the MC1.8 fixed the error For anyone who want an example, this is the actual code package com.example.examplemod; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.statemap.StateMapperBase; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fluids.BlockFluidClassic; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.registry.GameRegistry; @Mod(modid = ModelFluidDebug.MODID, version = ModelFluidDebug.VERSION) public class ModelFluidDebug { public static final String MODID = "ForgeDebugModelFluid"; public static final String VERSION = "1.0"; private static ModelResourceLocation fluidLocation = new ModelResourceLocation(MODID.toLowerCase() + ":" + TestFluidBlock.name, "fluid"); private static ModelResourceLocation gasLocation = new ModelResourceLocation(MODID.toLowerCase() + ":" + TestFluidBlock.name, "gas"); @EventHandler public void preInit(FMLPreInitializationEvent event) { FluidRegistry.registerFluid(CustomFluid.instance); FluidRegistry.registerFluid(TestGas.instance); GameRegistry.registerBlock(TestFluidBlock.instance, TestFluidBlock.name); GameRegistry.registerBlock(TestGasBlock.instance, TestGasBlock.name); Item fluid = Item.getItemFromBlock(TestFluidBlock.instance); Item gas = Item.getItemFromBlock(TestGasBlock.instance); ModelBakery.addVariantName(fluid); ModelBakery.addVariantName(gas); ModelLoader.setCustomMeshDefinition(fluid, new ItemMeshDefinition() { public ModelResourceLocation getModelLocation(ItemStack stack) { return fluidLocation; } }); ModelLoader.setCustomMeshDefinition(gas, new ItemMeshDefinition() { public ModelResourceLocation getModelLocation(ItemStack stack) { return gasLocation; } }); ModelLoader.setCustomStateMapper(TestFluidBlock.instance, new StateMapperBase() { protected ModelResourceLocation getModelResourceLocation(IBlockState state) { return fluidLocation; } }); ModelLoader.setCustomStateMapper(TestGasBlock.instance, new StateMapperBase() { protected ModelResourceLocation getModelResourceLocation(IBlockState state) { return gasLocation; } });} public static final class CustomFluid extends Fluid { public static final String name = "myfluid"; public static final CustomFluid instance = new CustomFluid(); private CustomFluid() { super(name, new ResourceLocation(MODID.toLowerCase() + ":" + "blocks/testfluid"), new ResourceLocation(MODID.toLowerCase() + ":" + "blocks/testfluid")); } } public static final class TestGas extends Fluid { public static final String name = "testgas"; public static final TestGas instance = new TestGas(); private TestGas() { super(name, new ResourceLocation("blocks/lava_still"), new ResourceLocation("blocks/lava_flow")); density = -1000; isGaseous = true; } } public static final class TestFluidBlock extends BlockFluidClassic { public static final TestFluidBlock instance = new TestFluidBlock(); public static final String name = "TestFluidBlock"; private TestFluidBlock() { super(CustomFluid.instance, Material.water); setCreativeTab(CreativeTabs.tabBlock); setUnlocalizedName(MODID + ":" + name); } @Override public int getRenderType() { return 3; } /** * The type of render function that is called for this block */ } public static final class TestGasBlock extends BlockFluidClassic { public static final TestGasBlock instance = new TestGasBlock(); public static final String name = "TestGasBlock"; private TestGasBlock() { super(TestGas.instance, Material.lava); setCreativeTab(CreativeTabs.tabBlock); setUnlocalizedName(MODID + ":" + name); } } } and this is the Json file { "forge_marker": 1, "variants": { "fluid": { "model": "forge:fluid", "custom": { "fluid": "myfluid" } }, "gas": { "model": "forge:fluid", "custom": { "fluid": "testgas" } } } } Note that the name specified in "custom" in the json file is the same name as specified in the class, otherwise it will have the default water texture Thanks Choonster for the tip
  17. Actually i had to test it in a newer version of Forge and see if it works As soon as i can i'll let you kow
  18. ahahahah that was just a copy/paste from the github file, in fact in the mod where this will go it's lower case
  19. Mmm... i'm using the 1.8-11.14.1.1375 version, i'll try it in that version
  20. I do this in the ModelResourceLocation MODID.toLowerCase() so it's always lower case when passed as argument to ModelResourceLocation ctor
  21. Still any idea?
  22. Anybody? I don't understand why the fluid when placed down is invisible UPDATE: i've added this to the TestFluidBlock class @Override public int getRenderType() { return 3; } and now it gives me this So apparently is not spreading like the normal water does, it fills all the space with "blocks", is because it has no texture? How can i give it one?
  23. So i've tried looking at the ModelFluidDebug class here https://github.com/MinecraftForge/MinecraftForge/blob/b45fd787f36626ef84f26e881848167fec5957b5/src/test/java/net/minecraftforge/debug/ModelFluidDebug.java but is not working I have done a new workspace with only that file (so basically a mod that adds only that fluid) but the texture is missing. This is the main mod file (and also the only class in the mod) package com.example.examplemod; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.statemap.StateMapperBase; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fluids.BlockFluidClassic; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.registry.GameRegistry; @Mod(modid = ModelFluidDebug.MODID, version = ModelFluidDebug.VERSION) public class ModelFluidDebug { public static final String MODID = "ForgeDebugModelFluid"; public static final String VERSION = "1.0"; private static ModelResourceLocation fluidLocation = new ModelResourceLocation(MODID.toLowerCase() + ":" + TestFluidBlock.name, "fluid"); private static ModelResourceLocation gasLocation = new ModelResourceLocation(MODID.toLowerCase() + ":" + TestFluidBlock.name, "gas"); @EventHandler public void preInit(FMLPreInitializationEvent event) { FluidRegistry.registerFluid(TestFluid.instance); FluidRegistry.registerFluid(TestGas.instance); GameRegistry.registerBlock(TestFluidBlock.instance, TestFluidBlock.name); GameRegistry.registerBlock(TestGasBlock.instance, TestGasBlock.name); Item fluid = Item.getItemFromBlock(TestFluidBlock.instance); Item gas = Item.getItemFromBlock(TestGasBlock.instance); ModelBakery.addVariantName(fluid); ModelBakery.addVariantName(gas); ModelLoader.setCustomMeshDefinition(fluid, new ItemMeshDefinition() { public ModelResourceLocation getModelLocation(ItemStack stack) { return fluidLocation; } }); ModelLoader.setCustomMeshDefinition(gas, new ItemMeshDefinition() { public ModelResourceLocation getModelLocation(ItemStack stack) { return gasLocation; } }); ModelLoader.setCustomStateMapper(TestFluidBlock.instance, new StateMapperBase() { protected ModelResourceLocation getModelResourceLocation(IBlockState state) { return fluidLocation; } }); ModelLoader.setCustomStateMapper(TestGasBlock.instance, new StateMapperBase() { protected ModelResourceLocation getModelResourceLocation(IBlockState state) { return gasLocation; } });} public static final class TestFluid extends Fluid { public static final String name = "testfluid"; public static final TestFluid instance = new TestFluid(); private TestFluid() { super(name); } @Override public int getColor() { return 0xFF00FF00; } } public static final class TestGas extends Fluid { public static final String name = "testgas"; public static final TestGas instance = new TestGas(); private TestGas() { super(name); density = -1000; isGaseous = true; } @Override public int getColor() { return 0xFFFF0000; } } public static final class TestFluidBlock extends BlockFluidClassic { public static final TestFluidBlock instance = new TestFluidBlock(); public static final String name = "TestFluidBlock"; private TestFluidBlock() { super(TestFluid.instance, Material.water); setCreativeTab(CreativeTabs.tabBlock); setUnlocalizedName(MODID + ":" + name); } } public static final class TestGasBlock extends BlockFluidClassic { public static final TestGasBlock instance = new TestGasBlock(); public static final String name = "TestGasBlock"; private TestGasBlock() { super(TestGas.instance, Material.lava); setCreativeTab(CreativeTabs.tabBlock); setUnlocalizedName(MODID + ":" + name); } } } and that's the json file { "forge_marker": 1, "variants": { "fluid": { "model": "forge:fluid", "custom": { "fluid": "testfluid" } }, "gas": { "model": "forge:fluid", "custom": { "fluid": "testgas" } } } } any idea on why is not working?
  24. Thanks, now is working And yes, i know it's still in early development but for what i'm doing it should be fine (just adding some blocks, items, ores and mobs)
×
×
  • Create New...

Important Information

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