Своё открытие Gui с Container'ом.

Своё открытие Gui с Container'ом.

Версия(и) Minecraft
1.7.10
Предисловие.
Своё открытие Gui с Container'ом. Зачем?
Я давно хотел сделать свою отправку, потому-что хотел и дабы не было лишней информации в пакете. Меньше информации, не так долго передаётся по сети и быстрее обработается.
То что представляется через NetworkRegistry.INSTANCE.registerGuiHandler(#instanceMod, #IGuiHandler); оно больше подходит для блоков и TileEntity. А для Entity и Item - через пакет отправляется значения, некоторые из них не особо участвую.
(github.com) MinecraftForge - FML - FMLMessage.java#L46 подКласс OpenGui

Почему не использовать уже имеющийся NetworkRegistry.INSTANCE.registerGuiHandler(#instanceMod, #IGuiHandler);.
Для отправки пакета, для IGuiHandler, нужно: тип String ID мода, int тип ID окна, int тип ID для открытия Gui или Container и int тип координат "x, y и z".
ID окна и ID открытие Gui или Container - нужны.
ID мода в String типе, нужно для понятия, через какой мод пользоваться зарегистрированным IGuiHandler.
Для открытия инвентаря предмета или своего для игрока - координаты "x, y и z" не нужны.
Для открытия инвентаря Entity, можно использовать одну из координат в качестве ID Entity, но остальные два не задействованы.
Для открытия инвентаря блока/TileEntity, вполне подходит NetworkRegistry.INSTANCE.registerGuiHandler(#instanceMod, #IGuiHandler);.

Послесловие.
У меня не будут передаваться значение ID мода.
А ID Gui или Container будет не int, а byte. Не когда не удавалось хотя-бы 100 окон было.
Можно-было и ID окна в byte отправлять, судя по методу getNextWindowId в игроке, но сама переменная currentWindowId в int типе. Но не решил как-бы рисковать, может на каком-то сервере будет особое id укатываться.
...

Открытие инвентаря предмета или можно своего инвентаря для игрока.
Код:
public class OpenGuiMessage implements IMessage {

    public int windowID/*, id*/;
    public byte id;

    public OpenGuiMessage() {}

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeInt(windowID);
        //buf.writeInt(id);
        buf.writeByte(id);
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        windowID = buf.readInt();
        //id = buf.readInt();
        id = buf.readByte();
    }

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

        @Override
        public IMessage onMessage(OpenGuiMessage packet, MessageContext message) {
            if (message.side.isClient())
                act(packet);
            else
                act(message.getServerHandler().playerEntity, packet);
            return null;
        }

        @SideOnly(Side.CLIENT)
        private void act(OpenGuiMessage packet) {
            Minecraft mc = Minecraft.getMinecraft();
            OpenGuiMod.proxy.openGui(packet.id, mc.thePlayer);
            mc.thePlayer.openContainer.windowId = packet.windowID;
        }

        private void act(EntityPlayerMP player, OpenGuiMessage packet) {
            OpenGuiMod.proxy.openGui(packet.id, player);
        }

    }

}
Код:
	private static Container getContainer(final int id, final EntityPlayer player) {
		return null;
	}

	public void openGui(byte id, EntityPlayer player) {
		if (player instanceof EntityPlayerMP) {
			EntityPlayerMP playerMP = (EntityPlayerMP)player;
			Container container = getContainer(id, player);
			if (container == null) return;
			playerMP.closeContainer();
			playerMP.getNextWindowId();
			int windowId = playerMP.currentWindowId;

			OpenGuiMessage message = new OpenGuiMessage();
			message.windowID = windowId;
			message.id = id;
			OpenGuiMod.network.sendTo(message, playerMP);

			player.openContainer = container;
			playerMP.openContainer.windowId = windowId;
			playerMP.openContainer.addCraftingToCrafters(playerMP);
		}
	}
Код:
	private static GuiScreen getGui(final int id, final EntityPlayer player) {
		return null;
	}

	public void openGui(byte id, EntityPlayer player) {
		if (player instanceof EntityPlayerMP)
			super.openGui(id, player);
		else if (FMLCommonHandler.instance().getSide().equals(Side.CLIENT)) {
			GuiScreen gui = getGui(id, player);
			if (gui == null) return;
			Minecraft.getMinecraft().displayGuiScreen(gui);
		}
	}

Открытие инвентаря Entity.
Код:
public class OpenGuiEntityMessage implements IMessage {

    public int windowID,/* id,*/ entityID;
    public byte id;

    public OpenGuiEntityMessage() {}

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeInt(windowID);
        //buf.writeInt(id);
        buf.writeByte(id);
        buf.writeInt(entityID);
    }

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

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

        @Override
        public IMessage onMessage(OpenGuiEntityMessage packet, MessageContext message) {
            if (message.side.isClient())
                act(packet);
            else
                act(message.getServerHandler().playerEntity, packet);
            return null;
        }

        @SideOnly(Side.CLIENT)
        private void act(OpenGuiEntityMessage packet) {
            Minecraft mc = Minecraft.getMinecraft();
            OpenGuiMod.proxy.openGui(packet.id, mc.thePlayer, mc.theWorld.getEntityByID(packet.entityID));
            mc.thePlayer.openContainer.windowId = packet.windowID;
        }

        private void act(EntityPlayerMP player, OpenGuiEntityMessage packet) {
            OpenGuiMod.proxy.openGui(packet.id, player, player.worldObj.getEntityByID(packet.entityID));
        }

    }

}
Код:
	private static Container getContainer(final int id, final EntityPlayer player, final Entity entity) {
		return null;
	}

	public void openGui(byte id, EntityPlayer player, Entity entity) {
		if (player instanceof EntityPlayerMP) {
			EntityPlayerMP playerMP = (EntityPlayerMP)player;
			Container container = getContainer(id, player, entity);
			if (container == null) return;
			playerMP.closeContainer();
			playerMP.getNextWindowId();
			int windowId = playerMP.currentWindowId;

			OpenGuiEntityMessage message = new OpenGuiEntityMessage();
			message.windowID = windowId;
			message.id = id;
			message.entityID = entity.getEntityId();
			OpenGuiMod.network.sendTo(message, playerMP);

			player.openContainer = container;
			playerMP.openContainer.windowId = windowId;
			playerMP.openContainer.addCraftingToCrafters(playerMP);
		}
	}
Код:
	private static GuiScreen getGui(final int id, final EntityPlayer player, final Entity entity) {
		return null;
	}

	public void openGui(byte id, EntityPlayer player, Entity entity) {
		if (player instanceof EntityPlayerMP)
			super.openGui(id, player, entity);
		else if (FMLCommonHandler.instance().getSide().equals(Side.CLIENT)) {
			GuiScreen gui = getGui(id, player, entity);
			if (gui == null) return;
			Minecraft.getMinecraft().displayGuiScreen(gui);
		}
	}

Открытие инвентаря блока/TileEntity.
Код:
public class OpenGuiPositionMessage implements IMessage {

    public int windowID,/* id,*/ x, y, z;
    public byte id;

    public OpenGuiPositionMessage() {}

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeInt(windowID);
        //buf.writeInt(id);
        buf.writeByte(id);
        buf.writeInt(x);
        buf.writeInt(y);
        buf.writeInt(z);
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        windowID = buf.readInt();
        //id = buf.readInt();
        id = buf.readByte();
        x = buf.readInt();
        y = buf.readInt();
        z = buf.readInt();
    }

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

        @Override
        public IMessage onMessage(OpenGuiPositionMessage packet, MessageContext message) {
            if (message.side.isClient())
                act(packet);
            else
                act(message.getServerHandler().playerEntity, packet);
            return null;
        }

        @SideOnly(Side.CLIENT)
        private void act(OpenGuiPositionMessage packet) {
            Minecraft mc = Minecraft.getMinecraft();
            OpenGuiMod.proxy.openGui(packet.id, mc.thePlayer, mc.theWorld, packet.x, packet.y, packet.z);
            mc.thePlayer.openContainer.windowId = packet.windowID;
        }

        private void act(EntityPlayerMP player, OpenGuiPositionMessage packet) {
            OpenGuiMod.proxy.openGui(packet.id, player, player.worldObj, packet.x, packet.y, packet.z);
        }

    }

}
Код:
	private static Container getContainer(final int id, final EntityPlayer player, final World world, final int x, final int y, final int z) {
		return null;
	}

	public void openGui(byte id, EntityPlayer player, World world, int x, int y, int z) {
		if (player instanceof EntityPlayerMP) {
			EntityPlayerMP playerMP = (EntityPlayerMP)player;
			Container container = getContainer(id, player, world, x, y, z);
			if (container == null) return;
			playerMP.closeContainer();
			playerMP.getNextWindowId();
			int windowId = playerMP.currentWindowId;

			OpenGuiPositionMessage message = new OpenGuiPositionMessage();
			message.windowID = windowId;
			message.id = id;
			message.x = x;
			message.y = y;
			message.z = z;
			OpenGuiMod.network.sendTo(message, playerMP);

			player.openContainer = container;
			playerMP.openContainer.windowId = windowId;
			playerMP.openContainer.addCraftingToCrafters(playerMP);
		}
	}
Код:
	private static GuiScreen getGui(final int id, final EntityPlayer player, final World world, final int x, final int y, final int z) {
		return null;
	}

	public void openGui(byte id, EntityPlayer player, World world, int x, int y, int z) {
		if (player instanceof EntityPlayerMP)
			super.openGui(id, player, world, x, y, z);
		else if (FMLCommonHandler.instance().getSide().equals(Side.CLIENT)) {
			GuiScreen gui = getGui(id, player, world, x, y, z);
			if (gui == null) return;
			Minecraft.getMinecraft().displayGuiScreen(gui);
		}
	}
------------
Все три варианта - (github.com) open_gui v0 [source]
------------
Так-же сделано с рабочим примером: предмета, Entity и блока/TileEntity. По отдельности не сделано.
(github.com) open_gui v1 [source]
(github.com) open_gui v1 [resource]
Пример с предметом, я брал у себя-же, но слегка переделаный (я досей пор его пытаюсь доделать) [1.7.10] Хранение вещей в предмете (слив кода)
-----
Открытия блока/TileEntity.
-----
Для призыва Entity с инвентарём, нужно: поставить "Ящик" который блок, предметом "Оживлятор" ПКМ по блоку "Ящик", "Ящик" сломаеться без дропа и появиться Entity с инвентарём. Предметы которые были в "Ящик'е" будет и в Entity.
---
Устаревие видео про Entity.
---
Используете код с умом. Спасибо, за внимание.
Автор
timaxa007
Просмотры
2,120
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя timaxa007

Последние обновления

  1. Обновление ресурса

    Обновление ресурса. код под спойлеры Добавлено.
  2. getGui and getContainer

    Можно ещё по другому написать в ProxyCommon и ProxyClient: public class ProxyCommon {...
Сверху