当玩家或暴徒相撞时,我试图使自己的方块爆炸。到目前为止,我可以使它损坏它们,但不会触发爆炸。有人知道吗?
这是我的代码:
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);
}
}
答案 0 :(得分: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。
这些是我经常看到的常见问题,也应该纠正。
IHasModel
很愚蠢。 所有项目都需要模型,并且注册模型所需的所有信息都是公开的。使用这样的接口是一种反模式,您是从Youtube教程中挑选的,使它成为Cargo Cult Programming的实践。您根本不需要它。只需直接在您的ModelLoader.registerCustomModel()
处理程序中调用ModelRegistryEvent
ModelRegistryEvent
处理程序应该已经成为在您的客户端代理中。 ModelRegistryEvent
类是仅限客户端的。IHasModel
是愚蠢的。如果我错了,我会去做一条评论。TNTBase
告诉我,您的大多数代码块都在某个地方扩展了一个BlockBase
类(或者就是该类)。这是另一种反模式:使用继承进行代码重用。net.minecraft
,因为他们拥有 Minecraft.net!)您应该使用{{ 1}}而不是mod
或全部省略。com
类。真傻通用代码可以放在您的主mod类中。代理系统的全部重点是将客户端与服务器区别开并允许只能在一侧调用的代码被一方面调用,而不会因未知引用而使另一方崩溃。通用代码可以放在任何地方,不需要代理。