Для того, чтобы у вас было GUI, необходимо прописать под @Mod аннотацию
@NetworkMod(clientSideRequired=true, serverSideRequired=true)
(начиная с 1.7.2 этот пункт пропустить). Также необходимо иметь такие строки в том же классе:
@Instance("MODID")//Обязательно точно такую же строку, как и в @Mod(modid= !
public static ModClass anyName;//Переменная вашего класса в любым названием(чаще всего instance, на 2 месте mod)
После создания класса GuiHandler пропишем такую строку в метод init:
до 1.7 - NetworkRegistry.instance().registerGuiHandler(instance, new GuiHandler());
1.7 - NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandler());
GuiHandler:
Что-бы открыть ваше gui, вам нужен игрок, на сервере выполняем такой метод(там, где хотите открыть, разумеется)
player.openGui(ModClass.instance, 1/*id вашего gui*/, null/*тут необязательно можно дать World, который вам дадут в GuiHandler-е*/, -1, -1, -1 /*Тоже самое, что и с World, но коорды блока так передать можно(чтоб достать TileEntity)*/);
Теперь ContainerTest и GuiTest:
ContainerTest:
GuiTest:
Вот и ВСЕ.
Чтобы добавить - пишем 2 новых класса и потом новый case в GuiHandler-е. Так-же покопайтесь в методах GuiContainer, дабы что-то переписать, типа нарисовать текст и так далее.
P.S.: туториал со старого форума, думаю пригодится.
P.P.S.: автор - anti344
@NetworkMod(clientSideRequired=true, serverSideRequired=true)
(начиная с 1.7.2 этот пункт пропустить). Также необходимо иметь такие строки в том же классе:
@Instance("MODID")//Обязательно точно такую же строку, как и в @Mod(modid= !
public static ModClass anyName;//Переменная вашего класса в любым названием(чаще всего instance, на 2 месте mod)
После создания класса GuiHandler пропишем такую строку в метод init:
до 1.7 - NetworkRegistry.instance().registerGuiHandler(instance, new GuiHandler());
1.7 - NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandler());
GuiHandler:
Код:
public class GuiHandler implements IGuiHandler{
public Object getServerGuiElement(int id, EntityPlayer player, World wrd, int x, int y, int z){
switch(id){//В зависимости от id выбираем контейнер
case 1://
return new ContainerTest(player);//Вместо player можем дать что угодно, TileEntity, ItemStack предмета(сумки например), это же ваш класс с вашим конструктором
default:
return null;
}
}
public Object getClientGuiElement(int id, EntityPlayer player, World wrd, int x, int y, int z){
switch(id){//В зависимости от id выбираем gui
case 1:
return new GuiTest(player);//Важно, дать те же параметры, что и контейнеру, в классе GUI увидите
default:
return null;
}
}
}
Что-бы открыть ваше gui, вам нужен игрок, на сервере выполняем такой метод(там, где хотите открыть, разумеется)
player.openGui(ModClass.instance, 1/*id вашего gui*/, null/*тут необязательно можно дать World, который вам дадут в GuiHandler-е*/, -1, -1, -1 /*Тоже самое, что и с World, но коорды блока так передать можно(чтоб достать TileEntity)*/);
Теперь ContainerTest и GuiTest:
ContainerTest:
Код:
public class ContainerTest extends Container{
public ContainerTest(EntityPlayer player){//Как я и сказал, ваш конструктор - ваши правила
/*
* Слоту нужен какой-либо инвентарь(класс, в котором есть implements IInventory), его id в этом инвентаре, и x да y координаты
* Ниже в качестве теста, да и просто почти везде такое есть - инвентарь игрока
*/
for(int i = 0; i < 9; i++)//Циклом добавляем 9 слотов хотбара
addSlotToContainer(new Slot(player.inventory, i, 29/*x координата первого слота(двигаем хотбар)*/ + i * 18, 90/*y координата*/));
for(int i = 0; i < 3; i++)//Циклами остальной инвентарь
for(int j = 0; j < 9; j++)
addSlotToContainer(new Slot(player.inventory, j + i * 9 + 9, 56/*тоже самое, x*/ + j * 18, 24/*y*/ + i * 18));
}
public ItemStack transferStackInSlot(EntityPlayer player, int slotID){
return null; //Это фикс краша из-за шифта, просто его отключает, потом как-нибудь расскажу, можете посмотреть ContainerChest
}
public boolean canInteractWith(EntityPlayer player){
return true; // Меня заставили это всунуть!!(попробуйте удалить, ошибка будет, этот тупой метод abstract)
}
}
GuiTest:
Код:
public class GuiTest extends GuiContainer{
final private ResourceLocation texture = new ResourceLocation("modid", "textures/gui/test.png");//Ваши modid и путь к текстуре gui
public GuiTest(EntityPlayer player){
super(new ContainerTest(player));//Теперь понятно, зачем такие же параметры?
xSize = 222;//Тут размеры, сколько на сколько собстно, кликабельная картинка вашего gui(ведь файл текстуры должен быть 256 на 256!)
ySize = 112;// и до скольки мы обрежем при рендере, чтобы понятно было.
}
@Override
protected void drawGuiContainerBackgroundLayer(float partialTicks, int mX, int mY) {
int zX = (width - ySize) / 2; //Находим "координаты верхней левой точки прямоугольника с размерами нашей текстуры, который находится в центре экрана"
int zY = (height - ySize) / 2;// как я это называю
mc.getTextureManager().bindTexture(texture);//Ну это понятно
drawTexturedModalRect(zX, zY, 0, 0, xSize, ySize);//Отрисовываем на "тех самых координатах" картинку, начиная с 0, 0 координаты тестуры(u, v) и размерами, которые мы указали
}
}
Вот и ВСЕ.
Чтобы добавить - пишем 2 новых класса и потом новый case в GuiHandler-е. Так-же покопайтесь в методах GuiContainer, дабы что-то переписать, типа нарисовать текст и так далее.
P.S.: туториал со старого форума, думаю пригодится.
P.P.S.: автор - anti344