This commit is contained in:
Tamion 2024-04-29 08:33:37 +02:00 committed by GitHub
commit 6965c5a3a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 138 additions and 30 deletions

View File

@ -64,4 +64,5 @@ Oliwier Miodun <naczs@blueflow.pl>
aerulion <aerulion@gmail.com>
Lukas Planz <lukas.planz@web.de>
granny <contact@granny.dev>
Tamion <70228790+notTamion@users.noreply.github.com>
```

View File

@ -1400,10 +1400,10 @@ index 0000000000000000000000000000000000000000..990d1bb46e0f9719f4e9af928d80ac6f
+}
diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3a39a0b1f54d38207fa55485318e6ca257a57ab
index 0000000000000000000000000000000000000000..24c74a2760cd5c9964a192381b0d18ea80173a8e
--- /dev/null
+++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java
@@ -0,0 +1,550 @@
@@ -0,0 +1,553 @@
+package io.papermc.paper.configuration;
+
+import com.google.common.collect.HashBasedTable;
@ -1587,12 +1587,15 @@ index 0000000000000000000000000000000000000000..b3a39a0b1f54d38207fa55485318e6ca
+ @MergeMap
+ public Reference2IntMap<MobCategory> spawnLimits = Util.make(new Reference2IntOpenHashMap<>(NaturalSpawner.SPAWNING_CATEGORIES.length), map -> Arrays.stream(NaturalSpawner.SPAWNING_CATEGORIES).forEach(mobCategory -> map.put(mobCategory, -1)));
+ @MergeMap
+ public Map<MobCategory, DespawnRange> despawnRanges = Arrays.stream(MobCategory.values()).collect(Collectors.toMap(Function.identity(), category -> new DespawnRange(category.getNoDespawnDistance(), category.getDespawnDistance())));
+ public Map<MobCategory, DespawnRange> despawnRanges = Arrays.stream(MobCategory.values()).collect(Collectors.toMap(Function.identity(), category -> new DespawnRange(category.getDespawnDistance(), category.getNoDespawnDistance())));
+ @MergeMap
+ public Reference2IntMap<MobCategory> ticksPerSpawn = Util.make(new Reference2IntOpenHashMap<>(NaturalSpawner.SPAWNING_CATEGORIES.length), map -> Arrays.stream(NaturalSpawner.SPAWNING_CATEGORIES).forEach(mobCategory -> map.put(mobCategory, -1)));
+
+ @ConfigSerializable
+ public record DespawnRange(@Required int soft, @Required int hard) {
+ public record DespawnRange(@Required int xzLimit, @Required int yLimit, @Required int xzSoftLimit, @Required int ySoftLimit) {
+ public DespawnRange(int hard, int soft) {
+ this(hard, hard, soft, soft);
+ }
+ }
+
+ public WaterAnimalSpawnHeight wateranimalSpawnHeight;
@ -2443,6 +2446,89 @@ index 0000000000000000000000000000000000000000..9c339ef178ebc3b0251095f320e4a7a3
+ return MiniMessage.miniMessage().serialize(component);
+ }
+}
diff --git a/src/main/java/io/papermc/paper/configuration/serializer/DespawnRangeSerializer.java b/src/main/java/io/papermc/paper/configuration/serializer/DespawnRangeSerializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..6d20301d9f394e8068e95f960d698c7ec0cbd22e
--- /dev/null
+++ b/src/main/java/io/papermc/paper/configuration/serializer/DespawnRangeSerializer.java
@@ -0,0 +1,77 @@
+package io.papermc.paper.configuration.serializer;
+
+import io.papermc.paper.configuration.WorldConfiguration.Entities.Spawning.DespawnRange;
+import net.minecraft.world.entity.MobCategory;
+import org.checkerframework.checker.nullness.qual.Nullable;
+import org.spongepowered.configurate.ConfigurationNode;
+import org.spongepowered.configurate.serialize.SerializationException;
+import org.spongepowered.configurate.serialize.TypeSerializer;
+import java.lang.reflect.Type;
+
+public class DespawnRangeSerializer implements TypeSerializer<DespawnRange> {
+
+ @Override
+ public DespawnRange deserialize(final Type type, final ConfigurationNode node) throws SerializationException {
+ ConfigurationNode hard = node.node("hard");
+ ConfigurationNode soft = node.node("soft");
+
+ int xzLimit;
+ int xzSoftLimit;
+ int yLimit;
+ int ySoftLimit;
+
+ MobCategory category = MobCategory.valueOf(node.key().toString().toUpperCase());
+
+ if (hard.hasChild("horizontal") || hard.hasChild("vertical")) {
+ xzLimit = ifPresent(hard.node("horizontal"), category.getDespawnDistance());
+ yLimit = ifPresent(hard.node("vertical"), category.getDespawnDistance());
+ } else {
+ xzLimit = yLimit = ifPresent(hard, category.getDespawnDistance());
+ }
+
+ if (soft.hasChild("horizontal") || soft.hasChild("vertical")) {
+ xzSoftLimit = ifPresent(soft.node("horizontal"), category.getNoDespawnDistance());
+ ySoftLimit = ifPresent(soft.node("vertical"), category.getNoDespawnDistance());
+ } else {
+ xzSoftLimit = ySoftLimit = ifPresent(soft, category.getNoDespawnDistance());
+ }
+ return new DespawnRange(xzLimit, yLimit, xzSoftLimit, ySoftLimit);
+ }
+
+ @Override
+ public void serialize(final Type type, @Nullable final DespawnRange despawnRange, final ConfigurationNode node) throws SerializationException {
+ if (despawnRange == null) {
+ node.raw(null);
+ return;
+ }
+
+ ConfigurationNode hard = node.node("hard");
+ ConfigurationNode soft = node.node("soft");
+
+ int xzLimit = despawnRange.xzLimit();
+ int xzSoftLimit = despawnRange.xzSoftLimit();
+ int yLimit = despawnRange.yLimit();
+ int ySoftLimit = despawnRange.ySoftLimit();
+
+ if (xzLimit == yLimit) {
+ hard.set(xzLimit);
+ } else {
+ hard.node("horizontal").set(xzLimit);
+ hard.node("vertical").set(yLimit);
+ }
+ if (xzSoftLimit == ySoftLimit) {
+ soft.set(xzSoftLimit);
+ } else {
+ soft.node("horizontal").set(xzSoftLimit);
+ soft.node("vertical").set(ySoftLimit);
+ }
+ }
+
+ private int ifPresent(ConfigurationNode node, int or) {
+ if (node.virtual())
+ return or;
+ if (node.raw() instanceof Integer i)
+ return i;
+ throw new RuntimeException(new SerializationException(node, Integer.class, "Expected an integer, got \"" + node.raw() + "\" instead"));
+ }
+}
diff --git a/src/main/java/io/papermc/paper/configuration/serializer/EngineModeSerializer.java b/src/main/java/io/papermc/paper/configuration/serializer/EngineModeSerializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..27c0679d376bb31ab52131dfea74b3b580ca92b5

View File

@ -5,23 +5,44 @@ Subject: [PATCH] Add configurable entity despawn distances
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index 17c9f99e777e211437cb5d693fe247a22ae51c7d..c8ff4b01186f924473b9ffde948d7f0573e8d56f 100644
index 17c9f99e777e211437cb5d693fe247a22ae51c7d..52f3acbefd49eb8eda008fb616d3447cbc8f02e8 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -911,14 +911,14 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -910,20 +910,27 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
Player entityhuman = this.level().getNearestPlayer(this, -1.0D);
if (entityhuman != null) {
double d0 = entityhuman.distanceToSqr((Entity) this);
- double d0 = entityhuman.distanceToSqr((Entity) this);
- int i = this.getType().getCategory().getDespawnDistance();
+ int i = this.level().paperConfig().entities.spawning.despawnRanges.get(this.getType().getCategory()).hard(); // Paper - Configurable despawn distances
int j = i * i;
- int j = i * i;
+ // Paper start - Configurable despawn distances
+ io.papermc.paper.configuration.WorldConfiguration.Entities.Spawning.DespawnRange despawnRanges = this.level().paperConfig().entities.spawning.despawnRanges.get(this.getType().getCategory());
if (d0 > (double) j && this.removeWhenFarAway(d0)) {
this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
}
- if (d0 > (double) j && this.removeWhenFarAway(d0)) {
- this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
- }
+ double xzDistance = entityhuman.distanceToSqr(this.getX(), entityhuman.getY(), this.getZ());
+ double yDistance = Math.abs(entityhuman.getY() - this.getY());
- int k = this.getType().getCategory().getNoDespawnDistance();
+ int k = this.level().paperConfig().entities.spawning.despawnRanges.get(this.getType().getCategory()).soft(); // Paper - Configurable despawn distances
int l = k * k;
- int l = k * k;
+ int xzLimit = despawnRanges.xzLimit() * despawnRanges.xzLimit();
+ int xzSoftLimit = despawnRanges.xzSoftLimit() * despawnRanges.xzSoftLimit();
+ int yLimit = despawnRanges.yLimit();
+ int ySoftLimit = despawnRanges.ySoftLimit();
if (this.noActionTime > 600 && this.random.nextInt(800) == 0 && d0 > (double) l && this.removeWhenFarAway(d0)) {
- if (this.noActionTime > 600 && this.random.nextInt(800) == 0 && d0 > (double) l && this.removeWhenFarAway(d0)) {
+ if ((xzDistance > xzLimit || yDistance > yLimit) && this.removeWhenFarAway(xzDistance)) {
this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
- } else if (d0 < (double) l) {
+ }
+
+ if (xzDistance > xzSoftLimit || yDistance > ySoftLimit) {
+ if (this.noActionTime > 600 && this.random.nextInt(800) == 0 && this.removeWhenFarAway(xzDistance)) {
+ this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
+ }
+ } else {
+ // Paper end - Configurable despawn distances
this.noActionTime = 0;
}
}

View File

@ -21,7 +21,7 @@ index 3126e8cab3c40e3af47f4c8925e1c6a9523309ba..3207166061bf9c4d7bf3f38e5a9f7aff
public static Predicate<Entity> withinDistance(double x, double y, double z, double max) {
double d4 = max * max;
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index c8ff4b01186f924473b9ffde948d7f0573e8d56f..426fa1798087ab1fb4198bd036f498606dce7c3f 100644
index 52f3acbefd49eb8eda008fb616d3447cbc8f02e8..1484df1c9573bb8ecaa9b00129346fd642efcffa 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -907,7 +907,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@ -32,7 +32,7 @@ index c8ff4b01186f924473b9ffde948d7f0573e8d56f..426fa1798087ab1fb4198bd036f49860
+ Player entityhuman = this.level().findNearbyPlayer(this, -1.0D, EntitySelector.PLAYER_AFFECTS_SPAWNING); // Paper - Affects Spawning API
if (entityhuman != null) {
double d0 = entityhuman.distanceToSqr((Entity) this);
// Paper start - Configurable despawn distances
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
index c01d9751828d03f37f36b52d84336bd0ee008e8b..f3a02925833733ae50d706ffc681dd05344a7687 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java

View File

@ -232,10 +232,10 @@ index 337fda9f87ece1fc2264ae6a2af2b7abbb23d788..21d2c43a97122025edd91662e39d44cc
// CraftBukkit start
public int getExpReward() {
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index e159da8a8dcff686e93d09a15141233915c264bf..4c0f7741e199e4bb03767effda669bbbc9f0d233 100644
index d0845cacd346c5274d71b8c3e702ce90343026c6..9c802ebb7edf41ffa58c6bd61a5002aa18910054 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -1170,6 +1170,12 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -1177,6 +1177,12 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
}
@ -248,7 +248,7 @@ index e159da8a8dcff686e93d09a15141233915c264bf..4c0f7741e199e4bb03767effda669bbb
@Override
protected void dropCustomDeathLoot(DamageSource source, int lootingMultiplier, boolean allowDrops) {
super.dropCustomDeathLoot(source, lootingMultiplier, allowDrops);
@@ -1178,6 +1184,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -1185,6 +1191,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
for (int k = 0; k < j; ++k) {
EquipmentSlot enumitemslot = aenumitemslot[k];
@ -256,7 +256,7 @@ index e159da8a8dcff686e93d09a15141233915c264bf..4c0f7741e199e4bb03767effda669bbb
ItemStack itemstack = this.getItemBySlot(enumitemslot);
float f = this.getEquipmentDropChance(enumitemslot);
boolean flag1 = f > 1.0F;
@@ -1188,7 +1195,13 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -1195,7 +1202,13 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
}
this.spawnAtLocation(itemstack);

View File

@ -5,10 +5,10 @@ Subject: [PATCH] Expand EntityUnleashEvent
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index 4c0f7741e199e4bb03767effda669bbbc9f0d233..7b10bb9cbf6f2b4a70ddaa0ba4bc7409a17f3f09 100644
index 9c802ebb7edf41ffa58c6bd61a5002aa18910054..102f53d0d292496597415dc72b1b814543f7f856 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -1431,12 +1431,15 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -1438,12 +1438,15 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
return InteractionResult.PASS;
} else if (this.getLeashHolder() == player) {
// CraftBukkit start - fire PlayerUnleashEntityEvent
@ -26,7 +26,7 @@ index 4c0f7741e199e4bb03767effda669bbbc9f0d233..7b10bb9cbf6f2b4a70ddaa0ba4bc7409
this.gameEvent(GameEvent.ENTITY_INTERACT, player);
return InteractionResult.sidedSuccess(this.level().isClientSide);
} else {
@@ -1605,8 +1608,11 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -1612,8 +1615,11 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
if (this.leashHolder != null) {
if (!this.isAlive() || !this.leashHolder.isAlive()) {
@ -40,7 +40,7 @@ index 4c0f7741e199e4bb03767effda669bbbc9f0d233..7b10bb9cbf6f2b4a70ddaa0ba4bc7409
}
}
@@ -1674,8 +1680,11 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -1681,8 +1687,11 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
boolean flag1 = super.startRiding(entity, force);
if (flag1 && this.isLeashed()) {
@ -54,7 +54,7 @@ index 4c0f7741e199e4bb03767effda669bbbc9f0d233..7b10bb9cbf6f2b4a70ddaa0ba4bc7409
}
return flag1;
@@ -1852,8 +1861,11 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -1859,8 +1868,11 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@Override
protected void removeAfterChangingDimensions() {
super.removeAfterChangingDimensions();

View File

@ -5,10 +5,10 @@ Subject: [PATCH] Fix inventory desync
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index 7b10bb9cbf6f2b4a70ddaa0ba4bc7409a17f3f09..66814adfb2cf92067702fc2695b083661cf859c0 100644
index 102f53d0d292496597415dc72b1b814543f7f856..b04ee23f3d971d5a8cd275c9f91b4c2962889684 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -1468,6 +1468,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -1475,6 +1475,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
if (CraftEventFactory.callPlayerLeashEntityEvent(this, player, player, hand).isCancelled()) {
((ServerPlayer) player).resendItemInHands(); // SPIGOT-7615: Resend to fix client desync with used item
((ServerPlayer) player).connection.send(new ClientboundSetEntityLinkPacket(this, this.getLeashHolder()));

View File

@ -5,10 +5,10 @@ Subject: [PATCH] Fix silent equipment change for mobs
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index 66814adfb2cf92067702fc2695b083661cf859c0..bca70fff39409617e9c2b8ea66c1de4b9376d261 100644
index b04ee23f3d971d5a8cd275c9f91b4c2962889684..ca18f0e0fe93add84101a254cfc75e4fb3552367 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -1153,19 +1153,26 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -1160,19 +1160,26 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@Override
public void setItemSlot(EquipmentSlot slot, ItemStack stack) {