1.21.5
Co-authored-by: Bjarne Koll <git@lynxplay.dev> Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com> Co-authored-by: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Co-authored-by: MiniDigger | Martin <admin@minidigger.dev> Co-authored-by: Nassim Jahnke <nassim@njahnke.dev> Co-authored-by: Noah van der Aa <ndvdaa@gmail.com> Co-authored-by: Owen1212055 <23108066+Owen1212055@users.noreply.github.com> Co-authored-by: Shane Freeder <theboyetronic@gmail.com> Co-authored-by: Spottedleaf <Spottedleaf@users.noreply.github.com> Co-authored-by: Tamion <70228790+notTamion@users.noreply.github.com> Co-authored-by: Warrior <50800980+Warriorrrr@users.noreply.github.com>
This commit is contained in:
@@ -1,86 +1,62 @@
|
||||
--- a/net/minecraft/world/level/levelgen/PatrolSpawner.java
|
||||
+++ b/net/minecraft/world/level/levelgen/PatrolSpawner.java
|
||||
@@ -20,28 +_,66 @@
|
||||
@@ -20,18 +_,47 @@
|
||||
|
||||
@Override
|
||||
public int tick(ServerLevel level, boolean spawnEnemies, boolean spawnFriendlies) {
|
||||
+ if (level.paperConfig().entities.behavior.pillagerPatrols.disable || level.paperConfig().entities.behavior.pillagerPatrols.spawnChance == 0) return 0; // Paper - Add option to disable pillager patrols & Pillager patrol spawn settings and per player options
|
||||
if (!spawnEnemies) {
|
||||
return 0;
|
||||
} else if (!level.getGameRules().getBoolean(GameRules.RULE_DO_PATROL_SPAWNING)) {
|
||||
return 0;
|
||||
} else {
|
||||
RandomSource randomSource = level.random;
|
||||
- this.nextTick--;
|
||||
- if (this.nextTick > 0) {
|
||||
- return 0;
|
||||
- } else {
|
||||
- this.nextTick = this.nextTick + 12000 + randomSource.nextInt(1200);
|
||||
- long l = level.getDayTime() / 24000L;
|
||||
- if (l < 5L || !level.isDay()) {
|
||||
- return 0;
|
||||
- } else if (randomSource.nextInt(5) != 0) {
|
||||
- return 0;
|
||||
- } else {
|
||||
- int size = level.players().size();
|
||||
+ // this.nextTick--;
|
||||
+ // if (this.nextTick > 0) {
|
||||
+ // return 0;
|
||||
+ // } else {
|
||||
+ // this.nextTick = this.nextTick + 12000 + randomSource.nextInt(1200);
|
||||
+ // long l = level.getDayTime() / 24000L;
|
||||
+ // if (l < 5L || !level.isDay()) {
|
||||
+ // return 0;
|
||||
+ // } else if (randomSource.nextInt(5) != 0) {
|
||||
+ // Paper start - Pillager patrol spawn settings and per player options
|
||||
+ // Random player selection moved up for per player spawning and configuration
|
||||
+ int size = level.players().size();
|
||||
+ if (size < 1) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ net.minecraft.server.level.ServerPlayer player = level.players().get(randomSource.nextInt(size));
|
||||
+ if (player.isSpectator()) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ int patrolSpawnDelay;
|
||||
+ if (level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) {
|
||||
+ --player.patrolSpawnDelay;
|
||||
+ patrolSpawnDelay = player.patrolSpawnDelay;
|
||||
+ } else {
|
||||
+ this.nextTick--;
|
||||
+ patrolSpawnDelay = this.nextTick;
|
||||
+ }
|
||||
+ if (patrolSpawnDelay > 0) {
|
||||
+ return 0;
|
||||
+ } else {
|
||||
+ long days;
|
||||
+ if (level.paperConfig().entities.behavior.pillagerPatrols.start.perPlayer) {
|
||||
+ days = player.getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.PLAY_TIME)) / 24000L; // PLAY_TIME is counting in ticks
|
||||
+ } else {
|
||||
+ days = level.getDayTime() / 24000L;
|
||||
public void tick(ServerLevel level, boolean spawnEnemies, boolean spawnFriendlies) {
|
||||
+ if (level.paperConfig().entities.behavior.pillagerPatrols.disable || level.paperConfig().entities.behavior.pillagerPatrols.spawnChance == 0) return; // Paper - Add option to disable pillager patrols & Pillager patrol spawn settings and per player options
|
||||
if (spawnEnemies) {
|
||||
if (level.getGameRules().getBoolean(GameRules.RULE_DO_PATROL_SPAWNING)) {
|
||||
RandomSource randomSource = level.random;
|
||||
- this.nextTick--;
|
||||
- if (this.nextTick <= 0) {
|
||||
- this.nextTick = this.nextTick + 12000 + randomSource.nextInt(1200);
|
||||
- long l = level.getDayTime() / 24000L;
|
||||
- if (l >= 5L && level.isBrightOutside()) {
|
||||
- if (randomSource.nextInt(5) == 0) {
|
||||
- int size = level.players().size();
|
||||
+ // this.nextTick--;
|
||||
+ // Paper start - Pillager patrol spawn settings and per player options
|
||||
+ int size = level.players().size();
|
||||
+ if (size < 1) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ net.minecraft.server.level.ServerPlayer player = level.players().get(randomSource.nextInt(size));
|
||||
+ if (player.isSpectator()) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ int patrolSpawnDelay;
|
||||
+ if (level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) {
|
||||
+ player.patrolSpawnDelay += level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.ticks + randomSource.nextInt(1200);
|
||||
+ --player.patrolSpawnDelay;
|
||||
+ patrolSpawnDelay = player.patrolSpawnDelay;
|
||||
+ } else {
|
||||
+ this.nextTick += level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.ticks + randomSource.nextInt(1200);
|
||||
+ this.nextTick--;
|
||||
+ patrolSpawnDelay = this.nextTick;
|
||||
+ }
|
||||
+ if (patrolSpawnDelay <= 0) {
|
||||
+ long days;
|
||||
+ if (level.paperConfig().entities.behavior.pillagerPatrols.start.perPlayer) {
|
||||
+ days = player.getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.PLAY_TIME)) / 24000L; // PLAY_TIME is counting in ticks
|
||||
+ } else {
|
||||
+ days = level.getDayTime() / 24000L;
|
||||
+ }
|
||||
+ if (level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) {
|
||||
+ player.patrolSpawnDelay += level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.ticks + randomSource.nextInt(1200);
|
||||
+ } else {
|
||||
+ this.nextTick += level.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.ticks + randomSource.nextInt(1200);
|
||||
+ }
|
||||
+
|
||||
+ if (days < level.paperConfig().entities.behavior.pillagerPatrols.start.day || !level.isDay()) {
|
||||
+ return 0;
|
||||
+ } else if (randomSource.nextDouble() >= level.paperConfig().entities.behavior.pillagerPatrols.spawnChance) {
|
||||
+ // Paper end - Pillager patrol spawn settings and per player options
|
||||
+ return 0;
|
||||
+ } else {
|
||||
if (size < 1) {
|
||||
return 0;
|
||||
} else {
|
||||
- Player player = level.players().get(randomSource.nextInt(size));
|
||||
if (player.isSpectator()) {
|
||||
return 0;
|
||||
} else if (level.isCloseToVillage(player.blockPosition(), 2)) {
|
||||
@@ -104,7 +_,7 @@
|
||||
+ if (days >= level.paperConfig().entities.behavior.pillagerPatrols.start.day && level.isBrightOutside()) {
|
||||
+ if (randomSource.nextDouble() < level.paperConfig().entities.behavior.pillagerPatrols.spawnChance) {
|
||||
+ // Paper end - Pillager patrol spawn settings and per player options
|
||||
if (size >= 1) {
|
||||
- Player player = level.players().get(randomSource.nextInt(size));
|
||||
if (!player.isSpectator()) {
|
||||
if (!level.isCloseToVillage(player.blockPosition(), 2)) {
|
||||
int i = (24 + randomSource.nextInt(24)) * (randomSource.nextBoolean() ? -1 : 1);
|
||||
@@ -88,7 +_,7 @@
|
||||
|
||||
patrollingMonster.setPos(pos.getX(), pos.getY(), pos.getZ());
|
||||
patrollingMonster.finalizeSpawn(level, level.getCurrentDifficultyAt(pos), EntitySpawnReason.PATROL, null);
|
||||
|
||||
@@ -1,67 +1,52 @@
|
||||
--- a/net/minecraft/world/level/levelgen/PhantomSpawner.java
|
||||
+++ b/net/minecraft/world/level/levelgen/PhantomSpawner.java
|
||||
@@ -28,19 +_,28 @@
|
||||
} else if (!level.getGameRules().getBoolean(GameRules.RULE_DOINSOMNIA)) {
|
||||
return 0;
|
||||
} else {
|
||||
+ // Paper start - Ability to control player's insomnia and phantoms
|
||||
+ if (level.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds <= 0) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+ // Paper end - Ability to control player's insomnia and phantoms
|
||||
RandomSource randomSource = level.random;
|
||||
this.nextTick--;
|
||||
if (this.nextTick > 0) {
|
||||
return 0;
|
||||
} else {
|
||||
- this.nextTick = this.nextTick + (60 + randomSource.nextInt(60)) * 20;
|
||||
@@ -25,13 +_,22 @@
|
||||
public void tick(ServerLevel level, boolean spawnEnemies, boolean spawnFriendlies) {
|
||||
if (spawnEnemies) {
|
||||
if (level.getGameRules().getBoolean(GameRules.RULE_DOINSOMNIA)) {
|
||||
+ // Paper start - Ability to control player's insomnia and phantoms
|
||||
+ int spawnAttemptMinSeconds = level.paperConfig().entities.behavior.phantomsSpawnAttemptMinSeconds;
|
||||
+ int spawnAttemptMaxSeconds = level.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds;
|
||||
+ this.nextTick += (spawnAttemptMinSeconds + randomSource.nextInt(spawnAttemptMaxSeconds - spawnAttemptMinSeconds + 1)) * 20;
|
||||
+ if (level.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds <= 0) {
|
||||
+ return;
|
||||
+ }
|
||||
+ // Paper end - Ability to control player's insomnia and phantoms
|
||||
if (level.getSkyDarken() < 5 && level.dimensionType().hasSkyLight()) {
|
||||
return 0;
|
||||
} else {
|
||||
int i = 0;
|
||||
RandomSource randomSource = level.random;
|
||||
this.nextTick--;
|
||||
if (this.nextTick <= 0) {
|
||||
- this.nextTick = this.nextTick + (60 + randomSource.nextInt(60)) * 20;
|
||||
+ // Paper start - Ability to control player's insomnia and phantoms
|
||||
+ int spawnAttemptMinSeconds = level.paperConfig().entities.behavior.phantomsSpawnAttemptMinSeconds;
|
||||
+ int spawnAttemptMaxSeconds = level.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds;
|
||||
+ this.nextTick += (spawnAttemptMinSeconds + randomSource.nextInt(spawnAttemptMaxSeconds - spawnAttemptMinSeconds + 1)) * 20;
|
||||
+ // Paper end - Ability to control player's insomnia and phantoms
|
||||
if (level.getSkyDarken() >= 5 || !level.dimensionType().hasSkyLight()) {
|
||||
for (ServerPlayer serverPlayer : level.players()) {
|
||||
- if (!serverPlayer.isSpectator()) {
|
||||
+ if (!serverPlayer.isSpectator() && (!level.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !serverPlayer.isCreative())) { // Paper - Add phantom creative and insomniac controls
|
||||
BlockPos blockPos = serverPlayer.blockPosition();
|
||||
if (!level.dimensionType().hasSkyLight() || blockPos.getY() >= level.getSeaLevel() && level.canSeeSky(blockPos)) {
|
||||
DifficultyInstance currentDifficultyAt = level.getCurrentDifficultyAt(blockPos);
|
||||
@@ -50,13 +_,23 @@
|
||||
int i2 = 1 + randomSource.nextInt(currentDifficultyAt.getDifficulty().getId() + 1);
|
||||
|
||||
for (ServerPlayer serverPlayer : level.players()) {
|
||||
- if (!serverPlayer.isSpectator()) {
|
||||
+ if (!serverPlayer.isSpectator() && (!level.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !serverPlayer.isCreative())) { // Paper - Add phantom creative and insomniac controls
|
||||
BlockPos blockPos = serverPlayer.blockPosition();
|
||||
if (!level.dimensionType().hasSkyLight() || blockPos.getY() >= level.getSeaLevel() && level.canSeeSky(blockPos)) {
|
||||
DifficultyInstance currentDifficultyAt = level.getCurrentDifficultyAt(blockPos);
|
||||
@@ -48,7 +_,7 @@
|
||||
ServerStatsCounter stats = serverPlayer.getStats();
|
||||
int i1 = Mth.clamp(stats.getValue(Stats.CUSTOM.get(Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE);
|
||||
int i2 = 24000;
|
||||
- if (randomSource.nextInt(i1) >= 72000) {
|
||||
+ if (randomSource.nextInt(i1) >= level.paperConfig().entities.behavior.playerInsomniaStartTicks) { // Paper - Ability to control player's insomnia and phantoms
|
||||
BlockPos blockPos1 = blockPos.above(20 + randomSource.nextInt(15))
|
||||
.east(-10 + randomSource.nextInt(21))
|
||||
.south(-10 + randomSource.nextInt(21));
|
||||
@@ -59,13 +_,23 @@
|
||||
int i3 = 1 + randomSource.nextInt(currentDifficultyAt.getDifficulty().getId() + 1);
|
||||
|
||||
for (int i4 = 0; i4 < i3; i4++) {
|
||||
+ // Paper start - PhantomPreSpawnEvent
|
||||
+ com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent event = new com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent(io.papermc.paper.util.MCUtil.toLocation(level, blockPos1), serverPlayer.getBukkitEntity(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL);
|
||||
+ if (!event.callEvent()) {
|
||||
+ if (event.shouldAbortSpawn()) {
|
||||
+ break;
|
||||
for (int i3 = 0; i3 < i2; i3++) {
|
||||
+ // Paper start - PhantomPreSpawnEvent
|
||||
+ com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent event = new com.destroystokyo.paper.event.entity.PhantomPreSpawnEvent(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(blockPos1, level), serverPlayer.getBukkitEntity(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL);
|
||||
+ if (!event.callEvent()) {
|
||||
+ if (event.shouldAbortSpawn()) {
|
||||
+ break;
|
||||
+ }
|
||||
+ continue;
|
||||
+ }
|
||||
+ continue;
|
||||
+ }
|
||||
+ // Paper end - PhantomPreSpawnEvent
|
||||
Phantom phantom = EntityType.PHANTOM.create(level, EntitySpawnReason.NATURAL);
|
||||
if (phantom != null) {
|
||||
+ phantom.spawningEntity = serverPlayer.getUUID(); // Paper - PhantomPreSpawnEvent
|
||||
phantom.moveTo(blockPos1, 0.0F, 0.0F);
|
||||
spawnGroupData = phantom.finalizeSpawn(
|
||||
level, currentDifficultyAt, EntitySpawnReason.NATURAL, spawnGroupData
|
||||
);
|
||||
- level.addFreshEntityWithPassengers(phantom);
|
||||
+ level.addFreshEntityWithPassengers(phantom, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL); // CraftBukkit
|
||||
i++;
|
||||
+ // Paper end - PhantomPreSpawnEvent
|
||||
Phantom phantom = EntityType.PHANTOM.create(level, EntitySpawnReason.NATURAL);
|
||||
if (phantom != null) {
|
||||
+ phantom.spawningEntity = serverPlayer.getUUID(); // Paper - PhantomPreSpawnEvent
|
||||
phantom.snapTo(blockPos1, 0.0F, 0.0F);
|
||||
spawnGroupData = phantom.finalizeSpawn(
|
||||
level, currentDifficultyAt, EntitySpawnReason.NATURAL, spawnGroupData
|
||||
);
|
||||
- level.addFreshEntityWithPassengers(phantom);
|
||||
+ level.addFreshEntityWithPassengers(phantom, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.PATROL); // CraftBukkit
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
public WorldGenerationContext(ChunkGenerator generator, LevelHeightAccessor level) {
|
||||
+ this(generator, level, null);
|
||||
+ }
|
||||
+ public WorldGenerationContext(ChunkGenerator generator, LevelHeightAccessor level, net.minecraft.world.level.Level serverLevel) {
|
||||
+ public WorldGenerationContext(ChunkGenerator generator, LevelHeightAccessor level, @javax.annotation.Nullable net.minecraft.world.level.Level serverLevel) {
|
||||
+ this.serverLevel = serverLevel;
|
||||
+ // Paper end - Flat bedrock generator settings
|
||||
this.minY = Math.max(level.getMinY(), generator.getMinY());
|
||||
|
||||
@@ -1,33 +1,32 @@
|
||||
--- a/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java
|
||||
+++ b/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java
|
||||
@@ -19,6 +_,12 @@
|
||||
@@ -19,6 +_,13 @@
|
||||
}
|
||||
|
||||
public static void createEndPlatform(ServerLevelAccessor level, BlockPos pos, boolean dropBlocks) {
|
||||
+ // CraftBukkit start
|
||||
+ createEndPlatform(level, pos, dropBlocks, null);
|
||||
+ }
|
||||
+ public static void createEndPlatform(ServerLevelAccessor level, BlockPos pos, boolean dropBlocks, net.minecraft.world.entity.Entity entity) {
|
||||
+
|
||||
+ public static void createEndPlatform(ServerLevelAccessor level, BlockPos pos, boolean dropBlocks, @javax.annotation.Nullable net.minecraft.world.entity.Entity entity) {
|
||||
+ org.bukkit.craftbukkit.util.BlockStateListPopulator blockList = new org.bukkit.craftbukkit.util.BlockStateListPopulator(level);
|
||||
+ // CraftBukkit end
|
||||
BlockPos.MutableBlockPos mutableBlockPos = pos.mutable();
|
||||
|
||||
for (int i = -2; i <= 2; i++) {
|
||||
@@ -26,15 +_,33 @@
|
||||
@@ -26,15 +_,31 @@
|
||||
for (int i2 = -1; i2 < 3; i2++) {
|
||||
BlockPos blockPos = mutableBlockPos.set(pos).move(i1, i2, i);
|
||||
Block block = i2 == -1 ? Blocks.OBSIDIAN : Blocks.AIR;
|
||||
- if (!level.getBlockState(blockPos).is(block)) {
|
||||
+ // CraftBukkit start
|
||||
+ if (!blockList.getBlockState(blockPos).is(block)) {
|
||||
+ if (!blockList.getBlockState(blockPos).is(block)) { // CraftBukkit
|
||||
if (dropBlocks) {
|
||||
- level.destroyBlock(blockPos, true, null);
|
||||
+ blockList.destroyBlock(blockPos, true, null);
|
||||
+ blockList.destroyBlock(blockPos, true, null); // CraftBukkit
|
||||
}
|
||||
|
||||
- level.setBlock(blockPos, block.defaultBlockState(), 3);
|
||||
+ blockList.setBlock(blockPos, block.defaultBlockState(), 3);
|
||||
+ // CraftBukkit end
|
||||
+ blockList.setBlock(blockPos, block.defaultBlockState(), 3); // CraftBukkit
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -37,16 +36,16 @@
|
||||
+ // SPIGOT-7746: Entity will only be null during world generation, which is async, so just generate without event
|
||||
+ if (entity != null) {
|
||||
+ org.bukkit.World bworld = level.getLevel().getWorld();
|
||||
+ org.bukkit.event.world.PortalCreateEvent portalEvent = new org.bukkit.event.world.PortalCreateEvent((java.util.List<org.bukkit.block.BlockState>) (java.util.List) blockList.getList(), bworld, entity.getBukkitEntity(), org.bukkit.event.world.PortalCreateEvent.CreateReason.END_PLATFORM);
|
||||
+ org.bukkit.event.world.PortalCreateEvent portalEvent = new org.bukkit.event.world.PortalCreateEvent((java.util.List<org.bukkit.block.BlockState>) (java.util.List) blockList.getSnapshotBlocks(), bworld, entity.getBukkitEntity(), org.bukkit.event.world.PortalCreateEvent.CreateReason.END_PLATFORM);
|
||||
+ level.getLevel().getCraftServer().getPluginManager().callEvent(portalEvent);
|
||||
+ if (portalEvent.isCancelled()) return;
|
||||
+ }
|
||||
+
|
||||
+ // SPIGOT-7856: End platform not dropping items after replacing blocks
|
||||
+ if (dropBlocks) {
|
||||
+ blockList.getList().forEach((state) -> level.destroyBlock(state.getPosition(), true, null));
|
||||
+ blockList.placeBlocks(state -> level.destroyBlock(state.getPosition(), true, null));
|
||||
+ } else {
|
||||
+ blockList.placeBlocks();
|
||||
+ }
|
||||
+ blockList.updateList();
|
||||
+ // CraftBukkit end
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@@ -113,6 +_,7 @@
|
||||
endCrystal.setBeamTarget(config.getCrystalBeamTarget());
|
||||
endCrystal.setInvulnerable(config.isCrystalInvulnerable());
|
||||
endCrystal.moveTo(spike.getCenterX() + 0.5, spike.getHeight() + 1, spike.getCenterZ() + 0.5, random.nextFloat() * 360.0F, 0.0F);
|
||||
endCrystal.snapTo(spike.getCenterX() + 0.5, spike.getHeight() + 1, spike.getCenterZ() + 0.5, random.nextFloat() * 360.0F, 0.0F);
|
||||
+ endCrystal.generatedByDragonFight = true; // Paper - Fix invulnerable end crystals
|
||||
level.addFreshEntity(endCrystal);
|
||||
BlockPos blockPosx = endCrystal.blockPosition();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/LegacyStructureDataHandler.java
|
||||
@@ -217,17 +_,17 @@
|
||||
@@ -221,17 +_,17 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/StructureCheck.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/StructureCheck.java
|
||||
@@ -40,7 +_,7 @@
|
||||
@@ -41,7 +_,7 @@
|
||||
private final ChunkScanAccess storageAccess;
|
||||
private final RegistryAccess registryAccess;
|
||||
private final StructureTemplateManager structureTemplateManager;
|
||||
@@ -9,7 +9,7 @@
|
||||
private final ChunkGenerator chunkGenerator;
|
||||
private final RandomState randomState;
|
||||
private final LevelHeightAccessor heightAccessor;
|
||||
@@ -54,7 +_,7 @@
|
||||
@@ -55,7 +_,7 @@
|
||||
ChunkScanAccess storageAccess,
|
||||
RegistryAccess registryAccess,
|
||||
StructureTemplateManager structureTemplateManager,
|
||||
@@ -18,7 +18,7 @@
|
||||
ChunkGenerator chunkGenerator,
|
||||
RandomState randomState,
|
||||
LevelHeightAccessor heightAccessor,
|
||||
@@ -74,6 +_,20 @@
|
||||
@@ -75,6 +_,20 @@
|
||||
this.fixerUpper = fixerUpper;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
public StructureCheckResult checkStart(ChunkPos chunkPos, Structure structure, StructurePlacement placement, boolean skipKnownStructures) {
|
||||
long packedChunkPos = chunkPos.toLong();
|
||||
Object2IntMap<Structure> map = this.loadedChunks.get(packedChunkPos);
|
||||
@@ -83,7 +_,7 @@
|
||||
@@ -84,7 +_,7 @@
|
||||
StructureCheckResult structureCheckResult = this.tryLoadFromStorage(chunkPos, structure, skipKnownStructures, packedChunkPos);
|
||||
if (structureCheckResult != null) {
|
||||
return structureCheckResult;
|
||||
|
||||
@@ -1,35 +1,27 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/StructurePiece.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/StructurePiece.java
|
||||
@@ -47,7 +_,7 @@
|
||||
private Rotation rotation;
|
||||
protected int genDepth;
|
||||
private final StructurePieceType type;
|
||||
- private static final Set<Block> SHAPE_CHECK_BLOCKS = ImmutableSet.<Block>builder()
|
||||
+ public static final Set<Block> SHAPE_CHECK_BLOCKS = ImmutableSet.<Block>builder() // PAIL private -> public
|
||||
.add(Blocks.NETHER_BRICK_FENCE)
|
||||
.add(Blocks.TORCH)
|
||||
.add(Blocks.WALL_TORCH)
|
||||
@@ -189,6 +_,11 @@
|
||||
@@ -181,6 +_,11 @@
|
||||
}
|
||||
|
||||
level.setBlock(worldPos, blockstate, 2);
|
||||
+ // CraftBukkit start - fluid handling is already done if we have a transformer generator access
|
||||
+ if (level instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess) {
|
||||
+ if (level instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess && transformerAccess.canTransformBlocks()) {
|
||||
+ return;
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
FluidState fluidState = level.getFluidState(worldPos);
|
||||
if (!fluidState.isEmpty()) {
|
||||
level.scheduleTick(worldPos, fluidState.getType(), 0);
|
||||
@@ -201,6 +_,38 @@
|
||||
@@ -193,6 +_,39 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ // CraftBukkit start
|
||||
+ protected boolean placeCraftBlockEntity(ServerLevelAccessor levelAccessor, BlockPos pos, org.bukkit.craftbukkit.block.CraftBlockEntityState<?> craftBlockEntityState, int flags) {
|
||||
+ if (levelAccessor instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess) {
|
||||
+ if (levelAccessor instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess && transformerAccess.canTransformBlocks()) {
|
||||
+ return transformerAccess.setCraftBlock(pos, craftBlockEntityState, flags);
|
||||
+ }
|
||||
+
|
||||
+ boolean result = levelAccessor.setBlock(pos, craftBlockEntityState.getHandle(), flags);
|
||||
+ BlockEntity blockEntity = levelAccessor.getBlockEntity(pos);
|
||||
+ if (blockEntity != null) {
|
||||
@@ -50,7 +42,7 @@
|
||||
+ net.minecraft.world.level.block.entity.BlockEntity blockEntity = levelAccessor.getBlockEntity(pos);
|
||||
+ if (blockEntity instanceof net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity lootContainerBlockEntity) {
|
||||
+ lootContainerBlockEntity.setLootTable(lootTable, randomSource.nextLong());
|
||||
+ if (levelAccessor instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess) {
|
||||
+ if (levelAccessor instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess && transformerAccess.canTransformBlocks()) {
|
||||
+ transformerAccess.setCraftBlock(pos, (org.bukkit.craftbukkit.block.CraftBlockState) org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(levelAccessor, pos, blockEntity.getBlockState(), lootContainerBlockEntity.saveWithFullMetadata(levelAccessor.registryAccess())), 3);
|
||||
+ }
|
||||
+ }
|
||||
@@ -60,7 +52,7 @@
|
||||
protected boolean canBeReplaced(LevelReader level, int x, int y, int z, BoundingBox box) {
|
||||
return true;
|
||||
}
|
||||
@@ -429,11 +_,17 @@
|
||||
@@ -421,11 +_,17 @@
|
||||
state = reorient(level, pos, Blocks.CHEST.defaultBlockState());
|
||||
}
|
||||
|
||||
@@ -83,7 +75,7 @@
|
||||
|
||||
return true;
|
||||
} else {
|
||||
@@ -446,11 +_,28 @@
|
||||
@@ -438,11 +_,28 @@
|
||||
) {
|
||||
BlockPos worldPos = this.getWorldPos(x, y, z);
|
||||
if (box.isInside(worldPos) && !level.getBlockState(worldPos).is(Blocks.DISPENSER)) {
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
+ List<StructurePiece> pieces = list.stream().filter(piece -> piece.getBoundingBox().intersects(box)).toList();
|
||||
+ if (!pieces.isEmpty()) {
|
||||
+ org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess = new org.bukkit.craftbukkit.util.TransformerGeneratorAccess();
|
||||
+ transformerAccess.setHandle(level);
|
||||
+ transformerAccess.setDelegate(level);
|
||||
+ transformerAccess.setStructureTransformer(new org.bukkit.craftbukkit.util.CraftStructureTransformer(this.generationEventCause, level, structureManager, this.structure, box, chunkPos));
|
||||
+ for (StructurePiece piece : pieces) {
|
||||
+ piece.postProcess(transformerAccess, structureManager, generator, random, box, chunkPos, blockPos);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java
|
||||
@@ -79,14 +_,30 @@
|
||||
@@ -79,14 +_,31 @@
|
||||
return this.exclusionZone;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
+ // Paper start - Add missing structure set seed configs
|
||||
+ return this.isStructureChunk(structureState, x, z, null);
|
||||
+ }
|
||||
+ public boolean isStructureChunk(ChunkGeneratorStructureState structureState, int x, int z, @org.jetbrains.annotations.Nullable net.minecraft.resources.ResourceKey<StructureSet> structureSetKey) {
|
||||
+
|
||||
+ public boolean isStructureChunk(ChunkGeneratorStructureState structureState, int x, int z, @javax.annotation.Nullable net.minecraft.resources.ResourceKey<StructureSet> structureSetKey) {
|
||||
+ Integer saltOverride = null;
|
||||
+ if (structureSetKey != null) {
|
||||
+ if (structureSetKey == net.minecraft.world.level.levelgen.structure.BuiltinStructureSets.MINESHAFTS) {
|
||||
@@ -28,7 +29,7 @@
|
||||
- public boolean applyAdditionalChunkRestrictions(int regionX, int regionZ, long levelSeed) {
|
||||
- return !(this.frequency < 1.0F) || this.frequencyReductionMethod.shouldGenerate(levelSeed, this.salt, regionX, regionZ, this.frequency);
|
||||
+ // Paper start - Add missing structure set seed configs
|
||||
+ public boolean applyAdditionalChunkRestrictions(int regionX, int regionZ, long levelSeed, @org.jetbrains.annotations.Nullable Integer saltOverride) {
|
||||
+ public boolean applyAdditionalChunkRestrictions(int regionX, int regionZ, long levelSeed, @javax.annotation.Nullable Integer saltOverride) {
|
||||
+ return !(this.frequency < 1.0F) || this.frequencyReductionMethod.shouldGenerate(levelSeed, this.salt, regionX, regionZ, this.frequency, saltOverride);
|
||||
+ // Paper end - Add missing structure set seed configs
|
||||
}
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/structures/DesertPyramidStructure.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/structures/DesertPyramidStructure.java
|
||||
@@ -65,6 +_,15 @@
|
||||
@@ -65,6 +_,16 @@
|
||||
|
||||
private static void placeSuspiciousSand(BoundingBox boundingBox, WorldGenLevel worldGenLevel, BlockPos pos) {
|
||||
if (boundingBox.isInside(pos)) {
|
||||
+ // CraftBukkit start
|
||||
+ if (worldGenLevel instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess) {
|
||||
+ if (worldGenLevel instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess && transformerAccess.canTransformBlocks()) {
|
||||
+ // todo never called cause it's called in afterPlace after the whole capture logic
|
||||
+ org.bukkit.craftbukkit.block.CraftBrushableBlock brushableState = (org.bukkit.craftbukkit.block.CraftBrushableBlock) org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(worldGenLevel, pos, Blocks.SUSPICIOUS_SAND.defaultBlockState(), null);
|
||||
+ brushableState.setLootTable(org.bukkit.craftbukkit.CraftLootTable.minecraftToBukkit(BuiltInLootTables.DESERT_PYRAMID_ARCHAEOLOGY));
|
||||
+ brushableState.setSeed(pos.asLong());
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/structures/MineshaftPieces.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/structures/MineshaftPieces.java
|
||||
@@ -401,10 +_,13 @@
|
||||
@@ -397,10 +_,13 @@
|
||||
BlockPos worldPos = this.getWorldPos(1, 0, i8);
|
||||
if (box.isInside(worldPos) && this.isInterior(level, 1, 0, i8, box)) {
|
||||
this.hasPlacedSpider = true;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/structures/NetherFortressPieces.java
|
||||
@@ -1265,10 +_,13 @@
|
||||
@@ -1076,10 +_,13 @@
|
||||
BlockPos worldPos = this.getWorldPos(3, 5, 5);
|
||||
if (box.isInside(worldPos)) {
|
||||
this.hasPlacedSpawner = true;
|
||||
|
||||
@@ -1,21 +1,17 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/structures/OceanRuinPieces.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/structures/OceanRuinPieces.java
|
||||
@@ -314,14 +_,20 @@
|
||||
@@ -314,12 +_,18 @@
|
||||
@Override
|
||||
protected void handleDataMarker(String name, BlockPos pos, ServerLevelAccessor level, RandomSource random, BoundingBox box) {
|
||||
if ("chest".equals(name)) {
|
||||
- level.setBlock(
|
||||
- pos, Blocks.CHEST.defaultBlockState().setValue(ChestBlock.WATERLOGGED, Boolean.valueOf(level.getFluidState(pos).is(FluidTags.WATER))), 2
|
||||
- );
|
||||
- level.setBlock(pos, Blocks.CHEST.defaultBlockState().setValue(ChestBlock.WATERLOGGED, level.getFluidState(pos).is(FluidTags.WATER)), 2);
|
||||
- BlockEntity blockEntity = level.getBlockEntity(pos);
|
||||
- if (blockEntity instanceof ChestBlockEntity) {
|
||||
- ((ChestBlockEntity)blockEntity)
|
||||
- .setLootTable(this.isLarge ? BuiltInLootTables.UNDERWATER_RUIN_BIG : BuiltInLootTables.UNDERWATER_RUIN_SMALL, random.nextLong());
|
||||
- }
|
||||
+ // CraftBukkit start - transform block to ensure loot table is accessible
|
||||
+ // level.setBlock(
|
||||
+ // pos, Blocks.CHEST.defaultBlockState().setValue(ChestBlock.WATERLOGGED, Boolean.valueOf(level.getFluidState(pos).is(FluidTags.WATER))), 2
|
||||
+ // );
|
||||
+ // level.setBlock(pos, Blocks.CHEST.defaultBlockState().setValue(ChestBlock.WATERLOGGED, level.getFluidState(pos).is(FluidTags.WATER)), 2);
|
||||
+ // BlockEntity blockEntity = level.getBlockEntity(pos);
|
||||
+ // if (blockEntity instanceof ChestBlockEntity) {
|
||||
+ // ((ChestBlockEntity)blockEntity)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/structures/ShipwreckPieces.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/structures/ShipwreckPieces.java
|
||||
@@ -121,7 +_,10 @@
|
||||
@@ -126,7 +_,10 @@
|
||||
protected void handleDataMarker(String name, BlockPos pos, ServerLevelAccessor level, RandomSource random, BoundingBox box) {
|
||||
ResourceKey<LootTable> resourceKey = ShipwreckPieces.MARKERS_TO_LOOT.get(name);
|
||||
if (resourceKey != null) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/structures/StrongholdPieces.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/structures/StrongholdPieces.java
|
||||
@@ -870,10 +_,13 @@
|
||||
@@ -831,10 +_,13 @@
|
||||
BlockPos worldPos = this.getWorldPos(5, 3, 6);
|
||||
if (box.isInside(worldPos)) {
|
||||
this.hasPlacedSpawner = true;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/structures/SwampHutPiece.java
|
||||
@@ -97,7 +_,7 @@
|
||||
witch.setPersistenceRequired();
|
||||
witch.moveTo(worldPos.getX() + 0.5, worldPos.getY(), worldPos.getZ() + 0.5, 0.0F, 0.0F);
|
||||
witch.snapTo(worldPos.getX() + 0.5, worldPos.getY(), worldPos.getZ() + 0.5, 0.0F, 0.0F);
|
||||
witch.finalizeSpawn(level, level.getCurrentDifficultyAt(worldPos), EntitySpawnReason.STRUCTURE, null);
|
||||
- level.addFreshEntityWithPassengers(witch);
|
||||
+ level.addFreshEntityWithPassengers(witch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason
|
||||
@@ -11,7 +11,7 @@
|
||||
}
|
||||
@@ -116,7 +_,7 @@
|
||||
cat.setPersistenceRequired();
|
||||
cat.moveTo(worldPos.getX() + 0.5, worldPos.getY(), worldPos.getZ() + 0.5, 0.0F, 0.0F);
|
||||
cat.snapTo(worldPos.getX() + 0.5, worldPos.getY(), worldPos.getZ() + 0.5, 0.0F, 0.0F);
|
||||
cat.finalizeSpawn(level, level.getCurrentDifficultyAt(worldPos), EntitySpawnReason.STRUCTURE, null);
|
||||
- level.addFreshEntityWithPassengers(cat);
|
||||
+ level.addFreshEntityWithPassengers(cat, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason
|
||||
|
||||
@@ -1,28 +1,17 @@
|
||||
--- a/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java
|
||||
+++ b/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java
|
||||
@@ -54,6 +_,10 @@
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import net.minecraft.world.phys.shapes.BitSetDiscreteVoxelShape;
|
||||
import net.minecraft.world.phys.shapes.DiscreteVoxelShape;
|
||||
+// CraftBukkit start
|
||||
+import org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer;
|
||||
+import org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry;
|
||||
+// CraftBukkit end
|
||||
|
||||
public class StructureTemplate {
|
||||
public static final String PALETTE_TAG = "palette";
|
||||
@@ -71,6 +_,10 @@
|
||||
@@ -73,6 +_,10 @@
|
||||
public final List<StructureTemplate.StructureEntityInfo> entityInfoList = Lists.newArrayList();
|
||||
private Vec3i size = Vec3i.ZERO;
|
||||
private String author = "?";
|
||||
+ // CraftBukkit start - data containers
|
||||
+ private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry();
|
||||
+ public CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(StructureTemplate.DATA_TYPE_REGISTRY);
|
||||
+ private static final org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry();
|
||||
+ public org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer persistentDataContainer = new org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer(StructureTemplate.DATA_TYPE_REGISTRY);
|
||||
+ // CraftBukkit end
|
||||
|
||||
public Vec3i getSize() {
|
||||
return this.size;
|
||||
@@ -245,6 +_,19 @@
|
||||
@@ -247,6 +_,19 @@
|
||||
if (this.palettes.isEmpty()) {
|
||||
return false;
|
||||
} else {
|
||||
@@ -31,7 +20,7 @@
|
||||
+ ServerLevelAccessor wrappedAccess = serverLevel;
|
||||
+ org.bukkit.craftbukkit.util.CraftStructureTransformer structureTransformer = null;
|
||||
+ if (wrappedAccess instanceof org.bukkit.craftbukkit.util.TransformerGeneratorAccess transformerAccess) {
|
||||
+ serverLevel = transformerAccess.getHandle();
|
||||
+ serverLevel = transformerAccess.getDelegate();
|
||||
+ structureTransformer = transformerAccess.getStructureTransformer();
|
||||
+ // The structureTransformer is not needed if we can not transform blocks therefore we can save a little bit of performance doing this
|
||||
+ if (structureTransformer != null && !structureTransformer.canTransformBlocks()) {
|
||||
@@ -42,17 +31,8 @@
|
||||
List<StructureTemplate.StructureBlockInfo> list = settings.getRandomPalette(this.palettes, offset).blocks();
|
||||
if ((!list.isEmpty() || !settings.isIgnoreEntities() && !this.entityInfoList.isEmpty())
|
||||
&& this.size.getX() >= 1
|
||||
@@ -268,10 +_,29 @@
|
||||
BlockState blockState = structureBlockInfo.state.mirror(settings.getMirror()).rotate(settings.getRotation());
|
||||
if (structureBlockInfo.nbt != null) {
|
||||
BlockEntity blockEntity = serverLevel.getBlockEntity(blockPos);
|
||||
- Clearable.tryClear(blockEntity);
|
||||
+ // Paper start - Fix NBT pieces overriding a block entity during worldgen deadlock
|
||||
+ if (!(serverLevel instanceof net.minecraft.world.level.WorldGenLevel)) {
|
||||
+ Clearable.tryClear(blockEntity);
|
||||
+ }
|
||||
+ // Paper end - Fix NBT pieces overriding a block entity during worldgen deadlock
|
||||
serverLevel.setBlock(blockPos, Blocks.BARRIER.defaultBlockState(), 20);
|
||||
@@ -272,6 +_,21 @@
|
||||
serverLevel.setBlock(blockPos, Blocks.BARRIER.defaultBlockState(), 820);
|
||||
}
|
||||
|
||||
+ // CraftBukkit start
|
||||
@@ -104,7 +84,11 @@
|
||||
offset,
|
||||
settings.getMirror(),
|
||||
settings.getRotation(),
|
||||
@@ -491,11 +_,13 @@
|
||||
@@ -488,14 +_,17 @@
|
||||
);
|
||||
}
|
||||
}
|
||||
+
|
||||
}
|
||||
|
||||
private static Optional<Entity> createEntityIgnoreException(ServerLevelAccessor level, CompoundTag tag) {
|
||||
@@ -135,11 +119,10 @@
|
||||
return NbtUtils.addCurrentDataVersion(tag);
|
||||
}
|
||||
|
||||
@@ -720,6 +_,12 @@
|
||||
this.entityInfoList.add(new StructureTemplate.StructureEntityInfo(vec3, blockPos, compound1));
|
||||
}
|
||||
}
|
||||
+
|
||||
@@ -718,6 +_,11 @@
|
||||
.ifPresent(compoundTag1 -> this.entityInfoList.add(new StructureTemplate.StructureEntityInfo(vec3, blockPos, compoundTag1)));
|
||||
}
|
||||
);
|
||||
+ // CraftBukkit start - PDC
|
||||
+ if (tag.get("BukkitValues") instanceof CompoundTag compoundTag) {
|
||||
+ this.persistentDataContainer.putAll(compoundTag);
|
||||
@@ -148,7 +131,7 @@
|
||||
}
|
||||
|
||||
private void loadPalette(HolderGetter<Block> blockGetter, ListTag paletteTag, ListTag blocksTag) {
|
||||
@@ -828,7 +_,7 @@
|
||||
@@ -817,7 +_,7 @@
|
||||
|
||||
public static final class Palette {
|
||||
private final List<StructureTemplate.StructureBlockInfo> blocks;
|
||||
|
||||
Reference in New Issue
Block a user