Jump to content

[PARTIALLY SOLVED] [1.8] See who added a block in the world


Recommended Posts

Posted

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.

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted

Yeah, you're not going to be able to figure that out.

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

You can store the UUID of the player who placed the block in a

TileEntity

(and then retrieve the player with that UUID to send a message to them at some point), but there's no way to detect the player who activated with a redstone signal.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Posted

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 :)

Don't blame me if i always ask for your help. I just want to learn to be better :)

Posted

There is no possibility of finding the player that activates redstone, as the are non-player methods of applying a redstone signal.  Pressure plays activated by mobs or items, block update detectors, detector rail...

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

I think first of all I want to make sure you understand some important concepts. The reason your first idea of recording the player in a player field wouldn't work is that you need to understand that there is only one instance (a singleton) of the block's class used, so any fields in the block itself will act globally (affect all blocks of that type in the game). This is because there are so many blocks in the game -- there are 65,000 blocks just in a single chunk -- that the computer would not have enough memory to instantiate them all as separate instances. So instead, there is a map of block types to locations in the chunk, and chunks in the world. They have also allowed a tiny bit of data (just four bits) to be stored per block location -- this is often called metadata. So then something like the color of clay block doesn't need a TileEntity, but rather can just use metadata.

 

So for blocks that don't do any processing (i.e. unique data per block location) that is all that is needed. But in your case, you want unique player information associated with each block location, and this is too much for 4 bit metadata. So they have provided TileEntities which are designed to allow you to make some blocks unique. You still can't use a lot of them, otherwise they would cause same problem as creating multiple block instances. Note that a TileEntity can just store data, or it can do some actual processing (like do things each tick). In your case you probably don't need them to tick, just store the player UUID, which is good because ticking a lot of TileEntities can cause performance problems.

 

There is an alternate way of storing data per location though. You could create a map in the world data that associates block positions with player UUIDs.

 

Note that in both approaches (TileEntity or world data) you will want to make sure you save and load the information as part of the NBT save / load processes.

 

Now regarding the redstone part, it actually is possible, but it would require quite a bit of programming. One approach is to substitute custom blocks for each redstone and redstone activated element and have them either have TileEntities or have them interact with world data. For example, you could have a world data map that represents who activated each pressure plate, and in your block that substitutes for the pressure plate you could update that world data map.

 

It would take a lot of programming though to achieve. Also you have to consider that redstone circuits can actually be activated by multiple things simultaneously -- imagine two pressure plates where one player gets on, then another player gets on, and then the first player gets off. Which player would you consider as the one that activated the circuit.

 

So not impossible, but really probably an advanced mod to make.

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

Posted

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

Don't blame me if i always ask for your help. I just want to learn to be better :)

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.