NMS(net.minecraft.server)を使ったCustomEntityの追加【spigot】

アバター
Reiga
ID: 3J5KPPTORF
記事: 36
登録日時: 2019年12月24日(火) 15:11
お住まい: 自室
Minecraft ID: Ign1s_Reiga
いいね: 1回
連絡する:

NMS(net.minecraft.server)を使ったCustomEntityの追加【spigot】

投稿記事 by Reiga » 2020年11月06日(金) 21:58

テスト済みバージョン:1.12.2
対応バージョン: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>
書き換えてエラーが起きなかったら完了です。Maven依存環境を見るとspigot-<指定したバージョン>.jarが追加され、前のapiが無くなっている事が分かります。


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));
}
次は属性(Attribute)を指定していきます。protected void initAttributes()を作ってください。
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); //追尾距離
}
最後に友好的なmobを敵対化するときに必要なメソッドを追加します。友好的なmobは攻撃するAIを入れても、攻撃するためのメソッドがないために、攻撃ができません。(敵対的mobには既に攻撃するためのメソッドが組み込まれているため、追加する必要がありません。)

コード: 全て選択

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その他もろもろ
1
1 画像



Tags: