Записать в NBT имя юзера

Версия Minecraft
1.7.2
Господа. Пондадобилось записать в NBT установленного юзера его имя, чтоб другой юзер не смог поменять цвет этого блока (BlockHeraldy) модификатором (ItemHeraldry).

Главный вопрос? Что я тут делаю не так, и верная ли конструкция? Так как пишу на форум, она, естественно, не работает.


Код:
ItemHeraldy.java

public class ItemHeraldry extends Item {

 IIcon iconScroll;
 IIcon iconBanner;
 IIcon iconWallBanner;

 public ItemHeraldry() {
 super();
 setCreativeTab(CreativeTabs.tabDecorations);
 setUnlocalizedName(LibContent.HERALDRY_ITEM_NAME);
 setHasSubtypes(true);
 
 GameRegistry.addRecipe(new RecipeHeldBanner());
 }

 @Override
 public String getItemStackDisplayName(ItemStack par1ItemStack) {
 return par1ItemStack.getItemDamage() == 0 ? LibContent.SCROLL_DISPLAY_NAME : par1ItemStack.getItemDamage() == 1 ? LibContent.BANNER_DISPLAY_NAME : LibContent.WALL_BANNER_DISPLAY_NAME;
 }

 @Override
 @SideOnly(Side.CLIENT)
 public void registerIcons(IIconRegister par1IconRegister) {
 iconScroll = par1IconRegister.registerIcon(LibMisc.MOD_ID + ":" + LibResources.ICON_SCROLL);
 iconBanner = par1IconRegister.registerIcon(LibMisc.MOD_ID + ":" + LibResources.ICON_BANNER);
 iconWallBanner = par1IconRegister.registerIcon(LibMisc.MOD_ID + ":" + LibResources.ICON_WALL_BANNER);
 }

 @Override
 @SideOnly(Side.CLIENT)
 public IIcon getIconFromDamage(int par1) {
 return par1 == 0 ? iconScroll : par1 == 1 ? iconBanner : iconWallBanner;
 }

 @Override
 @SideOnly(Side.CLIENT)
 public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) {
 super.getSubItems(par1, par2CreativeTabs, par3List);
 par3List.add(new ItemStack(par1, 1, 1));
 par3List.add(new ItemStack(par1, 1, 2));
 }
 
 @Override
 public boolean hasContainerItem(ItemStack stack) {
 return stack.getItemDamage() == 0;
 }
 
 @Override
 public ItemStack getContainerItem(ItemStack itemStack) {
 return itemStack.getItemDamage() == 0 ? itemStack : null;
 }
 
 @Override
 public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {
 if(par1ItemStack.getItemDamage() == 0)
 par3EntityPlayer.openGui(CraftHeraldry.instance, 0, par2World, 0, 0, 0);

 return par1ItemStack;
 }

 @Override
 public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) {
 //Смотрим на блок, записано ли туда имя юзера
 
        if (par3World.getTileEntity(par4, par5, par6) instanceof TileEntityBanner) 
        {
            String owner = ""; 
            if (par2EntityPlayer instanceof EntityPlayer) 
            { 
                owner = ((EntityPlayer) par2EntityPlayer).getDisplayName(); 
            } 
            ((TileEntityBanner) par3World.getTileEntity(par4, par5, par6)).setOwner(owner); 
        }
        
        if (par3World.getTileEntity(par4, par5, par6) instanceof TileEntityBanner) 
        {
            String owner = "";
            String metaowner = ""; 
            if (par2EntityPlayer instanceof EntityPlayer) 
            { 
                owner = ((EntityPlayer) par2EntityPlayer).getDisplayName(); 
            } 
            metaowner = ((TileEntityBanner) par3World.getTileEntity(par4, par5, par6)).getOwner(); 
            
            if (metaowner != owner) {
             return false; 
            }
        }
 
 if(readCrestData(par1ItemStack).icon != -1)
 return false;
 
 if(par7 == ForgeDirection.DOWN.ordinal() || par1ItemStack.getItemDamage() == 0 || par1ItemStack.getItemDamage() > 2)
 return false;

 if(par7 == ForgeDirection.UP.ordinal() && par1ItemStack.getItemDamage() == 1) {
 boolean can = par3World.isAirBlock(par4, par5 + 1, par6) && par3World.isAirBlock(par4, par5 + 2, par6);
 if(can) {
 float yaw = par2EntityPlayer.rotationYaw;
 while(yaw < 0)
 yaw += 360F;

 int meta = Math.round((yaw % 360F - 90F) / 45F);
 if(meta < 0)
 meta = 6 - meta;
 if(meta > 7)
 meta = 6;

 par3World.setBlock(par4, par5 + 1, par6, CommonProxy.blockHeraldry, meta, 2);
 par3World.playSoundEffect(par4, par5, par6, "step.wood", 1F, 0.2F);
 if(!par3World.isRemote)
 par2EntityPlayer.swingItem();
 par1ItemStack.stackSize--;
 return true;
 }
 } else if(par1ItemStack.getItemDamage() == 2) {
 ForgeDirection direction = ForgeDirection.getOrientation(par7);
 boolean can = par3World.isSideSolid(par4, par5, par6, direction, false) && par3World.isAirBlock(par4 + direction.offsetX, par5 - 1, par6 + direction.offsetZ);
 if(can) {
 int meta = (par7 == 2 ? 3 : par7 == 3 ? 1 : par7 == 4 ? 2 : 0) * 2 + 8;

 par3World.setBlock(par4 + direction.offsetX, par5, par6 + direction.offsetZ, CommonProxy.blockHeraldry, meta, 2);
 par3World.playSoundEffect(par4, par5, par6, "step.wood", 1F, 0.2F);
 if(!par3World.isRemote)
 par2EntityPlayer.swingItem();
 par1ItemStack.stackSize--;
 }
 }
 return false;
 }

 public static void writeCrestData(ItemStack stack, CrestData data) {
 if(!stack.hasTagCompound())
 stack.setTagCompound(new NBTTagCompound());

 data.writeToCmp(stack.getTagCompound());
 }

 public static CrestData readCrestData(ItemStack stack) {
 if(!stack.hasTagCompound())
 return new CrestData(0xFFFFFF, 0xFFFFFF, (short) -1);

 return CrestData.readFromCmp(stack.getTagCompound());
 }

 @Override
 @SideOnly(Side.CLIENT)
 public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) {
 if(par1ItemStack.getItemDamage() == 0)
 par3List.add((readCrestData(par1ItemStack) == null ? "Blank, " : "") + "Right-Click to Edit");
 else if(readCrestData(par1ItemStack).icon != -1)
 par3List.add("Held Banner, can't be placed.");
 }

 @Override
 public boolean getShareTag() {
 return true;
 }

 @Override
 @SideOnly(Side.CLIENT)
 public EnumRarity getRarity(ItemStack par1ItemStack) {
 return par1ItemStack.getItemDamage() == 0 && readCrestData(par1ItemStack) != null ? EnumRarity.rare : EnumRarity.common;
 }
}
Код:
TileEntityBanner.class

public class TileEntityBanner extends TileEntity {

 public CrestData data = new CrestData(0xFFFFFF, 0xFFFFFF, (short) -1);
 public boolean locked;
    protected String owner; 
    public static final String OWNER = "owner";

    public TileEntityBanner() 
    { 
        owner = ""; 
    } 
    
 @Override
 public Packet getDescriptionPacket() {
 NBTTagCompound nbttagcompound = new NBTTagCompound();
 writeCustomNBT(nbttagcompound);
 return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, -999, nbttagcompound);
 }

 @Override
 public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
 super.onDataPacket(net, packet);
 readCustomNBT(packet.func_148857_g());
 }

 @Override
 public void readFromNBT(NBTTagCompound par1nbtTagCompound) {
 super.readFromNBT(par1nbtTagCompound);
 readCustomNBT(par1nbtTagCompound);
        if (par1nbtTagCompound.hasKey(OWNER)) 
        { 
            this.owner = par1nbtTagCompound.getString(OWNER); 
        } 
 }

 public void readCustomNBT(NBTTagCompound cmp) {
 data = CrestData.readFromCmp(cmp);
 locked = cmp.getBoolean("locked");
 }

 @Override
 public void writeToNBT(NBTTagCompound par1nbtTagCompound) {
 super.writeToNBT(par1nbtTagCompound);
 writeCustomNBT(par1nbtTagCompound);
 par1nbtTagCompound.setString(OWNER, owner);
 }

 public void writeCustomNBT(NBTTagCompound cmp) {
 if(data != null)
 data.writeToCmp(cmp);
 cmp.setBoolean("locked", locked);
 }

    public String getOwner() 
    { 
        return owner; 
    } 
 
    public void setOwner(String owner) 
    { 
        this.owner = owner; 
    } 

}

Код:
BlockHeraldy.class

public class BlockHeraldry extends BlockContainer {

 public BlockHeraldry() {
 super(Material.wood);
 setHardness(0.2F);
 setResistance(0.2F);
 setBlockName(LibContent.HERALDRY_BLOCK_NAME);
 }

 @Override
 public void registerBlockIcons(IIconRegister p_149651_1_) {
 // NO-OP
 }

 @Override
 public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) {
 TileEntity tile = par1World.getTileEntity(par2, par3, par4);
 ItemStack stack = par5EntityPlayer.getCurrentEquippedItem();

 if(tile != null && tile instanceof TileEntityBanner && !par1World.isRemote) {
 boolean holding = stack != null;
 TileEntityBanner banner = (TileEntityBanner) tile;

 if(!holding && par5EntityPlayer.isSneaking()) {
 banner.locked = !banner.locked;
 par5EntityPlayer.addChatMessage(new ChatComponentText("Banner " + (banner.locked ? "Locked" : "Unlocked") + "."));
 }

 if(holding && stack.getItem() == CommonProxy.itemHeraldry && stack.getItemDamage() == 0) {
 if(banner.locked) {
 par5EntityPlayer.addChatMessage(new ChatComponentText("This banner is locked. Shift-Right click with an empty hand to unlock it."));
 } else {
 CrestData data = ItemHeraldry.readCrestData(stack);
 NBTTagCompound cmp = new NBTTagCompound();
 data.writeToCmp(cmp);
 banner.data = data;
 par1World.markBlockForUpdate(par2, par3, par4);
 }
 }
 }

 return true;
 }

 @Override
 public int getRenderType() {
 return -1;
 }

 @Override
 @SideOnly(Side.CLIENT)
 public IIcon getIcon(int par1, int par2) {
 return Blocks.planks.getIcon(0, 1);
 }

 @Override
 @SideOnly(Side.CLIENT)
 public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4) {
 int meta = par1World.getBlockMetadata(par2, par3, par4);
 if(isHanging(meta)) {
 float thickness = 0.1F;
 switch(getOrientation(meta)) {
 case 0 : {
 setBlockBounds(0F, 0F, 0F, thickness, 1F, 1F);
 break;
 }
 case 2 : {
 setBlockBounds(0F, 0F, 0F, 1F, 1F, thickness);
 break;
 }
 case 4 : {
 setBlockBounds(1F - thickness, 0F, 0F, 1F, 1F, 1F);
 break;
 }
 case 6 : {
 setBlockBounds(0F, 0F, 1F - thickness, 1F, 1F, 1F);
 break;
 }
 }
 return AxisAlignedBB.getBoundingBox(par2 + minX, par3 + minY - 0.5, par4 + minZ, par2 + maxX, par3 + maxY, par4 + maxZ);
 } else {
 float o = 0.0625F;
 setBlockBounds(o, 0F, o, 1F - o, 1F, 1F - o);
 return AxisAlignedBB.getBoundingBox(par2 + minX, par3 + minY, par4 + minZ, par2 + maxX, par3 + maxY + 0.8, par4 + maxZ);
 }
 }

 @Override
 public Item getItemDropped(int par1, Random par2Random, int par3) {
 return CommonProxy.itemHeraldry;
 }

 @Override
 public int damageDropped(int par1) {
 return isHanging(par1) ? 2 : 1;
 }

 @Override
 public boolean isOpaqueCube() {
 return false;
 }

 @Override
 public boolean renderAsNormalBlock() {
 return false;
 }

 @Override
 public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) {
 return null;
 }

 @Override
 public boolean getBlocksMovement(IBlockAccess par1iBlockAccess, int par2, int par3, int par4) {
 return true;
 }

 @Override
 public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, Block par5) {
 if(!canBlockStay(par1World, par2, par3, par4)) {
 dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0);
 par1World.setBlockToAir(par2, par3, par4);
 }
 }
 
    @Override 
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityLiving, ItemStack itemStack) 
    { 
        if (world.getTileEntity(x, y, z) instanceof TileEntityBanner) 
        {
            String owner = ""; 
            if (entityLiving instanceof EntityPlayer) 
            { 
                owner = ((EntityPlayer) entityLiving).getDisplayName(); 
            } 
            ((TileEntityBanner) world.getTileEntity(x, y, z)).setOwner(owner); 
        }
         
    }

 @Override
 public boolean canBlockStay(World par1World, int par2, int par3, int par4) {
 boolean canStay = true;
 int meta = par1World.getBlockMetadata(par2, par3, par4);
 boolean hanging = isHanging(meta);
 if(hanging) {
 canStay = par1World.isAirBlock(par2, par3 - 1, par4);
 if(canStay) {
 switch(getOrientation(meta)) {
 case 0 : {
 canStay = par1World.isSideSolid(par2 - 1, par3, par4, ForgeDirection.EAST, false);
 break;
 }
 case 2 : {
 canStay = par1World.isSideSolid(par2, par3, par4 - 1, ForgeDirection.SOUTH, false);
 break;
 }
 case 4 : {
 canStay = par1World.isSideSolid(par2 + 1, par3, par4, ForgeDirection.WEST, false);
 break;
 }
 default : {
 canStay = par1World.isSideSolid(par2, par3, par4 + 1, ForgeDirection.NORTH, false);
 break;
 }
 }
 }
 } else canStay = par1World.isSideSolid(par2, par3 - 1, par4, ForgeDirection.UP, false) && par1World.isAirBlock(par2, par3 + 1, par4);

 return canStay;
 }

 @Override
 public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) {
 return new ItemStack(CommonProxy.itemHeraldry, 1, isHanging(world.getBlockMetadata(x, y, z)) ? 2 : 1);
 }

 public static boolean isHanging(int meta) {
 return meta >= 8;
 }

 public static int getOrientation(int meta) {
 return isHanging(meta) ? meta - 8 : meta;
 }

 @Override
 public TileEntity createNewTileEntity(World world, int meta) {
 return new TileEntityBanner();
 }

}
 
3,005
192
592
lleon написал(а):
Код:
       if (par3World.getTileEntity(par4, par5, par6) instanceof TileEntityBanner) 
        {
            String owner = ""; 
            if (par2EntityPlayer instanceof EntityPlayer) 
            { 
                owner = ((EntityPlayer) par2EntityPlayer).getDisplayName(); 
            } 
            ((TileEntityBanner) par3World.getTileEntity(par4, par5, par6)).setOwner(owner); 
        }
        
        if (par3World.getTileEntity(par4, par5, par6) instanceof TileEntityBanner) 
        {
            String owner = "";
            String metaowner = ""; 
            if (par2EntityPlayer instanceof EntityPlayer) 
            { 
                owner = ((EntityPlayer) par2EntityPlayer).getDisplayName(); 
            } 
            metaowner = ((TileEntityBanner) par3World.getTileEntity(par4, par5, par6)).getOwner(); 
            
            if (metaowner != owner) {
             return false; 
            }
        }

Ты сначала его "сетаешь", а потом проверяешь.


И зачем проверка "par2EntityPlayer instanceof EntityPlayer" ? Там и так написано, что это игрок.
 
Упростил до:


Код:
    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) {
        //Смотрим на блок, записано ли туда имя юзера
        
        if (par3World.getTileEntity(par4, par5, par6) instanceof TileEntityBanner) 
        {
            String owner = "";
            String metaowner = ""; 
                owner = ((EntityPlayer) par2EntityPlayer).getDisplayName(); 
                metaowner = ((TileEntityBanner) par3World.getTileEntity(par4, par5, par6)).getOwner(); 
            
            if (metaowner != owner) {
                return false;    
            }
        }
        
        
        if (par3World.getTileEntity(par4, par5, par6) instanceof TileEntityBanner) 
        {
            String owner = ""; 
            owner = ((EntityPlayer) par2EntityPlayer).getDisplayName(); 
            ((TileEntityBanner) par3World.getTileEntity(par4, par5, par6)).setOwner(owner); 
        }

Эффекта нет
 
2,505
81
397
== сравнивает ссылки на объекты. equals не только ссылки, но и содержимое объекта, если этот метод переопределен. У двух одинаковых строк далеко не факт, что одинаковые ссылки.
 
Сверху