Предмет с названием

Я сделал систему получения игрока как в Witchery через, например, иголку, которой тыкается сущность и должна появиться иголка (окровавленная) с кровью этой сущности и ее названием (!).

То бишь. Я ткнул сущность обычно иглой, ее удалили и дали мне иглу с названием: "Игла с кровью " + например, "Ololo". setUnlocalizedName сюда не подойдет. Как дать предмет с названием, содержащим помимо просто текста еще и имена мобов, игроков и т.д.?
 
Записывай в лист для метода addInformation, нужную информацию от предмета.
 
Крч, тут у меня ошибка. Сильная. В общем: все иглы теперь заменяются на последнюю. Ну в смысле: я тыкнул жителя, а потом скелета - обе иглы - с кровью скелета (странно, да?).

Мне нужно, чтоб каждая получаемая игла была отдельная и новая - чтоб не все иглы меняли имя, а лишь эта, и чтоб их нельзя было стакать
[merge_posts_bbcode]Добавлено: 20.03.2016 16:18:37[/merge_posts_bbcode]

Как вообще работает addInformation? Как мне ее использовать тут?
 
Нужно в методе getUnlocalizedName(ItemStack), делать проверку на нужный предмет и возвращать для него своё имя.
[merge_posts_bbcode]Добавлено: 20.03.2016 15:25:13[/merge_posts_bbcode]

Magitrop написал(а):
Как вообще работает addInformation?
К примеру так:
Описание предмета, прочность и ID

Magitrop написал(а):
Как мне ее использовать тут?
Где тут? Мы/Я не видел исходный код.
 
Код:
package com.alchemy.alchemy;

import cpw.mods.fml.common.registry.LanguageRegistry;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.effect.EntityLightningBolt;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemAxe;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;

import java.util.List;
import java.util.UUID;

public class Needle extends ItemAxe
{
    public Needle(Item.ToolMaterial material)
    {
        super(material);
        this.maxStackSize = 1;
        this.setCreativeTab(AlchemyBase.TabSpiritualism);
        this.setTextureName(AlchemyBase.MODID + ":Needle");
        this.setMaxDamage(material.getMaxUses());
    }

    @Override
    public void registerIcons(IIconRegister par1IconRegister)
    {
        this.itemIcon = par1IconRegister.registerIcon(AlchemyBase.MODID + ":Needle");
    }

    public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity)
    {
        if (entity instanceof EntityLivingBase)
        {
            EntityLivingBase entity_base = (EntityLivingBase) entity;

            if (player.worldObj.rand.nextInt(5) == 0)
            {
                entity.playSound("random.explode", 1.0F, 1.0F);
                entity_base.addPotionEffect(new PotionEffect(Potion.confusion.id, 0, 5));
                player.inventory.consumeInventoryItem(AlchemyBase.Needle);
                player.inventory.addItemStackToInventory(new ItemStack(AlchemyBase.NeedleWithBlood, 1));

                for (int i = 0; i < 10; i++)
                {
                    entity.worldObj.spawnParticle("reddust", entity.posX, entity.posY + 0.5, entity.posZ, 0.0D, 0.1D, 0.0D);
                }
            }
        }

        this.setDamage(stack, this.getDamage(stack) + 1);

        if (this.getDamage(stack) >= this.getMaxDamage(stack))
        {
            player.inventory.consumeInventoryItem(this);
        }

        return true;
    }
}
[merge_posts_bbcode]Добавлено: 20.03.2016 16:34:49[/merge_posts_bbcode]

Код:
package com.alchemy.alchemy;

import cpw.mods.fml.common.registry.LanguageRegistry;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;

import java.util.List;

public class NeedleWithBlood extends Item
{
    public NeedleWithBlood(int par1)
    {
        //this.setCreativeTab(AlchemyBase.TabSpiritualism);
        this.setTextureName(AlchemyBase.MODID + ":NeedleWithBlood");
        this.setUnlocalizedName("NeedleWithBlood");
    }

    @Override
    public void registerIcons(IIconRegister par1IconRegister)
    {
        this.itemIcon = par1IconRegister.registerIcon(AlchemyBase.MODID + ":NeedleWithBlood");
    }

    @Override
    public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool)
    {
        super.addInformation(stack, player, list, bool);
    }
}

[merge_posts_bbcode]Добавлено: 20.03.2016 16:35:00[/merge_posts_bbcode]

1 - просто игла
2 - игла с кровью
 
В 1 возможно нету setUnlocalizedName в конструкторе.
И во 2 не надо супер для метода addInformation в этом предмете.
 
1 - это просто игла. Там не обязательно надо setUnlocalizedName, но теперь оно есть.
2 - теперь там нету super'а.

Хорошо, а что теперь?
[merge_posts_bbcode]Добавлено: 20.03.2016 16:45:43[/merge_posts_bbcode]

Код:
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool)
{
    list.add("");
}

[merge_posts_bbcode]Добавлено: 20.03.2016 16:46:37[/merge_posts_bbcode]

Вообще вот: мне нужно добавить в информацию (list.add) название тыкнутой сущности
Но я не могу взять из кода иглы тыкнутую сущность, потому что она есть лишь в методе onLeftClickEntity

[merge_posts_bbcode]Добавлено: 20.03.2016 16:51:25[/merge_posts_bbcode]

Кажись вышло

[merge_posts_bbcode]Добавлено: 20.03.2016 17:05:55[/merge_posts_bbcode]

Не вышло.
 
Вот я набросал:
Код:
@Override
public boolean onLeftClickEntity(ItemStack is, EntityPlayer player, Entity entity) {
    if (entity instanceof EntityLivingBase) {
        EntityLivingBase entity_base = (EntityLivingBase) entity;

        if (player.worldObj.rand.nextInt(5) == 0) {
            entity.playSound("random.explode", 1.0F, 1.0F);
            entity_base.addPotionEffect(new PotionEffect(Potion.confusion.id, 0, 5));
            //player.inventory.consumeInventoryItem(AlchemyBase.Needle);
            //player.inventory.addItemStackToInventory(new ItemStack(AlchemyBase.NeedleWithBlood, 1));

            for (int i = 0; i < 10; i++) {
                entity.worldObj.spawnParticle("reddust", entity.posX, entity.posY + 0.5, entity.posZ, .0D, 0.1D, 0.0D);
            }
            is = addNBT(is, entity_base);
        }
    }

    is.damageItem(1, player);

    return true;
}

@Override
public String getUnlocalizedName(ItemStack is) {
    NBTTagCompound nbt = is.getTagCompound();
    if (nbt != null) {
        if (nbt.hasKey("DNAP", NBT.TAG_STRING)) {
            return "Иголка с ДНК.";
        }
        if (nbt.hasKey("DNAE", NBT.TAG_STRING)) {
            return "Иголка с ДНК.";
        }
    } else return "Чистая иголка.";
    return super.getUnlocalizedName();
}

@Override
public void addInformation(ItemStack is, EntityPlayer player, List list, boolean flag) {
    NBTTagCompound nbt = is.getTagCompound();
    if (nbt != null) {
        if (nbt.hasKey("DNAP", NBT.TAG_STRING)) {
            list.add("ДНК игрока: " + nbt.getString("DNAP") + ".");
        }
        if (nbt.hasKey("DNAE", NBT.TAG_STRING)) {
            list.add("ДНК моба: " + StatCollector.translateToLocal(nbt.getString("DNAE")) + ".");
        }
    }
}

@SideOnly(Side.CLIENT)
public void getSubItems(Item item, CreativeTabs table, List list) {
    list.add(addNBT(new ItemStack(item), null));
}

private static ItemStack addNBT(ItemStack is, EntityLivingBase entity) {
    NBTTagCompound nbt = is.getTagCompound();
    if (nbt == null) nbt = new NBTTagCompound();
    if (entity != null) {
        nbt.setString("DNA" + (entity instanceof EntityPlayer ? "P" : "E"), entity.getCommandSenderName());
    }
    is.setTagCompound(nbt);
    return is;
}
[youtube]5-emjhprcbw[/youtube]
 
Есть 2 вопроса

1) Как менять текстуру при получении ДНК (при клике должна меняться текстура, setTextureName не работает)?
2) Теперь при клике игла просто уничтожается, прочность не теряется. Иногда на мгновение появляется игла с кровью но и она тут же исчезает. Иногда все нормально. Что делать?
[merge_posts_bbcode]Добавлено: 20.03.2016 20:03:08[/merge_posts_bbcode]

И еще: если я тыкаю стаком игл из 4 предметов - все они становятся иглами с ДНК.
 
1. Использовать для этого метод getIcon.
2. Сделать по своему и понимать что значит код.
Я просто набросал, я не делал полностью готовый код для использования.
[merge_posts_bbcode]Добавлено: 20.03.2016 19:21:29[/merge_posts_bbcode]

И лучше использовать рандом на серверной стороне.

[merge_posts_bbcode]Добавлено: 20.03.2016 19:23:44[/merge_posts_bbcode]

Просто на серверной и на клиентской стороне будет разные значения рандома.

[merge_posts_bbcode]Добавлено: 20.03.2016 19:43:40[/merge_posts_bbcode]

Код:
@Override
public boolean onLeftClickEntity(ItemStack is, EntityPlayer player, Entity entity) {
    if (!player.worldObj.isRemote) {

        NBTTagCompound nbt = is.getTagCompound();
        if (nbt == null || (!nbt.hasKey("DNAP", NBT.TAG_STRING) && !nbt.hasKey("DNAE", NBT.TAG_STRING))) {

            if (entity instanceof EntityLivingBase) {
                EntityLivingBase entity_base = (EntityLivingBase) entity;

                if (player.worldObj.rand.nextInt(5) == 0) {
                    entity.playSound("random.explode", 1.0F, 1.0F);
                    entity_base.addPotionEffect(new PotionEffect(Potion.confusion.id, 0, 5));
                    //player.inventory.consumeInventoryItem(AlchemyBase.Needle);
                    //player.inventory.addItemStackToInventory(new ItemStack(AlchemyBase.NeedleWithBlood, 1));

                    for (int i = 0; i < 10; i++) {
                        entity.worldObj.spawnParticle("reddust", entity.posX, entity.posY + 0.5, entity.posZ, 0.0D, 0.1D, 0.0D);
                    }
                    ItemStack is_new = is.copy();
                    --is.stackSize;
                    if (is.stackSize <= 0) {
                        if (player.getCurrentEquippedItem() == is) {
                            player.setCurrentItemOrArmor(0, null);
                        } else is = null;
                    }
                    is_new.stackSize = 1;
                    is_new = addNBT(is_new, entity_base);
                    player.inventory.addItemStackToInventory(is_new);
                }
            }

        }

    }
    return true;
}
 
Назад
Сверху