コード例 #1
0
  @Override
  public void onEntityImpact(World world, EntityPlayer entityPlayer) {
    Vec3 lookVec = entityPlayer.getLook(range);
    double x = entityPlayer.posX + lookVec.xCoord;
    double y = entityPlayer.posY + entityPlayer.getEyeHeight() + lookVec.yCoord;
    double z = entityPlayer.posZ + lookVec.zCoord;

    List<Entity> entities =
        world.getEntitiesWithinAABB(
            Entity.class,
            AxisAlignedBB.getBoundingBox(x - 0.5f, y - 0.5f, z - 0.5f, x + 0.5f, y + 0.5f, z + 0.5f)
                .expand(radius, radius, radius));
    int hit = 0;

    if (entities != null) {
      for (Entity entity : entities) {
        if (hit < maxHit && !entity.equals(entityPlayer)) {
          if (this.entityEffect(world, entity, entityPlayer)) {
            hit++;
          }
        }
      }
    }
  }
コード例 #2
0
  /**
   * ■相手の傷を開く(クライアント側のみ)
   *
   * @param stackIn
   * @param playerIn
   */
  protected Entity doScars(ItemStack stackIn, EntityPlayer playerIn) {
    Entity target = null;

    boolean isSoundSE = false;

    // ■クライアント側で検出する
    List<MovingObjectPosition> mops = Hizume.proxy.getEntity(stackIn, playerIn);

    // ■モップにEntityが引っかかってる
    // if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY)
    if (mops != null && !mops.isEmpty()) {
      for (MovingObjectPosition mop : mops) {
        // ■対象Entityを取得
        target = mop.entityHit;
        if (target == null) {
          continue;
        }

        // ■EntitySOWはこちら
        if (target instanceof EntitySOW) {
          // ■接触しているEntityをかき集める
          List<Entity> entities =
              playerIn.worldObj.getEntitiesWithinAABBExcludingEntity(
                  target, target.getEntityBoundingBox());
          if (entities == null || entities.isEmpty()) {
            continue;
          }

          for (Entity entity : entities) {
            // ■ドラゴン(概念)はスルー
            if (entity instanceof EntityDragon) {
              continue;
            }

            // ■生物系のみ
            if (!(entity instanceof EntityLivingBase) && !(entity instanceof EntityDragonPart)) {
              continue;
            }

            // ■爪痕をつけた本人
            if (entity.equals(playerIn)) {
              continue;
            }

            // ■1体でも接触していれば傷が開く
            // ▼サーバ側
            PacketHandler.INSTANCE.sendToServer(new MessageOpenSOW(target, false));

            // ▼クライアント側
            ((EntitySOW) target).changeScarsState();

            // ■効果音ならすよー
            isSoundSE = true;

            break;
          }
        }
        // ■EntityLivingBase等はこちら
        else {
          DataWatcher dw;
          if (target instanceof EntityDragonPart) {
            // target = ((Entity)((EntityDragonPart)target).entityDragonObj);
            // ■EnderDragonの傷は本体に蓄積してるので、そっちから取得
            dw = ((Entity) ((EntityDragonPart) target).entityDragonObj).getDataWatcher();
          } else {
            dw = target.getDataWatcher();
          }

          // ■対象Entityの傷を開く
          int nHit = this.getHitCount(dw);
          if (nHit > 0) {
            // ■総ダメージ
            float damage = attackDamage2 * (float) nHit;
            // ■サーバへメッセージ
            PacketHandler.INSTANCE.sendToServer(new MessageScars(target, damage));
            // ■傷は開いたのでリセット
            this.setHitCount(dw, 0);

            // ■効果音ならすよー
            isSoundSE = true;
          }

          // ■Entityに接触しているSOWを開く
          List<Entity> entities = playerIn.worldObj.weatherEffects;
          if (entities == null || entities.isEmpty()) {
            continue;
          }

          for (Entity entity : entities) {
            if (entity instanceof EntitySOW) {
              EntitySOW sow = (EntitySOW) entity;
              if (sow.getEntityBoundingBox().intersectsWith(target.getEntityBoundingBox())) {
                // ■重なってるので炸裂
                // ▼サーバ側
                PacketHandler.INSTANCE.sendToServer(new MessageOpenSOW(sow, false));

                // ▼クライアント側
                sow.changeScarsState();

                // ■効果音ならすよー
                isSoundSE = true;
              }
            }
          }
        }
      }
    }

    if (isSoundSE) {
      // playerIn.worldObj.playSoundAtEntity(playerIn, Hizume.MOD_ID + ":shan", 1.0f, 3.0f);
      PacketHandler.INSTANCE.sendToServer(new MessageOpenSOW(playerIn, true));
    }

    return target;
  }