- 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:
GuiInventoryPlayerKill:
ContainerPlayerKill:
Handler:
Packet:
Эвент PlayerEvent.PlayerLoggedInEvent:
В самом 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));
}
}
}