コード例 #1
0
  /**
   * Called each tick as long the item is on a player inventory. Uses by maps to check if is on a
   * player hand and update it's contents.
   */
  public void onUpdate(
      ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) {
    // ■爪痕設置キーを押しただの押してないだの
    boolean isPress = false;
    // ■押した回数を覚えてるので発散させる
    while (Hizume.proxy.getKeySOW().isPressed()) {
      isPress = true;
    }
    // ■爪痕設置キーを押しながら緋爪を取ると爪痕が出来るけど、1個だし大丈夫大丈夫
    isPress = isPress && Hizume.proxy.getKeySOW().isKeyDown();

    // ■カレントアイテムでないなら処理をかえす
    if (!isSelected) {
      return;
    }
    if (!(entityIn instanceof EntityPlayer)) {
      return;
    }
    EntityPlayer player = (EntityPlayer) entityIn;

    // ■アイテム使ってるなら空間に傷はつけられない
    if (player.getItemInUseCount() != 0) {
      return;
    }

    // ■クライアント側での処理
    if (worldIn.isRemote && isPress) {
      // ■腕を振る
      player.swingItem();

      // ■空間へ爪痕をつける
      EntitySOW[] magic = createSOW(stack, worldIn, player);
      if (magic != null) {
        for (EntitySOW base : magic) {
          worldIn.addWeatherEffect(base);
          // PacketHandler.INSTANCE.sendToAll(new MessageSOW(base));
          PacketHandler.INSTANCE.sendToServer(new MessageSOW(base));
        }
      }
    }
  }
コード例 #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;
  }