Как сделать так, чтобы блок вызывал взрыв, используя onEntityCollidedWithBlock?Minecraft Моддинг - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь заставить мой блок вызвать взрыв, когда игрок или моб сталкиваются с ним.Пока что я могу заставить их повредить их, но не вызвать взрыв.Кто-нибудь знает как?

Вот мой код:

package com.icearrow26.moreapples.blocks;

import com.icearrow26.moreapples.Main;
import com.icearrow26.moreapples.init.ModBlocks;
import com.icearrow26.moreapples.init.ModItems;
import com.icearrow26.moreapples.util.Interfaces.IHasModel;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.util.DamageSource;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.eventhandler.Event;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class TNTBase extends Block implements IHasModel{
    public TNTBase(String name, Material material)
    {
        super(material);
        setUnlocalizedName(name);
        setRegistryName(name);
        setCreativeTab(CreativeTabs.BUILDING_BLOCKS);

        ModBlocks.BLOCKS.add(this);
        ModItems.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName()));
    }

    @Override
    public void registerModels() {
        Main.proxy.registerItemRenderer(Item.getItemFromBlock(this), 0, "inventory");

    }
    public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn)
    {
        entityIn.attackEntityFrom(DamageSource.IN_WALL, 1.0F);
    }
}

1 Ответ

0 голосов
/ 02 октября 2018

Шаг 1: Всегда спрашивайте себя: «Ваниль делает что-то подобное?»

В этом случае да, Ваниль создает взрывы.Не когда сущность сталкивается с блоком, но это просто , когда делает это, а не как это делает.В данном случае EntityTNTPrimed - это тот класс, который нам нужен.

В нем мы находим этот метод:

private void explode()
{
    float f = 4.0F;
    this.world.createExplosion(this, this.posX, this.posY + (double)(this.height / 16.0F), this.posZ, 4.0F, true);
}

Вуаля.Теперь мы знаем, как делать взрывы.Копировать, вставлять, вызывать, когда мы хотим, чтобы это произошло.Шаг 2 не требуется.

Теперь о некоторых других вещах ...

Это общие проблемы, с которыми я сталкиваюсь все время, и их также необходимо исправить.

  1. IHasModel это глупо. Все элементы нуждаются в моделях, и вся информация, необходимая для регистрации модели, является общедоступной.Использование таких интерфейсов - это анти-паттерн, и вы выбрали его из учебника Youtube, сделав это практикой Cargo Cult Programming .Вам это вообще не нужно никогда.Просто позвоните ModelLoader.registerCustomModel() прямо в ваш ModelRegistryEvent обработчик
    • "Мне нужно пройти через мой прокси!"ты говоришь.Ваш обработчик ModelRegistryEvent должен уже быть в прокси вашего клиента. Класс ModelRegistryEvent только для клиента.
    • Я, вероятно, даже могу сказать вам, что такое видео YTвы смотрели и связывали вас напрямую с моим комментарием, в котором говорилось автору, что IHasModel глупо.Если я ошибаюсь, я пойду и сделаю комментарий.
  2. TNTBase скажет, что у вас также есть класс BlockBase где-то, что большинство вашихблоки расширяются (или это тот класс).Это еще один антипаттерн: использование наследования для повторного использования кода.
  3. Вы не являетесь владельцем icearrow26.com, поэтому не следует использовать его в качестве идентификатора вашего пакета (Minecraft использует net.minecraft, поскольку они владеют Minecraft.net!) Вы должны использовать mod вместо com или опустить все это вместе.
  4. У вас почти наверняка есть класс CommonProxy.Это глупо.Общий код может входить в ваш основной класс модов. Весь смысл прокси-системы состоит в том, чтобы отличать клиента от сервера и разрешать вызов кода, который может быть вызван только с одной стороны.одна сторона, не разбивая другую с неизвестными ссылками.Общий код может пойти куда угодно, ему не нужен прокси.

Дополнительная информация

...