Skip to content

Latest commit

 

History

History
122 lines (90 loc) · 3.41 KB

2-5_各种实体类的方法介绍.md

File metadata and controls

122 lines (90 loc) · 3.41 KB

上一节 下一节

第二章 第五节 各种实体类的方法介绍

参与编写者: ruo_shui

建议学习时间: 20分钟

学习要点:

了解Entity类

  1. 概述

Entity类是所有生物的基类,任何生物实体,包括掉落物都继承自Entity类。掉落物为一个实体继承 自EntityItem类。 若要实现自定义NPC则需要继承EntityHuman类。

  1. 自定义生物的实现

    首先创建一个类继承 Entity / EntityHuman

public CustomEntity extends Entity

​ 重写方法

/**
  * 注意在PowerNukkit中 此构造方法必须保留
 */
public CustomEntity(FullChunk chunk, CompoundTag nbt) {
     super(chunk, nbt);
 }

/**
  * 这里填写生物的 ID 值 建议参考WIKI百科内生物的命名空间ID
  */
@Override
public int getNetworkId() {
     return 0;
}

WIKI 百科

如果我们要实现其他功能则需要设置或重写方法

需要注意一点 基于Entity 类创建的实体需要重写 getHeight() 方法与 getWidth() 方法设置生物的碰撞箱不然会出现一些生物名称向下的情况

这里举几个常用设置

/**
  这里是构造函数
*/
public CustomEntity(FullChunk chunk, CompoundTag nbt) {
     super(chunk, nbt);
     this.setHealth(20);//设置生物当前血量为20点
     this.setMaxHealth(20);//设置生物最大血量为20点
     this.setImmobile(true);//当设置为true时 生物不会进行移动
     this.setNameTagVisible();//设置显示名称 虽然和下面表达效果相同但是不加这个会不显示
     this.setNameTagAlwaysVisible();//设置生物头部名称显示
     this.setNameTag("生物头部显示的内容"); //设置头部显示的内容
    
 }


/**碰撞箱体积*/
@Override
public float getHeight() {
   return 0.8f;
}

/**碰撞箱体积*/
@Override
public float getWidth() {
   return 1.2f;
}

/**
 生物AI的实现方法
 需要编写算法实现
 此方法相当于一个定时器,在每个tick循环执行
 编写算法让生物行动
*/
@Override
public boolean onUpdate(int currentTick) {
     return super.onUpdate(currentTick);
}

生成实体

//生成实体时我们需要获取 Position 对象 就是实体生成的位置
//获取之后实例化 自定义实体
//传入对象
CustomEntity custom = new CustomEntity(position.getChunk(),Entity.getDefaultNBT(position));
custom.spawnToAll();//生成实体展示给全部玩家

// 如果只想给单个玩家发送实体 则调用 spawnTo(玩家对象);
custom.spawnTo(Server.getInstance().getPlayer("Steve")/*玩家对象*/);

关闭实体

//几种常用的方法

//despawn方法并不会关闭实体,只是不显示给玩家
custom.despawnFromAll(); //和spawnToAll()相反,取消展示实体给全部玩家
custom.despawnFrom(Server.getInstance().getPlayer("Steve")/*玩家对象*/); //和spawnTo(玩家对象)相反,取消展示实体给指定玩家

//关闭实体 关闭后不能再调用spawnTo等方法
custom.close();

//杀死实体 和close()方法相比,使用此方法会正常掉落物品(如果有的话)
//如果custom是继承EntityLiving的 还会触发EntityDeathEvent
custom.kill();

上一节 下一节