如何使用onEntityCollidedWithBlock召唤一个块爆炸?我的世界改装

时间:2018-10-02 00:27:06

标签: java minecraft minecraft-forge

当玩家或暴徒相撞时,我试图使自己的方块爆炸。到目前为止,我可以使它损坏它们,但不会触发爆炸。有人知道吗?

这是我的代码:

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 :(得分:1)

第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);
}

Voila。现在我们知道了如何爆炸。当我们希望它发生时,复制,粘贴,调用。无需步骤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!)您应该使用{{ 1}}而不是mod或全部省略。
  4. 几乎可以肯定您有一个com类。真傻通用代码可以放在您的主mod类中。代理系统的全部重点是将客户端与服务器区别开并允许只能在一侧调用的代码被一方面调用,而不会因未知引用而使另一方崩溃。通用代码可以放在任何地方,不需要代理。

More information