Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-16 03:20:07 +01:00
4104545b11
"It was from a different time before books were as jank as they are now. As time has gone on they've only proven to be worse and worse."
130 Zeilen
6.6 KiB
Diff
130 Zeilen
6.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
|
Date: Fri, 19 Apr 2019 12:41:13 -0500
|
|
Subject: [PATCH] Mob Spawner API Enhancements
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java
|
|
index 66ae43c40d4bad373b3a5269e8c78d7a3b3ac498..a87531f4669c7947e02764b5ceb098385ad99159 100644
|
|
--- a/src/main/java/net/minecraft/world/level/BaseSpawner.java
|
|
+++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java
|
|
@@ -31,7 +31,7 @@ public abstract class BaseSpawner {
|
|
|
|
private static final Logger LOGGER = LogManager.getLogger();
|
|
private static final int EVENT_SPAWN = 1;
|
|
- private static WeightedRandomList<SpawnData> EMPTY_POTENTIALS = WeightedRandomList.create();
|
|
+ public static WeightedRandomList<SpawnData> EMPTY_POTENTIALS = WeightedRandomList.create(); // Paper - private->public
|
|
public int spawnDelay = 20;
|
|
public WeightedRandomList<SpawnData> spawnPotentials;
|
|
public SpawnData nextSpawnData;
|
|
@@ -77,7 +77,7 @@ public abstract class BaseSpawner {
|
|
this.spawnPotentials = BaseSpawner.EMPTY_POTENTIALS; // CraftBukkit - SPIGOT-3496, MC-92282
|
|
}
|
|
|
|
- private boolean isNearPlayer(Level world, BlockPos pos) {
|
|
+ public boolean isNearPlayer(Level world, BlockPos pos) { // Paper private->public
|
|
return world.isAffectsSpawningPlayerNearby((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (double) this.requiredPlayerRange); // Paper
|
|
}
|
|
|
|
@@ -225,7 +225,7 @@ public abstract class BaseSpawner {
|
|
}
|
|
}
|
|
|
|
- private void delay(Level world, BlockPos pos) {
|
|
+ public void delay(Level world, BlockPos pos) { // Paper private->public
|
|
if (this.maxSpawnDelay <= this.minSpawnDelay) {
|
|
this.spawnDelay = this.minSpawnDelay;
|
|
} else {
|
|
@@ -239,7 +239,13 @@ public abstract class BaseSpawner {
|
|
}
|
|
|
|
public void load(@Nullable Level world, BlockPos pos, CompoundTag nbt) {
|
|
+ // Paper start - use larger int if set
|
|
+ if (nbt.contains("Paper.Delay")) {
|
|
+ this.spawnDelay = nbt.getInt("Paper.Delay");
|
|
+ } else {
|
|
this.spawnDelay = nbt.getShort("Delay");
|
|
+ }
|
|
+ // Paper end
|
|
List<SpawnData> list = Lists.newArrayList();
|
|
|
|
if (nbt.contains("SpawnPotentials", 9)) {
|
|
@@ -258,10 +264,15 @@ public abstract class BaseSpawner {
|
|
this.setSpawnData(world, pos, mobspawnerdata);
|
|
});
|
|
}
|
|
-
|
|
+ // Paper start - use ints if set
|
|
+ if (nbt.contains("Paper.MinSpawnDelay", 99)) {
|
|
+ this.minSpawnDelay = nbt.getInt("Paper.MinSpawnDelay");
|
|
+ this.maxSpawnDelay = nbt.getInt("Paper.MaxSpawnDelay");
|
|
+ this.spawnCount = nbt.getShort("SpawnCount");
|
|
+ } else // Paper end
|
|
if (nbt.contains("MinSpawnDelay", 99)) {
|
|
- this.minSpawnDelay = nbt.getShort("MinSpawnDelay");
|
|
- this.maxSpawnDelay = nbt.getShort("MaxSpawnDelay");
|
|
+ this.minSpawnDelay = nbt.getInt("MinSpawnDelay"); // Paper - short->int
|
|
+ this.maxSpawnDelay = nbt.getInt("MaxSpawnDelay"); // Paper - short->int
|
|
this.spawnCount = nbt.getShort("SpawnCount");
|
|
}
|
|
|
|
@@ -283,9 +294,20 @@ public abstract class BaseSpawner {
|
|
if (minecraftkey == null) {
|
|
return nbt;
|
|
} else {
|
|
- nbt.putShort("Delay", (short) this.spawnDelay);
|
|
- nbt.putShort("MinSpawnDelay", (short) this.minSpawnDelay);
|
|
- nbt.putShort("MaxSpawnDelay", (short) this.maxSpawnDelay);
|
|
+ // Paper start
|
|
+ if (spawnDelay > Short.MAX_VALUE) {
|
|
+ nbt.putInt("Paper.Delay", this.spawnDelay);
|
|
+ }
|
|
+ nbt.putShort("Delay", (short) Math.min(Short.MAX_VALUE, this.spawnDelay));
|
|
+
|
|
+ if (minSpawnDelay > Short.MAX_VALUE || maxSpawnDelay > Short.MAX_VALUE) {
|
|
+ nbt.putInt("Paper.MinSpawnDelay", this.minSpawnDelay);
|
|
+ nbt.putInt("Paper.MaxSpawnDelay", this.maxSpawnDelay);
|
|
+ }
|
|
+
|
|
+ nbt.putShort("MinSpawnDelay", (short) Math.min(Short.MAX_VALUE, this.minSpawnDelay));
|
|
+ nbt.putShort("MaxSpawnDelay", (short) Math.min(Short.MAX_VALUE, this.maxSpawnDelay));
|
|
+ // Paper end
|
|
nbt.putShort("SpawnCount", (short) this.spawnCount);
|
|
nbt.putShort("MaxNearbyEntities", (short) this.maxNearbyEntities);
|
|
nbt.putShort("RequiredPlayerRange", (short) this.requiredPlayerRange);
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java
|
|
index ff8eba31e6169b5a1debe47f17a40e6d0be67897..75575b24aa0291c26d65de9787bc9d2f88c867e4 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java
|
|
@@ -121,4 +121,30 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<SpawnerBlockEnti
|
|
public void setSpawnRange(int spawnRange) {
|
|
this.getSnapshot().getSpawner().spawnRange = spawnRange;
|
|
}
|
|
+
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public boolean isActivated() {
|
|
+ return this.getSnapshot().getSpawner().isNearPlayer(world.getHandle(), getPosition());
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void resetTimer() {
|
|
+ this.getSnapshot().getSpawner().delay(world.getHandle(), getPosition());
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setSpawnedItem(org.bukkit.inventory.ItemStack itemStack) {
|
|
+ Preconditions.checkArgument(itemStack != null && !itemStack.getType().isAir(), "spawners cannot spawn air");
|
|
+ net.minecraft.world.item.ItemStack item = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(itemStack);
|
|
+ net.minecraft.nbt.CompoundTag compound = new net.minecraft.nbt.CompoundTag();
|
|
+ net.minecraft.nbt.CompoundTag entity = new net.minecraft.nbt.CompoundTag();
|
|
+ entity.putString("id", net.minecraft.core.Registry.ENTITY_TYPE.getKey(net.minecraft.world.entity.EntityType.ITEM).toString());
|
|
+ entity.put("Item", item.save(new net.minecraft.nbt.CompoundTag()));
|
|
+ compound.put("Entity", entity);
|
|
+ compound.putInt("Weight", this.getSnapshotNBT().contains("Weight", org.bukkit.craftbukkit.util.CraftMagicNumbers.NBT.TAG_ANY_NUMBER) ? this.getSnapshotNBT().getInt("Weight") : 1);
|
|
+ this.getSnapshot().getSpawner().setSpawnData(world.getHandle(), getPosition(), new net.minecraft.world.level.SpawnData(compound));
|
|
+ this.getSnapshot().getSpawner().spawnPotentials= net.minecraft.world.level.BaseSpawner.EMPTY_POTENTIALS;
|
|
+ }
|
|
+ // Paper end
|
|
}
|