PlayerNaturallySpawnCreaturesEvent

This event can be used for when you want to exclude a certain player
from triggering monster spawns on a server.

Also a highly more effecient way to blanket block spawns in a world
This commit is contained in:
Aikar
2018-01-14 17:36:02 -05:00
parent b96c237fc4
commit f249b1f39a
3 changed files with 115 additions and 101 deletions

View File

@@ -250,7 +250,7 @@
}
void forEachSpawnCandidateChunk(Consumer<ChunkHolder> callback) {
@@ -1025,10 +1079,27 @@
@@ -1025,10 +1079,23 @@
}
public boolean anyPlayerCloseEnoughForSpawning(ChunkPos pos) {
@@ -270,25 +270,30 @@
+ }
+
+ private boolean anyPlayerCloseEnoughForSpawningInternal(ChunkPos chunkcoordintpair, boolean reducedRange) {
+ int chunkRange = this.level.spigotConfig.mobSpawnRange;
+ chunkRange = (chunkRange > this.level.spigotConfig.viewDistance) ? (byte) this.level.spigotConfig.viewDistance : chunkRange;
+ chunkRange = (chunkRange > 8) ? 8 : chunkRange;
+
+ double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D;
+ double blockRange; // Paper - use from event
+ // Spigot end
Iterator iterator = this.playerMap.getAllPlayers().iterator();
ServerPlayer entityplayer;
@@ -1039,7 +1110,7 @@
@@ -1039,7 +1106,16 @@
}
entityplayer = (ServerPlayer) iterator.next();
- } while (!this.playerIsCloseEnoughForSpawning(entityplayer, pos));
+ // Paper start - PlayerNaturallySpawnCreaturesEvent
+ com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event;
+ blockRange = 16384.0D;
+ if (reducedRange) {
+ event = entityplayer.playerNaturallySpawnedEvent;
+ if (event == null || event.isCancelled()) continue;
+ blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4));
+ }
+ // Paper end - PlayerNaturallySpawnCreaturesEvent
+ } while (!this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair, blockRange)); // Spigot
return true;
}
@@ -1056,7 +1127,7 @@
@@ -1056,7 +1132,7 @@
while (iterator.hasNext()) {
ServerPlayer entityplayer = (ServerPlayer) iterator.next();
@@ -297,7 +302,7 @@
builder.add(entityplayer);
}
}
@@ -1065,13 +1136,13 @@
@@ -1065,13 +1141,13 @@
}
}
@@ -315,7 +320,7 @@
}
}
@@ -1215,9 +1286,11 @@
@@ -1215,9 +1291,11 @@
}
public void addEntity(Entity entity) {
@@ -327,7 +332,7 @@
if (i != 0) {
int j = entitytypes.updateInterval();
@@ -1250,6 +1323,7 @@
@@ -1250,6 +1328,7 @@
}
protected void removeEntity(Entity entity) {
@@ -335,7 +340,7 @@
if (entity instanceof ServerPlayer entityplayer) {
this.updatePlayerStatus(entityplayer, false);
ObjectIterator objectiterator = this.entityMap.values().iterator();
@@ -1391,7 +1465,7 @@
@@ -1391,7 +1470,7 @@
});
}
@@ -344,7 +349,7 @@
protected ChunkDistanceManager(final Executor workerExecutor, final Executor mainThreadExecutor) {
super(workerExecutor, mainThreadExecutor);
@@ -1424,7 +1498,7 @@
@@ -1424,7 +1503,7 @@
public final Set<ServerPlayerConnection> seenBy = Sets.newIdentityHashSet();
public TrackedEntity(final Entity entity, final int i, final int j, final boolean flag) {
@@ -353,7 +358,7 @@
this.entity = entity;
this.range = i;
this.lastSectionPos = SectionPos.of((EntityAccess) entity);
@@ -1469,6 +1543,7 @@
@@ -1469,6 +1548,7 @@
}
public void removePlayer(ServerPlayer player) {
@@ -361,7 +366,7 @@
if (this.seenBy.remove(player.connection)) {
this.serverEntity.removePairing(player);
}
@@ -1476,6 +1551,7 @@
@@ -1476,6 +1556,7 @@
}
public void updatePlayer(ServerPlayer player) {
@@ -369,7 +374,7 @@
if (player != this.entity) {
Vec3 vec3d = player.position().subtract(this.entity.position());
int i = ChunkMap.this.getPlayerViewDistance(player);
@@ -1484,6 +1560,11 @@
@@ -1484,6 +1565,11 @@
double d2 = d0 * d0;
boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(player) && ChunkMap.this.isChunkTracked(player, this.entity.chunkPosition().x, this.entity.chunkPosition().z);