【1.7.10】ItemのonUpdateでカーソル先のentityを攻撃したい【自己解決】

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

【1.7.10】ItemのonUpdateでカーソル先のentityを攻撃したい【自己解決】

投稿記事by KAISEEEEI217 » 2016年10月31日(月) 13:51

Forge1.7.10-10.13.4.1558で、
カーソルを向けているentityに持っているだけでダメージを与える、というアイテムを作っているのですが、
カーソルを向けているentityを取得するコードが探しても見つかりません。(ネームタグのクラスを探しましたが良く分からず・・・)
ダメージはattackEntityFromで与えようと思っています。
この方法が難しいようでしたら、
playerに触れた、もしくはplayerを中心とした半径1ブロックにいるentityに
ダメージを与えるでもかまいません。(これも探しましたが結局分からず)
以下きたないソースと元ネタです。よろしく御願いします。

インポート等は省略しています。
コード: 全て選択
public class KokiriSword extends ItemSword {
   public KokiriSword(ToolMaterial toolMaterial) {
      super(toolMaterial);
      this.setCreativeTab(Main.tabKaiseimod);
      this.setUnlocalizedName("KokiriSword");
      this.setTextureName("kaiseimod:kokiri_sword");
   }
   public boolean onEntitySwing(EntityLivingBase entity, ItemStack stack) {
      World world = entity.worldObj;

      if(!world.isRemote)
      {
         //NBTタグを取得します。
         NBTTagCompound nbt = stack.getTagCompound();
         if(nbt == null)
         {
            nbt = new NBTTagCompound();
            stack.setTagCompound(nbt);
         }
         nbt.setInteger("SwingCnt", 1);
         nbt.setBoolean("Yuuyo", false);
         System.out.println("swing");
      }
      return false;
   }
   public void onUpdate(ItemStack itemStack, World world, Entity entity, int slot, boolean isHeld) {
      if(!world.isRemote)
      {
         //NBTタグを取得します。
         NBTTagCompound nbt = itemStack.getTagCompound();
         if(nbt == null)
         {
            nbt = new NBTTagCompound();
            itemStack.setTagCompound(nbt);
         }
         if (nbt.getInteger("SwingCnt") >= 1) {
            nbt.setInteger("SwingCnt", nbt.getInteger("SwingCnt") + 1);
            System.out.println("残像剣待機");
         }
         if (nbt.getInteger("SwingCnt") >= 5) {
            System.out.println("残像剣猶予");
            nbt.setBoolean("Yuuyo", true);
         }
         if (nbt.getInteger("SwingCnt") == 11) {
            System.out.println("残像剣終わり");
            nbt.setInteger("SwingCnt", 0);
            nbt.setBoolean("Yuuyo", false);
         }
         if (nbt.getBoolean("Zanzou")) {
            EntityPlayer player = (EntityPlayer) entity;
            //player.swingItem();//なぐれない
            System.out.println("残像");
            //ここにダメージを入れたい
         }
      }
   }

   public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {
      if(!world.isRemote)
      {
         //NBTタグを取得します。
         NBTTagCompound nbt = itemStack.getTagCompound();
         if(nbt == null)
         {
            nbt = new NBTTagCompound();
            itemStack.setTagCompound(nbt);
         }
         nbt.setBoolean("Zanzou", false);
         System.out.println("残像false");
         if (nbt.getBoolean("Yuuyo")) {
            nbt.setBoolean("Zanzou", true);
            System.out.println("残像true");
         } else {
            nbt.setInteger("SwingCnt", 0);
            nbt.setBoolean("Yuuyo", false);
            System.out.println("猶予じゃない");
         }
      }
      return itemStack;
   }
}

元ネタは、ゼルダの伝説時のオカリナ/ムジュラの仮面のバグ技 残像剣。
盾突きをした後にAボタンアクションをすると剣のダメージが連続で出続ける、というもの。
最後に編集したユーザー KAISEEEEI217 [ 2016年11月02日(水) 20:02 ], 累計 1 回
KAISEEEEI217
ID:08f00c18
木を殴ってる
 
記事: 25
登録日時: 2014年6月22日(日) 13:27

  • (PostNo.286896)

Re: 【1.7.10】ItemのonUpdateでカーソル先のentityを取得したい

投稿記事by KAISEEEEI217 » 2016年11月02日(水) 20:01

自己解決しました。
ほかの方のソースを参考にしています。
以下のソースをonUpdate内に実装させれば向けるだけで攻撃ができます。
コード: 全て選択
if(!world.isRemote) {
   EntityPlayer player = (EntityPlayer) entity;
   if (entity instanceof EntityPlayer) {
      Entity lentity = null;
      // 自身の周囲のMOBを獲得
      List entitylist = world.getEntitiesWithinAABB(EntityLiving.class, entity.boundingBox.expand(5D, 0D, 5D));
      for (int cnt = 0; cnt < entitylist.size(); cnt++) {
         // 自分は除外
         EntityLiving listEntityLiving = (EntityLiving)entitylist.get(cnt);
         Entity listEntity = (Entity) entitylist.get(cnt);
         if (listEntityLiving == lentity || listEntityLiving.getEntityId() == player.getEntityId()) continue;
            // 射程距離
            double listMa = 2.0D + (double)listEntityLiving.width;
            listMa *= listMa;
            if (player.getDistanceSqToEntity(listEntityLiving) <= listMa) {
               // 攻撃の対象(このへんをいじれば範囲攻撃にもなる)
               double listMx = listEntityLiving.posX - player.posX;
               double listMz = player.posZ - listEntityLiving.posZ;
               float listYaw = (float)Math.toDegrees(Math.atan2(listMx, listMz));
               float listF = player.rotationYaw - listYaw;
               for (;listF > 360F; listF -= 360);
               for (;listF < 0F; listF += 360);
               if (listF > 140F && listF < 220F) {
                  listEntityLiving.attackEntityFrom(DamageSource.cactus, 7);//causePlayerDamage(lep)だとなぜか攻撃対象が埋まる
               }
            }
         }
      }
   }
}
KAISEEEEI217
ID:2922a5f7
木を殴ってる
 
記事: 25
登録日時: 2014年6月22日(日) 13:27


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

x