参与编写者: ruo_shui
建议学习时间: 20分钟
了解Entity类
- 概述
Entity类是所有生物的基类,任何生物实体,包括掉落物都继承自Entity类。掉落物为一个实体继承 自EntityItem类。 若要实现自定义NPC则需要继承EntityHuman类。
-
自定义生物的实现
首先创建一个类继承 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;
}
如果我们要实现其他功能则需要设置或重写方法
需要注意一点 基于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();