Нужно записать куда-то моба.

Версия Minecraft
1.12+
586
32
136
Допустим, я хочу создать предмет, который при ПКМ по мобе сохраняет его , и при ПКМ по алмазной руде спавнит его.Также волнует, как получить ХП, моба.
 
1,015
9
102
Zarak написал(а):
Minebot написал(а):
Моба в ручную можно запихнуть в NBT предмета, и потом так же вручную из NBT заспавнить его, где надо. HP - EntityLivingBase#getHealth()

Как его запихнуть?(Я учусь)

Код:
 @Override
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
    RayTraceResult ray = Minecraft.getMinecraft().objectMouseOver;
    if (ray != null && ray.typeOfHit == RayTraceResult.Type.ENTITY && ray.entityHit instanceof EntityLivingBase){
        ItemStack stack = playerIn.getHeldItem(handIn); // Получаем предмет
        EntityLivingBase entity = (EntityLivingBase) ray.entityHit; // Получаем моба, на которого клинул игрок
        NBTTagCompound tag = stack.getTagCompound(); // Получаем таг
        // Записываем в таг харрактеристики моба... Опираясь на которые, мы его потом заспавним. Если хз как юзать NBT, то гугли и смотри гайды
    }
    return super.onItemRightClick(worldIn, playerIn, handIn);
}
 
586
32
136
Minebot написал(а):
Zarak написал(а):
Minebot написал(а):
Моба в ручную можно запихнуть в NBT предмета, и потом так же вручную из NBT заспавнить его, где надо. HP - EntityLivingBase#getHealth()

Как его запихнуть?(Я учусь)

Код:
 @Override
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
    RayTraceResult ray = Minecraft.getMinecraft().objectMouseOver;
    if (ray != null && ray.typeOfHit == RayTraceResult.Type.ENTITY && ray.entityHit instanceof EntityLivingBase){
        ItemStack stack = playerIn.getHeldItem(handIn); // Получаем предмет
        EntityLivingBase entity = (EntityLivingBase) ray.entityHit; // Получаем моба, на которого клинул игрок
        NBTTagCompound tag = stack.getTagCompound(); // Получаем таг
        // Записываем в таг харрактеристики моба... Опираясь на которые, мы его потом заспавним. Если хз как юзать NBT, то гугли и смотри гайды
    }
    return super.onItemRightClick(worldIn, playerIn, handIn);
}
Как именно тэг моба получить, ведь в нбт, я вижу только String, int ,float и ТД.
 
586
32
136
Minebot написал(а):
Код:
package zarak.DarkKnowladge.common.items.item;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

import org.lwjgl.opengl.GL11;

import cofh.redstoneflux.api.IEnergyContainerItem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList.EntityEggInfo;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ITickable;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraft.world.gen.structure.template.Template.EntityInfo;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickItem;
import zarak.DarkKnowladge.Main;
import zarak.DarkKnowladge.Materials;
import zarak.DarkKnowladge.Tabs;
import zarak.DarkKnowladge.common.hungler.EnumHundler.CopyPasterType;
import zarak.DarkKnowladge.common.mobs.EntityDiePig;
import zarak.DarkKnowladge.init.ModItem;

public class ItemCopyPaster extends Item {
 private String name = "copy_paster";
 private EntityLivingBase entity;

 public ItemCopyPaster() {
 setUnlocalizedName(name);
 setHasSubtypes(true);
 setRegistryName(name);
 setCreativeTab(Tabs.DK_TAB);
 this.setMaxStackSize(1);
 }

 @Override
 public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items) {
 for (int i = 0; i < CopyPasterType.values().length; i++) {
 items.add(new ItemStack(this, 1, i));
 }
 }

 @Override
 public void addInformation(ItemStack stack, World wolrdIn, List<String> list, ITooltipFlag flag) {
 if (stack.hasTagCompound()) {
 String name = "Empty";
 list.add(TextFormatting.AQUA + name.toUpperCase());
 }
 super.addInformation(stack, wolrdIn, list, flag);
 }

 @Override
 public ActionResult<ItemStack> onItemRightClick(World wolrdIn, EntityPlayer player, EnumHand hand) {
 RayTraceResult ray = Minecraft.getMinecraft().objectMouseOver;
 ItemStack stack = player.getHeldItem(hand);

 if (stack.getMetadata() == 0) {
 if (ray != null && ray.typeOfHit == ray.typeOfHit.ENTITY && ray.entityHit instanceof EntityLivingBase) {
 EntityLivingBase entity = (EntityLivingBase) ray.entityHit;
 NBTTagCompound tag = new NBTTagCompound();
 tag.setUniqueId("type", entity.getUniqueID());
 tag.setFloat("HP", entity.getHealth());
 stack.setTagCompound(tag);
 entity.setDropItemsWhenDead(false);
 entity.setDead();
 this.entity = entity;
 stack.setItemDamage(1);
 }
 if (stack.getMetadata() == 1) {
 if (!stack.hasTagCompound())
 return super.onItemRightClick(wolrdIn, player, hand);
 NBTTagCompound tag = stack.getTagCompound();
 wolrdIn.spawnEntity(entity);
 stack.setItemDamage(0);
 }
 }
 return super.onItemRightClick(wolrdIn, player, hand);
 }

}
Вот такую хр*нь сделал, не работает.
Zarak написал(а):
Как именно тэг моба получить, ведь в нбт, я вижу только String, int ,float и ТД.

serializeNBT и deserializeNBT
 
586
32
136
Minebot написал(а):
Во-первых, что за смачный return в начале условия? Во-вторых, ты при спавне не считываешь данные с NBT, которые ты записал

return,потому-что пришел от Bukkit!



у нас есть метод
Код:
wolrdIn.spawnEntity(entity);

как туда записать ХП, слоты?
 

CumingSoon

Местный стендапер
1,634
12
269
Лучше задайся вопросом: а как иначе записать? Зачем методу, который спавнит сущность, делать что-то с ее данными? По моей логике(а может и не только моей), стоит посмотреть entity. Наверняка там есть что-то типа getData и пр.
 
586
32
136
CoomingSoon написал(а):
Лучше задайся вопросом: а как иначе записать? Зачем методу, который спавнит сущность, делать что-то с ее данными? По моей логике(а может и не только моей), стоит посмотреть entity. Наверняка там есть что-то типа getData и пр.

entity.getDataManager()
и
entity.getEntityData()
Если я правильно тебя понял.
И как туда записать?
 
1,015
9
102
586
32
136
1,015
9
102
586
32
136
Agravaine написал(а):
Шо вы на клиенте городите? Сервер вас нафиг пошлет.

а великий мастер-моддер, как мне реализовать копирования и вставку моба?


Zarak написал(а):
Agravaine написал(а):
Шо вы на клиенте городите? Сервер вас нафиг пошлет.

а великий мастер-моддер, как мне реализовать копирования и вставку моба?

Код:
@Override
 public ActionResult<ItemStack> onItemRightClick(World wolrdIn, EntityPlayer player, EnumHand hand) {
 RayTraceResult ray = Minecraft.getMinecraft().objectMouseOver;
 ItemStack stack = player.getHeldItem(hand);
 if (stack.getMetadata() == 0) {
 if (ray != null && ray.typeOfHit == RayTraceResult.Type.ENTITY
 && ray.entityHit instanceof EntityLivingBase) {
 EntityLivingBase entity = (EntityLivingBase) ray.entityHit;
 NBTTagCompound tag = new NBTTagCompound();
 tag.setFloat("HP", entity.getHealth());
 stack.setTagCompound(tag);
 this.entity = entity;
 entity.setDropItemsWhenDead(false);
 entity.setDead();
 stack.setItemDamage(1);
 }
 } else {
 if (stack.hasTagCompound()) {
 NBTTagCompound tag = stack.getTagCompound();
 Float HP = tag.getFloat("HP");
 entity.setHealth(HP);
 entity.getEntityData().setInteger("entity.health", 20);
 wolrdIn.spawnEntity(entity);
 stack.setItemDamage(0);
 }
 }

 return super.onItemRightClick(wolrdIn, player, hand);
 }
Сделал так, но пишет такое в консоле:
Код:
Tried to add entity minecraft:creeper but it was marked as removed already
и моба нету(как я понял, я убил моба)
 
Сверху