Удар по мобу с блоком в руке (1.7.10)

4,047
63
645
Здравствуйте всем!
Подскажите, пожалуйста, существует ли метод в конструкторе блока, который можно использовать для определения бьют ли кого-нибудь этим блоком и кого именно бьют? А так же срабатывающий при попытки разрушить какой-либо другой блок, с этим блоком в руке?
Подозреваю, что это как-то связано с нажатием ЛКМ. Но меня интересуют именно воздействия на иные блоки или мобов, а не просто нажатие ЛКМ в воздухе.
Если такового метода в конструкторе нет, то как лучше решитьпоставленную задачу? Эвенты?
Спасибо )))
 
4,047
63
645
Чо-т я туплю...
Начал с удара, но не работает нифига (
Код:
    @SubscribeEvent
    public void onPlayerAttack(AttackEntityEvent e){
        ItemStack stack = e.entityPlayer.getHeldItem();
        if (e.entityPlayer != null && e.target != null && stack != null &&
            e.target instanceof EntityLivingBase) {
            if (stack.getItem() == ???) {
                EntityLivingBase target = (EntityLivingBase) e.target;
                target.attackEntityFrom(DamageSource.cactus, 30.0F);
            }
        }
    }

Как определить какой блок я держу в руках? На обычное == всё подчёркивает красным, а на instanceof чё-та я не понимаю, что писать.
Хелп!
 
4,047
63
645
Так, с определением разобрался, но урон всё равно не наносит... В чём беда?
Код:
    @SubscribeEvent
    public void onPlayerAttack(AttackEntityEvent e){
        ItemStack stack = e.entityPlayer.inventory.getCurrentItem();
        ItemBlock bl = new ItemBlock (TestMod.testBlock);
        if (e.entityPlayer != null && e.target != null && stack != null &&
            e.target instanceof EntityLivingBase) {
            if (stack.getItem() == bl) {
                e.target.attackEntityFrom(DamageSource.cactus, 30.0F);
            }
        }
    }
 

timaxa007

Модератор
5,831
409
672
Liahim, тебе типа этого надо? :
Код:
@SubscribeEvent
public void onPlayerAttack(AttackEntityEvent e) {
    if (e.entityPlayer != null && e.target != null && e.target instanceof EntityLivingBase) {

        ItemStack is = e.entityPlayer.getHeldItem();
        Block block = null;
        if (is != null) {
            if (is.getItem() instanceof ItemBlock && Block.getBlockFromItem(is.getItem()) != Blocks.air) {
                block = Block.getBlockFromItem(is.getItem());
            }
        }

        EntityLivingBase target = (EntityLivingBase)e.target;
        if (block != null) {
            if (block == Blocks.cactus) target.attackEntityFrom(DamageSource.cactus, 30.0F);
        }

    }
}
 
1,990
18
105
ItemBlock bl = new ItemBlock (TestMod.testBlock);
if (stack.getItem() == bl) {
Нельзя так сравнивать объекты в жабе. Нужен equals, но я сомневаюсь что он реализован.
Вот по идее рабочий вариант (хотя я давно с блоками не работал и мог ошибиться):

Код:
if (stack.getItem() instanceof ItemBlock) {
  if (((ItemBlock)stack.getItem()).getBlock() == TestMod.testBlock) { //а тут можно сравнивать, ибо getBlock() должен вернуть точно ту же ссылку на тот же объект, что и TestMod.testBlock
    doSomething();
  }
}
 

timaxa007

Модератор
5,831
409
672
Liahim, а я долбанул по свинье, умерла с первого удара. А ты эвент зарегистрировал?
 
4,047
63
645
Конечно.
Но у меня, видимо, дело даже не в условиях, а то ли в самом эвенте, то ли в уроне.

Пробовал оставлять чистый эвент без условий (ну, кроме проверки на ноль), всё равно не фурычит. Ни урон, ни просто проигрывание звука...

При этом, в том же классе есть другой эвент, который работает нормально (это я о правильности регистрации)...
ХЗ в чём дело...
[merge_posts_bbcode]Добавлено: 16.11.2015 14:12:07[/merge_posts_bbcode]

Вечером выложу полный код, может что-то всё же не так...
 
1,990
18
105
Ты точно зарегистрировал класс с перехватчиками событий в нужной шине?
Их несколько:
COMMON_BUS
FORGE_BUS
TERRAIN_GEN_BUS
 
4,047
63
645
А вот, кстати, может и нет.
А в какой нужно регить атаку?
У меня, вроде, в коммон. А нужно в фордже что ли?

Да, скорее всего, проблема в этом. Опять же, вечером проверю.
Я так понимаю, в один класс можно запихивать не все события?
 

timaxa007

Модератор
5,831
409
672
Код:
MinecraftForge.EVENT_BUS.register(new EventPlayer());
Код:
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import net.minecraft.block.Block;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.DamageSource;
import net.minecraftforge.event.entity.player.AttackEntityEvent;

public class EventPlayer {

    @SubscribeEvent
    public void onPlayerAttack(AttackEntityEvent e) {
        if (e.entityPlayer != null && e.target != null && e.target instanceof EntityLivingBase) {

            ItemStack is = e.entityPlayer.getHeldItem();
            Block block = null;
            if (is != null) {
                if (is.getItem() instanceof ItemBlock && Block.getBlockFromItem(is.getItem()) != Blocks.air) {
                    block = Block.getBlockFromItem(is.getItem());
                }
            }

            EntityLivingBase target = (EntityLivingBase)e.target;
            if (block != null) {
                if (block == Blocks.cactus) target.attackEntityFrom(DamageSource.cactus, 30.0F);
            }

        }
    }

}
 
1,990
18
105
Liahim написал(а):
Я так понимаю, в один класс можно запихивать не все события?
Можно запихать все, но надо на них не только 'подписаться' (аннотацией), но ещё и подсунуть класс для нужной категории событий. Если ты используешь события из всех трёх шин будет как-то так:

Код:
EventHooks hooks = new EventHooks();
MinecraftForge.EVENT_BUS.register(hooks);
MinecraftForge.TERRAIN_GEN_BUS.register(hooks);
FMLCommonHandler.COMMON_BUS.register(hooks);

Выше псевдокод, за названия классов\методов\полей не ручаюсь.
 
4,047
63
645
Ок! Так и сделаю.

А как можно ошмётков от блока добавить? Типа при ударе он разбивается.
Это частицы нужно спавнить?
[merge_posts_bbcode]Добавлено: 17.11.2015 00:49:22[/merge_posts_bbcode]

Ух, жесть... Как спаунить разобрался, но там куча аргументов...
Где можно глянуть название частиц и как задать им цвет моего блока?

[merge_posts_bbcode]Добавлено: 17.11.2015 01:07:24[/merge_posts_bbcode]

Угу... world.spawnParticle("blockcrack_ ???
А как здесь указать мой блок?
 
643
6
14
Liahim написал(а):
Угу... world.spawnParticle("blockcrack_ ???
А как здесь указать мой блок?
Причем здесь твой блок, это уже имеющиеся частицы, а через world он их спаунит, помоему в blockBreak или что то вроде, поищи в главном классе блока.
 
4,047
63
645
Народ! У меня тут краш как раз по этому блоку, в смысле, эвенту...
Вылетает при попытке ударить вагонетку или лодку (это же тоже ентити)...
Однако, крашлог пишет, что беда в 42-й строчке... Что-то я не понял, причём тут она?
Код:
    @SubscribeEvent
    public void onPlayerAttack(AttackEntityEvent e) {
        
        EntityPlayer player = e.entityPlayer; //42-я строка
        World world = player.worldObj;
        EntityLivingBase target = (EntityLivingBase)e.target;
То есть, просто при объявлении переменных О_о

Крашит даже, если ударить голой рукой... С мобами такого нет.

В чём может быть беда?
 
4,047
63
645
Так, всё решено.
Сперва проверяйте на ноль, а уж потом объявляйте )))

С частицами так и не разобрался, но да ладно... Пока забью на них. Если, что спрошу в отдельной теме.
А эту можно закрывать.

Всем спасибо )
 
Сверху