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クラスのコードです。)