Инвентарь, хотбар и слоты

Версия Minecraft
1.7.10
1,195
31
183
1. Инвентарь: делаю свой инвентарь. В нем слотов меньше, чем в оригинальном ванильном инвентаре. В выживании открывается собсна мой.
Но шмот который я буду подбирать, будет ложиться в слоты обычного инвентаря в выживании даже при моем инвентаре?
2. Хотбар: хочу урезать слоты хотбара. Можно юзнуть хуки, у меня свой проект. Однако, есть метод погеморройнее без него. Можете расписать, кто этим занимался или кто знает, я просто не очень допираю некоторые моменты и баги
Заранее спасибо :)
 
Решение
@fane4qa 2.Тут никакие хуки не нужны,Можно отрендерить свой хотбар и ограничить его вот таким одним из способов для колёска мышки.
1.Вроде нет.Но в любом случае можно использовать эвент подбора лута и там всё сделать.
Java:
//бомж ограничение слотов в хотбаре
            if (((EntityPlayer)this.mc.thePlayer).inventory.currentItem > 4 && ((EntityPlayer)this.mc.thePlayer).inventory.currentItem < 7) {
                ((EntityPlayer)this.mc.thePlayer).inventory.currentItem = 0;
            }
            if (((EntityPlayer)this.mc.thePlayer).inventory.currentItem >= 7 && ((EntityPlayer)this.mc.thePlayer).inventory.currentItem <= 9) {
                ((EntityPlayer)this.mc.thePlayer).inventory.currentItem = 4;
            }
269
8
19
@fane4qa 2.Тут никакие хуки не нужны,Можно отрендерить свой хотбар и ограничить его вот таким одним из способов для колёска мышки.
1.Вроде нет.Но в любом случае можно использовать эвент подбора лута и там всё сделать.
Java:
//бомж ограничение слотов в хотбаре
            if (((EntityPlayer)this.mc.thePlayer).inventory.currentItem > 4 && ((EntityPlayer)this.mc.thePlayer).inventory.currentItem < 7) {
                ((EntityPlayer)this.mc.thePlayer).inventory.currentItem = 0;
            }
            if (((EntityPlayer)this.mc.thePlayer).inventory.currentItem >= 7 && ((EntityPlayer)this.mc.thePlayer).inventory.currentItem <= 9) {
                ((EntityPlayer)this.mc.thePlayer).inventory.currentItem = 4;
            }
 

timaxa007

Модератор
5,831
409
672
1. Либо хук на EntityItem, что подбираемый лут будет ложиться в твои слоты. Либо заменить спаван EntityItem на свой Entity унаследованый от EntityItem, в котором метод который идёт в слоты игрока сменить на слоты твоего инвентаря.
2. Только не как не объяснишь, особенно когда это делал без хуков и не до конца сделал. Менять придётся во множество классов. Первое и главное изменить PlayerInventory, что связано с хот баром. Потом в настройки управления (ну или эвентом), чтобы не выбирались не нужные слоты хот бара. Искать пакеты который работает инвентарём игрока. Сам инвентарь сменить, чтобы не было не каких взаимодействий с не используемых слотов. А если будут сторонние моды, который открывай ванильный инвентарь, то тут будет лучше наверное не использовать что выше, а типа забить предметами которые нельзя будет вытащить из слотов, не дропнуть, даже при смерти. А дальще, только смотреть на краши.
 

Icosider

Kotliner
Администратор
3,603
99
664
1. Либо хук на EntityItem, что подбираемый лут будет ложиться в твои слоты. Либо заменить спаван EntityItem на свой Entity унаследованый от EntityItem, в котором метод который идёт в слоты игрока сменить на слоты твоего инвентаря.
Есть событие EntityItemPickupEvent, просто при подъёме предмета отменять событие(чтобы не клался в обычный контейнер), и уже потом добавлять в массив предметов своего инвентаря.
 
1,195
31
183
Глуми расписывал похожее в какой то теме
Только не как не объяснишь, особенно когда это делал без хуков и не до конца сделал. Менять придётся во множество классов. Первое и главное изменить PlayerInventory, что связано с хот баром. Потом в настройки управления (ну или эвентом), чтобы не выбирались не нужные слоты хот бара. Искать пакеты который работает инвентарём игрока. Сам инвентарь сменить, чтобы не было не каких взаимодействий с не используемых слотов. А если будут сторонние моды, который открывай ванильный инвентарь, то тут будет лучше наверное не использовать что выше, а типа забить предметами которые нельзя будет вытащить из слотов, не дропнуть, даже при смерти
Правда, слишком много багов. Хукнуть проще, думаю
Думаю просто сделать как советует mbutakov, не сильно геморно и действительно получается то что нужно
А вот со своим инвентарем у меня очень много вопросов, а чужие сорсы юзать не хочется, все таки, скопирую и не пойму даже, что и как работает
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Вот такие хуки использовал для рюкзака. То бишь у меня доступен вначале лишь хотбар(9 слотов), а если лежит рюкзак в своем слоте - открывается дополнительные слоты. Собсна, игрок не подбирает предметы когда у него не хватает места.
Java:
@Hook(returnCondition = ReturnCondition.ALWAYS)
    public static int storeItemStack(InventoryPlayer inventory, ItemStack item){
        ItemStack backpack = DayZInvPlayer.forPlayer(inventory.player).getKitsInventory().getStackInSlot(1);
        int inventorySize = 0;
        if(backpack != null && backpack.getItem() instanceof ItemBackpack){
            inventorySize = ((ItemBackpack)backpack.getItem()).getInventorySize(inventory.player, backpack);
        }
        
        for(int i = 0; i < InventoryPlayer.getHotbarSize() + inventorySize; ++i){
            if(inventory.mainInventory[i] != null && inventory.mainInventory[i].itemID == item.itemID && inventory.mainInventory[i].isStackable() && inventory.mainInventory[i].stackSize < inventory.mainInventory[i].getMaxStackSize() && inventory.mainInventory[i].stackSize < inventory.getInventoryStackLimit() && (!inventory.mainInventory[i].getHasSubtypes() || inventory.mainInventory[i].getItemDamage() == item.getItemDamage()) && ItemStack.areItemStackTagsEqual(inventory.mainInventory[i], item)){
                return i;
            }
        }

        return -1;
    }
    
    @Hook(returnCondition = ReturnCondition.ALWAYS)
    public static int getFirstEmptyStack(InventoryPlayer inventory){
        ItemStack backpack = DayZInvPlayer.forPlayer(inventory.player).getKitsInventory().getStackInSlot(1);
        int inventorySize = 0;
        if(backpack != null && backpack.getItem() instanceof ItemBackpack){
            inventorySize = ((ItemBackpack)backpack.getItem()).getInventorySize(inventory.player, backpack);
        }
        
        for(int i = 0; i < InventoryPlayer.getHotbarSize() + inventorySize; ++i){
            if(inventory.mainInventory[i] == null){
                return i;
            }
        }

        return -1;
    }
 
Сверху