@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++; } } } } }
/** * ■相手の傷を開く(クライアント側のみ) * * @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; }