- Версия(и) Minecraft
- 1.7.10
Предисловие.
Почему не использовать уже имеющийся
Послесловие.
Открытие инвентаря предмета или можно своего инвентаря для игрока.
Открытие инвентаря Entity.
Открытие инвентаря блока/TileEntity.
------------
Все три варианта - (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.
---
Используете код с умом. Спасибо, за внимание.
Своё открытие Gui с Container'ом. Зачем?
Я давно хотел сделать свою отправку, потому-что хотел и дабы не было лишней информации в пакете. Меньше информации, не так долго передаётся по сети и быстрее обработается.
То что представляется через
(github.com) MinecraftForge - FML - FMLMessage.java#L46 подКласс OpenGui
Я давно хотел сделать свою отправку, потому-что хотел и дабы не было лишней информации в пакете. Меньше информации, не так долго передаётся по сети и быстрее обработается.
То что представляется через
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, вполне подходит
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 укатываться.
...
А 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]
-----
-----
---
Используете код с умом. Спасибо, за внимание.