[1.7.10] ItemStack из блока в мире и getItemDamage, цикл

318
12
Всем привет.
1) Пытаюсь получить itemStack от блока в мире. Но itemstack всегда равняется метадате 0. Это не работает :(
ItemStack iStack = new ItemStack(event.world.getBlock(event.x, event.y, event.z));
if(event.world.getBlock(event.x, event.y, event.z) == block && iStack.getItemDamage() == meta) {
System.out.println("+");
}
Что делать посоветуете? Есть идея, когда игрок нажимает колесиком мыши - блок на который навел игрок - ставится в слот(с нормальной метадатой). Только этот код, я не смог найти.

2) Как сделать такой цикл?
if(page == 1 && i >= 0 && i < 44) {}
if(page == 2 && i >= 44*(page-1) && i < 44*page) {}
if(page == 3 && i >= 44*(page-1) && i < 44*page) {}
переменная page ограничивается до переменной maxPages.

Большое спасибо!
 
Посмотреть в дроп блока.
[merge_posts_bbcode]Добавлено: 22.03.2016 23:45:03[/merge_posts_bbcode]

В классе Block метод dropBlockAsItemWithChance.
 
Используй getPickBlock от Forge'а:
Код:
@Override
public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) {
return new ItemStack(world.getBlock(x, y, z), 1, world.getBlockMetadata(x, y, z));
}
[merge_posts_bbcode]Добавлено: 22.03.2016 23:51:03[/merge_posts_bbcode]

Yarik написал(а):
timaxa007 написал(а):
Посмотреть в дроп блока.
В классе Block метод dropBlockAsItemWithChance.
А если дропается к примеру с камня булыжник?
Да, он это и делает, какой должен дроп такой и даст. Но не всегда бывают уникальные дропы, которые просто не узнаешь.
 
timaxa007 написал(а):
Используй getPickBlock от Forge'а:
Код:
@Override
public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) {
return new ItemStack(world.getBlock(x, y, z), 1, world.getBlockMetadata(x, y, z));
}
Я тупой в край(
Как получить MovingObjectPosition?
 
timaxa007 написал(а):
[merge_posts_bbcode]Добавлено: 23.03.2016 00:07:38[/merge_posts_bbcode]

И зачем тебе MovingObjectPosition?
 
timaxa007 написал(а):
timaxa007 написал(а):
И зачем тебе MovingObjectPosition?
Получать куда человек наводит, если на воздух то отменять. 
Пилю мод с гуишкой с запрещенными блоками и командами на запреты предметов/блоков. Думаю многим проектам это понравится.
 
Ну, окей. А то я подумал, ты так пытался с помощью getPickBlock дроп получит от блока.
 
timaxa007 написал(а):
Ну, окей. А то я подумал, ты так пытался с помощью getPickBlock дроп получит от блока.
Блин, не работает всё равно. В классе блок метода getPickBlock - не нашел.. :(
Как получить уже эту гребаную метадату у ItemStack, который я должен получить с блока который стоит в мире..
ААА, уже маюсь над проблеммой 3 дня(
 
Что-то типа этого:
Код:
@Override
public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
    MovingObjectPosition mop = block(player, 1.0F, 4.0D, true);
    if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
        int x = mop.blockX;
        int y = mop.blockX;
        int z = mop.blockX;
        Block block = world.getBlock(x, y, z);
        int metadata = world.getBlockMetadata(x, y, z);
        ItemStack item = new ItemStack(block, 1, metadata);
    }
    return is;
}


public static MovingObjectPosition block(EntityLivingBase entity_base, float fasc, double dist, boolean interact) {
    Vec3 vec3 = Vec3.createVectorHelper(entity_base.posX, entity_base.posY + entity_base.getEyeHeight(), entity_base.posZ);
    Vec3 vec31 = entity_base.getLook(fasc);
    Vec3 vec32 = vec3.addVector(vec31.xCoord * dist, vec31.yCoord * dist, vec31.zCoord * dist);
    MovingObjectPosition mop = entity_base.worldObj.rayTraceBlocks(vec3, vec32, interact);
    return mop;
}
Но если подумать, то это не всегда хорошо, так как к примеру - печку надо показывать с 0 метадатой.
 
Дак если я не ошибаюсь, то метод world.getBlockMetadata(x, y, z) вернет сторону печки, вместо метадаты. Хотя щас сам проверю и дам точный отчет.
 
Да, так и есть, но у меня появилась идея.
[merge_posts_bbcode]Добавлено: 23.03.2016 00:36:12[/merge_posts_bbcode]

Код:
@Override
public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
    MovingObjectPosition mop = block(player, 1.0F, 4.0D, true);
    if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
        int x = mop.blockX;
        int y = mop.blockX;
        int z = mop.blockX;
        Block block = world.getBlock(x, y, z);
        ItemStack item = block.getPickBlock(mop, world, x, y, z, player);
    }
    return is;
}
 
Код:
if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
                            int x = mop.blockX;
                            int y = mop.blockX;
                            int z = mop.blockX;
                            Block block2 = event.world.getBlock(x, y, z);
                            ItemStack is2 = block2.getPickBlock(mop, event.world, x, y, z);

                            if(Item.getItemFromBlock(block) == is2.getItem() && is2.getItemDamage() == meta) {
                                if(event.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) {
                                    message(event.entityPlayer, "§cВзаимодействие §2(§eПКМ§2)§c с данным блоком запрещенено.");
                                } 
                                if(event.action == PlayerInteractEvent.Action.LEFT_CLICK_BLOCK) {
                                    message(event.entityPlayer, "§cВзаимодействие §2(§eЛКМ§2)§c с данным блоком запрещенено.");
                                }
                                event.setCanceled(true);    
                            }
                        }
Краш:(
java.lang.NullPointerException: Ticking memory connection

Ссылается на строку: if(Item.getItemFromBlock(block) == is2.getItem() && is2.getItemDamage() == meta)
 
Нужно проверять, что объект не равен null.
[merge_posts_bbcode]Добавлено: 23.03.2016 00:47:33[/merge_posts_bbcode]

В таком случае я не знаю как будет лучше помочь.

[merge_posts_bbcode]Добавлено: 23.03.2016 00:50:40[/merge_posts_bbcode]

Я-бы скорее всего создал, так чтобы любую или какую-то определённую метадату запрещать.
 
timaxa007 написал(а):
Нужно проверять, что объект не равен null.
[merge_posts_bbcode]Добавлено: 23.03.2016 00:47:33[/merge_posts_bbcode]

В таком случае я не знаю как будет лучше помочь.
Но моянг то получает как то айтемстак в инвентарь когда нажимаю колесиком на блок в мире
[merge_posts_bbcode]Добавлено: 23.03.2016 00:51:51[/merge_posts_bbcode]

Я так и хочу, я указываю метадату и id в конфиге, Но как их сравнить с блоком который стоит в мире? Id я сравниваю, а мету как? Мету я додумался сравнивать с айтемстаком, но оно не работает как надо. Т.е тоже криво.
 
И скорее всего-бы ещё запрещать в инвентаре или/и в мире. В мире можно запретить, но для крафта он может понадобиться.
 
timaxa007 написал(а):
И скорее всего-бы ещё запрещать в инвентаре или/и в мире. В мире можно запретить, но для крафта он может понадобиться.
Блин, ну помогите, я уже реально в печяле.. Столько старания, т.к смог запретить везде, рендерить запрещенные блоки по странично, командами запрещать.. И столкнулся с тем, что в мире почти не реально чекать метадату блока. Ибо она кривая. Только получением айтемстака из блока с метадатой, и проверять ее на ту которую я в конфиг поставил. Но оно работает везде, кроме мира с блоком.
 
Yarik написал(а):
И столкнулся с тем, что в мире почти не реально чекать метадату блока. Ибо она кривая.
Она не кривая, она другая - так как метадата блока в мире и метадата ItemStack'а имею разные алгоритмы сохранения и их использования в разных видах объектах. По-этому придётся не легко создавать запретные предметы и блоки.
 
Назад
Сверху