From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Fri, 24 Aug 2018 08:18:42 -0500 Subject: [PATCH] Slime Pathfinder Events diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java index 11aefbf65b0e63777d6ed5bfdb18c7f7df30fc0e..6ec81054bcf25d99aec567d568c361eea84ed384 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java @@ -44,6 +44,12 @@ import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.phys.Vec3; +// Paper start +import com.destroystokyo.paper.event.entity.SlimeChangeDirectionEvent; +import com.destroystokyo.paper.event.entity.SlimeSwimEvent; +import com.destroystokyo.paper.event.entity.SlimeTargetLivingEntityEvent; +import com.destroystokyo.paper.event.entity.SlimeWanderEvent; +// Paper end // CraftBukkit start import java.util.ArrayList; import java.util.List; @@ -108,6 +114,7 @@ public class Slime extends Mob implements Enemy { @Override public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); + nbt.putBoolean("Paper.canWander", this.canWander); // Paper nbt.putInt("Size", this.getSize() - 1); nbt.putBoolean("wasOnGround", this.wasOnGround); } @@ -116,6 +123,11 @@ public class Slime extends Mob implements Enemy { public void readAdditionalSaveData(CompoundTag nbt) { this.setSize(nbt.getInt("Size") + 1, false); super.readAdditionalSaveData(nbt); + // Paper start - check exists before loading or this will be loaded as false + if (nbt.contains("Paper.canWander")) { + this.canWander = nbt.getBoolean("Paper.canWander"); + } + // Paper end this.wasOnGround = nbt.getBoolean("wasOnGround"); } @@ -454,7 +466,7 @@ public class Slime extends Mob implements Enemy { @Override public boolean canUse() { - return (this.slime.isInWater() || this.slime.isInLava()) && this.slime.getMoveControl() instanceof Slime.SlimeMoveControl; + return (this.slime.isInWater() || this.slime.isInLava()) && this.slime.getMoveControl() instanceof Slime.SlimeMoveControl && this.slime.canWander && new SlimeSwimEvent((org.bukkit.entity.Slime) this.slime.getBukkitEntity()).callEvent(); // Paper } @Override @@ -486,7 +498,15 @@ public class Slime extends Mob implements Enemy { public boolean canUse() { LivingEntity entityliving = this.slime.getTarget(); - return entityliving == null ? false : (!this.slime.canAttack(entityliving) ? false : this.slime.getMoveControl() instanceof Slime.SlimeMoveControl); + // Paper start + if (entityliving == null || !entityliving.isAlive()) { + return false; + } + if (!this.slime.canAttack(entityliving)) { + return false; + } + return this.slime.getMoveControl() instanceof Slime.SlimeMoveControl && this.slime.canWander && new SlimeTargetLivingEntityEvent((org.bukkit.entity.Slime) this.slime.getBukkitEntity(), (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity()).callEvent(); + // Paper end } @Override @@ -499,7 +519,15 @@ public class Slime extends Mob implements Enemy { public boolean canContinueToUse() { LivingEntity entityliving = this.slime.getTarget(); - return entityliving == null ? false : (!this.slime.canAttack(entityliving) ? false : --this.growTiredTimer > 0); + // Paper start + if (entityliving == null || !entityliving.isAlive()) { + return false; + } + if (!this.slime.canAttack(entityliving)) { + return false; + } + return --this.growTiredTimer > 0 && this.slime.canWander && new SlimeTargetLivingEntityEvent((org.bukkit.entity.Slime) this.slime.getBukkitEntity(), (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity()).callEvent(); + // Paper end } @Override @@ -517,6 +545,13 @@ public class Slime extends Mob implements Enemy { ((Slime.SlimeMoveControl) this.slime.getMoveControl()).setDirection(this.slime.getYRot(), this.slime.isDealsDamage()); } + + // Paper start - clear timer and target when goal resets + public void stop() { + this.growTiredTimer = 0; + this.slime.setTarget(null); + } + // Paper end } private static class SlimeRandomDirectionGoal extends Goal { @@ -532,7 +567,7 @@ public class Slime extends Mob implements Enemy { @Override public boolean canUse() { - return this.slime.getTarget() == null && (this.slime.onGround || this.slime.isInWater() || this.slime.isInLava() || this.slime.hasEffect(MobEffects.LEVITATION)) && this.slime.getMoveControl() instanceof Slime.SlimeMoveControl; + return this.slime.getTarget() == null && (this.slime.onGround || this.slime.isInWater() || this.slime.isInLava() || this.slime.hasEffect(MobEffects.LEVITATION)) && this.slime.getMoveControl() instanceof Slime.SlimeMoveControl && this.slime.canWander; // Paper - add canWander } @Override @@ -540,6 +575,11 @@ public class Slime extends Mob implements Enemy { if (--this.nextRandomizeTime <= 0) { this.nextRandomizeTime = this.adjustedTickDelay(40 + this.slime.getRandom().nextInt(60)); this.chosenDegrees = (float) this.slime.getRandom().nextInt(360); + // Paper start + SlimeChangeDirectionEvent event = new SlimeChangeDirectionEvent((org.bukkit.entity.Slime) this.slime.getBukkitEntity(), this.chosenDegrees); + if (!this.slime.canWander || !event.callEvent()) return; + this.chosenDegrees = event.getNewYaw(); + // Paper end } ((Slime.SlimeMoveControl) this.slime.getMoveControl()).setDirection(this.chosenDegrees, false); @@ -557,7 +597,7 @@ public class Slime extends Mob implements Enemy { @Override public boolean canUse() { - return !this.slime.isPassenger(); + return !this.slime.isPassenger() && this.slime.canWander && new SlimeWanderEvent((org.bukkit.entity.Slime) this.slime.getBukkitEntity()).callEvent(); // Paper } @Override @@ -565,4 +605,15 @@ public class Slime extends Mob implements Enemy { ((Slime.SlimeMoveControl) this.slime.getMoveControl()).setWantedMovement(1.0D); } } + + // Paper start + private boolean canWander = true; + public boolean canWander() { + return canWander; + } + + public void setWander(boolean canWander) { + this.canWander = canWander; + } + // Paper end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java index 67fc37f909639e1effe6034526990f10d575d14d..4d401403de2399919043651345eed91c11ac986f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSlime.java @@ -34,4 +34,16 @@ public class CraftSlime extends CraftMob implements Slime { public EntityType getType() { return EntityType.SLIME; } + + // Paper start + @Override + public boolean canWander() { + return getHandle().canWander(); + } + + @Override + public void setWander(boolean canWander) { + getHandle().setWander(canWander); + } + // Paper end }