909 lines
47 KiB
Diff
909 lines
47 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Aikar <aikar@aikar.co>
|
||
|
Date: Fri, 13 May 2016 01:38:06 -0400
|
||
|
Subject: [PATCH] Entity Activation Range 2.0
|
||
|
|
||
|
Optimizes performance of Activation Range
|
||
|
|
||
|
Adds many new configurations and a new wake up inactive system
|
||
|
|
||
|
Fixes and adds new Immunities to improve gameplay behavior
|
||
|
|
||
|
Adds water Mobs to activation range config and nerfs fish
|
||
|
Adds flying monsters to control ghast and phantoms
|
||
|
Adds villagers as separate config
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
index 40d7dbc4f1deda88d4a539b89d84b595217051b6..bf1bb1530037ebcacc8d5a491789909bddb8b697 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||
|
@@ -855,17 +855,17 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl
|
||
|
++TimingHistory.entityTicks; // Paper - timings
|
||
|
// Spigot start
|
||
|
co.aikar.timings.Timing timer; // Paper
|
||
|
- if (!org.spigotmc.ActivationRange.checkIfActive(entity)) {
|
||
|
- entity.tickCount++;
|
||
|
- timer = entity.getType().inactiveTickTimer.startTiming(); try { // Paper - timings
|
||
|
+ /*if (!org.spigotmc.ActivationRange.checkIfActive(entity)) { // Paper - comment out - EAR 2, reimplement below
|
||
|
+ entity.ticksLived++;
|
||
|
+ timer = entity.getEntityType().inactiveTickTimer.startTiming(); try { // Paper - timings
|
||
|
entity.inactiveTick();
|
||
|
} finally { timer.stopTiming(); } // Paper
|
||
|
return;
|
||
|
- }
|
||
|
+ }*/ // Paper - comment out EAR 2
|
||
|
// Spigot end
|
||
|
// Paper start- timings
|
||
|
- TimingHistory.activatedEntityTicks++;
|
||
|
- timer = entity.getVehicle() != null ? entity.getType().passengerTickTimer.startTiming() : entity.getType().tickTimer.startTiming();
|
||
|
+ final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity);
|
||
|
+ timer = isActive ? entity.getType().tickTimer.startTiming() : entity.getType().inactiveTickTimer.startTiming(); // Paper
|
||
|
try {
|
||
|
// Paper end - timings
|
||
|
entity.setPosAndOldPos(entity.getX(), entity.getY(), entity.getZ());
|
||
|
@@ -879,12 +879,16 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl
|
||
|
return Registry.ENTITY_TYPE.getKey(entity.getType()).toString();
|
||
|
});
|
||
|
gameprofilerfiller.incrementCounter("tickNonPassenger");
|
||
|
+ if (isActive) { // Paper - EAR 2
|
||
|
+ TimingHistory.activatedEntityTicks++; // Paper
|
||
|
entity.tick();
|
||
|
entity.postTick(); // CraftBukkit
|
||
|
+ } else { entity.inactiveTick(); } // Paper - EAR 2
|
||
|
gameprofilerfiller.pop();
|
||
|
}
|
||
|
|
||
|
this.updateChunkPos(entity);
|
||
|
+ } finally { timer.stopTiming(); } // Paper - timings
|
||
|
if (entity.inChunk) {
|
||
|
Iterator iterator = entity.getPassengers().iterator();
|
||
|
|
||
|
@@ -894,7 +898,7 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl
|
||
|
this.tickPassenger(entity, entity1);
|
||
|
}
|
||
|
}
|
||
|
- } finally { timer.stopTiming(); } // Paper - timings
|
||
|
+ //} finally { timer.stopTiming(); } // Paper - timings - move up
|
||
|
|
||
|
}
|
||
|
}
|
||
|
@@ -902,6 +906,11 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl
|
||
|
public void tickPassenger(Entity vehicle, Entity passenger) {
|
||
|
if (!passenger.removed && passenger.getVehicle() == vehicle) {
|
||
|
if (passenger instanceof Player || this.getChunkSource().isEntityTickingChunk(passenger)) {
|
||
|
+ // Paper - EAR 2
|
||
|
+ final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger);
|
||
|
+ co.aikar.timings.Timing timer = isActive ? passenger.getType().passengerTickTimer.startTiming() : passenger.getType().passengerInactiveTickTimer.startTiming(); // Paper
|
||
|
+ try {
|
||
|
+ // Paper end
|
||
|
passenger.setPosAndOldPos(passenger.getX(), passenger.getY(), passenger.getZ());
|
||
|
passenger.yRotO = passenger.yRot;
|
||
|
passenger.xRotO = passenger.xRot;
|
||
|
@@ -913,8 +922,17 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl
|
||
|
return Registry.ENTITY_TYPE.getKey(passenger.getType()).toString();
|
||
|
});
|
||
|
gameprofilerfiller.incrementCounter("tickPassenger");
|
||
|
+ // Paper start - EAR 2
|
||
|
+ if (isActive) {
|
||
|
passenger.rideTick();
|
||
|
passenger.postTick(); // CraftBukkit
|
||
|
+ } else {
|
||
|
+ passenger.setDeltaMovement(Vec3.ZERO);
|
||
|
+ passenger.inactiveTick();
|
||
|
+ // copied from inside of if (isPassenger()) of passengerTick, but that ifPassenger is unnecessary
|
||
|
+ vehicle.syncPositionOf(passenger);
|
||
|
+ }
|
||
|
+ // Paper end - EAR 2
|
||
|
gameprofilerfiller.pop();
|
||
|
}
|
||
|
|
||
|
@@ -927,7 +945,7 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl
|
||
|
|
||
|
this.tickPassenger(passenger, entity2);
|
||
|
}
|
||
|
- }
|
||
|
+ } } finally { timer.stopTiming(); } // Paper - EAR2 timings
|
||
|
|
||
|
}
|
||
|
} else {
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||
|
index af86c370c6f834514115a8e40659f5e1aaabec75..c6881a9a5da2caed77dea30e4906d2dd99a624c1 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||
|
@@ -67,6 +67,7 @@ import net.minecraft.world.entity.animal.AbstractFish;
|
||
|
import net.minecraft.world.entity.animal.Animal;
|
||
|
import net.minecraft.world.entity.item.ItemEntity;
|
||
|
import net.minecraft.world.entity.player.Player;
|
||
|
+import net.minecraft.world.entity.vehicle.AbstractMinecart;
|
||
|
import net.minecraft.world.entity.vehicle.Boat;
|
||
|
import net.minecraft.world.item.ItemStack;
|
||
|
import net.minecraft.world.item.enchantment.EnchantmentHelper;
|
||
|
@@ -250,7 +251,7 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
public boolean noCulling;
|
||
|
public boolean hasImpulse;
|
||
|
public int portalCooldown;
|
||
|
- protected boolean isInsidePortal;
|
||
|
+ public boolean isInsidePortal; // Paper - public
|
||
|
protected int portalTime;
|
||
|
protected BlockPos portalEntrancePos;
|
||
|
private boolean invulnerable;
|
||
|
@@ -274,6 +275,7 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
public final org.spigotmc.ActivationRange.ActivationType activationType = org.spigotmc.ActivationRange.initializeEntityActivationType(this);
|
||
|
public final boolean defaultActivationState;
|
||
|
public long activatedTick = Integer.MIN_VALUE;
|
||
|
+ public boolean isTemporarilyActive = false; // Paper
|
||
|
public boolean spawnedViaMobSpawner; // Paper - Yes this name is similar to above, upstream took the better one
|
||
|
protected int numCollisions = 0; // Paper
|
||
|
public void inactiveTick() { }
|
||
|
@@ -664,6 +666,7 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
this.setLocationFromBoundingbox();
|
||
|
} else {
|
||
|
if (type == MoverType.PISTON) {
|
||
|
+ this.activatedTick = MinecraftServer.currentTick + 20; // Paper
|
||
|
movement = this.limitPistonMovement(movement);
|
||
|
if (movement.equals(Vec3.ZERO)) {
|
||
|
return;
|
||
|
@@ -676,6 +679,13 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
this.stuckSpeedMultiplier = Vec3.ZERO;
|
||
|
this.setDeltaMovement(Vec3.ZERO);
|
||
|
}
|
||
|
+ // Paper start - ignore movement changes while inactive.
|
||
|
+ if (isTemporarilyActive && !(this instanceof ItemEntity || this instanceof AbstractMinecart) && movement == getDeltaMovement() && type == MoverType.SELF) {
|
||
|
+ setDeltaMovement(Vec3.ZERO);
|
||
|
+ this.level.getProfiler().pop();
|
||
|
+ return;
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
|
||
|
movement = this.maybeBackOffFromEdge(movement, type);
|
||
|
Vec3 vec3d1 = this.collide(movement);
|
||
|
@@ -2011,6 +2021,7 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+ public void syncPositionOf(Entity entity) { positionRider(entity); } // Paper - OBFHELPER
|
||
|
public void positionRider(Entity passenger) {
|
||
|
this.positionRider(passenger, Entity::setPos);
|
||
|
}
|
||
|
@@ -2821,6 +2832,7 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
return this.stringUUID;
|
||
|
}
|
||
|
|
||
|
+ public final boolean isPushedByWater() { return this.isPushedByFluid(); } // Paper - OBFHELPER - the below is not an obfhelper, don't use it!
|
||
|
public boolean isPushedByFluid() {
|
||
|
// Paper start
|
||
|
return this.pushedByWater();
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||
|
index 016fcc4ae20e1e48728a848be28633e624ae49a7..b84dab1043c56e2deb58aec8639226f98db165d1 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||
|
@@ -189,7 +189,7 @@ public abstract class LivingEntity extends Entity {
|
||
|
protected float rotOffs;
|
||
|
protected int deathScore;protected int getKillCount() { return this.deathScore; } // Paper - OBFHELPER
|
||
|
public float lastHurt;
|
||
|
- protected boolean jumping;
|
||
|
+ public boolean jumping; // Paper protected -> public
|
||
|
public float xxa;
|
||
|
public float yya;
|
||
|
public float zza;
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
|
||
|
index 29a2eeee9f2011ed6fcc44f19041f616decfdb38..40ab66f888f30a5506e3aa96a4b32485452e8978 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/Mob.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
|
||
|
@@ -113,7 +113,7 @@ public abstract class Mob extends LivingEntity {
|
||
|
public ResourceLocation lootTable;
|
||
|
public long lootTableSeed;
|
||
|
@Nullable
|
||
|
- private Entity leashHolder;
|
||
|
+ public Entity leashHolder; // Paper - private -> public
|
||
|
private int delayedLeashHolderId;
|
||
|
@Nullable
|
||
|
private CompoundTag leashInfoTag;
|
||
|
@@ -194,6 +194,19 @@ public abstract class Mob extends LivingEntity {
|
||
|
return this.lookControl;
|
||
|
}
|
||
|
|
||
|
+ // Paper start
|
||
|
+ @Override
|
||
|
+ public void inactiveTick() {
|
||
|
+ super.inactiveTick();
|
||
|
+ if (this.goalSelector.inactiveTick()) {
|
||
|
+ this.goalSelector.tick();
|
||
|
+ }
|
||
|
+ if (this.targetSelector.inactiveTick()) {
|
||
|
+ this.targetSelector.tick();
|
||
|
+ }
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
+
|
||
|
public MoveControl getMoveControl() {
|
||
|
if (this.isPassenger() && this.getVehicle() instanceof Mob) {
|
||
|
Mob entityinsentient = (Mob) this.getVehicle();
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/PathfinderMob.java b/src/main/java/net/minecraft/world/entity/PathfinderMob.java
|
||
|
index 920ae9af8985705a0ada7da5b7085a1ed8ca7f27..7c82d453388a27b69207d051dec316fc14715e2b 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/PathfinderMob.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/PathfinderMob.java
|
||
|
@@ -13,6 +13,7 @@ import org.bukkit.event.entity.EntityUnleashEvent;
|
||
|
public abstract class PathfinderMob extends Mob {
|
||
|
|
||
|
public org.bukkit.craftbukkit.entity.CraftCreature getBukkitCreature() { return (org.bukkit.craftbukkit.entity.CraftCreature) super.getBukkitEntity(); } // Paper
|
||
|
+ public BlockPos movingTarget = null; public BlockPos getMovingTarget() { return movingTarget; } // Paper
|
||
|
|
||
|
protected PathfinderMob(EntityType<? extends PathfinderMob> type, Level world) {
|
||
|
super(type, world);
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/Goal.java b/src/main/java/net/minecraft/world/entity/ai/goal/Goal.java
|
||
|
index d44a5b7f6cf62d5e9acacad25d47cb0d44761cfa..558dd72c47930f6993952467f83b5a54ead95d92 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/ai/goal/Goal.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/Goal.java
|
||
|
@@ -20,7 +20,10 @@ public abstract class Goal {
|
||
|
|
||
|
public void start() {}
|
||
|
|
||
|
- public void stop() {}
|
||
|
+ public void stop() {
|
||
|
+ onTaskReset(); // Paper
|
||
|
+ }
|
||
|
+ public void onTaskReset() {} // Paper
|
||
|
|
||
|
public void tick() {}
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java
|
||
|
index 9066db5c9a76cfb9665bef77b36172f1ea6ba931..9bd2ee05a0de6678ad8933a8ffbe0ae66bd073b4 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java
|
||
|
@@ -26,10 +26,11 @@ public class GoalSelector {
|
||
|
}
|
||
|
};
|
||
|
private final Map<Goal.Flag, WrappedGoal> lockedFlags = new EnumMap(Goal.Flag.class);
|
||
|
- private final Set<WrappedGoal> availableGoals = Sets.newLinkedHashSet();
|
||
|
+ private final Set<WrappedGoal> availableGoals = Sets.newLinkedHashSet(); private Set<WrappedGoal> getTasks() { return availableGoals; }// Paper - OBFHELPER
|
||
|
private final Supplier<ProfilerFiller> profiler;
|
||
|
private final EnumSet<Goal.Flag> disabledFlags = EnumSet.noneOf(Goal.Flag.class);
|
||
|
- private int newGoalRate = 3;
|
||
|
+ private int newGoalRate = 3;private int getTickRate() { return newGoalRate; } // Paper - OBFHELPER
|
||
|
+ private int curRate;private int getCurRate() { return curRate; } private void incRate() { this.curRate++; } // Paper TODO
|
||
|
|
||
|
public GoalSelector(Supplier<ProfilerFiller> profiler) {
|
||
|
this.profiler = profiler;
|
||
|
@@ -39,6 +40,21 @@ public class GoalSelector {
|
||
|
this.availableGoals.add(new WrappedGoal(priority, goal));
|
||
|
}
|
||
|
|
||
|
+ // Paper start
|
||
|
+ public boolean inactiveTick() {
|
||
|
+ incRate();
|
||
|
+ return getCurRate() % getTickRate() == 0;
|
||
|
+ }
|
||
|
+ public boolean hasTasks() {
|
||
|
+ for (WrappedGoal task : getTasks()) {
|
||
|
+ if (task.isRunning()) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ return false;
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
+
|
||
|
public void removeGoal(Goal goal) {
|
||
|
this.availableGoals.stream().filter((pathfindergoalwrapped) -> {
|
||
|
return pathfindergoalwrapped.getGoal() == goal;
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java
|
||
|
index c8680e795deeb68e0662eac7c760a103d1c767b4..e83cb412d8549b86d0348a2aa37c79201a5930be 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java
|
||
|
@@ -9,12 +9,12 @@ import net.minecraft.world.level.LevelReader;
|
||
|
|
||
|
public abstract class MoveToBlockGoal extends Goal {
|
||
|
|
||
|
- protected final PathfinderMob mob;
|
||
|
+ protected final PathfinderMob mob;public PathfinderMob getEntity() { return mob; } // Paper - OBFHELPER
|
||
|
public final double speedModifier;
|
||
|
protected int nextStartTick;
|
||
|
protected int tryTicks;
|
||
|
private int maxStayTicks;
|
||
|
- protected BlockPos blockPos;public final BlockPos getTargetPosition() { return this.blockPos; } // Paper - OBFHELPER
|
||
|
+ protected BlockPos blockPos; public final BlockPos getTargetPosition() { return this.blockPos; } public void setTargetPosition(BlockPos pos) { this.blockPos = pos; getEntity().movingTarget = pos != BlockPos.ZERO ? pos : null; } // Paper - OBFHELPER
|
||
|
private boolean reachedTarget;
|
||
|
private final int searchRange;
|
||
|
private final int verticalSearchRange;
|
||
|
@@ -23,6 +23,13 @@ public abstract class MoveToBlockGoal extends Goal {
|
||
|
public MoveToBlockGoal(PathfinderMob mob, double speed, int range) {
|
||
|
this(mob, speed, range, 1);
|
||
|
}
|
||
|
+ // Paper start - activation range improvements
|
||
|
+ @Override
|
||
|
+ public void onTaskReset() {
|
||
|
+ super.onTaskReset();
|
||
|
+ setTargetPosition(BlockPos.ZERO);
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
|
||
|
public MoveToBlockGoal(PathfinderMob mob, double speed, int range, int maxYDifference) {
|
||
|
this.blockPos = BlockPos.ZERO;
|
||
|
@@ -111,6 +118,7 @@ public abstract class MoveToBlockGoal extends Goal {
|
||
|
blockposition_mutableblockposition.setWithOffset((Vec3i) blockposition, i1, k - 1, j1);
|
||
|
if (this.mob.isWithinRestriction((BlockPos) blockposition_mutableblockposition) && this.isValidTarget(this.mob.level, blockposition_mutableblockposition)) {
|
||
|
this.blockPos = blockposition_mutableblockposition;
|
||
|
+ setTargetPosition(blockposition_mutableblockposition.immutable()); // Paper
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/WrappedGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/WrappedGoal.java
|
||
|
index 9921adf9292e0eff77515841d1b109a07b489367..81b4618a7979ee8dd25e1749c084de9262318ef4 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/ai/goal/WrappedGoal.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/WrappedGoal.java
|
||
|
@@ -64,6 +64,7 @@ public class WrappedGoal extends Goal {
|
||
|
return this.goal.getFlags();
|
||
|
}
|
||
|
|
||
|
+ public boolean isRunning() { return this.isRunning(); } // Paper - OBFHELPER
|
||
|
public boolean isRunning() {
|
||
|
return this.isRunning;
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
|
||
|
index 5a7310bb48c1b8a72ad3c5d82c44fff8800995a2..a24af0600ad3e7d189581aa06a8e998f6a12e0fc 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
|
||
|
@@ -454,6 +454,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob {
|
||
|
return this.caravanTail != null;
|
||
|
}
|
||
|
|
||
|
+ public final boolean inCaravan() { return this.inCaravan(); } // Paper - OBFHELPER
|
||
|
public boolean inCaravan() {
|
||
|
return this.caravanHead != null;
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java
|
||
|
index ae8f850baa14a4f4277da5b6fdb1e5ccb44c4f35..9eee68a5a84e121698d26bd54212a72c75e16251 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java
|
||
|
@@ -70,10 +70,12 @@ public abstract class AbstractVillager extends AgableMob implements Npc, Merchan
|
||
|
return super.finalizeSpawn(world, difficulty, spawnReason, (SpawnGroupData) entityData, entityTag);
|
||
|
}
|
||
|
|
||
|
+ public final int getUnhappy() { return getUnhappyCounter(); } // Paper - OBFHELPER
|
||
|
public int getUnhappyCounter() {
|
||
|
return (Integer) this.entityData.get(AbstractVillager.DATA_UNHAPPY_COUNTER);
|
||
|
}
|
||
|
|
||
|
+ public final void setUnhappy(int i) { setUnhappyCounter(i); } // Paper - OBFHELPER
|
||
|
public void setUnhappyCounter(int ticks) {
|
||
|
this.entityData.set(AbstractVillager.DATA_UNHAPPY_COUNTER, ticks);
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
||
|
index eed6265dc8275921a18fc5f4970ba131ba782132..4aa34320ef7d6c62ccb17734bfa61d406190b919 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
||
|
@@ -212,17 +212,29 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||
|
@Override
|
||
|
public void inactiveTick() {
|
||
|
// SPIGOT-3874, SPIGOT-3894, SPIGOT-3846, SPIGOT-5286 :(
|
||
|
- if (level.spigotConfig.tickInactiveVillagers && this.isEffectiveAi()) {
|
||
|
- this.customServerAiStep();
|
||
|
+ // Paper start
|
||
|
+ if (this.getUnhappy() > 0) {
|
||
|
+ this.setUnhappy(this.getUnhappy() - 1);
|
||
|
}
|
||
|
+ if (this.isEffectiveAi()) {
|
||
|
+ if (level.spigotConfig.tickInactiveVillagers) {
|
||
|
+ this.customServerAiStep();
|
||
|
+ } else {
|
||
|
+ this.mobTick(true);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ doReputationTick();
|
||
|
+ // Paper end
|
||
|
+
|
||
|
super.inactiveTick();
|
||
|
}
|
||
|
// Spigot End
|
||
|
|
||
|
@Override
|
||
|
- protected void customServerAiStep() {
|
||
|
+ protected void customServerAiStep() { mobTick(false); }
|
||
|
+ protected void mobTick(boolean inactive) {
|
||
|
this.level.getProfiler().push("villagerBrain");
|
||
|
- this.getBrain().tick((ServerLevel) this.level, this); // CraftBukkit - decompile error
|
||
|
+ if (!inactive) this.getBrain().tick((ServerLevel) this.level, this); // CraftBukkit - decompile error // Paper
|
||
|
this.level.getProfiler().pop();
|
||
|
if (this.assignProfessionWhenSpawned) {
|
||
|
this.assignProfessionWhenSpawned = false;
|
||
|
@@ -246,7 +258,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||
|
this.lastTradedPlayer = null;
|
||
|
}
|
||
|
|
||
|
- if (!this.isNoAi() && this.random.nextInt(100) == 0) {
|
||
|
+ if (!inactive && !this.isNoAi() && this.random.nextInt(100) == 0) { // Paper
|
||
|
Raid raid = ((ServerLevel) this.level).getRaidAt(this.blockPosition());
|
||
|
|
||
|
if (raid != null && raid.isActive() && !raid.isOver()) {
|
||
|
@@ -257,6 +269,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||
|
if (this.getVillagerData().getProfession() == VillagerProfession.NONE && this.isTrading()) {
|
||
|
this.stopTrading();
|
||
|
}
|
||
|
+ if (inactive) return; // Paper
|
||
|
|
||
|
super.customServerAiStep();
|
||
|
}
|
||
|
@@ -900,6 +913,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+ private void doReputationTick() { maybeDecayGossip(); } // Paper - OBFHELPER
|
||
|
private void maybeDecayGossip() {
|
||
|
long i = this.level.getGameTime();
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
|
||
|
index 6b79f8cd9258af47afa6efa7b1f97c3780be58b0..1d536d77518a70bdc1a23924aea99df1042b3cd5 100644
|
||
|
--- a/src/main/java/net/minecraft/world/level/Level.java
|
||
|
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
||
|
@@ -142,6 +142,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
||
|
public long ticksPerWaterSpawns;
|
||
|
public long ticksPerWaterAmbientSpawns;
|
||
|
public long ticksPerAmbientSpawns;
|
||
|
+ // Paper start
|
||
|
+ public int wakeupInactiveRemainingAnimals;
|
||
|
+ public int wakeupInactiveRemainingFlying;
|
||
|
+ public int wakeupInactiveRemainingMonsters;
|
||
|
+ public int wakeupInactiveRemainingVillagers;
|
||
|
+ // Paper end
|
||
|
public boolean populating;
|
||
|
public final org.spigotmc.SpigotWorldConfig spigotConfig; // Spigot
|
||
|
|
||
|
diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
|
||
|
index 61f180a7c95d83bb88c7df4910c498d9bdf6785a..8cbafad53d20366a36493f22160c4fa3e4ac3eaf 100644
|
||
|
--- a/src/main/java/org/spigotmc/ActivationRange.java
|
||
|
+++ b/src/main/java/org/spigotmc/ActivationRange.java
|
||
|
@@ -1,41 +1,55 @@
|
||
|
package org.spigotmc;
|
||
|
|
||
|
import java.util.Collection;
|
||
|
+import net.minecraft.core.BlockPos;
|
||
|
import net.minecraft.server.MinecraftServer;
|
||
|
+import net.minecraft.server.level.ServerChunkCache;
|
||
|
import net.minecraft.util.Mth;
|
||
|
import net.minecraft.world.entity.Entity;
|
||
|
+import net.minecraft.world.entity.FlyingMob;
|
||
|
import net.minecraft.world.entity.LightningBolt;
|
||
|
import net.minecraft.world.entity.LivingEntity;
|
||
|
+import net.minecraft.world.entity.Mob;
|
||
|
import net.minecraft.world.entity.PathfinderMob;
|
||
|
+import net.minecraft.world.entity.ai.Brain;
|
||
|
import net.minecraft.world.entity.ambient.AmbientCreature;
|
||
|
import net.minecraft.world.entity.animal.Animal;
|
||
|
+import net.minecraft.world.entity.animal.Bee;
|
||
|
import net.minecraft.world.entity.animal.Sheep;
|
||
|
+import net.minecraft.world.entity.animal.WaterAnimal;
|
||
|
+import net.minecraft.world.entity.animal.horse.Llama;
|
||
|
import net.minecraft.world.entity.boss.EnderDragonPart;
|
||
|
import net.minecraft.world.entity.boss.enderdragon.EndCrystal;
|
||
|
import net.minecraft.world.entity.boss.enderdragon.EnderDragon;
|
||
|
import net.minecraft.world.entity.boss.wither.WitherBoss;
|
||
|
+import net.minecraft.world.entity.item.FallingBlockEntity;
|
||
|
import net.minecraft.world.entity.item.PrimedTnt;
|
||
|
import net.minecraft.world.entity.monster.Creeper;
|
||
|
-import net.minecraft.world.entity.monster.Monster;
|
||
|
-import net.minecraft.world.entity.monster.Slime;
|
||
|
+import net.minecraft.world.entity.monster.Enemy;
|
||
|
+import net.minecraft.world.entity.monster.Pillager;
|
||
|
import net.minecraft.world.entity.npc.Villager;
|
||
|
import net.minecraft.world.entity.player.Player;
|
||
|
import net.minecraft.world.entity.projectile.AbstractArrow;
|
||
|
import net.minecraft.world.entity.projectile.AbstractHurtingProjectile;
|
||
|
+import net.minecraft.world.entity.projectile.EyeOfEnder;
|
||
|
import net.minecraft.world.entity.projectile.FireworkRocketEntity;
|
||
|
import net.minecraft.world.entity.projectile.ThrowableProjectile;
|
||
|
import net.minecraft.world.entity.projectile.ThrownTrident;
|
||
|
import net.minecraft.world.entity.raid.Raider;
|
||
|
+import co.aikar.timings.MinecraftTimings;
|
||
|
+import net.minecraft.world.entity.schedule.Activity;
|
||
|
import net.minecraft.world.level.Level;
|
||
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||
|
import net.minecraft.world.phys.AABB;
|
||
|
-import co.aikar.timings.MinecraftTimings;
|
||
|
|
||
|
public class ActivationRange
|
||
|
{
|
||
|
|
||
|
public enum ActivationType
|
||
|
{
|
||
|
+ WATER, // Paper
|
||
|
+ FLYING_MONSTER, // Paper
|
||
|
+ VILLAGER, // Paper
|
||
|
MONSTER,
|
||
|
ANIMAL,
|
||
|
RAIDER,
|
||
|
@@ -43,6 +57,43 @@ public class ActivationRange
|
||
|
|
||
|
AABB boundingBox = new AABB( 0, 0, 0, 0, 0, 0 );
|
||
|
}
|
||
|
+ // Paper start
|
||
|
+
|
||
|
+ static Activity[] VILLAGER_PANIC_IMMUNITIES = {
|
||
|
+ Activity.HIDE,
|
||
|
+ Activity.PRE_RAID,
|
||
|
+ Activity.RAID,
|
||
|
+ Activity.PANIC
|
||
|
+ };
|
||
|
+
|
||
|
+ private static int checkInactiveWakeup(Entity entity) {
|
||
|
+ Level world = entity.level;
|
||
|
+ SpigotWorldConfig config = world.spigotConfig;
|
||
|
+ long inactiveFor = MinecraftServer.currentTick - entity.activatedTick;
|
||
|
+ if (entity.activationType == ActivationType.VILLAGER) {
|
||
|
+ if (inactiveFor > config.wakeUpInactiveVillagersEvery && world.wakeupInactiveRemainingVillagers > 0) {
|
||
|
+ world.wakeupInactiveRemainingVillagers--;
|
||
|
+ return config.wakeUpInactiveVillagersFor;
|
||
|
+ }
|
||
|
+ } else if (entity.activationType == ActivationType.ANIMAL) {
|
||
|
+ if (inactiveFor > config.wakeUpInactiveAnimalsEvery && world.wakeupInactiveRemainingAnimals > 0) {
|
||
|
+ world.wakeupInactiveRemainingAnimals--;
|
||
|
+ return config.wakeUpInactiveAnimalsFor;
|
||
|
+ }
|
||
|
+ } else if (entity.activationType == ActivationType.FLYING_MONSTER) {
|
||
|
+ if (inactiveFor > config.wakeUpInactiveFlyingEvery && world.wakeupInactiveRemainingFlying > 0) {
|
||
|
+ world.wakeupInactiveRemainingFlying--;
|
||
|
+ return config.wakeUpInactiveFlyingFor;
|
||
|
+ }
|
||
|
+ } else if (entity.activationType == ActivationType.MONSTER || entity.activationType == ActivationType.RAIDER) {
|
||
|
+ if (inactiveFor > config.wakeUpInactiveMonstersEvery && world.wakeupInactiveRemainingMonsters > 0) {
|
||
|
+ world.wakeupInactiveRemainingMonsters--;
|
||
|
+ return config.wakeUpInactiveMonstersFor;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ return -1;
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
|
||
|
static AABB maxBB = new AABB( 0, 0, 0, 0, 0, 0 );
|
||
|
|
||
|
@@ -55,10 +106,13 @@ public class ActivationRange
|
||
|
*/
|
||
|
public static ActivationType initializeEntityActivationType(Entity entity)
|
||
|
{
|
||
|
+ if (entity instanceof WaterAnimal) { return ActivationType.WATER; } // Paper
|
||
|
+ else if (entity instanceof Villager) { return ActivationType.VILLAGER; } // Paper
|
||
|
+ else if (entity instanceof FlyingMob && entity instanceof Enemy) { return ActivationType.FLYING_MONSTER; } // Paper - doing & Monster incase Flying no longer includes monster in future
|
||
|
if ( entity instanceof Raider )
|
||
|
{
|
||
|
return ActivationType.RAIDER;
|
||
|
- } else if ( entity instanceof Monster || entity instanceof Slime )
|
||
|
+ } else if ( entity instanceof Enemy ) // Paper - correct monster check
|
||
|
{
|
||
|
return ActivationType.MONSTER;
|
||
|
} else if ( entity instanceof PathfinderMob || entity instanceof AmbientCreature )
|
||
|
@@ -79,10 +133,14 @@ public class ActivationRange
|
||
|
*/
|
||
|
public static boolean initializeEntityActivationState(Entity entity, SpigotWorldConfig config)
|
||
|
{
|
||
|
- if ( ( entity.activationType == ActivationType.MISC && config.miscActivationRange == 0 )
|
||
|
- || ( entity.activationType == ActivationType.RAIDER && config.raiderActivationRange == 0 )
|
||
|
- || ( entity.activationType == ActivationType.ANIMAL && config.animalActivationRange == 0 )
|
||
|
- || ( entity.activationType == ActivationType.MONSTER && config.monsterActivationRange == 0 )
|
||
|
+ if ( ( entity.activationType == ActivationType.MISC && config.miscActivationRange <= 0 )
|
||
|
+ || ( entity.activationType == ActivationType.RAIDER && config.raiderActivationRange <= 0 )
|
||
|
+ || ( entity.activationType == ActivationType.ANIMAL && config.animalActivationRange <= 0 )
|
||
|
+ || ( entity.activationType == ActivationType.MONSTER && config.monsterActivationRange <= 0 )
|
||
|
+ || ( entity.activationType == ActivationType.VILLAGER && config.villagerActivationRange <= 0 ) // Paper
|
||
|
+ || ( entity.activationType == ActivationType.WATER && config.waterActivationRange <= 0 ) // Paper
|
||
|
+ || ( entity.activationType == ActivationType.FLYING_MONSTER && config.flyingMonsterActivationRange <= 0 ) // Paper
|
||
|
+ || entity instanceof EyeOfEnder // Paper
|
||
|
|| entity instanceof Player
|
||
|
|| entity instanceof ThrowableProjectile
|
||
|
|| entity instanceof EnderDragon
|
||
|
@@ -91,7 +149,7 @@ public class ActivationRange
|
||
|
|| entity instanceof AbstractHurtingProjectile
|
||
|
|| entity instanceof LightningBolt
|
||
|
|| entity instanceof PrimedTnt
|
||
|
- || entity instanceof EntityFallingBlock // Paper - Always tick falling blocks
|
||
|
+ || entity instanceof FallingBlockEntity // Paper - Always tick falling blocks
|
||
|
|| entity instanceof EndCrystal
|
||
|
|| entity instanceof FireworkRocketEntity
|
||
|
|| entity instanceof ThrownTrident )
|
||
|
@@ -115,10 +173,25 @@ public class ActivationRange
|
||
|
final int raiderActivationRange = world.spigotConfig.raiderActivationRange;
|
||
|
final int animalActivationRange = world.spigotConfig.animalActivationRange;
|
||
|
final int monsterActivationRange = world.spigotConfig.monsterActivationRange;
|
||
|
+ // Paper start
|
||
|
+ final int waterActivationRange = world.spigotConfig.waterActivationRange;
|
||
|
+ final int flyingActivationRange = world.spigotConfig.flyingMonsterActivationRange;
|
||
|
+ final int villagerActivationRange = world.spigotConfig.villagerActivationRange;
|
||
|
+ world.wakeupInactiveRemainingAnimals = Math.min(world.wakeupInactiveRemainingAnimals + 1, world.spigotConfig.wakeUpInactiveAnimals);
|
||
|
+ world.wakeupInactiveRemainingVillagers = Math.min(world.wakeupInactiveRemainingVillagers + 1, world.spigotConfig.wakeUpInactiveVillagers);
|
||
|
+ world.wakeupInactiveRemainingMonsters = Math.min(world.wakeupInactiveRemainingMonsters + 1, world.spigotConfig.wakeUpInactiveMonsters);
|
||
|
+ world.wakeupInactiveRemainingFlying = Math.min(world.wakeupInactiveRemainingFlying + 1, world.spigotConfig.wakeUpInactiveFlying);
|
||
|
+ final ServerChunkCache chunkProvider = (ServerChunkCache) world.getChunkSource();
|
||
|
+ // Paper end
|
||
|
|
||
|
int maxRange = Math.max( monsterActivationRange, animalActivationRange );
|
||
|
maxRange = Math.max( maxRange, raiderActivationRange );
|
||
|
maxRange = Math.max( maxRange, miscActivationRange );
|
||
|
+ // Paper start
|
||
|
+ maxRange = Math.max( maxRange, flyingActivationRange );
|
||
|
+ maxRange = Math.max( maxRange, waterActivationRange );
|
||
|
+ maxRange = Math.max( maxRange, villagerActivationRange );
|
||
|
+ // Paper end
|
||
|
maxRange = Math.min( ( world.spigotConfig.viewDistance << 4 ) - 8, maxRange );
|
||
|
|
||
|
for ( Player player : world.players() )
|
||
|
@@ -130,6 +203,11 @@ public class ActivationRange
|
||
|
ActivationType.RAIDER.boundingBox = player.getBoundingBox().inflate( raiderActivationRange, 256, raiderActivationRange );
|
||
|
ActivationType.ANIMAL.boundingBox = player.getBoundingBox().inflate( animalActivationRange, 256, animalActivationRange );
|
||
|
ActivationType.MONSTER.boundingBox = player.getBoundingBox().inflate( monsterActivationRange, 256, monsterActivationRange );
|
||
|
+ // Paper start
|
||
|
+ ActivationType.WATER.boundingBox = player.getBoundingBox().inflate( waterActivationRange, 256, waterActivationRange );
|
||
|
+ ActivationType.FLYING_MONSTER.boundingBox = player.getBoundingBox().inflate( flyingActivationRange, 256, flyingActivationRange );
|
||
|
+ ActivationType.VILLAGER.boundingBox = player.getBoundingBox().inflate( villagerActivationRange, 256, waterActivationRange );
|
||
|
+ // Paper end
|
||
|
|
||
|
int i = Mth.floor( maxBB.minX / 16.0D );
|
||
|
int j = Mth.floor( maxBB.maxX / 16.0D );
|
||
|
@@ -140,7 +218,7 @@ public class ActivationRange
|
||
|
{
|
||
|
for ( int j1 = k; j1 <= l; ++j1 )
|
||
|
{
|
||
|
- LevelChunk chunk = (LevelChunk) world.getChunkIfLoadedImmediately( i1, j1 );
|
||
|
+ LevelChunk chunk = chunkProvider.getChunkAtIfLoadedMainThreadNoCache( i1, j1 ); // Paper
|
||
|
if ( chunk != null )
|
||
|
{
|
||
|
activateChunkEntities( chunk );
|
||
|
@@ -158,19 +236,15 @@ public class ActivationRange
|
||
|
*/
|
||
|
private static void activateChunkEntities(LevelChunk chunk)
|
||
|
{
|
||
|
- for ( java.util.List<Entity> slice : chunk.entitySlices )
|
||
|
- {
|
||
|
- for ( Entity entity : (Collection<Entity>) slice )
|
||
|
+ // Paper start
|
||
|
+ Entity[] rawData = chunk.entities.getRawData();
|
||
|
+ for (int i = 0; i < chunk.entities.size(); i++) {
|
||
|
+ Entity entity = rawData[i];
|
||
|
+ //for ( Entity entity : (Collection<Entity>) slice )
|
||
|
+ // Paper end
|
||
|
{
|
||
|
- if ( MinecraftServer.currentTick > entity.activatedTick )
|
||
|
- {
|
||
|
- if ( entity.defaultActivationState )
|
||
|
- {
|
||
|
- entity.activatedTick = MinecraftServer.currentTick;
|
||
|
- continue;
|
||
|
- }
|
||
|
- if ( entity.activationType.boundingBox.intersects( entity.getBoundingBox() ) )
|
||
|
- {
|
||
|
+ if (MinecraftServer.currentTick > entity.activatedTick) {
|
||
|
+ if (entity.defaultActivationState || entity.activationType.boundingBox.intersects(entity.getBoundingBox())) { // Paper
|
||
|
entity.activatedTick = MinecraftServer.currentTick;
|
||
|
}
|
||
|
}
|
||
|
@@ -185,56 +259,105 @@ public class ActivationRange
|
||
|
* @param entity
|
||
|
* @return
|
||
|
*/
|
||
|
- public static boolean checkEntityImmunities(Entity entity)
|
||
|
+ public static int checkEntityImmunities(Entity entity) // Paper - return # of ticks to get immunity
|
||
|
{
|
||
|
+ // Paper start
|
||
|
+ SpigotWorldConfig config = entity.level.spigotConfig;
|
||
|
+ int inactiveWakeUpImmunity = checkInactiveWakeup(entity);
|
||
|
+ if (inactiveWakeUpImmunity > -1) {
|
||
|
+ return inactiveWakeUpImmunity;
|
||
|
+ }
|
||
|
+ if (entity.remainingFireTicks > 0) {
|
||
|
+ return 2;
|
||
|
+ }
|
||
|
+ long inactiveFor = MinecraftServer.currentTick - entity.activatedTick;
|
||
|
+ // Paper end
|
||
|
// quick checks.
|
||
|
- if ( entity.wasTouchingWater || entity.remainingFireTicks > 0 )
|
||
|
+ if ( (entity.activationType != ActivationType.WATER && entity.wasTouchingWater && entity.isPushedByWater()) ) // Paper
|
||
|
{
|
||
|
- return true;
|
||
|
+ return 100; // Paper
|
||
|
}
|
||
|
if ( !( entity instanceof AbstractArrow ) )
|
||
|
{
|
||
|
- if ( !entity.isOnGround() || !entity.passengers.isEmpty() || entity.isPassenger() )
|
||
|
+ if ( (!entity.isOnGround() && !(entity instanceof FlyingMob)) ) // Paper - remove passengers logic
|
||
|
{
|
||
|
- return true;
|
||
|
+ return 10; // Paper
|
||
|
}
|
||
|
} else if ( !( (AbstractArrow) entity ).inGround )
|
||
|
{
|
||
|
- return true;
|
||
|
+ return 1; // Paper
|
||
|
}
|
||
|
// special cases.
|
||
|
if ( entity instanceof LivingEntity )
|
||
|
{
|
||
|
LivingEntity living = (LivingEntity) entity;
|
||
|
- if ( /*TODO: Missed mapping? living.attackTicks > 0 || */ living.hurtTime > 0 || living.activeEffects.size() > 0 )
|
||
|
+ if ( living.onClimbable() || living.jumping || living.hurtTime > 0 || living.activeEffects.size() > 0 ) // Paper
|
||
|
{
|
||
|
- return true;
|
||
|
+ return 1; // Paper
|
||
|
}
|
||
|
- if ( entity instanceof PathfinderMob && ( (PathfinderMob) entity ).getTarget() != null )
|
||
|
+ if ( entity instanceof Mob && ((Mob) entity ).getTarget() != null) // Paper
|
||
|
{
|
||
|
- return true;
|
||
|
+ return 20; // Paper
|
||
|
+ }
|
||
|
+ // Paper start
|
||
|
+ if (entity instanceof Bee) {
|
||
|
+ Bee bee = (Bee)entity;
|
||
|
+ BlockPos movingTarget = bee.getMovingTarget();
|
||
|
+ if (bee.isAngry() ||
|
||
|
+ (bee.getHivePos() != null && bee.getHivePos().equals(movingTarget)) ||
|
||
|
+ (bee.getSavedFlowerPos() != null && bee.getSavedFlowerPos().equals(movingTarget))
|
||
|
+ ) {
|
||
|
+ return 20;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ if ( entity instanceof Villager ) {
|
||
|
+ Brain<Villager> behaviorController = ((Villager) entity).getBrain();
|
||
|
+
|
||
|
+ if (config.villagersActiveForPanic) {
|
||
|
+ for (Activity activity : VILLAGER_PANIC_IMMUNITIES) {
|
||
|
+ if (behaviorController.isActive(activity)) {
|
||
|
+ return 20*5;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (config.villagersWorkImmunityAfter > 0 && inactiveFor >= config.villagersWorkImmunityAfter) {
|
||
|
+ if (behaviorController.isActive(Activity.WORK)) {
|
||
|
+ return config.villagersWorkImmunityFor;
|
||
|
+ }
|
||
|
+ }
|
||
|
}
|
||
|
- if ( entity instanceof Villager && ( (Villager) entity ).canBreed() )
|
||
|
+ if ( entity instanceof Llama && ( (Llama) entity ).inCaravan() )
|
||
|
{
|
||
|
- return true;
|
||
|
+ return 1;
|
||
|
}
|
||
|
+ // Paper end
|
||
|
if ( entity instanceof Animal )
|
||
|
{
|
||
|
Animal animal = (Animal) entity;
|
||
|
if ( animal.isBaby() || animal.isInLove() )
|
||
|
{
|
||
|
- return true;
|
||
|
+ return 5; // Paper
|
||
|
}
|
||
|
if ( entity instanceof Sheep && ( (Sheep) entity ).isSheared() )
|
||
|
{
|
||
|
- return true;
|
||
|
+ return 1; // Paper
|
||
|
}
|
||
|
}
|
||
|
if (entity instanceof Creeper && ((Creeper) entity).isIgnited()) { // isExplosive
|
||
|
- return true;
|
||
|
+ return 20; // Paper
|
||
|
}
|
||
|
+ // Paper start
|
||
|
+ if (entity instanceof Mob && ((Mob) entity).targetSelector.hasTasks() ) {
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+ if (entity instanceof Pillager) {
|
||
|
+ Pillager pillager = (Pillager) entity;
|
||
|
+ // TODO:?
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
}
|
||
|
- return false;
|
||
|
+ return -1; // Paper
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
@@ -249,8 +372,19 @@ public class ActivationRange
|
||
|
if ( !entity.inChunk || entity instanceof FireworkRocketEntity ) {
|
||
|
return true;
|
||
|
}
|
||
|
+ // Paper start - special case always immunities
|
||
|
+ // immunize brand new entities, dead entities, and portal scenarios
|
||
|
+ if (entity.defaultActivationState || entity.tickCount < 20*10 || !entity.isAlive() || entity.isInsidePortal || entity.portalCooldown > 0) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ // immunize leashed entities
|
||
|
+ if (entity instanceof Mob && ((Mob)entity).leashHolder instanceof Player) {
|
||
|
+ return true;
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
|
||
|
- boolean isActive = entity.activatedTick >= MinecraftServer.currentTick || entity.defaultActivationState;
|
||
|
+ boolean isActive = entity.activatedTick >= MinecraftServer.currentTick;
|
||
|
+ entity.isTemporarilyActive = false; // Paper
|
||
|
|
||
|
// Should this entity tick?
|
||
|
if ( !isActive )
|
||
|
@@ -258,15 +392,19 @@ public class ActivationRange
|
||
|
if ( ( MinecraftServer.currentTick - entity.activatedTick - 1 ) % 20 == 0 )
|
||
|
{
|
||
|
// Check immunities every 20 ticks.
|
||
|
- if ( checkEntityImmunities( entity ) )
|
||
|
- {
|
||
|
- // Triggered some sort of immunity, give 20 full ticks before we check again.
|
||
|
- entity.activatedTick = MinecraftServer.currentTick + 20;
|
||
|
+ // Paper start
|
||
|
+ int immunity = checkEntityImmunities(entity);
|
||
|
+ if (immunity >= 0) {
|
||
|
+ entity.activatedTick = MinecraftServer.currentTick + immunity;
|
||
|
+ } else {
|
||
|
+ entity.isTemporarilyActive = true;
|
||
|
}
|
||
|
+ // Paper end
|
||
|
isActive = true;
|
||
|
+
|
||
|
}
|
||
|
// Add a little performance juice to active entities. Skip 1/4 if not immune.
|
||
|
- } else if ( !entity.defaultActivationState && entity.tickCount % 4 == 0 && !checkEntityImmunities( entity ) )
|
||
|
+ } else if (entity.tickCount % 4 == 0 && checkEntityImmunities( entity) < 0 ) // Paper
|
||
|
{
|
||
|
isActive = false;
|
||
|
}
|
||
|
diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java
|
||
|
index 34ee684901906fc2ef5f0d09680d2686b813e52b..6b015c1f26facb4e82d75b252164dec05731ca6c 100644
|
||
|
--- a/src/main/java/org/spigotmc/SpigotWorldConfig.java
|
||
|
+++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java
|
||
|
@@ -180,13 +180,59 @@ public class SpigotWorldConfig
|
||
|
public int monsterActivationRange = 32;
|
||
|
public int raiderActivationRange = 48;
|
||
|
public int miscActivationRange = 16;
|
||
|
+ // Paper start
|
||
|
+ public int flyingMonsterActivationRange = 32;
|
||
|
+ public int waterActivationRange = 16;
|
||
|
+ public int villagerActivationRange = 32;
|
||
|
+ public int wakeUpInactiveAnimals = 4;
|
||
|
+ public int wakeUpInactiveAnimalsEvery = 60*20;
|
||
|
+ public int wakeUpInactiveAnimalsFor = 5*20;
|
||
|
+ public int wakeUpInactiveMonsters = 8;
|
||
|
+ public int wakeUpInactiveMonstersEvery = 20*20;
|
||
|
+ public int wakeUpInactiveMonstersFor = 5*20;
|
||
|
+ public int wakeUpInactiveVillagers = 4;
|
||
|
+ public int wakeUpInactiveVillagersEvery = 30*20;
|
||
|
+ public int wakeUpInactiveVillagersFor = 5*20;
|
||
|
+ public int wakeUpInactiveFlying = 8;
|
||
|
+ public int wakeUpInactiveFlyingEvery = 10*20;
|
||
|
+ public int wakeUpInactiveFlyingFor = 5*20;
|
||
|
+ public int villagersWorkImmunityAfter = 5*20;
|
||
|
+ public int villagersWorkImmunityFor = 20;
|
||
|
+ public boolean villagersActiveForPanic = true;
|
||
|
+ // Paper end
|
||
|
public boolean tickInactiveVillagers = true;
|
||
|
private void activationRange()
|
||
|
{
|
||
|
+ boolean hasAnimalsConfig = config.getInt("entity-activation-range.animals", animalActivationRange) != animalActivationRange; // Paper
|
||
|
animalActivationRange = getInt( "entity-activation-range.animals", animalActivationRange );
|
||
|
monsterActivationRange = getInt( "entity-activation-range.monsters", monsterActivationRange );
|
||
|
raiderActivationRange = getInt( "entity-activation-range.raiders", raiderActivationRange );
|
||
|
miscActivationRange = getInt( "entity-activation-range.misc", miscActivationRange );
|
||
|
+ // Paper start
|
||
|
+ waterActivationRange = getInt( "entity-activation-range.water", waterActivationRange );
|
||
|
+ villagerActivationRange = getInt( "entity-activation-range.villagers", hasAnimalsConfig ? animalActivationRange : villagerActivationRange );
|
||
|
+ flyingMonsterActivationRange = getInt( "entity-activation-range.flying-monsters", flyingMonsterActivationRange );
|
||
|
+
|
||
|
+ wakeUpInactiveAnimals = getInt("entity-activation-range.wake-up-inactive.animals-max-per-tick", wakeUpInactiveAnimals);
|
||
|
+ wakeUpInactiveAnimalsEvery = getInt("entity-activation-range.wake-up-inactive.animals-every", wakeUpInactiveAnimalsEvery);
|
||
|
+ wakeUpInactiveAnimalsFor = getInt("entity-activation-range.wake-up-inactive.animals-for", wakeUpInactiveAnimalsFor);
|
||
|
+
|
||
|
+ wakeUpInactiveMonsters = getInt("entity-activation-range.wake-up-inactive.monsters-max-per-tick", wakeUpInactiveMonsters);
|
||
|
+ wakeUpInactiveMonstersEvery = getInt("entity-activation-range.wake-up-inactive.monsters-every", wakeUpInactiveMonstersEvery);
|
||
|
+ wakeUpInactiveMonstersFor = getInt("entity-activation-range.wake-up-inactive.monsters-for", wakeUpInactiveMonstersFor);
|
||
|
+
|
||
|
+ wakeUpInactiveVillagers = getInt("entity-activation-range.wake-up-inactive.villagers-max-per-tick", wakeUpInactiveVillagers);
|
||
|
+ wakeUpInactiveVillagersEvery = getInt("entity-activation-range.wake-up-inactive.villagers-every", wakeUpInactiveVillagersEvery);
|
||
|
+ wakeUpInactiveVillagersFor = getInt("entity-activation-range.wake-up-inactive.villagers-for", wakeUpInactiveVillagersFor);
|
||
|
+
|
||
|
+ wakeUpInactiveFlying = getInt("entity-activation-range.wake-up-inactive.flying-monsters-max-per-tick", wakeUpInactiveFlying);
|
||
|
+ wakeUpInactiveFlyingEvery = getInt("entity-activation-range.wake-up-inactive.flying-monsters-every", wakeUpInactiveFlyingEvery);
|
||
|
+ wakeUpInactiveFlyingFor = getInt("entity-activation-range.wake-up-inactive.flying-monsters-for", wakeUpInactiveFlyingFor);
|
||
|
+
|
||
|
+ villagersWorkImmunityAfter = getInt( "entity-activation-range.villagers-work-immunity-after", villagersWorkImmunityAfter );
|
||
|
+ villagersWorkImmunityFor = getInt( "entity-activation-range.villagers-work-immunity-for", villagersWorkImmunityFor );
|
||
|
+ villagersActiveForPanic = getBoolean( "entity-activation-range.villagers-active-for-panic", villagersActiveForPanic );
|
||
|
+ // Paper end
|
||
|
tickInactiveVillagers = getBoolean( "entity-activation-range.tick-inactive-villagers", tickInactiveVillagers );
|
||
|
log( "Entity Activation Range: An " + animalActivationRange + " / Mo " + monsterActivationRange + " / Ra " + raiderActivationRange + " / Mi " + miscActivationRange + " / Tiv " + tickInactiveVillagers );
|
||
|
}
|