diff --git a/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java index 338da89d62..51ae63749b 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_11/PaperweightAdapter.java @@ -70,6 +70,7 @@ import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeTypes; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.BlockMaterial; import net.minecraft.SharedConstants; @@ -978,6 +979,7 @@ public void initializeRegistries() { } } } + WorldEditTreeTypes.init(); // BiomeCategories Registry biomeRegistry = server.registryAccess().lookupOrThrow(Registries.BIOME); diff --git a/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java index 70f0d3065b..4a80baa1d7 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_4/PaperweightAdapter.java @@ -70,6 +70,7 @@ import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeTypes; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.BlockMaterial; import net.minecraft.SharedConstants; @@ -942,6 +943,7 @@ public void initializeRegistries() { } } } + WorldEditTreeTypes.init(); // BiomeCategories Registry biomeRegistry = server.registryAccess().lookupOrThrow(Registries.BIOME); diff --git a/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java index 35f34eb930..ff1a2c2486 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_5/PaperweightAdapter.java @@ -70,6 +70,7 @@ import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeTypes; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.BlockMaterial; import net.minecraft.SharedConstants; @@ -940,6 +941,7 @@ public void initializeRegistries() { } } } + WorldEditTreeTypes.init(); // BiomeCategories Registry biomeRegistry = server.registryAccess().lookupOrThrow(Registries.BIOME); diff --git a/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java index 78345b9e07..40180c1e1a 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_6/PaperweightAdapter.java @@ -70,6 +70,7 @@ import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeTypes; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.BlockMaterial; import net.minecraft.SharedConstants; @@ -977,6 +978,7 @@ public void initializeRegistries() { } } } + WorldEditTreeTypes.init(); // BiomeCategories Registry biomeRegistry = server.registryAccess().lookupOrThrow(Registries.BIOME); diff --git a/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java index a8745f4504..43bc74789b 100644 --- a/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.21.9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_21_9/PaperweightAdapter.java @@ -70,6 +70,7 @@ import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeTypes; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.BlockMaterial; import net.minecraft.SharedConstants; @@ -975,6 +976,7 @@ public void initializeRegistries() { } } } + WorldEditTreeTypes.init(); // BiomeCategories Registry biomeRegistry = server.registryAccess().lookupOrThrow(Registries.BIOME); diff --git a/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java index 59a24f0243..8c39281947 100644 --- a/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-26.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v26_1/PaperweightAdapter.java @@ -69,6 +69,7 @@ import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeTypes; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.BlockMaterial; import io.papermc.paper.world.PaperWorldLoader; @@ -967,6 +968,7 @@ public void initializeRegistries() { } } } + WorldEditTreeTypes.init(); // BiomeCategories Registry biomeRegistry = server.registryAccess().lookupOrThrow(Registries.BIOME); diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index 024a782270..664023ccbe 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -50,6 +50,7 @@ import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; +import com.sk89q.worldedit.world.generation.WorldEditTreeGeneration; import com.sk89q.worldedit.world.weather.WeatherType; import com.sk89q.worldedit.world.weather.WeatherTypes; import io.papermc.lib.PaperLib; @@ -318,6 +319,10 @@ public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession @Override public boolean generateTree(com.sk89q.worldedit.world.generation.TreeType type, EditSession editSession, BlockVector3 position) throws MaxChangedBlocksException { + Boolean customResult = WorldEditTreeGeneration.handleWorldEditTrees(this, type, editSession, position); + if (customResult != null) { + return customResult; + } BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); if (adapter != null) { return adapter.generateTree(type, getWorld(), editSession, position); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/WorldEditTreeGeneration.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/WorldEditTreeGeneration.java new file mode 100644 index 0000000000..483d910337 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/WorldEditTreeGeneration.java @@ -0,0 +1,55 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.world.generation; + +import com.google.common.collect.Iterables; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.MaxChangedBlocksException; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.world.World; + +import java.util.Collection; +import java.util.concurrent.ThreadLocalRandom; +import javax.annotation.Nullable; + +public final class WorldEditTreeGeneration { + + private WorldEditTreeGeneration() { + } + + @SuppressWarnings("deprecation") + @Nullable + public static Boolean handleWorldEditTrees(World world, TreeType type, EditSession editSession, BlockVector3 position) + throws MaxChangedBlocksException { + if (type == WorldEditTreeTypes.RANDOM) { + Collection treeTypes = TreeType.REGISTRY.values(); + TreeType randomType = Iterables.get(treeTypes, ThreadLocalRandom.current().nextInt(treeTypes.size())); + return world.generateTree(randomType, editSession, position); + } + + if (type == WorldEditTreeTypes.PINE) { + // TODO Move this into this file once the legacy system is stripped away + return com.sk89q.worldedit.util.TreeGenerator.TreeType.PINE.generate(editSession, position); + } + + return null; + } + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/WorldEditTreeTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/WorldEditTreeTypes.java new file mode 100644 index 0000000000..834fc70008 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/generation/WorldEditTreeTypes.java @@ -0,0 +1,47 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.world.generation; + +/** + * This class holds custom trees added by WorldEdit. + */ +public final class WorldEditTreeTypes { + + public static final TreeType RANDOM = create("random"); + public static final TreeType PINE = create("pine"); + + private WorldEditTreeTypes() { + } + + public static void init() { + register(RANDOM); + register(PINE); + } + + private static TreeType create(String id) { + return new TreeType("worldedit:" + id); + } + + private static void register(TreeType type) { + if (TreeType.REGISTRY.get(type.id()) == null) { + TreeType.REGISTRY.register(type.id(), type); + } + } +} diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java index 891955dbfc..bb81378a7c 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java @@ -64,6 +64,7 @@ import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeGeneration; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.weather.WeatherType; import com.sk89q.worldedit.world.weather.WeatherTypes; @@ -486,6 +487,10 @@ public boolean generateTree(com.sk89q.worldedit.util.TreeGenerator.TreeType type @Override public boolean generateTree(TreeType type, EditSession editSession, BlockVector3 position) throws MaxChangedBlocksException { + Boolean customResult = WorldEditTreeGeneration.handleWorldEditTrees(this, type, editSession, position); + if (customResult != null) { + return customResult; + } ServerLevel world = (ServerLevel) getWorld(); PlacedFeature generator = world.registryAccess().lookupOrThrow(Registries.PLACED_FEATURE).getValue(Identifier.tryParse(type.id())); ServerChunkCache chunkManager = world.getChunkSource(); diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java index 8146e32e75..6ba2f6c410 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java @@ -46,6 +46,7 @@ import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeTypes; import com.sk89q.worldedit.world.item.ItemCategory; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.weather.WeatherTypes; @@ -319,6 +320,7 @@ private void setupRegistries(MinecraftServer server) { } } } + WorldEditTreeTypes.init(); // ... :| GameModes.get(""); diff --git a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorld.java b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorld.java index c5d1cefff8..b59c68be4d 100644 --- a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorld.java +++ b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorld.java @@ -62,6 +62,7 @@ import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; +import com.sk89q.worldedit.world.generation.WorldEditTreeGeneration; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.weather.WeatherType; import com.sk89q.worldedit.world.weather.WeatherTypes; @@ -474,6 +475,10 @@ public boolean generateTree(com.sk89q.worldedit.util.TreeGenerator.TreeType type @Override public boolean generateTree(com.sk89q.worldedit.world.generation.TreeType type, EditSession editSession, BlockVector3 position) throws MaxChangedBlocksException { + Boolean customResult = WorldEditTreeGeneration.handleWorldEditTrees(this, type, editSession, position); + if (customResult != null) { + return customResult; + } ServerLevel world = getWorld(); PlacedFeature generator = world.registryAccess().lookupOrThrow(Registries.PLACED_FEATURE).getValue(Identifier.tryParse(type.id())); ServerChunkCache chunkManager = world.getChunkSource(); diff --git a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorldEdit.java b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorldEdit.java index 87cbda4a76..d16a89fd60 100644 --- a/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorldEdit.java +++ b/worldedit-neoforge/src/main/java/com/sk89q/worldedit/neoforge/NeoForgeWorldEdit.java @@ -46,6 +46,7 @@ import com.sk89q.worldedit.world.generation.ConfiguredFeatureType; import com.sk89q.worldedit.world.generation.StructureType; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeTypes; import com.sk89q.worldedit.world.item.ItemCategory; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.weather.WeatherTypes; @@ -246,6 +247,7 @@ private void setupRegistries(MinecraftServer server) { } } } + WorldEditTreeTypes.init(); // ... :| GameModes.get(""); diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java index e82e9b98e9..a42bf69c5c 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java @@ -48,6 +48,7 @@ import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeGeneration; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.weather.WeatherType; import com.sk89q.worldedit.world.weather.WeatherTypes; @@ -381,6 +382,10 @@ public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession @Override public boolean generateTree(TreeType type, EditSession editSession, BlockVector3 position) throws MaxChangedBlocksException { + Boolean customResult = WorldEditTreeGeneration.handleWorldEditTrees(this, type, editSession, position); + if (customResult != null) { + return customResult; + } ServerLevel world = (ServerLevel) getWorld(); PlacedFeature generator = world.registryAccess().lookupOrThrow(Registries.PLACED_FEATURE).getValue(Identifier.tryParse(type.id())); return generator != null && generator.place( diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorldEdit.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorldEdit.java index 5cf5e4c893..eb38c91396 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorldEdit.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorldEdit.java @@ -41,6 +41,7 @@ import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockCategory; import com.sk89q.worldedit.world.generation.TreeType; +import com.sk89q.worldedit.world.generation.WorldEditTreeTypes; import com.sk89q.worldedit.world.item.ItemCategory; import net.kyori.adventure.audience.Audience; import org.apache.logging.log4j.Logger; @@ -223,6 +224,7 @@ public void serverStarted(StartedEngineEvent event) { } } }); + WorldEditTreeTypes.init(); event.game().registry(RegistryTypes.BLOCK_TYPE).tags().forEach(blockTypeTag -> { String id = blockTypeTag.key().asString(); if (!BlockCategory.REGISTRY.keySet().contains(id)) {