diff options
Diffstat (limited to 'patch-remap/mache-vineflower/net/minecraft/world/entity/monster/Evoker.java.patch')
-rw-r--r-- | patch-remap/mache-vineflower/net/minecraft/world/entity/monster/Evoker.java.patch | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/patch-remap/mache-vineflower/net/minecraft/world/entity/monster/Evoker.java.patch b/patch-remap/mache-vineflower/net/minecraft/world/entity/monster/Evoker.java.patch new file mode 100644 index 0000000000..fd571c6fc7 --- /dev/null +++ b/patch-remap/mache-vineflower/net/minecraft/world/entity/monster/Evoker.java.patch @@ -0,0 +1,410 @@ +--- a/net/minecraft/world/entity/monster/Evoker.java ++++ b/net/minecraft/world/entity/monster/Evoker.java +@@ -12,10 +12,11 @@ + import net.minecraft.world.damagesource.DamageSource; + import net.minecraft.world.entity.Entity; + import net.minecraft.world.entity.EntityType; ++import net.minecraft.world.entity.EnumMobSpawn; ++import net.minecraft.world.entity.EnumMonsterType; ++import net.minecraft.world.entity.GroupDataEntity; + import net.minecraft.world.entity.LivingEntity; + import net.minecraft.world.entity.Mob; +-import net.minecraft.world.entity.MobSpawnType; +-import net.minecraft.world.entity.MobType; + import net.minecraft.world.entity.ai.attributes.AttributeSupplier; + import net.minecraft.world.entity.ai.attributes.Attributes; + import net.minecraft.world.entity.ai.goal.AvoidEntityGoal; +@@ -34,13 +35,14 @@ + import net.minecraft.world.item.DyeColor; + import net.minecraft.world.level.GameRules; + import net.minecraft.world.level.Level; +-import net.minecraft.world.level.block.state.BlockState; ++import net.minecraft.world.level.block.state.IBlockData; + import net.minecraft.world.level.gameevent.GameEvent; + import net.minecraft.world.phys.Vec3; + import net.minecraft.world.phys.shapes.VoxelShape; + import net.minecraft.world.scores.PlayerTeam; + + public class Evoker extends SpellcasterIllager { ++ + @Nullable + private Sheep wololoTarget; + +@@ -54,21 +56,21 @@ + super.registerGoals(); + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new Evoker.EvokerCastingSpellGoal()); +- this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 0.6, 1.0)); ++ this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 0.6D, 1.0D)); + this.goalSelector.addGoal(4, new Evoker.EvokerSummonSpellGoal()); + this.goalSelector.addGoal(5, new Evoker.EvokerAttackSpellGoal()); + this.goalSelector.addGoal(6, new Evoker.EvokerWololoSpellGoal()); +- this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6)); ++ this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6D)); + this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); + this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); +- this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); +- this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true).setUnseenMemoryTicks(300)); +- this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false).setUnseenMemoryTicks(300)); ++ this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Raider.class})).setAlertOthers()); ++ this.targetSelector.addGoal(2, (new NearestAttackableTargetGoal<>(this, Player.class, true)).setUnseenMemoryTicks(300)); ++ this.targetSelector.addGoal(3, (new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)).setUnseenMemoryTicks(300)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, false)); + } + + public static AttributeSupplier.Builder createAttributes() { +- return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.5).add(Attributes.FOLLOW_RANGE, 12.0).add(Attributes.MAX_HEALTH, 24.0); ++ return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.5D).add(Attributes.FOLLOW_RANGE, 12.0D).add(Attributes.MAX_HEALTH, 24.0D); + } + + @Override +@@ -98,20 +100,7 @@ + + @Override + public boolean isAlliedTo(Entity entity) { +- if (entity == null) { +- return false; +- } else if (entity == this) { +- return true; +- } else if (super.isAlliedTo(entity)) { +- return true; +- } else { +- return entity instanceof Vex +- ? this.isAlliedTo(((Vex)entity).getOwner()) +- : entity instanceof LivingEntity +- && ((LivingEntity)entity).getMobType() == MobType.ILLAGER +- && this.getTeam() == null +- && entity.getTeam() == null; +- } ++ return entity == null ? false : (entity == this ? true : (super.isAlliedTo(entity) ? true : (entity instanceof Vex ? this.isAlliedTo((Entity) ((Vex) entity).getOwner()) : (entity instanceof LivingEntity && ((LivingEntity) entity).getMobType() == EnumMonsterType.ILLAGER ? this.getTeam() == null && entity.getTeam() == null : false)))); + } + + @Override +@@ -144,162 +133,192 @@ + } + + @Override +- public void applyRaidBuffs(int wave, boolean unusedFalse) { ++ public void applyRaidBuffs(int wave, boolean unusedFalse) {} ++ ++ private class EvokerCastingSpellGoal extends SpellcasterIllager.SpellcasterCastingSpellGoal { ++ ++ EvokerCastingSpellGoal() { ++ super(); ++ } ++ ++ @Override ++ public void tick() { ++ if (Evoker.this.getTarget() != null) { ++ Evoker.this.getLookControl().setLookAt(Evoker.this.getTarget(), (float) Evoker.this.getMaxHeadYRot(), (float) Evoker.this.getMaxHeadXRot()); ++ } else if (Evoker.this.getWololoTarget() != null) { ++ Evoker.this.getLookControl().setLookAt(Evoker.this.getWololoTarget(), (float) Evoker.this.getMaxHeadYRot(), (float) Evoker.this.getMaxHeadXRot()); ++ } ++ ++ } + } + +- class EvokerAttackSpellGoal extends SpellcasterIllager.SpellcasterUseSpellGoal { ++ private class EvokerSummonSpellGoal extends SpellcasterIllager.SpellcasterUseSpellGoal { ++ ++ private final TargetingConditions vexCountTargeting = TargetingConditions.forNonCombat().range(16.0D).ignoreLineOfSight().ignoreInvisibilityTesting(); ++ ++ EvokerSummonSpellGoal() { ++ super(); ++ } ++ + @Override ++ public boolean canUse() { ++ if (!super.canUse()) { ++ return false; ++ } else { ++ int i = Evoker.this.level().getNearbyEntities(Vex.class, this.vexCountTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0D)).size(); ++ ++ return Evoker.this.random.nextInt(8) + 1 > i; ++ } ++ } ++ ++ @Override + protected int getCastingTime() { +- return 40; ++ return 100; + } + + @Override + protected int getCastingInterval() { +- return 100; ++ return 340; + } + + @Override + protected void performSpellCasting() { +- LivingEntity target = Evoker.this.getTarget(); +- double min = Math.min(target.getY(), Evoker.this.getY()); +- double d = Math.max(target.getY(), Evoker.this.getY()) + 1.0; +- float f = (float)Mth.atan2(target.getZ() - Evoker.this.getZ(), target.getX() - Evoker.this.getX()); +- if (Evoker.this.distanceToSqr(target) < 9.0) { +- for (int i = 0; i < 5; i++) { +- float f1 = f + (float)i * (float) Math.PI * 0.4F; +- this.createSpellEntity(Evoker.this.getX() + (double)Mth.cos(f1) * 1.5, Evoker.this.getZ() + (double)Mth.sin(f1) * 1.5, min, d, f1, 0); +- } ++ ServerLevel worldserver = (ServerLevel) Evoker.this.level(); ++ PlayerTeam scoreboardteam = Evoker.this.getTeam(); + +- for (int i = 0; i < 8; i++) { +- float f1 = f + (float)i * (float) Math.PI * 2.0F / 8.0F + (float) (Math.PI * 2.0 / 5.0); +- this.createSpellEntity(Evoker.this.getX() + (double)Mth.cos(f1) * 2.5, Evoker.this.getZ() + (double)Mth.sin(f1) * 2.5, min, d, f1, 3); +- } +- } else { +- for (int i = 0; i < 16; i++) { +- double d1 = 1.25 * (double)(i + 1); +- int i1 = 1 * i; +- this.createSpellEntity(Evoker.this.getX() + (double)Mth.cos(f) * d1, Evoker.this.getZ() + (double)Mth.sin(f) * d1, min, d, f, i1); +- } +- } +- } ++ for (int i = 0; i < 3; ++i) { ++ BlockPos blockposition = Evoker.this.blockPosition().offset(-2 + Evoker.this.random.nextInt(5), 1, -2 + Evoker.this.random.nextInt(5)); ++ Vex entityvex = (Vex) EntityType.VEX.create(Evoker.this.level()); + +- private void createSpellEntity(double x, double z, double minY, double maxY, float yRot, int warmupDelay) { +- BlockPos blockPos = BlockPos.containing(x, maxY, z); +- boolean flag = false; +- double d = 0.0; +- +- do { +- BlockPos blockPos1 = blockPos.below(); +- BlockState blockState = Evoker.this.level().getBlockState(blockPos1); +- if (blockState.isFaceSturdy(Evoker.this.level(), blockPos1, Direction.UP)) { +- if (!Evoker.this.level().isEmptyBlock(blockPos)) { +- BlockState blockState1 = Evoker.this.level().getBlockState(blockPos); +- VoxelShape collisionShape = blockState1.getCollisionShape(Evoker.this.level(), blockPos); +- if (!collisionShape.isEmpty()) { +- d = collisionShape.max(Direction.Axis.Y); +- } ++ if (entityvex != null) { ++ entityvex.moveTo(blockposition, 0.0F, 0.0F); ++ entityvex.finalizeSpawn(worldserver, Evoker.this.level().getCurrentDifficultyAt(blockposition), EnumMobSpawn.MOB_SUMMONED, (GroupDataEntity) null, (CompoundTag) null); ++ entityvex.setOwner(Evoker.this); ++ entityvex.setBoundOrigin(blockposition); ++ entityvex.setLimitedLife(20 * (30 + Evoker.this.random.nextInt(90))); ++ if (scoreboardteam != null) { ++ worldserver.getScoreboard().addPlayerToTeam(entityvex.getScoreboardName(), scoreboardteam); + } + +- flag = true; +- break; ++ worldserver.addFreshEntityWithPassengers(entityvex, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPELL); // CraftBukkit - Add SpawnReason ++ worldserver.gameEvent(GameEvent.ENTITY_PLACE, blockposition, GameEvent.Context.of((Entity) Evoker.this)); + } +- +- blockPos = blockPos.below(); +- } while (blockPos.getY() >= Mth.floor(minY) - 1); +- +- if (flag) { +- Evoker.this.level().addFreshEntity(new EvokerFangs(Evoker.this.level(), x, (double)blockPos.getY() + d, z, yRot, warmupDelay, Evoker.this)); +- Evoker.this.level().gameEvent(GameEvent.ENTITY_PLACE, new Vec3(x, (double)blockPos.getY() + d, z), GameEvent.Context.of(Evoker.this)); + } ++ + } + + @Override + protected SoundEvent getSpellPrepareSound() { +- return SoundEvents.EVOKER_PREPARE_ATTACK; ++ return SoundEvents.EVOKER_PREPARE_SUMMON; + } + + @Override + protected SpellcasterIllager.IllagerSpell getSpell() { +- return SpellcasterIllager.IllagerSpell.FANGS; ++ return SpellcasterIllager.IllagerSpell.SUMMON_VEX; + } + } + +- class EvokerCastingSpellGoal extends SpellcasterIllager.SpellcasterCastingSpellGoal { +- @Override +- public void tick() { +- if (Evoker.this.getTarget() != null) { +- Evoker.this.getLookControl().setLookAt(Evoker.this.getTarget(), (float)Evoker.this.getMaxHeadYRot(), (float)Evoker.this.getMaxHeadXRot()); +- } else if (Evoker.this.getWololoTarget() != null) { +- Evoker.this.getLookControl().setLookAt(Evoker.this.getWololoTarget(), (float)Evoker.this.getMaxHeadYRot(), (float)Evoker.this.getMaxHeadXRot()); +- } +- } +- } ++ private class EvokerAttackSpellGoal extends SpellcasterIllager.SpellcasterUseSpellGoal { + +- class EvokerSummonSpellGoal extends SpellcasterIllager.SpellcasterUseSpellGoal { +- private final TargetingConditions vexCountTargeting = TargetingConditions.forNonCombat().range(16.0).ignoreLineOfSight().ignoreInvisibilityTesting(); +- +- @Override +- public boolean canUse() { +- if (!super.canUse()) { +- return false; +- } else { +- int size = Evoker.this.level() +- .getNearbyEntities(Vex.class, this.vexCountTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0)) +- .size(); +- return Evoker.this.random.nextInt(8) + 1 > size; +- } ++ EvokerAttackSpellGoal() { ++ super(); + } + + @Override + protected int getCastingTime() { +- return 100; ++ return 40; + } + + @Override + protected int getCastingInterval() { +- return 340; ++ return 100; + } + + @Override + protected void performSpellCasting() { +- ServerLevel serverLevel = (ServerLevel)Evoker.this.level(); +- PlayerTeam team = Evoker.this.getTeam(); ++ LivingEntity entityliving = Evoker.this.getTarget(); ++ double d0 = Math.min(entityliving.getY(), Evoker.this.getY()); ++ double d1 = Math.max(entityliving.getY(), Evoker.this.getY()) + 1.0D; ++ float f = (float) Mth.atan2(entityliving.getZ() - Evoker.this.getZ(), entityliving.getX() - Evoker.this.getX()); ++ int i; + +- for (int i = 0; i < 3; i++) { +- BlockPos blockPos = Evoker.this.blockPosition().offset(-2 + Evoker.this.random.nextInt(5), 1, -2 + Evoker.this.random.nextInt(5)); +- Vex vex = EntityType.VEX.create(Evoker.this.level()); +- if (vex != null) { +- vex.moveTo(blockPos, 0.0F, 0.0F); +- vex.finalizeSpawn(serverLevel, Evoker.this.level().getCurrentDifficultyAt(blockPos), MobSpawnType.MOB_SUMMONED, null, null); +- vex.setOwner(Evoker.this); +- vex.setBoundOrigin(blockPos); +- vex.setLimitedLife(20 * (30 + Evoker.this.random.nextInt(90))); +- if (team != null) { +- serverLevel.getScoreboard().addPlayerToTeam(vex.getScoreboardName(), team); ++ if (Evoker.this.distanceToSqr((Entity) entityliving) < 9.0D) { ++ float f1; ++ ++ for (i = 0; i < 5; ++i) { ++ f1 = f + (float) i * 3.1415927F * 0.4F; ++ this.createSpellEntity(Evoker.this.getX() + (double) Mth.cos(f1) * 1.5D, Evoker.this.getZ() + (double) Mth.sin(f1) * 1.5D, d0, d1, f1, 0); ++ } ++ ++ for (i = 0; i < 8; ++i) { ++ f1 = f + (float) i * 3.1415927F * 2.0F / 8.0F + 1.2566371F; ++ this.createSpellEntity(Evoker.this.getX() + (double) Mth.cos(f1) * 2.5D, Evoker.this.getZ() + (double) Mth.sin(f1) * 2.5D, d0, d1, f1, 3); ++ } ++ } else { ++ for (i = 0; i < 16; ++i) { ++ double d2 = 1.25D * (double) (i + 1); ++ int j = 1 * i; ++ ++ this.createSpellEntity(Evoker.this.getX() + (double) Mth.cos(f) * d2, Evoker.this.getZ() + (double) Mth.sin(f) * d2, d0, d1, f, j); ++ } ++ } ++ ++ } ++ ++ private void createSpellEntity(double x, double d1, double z, double d3, float minY, int i) { ++ BlockPos blockposition = BlockPos.containing(x, d3, d1); ++ boolean flag = false; ++ double d4 = 0.0D; ++ ++ do { ++ BlockPos blockposition1 = blockposition.below(); ++ IBlockData iblockdata = Evoker.this.level().getBlockState(blockposition1); ++ ++ if (iblockdata.isFaceSturdy(Evoker.this.level(), blockposition1, Direction.UP)) { ++ if (!Evoker.this.level().isEmptyBlock(blockposition)) { ++ IBlockData iblockdata1 = Evoker.this.level().getBlockState(blockposition); ++ VoxelShape voxelshape = iblockdata1.getCollisionShape(Evoker.this.level(), blockposition); ++ ++ if (!voxelshape.isEmpty()) { ++ d4 = voxelshape.max(Direction.Axis.Y); ++ } + } + +- serverLevel.addFreshEntityWithPassengers(vex); +- serverLevel.gameEvent(GameEvent.ENTITY_PLACE, blockPos, GameEvent.Context.of(Evoker.this)); ++ flag = true; ++ break; + } ++ ++ blockposition = blockposition.below(); ++ } while (blockposition.getY() >= Mth.floor(z) - 1); ++ ++ if (flag) { ++ Evoker.this.level().addFreshEntity(new EvokerFangs(Evoker.this.level(), x, (double) blockposition.getY() + d4, d1, minY, i, Evoker.this)); ++ Evoker.this.level().gameEvent(GameEvent.ENTITY_PLACE, new Vec3(x, (double) blockposition.getY() + d4, d1), GameEvent.Context.of((Entity) Evoker.this)); + } ++ + } + + @Override + protected SoundEvent getSpellPrepareSound() { +- return SoundEvents.EVOKER_PREPARE_SUMMON; ++ return SoundEvents.EVOKER_PREPARE_ATTACK; + } + + @Override + protected SpellcasterIllager.IllagerSpell getSpell() { +- return SpellcasterIllager.IllagerSpell.SUMMON_VEX; ++ return SpellcasterIllager.IllagerSpell.FANGS; + } + } + + public class EvokerWololoSpellGoal extends SpellcasterIllager.SpellcasterUseSpellGoal { +- private final TargetingConditions wololoTargeting = TargetingConditions.forNonCombat() +- .range(16.0) +- .selector(entity -> ((Sheep)entity).getColor() == DyeColor.BLUE); + ++ private final TargetingConditions wololoTargeting = TargetingConditions.forNonCombat().range(16.0D).selector((entityliving) -> { ++ return ((Sheep) entityliving).getColor() == DyeColor.BLUE; ++ }); ++ ++ public EvokerWololoSpellGoal() { ++ super(); ++ } ++ + @Override + public boolean canUse() { + if (Evoker.this.getTarget() != null) { +@@ -311,12 +330,12 @@ + } else if (!Evoker.this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { + return false; + } else { +- List<Sheep> nearbyEntities = Evoker.this.level() +- .getNearbyEntities(Sheep.class, this.wololoTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0, 4.0, 16.0)); +- if (nearbyEntities.isEmpty()) { ++ List<Sheep> list = Evoker.this.level().getNearbyEntities(Sheep.class, this.wololoTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0D, 4.0D, 16.0D)); ++ ++ if (list.isEmpty()) { + return false; + } else { +- Evoker.this.setWololoTarget(nearbyEntities.get(Evoker.this.random.nextInt(nearbyEntities.size()))); ++ Evoker.this.setWololoTarget((Sheep) list.get(Evoker.this.random.nextInt(list.size()))); + return true; + } + } +@@ -330,15 +349,17 @@ + @Override + public void stop() { + super.stop(); +- Evoker.this.setWololoTarget(null); ++ Evoker.this.setWololoTarget((Sheep) null); + } + + @Override + protected void performSpellCasting() { +- Sheep wololoTarget = Evoker.this.getWololoTarget(); +- if (wololoTarget != null && wololoTarget.isAlive()) { +- wololoTarget.setColor(DyeColor.RED); ++ Sheep entitysheep = Evoker.this.getWololoTarget(); ++ ++ if (entitysheep != null && entitysheep.isAlive()) { ++ entitysheep.setColor(DyeColor.RED); + } ++ + } + + @Override |