Создание моба и инвентаря

Версия Minecraft
1.7.10
317
10
Создал свое entity c inventory. Создал gui, container.
В самом entity буду хранить itemstack + player. (в коде пока что храню только player'а).
В Gui пытаюсь получить ник. Он всегда пустой почему то. Походу на клиенте + сервере разные EntityId;
NBT в Entity так-же почему то слетает.
Получаю на клиенте String ника player'а при помощи пакетов(код тоже ниже, реализовал с помощью EntityID + nickName). (в эвенте RenderWorldLastEvent работает т.е рендерит ник, а в GUI не работает)
Как реализовать?
Буду благодарен за помощь...
Вотс ниже все коды.

В XModDayZ.java:
public static HashMap<EntityPlayerKilled, String> map = new HashMap();


Spawn: 
Код:
EntityPlayerKilled player = new EntityPlayerKilled(event.player.worldObj);
if(!event.player.worldObj.isRemote) {
 player.setPlayer(event.player.getDisplayName());
 player.setLocationAndAngles(event.player.posX, event.player.posY+0.3f, event.player.posZ, 0, 10);
 event.player.worldObj.spawnEntityInWorld(player);
 XModDayZ.pipeline.sendToAll(new PacketUpdateInvKilled(event.player.getDisplayName(), player.getEntityId()));
 XModDayZ.getPlayerData(event.player).setBoolean("kill", true);
}



EntityPlayerKilled:
Код:
public class EntityPlayerKilled extends EntityMob implements IInvBasic {
public String player = "";
public EntityPlayerKilled(World w) {
    super(w);
    } 
    public void setPlayer(String player1) {
    this.player = player1;
    System.out.println("setPlayer: "+ player);
    if(!this.worldObj.isRemote) {
     XModDayZ.map.clear();
     XModDayZ.pipeline.sendToAll(new PacketUpdateInvKilled(getPlayer(), this.getEntityId()));
     if(!XModDayZ.map.containsKey(this)) {
 XModDayZ.map.put(this, this.player);
 System.out.println(this.getEntityId()+": "+XModDayZ.map.get(this));
}
    }
    }
    public String getPlayer() {
    return player;
    }
    
    public boolean interact(EntityPlayer player) { 
    if(!worldObj.isRemote) {
     XModDayZ.pipeline.sendToAll(new PacketUpdateInvKilled(getPlayer(), this.getEntityId()));
     if(!XModDayZ.map.containsKey(this)) {
 XModDayZ.map.put(this, this.player);
}
     player.openGui(XModDayZ.instance, 0, worldObj, 0, 0, 0);
    }
return true;
    }

    protected void updateEntityActionState() { }
    protected void updateLeashedState() {}
    
    public void writeEntityToNBT(NBTTagCompound nbt) {
    XModDayZ.pipeline.sendToAll(new PacketUpdateInvKilled(getPlayer(), this.getEntityId()));
if(!XModDayZ.map.containsKey(this)) {
XModDayZ.map.put(this, this.player);
System.out.println(this.getEntityId()+": "+XModDayZ.map.get(this));
}
nbt.setString("player", getPlayer());
    super.writeEntityToNBT(nbt);
    }
    public void readEntityFromNBT(NBTTagCompound nbt) {
    this.setPlayer(nbt.getString("player"));
    XModDayZ.pipeline.sendToAll(new PacketUpdateInvKilled(getPlayer(), this.getEntityId()));
    if(!XModDayZ.map.containsKey(this)) {
XModDayZ.map.put(this, this.player);
}
    super.readEntityFromNBT(nbt);
    }
@Override
public void onInventoryChanged(InventoryBasic inv) {}
}



GuiInventoryPlayerKill:
Код:
public class GuiInventoryPlayerKill extends GuiContainer {
EntityPlayerKilled entity;
public GuiInventoryPlayerKill(InventoryPlayer inventory, EntityPlayerKilled entity, Container c) {
super(c);
this.entity = entity;
}
@Override
protected void drawGuiContainerBackgroundLayer(float x,int y, int p_146976_3_) {
this.fontRendererObj.drawString("§f"+entity.getPlayer(), 10, 10, 0);
}
}



ContainerPlayerKill:
Код:
public class ContainerPlayerKill extends Container {
EntityPlayerKilled entity;
public ContainerPlayerKill(InventoryPlayer inventory, EntityPlayerKilled entity) {
this.entity = entity;
}
@Override
public boolean canInteractWith(EntityPlayer p_75145_1_) {
return true;
}
}


Handler:
Код:
public class Handler implements IGuiHandler {
@Override
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
switch(ID) {
case 0: 
return new ContainerPlayerKill(player.inventory, new EntityPlayerKilled(world));
}
return null;
}
@Override
public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
switch(ID) {
case 0: 
return new GuiInventoryPlayerKill(player.inventory, new EntityPlayerKilled(world), new ContainerPlayerKill(player.inventory, new EntityPlayerKilled(world)));
}
return null;
}
}


Packet:
Код:
public class PacketUpdateInvKilled extends AbstractPacket {
String player;
int entityId;
public PacketUpdateInvKilled() {}
public PacketUpdateInvKilled(String player, int entityId) {this.player = player; this.entityId = entityId;}
@Override
public void encodeInto(ChannelHandlerContext var1, ByteBuf var2) {
ByteBufUtils.writeUTF8String(var2, player);
var2.writeInt(entityId);
}
@Override
public void decodeInto(ChannelHandlerContext var1, ByteBuf var2) {
player = ByteBufUtils.readUTF8String(var2);
entityId = var2.readInt();
}
@Override
public void handleClientSide(EntityPlayer var1) {
if(Minecraft.getMinecraft().theWorld.getEntityByID(entityId) instanceof EntityPlayerKilled) {
EntityPlayerKilled entity = (EntityPlayerKilled) Minecraft.getMinecraft().theWorld.getEntityByID(entityId);
entity.setPlayer(this.player);
if(!XModDayZ.map.containsKey(entity)) {
 XModDayZ.map.put(entity, this.player);
}
}
}
@Override
public void handleServerSide(EntityPlayer player) {}
}



Эвент PlayerEvent.PlayerLoggedInEvent:
Код:
if(!event.player.worldObj.isRemote) {
//XModDayZ.map.clear();
List playerList = event.player.worldObj.loadedEntityList;
if (playerList == null) {
 return;
}
for(int i = 0; i < playerList.size(); ++i) {
 if(playerList.get(i) instanceof EntityPlayerKilled) {
 EntityPlayerKilled entity = (EntityPlayerKilled)playerList.get(i);
 XModDayZ.pipeline.sendToAll(new PacketUpdateInvKilled(entity.player, entity.getEntityId()));
 if(!XModDayZ.map.containsKey(entity)) {
  XModDayZ.map.put(entity, entity.player);
 }
 //System.out.println(entity.getEntityId()+": "+XModDayZ.map.get(entity));
 }
}
}
 

timaxa007

Модератор
5,831
409
672
Yarik написал(а):
массив ItemStack'ов
Массив ItemStack'а или массивы ItemStack'ов? Если второе, то не очень получиться нормально.

Yarik написал(а):
м, а можно создать мапу и туда записать player'а и массив ItemStack'ов ?
И потом получить его?
Да и нет. Потому-что насколько "потом"? Игрок можно умереть и:
- На сервере (мультиплеер), может произойти перезагрузка сервера и все значения пропадут.
- На клиенте (одиночная игра), ты можешь выйти из игры (программы) и все значения пропадут.
 
317
10
timaxa007 написал(а):
Yarik написал(а):
массив ItemStack'ов
Массив ItemStack'а или массивы ItemStack'ов? Если второе, то не очень получиться нормально.

Yarik написал(а):
м, а можно создать мапу и туда записать player'а и массив ItemStack'ов ?
И потом получить его?
Да и нет. Потому-что насколько "потом"? Игрок можно умереть и:
- На сервере (мультиплеер), может произойти перезагрузка сервера и все значения пропадут.
- На клиенте (одиночная игра), ты можешь выйти из игры (программы) и все значения пропадут.

Про массив ItemStack'а/ов не особо понимаю,но записать в мапу хочу это: map.put(player, player.inventory.mainInventory). Ибо мне броня не нужна.
Это будет все только на сервере. А разница между записью и получению 1-2 секунды. Так что я за рестарт не боюсь.
 
317
10
Тэкс, с тем что выше разобрался и работает)
P.s а как теперь добавить в спавн в мире моего моба?
Я пробовал копать в эвенте EntityJoinWorldEvent и кажись я понял что надо спавнить моего моба в измерение. Только откуда я буду брать координаты дабы "переместить" его на нужную локацию?
 
317
10
wilah написал(а):

Да не это, я имею ввиду в каком эвенте спавнить мобов в мире автоматом. К примру как спавнятся те же свнинозомби в аду и т.п. Я не про world.spawnEntityInWorld. Если можно то с примером кода...
p.s Извините за такую наглость :C
 
317
10
timaxa007 написал(а):
Yarik написал(а):
как спавнятся свиньи
Код:
Entity entity = new EntityPig(world);
entity.setPosition(posX, posY, posZ);
world.spawnEntityInWorld(entity);

Я про это знаю.
Я спрашиваю в каком это эвенте делать дабы спавнить мобов в мире постоянно к примеру когда игрок бегает ночью и во круг него спавнятся мобы.
И если в эвенте то как делать задержку что бы каждый тик не спавнились. И где брать координаты posX, posY, posZ?
 

timaxa007

Модератор
5,831
409
672
Код:
EntityRegistry.addSpawn(Class <? extends EntityLiving > entityClass, int weightedProb, int min, int max, EnumCreatureType typeOfCreature, BiomeGenBase... biomes)


Как пример:
Код:
EntityRegistry.addSpawn(EntityPig.class, 25, 4, 6, EnumCreatureType.creature, BiomeGenBase.forest, BiomeGenBase.forestHills, BiomeGenBase.jungle, BiomeGenBase.icePlains);
EntityPig.class - класс свиньи, у него есть родитель EntityLiving.
25 - на сколько часто спавниться,
4 - минимальное количество за раз спавниться,
6 - максимальное количество за раз спавниться,
EnumCreatureType.creature - под каким типом спавниться: creature - как мирные мобы, monster - как враждебные мобы, waterCreature - как водные мобы, ambient - как летучи мыши.
Дальше через запятую в каких биомах - у меня как пример: горный лес, джунгли и заснеженные равнины.


EntityRegistry.addSpawn желательно ставить рядом с кодом, где ты регистрируешь этого моба.
 
Сверху