GUI у Entity

Версия Minecraft
1.7.10
118
0
Возник такой вопрос: возможно ли при клике на Entity открывать GUI?
Если да, то как?
Заранее спасибо
 
RE: [1.7.10] GUI у Entity

Да, я точно не знаю, но на сколько я знаю примерно надо:
С помощью метода interactFirst для Entity:
Если просто Gui с наследством GuiScreen, то просто на клиентской стороне.
Если Gui с наследством GuiContainer, то тут будет нужно будет типа открыть Container (не GuiContainer) и так-же на клиентской стороне открыть Gui.
У меня через отправку пакетов происходило.
Если у тебя IInventory у тебя в Entity, то в аргумент твоего Gui и Container твоего Entity, либо создавай класс с (наследством/)имплементацией IInventory в котором в конструкторе будет твой Entity. Если конечно тебе нужно указывать твоего Entity для Gui.
---
Типа открыть Gui, для клиентской стороны.
Код:
Minecraft.getMinecraft().displayGuiScreen(new MyGui(entity));
---
Типа открыть Container.
Код:
player.openContainer = new MyContainer(entity);
---
Ну как-то так.
 
RE: [1.7.10] GUI у Entity

svk2140 написал(а):
Dahaka написал(а):
Это был сарказм)
Мне аж жалко стало ;D

Да уж. Будем надеяться, что он еще вернется в тему... Лучше так не шутить.

Отправил ему ЛС. Должно на почту прийти)
 
RE: [1.7.10] GUI у Entity

CMTV написал(а):
svk2140 написал(а):
Dahaka написал(а):
Это был сарказм)
Мне аж жалко стало ;D

Да уж. Будем надеяться, что он еще вернется в тему... Лучше так не шутить.

Отправил ему ЛС. Должно на почту прийти)
Вернусь.. сейчас тестирую код тимахи потом отпишусь о результатах
 
RE: [1.7.10] GUI у Entity

Код:
Minecraft.getMinecraft().displayGuiScreen(new MyGui(entity);
Код:
player.openContainer = new ContainerYPT(entity);

Как я понял его надо указывать в конструкторе гуи/контейнера? Или в конструкторе метода

Либо это вообще в другом месте выполняется...
 
timaxa007 написал(а):
Если ты про открытие Gui и Container, то вроде как использовать в методе interactFirst для Entity.

это я знаю, дело в том то что эклипс ругается на entity... и вот я не знаю куда эту переменную добавлять
 
Ну тогда создай в классе твоего Ентити метод:
public boolean processInteract(EntityPlayer player, EnumHand hand, @Nullable ItemStack stack)

и в нем выполняй вызов Гуи. Если у тебя есть ГуиХандлер, то вызывай через player.openGui(MOD.instance, guiID, worldObj, x, y, z), если нету, то наверное командой player.openContainer, я не работал с ней
 
Как пример:
EntityMagicChest - это мой Entity.
Код:
private IInventory inventoryEntityMagicChest = new InventoryBasic("InventoryEntityMagicChest", false, 9 * 3);

@Override
public boolean interactFirst(EntityPlayer player) {
	if (player instanceof EntityPlayerMP) {
		//Синхранизация с NBT Entity на клиенте.
		SMTMagic.network.sendTo(getDescriptionPacket(), (EntityPlayerMP)player);
		//Открываем нашё Container.
		player.openContainer = new EntityMagicChestContainer(this, player);
		//Создаём пакет для отправки на клиент, чтобы открыть Gui.
		MessageOpenGuiEntityMagicChest packetOpenGui = new MessageOpenGuiEntityMagicChest();
		packetOpenGui.entityID = this.getEntityId();
		SMTMagic.network.sendTo(packetOpenGui, (EntityPlayerMP)player);
	}
	return true;
}

public IInventory getInventory() {
	return inventoryEntityMagicChest;
}
Код:
@SideOnly(Side.CLIENT)
private void act(MessageOpenGuiEntityMagicChest packet) {
	Minecraft mc = Minecraft.getMinecraft();
	Entity entity = mc.theWorld.getEntityByID(packet.entityID);
	if (entity instanceof EntityMagicChest) {
		mc.displayGuiScreen(new EntityMagicChestGui((EntityMagicChest)entity, mc.thePlayer));
	}
}
Код:
public class EntityMagicChestGui extends net.minecraft.client.gui.inventory.GuiContainer {

	private static final ResourceLocation furnaceGuiTextures = new ResourceLocation("textures/gui/container/furnace.png");
	private final EntityMagicChest entityMagicChest;

	public EntityMagicChestGui(EntityMagicChest entityMagicChest, EntityPlayer player) {
		super(new EntityMagicChestContainer(entityMagicChest, player));
		this.entityMagicChest = entityMagicChest;
	}

	@Override
	public void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
		if (entityMagicChest != null) {
			String s = entityMagicChest.getCommandSenderName();
			fontRendererObj.drawString(s, xSize / 2 - fontRendererObj.getStringWidth(s) / 2, 6, 4210752);
		}
		fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, ySize - 96 + 2, 4210752);
	}

	@Override
	public void drawGuiContainerBackgroundLayer(float parTick, int mouseX, int mouseY) {
		GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
		mc.getTextureManager().bindTexture(furnaceGuiTextures);
		int k = (width - xSize) / 2;
		int l = (height - ySize) / 2;
		drawTexturedModalRect(k, l, 0, 0, xSize, ySize);

		if (entityMagicChest != null) {
		}
	}

}
Код:
public class EntityMagicChestContainer extends net.minecraft.inventory.Container {

	private final EntityMagicChest entityMagicChest;

	public EntityMagicChestContainer(EntityMagicChest entityMagicChest, EntityPlayer player) {
		this.entityMagicChest = entityMagicChest;
		if (entityMagicChest != null) {
			addSlotToContainer(new Slot(entityMagicChest.getInventory(), 0, 56, 17));
			addSlotToContainer(new Slot(entityMagicChest.getInventory(), 1, 56, 53));
			addSlotToContainer(new SlotFurnace(player, entityMagicChest.getInventory(), 2, 116, 35));
		}

		int i;

		for (i = 0; i < 3; ++i) {
			for (int j = 0; j < 9; ++j) {
				addSlotToContainer(new Slot(player.inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
			}
		}

		for (i = 0; i < 9; ++i) {
			addSlotToContainer(new Slot(player.inventory, i, 8 + i * 18, 142));
		}
	}

//transferStackInSlot

	@Override
	public boolean canInteractWith(EntityPlayer player) {
		return entityMagicChest != null ? player.getDistanceToEntity(entityMagicChest) <= 64.0D : false;
	}
}
---
EntityMagicChestGui - основной код взят от Gui от ванильной печки и переделан под себя.
EntityMagicChestContainer основной код взят от Container от ванильной печки и переделан под себя.
---
Это не весь код, если надо будет весь скажешь. Код должен отличаться.
 
Думаю, что вопрос не тупой.
SMTMagic - это типа главный класс.
Примерно такое:
Код:
public class SMTMagic {
...
	public static SimpleNetworkWrapper network;

	@EventHandler
	public void preInit(FMLPreInitializationEvent event) {
		network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);
		network.registerMessage(MessageOpenGuiEntityMagicChest.Handler.class, MessageOpenGuiEntityMagicChest.class, 0, Side.CLIENT);
	}

}
---
Код:
public class MessageOpenGuiEntityMagicChest implements IMessage {

 public int entityID;

 public MessageOpenGuiEntityMagicChest() {}

 @Override
 public void toBytes(ByteBuf buf) {
 buf.writeInt(entityID);
 }

 @Override
 public void fromBytes(ByteBuf buf) {
 entityID = buf.readInt();
 }

 public static class Handler implements IMessageHandler<MessageOpenGuiEntityMagicChest, IMessage> {

 @Override
 public IMessage onMessage(MessageOpenGuiEntityMagicChest packet, MessageContext message) {
 if (FMLCommonHandler.instance().getSide().isClient())
 act(packet);
 else
 act(message.getServerHandler().playerEntity, packet);
 return null;
 }

 @SideOnly(Side.CLIENT)
 private void act(MessageOpenGuiEntityMagicChest packet) {
 Minecraft mc = Minecraft.getMinecraft();
 Entity entity = mc.theWorld.getEntityByID(packet.entityID);
 if (entity instanceof EntityMagicChest) {
 mc.displayGuiScreen(new EntityMagicChestGui((EntityMagicChest)entity, mc.thePlayer));
 }
 }

 private void act(EntityPlayerMP player, MessageOpenGuiEntityMagicChest packet) {
 Entity entity = player.worldObj.getEntityByID(packet.entityID);
 if (entity instanceof EntityMagicChest) {
 player.openContainer = new EntityMagicChestContainer((EntityMagicChest)entity, player);
 }
 }

 }

}
Он пока-что, только для клиента нужен.
 
Назад
Сверху