我在Minecraft中尝试添加实体 – Part 2【1.7.10】

首先

接下来是上一篇的续篇。上一篇文章请点击这里:在Minecraft中添加实体——第一部分【1.7.10】。
上一篇中,我们已经实现了基本的无功能实体。
本篇我们将继续创建其内容和具体行为。

开放环境 ᕕ( ᐛ )ᕗ

    • Windows 10

 

    • Minecraft 1.7.10

 

    • MinecraftForge 1.7.10 #1614

 

    IntelliJ IDEA 2019.1.3

让我们一起来做吧!

给实体添加功能

在此之前,我们需要对从父类要求的方法进行解释。

保护 void onImpact(MovingObjectPosition mop)

在 onUpdate 函数中,当 mop 不为空时,可以用来执行除了基本行为以外的动作
– MovingObjectPosition mop :可获取实体的速度、向量、位置以及撞击的方块坐标等信息

今回のように簡単な機能であれば、このメソッドだけで完結できます。
しかし、複雑な挙動をさせたい場合は、onUpdateメソッドをsuperタイプを呼んだ後に新たな処理を
書いて上げる必要があります。また、EntityThrowableを継承せず、全てオリジナルで書くのもありです。

好的,接下来我将写下内容。由于解释起来比较困难,我将直接在代码中进行书写。

    @Override
    protected void onImpact(MovingObjectPosition mop)
    {
//      mopのnullチェック ヒット判定が見当たらない場合エラーが出るのでそれの回避
        if(mop != null)
        {
//          Entityが当たったブロックを中心に3x3を耕したいので処理をで繰り返す
            for (int x = mop.blockX - 1; x <= mop.blockX + 1; x++)
            {
                for (int z = mop.blockZ - 1; z <= mop.blockZ + 1; z++)
                {
//                  置き換えたいブロックを取得する
                    Block i1 = this.worldObj.getBlock(x, mop.blockY, z);

//                  もしブロックが草ブロックまたは土だった場合
                    if (i1 == Blocks.grass || i1 == Blocks.dirt)
                    {
                        if (!this.worldObj.isRemote)
                        {
//                          ブロックを設置する
                            this.worldObj.setBlock(x, mop.blockY, z, Blocks.farmland);
                        }
                    }
                }
            }
        }
    }

大致是这样的。虽然用了各种方法,但基本上都是按照名称来的,所以请参考一下香草类。

创建Entity的渲染器

このままでは、前回の記事の最後にのせたように、謎の白い箱が飛び出すだけのダサい感じになってしまいます。
なので、バニラのエンダーパールのようにかっこいい演出をしてくれるレンダラーを追加します。

73b8b980cee77047882386e1adc76c29.png

在ClientProxy中,我们将这样写。
我们将registerRenders()方法放在基础类的预初始化处理中进行调用。


package mangalam.mineplus.client;

public class ClientProxy extends CommonProxy {

    public void registerRenders()
    {
        RenderingRegistry.registerEntityRenderingHandler(EntityPlow.class, new RenderSnowball(ItemRegistry.testPlow));
    }
}

注册实体渲染处理程序(EntityPlow.class, new RenderSnowball(ItemRegistry.testPlow)),=>
public static void registerEntityRenderingHandler(Class<? extends Entity> entityClass, Render renderer)

Entityのレンダラーを追加する 1つのEntity限定
– Class<? extends Entity> entityClass : レンダラーを適用するEntity
– Render renderer : レンダラー

2b7c4e0326c1148617adc78d2a942534.png

我试一试玩。

testplowthrow.gif

いい感じですね!よく見るとわかるんですが、Entityが消えるまでの判定がシビアで、3×4とかで耕される時もあります。
ぶっちゃけ今回はEntityを追加するのが目的なので、細かい処理は割愛させてもらいます。
もっと正確にやるなら、自分ならEntityItemのコード内から位置情報の処理を見つけてそれを流用してonUpdateを作り直すって感じでしょうか。
まぁそこを考え出すともっと複雑になるので今回はやめておきます。

结束

实现这个实体的过程比我想象的要简单。大概是两年前我尝试过一次,但几分钟后就放弃了。然而,当我看了原始代码和浏览了Forge网站后,我成功地实现了它。原始代码的使用是相当实用的,所以请大家尽情地使用并享受编码的乐趣吧。

祝愿大家过上美好的摩天轮生活!

广告
将在 10 秒后关闭
bannerAds