距離によって武器を持ち替えるMobの作成方法

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.322046)

距離によって武器を持ち替えるMobの作成方法

投稿記事by ceu3994t09fj » 2018年11月18日(日) 22:04

modding初心者です。

minecraftのversionは1.7.10です。
forge-1.7.10-10.13.4.1558を使っています。
OSはmacで、Eclipceです。

距離によって弓と剣を持ち替えることのできる敵性Mobは作ることができるのでしょうか?

コード: 全て選択
public void setCombatTask()
    {
        this.tasks.removeTask(this.aiAttackOnCollide);
        this.tasks.removeTask(this.aiArrowAttack);
        ItemStack itemstack = this.getHeldItem();

        if (itemstack != null && itemstack.getItem() == なんか適当な弓系の武器)
        {
            this.tasks.addTask(4, this.aiArrowAttack);
        }
        else
        {
            this.tasks.addTask(4, this.aiAttackOnCollide);
        }
    }


の真ん中あたりにあるifのところを 「PlayerとMobの距離が〇〇以上である」みたいな感じにすれば(これもどうしたらよいか分かりませんが…)とりあえずは遠距離攻撃と近接攻撃は使い分けてくれるのかなとは思います。

だがしかし、そうした場合おそらく盛っている弓でガシガシ殴りだすことになるのではないでしょうか…どうしたら剣に持ち替えてくれるのか…?といった経緯で質問させていただきました。

どうか識者の方々、お力を貸してくださるとありがたいです。
ceu3994t09fj
ID:967ae89a
水から上がったとこ
 
記事: 5
登録日時: 2017年12月20日(水) 09:50

  • (PostNo.322245)

Re: 距離によって武器を持ち替えるMobの作成方法

投稿記事by さとなし » 2018年11月26日(月) 23:34

ceu3994t09fj さんが書きました:modding初心者です。

minecraftのversionは1.7.10です。
forge-1.7.10-10.13.4.1558を使っています。
OSはmacで、Eclipceです。

距離によって弓と剣を持ち替えることのできる敵性Mobは作ることができるのでしょうか?

コード: 全て選択
public void setCombatTask()
    {
        this.tasks.removeTask(this.aiAttackOnCollide);
        this.tasks.removeTask(this.aiArrowAttack);
        ItemStack itemstack = this.getHeldItem();

        if (itemstack != null && itemstack.getItem() == なんか適当な弓系の武器)
        {
            this.tasks.addTask(4, this.aiArrowAttack);
        }
        else
        {
            this.tasks.addTask(4, this.aiAttackOnCollide);
        }
    }


の真ん中あたりにあるifのところを 「PlayerとMobの距離が〇〇以上である」みたいな感じにすれば(これもどうしたらよいか分かりませんが…)とりあえずは遠距離攻撃と近接攻撃は使い分けてくれるのかなとは思います。

だがしかし、そうした場合おそらく盛っている弓でガシガシ殴りだすことになるのではないでしょうか…どうしたら剣に持ち替えてくれるのか…?といった経緯で質問させていただきました。

どうか識者の方々、お力を貸してくださるとありがたいです。


自分のForgeは1.12.2なので、参考程度に聞いてください。

とりあえず、次のコードでプレイヤーとモンスターの距離を求めることができました。
distance = this.getDistanceSq(this.getAttackTarget().posX, this.getAttackTarget().getEntityBoundingBox().minY, this.getAttackTarget().posZ);
ただし、getAttackTarget()はスポーン直後はnullであるため、
if (this.getAttackTarget() != null) {
distance = this.getDistanceSq(this.getAttackTarget().posX, this.getAttackTarget().getEntityBoundingBox().minY, this.getAttackTarget().posZ);
}
else {
distance = 0;
}
などでエラーになるのを避けてください。

しかし、このdistanceに応じてaiAttackArrowとaiAttackOnCollideを呼び出してみたのですが、弓矢で攻撃してくれませんでした。
(直接攻撃はしてくれました。)
aiAttackArrowとaiAttackOnCollideを呼び出すだけでは足りないみたいです。

また、武器の持ち替えは
setItemStackToSlot(EntityEquipmentSlot.MAINHAND, new ItemStack(Items.STONE_SWORD));
で装備武器を変更できそうですが、まだ確認できていません。(EntityWitherSkeletonクラスのコードです。)
さとなし
ID:b8708cfe
水から上がったとこ
 
記事: 4
登録日時: 2018年11月21日(水) 22:56

  • (PostNo.322271)

Re: 距離によって武器を持ち替えるMobの作成方法

投稿記事by ceu3994t09fj » 2018年11月28日(水) 19:18

返信ありがとうございます!

とりあえず助言に従って、

コード: 全て選択
public void setCombatTask()
    {
        this.tasks.removeTask(this.aiAttackOnCollide);
        this.tasks.removeTask(this.aiArrowAttack);
       
        double distance = this.getDistanceSq(this.getAttackTarget().posX, this.getAttackTarget().getBoundingBox().minY, this.getAttackTarget().posZ);
        if (this.getAttackTarget() != null) {
              if(distance <= 10D) {
              this.tasks.addTask(4, this.aiAttackOnCollide);
               }else{
               this.tasks.addTask(4, this.aiArrowAttack);
              }
        }else {
           distance = 0;
        }
     }


としてみたのですが、この状態でこのMobをスポーンさせた瞬間マイクラが落ちてしまうということになってしまいました…
おそらく引数かなにかが違うのかと思われますが何が違うのかわからず困惑しています…

また、参考にしようと思っていろいろ見てみました。しかしエンチャントテーブルやモブスポナーなどにはそれっぽい処理があったもののTileEntityなのであまり参考にできず…。またクリーパーには「プレイヤーが近づいたら何かを加算していって一定数値になったら爆発」みたいな処理があるかと期待したのですが、なにをやっているのかイマイチわからず応用は厳しそうです…(なにかdatawatcherを参照しているらしいのですがそのへんが分かりません…)
なにか「コイツのソースを見てみたら参考にできるかもよ」みたいなヤツなどないものでしょうか…
ceu3994t09fj
ID:967ae89a
水から上がったとこ
 
記事: 5
登録日時: 2017年12月20日(水) 09:50


Return to 質問:開発・制作関連

x