Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-24 15:20:11 +01:00
168 Zeilen
7.8 KiB
Diff
168 Zeilen
7.8 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: BillyGalbreath <Blake.Galbreath@GMail.com>
|
||
|
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 53130b34e5964acec191e1d8de6bde996f498699..6a199e148929d8df9b1f39733dd821c503380973 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");
|
||
|
}
|
||
|
|
||
|
@@ -453,7 +465,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
|
||
|
@@ -480,7 +492,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
|
||
|
@@ -493,7 +513,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
|
||
|
@@ -501,6 +529,13 @@ public class Slime extends Mob implements Enemy {
|
||
|
this.slime.lookAt((Entity) this.slime.getTarget(), 10.0F, 10.0F);
|
||
|
((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 {
|
||
|
@@ -516,14 +551,18 @@ 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
|
||
|
public void tick() {
|
||
|
if (--this.nextRandomizeTime <= 0) {
|
||
|
this.nextRandomizeTime = 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(), (float) this.slime.getRandom().nextInt(360));
|
||
|
+ if (!this.slime.canWander || !event.callEvent()) return;
|
||
|
+ this.chosenDegrees = event.getNewYaw();
|
||
|
+ // Paper end
|
||
|
}
|
||
|
|
||
|
((Slime.SlimeMoveControl) this.slime.getMoveControl()).setDirection(this.chosenDegrees, false);
|
||
|
@@ -541,7 +580,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
|
||
|
@@ -549,4 +588,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
|
||
|
}
|