130 lines
6.6 KiB
Diff
130 lines
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 3aadcb472ab808ee981065ddfa86be6cbf38c8d9..c6298b12e4e0c20be20e7e493be728f028f9eb31 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
|
||
|
}
|
||
|
|
||
|
@@ -204,7 +204,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 {
|
||
|
@@ -218,7 +218,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)) {
|
||
|
@@ -237,10 +243,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");
|
||
|
}
|
||
|
|
||
|
@@ -262,9 +273,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
|
||
|
}
|