Господа. Пондадобилось записать в 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();
}
}