Узнать кто сломал блок

127
0
Добрый вечер,

Подскажите как узнать кто сломал блок. Задача такая, если блок сломал игрок, то чтобы выпадал дроп, если блок сломан механизмом (карьер, поверхность перехода и т.п.) дропа не было. Версия майнкрафта 1.6.4

Я так понимаю world.getClosestPlayer мне не подойдет, потому что рядом может стоять игрок который блок и не ломал
 
471
5
Если ты на сервер, то, насколько я знаю есть спец. плагины, позволяющие отследить каждое действие игроков...
 
127
0
Да на сервере. Плагин тут не поможет. Нужно именно из мода понять сломан блок игроком или механизмом.
 
127
0
А как бы еще к дропу привязаться. Хотя есть мысль выставлять какой нить флаг и когда ломается блок по флагу проверять дропать или нет предмет. Я так понимаю в NTB флаг хранить?
 
127
0
В событии я проверяю кто сломал блок. Если блок сломал не игрок, мне нужно чтобы дропа содержимого блока не было.
 
127
0
Не лень, знать бы где смотреть.
[merge_posts_bbcode]Добавлено: 29.07.2015 01:13:54[/merge_posts_bbcode]

Спасибо, вроде нашел описание
 
127
0
Код:
@Override
    public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6) {
        if(par2EntityPlayer == null){
            return;
        }
        // TODO Auto-generated method stub
        super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6);
    }
Добавил метод, ломаю блок механизмом и дроп выпадает. Что делаю не так?
 
127
0
Код:
@ForgeSubscribe
    public void onHarvestBlocks(BlockEvent.HarvestDropsEvent event)
    {
        EntityPlayer player = event.harvester;
        Block block = event.block;
        if((block instanceof BlockCoverable) && player == null){
            event.drops.clear();
        }
    }
Такой код тоже не помогает
 

timaxa007

Модератор
5,831
409
672
travnik, без условия "player == null".
[merge_posts_bbcode]Добавлено: 29.07.2015 03:12:14[/merge_posts_bbcode]

Если механизмом ломается блок, то тут могут возникнуть проблемы. Так как механизмы могут брать просто из списка дропа, а не использовать метод для дропа блока или даже, что-то другое.
Думаю лучше обнулить дроп блока и использовать нужный метод, чтобы дропал при условии, если сломал игрок. Типа такого в классе блока:
Код:
public int quantityDropped(Random random) {
    return 0;
}

public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) {
    if (!player.capabilities.isCreativeMode) {

    }
}
 
127
0
timaxa007 написал(а):
Если механизмом ломается блок, то тут могут возникнуть проблемы. Так как механизмы могут брать просто из списка дропа, а не использовать метод для дропа блока или даже, что-то другое.
Если механизм будет брать из списка ничего страшного, главное чтобы дроп не выпадал при этом. В методе onBlockHarvested я как понимаю узнаю только кто сломал блок, как повлиять при этом на дроп?
 

timaxa007

Модератор
5,831
409
672
travnik, не знаю как будет лучше объяснить.
"onBlockHarvested" не зависит на стандартный дроп (может быть чуть-чуть), нужно содать внутри него свой тип дропа. Пока-что просто покажу пример:
Код:
public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) {
//Если игрок не равен нулю и не являеться игрок в креативе, то...
if (player != null && !player.capabilities.isCreativeMode) {
//Условие для серверной стороны и правилом игры разрешено дропать из блока, то...
if (!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) {
//Создаём EntityItem с нашем ItemStack'ом, в ItemStack'е может быть блок или предмет, который хотим дропнуть.
EntityItem entityitem = new EntityItem(world, (double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D,
new ItemStack(MyMod.my_block));
//Полсекунды он не сможет быть подобран существом.
entityitem.delayBeforeCanPickup = 10;
//Спаван EntityItem.
world.spawnEntityInWorld(entityitem);
}
}
}
Где "MyMod.my_block" это наш блок или предмет.
Как-бы этим кодом можно создать свой дроп.
Минус или Плюс этого кода, зависит от ваших потребностей, то что - дроп берётся не из списка, а значит очищая список дропа для этого блока (если конечно у него что-то есть в списке), не будет зависеть на этот код дропа.
 
127
0
Так мне нужно отменить дроп, а не создавать какой то дополнительный по условию
 
7,099
324
1,510
Ой ё... Почему так долго доходит? Ты можешь отменить дроп, но механизм все равно его возьмет. Поэтому сначала убираешь "ванильный" метод дропа, пусть он ничего не возвращает, потом в тот ивент вставляешь свой дроп, с учетом игрока.
 

timaxa007

Модератор
5,831
409
672
С помощью эванта:
Код:
MinecraftForge.EVENT_BUS.register(new YouEvent());
Код:
public class YouEvent {

@SubscribeEvent
public void noDrop(BlockEvent.HarvestDropsEvent event) {
    if (event.block instanceof BlockCoverable) {
        event.drops.clear();
    }
}

}
И/или-же в блоке можно написать:
Код:
public int quantityDropped(Random random) {
    return 0;
}
Какие-то побочные дропы вряд-ли получиться отменить, кроме спавна самого "EntityItem".
 
Сверху