Skip to content

Commit 6371c5e

Browse files
SirYwellme4502
andauthored
Cherrypick: Use a separate tree registry for tree placement (#3501)
Co-authored-by: SirYwell <[email protected]> Co-authored-by: Maddy Miller <[email protected]>
1 parent 7d706ba commit 6371c5e

40 files changed

Lines changed: 802 additions & 41 deletions

File tree

worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R2/PaperweightAdapter.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@
6868
import com.sk89q.worldedit.world.block.BlockTypes;
6969
import com.sk89q.worldedit.world.generation.ConfiguredFeatureType;
7070
import com.sk89q.worldedit.world.generation.StructureType;
71+
import com.sk89q.worldedit.world.generation.TreeType;
7172
import com.sk89q.worldedit.world.item.ItemType;
7273
import net.minecraft.Util;
7374
import net.minecraft.core.BlockPos;
7475
import net.minecraft.core.Holder;
76+
import net.minecraft.core.HolderLookup;
7577
import net.minecraft.core.HolderSet;
7678
import net.minecraft.core.Registry;
7779
import net.minecraft.core.SectionPos;
@@ -113,6 +115,9 @@
113115
import net.minecraft.world.level.dimension.LevelStem;
114116
import net.minecraft.world.level.levelgen.WorldOptions;
115117
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
118+
import net.minecraft.world.level.levelgen.feature.CoralTreeFeature;
119+
import net.minecraft.world.level.levelgen.feature.TreeFeature;
120+
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
116121
import net.minecraft.world.level.levelgen.structure.BoundingBox;
117122
import net.minecraft.world.level.levelgen.structure.Structure;
118123
import net.minecraft.world.level.levelgen.structure.StructureStart;
@@ -918,6 +923,20 @@ public void initializeRegistries() {
918923
}
919924
}
920925

926+
// Trees
927+
HolderLookup.RegistryLookup<PlacedFeature> placedFeatureRegistry = server.registryAccess().lookupOrThrow(Registries.PLACED_FEATURE);
928+
placedFeatureRegistry.listElements()
929+
.filter(feature -> {
930+
var underlyingFeature = feature.value().feature().value().feature();
931+
return underlyingFeature instanceof TreeFeature || underlyingFeature instanceof CoralTreeFeature;
932+
})
933+
.forEach(feature -> {
934+
String key = feature.key().toString();
935+
if (TreeType.REGISTRY.get(key) == null) {
936+
TreeType.REGISTRY.register(key, new TreeType(key));
937+
}
938+
});
939+
921940
// BiomeCategories
922941
Registry<Biome> biomeRegistry = server.registryAccess().registryOrThrow(Registries.BIOME);
923942
biomeRegistry.getTagNames().forEach(tagKey -> {

worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightFaweAdapter.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.sk89q.jnbt.CompoundTag;
2020
import com.sk89q.jnbt.Tag;
2121
import com.sk89q.worldedit.EditSession;
22+
import com.sk89q.worldedit.MaxChangedBlocksException;
2223
import com.sk89q.worldedit.blocks.BaseItemStack;
2324
import com.sk89q.worldedit.bukkit.BukkitAdapter;
2425
import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter;
@@ -51,6 +52,7 @@
5152
import com.sk89q.worldedit.world.entity.EntityType;
5253
import com.sk89q.worldedit.world.generation.ConfiguredFeatureType;
5354
import com.sk89q.worldedit.world.generation.StructureType;
55+
import com.sk89q.worldedit.world.generation.TreeType;
5456
import com.sk89q.worldedit.world.item.ItemType;
5557
import com.sk89q.worldedit.world.registry.BlockMaterial;
5658
import io.papermc.lib.PaperLib;
@@ -88,6 +90,7 @@
8890
import net.minecraft.world.level.chunk.ChunkGenerator;
8991
import net.minecraft.world.level.chunk.LevelChunk;
9092
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
93+
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
9194
import net.minecraft.world.level.levelgen.structure.BoundingBox;
9295
import net.minecraft.world.level.levelgen.structure.Structure;
9396
import net.minecraft.world.level.levelgen.structure.StructureStart;
@@ -679,6 +682,44 @@ public boolean generateStructure(StructureType type, World world, EditSession ed
679682
//FAWE end
680683
}
681684

685+
@Override
686+
public boolean generateTree(
687+
final TreeType treeType,
688+
final World world,
689+
final EditSession session,
690+
final BlockVector3 pt
691+
) throws MaxChangedBlocksException {
692+
ServerLevel serverLevel = getServerLevel(world);
693+
ChunkGenerator generator = serverLevel.getMinecraftWorld().getChunkSource().getGenerator();
694+
695+
PlacedFeature placedFeature = serverLevel
696+
.registryAccess()
697+
.registryOrThrow(Registries.PLACED_FEATURE)
698+
.get(ResourceLocation.tryParse(treeType.id()));
699+
700+
FaweBlockStateListPopulator populator = new FaweBlockStateListPopulator(serverLevel);
701+
List<CraftBlockState> placed = TaskManager.taskManager().sync(() -> {
702+
preCaptureStates(serverLevel);
703+
try {
704+
if (!placedFeature.place(
705+
populator,
706+
generator,
707+
serverLevel.random,
708+
new BlockPos(pt.x(), pt.y(), pt.z())
709+
)) {
710+
return null;
711+
}
712+
List<CraftBlockState> placedBlocks = new ArrayList<>(populator.getList());
713+
placedBlocks.addAll(serverLevel.capturedBlockStates.values());
714+
return placedBlocks;
715+
} finally {
716+
postCaptureBlockStates(serverLevel);
717+
}
718+
});
719+
720+
return placeFeatureIntoSession(session, populator, placed);
721+
}
722+
682723
private boolean placeFeatureIntoSession(
683724
final EditSession editSession,
684725
final FaweBlockStateListPopulator populator,

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_20_R3/PaperweightAdapter.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@
6868
import com.sk89q.worldedit.world.block.BlockTypes;
6969
import com.sk89q.worldedit.world.generation.ConfiguredFeatureType;
7070
import com.sk89q.worldedit.world.generation.StructureType;
71+
import com.sk89q.worldedit.world.generation.TreeType;
7172
import com.sk89q.worldedit.world.item.ItemType;
7273
import net.minecraft.Util;
7374
import net.minecraft.core.BlockPos;
7475
import net.minecraft.core.Holder;
76+
import net.minecraft.core.HolderLookup;
7577
import net.minecraft.core.HolderSet;
7678
import net.minecraft.core.Registry;
7779
import net.minecraft.core.SectionPos;
@@ -113,6 +115,9 @@
113115
import net.minecraft.world.level.dimension.LevelStem;
114116
import net.minecraft.world.level.levelgen.WorldOptions;
115117
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
118+
import net.minecraft.world.level.levelgen.feature.CoralTreeFeature;
119+
import net.minecraft.world.level.levelgen.feature.TreeFeature;
120+
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
116121
import net.minecraft.world.level.levelgen.structure.BoundingBox;
117122
import net.minecraft.world.level.levelgen.structure.Structure;
118123
import net.minecraft.world.level.levelgen.structure.StructureStart;
@@ -917,6 +922,20 @@ public void initializeRegistries() {
917922
}
918923
}
919924

925+
// Trees
926+
HolderLookup.RegistryLookup<PlacedFeature> placedFeatureRegistry = server.registryAccess().lookupOrThrow(Registries.PLACED_FEATURE);
927+
placedFeatureRegistry.listElements()
928+
.filter(feature -> {
929+
var underlyingFeature = feature.value().feature().value().feature();
930+
return underlyingFeature instanceof TreeFeature || underlyingFeature instanceof CoralTreeFeature;
931+
})
932+
.forEach(feature -> {
933+
String key = feature.key().toString();
934+
if (TreeType.REGISTRY.get(key) == null) {
935+
TreeType.REGISTRY.register(key, new TreeType(key));
936+
}
937+
});
938+
920939
// BiomeCategories
921940
Registry<Biome> biomeRegistry = server.registryAccess().registryOrThrow(Registries.BIOME);
922941
biomeRegistry.getTagNames().forEach(tagKey -> {

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightFaweAdapter.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.sk89q.jnbt.CompoundTag;
2020
import com.sk89q.jnbt.Tag;
2121
import com.sk89q.worldedit.EditSession;
22+
import com.sk89q.worldedit.MaxChangedBlocksException;
2223
import com.sk89q.worldedit.blocks.BaseItemStack;
2324
import com.sk89q.worldedit.bukkit.BukkitAdapter;
2425
import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter;
@@ -50,6 +51,7 @@
5051
import com.sk89q.worldedit.world.entity.EntityType;
5152
import com.sk89q.worldedit.world.generation.ConfiguredFeatureType;
5253
import com.sk89q.worldedit.world.generation.StructureType;
54+
import com.sk89q.worldedit.world.generation.TreeType;
5355
import com.sk89q.worldedit.world.item.ItemType;
5456
import com.sk89q.worldedit.world.registry.BlockMaterial;
5557
import io.papermc.lib.PaperLib;
@@ -87,6 +89,7 @@
8789
import net.minecraft.world.level.chunk.ChunkGenerator;
8890
import net.minecraft.world.level.chunk.LevelChunk;
8991
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
92+
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
9093
import net.minecraft.world.level.levelgen.structure.BoundingBox;
9194
import net.minecraft.world.level.levelgen.structure.Structure;
9295
import net.minecraft.world.level.levelgen.structure.StructureStart;
@@ -678,6 +681,44 @@ public boolean generateStructure(StructureType type, World world, EditSession ed
678681
//FAWE end
679682
}
680683

684+
@Override
685+
public boolean generateTree(
686+
final TreeType treeType,
687+
final World world,
688+
final EditSession session,
689+
final BlockVector3 pt
690+
) throws MaxChangedBlocksException {
691+
ServerLevel serverLevel = getServerLevel(world);
692+
ChunkGenerator generator = serverLevel.getMinecraftWorld().getChunkSource().getGenerator();
693+
694+
PlacedFeature placedFeature = serverLevel
695+
.registryAccess()
696+
.registryOrThrow(Registries.PLACED_FEATURE)
697+
.get(ResourceLocation.tryParse(treeType.id()));
698+
699+
FaweBlockStateListPopulator populator = new FaweBlockStateListPopulator(serverLevel);
700+
List<CraftBlockState> placed = TaskManager.taskManager().sync(() -> {
701+
preCaptureStates(serverLevel);
702+
try {
703+
if (!placedFeature.place(
704+
populator,
705+
generator,
706+
serverLevel.random,
707+
new BlockPos(pt.x(), pt.y(), pt.z())
708+
)) {
709+
return null;
710+
}
711+
List<CraftBlockState> placedBlocks = new ArrayList<>(populator.getList());
712+
placedBlocks.addAll(serverLevel.capturedBlockStates.values());
713+
return placedBlocks;
714+
} finally {
715+
postCaptureBlockStates(serverLevel);
716+
}
717+
});
718+
719+
return placeFeatureIntoSession(session, populator, placed);
720+
}
721+
681722
private boolean placeFeatureIntoSession(
682723
final EditSession editSession,
683724
final FaweBlockStateListPopulator populator,

worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext.fawe/v1_20_R4/PaperweightAdapter.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@
6868
import com.sk89q.worldedit.world.block.BlockTypes;
6969
import com.sk89q.worldedit.world.generation.ConfiguredFeatureType;
7070
import com.sk89q.worldedit.world.generation.StructureType;
71+
import com.sk89q.worldedit.world.generation.TreeType;
7172
import com.sk89q.worldedit.world.item.ItemType;
7273
import net.minecraft.Util;
7374
import net.minecraft.core.BlockPos;
7475
import net.minecraft.core.Holder;
76+
import net.minecraft.core.HolderLookup;
7577
import net.minecraft.core.HolderSet;
7678
import net.minecraft.core.Registry;
7779
import net.minecraft.core.RegistryAccess;
@@ -117,6 +119,9 @@
117119
import net.minecraft.world.level.dimension.LevelStem;
118120
import net.minecraft.world.level.levelgen.WorldOptions;
119121
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
122+
import net.minecraft.world.level.levelgen.feature.CoralTreeFeature;
123+
import net.minecraft.world.level.levelgen.feature.TreeFeature;
124+
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
120125
import net.minecraft.world.level.levelgen.structure.BoundingBox;
121126
import net.minecraft.world.level.levelgen.structure.Structure;
122127
import net.minecraft.world.level.levelgen.structure.StructureStart;
@@ -941,6 +946,20 @@ public void initializeRegistries() {
941946
}
942947
}
943948

949+
// Trees
950+
HolderLookup.RegistryLookup<PlacedFeature> placedFeatureRegistry = server.registryAccess().lookupOrThrow(Registries.PLACED_FEATURE);
951+
placedFeatureRegistry.listElements()
952+
.filter(feature -> {
953+
var underlyingFeature = feature.value().feature().value().feature();
954+
return underlyingFeature instanceof TreeFeature || underlyingFeature instanceof CoralTreeFeature;
955+
})
956+
.forEach(feature -> {
957+
String key = feature.key().toString();
958+
if (TreeType.REGISTRY.get(key) == null) {
959+
TreeType.REGISTRY.register(key, new TreeType(key));
960+
}
961+
});
962+
944963
// BiomeCategories
945964
Registry<Biome> biomeRegistry = server.registryAccess().registryOrThrow(Registries.BIOME);
946965
biomeRegistry.getTagNames().forEach(tagKey -> {

worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightFaweAdapter.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.sk89q.jnbt.CompoundTag;
2121
import com.sk89q.jnbt.Tag;
2222
import com.sk89q.worldedit.EditSession;
23+
import com.sk89q.worldedit.MaxChangedBlocksException;
2324
import com.sk89q.worldedit.blocks.BaseItemStack;
2425
import com.sk89q.worldedit.bukkit.BukkitAdapter;
2526
import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter;
@@ -52,6 +53,7 @@
5253
import com.sk89q.worldedit.world.entity.EntityType;
5354
import com.sk89q.worldedit.world.generation.ConfiguredFeatureType;
5455
import com.sk89q.worldedit.world.generation.StructureType;
56+
import com.sk89q.worldedit.world.generation.TreeType;
5557
import com.sk89q.worldedit.world.item.ItemType;
5658
import com.sk89q.worldedit.world.registry.BlockMaterial;
5759
import io.papermc.lib.PaperLib;
@@ -92,6 +94,7 @@
9294
import net.minecraft.world.level.chunk.ChunkGenerator;
9395
import net.minecraft.world.level.chunk.LevelChunk;
9496
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
97+
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
9598
import net.minecraft.world.level.levelgen.structure.BoundingBox;
9699
import net.minecraft.world.level.levelgen.structure.Structure;
97100
import net.minecraft.world.level.levelgen.structure.StructureStart;
@@ -692,6 +695,44 @@ public boolean generateStructure(StructureType type, World world, EditSession ed
692695
//FAWE end
693696
}
694697

698+
@Override
699+
public boolean generateTree(
700+
final TreeType treeType,
701+
final World world,
702+
final EditSession session,
703+
final BlockVector3 pt
704+
) throws MaxChangedBlocksException {
705+
ServerLevel serverLevel = getServerLevel(world);
706+
ChunkGenerator generator = serverLevel.getMinecraftWorld().getChunkSource().getGenerator();
707+
708+
PlacedFeature placedFeature = serverLevel
709+
.registryAccess()
710+
.registryOrThrow(Registries.PLACED_FEATURE)
711+
.get(ResourceLocation.tryParse(treeType.id()));
712+
713+
FaweBlockStateListPopulator populator = new FaweBlockStateListPopulator(serverLevel);
714+
List<CraftBlockState> placed = TaskManager.taskManager().sync(() -> {
715+
preCaptureStates(serverLevel);
716+
try {
717+
if (!placedFeature.place(
718+
populator,
719+
generator,
720+
serverLevel.random,
721+
new BlockPos(pt.x(), pt.y(), pt.z())
722+
)) {
723+
return null;
724+
}
725+
List<CraftBlockState> placedBlocks = new ArrayList<>(populator.getList());
726+
placedBlocks.addAll(serverLevel.capturedBlockStates.values());
727+
return placedBlocks;
728+
} finally {
729+
postCaptureBlockStates(serverLevel);
730+
}
731+
});
732+
733+
return placeFeatureIntoSession(session, populator, placed);
734+
}
735+
695736
private boolean placeFeatureIntoSession(
696737
final EditSession editSession,
697738
final FaweBlockStateListPopulator populator,

0 commit comments

Comments
 (0)