@Override
  public boolean attackEntityAsMob(Entity victim) {
    float attackDamage =
        (float) getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue();
    int knockback = 0;

    if (victim instanceof EntityLivingBase) {
      attackDamage +=
          EnchantmentHelper.getEnchantmentModifierLiving(this, (EntityLivingBase) victim);
      knockback += EnchantmentHelper.getKnockbackModifier(this, (EntityLivingBase) victim);
    }

    boolean attacked = victim.attackEntityFrom(DamageSource.causeMobDamage(this), attackDamage);

    if (attacked) {
      if (knockback > 0) {
        double vx = -Math.sin(Math.toRadians(rotationYaw)) * knockback * 0.5;
        double vy = 0.1;
        double vz = Math.cos(Math.toRadians(rotationYaw)) * knockback * 0.5;
        victim.addVelocity(vx, vy, vz);
        motionX *= 0.6;
        motionZ *= 0.6;
      }

      if (victim instanceof EntityLivingBase) {
        // EnchantmentThorns.func_92096_a(this, (EntityLivingBase) victim, rand);
      }

      setLastAttacker(victim);
    }

    return attacked;
  }
  /** This gets called when a dinosaur grows naturally or through Chicken Essence. */
  @Override
  public void updateSize() {
    double healthStep;
    double attackStep;
    double speedStep;
    healthStep = (this.maxHealth - this.baseHealth) / (this.adultAge + 1);
    attackStep = (this.maxDamage - this.baseDamage) / (this.adultAge + 1);
    speedStep = (this.maxSpeed - this.baseSpeed) / (this.adultAge + 1);

    if (this.getDinoAge() <= this.adultAge) {
      this.getEntityAttribute(SharedMonsterAttributes.maxHealth)
          .setBaseValue(Math.round(this.baseHealth + (healthStep * this.getDinoAge())));
      this.getEntityAttribute(SharedMonsterAttributes.attackDamage)
          .setBaseValue(Math.round(this.baseDamage + (attackStep * this.getDinoAge())));
      this.getEntityAttribute(SharedMonsterAttributes.movementSpeed)
          .setBaseValue(this.baseSpeed + (speedStep * this.getDinoAge()));

      if (this.isTeen()) {
        this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(0.5D);
      } else if (this.isAdult()) {
        this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(2.0D);
      } else {
        this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(0.0D);
      }
    }
  }
Exemple #3
0
 protected void a(int i0) {
   this.bm = i0;
   this.H().b(14, Byte.valueOf((byte) 1));
   this.m(Potion.t.H);
   this.c(new PotionEffect(Potion.g.H, i0, Math.min(this.o.aa().a() - 1, 0)));
   this.o.a((Entity) this, (byte) 16);
 }
Exemple #4
0
  public void m() {
    if (this.o.w() && !this.o.D && !this.i_()) {
      float f0 = this.c(1.0F);
      BlockPos blockpos = new BlockPos(this.s, (double) Math.round(this.t), this.u);

      if (f0 > 0.5F && this.V.nextFloat() * 30.0F < (f0 - 0.4F) * 2.0F && this.o.i(blockpos)) {
        boolean flag0 = true;
        ItemStack itemstack = this.p(4);

        if (itemstack != null) {
          if (itemstack.e()) {
            itemstack.b(itemstack.h() + this.V.nextInt(2));
            if (itemstack.h() >= itemstack.j()) {
              this.b(itemstack);
              this.c(4, (ItemStack) null);
            }
          }

          flag0 = false;
        }

        if (flag0) {
          this.e(8);
        }
      }
    }

    if (this.av() && this.u() != null && this.m instanceof EntityChicken) {
      ((EntityLiving) this.m).s().a(this.s().j(), 1.5D);
    }

    super.m();
  }
 private float processDamageSource(
     DamageSource source, float damage, float pierceMult, float slashMult, float crushMult) {
   EnumDamageType damageType = getDamageType(source);
   // 4.2 Reduce the damage based upon the incoming Damage Type
   if (damageType == EnumDamageType.PIERCING) {
     damage *= pierceMult;
   } else if (damageType == EnumDamageType.SLASHING) {
     damage *= slashMult;
   } else if (damageType == EnumDamageType.CRUSHING) {
     damage *= crushMult;
   } else if (damageType == EnumDamageType.GENERIC) {
     damage *= (crushMult + slashMult + pierceMult) / 3 - 0.25;
   }
   return Math.max(0, damage);
 }
  @Override
  public void attackEntityWithRangedAttack(EntityLivingBase var1, float var2) {
    EntityArrow entityarrow =
        new EntityArrow(
            this.worldObj, this, var1, Math.max(1F, getDistanceToEntity(var1) / 10F), 1);
    entityarrow.posX = this.posX;
    entityarrow.posY = this.posY + this.getEyeHeight();
    entityarrow.posZ = this.posZ;

    int power =
        EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, this.getHeldItem());
    int punch =
        EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, this.getHeldItem());
    double damage = (double) (var2 * 3.0F) + this.rand.nextGaussian() * 0.25D;
    entityarrow.setDamage(damage);

    if (power > 0) entityarrow.setDamage(entityarrow.getDamage() + (double) power * 0.5D + 0.5D);
    if (punch > 0) entityarrow.setKnockbackStrength(punch);
    if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, this.getHeldItem()) > 0)
      entityarrow.setFire(100);

    this.playSound("random.bow", 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F));
    this.worldObj.spawnEntityInWorld(entityarrow);
  }
 public void playNoteSound(Vector3f loc, String type, int pitch) {
   float realPitch = (float) Math.pow(2.0D, (double) (pitch - 12) / 12.0D);
   _world.playSoundEffect(loc.getX(), loc.getY(), loc.getZ(), "note." + type, 3.0f, realPitch);
 }
  @Override
  public void onChunkPopulate(World worldObj, Random rand, int i, int j) {
    if (!worldObj.isRemote) {
      int chunkX = i / 16;
      int chunkZ = j / 16;
      int ch =
          (chunkX * chunkX
                  + chunkZ * chunkZ
                  + worldObj.provider.dimensionId
                  + (int) Math.pow(chunkX * chunkZ, 3))
              % (57 + chunkZ % 5);
      BiomeGenBase b = worldObj.getBiomeGenForCoords(i, j);
      // int bid = b.biomeID;
      if (ch == 0) {
        int x = rand.nextInt(16) + i;
        int z = rand.nextInt(16) + j;
        // System.out.println("Adding healing crystal formation (" + x + "," + z + ")");
        worldGen.generate(worldObj, rand, x, 0, z);
      }

      // if(b.biomeID > 22) {
      ch =
          (chunkX * chunkX
                  + chunkZ * chunkZ
                  + worldObj.provider.dimensionId
                  + (int) Math.pow(chunkX * chunkZ, 3))
              % (37 + chunkZ % 5);
      // System.out.println("Positive Energy Populate");
      if (b.rainfall < 0.35 || b.temperature >= 0.8) {
        ch++;
      }
      if (ch == 0) {
        int x = rand.nextInt(16) + i;
        int z = rand.nextInt(16) + j;
        int y = getFirstUncoveredBlock(worldObj, x, z);
        if (i > 0) {
          // System.out.println("Placed treant at (" + x + "," + y + "," + z + ")");
          EntityTreant entitychicken = new EntityTreant(worldObj);
          entitychicken.setLocationAndAngles((double) x, (double) y, (double) z, 0.0F, 0.0F);
          worldObj.spawnEntityInWorld(entitychicken);
        }
      }
      EntityPlayer p = worldObj.getClosestPlayer(i, 64, j, 64);
      if (p != null) {
        ch =
            (chunkX * chunkX
                    + chunkZ * chunkZ
                    + worldObj.provider.dimensionId
                    + (int) Math.pow(chunkX * chunkZ, 3))
                % (17 + chunkX % 5);
        if (ch == 0) {
          int n = 1 + rand.nextInt(3);
          for (; n >= 0; n--) {
            int x = rand.nextInt(16) + i;
            int z = rand.nextInt(16) + j;
            int y = getFirstUncoveredBlock(worldObj, x, z);
            if (y > 0) {
              // System.out.println("Placed blink dog at (" + x + "," + y + "," + z + ")");
              EntityBlinkDog entitychicken = new EntityBlinkDog(worldObj);
              entitychicken.setLocationAndAngles((double) x, (double) y, (double) z, 0.0F, 0.0F);
              worldObj.spawnEntityInWorld(entitychicken);
            }
          }
        }
        ch =
            (chunkX * (chunkX + chunkZ)
                    + chunkZ * (chunkZ + chunkX)
                    + worldObj.provider.dimensionId
                    + (int) Math.pow(chunkX * chunkZ, 3))
                % (17 + chunkX % 5);
        if (b.getFloatTemperature() < 0.5) {
          ch++;
        } else if (b.getFloatTemperature() > 1.5) {
          ch--;
        }
        if (ch == 0) {
          int x = rand.nextInt(16) + i;
          int z = rand.nextInt(16) + j;
          int y = getFirstAirBlock(worldObj, x, z);
          if (y > 0) {
            // System.out.println("Placed blink dog at (" + x + "," + y + "," + z + ")");
            EntityEmpyreal entitychicken = new EntityEmpyreal(worldObj);
            entitychicken.setLocationAndAngles((double) x, (double) y, (double) z, 0.0F, 0.0F);
            worldObj.spawnEntityInWorld(entitychicken);
          }
        }
      }
      // }

      for (int vary = 130; vary > 0; vary--) {
        int bID = worldObj.getBlockId(chunkX * 16 + 8, vary, chunkZ * 16 + 4);
        int tex = chunkX * 16 + 8;
        int tez = chunkZ * 16 + 4;
        if (MystObjects.book_lectern != null && bID == MystObjects.book_lectern.blockID) {
          // System.out.println("Spawning foo dogs at (" + tex + "," + vary + "," + tez + ")");
          EntityFooDog entitychicken;
          int l = worldObj.getBlockId(tex + 1, vary, tez);
          int r = worldObj.getBlockId(tex - 1, vary, tez);
          if (l == r) {
            l = worldObj.getBlockId(tex, vary, tez + 1);
            r = worldObj.getBlockId(tex, vary, tez - 1);
            if (r == Block.cobblestone.blockID) {
              // te.xCoord+2, vary, tez+6
              entitychicken = new EntityFooDog(worldObj);
              entitychicken.setLocationAndAngles(tex + 2, vary, tez + 6, 0.0F, 0.0F);
              worldObj.spawnEntityInWorld(entitychicken);
              entitychicken = new EntityFooDog(worldObj);
              entitychicken.setLocationAndAngles(tex - 2, vary, tez + 6, 0.0F, 0.0F);
              worldObj.spawnEntityInWorld(entitychicken);
            } else {
              // te.xCoord+2, vary, tez-6
              entitychicken = new EntityFooDog(worldObj);
              entitychicken.setLocationAndAngles(tex + 2, vary, tez - 6, 180.0F, 0.0F);
              worldObj.spawnEntityInWorld(entitychicken);
              entitychicken = new EntityFooDog(worldObj);
              entitychicken.setLocationAndAngles(tex - 2, vary, tez - 6, 180.0F, 0.0F);
              worldObj.spawnEntityInWorld(entitychicken);
            }
          } else {
            if (r == Block.cobblestone.blockID) {
              // te.xCoord-6, vary, tez+2
              entitychicken = new EntityFooDog(worldObj);
              entitychicken.setLocationAndAngles(tex + 6, vary, tez - 2, 90.0F, 0.0F);
              worldObj.spawnEntityInWorld(entitychicken);
              entitychicken = new EntityFooDog(worldObj);
              entitychicken.setLocationAndAngles(tex + 6, vary, tez + 2, 90.0F, 0.0F);
              worldObj.spawnEntityInWorld(entitychicken);
            } else {
              // te.xCoord+6, vary, tez+2
              entitychicken = new EntityFooDog(worldObj);
              entitychicken.setLocationAndAngles(tex - 6, vary, tez - 2, 270.0F, 0.0F);
              worldObj.spawnEntityInWorld(entitychicken);
              entitychicken = new EntityFooDog(worldObj);
              entitychicken.setLocationAndAngles(tex - 6, vary, tez + 2, 270.0F, 0.0F);
              worldObj.spawnEntityInWorld(entitychicken);
            }
          }
        }
      }
    }
  }
  @Override
  public void tick(World worldObj, Chunk chunk) {
    // int s = worldObj.calculateSkylightSubtracted(0);
    if (!worldObj.isRemote && chunk.hasEntities) {
      int foundblinkdog = 0;
      boolean foundempyreal = false;
      // if (worldObj.rand.nextInt(10) < level)
      // {
      for (int var3 = chunk.entityLists.length - 1; var3 >= 0; var3--) {
        // int var3 = worldObj.rand.nextInt(chunk.entityLists.length);
        List var4 = chunk.entityLists[var3];

        if (var4.size() > 0) {
          for (int entind = var4.size() - 1; entind >= 0; entind--) {
            Entity e = (Entity) var4.get(entind);

            if (e instanceof EntityLiving) {
              EntityLiving var5 = (EntityLiving) e;
              NBTTagCompound nbt = var5.getEntityData();
              float hpo = nbt.getFloat("HealthOverflow");
              int timer = nbt.getInteger("HealthOverflowTimer");
              if (timer < 0) {
                timer = 0;
              }
              timer += level;
              if (DecayingWorld.goodmobs(var5)) {
                timer += (5 - level);
              }
              if (var5 instanceof EntityBlinkDog) {
                foundblinkdog += 1;
              }
              if (var5 instanceof EntityEmpyreal) {
                foundempyreal = true;
              }
              // System.out.println("Timer:  " +timer);
              // System.out.println("HPO:    " +hpo);
              float hp = var5.getHealth();
              if (timer > 180) {
                if (DecayingWorld.evilmobs(var5)) {
                  if (hpo > 0) hpo--;
                  else hp--;
                } else {
                  hpo++;
                  int r = worldObj.rand.nextInt(60);
                  nbt.setInteger("HealthOverflowTimer", r);
                  timer = r;
                }
              }

              float mhp = var5.getMaxHealth();
              float newhp = hp;
              float newhpo = hpo;

              if (hp < mhp && !DecayingWorld.evilmobs(var5)) {
                newhp = Math.min(hp + hpo, mhp);
                newhpo = Math.max(hp + hpo - mhp, 0);
                var5.heal(newhp - hp);
              }
              // System.out.println("newHPO: " +newhpo);

              if (newhpo > mhp * 2) {
                newhpo = mhp * 2;
                if (!(DecayingWorld.goodmobs(var5) || var5 instanceof EntityCreeper))
                // if (!(var5 instanceof EntitySkeleton || var5 instanceof EntityZombie || var5
                // instanceof EntityCreeper || e instanceof EntityGhast || e instanceof
                // EntityPigZombie))
                {
                  worldObj.newExplosion(var5, var5.posX, var5.posY, var5.posZ, 0F, false, true);
                  var5.attackEntityFrom(PositiveDamage.type, mhp * 3);
                }
              }

              nbt.setFloat("HealthOverflow", newhpo);
              nbt.setInteger("HealthOverflowTimer", timer);
              nbt.setBoolean("TempDecay", true);

              if (e instanceof EntityPlayer) {
                ByteArrayOutputStream bt = new ByteArrayOutputStream();
                DataOutputStream out = new DataOutputStream(bt);
                try {
                  out.writeInt(1);
                  out.writeFloat(newhpo);
                  Packet250CustomPayload packet =
                      new Packet250CustomPayload("MoreDecay", bt.toByteArray());
                  Player player = (Player) e;
                  PacketDispatcher.sendPacketToPlayer(packet, player);
                } catch (IOException ex) {
                  System.out.println("couldnt send packet!");
                }
              }
            }
          }
        }
      }
      int chunkX = chunk.xPosition;
      int chunkZ = chunk.zPosition;
      BiomeGenBase b = worldObj.getBiomeGenForCoords(chunkX * 16, chunkZ * 16);
      // if(b.biomeID > 22) {
      int x, y, z, n, ch;
      EntityPlayer p = worldObj.getClosestPlayer(chunkX * 16, 96, chunkZ * 16, 96);
      EntityPlayer p2 = worldObj.getClosestPlayer(chunkX * 16, 24, chunkZ * 16, 24);
      if (p != null && p2 == null) {
        if (foundblinkdog < 2) {
          ch =
              (chunkX * chunkX
                      + chunkZ * chunkZ
                      + worldObj.provider.dimensionId
                      + (int) Math.pow(chunkX * chunkZ, 3))
                  % (17 + chunkX % 5);
          if (ch == 0 && worldObj.rand.nextInt(120) == 0) {
            AxisAlignedBB par2AxisAlignedBB =
                AxisAlignedBB.getBoundingBox(
                    (double) (chunkX * 16) - 32,
                    (double) 0,
                    (double) (chunkZ * 16) - 32,
                    (double) (chunkX * 16) + 32,
                    (double) 96,
                    (double) (chunkZ * 16) + 32);
            // par2AxisAlignedBB.expand(16, 16, 16);
            List<Entity> ents =
                worldObj.getEntitiesWithinAABB(EntityBlinkDog.class, par2AxisAlignedBB);
            if (ents.size() < 4) {
              n = 1 + worldObj.rand.nextInt(2);
              for (; n >= 0; n--) {
                x = worldObj.rand.nextInt(16) + chunkX * 16;
                z = worldObj.rand.nextInt(16) + chunkZ * 16;
                y = getFirstUncoveredBlock(worldObj, x, z);
                if (y > 0) {
                  // System.out.println("Placed blink dog at (" + x + "," + y + "," + z + ")");
                  EntityBlinkDog entitychicken = new EntityBlinkDog(worldObj);
                  entitychicken.setLocationAndAngles(
                      (double) x, (double) y, (double) z, 0.0F, 0.0F);
                  worldObj.spawnEntityInWorld(entitychicken);
                }
              }
            }
          }
        }
        if (!foundempyreal) {
          ch =
              (chunkX * (chunkX + chunkZ)
                      + chunkZ * (chunkZ + chunkX)
                      + worldObj.provider.dimensionId
                      + (int) Math.pow(chunkX * chunkZ, 3))
                  % (17 + chunkX % 5);
          if (ch == 0 && worldObj.rand.nextInt(80) == 0) {
            x = worldObj.rand.nextInt(16) + chunkX * 16;
            z = worldObj.rand.nextInt(16) + chunkZ * 16;
            y = getFirstAirBlock(worldObj, x, z);
            if (y > 0) {
              // System.out.println("Placed blink dog at (" + x + "," + y + "," + z + ")");
              EntityEmpyreal entitychicken = new EntityEmpyreal(worldObj);
              entitychicken.setLocationAndAngles((double) x, (double) y, (double) z, 0.0F, 0.0F);
              worldObj.spawnEntityInWorld(entitychicken);
            }
          }
        }
      }
      // }
    }
  }
  @SubscribeEvent
  public void onAttackEntity(AttackEntityEvent event) {
    if (event.entityLiving.worldObj.isRemote) return;

    EntityLivingBase attacker = event.entityLiving;
    EntityPlayer player = event.entityPlayer;
    Entity target = event.target;
    ItemStack stack = attacker.getEquipmentInSlot(0);
    if (stack != null && stack.getItem().onLeftClickEntity(stack, player, target)) return;

    if (target.canAttackWithItem()) {
      if (!target.hitByEntity(target)) {
        float damageAmount = TFC_MobData.STEVE_DAMAGE;
        if (stack != null) {
          damageAmount =
              (float)
                  player
                      .getEntityAttribute(SharedMonsterAttributes.attackDamage)
                      .getAttributeValue();
          // player.addChatMessage("Damage: " + i);
          if (damageAmount == 1.0f) {
            damageAmount = TFC_MobData.STEVE_DAMAGE;
            // i = player.inventory.getCurrentItem().getItem().getDamageVsEntity(target,
            // player.inventory.getCurrentItem());
          }
        }

        if (player.isPotionActive(Potion.damageBoost))
          damageAmount += 3 << player.getActivePotionEffect(Potion.damageBoost).getAmplifier();

        if (player.isPotionActive(Potion.weakness))
          damageAmount -= 2 << player.getActivePotionEffect(Potion.weakness).getAmplifier();

        int knockback = 0;
        float enchantmentDamage = 0;

        if (target instanceof EntityLiving) {
          enchantmentDamage =
              EnchantmentHelper.getEnchantmentModifierLiving(player, (EntityLiving) target);
          knockback += EnchantmentHelper.getKnockbackModifier(player, (EntityLiving) target);
        }

        if (player.isSprinting()) ++knockback;

        if (damageAmount > 0 || enchantmentDamage > 0) {
          boolean criticalHit =
              player.fallDistance > 0.0F
                  && !player.onGround
                  && !player.isOnLadder()
                  && !player.isInWater()
                  && !player.isPotionActive(Potion.blindness)
                  && player.ridingEntity == null
                  && target instanceof EntityLiving;

          if (criticalHit && damageAmount > 0)
            damageAmount += event.entity.worldObj.rand.nextInt((int) (damageAmount / 2 + 2));

          damageAmount += enchantmentDamage;
          boolean onFire = false;
          int fireAspect = EnchantmentHelper.getFireAspectModifier(player);

          if (target instanceof EntityLiving && fireAspect > 0 && !target.isBurning()) {
            onFire = true;
            target.setFire(1);
          }

          boolean entityAttacked =
              target.attackEntityFrom(DamageSource.causePlayerDamage(player), damageAmount);

          if (entityAttacked) {
            if (knockback > 0) {
              target.addVelocity(
                  -MathHelper.sin(player.rotationYaw * (float) Math.PI / 180.0F) * knockback * 0.5F,
                  0.1D,
                  MathHelper.cos(player.rotationYaw * (float) Math.PI / 180.0F) * knockback * 0.5F);
              player.motionX *= 0.6D;
              player.motionZ *= 0.6D;
              player.setSprinting(false);
            }

            if (criticalHit) player.onCriticalHit(target);

            if (enchantmentDamage > 0) player.onEnchantmentCritical(target);

            if (damageAmount >= 18) player.triggerAchievement(AchievementList.overkill);

            player.setLastAttacker(target);

            if (target instanceof EntityLiving)
              target.attackEntityFrom(DamageSource.causeThornsDamage(attacker), damageAmount);
          }

          ItemStack itemstack = player.getCurrentEquippedItem();
          Object object = target;

          if (target instanceof EntityDragonPart) {
            IEntityMultiPart ientitymultipart = ((EntityDragonPart) target).entityDragonObj;
            if (ientitymultipart instanceof EntityLiving) object = ientitymultipart;
          }

          if (itemstack != null && object instanceof EntityLiving) {
            itemstack.hitEntity((EntityLiving) object, player);
            if (itemstack.stackSize <= 0) player.destroyCurrentEquippedItem();
          }

          if (target instanceof EntityLivingBase) {
            player.addStat(StatList.damageDealtStat, Math.round(damageAmount * 10.0f));
            if (fireAspect > 0 && entityAttacked) target.setFire(fireAspect * 4);
            else if (onFire) target.extinguish();
          }

          player.addExhaustion(0.3F);
        }
      }
    }
    event.setCanceled(true);
  }