/* * 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.extent; import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockStateHolder; import javax.annotation.Nullable; /** * Accepts block and entity changes. */ public interface OutputExtent { /** * Change the block at the given location to the given block. The operation may * not tie the given {@link BlockStateHolder} to the world, so future changes to the * {@link BlockStateHolder} do not affect the world until this method is called again. * *

The return value of this method indicates whether the change was probably * successful. It may not be successful if, for example, the location is out * of the bounds of the extent. It may be unsuccessful if the block passed * is the same as the one in the world. However, the return value is only an * estimation and it may be incorrect, but it could be used to count, for * example, the approximate number of changes.

* * @param position position of the block * @param block block to set * @return true if the block was successfully set (return value may not be accurate) * @throws WorldEditException thrown on an error * @deprecated It is recommended that you use {@link #setBlock(int, int, int, BlockStateHolder)} in FAWE */ @Deprecated default > boolean setBlock(BlockVector3 position, T block) throws WorldEditException { return setBlock(position.getX(), position.getY(), position.getZ(), block); } // The defaults need to remain for compatibility (the actual implementation still needs to override one of these) default > boolean setBlock(int x, int y, int z, B block) throws WorldEditException { return setBlock(MutableBlockVector3.get(x, y, z), block); } boolean setTile(int x, int y, int z, CompoundTag tile) throws WorldEditException; /** * Check if this extent fully supports 3D biomes. * *

* If {@code false}, the extent only visually reads biomes from {@code y = 0}. * The biomes will still be set in 3D, but the client will only see the one at * {@code y = 0}. It is up to the caller to determine if they want to set that * biome instead, or simply warn the actor. *

* * @return if the extent fully supports 3D biomes */ default boolean fullySupports3DBiomes() { return true; } /** * Set the biome. * * @param position the (x, z) location to set the biome at * @param biome the biome to set to * @return true if the biome was successfully set (return value may not be accurate) * @deprecated Biomes in Minecraft are 3D now, use {@link OutputExtent#setBiome(BlockVector3, BiomeType)} */ @Deprecated default boolean setBiome(BlockVector2 position, BiomeType biome) { boolean result = false; for (int y = 0; y < 256; y ++) { result |= setBiome(position.toBlockVector3().mutY(y), biome); } return result; } @NonAbstractForCompatibility( delegateName = "setBiome", delegateParams = { int.class, int.class, int.class, BiomeType.class } ) // The defaults need to remain for compatibility (the actual implementation still needs to override one of these) default boolean setBiome(int x, int y, int z, BiomeType biome) { DeprecationUtil.checkDelegatingOverride(getClass()); return setBiome(MutableBlockVector3.get(x, y, z), biome); } //FAWE start /** * Set the biome. * *

* As implementation varies per Minecraft version, this may set more than * this position's biome. On versions prior to 1.15, this will set the entire * column. On later versions it will set the 4x4x4 cube. *

* * @param position the (x, y, z) location to set the biome at * @param biome the biome to set to * @return true if the biome was successfully set (return value may not be accurate) * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} * for details */ @NonAbstractForCompatibility( delegateName = "setBiome", delegateParams = { BlockVector3.class, BiomeType.class } ) default boolean setBiome(BlockVector3 position, BiomeType biome) { DeprecationUtil.checkDelegatingOverride(getClass()); return setBiome(position.toBlockVector2(), biome); } /** * Set the light value. * * @param position position of the block * @param value light level to set */ default void setBlockLight(BlockVector3 position, int value) { setBlockLight(position.getX(), position.getY(), position.getZ(), value); } default void setBlockLight(int x, int y, int z, int value) { } /** * Set the sky light value. * * @param position position of the block * @param value light level to set */ default void setSkyLight(BlockVector3 position, int value) { setSkyLight(position.getX(), position.getY(), position.getZ(), value); } //FAWE end default void setSkyLight(int x, int y, int z, int value) { } default void setHeightMap(HeightMapType type, int[] heightMap) { } /** * Return an {@link Operation} that should be called to tie up loose ends * (such as to commit changes in a buffer). * * @return an operation or null if there is none to execute */ @Nullable Operation commit(); }