対応バージョン:1.11 1.12
コマンドを使わずに自由に属性・AIを操作しモブを追加することができます。
見出し
1.NMSとは何か?
2.NMSの準備
3.CutomEntityのコーディング
4.CustomEntityの登録
1、NMSとは何か?
NMSとは、net.minecraft.serverの略語です。NMSEntityとかはNMS内のクラスを使ってEntityを追加することになります。
補足としてはServer-sideなmoddingに近いです。
NMS内にたくさんのクラスが、今回はこれを使ってCustomEntityを作っていきます
2、NMSの準備
NMSは通常のspigot-apiでは使えません、なので、pom.xml内のspigot-apiのdependencyを以下のようにする必要があります。
コード: 全て選択
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>(バージョンは書き換えなくても大丈夫です)</version>
</dependency>
3、CustomEntityのコーディング
今回は攻撃する豚を作っていきます。そのためにまず、NMSライブラリクラスを追加してください。
まず、名前は何でもいいですのでEntityPigを継承してクラスを作り、以下のようにしてください。
コード: 全て選択
public class EntityAttackablePig extends EntityPig {
public EntityAttackablePig(World world) {
super(world);
}
}
まずAIを追加していきます。protected void r()メソッドを作ってください。
r()メソッドはエンティティのAIを指定するメソッドになります。そしてこの豚に攻撃できるようにAIを追加していきます。
(AIの引数は一番下で解説します)
コード: 全て選択
protected void r() {
//Entityが泳ぐようになるAI
this.goalSelector.a(0, new PathfinderGoalFloat(this));
//近接攻撃するようになるAI
this.goalSelector.a(1, new PathfinderGoalMeleeAttack(this, 1.25D, false));
//ランダムに歩き回るAI、ランダムウォーク
this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D));
//指定したEntityを見つめるようになるAI
this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F));
//ランダムな方向を見るようになるAI
this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this));
//攻撃されたらやり返すようになるAI
this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false, new Class[0]));
//近くにいるEntityの中で指定されたものを攻撃するようになるAI
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<EntityHuman>(this, EntityHuman.class, 20, true, true, (Predicate<? super EntityHuman>) null));
}
initAttributes()はAttributeを指定するメソッドになります。
コード: 全て選択
protected void initAttributes() {
//EntityPigの属性を継承
super.initAttributes();
//モブの属性にATTACK_DAMAGE(攻撃力)を追加
getAttributeMap().b(Attributes.ATTACK_DAMAGE.asIAttribute());
//EntityPigの属性の値を上書きした上に新たに属性の値を追加
getAttributeInstance(Attributes.MAX_HEALTH.asIAttribute()).setValue(40.0D); //最大体力
getAttributeInstance(Attributes.ATTACK_DAMAGE.asIAttribute()).setValue(6.0D); //攻撃力
getAttributeInstance(Attributes.MOVEMENT_SPEED.asIAttribute()).setValue(0.4D); //移動速度
getAttributeInstance(Attributes.FOLLOW_RANGE.asIAttribute()).setValue(20.0D); //追尾距離
}
コード: 全て選択
public boolean B(Entity entity) {
boolean bool = entity.damageEntity(DamageSource.mobAttack(this), (int)getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).getValue());
if (bool)
a(this, entity);
return bool;
}
・おまけ的なもの・
die()メソッドでは死亡したときにドロップするアイテムをいじれたりできます。
(あくまでも追加、であって置き換えではありません。)
コード: 全て選択
public void die(DamageSource damageSource) {
if (!this.world.isClientSide) //クライアントサイドでないことを確認する
a(Items.COOKED_PORKCHOP, 1); //ドロップアイテムに一個の調理した豚肉を追加
super.die(damageSource); //継承元のEntityPigのdie()メソッドを呼び出す
}
4、CustomEntityの登録
Pluginに作った攻撃できる豚を登録していきます。登録はとても簡単で一行で済みます。
(attackable_pigはminecraft:pigのように追加されるので、summonコマンドで呼び出すことができます。)
コード: 全て選択
public void onEnable() {
//一番目の引数はminecraft:に続くもので、自分の好きな名前で構いません
NMSUtils.registerEntity("attackable_pig", Type.PIG, EntityAttackablePig.class, false); //これ
}
summonコマンドで召喚!
サバイバルにしたら攻撃してくれるはずです。(攻撃力6なのでだいぶ痛いです)
※解説※
AIの解説(アルファベット順、引数は一段下から)
・PathFinderGoalArrowAttack...スケルトンに実装されている弓で攻撃するAI
(IRangedEntityを継承したEntity、動くスピード、最大クールタイム、ターゲットとの最大距離)
(IRangedEntityを継承したEntity、動くスピード、最小クールタイム、最大クールタイム、ターゲットとの最大距離)
・PathFinderGoalBeg...オオカミに向けて骨か食べ物を差し出したとき、オオカミが首をかしげるようにするAI
(EntityWolf、プレイヤーとの最小距離)
未解説AI
・PathFinderGoalAvoidTargetその他もろもろ