Mirror von
https://github.com/IntellectualSites/FastAsyncWorldEdit.git
synchronisiert 2024-12-26 02:50:06 +01:00
Merge branch 'commanding-pipeline' of https://github.com/IntellectualSites/FastAsyncWorldEdit-1.13 into commanding-pipeline
Dieser Commit ist enthalten in:
Commit
6cbbefc0de
@ -2,9 +2,9 @@ package com.boydti.fawe.bukkit;
|
|||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.IFawe;
|
import com.boydti.fawe.IFawe;
|
||||||
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
|
|
||||||
import com.boydti.fawe.beta.implementation.cache.preloader.AsyncPreloader;
|
import com.boydti.fawe.beta.implementation.cache.preloader.AsyncPreloader;
|
||||||
import com.boydti.fawe.beta.implementation.cache.preloader.Preloader;
|
import com.boydti.fawe.beta.implementation.cache.preloader.Preloader;
|
||||||
|
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
|
||||||
import com.boydti.fawe.bukkit.adapter.BukkitQueueHandler;
|
import com.boydti.fawe.bukkit.adapter.BukkitQueueHandler;
|
||||||
import com.boydti.fawe.bukkit.listener.BrushListener;
|
import com.boydti.fawe.bukkit.listener.BrushListener;
|
||||||
import com.boydti.fawe.bukkit.listener.BukkitImageListener;
|
import com.boydti.fawe.bukkit.listener.BukkitImageListener;
|
||||||
@ -54,9 +54,13 @@ import org.bukkit.event.world.WorldLoadEvent;
|
|||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.bukkit.plugin.PluginManager;
|
import org.bukkit.plugin.PluginManager;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
public class FaweBukkit implements IFawe, Listener {
|
public class FaweBukkit implements IFawe, Listener {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(FaweBukkit.class);
|
||||||
|
|
||||||
private final Plugin plugin;
|
private final Plugin plugin;
|
||||||
private VaultUtil vault;
|
private VaultUtil vault;
|
||||||
private ItemUtil itemUtil;
|
private ItemUtil itemUtil;
|
||||||
@ -78,9 +82,7 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
try {
|
try {
|
||||||
new BrushListener(plugin);
|
new BrushListener(plugin);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
debug("====== BRUSH LISTENER FAILED ======");
|
log.debug("Brush Listener Failed", e);
|
||||||
e.printStackTrace();
|
|
||||||
debug("===================================");
|
|
||||||
}
|
}
|
||||||
if (PaperLib.isPaper() && Settings.IMP.EXPERIMENTAL.DYNAMIC_CHUNK_RENDERING > 1) {
|
if (PaperLib.isPaper() && Settings.IMP.EXPERIMENTAL.DYNAMIC_CHUNK_RENDERING > 1) {
|
||||||
new RenderListener(plugin);
|
new RenderListener(plugin);
|
||||||
@ -220,9 +222,7 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
this.itemUtil = tmp = new ItemUtil();
|
this.itemUtil = tmp = new ItemUtil();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Settings.IMP.EXPERIMENTAL.PERSISTENT_BRUSHES = false;
|
Settings.IMP.EXPERIMENTAL.PERSISTENT_BRUSHES = false;
|
||||||
debug("===== PERSISTENT BRUSH FAILED =====");
|
log.debug("Persistent Brushes Failed", e);
|
||||||
e.printStackTrace();
|
|
||||||
debug("===================================");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return tmp;
|
return tmp;
|
||||||
@ -230,13 +230,12 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Vault isn't required, but used for setting player permissions (WorldEdit bypass)
|
* Vault isn't required, but used for setting player permissions (WorldEdit bypass)
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setupVault() {
|
public void setupVault() {
|
||||||
try {
|
try {
|
||||||
this.vault = new VaultUtil();
|
this.vault = new VaultUtil();
|
||||||
} catch (final Throwable e) {
|
} catch (final Throwable ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,7 +269,7 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A mask manager handles region restrictions e.g. PlotSquared plots / WorldGuard regions
|
* A mask manager handles region restrictions e.g., PlotSquared plots / WorldGuard regions
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Collection<FaweMaskManager> getMaskManagers() {
|
public Collection<FaweMaskManager> getMaskManagers() {
|
||||||
@ -280,7 +279,7 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
try {
|
try {
|
||||||
managers.add(new Worldguard(worldguardPlugin));
|
managers.add(new Worldguard(worldguardPlugin));
|
||||||
managers.add(new WorldguardFlag(worldguardPlugin));
|
managers.add(new WorldguardFlag(worldguardPlugin));
|
||||||
Fawe.debug("Attempting to use plugin 'WorldGuard'");
|
log.debug("Attempting to use plugin 'WorldGuard'");
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -288,7 +287,7 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
if (townyPlugin != null && townyPlugin.isEnabled()) {
|
if (townyPlugin != null && townyPlugin.isEnabled()) {
|
||||||
try {
|
try {
|
||||||
managers.add(new TownyFeature(townyPlugin));
|
managers.add(new TownyFeature(townyPlugin));
|
||||||
Fawe.debug("Attempting to use plugin 'Towny'");
|
log.debug("Attempting to use plugin 'Towny'");
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -296,11 +295,11 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
if (factionsPlugin != null && factionsPlugin.isEnabled()) {
|
if (factionsPlugin != null && factionsPlugin.isEnabled()) {
|
||||||
try {
|
try {
|
||||||
managers.add(new FactionsFeature(factionsPlugin));
|
managers.add(new FactionsFeature(factionsPlugin));
|
||||||
Fawe.debug("Attempting to use plugin 'Factions'");
|
log.debug("Attempting to use plugin 'Factions'");
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
try {
|
try {
|
||||||
managers.add(new FactionsUUIDFeature(factionsPlugin, this));
|
managers.add(new FactionsUUIDFeature(factionsPlugin, this));
|
||||||
Fawe.debug("Attempting to use plugin 'FactionsUUID'");
|
log.debug("Attempting to use plugin 'FactionsUUID'");
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -309,7 +308,7 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
if (residencePlugin != null && residencePlugin.isEnabled()) {
|
if (residencePlugin != null && residencePlugin.isEnabled()) {
|
||||||
try {
|
try {
|
||||||
managers.add(new ResidenceFeature(residencePlugin, this));
|
managers.add(new ResidenceFeature(residencePlugin, this));
|
||||||
Fawe.debug("Attempting to use plugin 'Residence'");
|
log.debug("Attempting to use plugin 'Residence'");
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -317,7 +316,7 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
if (griefpreventionPlugin != null && griefpreventionPlugin.isEnabled()) {
|
if (griefpreventionPlugin != null && griefpreventionPlugin.isEnabled()) {
|
||||||
try {
|
try {
|
||||||
managers.add(new GriefPreventionFeature(griefpreventionPlugin));
|
managers.add(new GriefPreventionFeature(griefpreventionPlugin));
|
||||||
Fawe.debug("Attempting to use plugin 'GriefPrevention'");
|
log.debug("Attempting to use plugin 'GriefPrevention'");
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -326,7 +325,7 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
if (aSkyBlock != null && aSkyBlock.isEnabled()) {
|
if (aSkyBlock != null && aSkyBlock.isEnabled()) {
|
||||||
try {
|
try {
|
||||||
managers.add(new ASkyBlockHook(aSkyBlock));
|
managers.add(new ASkyBlockHook(aSkyBlock));
|
||||||
Fawe.debug("Attempting to use plugin 'ASkyBlock' found. Using it now.");
|
log.debug("Attempting to use plugin 'ASkyBlock' found. Using it now.");
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -334,7 +333,7 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
if (Settings.IMP.EXPERIMENTAL.FREEBUILD) {
|
if (Settings.IMP.EXPERIMENTAL.FREEBUILD) {
|
||||||
try {
|
try {
|
||||||
managers.add(new FreeBuildRegion());
|
managers.add(new FreeBuildRegion());
|
||||||
Fawe.debug("Attempting to use plugin '<internal.freebuild>'");
|
log.debug("Attempting to use plugin '<internal.freebuild>'");
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
package com.boydti.fawe.bukkit.adapter;
|
package com.boydti.fawe.bukkit.adapter;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
|
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
|
||||||
import com.boydti.fawe.bukkit.listener.ChunkListener;
|
import com.boydti.fawe.bukkit.listener.ChunkListener;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ public class BukkitQueueHandler extends QueueHandler {
|
|||||||
if (timingsEnabled) {
|
if (timingsEnabled) {
|
||||||
if (alertTimingsChange) {
|
if (alertTimingsChange) {
|
||||||
alertTimingsChange = false;
|
alertTimingsChange = false;
|
||||||
Fawe.debug("Having `parallel-threads` > 1 interferes with the timings.");
|
getLogger(BukkitQueueHandler.class).debug("Having `parallel-threads` > 1 interferes with the timings.");
|
||||||
}
|
}
|
||||||
fieldTimingsEnabled.set(null, false);
|
fieldTimingsEnabled.set(null, false);
|
||||||
methodCheck.invoke(null);
|
methodCheck.invoke(null);
|
||||||
@ -69,4 +69,4 @@ public class BukkitQueueHandler extends QueueHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
package com.boydti.fawe.bukkit.adapter.mc1_14;
|
package com.boydti.fawe.bukkit.adapter.mc1_14;
|
||||||
|
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.FaweCache;
|
import com.boydti.fawe.FaweCache;
|
||||||
import com.boydti.fawe.beta.IChunkSet;
|
import com.boydti.fawe.beta.IChunkSet;
|
||||||
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
|
|
||||||
import com.boydti.fawe.beta.implementation.blocks.CharGetBlocks;
|
import com.boydti.fawe.beta.implementation.blocks.CharGetBlocks;
|
||||||
|
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
|
||||||
import com.boydti.fawe.bukkit.adapter.DelegateLock;
|
import com.boydti.fawe.bukkit.adapter.DelegateLock;
|
||||||
import com.boydti.fawe.object.collection.AdaptedMap;
|
import com.boydti.fawe.object.collection.AdaptedMap;
|
||||||
import com.boydti.fawe.object.collection.BitArray4096;
|
import com.boydti.fawe.object.collection.BitArray4096;
|
||||||
@ -22,6 +24,19 @@ import com.sk89q.worldedit.internal.Constants;
|
|||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||||
|
import java.util.AbstractSet;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import net.minecraft.server.v1_14_R1.BiomeBase;
|
import net.minecraft.server.v1_14_R1.BiomeBase;
|
||||||
import net.minecraft.server.v1_14_R1.BlockPosition;
|
import net.minecraft.server.v1_14_R1.BlockPosition;
|
||||||
import net.minecraft.server.v1_14_R1.Chunk;
|
import net.minecraft.server.v1_14_R1.Chunk;
|
||||||
@ -45,12 +60,6 @@ import org.bukkit.craftbukkit.v1_14_R1.block.CraftBlock;
|
|||||||
import org.bukkit.event.entity.CreatureSpawnEvent;
|
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
import java.util.concurrent.Future;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
public class BukkitGetBlocks_1_14 extends CharGetBlocks {
|
public class BukkitGetBlocks_1_14 extends CharGetBlocks {
|
||||||
public ChunkSection[] sections;
|
public ChunkSection[] sections;
|
||||||
public Chunk nmsChunk;
|
public Chunk nmsChunk;
|
||||||
@ -363,7 +372,7 @@ public class BukkitGetBlocks_1_14 extends CharGetBlocks {
|
|||||||
final ListTag posTag = (ListTag) entityTagMap.get("Pos");
|
final ListTag posTag = (ListTag) entityTagMap.get("Pos");
|
||||||
final ListTag rotTag = (ListTag) entityTagMap.get("Rotation");
|
final ListTag rotTag = (ListTag) entityTagMap.get("Rotation");
|
||||||
if (idTag == null || posTag == null || rotTag == null) {
|
if (idTag == null || posTag == null || rotTag == null) {
|
||||||
Fawe.debug("Unknown entity tag: " + nativeTag);
|
getLogger(BukkitGetBlocks_1_14.class).debug("Unknown entity tag: " + nativeTag);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
final double x = posTag.getDouble(0);
|
final double x = posTag.getDouble(0);
|
||||||
|
@ -19,7 +19,8 @@
|
|||||||
|
|
||||||
package com.boydti.fawe.bukkit.adapter.mc1_14;
|
package com.boydti.fawe.bukkit.adapter.mc1_14;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import com.boydti.fawe.FaweCache;
|
import com.boydti.fawe.FaweCache;
|
||||||
import com.boydti.fawe.beta.implementation.packet.ChunkPacket;
|
import com.boydti.fawe.beta.implementation.packet.ChunkPacket;
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
@ -67,6 +68,20 @@ import com.sk89q.worldedit.world.block.BlockTypes;
|
|||||||
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
import com.sk89q.worldedit.world.entity.EntityType;
|
import com.sk89q.worldedit.world.entity.EntityType;
|
||||||
import com.sk89q.worldedit.world.registry.BlockMaterial;
|
import com.sk89q.worldedit.world.registry.BlockMaterial;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.OptionalInt;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import net.minecraft.server.v1_14_R1.Block;
|
import net.minecraft.server.v1_14_R1.Block;
|
||||||
import net.minecraft.server.v1_14_R1.BlockPosition;
|
import net.minecraft.server.v1_14_R1.BlockPosition;
|
||||||
import net.minecraft.server.v1_14_R1.BlockStateBoolean;
|
import net.minecraft.server.v1_14_R1.BlockStateBoolean;
|
||||||
@ -130,23 +145,6 @@ import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.OptionalInt;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
|
||||||
|
|
||||||
public final class Spigot_v1_14_R4 extends CachedBukkitAdapter implements BukkitImplAdapter<NBTBase>{
|
public final class Spigot_v1_14_R4 extends CachedBukkitAdapter implements BukkitImplAdapter<NBTBase>{
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(getClass());
|
private final Logger logger = LoggerFactory.getLogger(getClass());
|
||||||
@ -197,7 +195,7 @@ public final class Spigot_v1_14_R4 extends CachedBukkitAdapter implements Bukkit
|
|||||||
try {
|
try {
|
||||||
tileEntity.load(tag);
|
tileEntity.load(tag);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Fawe.debug("Invalid tag " + tag + " | " + tileEntity);
|
//Fawe.debug("Invalid tag " + tag + " | " + tileEntity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -419,7 +417,7 @@ public final class Spigot_v1_14_R4 extends CachedBukkitAdapter implements Bukkit
|
|||||||
worldServer.addEntity(createdEntity, SpawnReason.CUSTOM);
|
worldServer.addEntity(createdEntity, SpawnReason.CUSTOM);
|
||||||
return createdEntity.getBukkitEntity();
|
return createdEntity.getBukkitEntity();
|
||||||
} else {
|
} else {
|
||||||
Fawe.debug("Invalid entity " + state.getType().getId());
|
logger.debug("Invalid entity " + state.getType().getId());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package com.boydti.fawe.bukkit.filter;
|
package com.boydti.fawe.bukkit.filter;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
|
||||||
import com.boydti.fawe.FaweAPI;
|
import com.boydti.fawe.FaweAPI;
|
||||||
import com.boydti.fawe.object.RunnableVal;
|
import com.boydti.fawe.object.RunnableVal;
|
||||||
import com.boydti.fawe.regions.general.CuboidRegionFilter;
|
import com.boydti.fawe.regions.general.CuboidRegionFilter;
|
||||||
@ -34,7 +34,7 @@ public class WorldGuardFilter extends CuboidRegionFilter {
|
|||||||
BlockVector3 min = region.getMinimumPoint();
|
BlockVector3 min = region.getMinimumPoint();
|
||||||
BlockVector3 max = region.getMaximumPoint();
|
BlockVector3 max = region.getMaximumPoint();
|
||||||
if (max.getBlockX() - min.getBlockX() > 1024 || max.getBlockZ() - min.getBlockZ() > 1024) {
|
if (max.getBlockX() - min.getBlockX() > 1024 || max.getBlockZ() - min.getBlockZ() > 1024) {
|
||||||
Fawe.debug("Large or complex region shapes cannot be optimized. Filtering will be slower");
|
getLogger(WorldGuardFilter.class).debug("Large or complex region shapes cannot be optimized. Filtering will be slower");
|
||||||
large = true;
|
large = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.boydti.fawe.bukkit.listener;
|
package com.boydti.fawe.bukkit.listener;
|
||||||
|
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.bukkit.FaweBukkit;
|
import com.boydti.fawe.bukkit.FaweBukkit;
|
||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.config.Settings;
|
||||||
@ -61,7 +63,7 @@ public abstract class ChunkListener implements Listener {
|
|||||||
TaskManager.IMP.repeat(() -> {
|
TaskManager.IMP.repeat(() -> {
|
||||||
Location tmpLoc = lastCancelPos;
|
Location tmpLoc = lastCancelPos;
|
||||||
if (tmpLoc != null) {
|
if (tmpLoc != null) {
|
||||||
Fawe.debug("[FAWE `tick-limiter`] Detected and cancelled physics lag source at "
|
getLogger(ChunkListener.class).debug("[FAWE `tick-limiter`] Detected and cancelled physics lag source at "
|
||||||
+ tmpLoc);
|
+ tmpLoc);
|
||||||
}
|
}
|
||||||
rateLimit--;
|
rateLimit--;
|
||||||
@ -351,7 +353,6 @@ public abstract class ChunkListener implements Listener {
|
|||||||
lastCancelPos = block.getLocation();
|
lastCancelPos = block.getLocation();
|
||||||
}
|
}
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
|
||||||
} else {
|
} else {
|
||||||
count[1] = 0;
|
count[1] = 0;
|
||||||
}
|
}
|
||||||
@ -391,7 +392,7 @@ public abstract class ChunkListener implements Listener {
|
|||||||
double vertical = Math.abs(velocity.getY());
|
double vertical = Math.abs(velocity.getY());
|
||||||
if (Math.abs(velocity.getX()) > vertical
|
if (Math.abs(velocity.getX()) > vertical
|
||||||
|| Math.abs(velocity.getZ()) > vertical) {
|
|| Math.abs(velocity.getZ()) > vertical) {
|
||||||
Fawe.debug(
|
getLogger(ChunkListener.class).warn(
|
||||||
"[FAWE `tick-limiter`] Detected and cancelled rogue FireWork at "
|
"[FAWE `tick-limiter`] Detected and cancelled rogue FireWork at "
|
||||||
+ ent.getLocation());
|
+ ent.getLocation());
|
||||||
ent.remove();
|
ent.remove();
|
||||||
@ -422,11 +423,10 @@ public abstract class ChunkListener implements Listener {
|
|||||||
cancelNearby(cx, cz);
|
cancelNearby(cx, cz);
|
||||||
if (rateLimit <= 0) {
|
if (rateLimit <= 0) {
|
||||||
rateLimit = 20;
|
rateLimit = 20;
|
||||||
Fawe.debug(
|
getLogger(ChunkListener.class).warn(
|
||||||
"[FAWE `tick-limiter`] Detected and cancelled item lag source at " + loc);
|
"[FAWE `tick-limiter`] Detected and cancelled item lag source at " + loc);
|
||||||
}
|
}
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,9 +125,9 @@ public class WorldEditPlugin extends JavaPlugin { //implements TabCompleter
|
|||||||
@Override
|
@Override
|
||||||
public boolean add(Plugin plugin) {
|
public boolean add(Plugin plugin) {
|
||||||
if (plugin.getName().startsWith("AsyncWorldEdit")) {
|
if (plugin.getName().startsWith("AsyncWorldEdit")) {
|
||||||
Fawe.debug("Disabling `" + plugin.getName() + "` as it is incompatible");
|
log.debug("Disabling `" + plugin.getName() + "` as it is incompatible");
|
||||||
} else if (plugin.getName().startsWith("BetterShutdown")) {
|
} else if (plugin.getName().startsWith("BetterShutdown")) {
|
||||||
Fawe.debug("Disabling `" + plugin.getName() + "` as it is incompatible (Improperly shaded classes from com.sk89q.minecraft.util.commands)");
|
log.debug("Disabling `" + plugin.getName() + "` as it is incompatible (Improperly shaded classes from com.sk89q.minecraft.util.commands)");
|
||||||
} else {
|
} else {
|
||||||
return super.add(plugin);
|
return super.add(plugin);
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,8 @@ import java.util.concurrent.TimeUnit;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.management.InstanceAlreadyExistsException;
|
import javax.management.InstanceAlreadyExistsException;
|
||||||
import javax.management.NotificationEmitter;
|
import javax.management.NotificationEmitter;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [ WorldEdit action]
|
* [ WorldEdit action]
|
||||||
@ -62,19 +64,22 @@ import javax.management.NotificationEmitter;
|
|||||||
* - The chunk is modified directly rather than through the API
|
* - The chunk is modified directly rather than through the API
|
||||||
* \ Removes some overhead, and means some processing can be done async
|
* \ Removes some overhead, and means some processing can be done async
|
||||||
* - Lighting updates are performed on the chunk level rather than for every block
|
* - Lighting updates are performed on the chunk level rather than for every block
|
||||||
* \ e.g. A blob of stone: only the visible blocks need to have the lighting calculated
|
* \ e.g., A blob of stone: only the visible blocks need to have the lighting calculated
|
||||||
* - Block changes are sent with a chunk packet
|
* - Block changes are sent with a chunk packet
|
||||||
* \ A chunk packet is generally quicker to create and smaller for large world edits
|
* \ A chunk packet is generally quicker to create and smaller for large world edits
|
||||||
* - No physics updates
|
* - No physics updates
|
||||||
* \ Physics updates are slow, and are usually performed on each block
|
* \ Physics updates are slow, and are usually performed on each block
|
||||||
* - Block data shortcuts
|
* - Block data shortcuts
|
||||||
* \ Some known blocks don't need to have the data set or accessed (e.g. air is never going to have data)
|
* \ Some known blocks don't need to have the data set or accessed (e.g., air is never going to have data)
|
||||||
* - Remove redundant extents
|
* - Remove redundant extents
|
||||||
* \ Up to 11 layers of extents can be removed
|
* \ Up to 11 layers of extents can be removed
|
||||||
* - History bypassing
|
* - History bypassing
|
||||||
* \ FastMode bypasses history and means blocks in the world don't need to be checked and recorded
|
* \ FastMode bypasses history and means blocks in the world don't need to be checked and recorded
|
||||||
*/
|
*/
|
||||||
public class Fawe {
|
public class Fawe {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(Fawe.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The FAWE instance;
|
* The FAWE instance;
|
||||||
*/
|
*/
|
||||||
@ -183,7 +188,7 @@ public class Fawe {
|
|||||||
visualQueue = new VisualQueue(3);
|
visualQueue = new VisualQueue(3);
|
||||||
WEManager.IMP.managers.addAll(Fawe.this.IMP.getMaskManagers());
|
WEManager.IMP.managers.addAll(Fawe.this.IMP.getMaskManagers());
|
||||||
WEManager.IMP.managers.add(new PlotSquaredFeature());
|
WEManager.IMP.managers.add(new PlotSquaredFeature());
|
||||||
Fawe.debug("Plugin 'PlotSquared' found. Using it now.");
|
log.debug("Plugin 'PlotSquared' found. Using it now.");
|
||||||
} catch (Throwable ignored) {}
|
} catch (Throwable ignored) {}
|
||||||
try {
|
try {
|
||||||
imp().startMetrics();
|
imp().startMetrics();
|
||||||
@ -324,7 +329,7 @@ public class Fawe {
|
|||||||
public static void setupInjector() {
|
public static void setupInjector() {
|
||||||
/*
|
/*
|
||||||
* Modify the sessions
|
* Modify the sessions
|
||||||
* - EditSession supports custom queue and a lot of optimizations
|
* - EditSession supports a custom queue, and a lot of optimizations
|
||||||
* - LocalSession supports VirtualPlayers and undo on disk
|
* - LocalSession supports VirtualPlayers and undo on disk
|
||||||
*/
|
*/
|
||||||
if (!Settings.IMP.EXPERIMENTAL.DISABLE_NATIVES) {
|
if (!Settings.IMP.EXPERIMENTAL.DISABLE_NATIVES) {
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package com.boydti.fawe;
|
package com.boydti.fawe;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.beta.Trimable;
|
import com.boydti.fawe.beta.Trimable;
|
||||||
import com.boydti.fawe.config.BBC;
|
import com.boydti.fawe.config.BBC;
|
||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.config.Settings;
|
||||||
@ -27,10 +30,7 @@ import com.sk89q.jnbt.StringTag;
|
|||||||
import com.sk89q.jnbt.Tag;
|
import com.sk89q.jnbt.Tag;
|
||||||
import com.sk89q.worldedit.math.MutableBlockVector3;
|
import com.sk89q.worldedit.math.MutableBlockVector3;
|
||||||
import com.sk89q.worldedit.math.MutableVector3;
|
import com.sk89q.worldedit.math.MutableVector3;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
|
||||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
|
||||||
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
import com.sk89q.worldedit.world.block.BlockTypesCache;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -50,8 +50,6 @@ import java.util.concurrent.TimeUnit;
|
|||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
|
||||||
|
|
||||||
public enum FaweCache implements Trimable {
|
public enum FaweCache implements Trimable {
|
||||||
IMP
|
IMP
|
||||||
; // singleton
|
; // singleton
|
||||||
@ -141,7 +139,7 @@ public enum FaweCache implements Trimable {
|
|||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
pool = REGISTERED_POOLS.get(clazz);
|
pool = REGISTERED_POOLS.get(clazz);
|
||||||
if (pool == null) {
|
if (pool == null) {
|
||||||
Fawe.debug("Not registered " + clazz);
|
getLogger(FaweCache.class).debug("Not registered " + clazz);
|
||||||
Supplier<T> supplier = IOUtil.supplier(clazz::newInstance);
|
Supplier<T> supplier = IOUtil.supplier(clazz::newInstance);
|
||||||
pool = supplier::get;
|
pool = supplier::get;
|
||||||
REGISTERED_POOLS.put(clazz, pool);
|
REGISTERED_POOLS.put(clazz, pool);
|
||||||
@ -162,7 +160,7 @@ public enum FaweCache implements Trimable {
|
|||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
cache = REGISTERED_SINGLETONS.get(clazz);
|
cache = REGISTERED_SINGLETONS.get(clazz);
|
||||||
if (cache == null) {
|
if (cache == null) {
|
||||||
Fawe.debug("Not registered " + clazz);
|
getLogger(FaweCache.class).debug("Not registered " + clazz);
|
||||||
cache = new CleanableThreadLocal<>(IOUtil.supplier(clazz::newInstance));
|
cache = new CleanableThreadLocal<>(IOUtil.supplier(clazz::newInstance));
|
||||||
REGISTERED_SINGLETONS.put(clazz, cache);
|
REGISTERED_SINGLETONS.put(clazz, cache);
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ public interface Filter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make changes to the block here<br> - e.g. block.setId(...)<br> - Note: Performance is
|
* Make changes to the block here<br> - e.g., block.setId(...)<br> - Note: Performance is
|
||||||
* critical here<br>
|
* critical here<br>
|
||||||
*
|
*
|
||||||
* @param block
|
* @param block
|
||||||
@ -50,7 +50,6 @@ public interface Filter {
|
|||||||
* Do something with the IChunk after block filtering.
|
* Do something with the IChunk after block filtering.
|
||||||
*
|
*
|
||||||
* @param chunk
|
* @param chunk
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
default void finishChunk(IChunk chunk) {
|
default void finishChunk(IChunk chunk) {
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,6 @@ import com.boydti.fawe.beta.implementation.processors.MultiBatchProcessor;
|
|||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
import com.sk89q.worldedit.extent.Extent;
|
import com.sk89q.worldedit.extent.Extent;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
@ -84,20 +82,12 @@ public interface IBatchProcessor {
|
|||||||
default boolean trimNBT(IChunkSet set, Function<BlockVector3, Boolean> contains) {
|
default boolean trimNBT(IChunkSet set, Function<BlockVector3, Boolean> contains) {
|
||||||
Set<CompoundTag> ents = set.getEntities();
|
Set<CompoundTag> ents = set.getEntities();
|
||||||
if (!ents.isEmpty()) {
|
if (!ents.isEmpty()) {
|
||||||
for (Iterator<CompoundTag> iter = ents.iterator(); iter.hasNext();) {
|
ents.removeIf(ent -> !contains.apply(ent.getEntityPosition().toBlockPoint()));
|
||||||
CompoundTag ent = iter.next();
|
|
||||||
if (!contains.apply(ent.getEntityPosition().toBlockPoint())) {
|
|
||||||
iter.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Map<BlockVector3, CompoundTag> tiles = set.getTiles();
|
Map<BlockVector3, CompoundTag> tiles = set.getTiles();
|
||||||
if (!tiles.isEmpty()) {
|
if (!tiles.isEmpty()) {
|
||||||
for (Iterator<Map.Entry<BlockVector3, CompoundTag>> iter = tiles.entrySet().iterator(); iter.hasNext();) {
|
tiles.entrySet().removeIf(blockVector3CompoundTagEntry -> !contains
|
||||||
if (!contains.apply(iter.next().getKey())) {
|
.apply(blockVector3CompoundTagEntry.getKey()));
|
||||||
iter.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return !tiles.isEmpty() || !ents.isEmpty();
|
return !tiles.isEmpty() || !ents.isEmpty();
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ public interface IChunk extends Trimable, IChunkGet, IChunkSet {
|
|||||||
int getZ();
|
int getZ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the chunk is a delegate, returns it's parent's root
|
* If the chunk is a delegate, returns its parent's root
|
||||||
*
|
*
|
||||||
* @return root IChunk
|
* @return root IChunk
|
||||||
*/
|
*/
|
||||||
@ -49,6 +49,7 @@ public interface IChunk extends Trimable, IChunkGet, IChunkSet {
|
|||||||
*
|
*
|
||||||
* @return true if no changes are queued for this chunk
|
* @return true if no changes are queued for this chunk
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
boolean isEmpty();
|
boolean isEmpty();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -56,7 +57,7 @@ public interface IChunk extends Trimable, IChunkGet, IChunkSet {
|
|||||||
*
|
*
|
||||||
* @param filter the filter
|
* @param filter the filter
|
||||||
* @param block The filter block
|
* @param block The filter block
|
||||||
* @param region The region allowed to filter (may be null)
|
* @param region The region allowed to filter (maybe null)
|
||||||
*/
|
*/
|
||||||
void filterBlocks(Filter filter, ChunkFilterBlock block, @Nullable Region region, boolean full);
|
void filterBlocks(Filter filter, ChunkFilterBlock block, @Nullable Region region, boolean full);
|
||||||
|
|
||||||
@ -70,10 +71,13 @@ public interface IChunk extends Trimable, IChunkGet, IChunkSet {
|
|||||||
// void flood(Flood flood, FilterBlockMask mask, ChunkFilterBlock block);
|
// void flood(Flood flood, FilterBlockMask mask, ChunkFilterBlock block);
|
||||||
|
|
||||||
/* set - queues a change */
|
/* set - queues a change */
|
||||||
|
@Override
|
||||||
boolean setBiome(int x, int y, int z, BiomeType biome);
|
boolean setBiome(int x, int y, int z, BiomeType biome);
|
||||||
|
|
||||||
|
@Override
|
||||||
boolean setTile(int x, int y, int z, CompoundTag tag);
|
boolean setTile(int x, int y, int z, CompoundTag tag);
|
||||||
|
|
||||||
|
@Override
|
||||||
boolean setBlock(int x, int y, int z, BlockStateHolder block);
|
boolean setBlock(int x, int y, int z, BlockStateHolder block);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package com.boydti.fawe.beta;
|
package com.boydti.fawe.beta;
|
||||||
|
|
||||||
import com.boydti.fawe.beta.Trimable;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IGetBlocks may be cached by the WorldChunkCache so that it can be used between multiple
|
* IGetBlocks may be cached by the WorldChunkCache so that it can be used between multiple
|
||||||
* IQueueExtents - avoids conversion between palette and raw data on every block get
|
* IQueueExtents - avoids conversion between a palette and raw data on every block get
|
||||||
*/
|
*/
|
||||||
public interface IChunkCache<T> extends Trimable {
|
public interface IChunkCache<T> extends Trimable {
|
||||||
T get(int chunkX, int chunkZ);
|
T get(int chunkX, int chunkZ);
|
||||||
|
@ -43,6 +43,7 @@ public interface IChunkGet extends IBlocks, Trimable, InputExtent {
|
|||||||
|
|
||||||
<T extends Future<T>> T call(IChunkSet set, Runnable finalize);
|
<T extends Future<T>> T call(IChunkSet set, Runnable finalize);
|
||||||
|
|
||||||
|
@Override
|
||||||
char[] load(int layer);
|
char[] load(int layer);
|
||||||
|
|
||||||
CompoundTag getEntity(UUID uuid);
|
CompoundTag getEntity(UUID uuid);
|
||||||
|
@ -4,22 +4,15 @@ import com.boydti.fawe.FaweCache;
|
|||||||
import com.boydti.fawe.beta.implementation.IChunkExtent;
|
import com.boydti.fawe.beta.implementation.IChunkExtent;
|
||||||
import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock;
|
import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock;
|
||||||
import com.boydti.fawe.beta.implementation.processors.IBatchProcessorHolder;
|
import com.boydti.fawe.beta.implementation.processors.IBatchProcessorHolder;
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
|
||||||
import com.sk89q.worldedit.WorldEditException;
|
|
||||||
import com.sk89q.worldedit.extent.Extent;
|
import com.sk89q.worldedit.extent.Extent;
|
||||||
import com.sk89q.worldedit.function.operation.Operation;
|
import com.sk89q.worldedit.function.operation.Operation;
|
||||||
import com.sk89q.worldedit.math.BlockVector2;
|
import com.sk89q.worldedit.math.BlockVector2;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
import com.sk89q.worldedit.regions.Region;
|
||||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
|
||||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
|
||||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.io.Flushable;
|
import java.io.Flushable;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: implement Extent (need to refactor Extent first) Interface for a queue based extent which
|
* TODO: implement Extent (need to refactor Extent first) Interface for a queue based extent which
|
||||||
@ -58,7 +51,6 @@ public interface IQueueExtent<T extends IChunk> extends Flushable, Trimable, ICh
|
|||||||
* - Faster than getting it using NMS and allows for wrapping
|
* - Faster than getting it using NMS and allows for wrapping
|
||||||
* @param x
|
* @param x
|
||||||
* @param z
|
* @param z
|
||||||
* @param supplier
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
IChunkGet getCachedGet(int x, int z);
|
IChunkGet getCachedGet(int x, int z);
|
||||||
@ -67,7 +59,6 @@ public interface IQueueExtent<T extends IChunk> extends Flushable, Trimable, ICh
|
|||||||
* Get the cached chunk set object
|
* Get the cached chunk set object
|
||||||
* @param x
|
* @param x
|
||||||
* @param z
|
* @param z
|
||||||
* @param supplier
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
IChunkSet getCachedSet(int x, int z);
|
IChunkSet getCachedSet(int x, int z);
|
||||||
@ -101,7 +92,7 @@ public interface IQueueExtent<T extends IChunk> extends Flushable, Trimable, ICh
|
|||||||
T create(boolean isFull);
|
T create(boolean isFull);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrap the chunk object (i.e. for region restrictions / limits etc.)
|
* Wrap the chunk object (i.e., for region restrictions / limits etc.)
|
||||||
*
|
*
|
||||||
* @param root
|
* @param root
|
||||||
* @return wrapped chunk
|
* @return wrapped chunk
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
package com.boydti.fawe.beta;
|
package com.boydti.fawe.beta;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for objects that can be trimmed (memory related)<br> - Trimming will reduce it's memory
|
* Interface for objects that can be trimmed (memory related)<br> - Trimming will reduce its memory
|
||||||
* footprint
|
* footprint
|
||||||
*/
|
*/
|
||||||
public interface Trimable {
|
public interface Trimable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trim the object, reducing it's memory footprint
|
* Trims the object, reducing its memory footprint
|
||||||
*
|
*
|
||||||
* @param aggressive if trimming should be aggressive e.g. Not return early when the first
|
* @param aggressive if trimming should be aggressive e.g., Not return early when the first
|
||||||
* element cannot be trimmed
|
* element cannot be trimmed
|
||||||
* @return if this object is empty at the end of the trim, and can therefore be deleted
|
* @return if this object is empty at the end of the trim, and can therefore be deleted
|
||||||
*/
|
*/
|
||||||
|
@ -386,7 +386,7 @@ public class ChunkHolder<T extends Future<T>> implements IQueueChunk {
|
|||||||
/**
|
/**
|
||||||
* Create a wrapped set object
|
* Create a wrapped set object
|
||||||
* - The purpose of wrapping is to allow different extents to intercept / alter behavior
|
* - The purpose of wrapping is to allow different extents to intercept / alter behavior
|
||||||
* - E.g. caching, optimizations, filtering
|
* - e.g., caching, optimizations, filtering
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private IChunkSet newWrappedSet() {
|
private IChunkSet newWrappedSet() {
|
||||||
@ -396,7 +396,7 @@ public class ChunkHolder<T extends Future<T>> implements IQueueChunk {
|
|||||||
/**
|
/**
|
||||||
* Create a wrapped get object
|
* Create a wrapped get object
|
||||||
* - The purpose of wrapping is to allow different extents to intercept / alter behavior
|
* - The purpose of wrapping is to allow different extents to intercept / alter behavior
|
||||||
* - E.g. caching, optimizations, filtering
|
* - e.g., caching, optimizations, filtering
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private IChunkGet newWrappedGet() {
|
private IChunkGet newWrappedGet() {
|
||||||
|
@ -1,13 +1,9 @@
|
|||||||
package com.boydti.fawe.beta.implementation.chunk;
|
package com.boydti.fawe.beta.implementation.chunk;
|
||||||
|
|
||||||
|
import com.boydti.fawe.beta.Filter;
|
||||||
|
import com.boydti.fawe.beta.IChunkSet;
|
||||||
import com.boydti.fawe.beta.IQueueChunk;
|
import com.boydti.fawe.beta.IQueueChunk;
|
||||||
import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock;
|
import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock;
|
||||||
import com.boydti.fawe.beta.Filter;
|
|
||||||
import com.boydti.fawe.beta.FilterBlockMask;
|
|
||||||
import com.boydti.fawe.beta.Flood;
|
|
||||||
import com.boydti.fawe.beta.IChunk;
|
|
||||||
import com.boydti.fawe.beta.IChunkSet;
|
|
||||||
import com.boydti.fawe.beta.IQueueExtent;
|
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
import com.sk89q.worldedit.regions.Region;
|
||||||
@ -16,20 +12,16 @@ import com.sk89q.worldedit.world.block.BaseBlock;
|
|||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public enum NullChunk implements IQueueChunk {
|
public enum NullChunk implements IQueueChunk {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(IQueueExtent extent, int x, int z) {}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getX() {
|
public int getX() {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -54,6 +54,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
this.limit = limit;
|
this.limit = limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public List<? extends Entity> getEntities(Region region) {
|
public List<? extends Entity> getEntities(Region region) {
|
||||||
limit.THROW_MAX_CHECKS(region.getArea());
|
limit.THROW_MAX_CHECKS(region.getArea());
|
||||||
try {
|
try {
|
||||||
@ -66,6 +67,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public List<? extends Entity> getEntities() {
|
public List<? extends Entity> getEntities() {
|
||||||
limit.THROW_MAX_CHECKS();
|
limit.THROW_MAX_CHECKS();
|
||||||
try {
|
try {
|
||||||
@ -78,6 +80,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public Entity createEntity(Location location, BaseEntity entity) {
|
public Entity createEntity(Location location, BaseEntity entity) {
|
||||||
limit.THROW_MAX_CHANGES();
|
limit.THROW_MAX_CHANGES();
|
||||||
@ -507,6 +510,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public BlockState getBlock(int x, int y, int z) {
|
public BlockState getBlock(int x, int y, int z) {
|
||||||
limit.THROW_MAX_CHECKS();
|
limit.THROW_MAX_CHECKS();
|
||||||
try {
|
try {
|
||||||
@ -532,6 +536,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public BaseBlock getFullBlock(int x, int y, int z) {
|
public BaseBlock getFullBlock(int x, int y, int z) {
|
||||||
limit.THROW_MAX_CHECKS();
|
limit.THROW_MAX_CHECKS();
|
||||||
try {
|
try {
|
||||||
@ -544,6 +549,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public BiomeType getBiome(BlockVector2 position) {
|
public BiomeType getBiome(BlockVector2 position) {
|
||||||
limit.THROW_MAX_CHECKS();
|
limit.THROW_MAX_CHECKS();
|
||||||
try {
|
try {
|
||||||
@ -556,6 +562,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public BiomeType getBiomeType(int x, int z) {
|
public BiomeType getBiomeType(int x, int z) {
|
||||||
limit.THROW_MAX_CHECKS();
|
limit.THROW_MAX_CHECKS();
|
||||||
try {
|
try {
|
||||||
@ -568,6 +575,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public <T extends BlockStateHolder<T>> boolean setBlock(BlockVector3 position, T block) throws WorldEditException {
|
public <T extends BlockStateHolder<T>> boolean setBlock(BlockVector3 position, T block) throws WorldEditException {
|
||||||
limit.THROW_MAX_CHANGES();
|
limit.THROW_MAX_CHANGES();
|
||||||
@ -582,6 +590,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public <T extends BlockStateHolder<T>> boolean setBlock(int x, int y, int z, T block) throws WorldEditException {
|
public <T extends BlockStateHolder<T>> boolean setBlock(int x, int y, int z, T block) throws WorldEditException {
|
||||||
limit.THROW_MAX_CHANGES();
|
limit.THROW_MAX_CHANGES();
|
||||||
if (block.hasNbtData()) limit.MAX_BLOCKSTATES();
|
if (block.hasNbtData()) limit.MAX_BLOCKSTATES();
|
||||||
@ -595,6 +604,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean setTile(int x, int y, int z, CompoundTag tile) throws WorldEditException {
|
public boolean setTile(int x, int y, int z, CompoundTag tile) throws WorldEditException {
|
||||||
limit.THROW_MAX_CHANGES();
|
limit.THROW_MAX_CHANGES();
|
||||||
limit.MAX_BLOCKSTATES();
|
limit.MAX_BLOCKSTATES();
|
||||||
@ -608,6 +618,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean setBiome(BlockVector2 position, BiomeType biome) {
|
public boolean setBiome(BlockVector2 position, BiomeType biome) {
|
||||||
limit.THROW_MAX_CHANGES();
|
limit.THROW_MAX_CHANGES();
|
||||||
try {
|
try {
|
||||||
@ -620,6 +631,7 @@ public class LimitExtent extends PassthroughExtent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean setBiome(int x, int y, int z, BiomeType biome) {
|
public boolean setBiome(int x, int y, int z, BiomeType biome) {
|
||||||
limit.THROW_MAX_CHANGES();
|
limit.THROW_MAX_CHANGES();
|
||||||
try {
|
try {
|
||||||
|
@ -1,37 +1,33 @@
|
|||||||
package com.boydti.fawe.beta.implementation.queue;
|
package com.boydti.fawe.beta.implementation.queue;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.beta.IQueueChunk;
|
|
||||||
import com.boydti.fawe.beta.implementation.filter.block.CharFilterBlock;
|
|
||||||
import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock;
|
|
||||||
import com.boydti.fawe.beta.IBatchProcessor;
|
|
||||||
import com.boydti.fawe.beta.IChunk;
|
import com.boydti.fawe.beta.IChunk;
|
||||||
|
import com.boydti.fawe.beta.IChunkCache;
|
||||||
import com.boydti.fawe.beta.IChunkGet;
|
import com.boydti.fawe.beta.IChunkGet;
|
||||||
import com.boydti.fawe.beta.IChunkSet;
|
import com.boydti.fawe.beta.IChunkSet;
|
||||||
|
import com.boydti.fawe.beta.IQueueChunk;
|
||||||
import com.boydti.fawe.beta.IQueueExtent;
|
import com.boydti.fawe.beta.IQueueExtent;
|
||||||
import com.boydti.fawe.beta.IChunkCache;
|
|
||||||
import com.boydti.fawe.beta.implementation.chunk.NullChunk;
|
|
||||||
import com.boydti.fawe.beta.implementation.blocks.CharSetBlocks;
|
import com.boydti.fawe.beta.implementation.blocks.CharSetBlocks;
|
||||||
import com.boydti.fawe.beta.implementation.chunk.ChunkHolder;
|
import com.boydti.fawe.beta.implementation.chunk.ChunkHolder;
|
||||||
|
import com.boydti.fawe.beta.implementation.chunk.NullChunk;
|
||||||
import com.boydti.fawe.beta.implementation.chunk.ReferenceChunk;
|
import com.boydti.fawe.beta.implementation.chunk.ReferenceChunk;
|
||||||
import com.boydti.fawe.beta.implementation.processors.BatchProcessorHolder;
|
import com.boydti.fawe.beta.implementation.filter.block.CharFilterBlock;
|
||||||
|
import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock;
|
||||||
import com.boydti.fawe.beta.implementation.processors.EmptyBatchProcessor;
|
import com.boydti.fawe.beta.implementation.processors.EmptyBatchProcessor;
|
||||||
import com.boydti.fawe.beta.implementation.processors.ExtentBatchProcessorHolder;
|
import com.boydti.fawe.beta.implementation.processors.ExtentBatchProcessorHolder;
|
||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.config.Settings;
|
||||||
import com.boydti.fawe.object.changeset.FaweChangeSet;
|
|
||||||
import com.boydti.fawe.util.MathMan;
|
import com.boydti.fawe.util.MathMan;
|
||||||
import com.boydti.fawe.util.MemUtil;
|
import com.boydti.fawe.util.MemUtil;
|
||||||
import com.google.common.util.concurrent.Futures;
|
import com.google.common.util.concurrent.Futures;
|
||||||
import com.sk89q.worldedit.extent.Extent;
|
import com.sk89q.worldedit.extent.Extent;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap;
|
||||||
|
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Single threaded implementation for IQueueExtent (still abstract) - Does not implement creation of
|
* Single threaded implementation for IQueueExtent (still abstract) - Does not implement creation of
|
||||||
* chunks (that has to implemented by the platform e.g. Bukkit)
|
* chunks (that has to implemented by the platform e.g., Bukkit)
|
||||||
* <p>
|
* <p>
|
||||||
* This queue is reusable {@link #init(IChunkCache)}
|
* This queue is reusable {@link #init(IChunkCache)}
|
||||||
*/
|
*/
|
||||||
|
@ -163,7 +163,7 @@ public class AnvilCommands {
|
|||||||
"The auto-save interval is the recommended value for `file-duration` and `chunk-inactivity`"
|
"The auto-save interval is the recommended value for `file-duration` and `chunk-inactivity`"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.deleteallunvisited")
|
@CommandPermissions("worldedit.anvil.deleteallunvisited")
|
||||||
public void deleteAllUnvisited(Player player, String folder, int inhabitedTicks, @Arg(name = "filedurationmillis", desc = "int", def = "60000") int fileDurationMillis) throws WorldEditException {
|
public void deleteAllUnvisited(Player player, String folder, int inhabitedTicks, @Arg(desc = "int", def = "60000") int fileDurationMillis) throws WorldEditException {
|
||||||
// DeleteUninhabitedFilter filter = new DeleteUninhabitedFilter(fileDurationMillis, inhabitedTicks, fileDurationMillis); TODO NOT IMPLEMENTED
|
// DeleteUninhabitedFilter filter = new DeleteUninhabitedFilter(fileDurationMillis, inhabitedTicks, fileDurationMillis); TODO NOT IMPLEMENTED
|
||||||
// DeleteUninhabitedFilter result = runWithWorld(player, folder, filter, true);
|
// DeleteUninhabitedFilter result = runWithWorld(player, folder, filter, true);
|
||||||
// if (result != null) {
|
// if (result != null) {
|
||||||
@ -182,7 +182,7 @@ public class AnvilCommands {
|
|||||||
"The auto-save interval is the recommended value for `file-duration` and `chunk-inactivity`"
|
"The auto-save interval is the recommended value for `file-duration` and `chunk-inactivity`"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.deleteallunclaimed")
|
@CommandPermissions("worldedit.anvil.deleteallunclaimed")
|
||||||
public void deleteAllUnclaimed(Player player, int inhabitedTicks, @Arg(name = "filedurationmillis", desc = "int", def = "60000") int fileDurationMillis, @Switch(name = 'd', desc = "TODO") boolean debug) throws WorldEditException {
|
public void deleteAllUnclaimed(Player player, int inhabitedTicks, @Arg(desc = "int", def = "60000") int fileDurationMillis, @Switch(name = 'd', desc = "TODO") boolean debug) throws WorldEditException {
|
||||||
// String folder = player.getWorld().getName(); TODO NOT IMPLEMENTED
|
// String folder = player.getWorld().getName(); TODO NOT IMPLEMENTED
|
||||||
// DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, fileDurationMillis);
|
// DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, fileDurationMillis);
|
||||||
// if (debug) {
|
// if (debug) {
|
||||||
@ -205,7 +205,7 @@ public class AnvilCommands {
|
|||||||
"The auto-save interval is the recommended value for `file-duration` and `chunk-inactivity`"
|
"The auto-save interval is the recommended value for `file-duration` and `chunk-inactivity`"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.deleteunclaimed")
|
@CommandPermissions("worldedit.anvil.deleteunclaimed")
|
||||||
public void deleteUnclaimed(Player player, EditSession editSession, @Selection Region selection, int inhabitedTicks, @Arg(name = "filedurationmillis", desc = "int", def = "60000") int fileDurationMillis, @Switch(name = 'd', desc = "TODO") boolean debug) throws WorldEditException {
|
public void deleteUnclaimed(Player player, EditSession editSession, @Selection Region selection, int inhabitedTicks, @Arg(desc = "int", def = "60000") int fileDurationMillis, @Switch(name = 'd', desc = "TODO") boolean debug) throws WorldEditException {
|
||||||
// DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, fileDurationMillis); TODO NOT IMPLEMENTED
|
// DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, fileDurationMillis); TODO NOT IMPLEMENTED
|
||||||
// if (debug) {
|
// if (debug) {
|
||||||
// filter.enableDebug();
|
// filter.enableDebug();
|
||||||
@ -221,7 +221,7 @@ public class AnvilCommands {
|
|||||||
aliases = {"deloldreg" },
|
aliases = {"deloldreg" },
|
||||||
desc = "Delete regions which haven't been accessed in a certain amount of time",
|
desc = "Delete regions which haven't been accessed in a certain amount of time",
|
||||||
descFooter = "You can use seconds (s), minutes (m), hours (h), days (d), weeks (w), years (y)\n" +
|
descFooter = "You can use seconds (s), minutes (m), hours (h), days (d), weeks (w), years (y)\n" +
|
||||||
"(months are not a unit of time) E.g. 8h5m12s\n"
|
"(months are not a unit of time) e.g., 8h5m12s\n"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.deletealloldregions")
|
@CommandPermissions("worldedit.anvil.deletealloldregions")
|
||||||
public void deleteAllOldRegions(Player player, String folder, String time) throws WorldEditException {
|
public void deleteAllOldRegions(Player player, String folder, String time) throws WorldEditException {
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package com.boydti.fawe.command;
|
package com.boydti.fawe.command;
|
||||||
|
|
||||||
|
import static com.boydti.fawe.util.image.ImageUtil.load;
|
||||||
|
import static com.sk89q.worldedit.command.MethodCommands.getArguments;
|
||||||
|
import static com.sk89q.worldedit.util.formatting.text.TextComponent.newline;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.FaweAPI;
|
import com.boydti.fawe.FaweAPI;
|
||||||
import com.boydti.fawe.beta.implementation.filter.block.SingleFilterBlock;
|
import com.boydti.fawe.beta.implementation.filter.block.SingleFilterBlock;
|
||||||
@ -15,7 +19,6 @@ import com.boydti.fawe.util.StringMan;
|
|||||||
import com.boydti.fawe.util.TaskManager;
|
import com.boydti.fawe.util.TaskManager;
|
||||||
import com.boydti.fawe.util.TextureUtil;
|
import com.boydti.fawe.util.TextureUtil;
|
||||||
import com.boydti.fawe.util.image.ImageUtil;
|
import com.boydti.fawe.util.image.ImageUtil;
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.sk89q.minecraft.util.commands.CommandException;
|
import com.sk89q.minecraft.util.commands.CommandException;
|
||||||
@ -25,7 +28,6 @@ import com.sk89q.worldedit.WorldEdit;
|
|||||||
import com.sk89q.worldedit.WorldEditException;
|
import com.sk89q.worldedit.WorldEditException;
|
||||||
import com.sk89q.worldedit.command.util.CommandPermissions;
|
import com.sk89q.worldedit.command.util.CommandPermissions;
|
||||||
import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator;
|
import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator;
|
||||||
import com.sk89q.worldedit.command.util.PermissionCondition;
|
|
||||||
import com.sk89q.worldedit.entity.Player;
|
import com.sk89q.worldedit.entity.Player;
|
||||||
import com.sk89q.worldedit.extension.input.InputParseException;
|
import com.sk89q.worldedit.extension.input.InputParseException;
|
||||||
import com.sk89q.worldedit.extension.input.ParserContext;
|
import com.sk89q.worldedit.extension.input.ParserContext;
|
||||||
@ -37,7 +39,6 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
|||||||
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
|
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
|
||||||
import com.sk89q.worldedit.function.mask.Mask;
|
import com.sk89q.worldedit.function.mask.Mask;
|
||||||
import com.sk89q.worldedit.function.pattern.Pattern;
|
import com.sk89q.worldedit.function.pattern.Pattern;
|
||||||
import com.sk89q.worldedit.internal.command.CommandRegistrationHandler;
|
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.math.Vector3;
|
import com.sk89q.worldedit.math.Vector3;
|
||||||
import com.sk89q.worldedit.registry.state.PropertyKey;
|
import com.sk89q.worldedit.registry.state.PropertyKey;
|
||||||
@ -47,7 +48,6 @@ import com.sk89q.worldedit.util.Location;
|
|||||||
import com.sk89q.worldedit.util.formatting.component.TextComponentProducer;
|
import com.sk89q.worldedit.util.formatting.component.TextComponentProducer;
|
||||||
import com.sk89q.worldedit.util.formatting.text.TextComponent;
|
import com.sk89q.worldedit.util.formatting.text.TextComponent;
|
||||||
import com.sk89q.worldedit.util.formatting.text.TextComponent.Builder;
|
import com.sk89q.worldedit.util.formatting.text.TextComponent.Builder;
|
||||||
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;
|
|
||||||
import com.sk89q.worldedit.util.formatting.text.event.ClickEvent;
|
import com.sk89q.worldedit.util.formatting.text.event.ClickEvent;
|
||||||
import com.sk89q.worldedit.util.formatting.text.event.HoverEvent;
|
import com.sk89q.worldedit.util.formatting.text.event.HoverEvent;
|
||||||
import com.sk89q.worldedit.util.formatting.text.format.TextColor;
|
import com.sk89q.worldedit.util.formatting.text.format.TextColor;
|
||||||
@ -56,18 +56,6 @@ import com.sk89q.worldedit.world.biome.BiomeType;
|
|||||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||||
import com.sk89q.worldedit.world.block.BlockType;
|
import com.sk89q.worldedit.world.block.BlockType;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||||
import org.enginehub.piston.CommandManager;
|
|
||||||
import org.enginehub.piston.CommandManagerService;
|
|
||||||
import org.enginehub.piston.annotation.Command;
|
|
||||||
import org.enginehub.piston.annotation.CommandContainer;
|
|
||||||
import org.enginehub.piston.annotation.param.Arg;
|
|
||||||
import org.enginehub.piston.annotation.param.Switch;
|
|
||||||
import org.enginehub.piston.exception.StopExecutionException;
|
|
||||||
import org.enginehub.piston.inject.InjectedValueAccess;
|
|
||||||
import org.enginehub.piston.part.SubCommandPart;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.awt.image.DataBufferInt;
|
import java.awt.image.DataBufferInt;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
@ -85,17 +73,22 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
import static com.boydti.fawe.util.image.ImageUtil.load;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
import static com.sk89q.worldedit.command.MethodCommands.getArguments;
|
import org.enginehub.piston.annotation.Command;
|
||||||
import static com.sk89q.worldedit.util.formatting.text.TextComponent.newline;
|
import org.enginehub.piston.annotation.CommandContainer;
|
||||||
|
import org.enginehub.piston.annotation.param.Arg;
|
||||||
|
import org.enginehub.piston.annotation.param.Switch;
|
||||||
|
import org.enginehub.piston.exception.StopExecutionException;
|
||||||
|
import org.enginehub.piston.inject.InjectedValueAccess;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@CommandContainer(superTypes = CommandPermissionsConditionGenerator.Registration.class)
|
@CommandContainer(superTypes = CommandPermissionsConditionGenerator.Registration.class)
|
||||||
public class CFICommands {
|
public class CFICommands {
|
||||||
|
|
||||||
private final WorldEdit worldEdit;
|
private final WorldEdit worldEdit;
|
||||||
|
private final @NonNull TextComponent doubleNewLine = TextComponent.of("\n\n");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new instance.
|
* Create a new instance.
|
||||||
@ -252,14 +245,14 @@ public class CFICommands {
|
|||||||
desc = "Set the floor and main block"
|
desc = "Set the floor and main block"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void column(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
public void column(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
||||||
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
gen.setColumn(load(image), patternArg, !disableWhiteOnly);
|
gen.setColumn(load(image), pattern, !disableWhiteOnly);
|
||||||
} else if (maskOpt != null) {
|
} else if (mask != null) {
|
||||||
gen.setColumn(maskOpt, patternArg);
|
gen.setColumn(mask, pattern);
|
||||||
} else {
|
} else {
|
||||||
gen.setColumn(patternArg);
|
gen.setColumn(pattern);
|
||||||
}
|
}
|
||||||
player.print("Set column!");
|
player.print("Set column!");
|
||||||
assertSettings(player).resetComponent();
|
assertSettings(player).resetComponent();
|
||||||
@ -271,21 +264,21 @@ public class CFICommands {
|
|||||||
desc = "Set the floor (default: grass)"
|
desc = "Set the floor (default: grass)"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void floorCmd(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
public void floorCmd(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
||||||
floor(player, patternArg, image, maskOpt, disableWhiteOnly);
|
floor(player, pattern, image, mask, disableWhiteOnly);
|
||||||
player.print("Set floor!");
|
player.print("Set floor!");
|
||||||
assertSettings(player).resetComponent();
|
assertSettings(player).resetComponent();
|
||||||
component(player);
|
component(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void floor(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) {
|
private void floor(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) {
|
||||||
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
gen.setFloor(load(image), patternArg, !disableWhiteOnly);
|
gen.setFloor(load(image), pattern, !disableWhiteOnly);
|
||||||
} else if (maskOpt != null) {
|
} else if (mask != null) {
|
||||||
gen.setFloor(maskOpt, patternArg);
|
gen.setFloor(mask, pattern);
|
||||||
} else {
|
} else {
|
||||||
gen.setFloor(patternArg);
|
gen.setFloor(pattern);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,21 +287,21 @@ public class CFICommands {
|
|||||||
desc = "Set the main block (default: stone)"
|
desc = "Set the main block (default: stone)"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void mainCmd(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
public void mainCmd(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
||||||
main(player, patternArg, image, maskOpt, disableWhiteOnly);
|
main(player, pattern, image, maskOpt, disableWhiteOnly);
|
||||||
player.print("Set main!");
|
player.print("Set main!");
|
||||||
assertSettings(player).resetComponent();
|
assertSettings(player).resetComponent();
|
||||||
component(player);
|
component(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void main(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
public void main(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
||||||
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
gen.setMain(load(image), patternArg, !disableWhiteOnly);
|
gen.setMain(load(image), pattern, !disableWhiteOnly);
|
||||||
} else if (maskOpt != null) {
|
} else if (maskOpt != null) {
|
||||||
gen.setMain(maskOpt, patternArg);
|
gen.setMain(maskOpt, pattern);
|
||||||
} else {
|
} else {
|
||||||
gen.setMain(patternArg);
|
gen.setMain(pattern);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,17 +310,17 @@ public class CFICommands {
|
|||||||
aliases = {"setoverlay"},
|
aliases = {"setoverlay"},
|
||||||
desc = "Set the overlay block",
|
desc = "Set the overlay block",
|
||||||
descFooter = "Change the block directly above the floor (default: air)\n" +
|
descFooter = "Change the block directly above the floor (default: air)\n" +
|
||||||
"e.g. Tallgrass"
|
"e.g., Tallgrass"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void overlay(Player player, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
public void overlay(Player player, @Arg(desc = "Pattern") Pattern pattern, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
||||||
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
gen.setOverlay(load(image), patternArg, !disableWhiteOnly);
|
gen.setOverlay(load(image), pattern, !disableWhiteOnly);
|
||||||
} else if (maskOpt != null) {
|
} else if (mask != null) {
|
||||||
gen.setOverlay(maskOpt, patternArg);
|
gen.setOverlay(mask, pattern);
|
||||||
} else {
|
} else {
|
||||||
gen.setOverlay(patternArg);
|
gen.setOverlay(pattern);
|
||||||
}
|
}
|
||||||
player.print("Set overlay!");
|
player.print("Set overlay!");
|
||||||
component(player);
|
component(player);
|
||||||
@ -342,18 +335,18 @@ public class CFICommands {
|
|||||||
" - A good value for radius and iterations would be 1 8."
|
" - A good value for radius and iterations would be 1 8."
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void smoothCmd(Player player, int radius, int iterations, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
public void smoothCmd(Player player, int radius, int iterations, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
||||||
smooth(player, radius, iterations, image, maskOpt, disableWhiteOnly);
|
smooth(player, radius, iterations, image, mask, disableWhiteOnly);
|
||||||
assertSettings(player).resetComponent();
|
assertSettings(player).resetComponent();
|
||||||
component(player);
|
component(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void smooth(Player player, int radius, int iterations, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
private void smooth(Player player, int radius, int iterations, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
||||||
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
gen.smooth(load(image), !disableWhiteOnly, radius, iterations);
|
gen.smooth(load(image), !disableWhiteOnly, radius, iterations);
|
||||||
} else {
|
} else {
|
||||||
gen.smooth(maskOpt, radius, iterations);
|
gen.smooth(mask, radius, iterations);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -362,11 +355,11 @@ public class CFICommands {
|
|||||||
desc = "Create some snow"
|
desc = "Create some snow"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void snow(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
public void snow(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
||||||
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
||||||
floor(player, BlockTypes.SNOW.getDefaultState().with(PropertyKey.LAYERS, 7), image, maskOpt, disableWhiteOnly);
|
floor(player, BlockTypes.SNOW.getDefaultState().with(PropertyKey.LAYERS, 7), image, mask, disableWhiteOnly);
|
||||||
main(player, BlockTypes.SNOW_BLOCK, image, maskOpt, disableWhiteOnly);
|
main(player, BlockTypes.SNOW_BLOCK, image, mask, disableWhiteOnly);
|
||||||
smooth(player, 1, 8, image, maskOpt, disableWhiteOnly);
|
smooth(player, 1, 8, image, mask, disableWhiteOnly);
|
||||||
player.print(TextComponent.of("Added snow!"));
|
player.print(TextComponent.of("Added snow!"));
|
||||||
assertSettings(player).resetComponent();
|
assertSettings(player).resetComponent();
|
||||||
component(player);
|
component(player);
|
||||||
@ -390,7 +383,7 @@ public class CFICommands {
|
|||||||
name = "paletteblocks",
|
name = "paletteblocks",
|
||||||
desc = "Set the blocks used for coloring",
|
desc = "Set the blocks used for coloring",
|
||||||
descFooter = "Allow only specific blocks to be used for coloring\n" +
|
descFooter = "Allow only specific blocks to be used for coloring\n" +
|
||||||
"`blocks` is a list of blocks e.g. stone,bedrock,wool\n" +
|
"`blocks` is a list of blocks e.g., stone,bedrock,wool\n" +
|
||||||
"`#clipboard` will only use the blocks present in your clipboard."
|
"`#clipboard` will only use the blocks present in your clipboard."
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
@ -516,7 +509,7 @@ public class CFICommands {
|
|||||||
" - The distance is the spacing between each schematic"
|
" - The distance is the spacing between each schematic"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void schem(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask") Mask mask, String schematic, int rarity, int distance, boolean rotate)throws IOException, WorldEditException {
|
public void schem(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask") Mask mask, String schematic, int rarity, int distance, boolean rotate)throws IOException, WorldEditException {
|
||||||
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
||||||
|
|
||||||
World world = player.getWorld();
|
World world = player.getWorld();
|
||||||
@ -542,14 +535,14 @@ public class CFICommands {
|
|||||||
" - If a mask is used, the biome will be set anywhere the mask applies"
|
" - If a mask is used, the biome will be set anywhere the mask applies"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void biome(Player player, @Arg(name = "biome", desc = "Biome type") BiomeType biomeType, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
public void biome(Player player, @Arg(desc = "Biome type") BiomeType biome, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly){
|
||||||
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
HeightMapMCAGenerator gen = assertSettings(player).getGenerator();
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
gen.setBiome(load(image), biomeType, !disableWhiteOnly);
|
gen.setBiome(load(image), biome, !disableWhiteOnly);
|
||||||
} else if (maskOpt != null) {
|
} else if (mask != null) {
|
||||||
gen.setBiome(maskOpt, biomeType);
|
gen.setBiome(mask, biome);
|
||||||
} else {
|
} else {
|
||||||
gen.setBiome(biomeType);
|
gen.setBiome(biome);
|
||||||
}
|
}
|
||||||
player.print(TextComponent.of("Set biome!"));
|
player.print(TextComponent.of("Set biome!"));
|
||||||
assertSettings(player).resetComponent();
|
assertSettings(player).resetComponent();
|
||||||
@ -573,8 +566,8 @@ public class CFICommands {
|
|||||||
descFooter = "Use a specific pattern and settings to generate ore"
|
descFooter = "Use a specific pattern and settings to generate ore"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void ore(Player player, @Arg(name = "mask", desc = "Mask") Mask mask, @Arg(name = "pattern", desc = "Pattern") Pattern patternArg, int size, int frequency, int rariry, int minY, int maxY) throws WorldEditException {
|
public void ore(Player player, @Arg(desc = "Mask") Mask mask, @Arg(desc = "Pattern") Pattern pattern, int size, int frequency, int rarity, int minY, int maxY) throws WorldEditException {
|
||||||
assertSettings(player).getGenerator().addOre(mask, patternArg, size, frequency, rariry, minY, maxY);
|
assertSettings(player).getGenerator().addOre(mask, pattern, size, frequency, rarity, minY, maxY);
|
||||||
player.print(TextComponent.of("Added ore!"));
|
player.print(TextComponent.of("Added ore!"));
|
||||||
populate(player);
|
populate(player);
|
||||||
}
|
}
|
||||||
@ -584,7 +577,7 @@ public class CFICommands {
|
|||||||
desc = "Generate the vanilla ores"
|
desc = "Generate the vanilla ores"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void ores(Player player, @Arg(name = "mask", desc = "Mask") Mask mask) throws WorldEditException {
|
public void ores(Player player, @Arg(desc = "Mask") Mask mask) throws WorldEditException {
|
||||||
assertSettings(player).getGenerator().addDefaultOres(mask);
|
assertSettings(player).getGenerator().addDefaultOres(mask);
|
||||||
player.print(TextComponent.of("Added ores!"));
|
player.print(TextComponent.of("Added ores!"));
|
||||||
populate(player);
|
populate(player);
|
||||||
@ -609,7 +602,7 @@ public class CFICommands {
|
|||||||
|
|
||||||
@Command(
|
@Command(
|
||||||
name = "water",
|
name = "water",
|
||||||
desc = "Change the block used for water\ne.g. Lava"
|
desc = "Change the block used for water\n e.g., Lava"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void waterId(Player player, @Arg(desc = "block") BlockStateHolder block) throws WorldEditException {
|
public void waterId(Player player, @Arg(desc = "block") BlockStateHolder block) throws WorldEditException {
|
||||||
@ -642,8 +635,8 @@ public class CFICommands {
|
|||||||
" - A value of 0 is the default and will not modify the height"
|
" - A value of 0 is the default and will not modify the height"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void worldthickness(Player player, @Arg(name = "height", desc = "brush height") int heightArg) throws WorldEditException {
|
public void worldthickness(Player player, @Arg(desc = "brush height") int height) throws WorldEditException {
|
||||||
assertSettings(player).getGenerator().setWorldThickness(heightArg);
|
assertSettings(player).getGenerator().setWorldThickness(height);
|
||||||
player.print("Set world thickness!");
|
player.print("Set world thickness!");
|
||||||
component(player);
|
component(player);
|
||||||
}
|
}
|
||||||
@ -655,8 +648,8 @@ public class CFICommands {
|
|||||||
" - A value of 0 is the default and will only set the top block"
|
" - A value of 0 is the default and will only set the top block"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void floorthickness(Player player, @Arg(name = "height", desc = "brush height") int heightArg) throws WorldEditException {
|
public void floorthickness(Player player, @Arg( desc = "brush height") int height) throws WorldEditException {
|
||||||
assertSettings(player).getGenerator().setFloorThickness(heightArg);
|
assertSettings(player).getGenerator().setFloorThickness(height);
|
||||||
player.print("Set floor thickness!");
|
player.print("Set floor thickness!");
|
||||||
component(player);
|
component(player);
|
||||||
}
|
}
|
||||||
@ -696,8 +689,8 @@ public class CFICommands {
|
|||||||
" - By default water is disabled (with a value of 0)"
|
" - By default water is disabled (with a value of 0)"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void waterheight(Player player, @Arg(name = "height", desc = "brush height") int heightArg) throws WorldEditException {
|
public void waterheight(Player player, @Arg(desc = "brush height") int height) throws WorldEditException {
|
||||||
assertSettings(player).getGenerator().setWaterHeight(heightArg);
|
assertSettings(player).getGenerator().setWaterHeight(height);
|
||||||
player.print("Set water height!");
|
player.print("Set water height!");
|
||||||
component(player);
|
component(player);
|
||||||
}
|
}
|
||||||
@ -709,7 +702,7 @@ public class CFICommands {
|
|||||||
)
|
)
|
||||||
// ![79,174,212,5:3,5:4,18,161,20]
|
// ![79,174,212,5:3,5:4,18,161,20]
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void glass(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
|
public void glass(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
|
||||||
CFISettings settings = assertSettings(player);
|
CFISettings settings = assertSettings(player);
|
||||||
settings.getGenerator().setColorWithGlass(load(image));
|
settings.getGenerator().setColorWithGlass(load(image));
|
||||||
player.print("Set color with glass!");
|
player.print("Set color with glass!");
|
||||||
@ -726,13 +719,13 @@ public class CFICommands {
|
|||||||
"The -w (disableWhiteOnly) will randomly apply depending on the pixel luminance"
|
"The -w (disableWhiteOnly) will randomly apply depending on the pixel luminance"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void color(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
|
public void color(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
|
||||||
CFISettings settings = assertSettings(player);
|
CFISettings settings = assertSettings(player);
|
||||||
HeightMapMCAGenerator gen = settings.getGenerator();
|
HeightMapMCAGenerator gen = settings.getGenerator();
|
||||||
if (imageMask != null) {
|
if (imageMask != null) {
|
||||||
gen.setColor(load(image), load(imageMask), !disableWhiteOnly);
|
gen.setColor(load(image), load(imageMask), !disableWhiteOnly);
|
||||||
} else if (maskOpt != null) {
|
} else if (mask != null) {
|
||||||
gen.setColor(load(image), maskOpt);
|
gen.setColor(load(image), mask);
|
||||||
} else {
|
} else {
|
||||||
gen.setColor(load(image));
|
gen.setColor(load(image));
|
||||||
}
|
}
|
||||||
@ -750,9 +743,9 @@ public class CFICommands {
|
|||||||
"The -w (disableWhiteOnly) will randomly apply depending on the pixel luminance"
|
"The -w (disableWhiteOnly) will randomly apply depending on the pixel luminance"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void blockbiome(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
|
public void blockbiome(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
|
||||||
CFISettings settings = assertSettings(player);
|
CFISettings settings = assertSettings(player);
|
||||||
settings.getGenerator().setBlockAndBiomeColor(load(image), maskOpt, load(imageMask), !disableWhiteOnly);
|
settings.getGenerator().setBlockAndBiomeColor(load(image), mask, load(imageMask), !disableWhiteOnly);
|
||||||
player.print(TextComponent.of("Set color with blocks and biomes!"));
|
player.print(TextComponent.of("Set color with blocks and biomes!"));
|
||||||
settings.resetColoring();
|
settings.resetColoring();
|
||||||
mainMenu(player);
|
mainMenu(player);
|
||||||
@ -766,7 +759,7 @@ public class CFICommands {
|
|||||||
" - If you changed the block to something other than grass you will not see anything."
|
" - If you changed the block to something other than grass you will not see anything."
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void biomecolor(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
|
public void biomecolor(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri image, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly) throws WorldEditException {
|
||||||
CFISettings settings = assertSettings(player);
|
CFISettings settings = assertSettings(player);
|
||||||
settings.getGenerator().setBiomeColor(load(image));
|
settings.getGenerator().setBiomeColor(load(image));
|
||||||
player.print(TextComponent.of("Set color with biomes!"));
|
player.print(TextComponent.of("Set color with biomes!"));
|
||||||
@ -821,17 +814,28 @@ public class CFICommands {
|
|||||||
String blockList = materials.size() > 100 ? materials.size() + " blocks" : StringMan.join(materials, ',');
|
String blockList = materials.size() > 100 ? materials.size() + " blocks" : StringMan.join(materials, ',');
|
||||||
|
|
||||||
int biomePriority = gen.getBiomePriority();
|
int biomePriority = gen.getBiomePriority();
|
||||||
|
TextComponent.empty().clickEvent(ClickEvent.runCommand(
|
||||||
//TODO fix this so it can execute commands and show tooltips.
|
"/cfi randomization " + !rand)).hoverEvent(HoverEvent.showText(
|
||||||
@NotNull Builder builder = TextComponent.builder(">> Current Settings <<").append(newline())
|
TextComponent.of("/cfi randomization " + !rand)));
|
||||||
.append("Randomization ").append("[" + Boolean.toString(rand).toUpperCase() + "]")//.cmdTip("/cfi randomization " + (!rand))
|
@NotNull Builder builder = TextComponent.builder(">> Current Settings <<");
|
||||||
.append(newline())
|
builder.append(newline());
|
||||||
.append("Mask ").append("[" + mask + "]")//.cmdTip("/cfi mask")
|
builder.append(TextComponent.of("Randomization [" + Boolean.toString(rand).toUpperCase() + "]")
|
||||||
.append(newline())
|
.clickEvent(ClickEvent.runCommand(
|
||||||
.append("Blocks ").append("[" + blocks + "]")//.tooltip(blockList).command("/cfi paletteBlocks")
|
"/cfi randomization " + !rand)).hoverEvent(HoverEvent.showText(
|
||||||
.append(newline())
|
TextComponent.of("/cfi randomization " + !rand))));
|
||||||
.append("BiomePriority ").append("[" + biomePriority + "]")//.cmdTip("/cfi biomepriority")
|
builder.append(newline());
|
||||||
.append(newline());
|
builder.append(TextComponent.of("Mask [" + mask + "]").clickEvent(ClickEvent.runCommand(
|
||||||
|
"/cfi mask")).hoverEvent(HoverEvent.showText(
|
||||||
|
TextComponent.of("/cfi mask"))));
|
||||||
|
builder.append(newline());
|
||||||
|
builder.append(TextComponent.of("Blocks [" + blocks + "]").clickEvent(ClickEvent.runCommand(
|
||||||
|
"/cfi mask")).hoverEvent(HoverEvent.showText(
|
||||||
|
TextComponent.of("/cfi mask"))));
|
||||||
|
builder.append(newline());
|
||||||
|
builder.append(TextComponent.of("Biome Priority [" + biomePriority + "]").clickEvent(ClickEvent.runCommand(
|
||||||
|
"/cfi mask")).hoverEvent(HoverEvent.showText(
|
||||||
|
TextComponent.of("/cfi biomepriority"))));
|
||||||
|
builder.append(newline());
|
||||||
|
|
||||||
if (settings.image != null) {
|
if (settings.image != null) {
|
||||||
StringBuilder colorArgs = new StringBuilder(" " + settings.imageArg);
|
StringBuilder colorArgs = new StringBuilder(" " + settings.imageArg);
|
||||||
@ -845,6 +849,7 @@ public class CFICommands {
|
|||||||
colorArgs.append(" -w");
|
colorArgs.append(" -w");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO
|
||||||
builder.append("Image: ")
|
builder.append("Image: ")
|
||||||
.append("[" + settings.imageArg + "]")//.cmdTip("/cfi " + Commands.getAlias(CFICommands.class, "image"))
|
.append("[" + settings.imageArg + "]")//.cmdTip("/cfi " + Commands.getAlias(CFICommands.class, "image"))
|
||||||
.append(newline()).append(newline())
|
.append(newline()).append(newline())
|
||||||
@ -857,7 +862,7 @@ public class CFICommands {
|
|||||||
.append("You MUST provide an image: ")
|
.append("You MUST provide an image: ")
|
||||||
.append("[None]");//.cmdTip("/cfi " + Commands.getAlias(Command.class, "image")).append(newline());
|
.append("[None]");//.cmdTip("/cfi " + Commands.getAlias(Command.class, "image")).append(newline());
|
||||||
}
|
}
|
||||||
builder.append("< [Back]");//.cmdTip(alias()).send(fp);
|
builder.append("< [Back]");//.cmdTip(alias()).send(player);
|
||||||
player.print(builder.build());
|
player.print(builder.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -866,14 +871,14 @@ public class CFICommands {
|
|||||||
desc = "Select a mask"
|
desc = "Select a mask"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void mask(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(name = "mask", desc = "Mask", def = "") Mask maskOpt, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly, InjectedValueAccess context){
|
public void mask(Player player, @Arg(def = "", desc = "image url or filename") ProvideBindings.ImageUri imageMask, @Arg(desc = "Mask", def = "") Mask mask, @Switch(name = 'w', desc = "TODO") boolean disableWhiteOnly, InjectedValueAccess context){
|
||||||
CFISettings settings = assertSettings(player);
|
CFISettings settings = assertSettings(player);
|
||||||
String[] split = getArguments(context).split(" ");
|
String[] split = getArguments(context).split(" ");
|
||||||
int index = 2;
|
int index = 2;
|
||||||
settings.imageMask = imageMask;
|
settings.imageMask = imageMask;
|
||||||
settings.imageMaskArg = imageMask != null ? split[index++] : null;
|
settings.imageMaskArg = imageMask != null ? split[index++] : null;
|
||||||
settings.mask = maskOpt;
|
settings.mask = mask;
|
||||||
settings.maskArg = maskOpt != null ? split[index++] : null;
|
settings.maskArg = mask != null ? split[index++] : null;
|
||||||
settings.whiteOnly = !disableWhiteOnly;
|
settings.whiteOnly = !disableWhiteOnly;
|
||||||
|
|
||||||
String s = "/cfi mask http://";
|
String s = "/cfi mask http://";
|
||||||
@ -901,16 +906,16 @@ public class CFICommands {
|
|||||||
desc = "Select a pattern"
|
desc = "Select a pattern"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.anvil.cfi")
|
@CommandPermissions("worldedit.anvil.cfi")
|
||||||
public void pattern(Player player, @Arg(name = "pattern", desc = "Pattern", def = "") Pattern patternArg, InjectedValueAccess context)throws CommandException {
|
public void pattern(Player player, @Arg(desc = "Pattern", def = "") Pattern pattern, InjectedValueAccess context)throws CommandException {
|
||||||
CFISettings settings = assertSettings(player);
|
CFISettings settings = assertSettings(player);
|
||||||
String[] split = getArguments(context).split(" ");
|
String[] split = getArguments(context).split(" ");
|
||||||
int index = 2;
|
int index = 2;
|
||||||
settings.pattern = patternArg;
|
settings.pattern = pattern;
|
||||||
settings.patternArg = patternArg == null ? null : split[index++];
|
settings.patternArg = pattern == null ? null : split[index++];
|
||||||
|
|
||||||
StringBuilder cmd = new StringBuilder("/cfi pattern ");
|
StringBuilder cmd = new StringBuilder("/cfi pattern ");
|
||||||
|
|
||||||
if (patternArg != null) {
|
if (pattern != null) {
|
||||||
settings.getCategory().accept(player);
|
settings.getCategory().accept(player);
|
||||||
} else {
|
} else {
|
||||||
String s = cmd + " stone";
|
String s = cmd + " stone";
|
||||||
@ -1043,8 +1048,7 @@ public class CFICommands {
|
|||||||
.append("Pattern ").append(TextComponent.of("[" + pattern + "]")
|
.append("Pattern ").append(TextComponent.of("[" + pattern + "]")
|
||||||
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi pattern")))
|
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi pattern")))
|
||||||
.clickEvent(ClickEvent.runCommand("/cfi pattern")))
|
.clickEvent(ClickEvent.runCommand("/cfi pattern")))
|
||||||
.append(newline())
|
.append(doubleNewLine)
|
||||||
.append(newline())
|
|
||||||
.append(">> Components <<")
|
.append(">> Components <<")
|
||||||
.append(newline())
|
.append(newline())
|
||||||
.append(TextComponent.of("[Height]")
|
.append(TextComponent.of("[Height]")
|
||||||
@ -1067,39 +1071,58 @@ public class CFICommands {
|
|||||||
|
|
||||||
if (pattern != null) {
|
if (pattern != null) {
|
||||||
String disabled = "You must specify a pattern";
|
String disabled = "You must specify a pattern";
|
||||||
msg.append(TextComponent.of("[WaterId]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline())
|
msg.append(TextComponent.of("[WaterId]", TextColor.RED)
|
||||||
.append(TextComponent.of("[BedrockId]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
|
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
|
||||||
.append(TextComponent.of("[Floor]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
|
msg.append(newline());
|
||||||
.append(TextComponent.of("[Main]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
|
msg.append(TextComponent.of("[BedrockId]", TextColor.RED)
|
||||||
.append(TextComponent.of("[Column]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline())
|
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
|
||||||
.append(TextComponent.of("[Overlay]", TextColor.RED).hoverEvent(HoverEvent.showText(TextComponent.of(disabled)))).append(newline()).append(newline());
|
msg.append(doubleNewLine);
|
||||||
|
msg.append(TextComponent.of("[Floor]", TextColor.RED)
|
||||||
|
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
|
||||||
|
msg.append(doubleNewLine);
|
||||||
|
msg.append(TextComponent.of("[Main]", TextColor.RED)
|
||||||
|
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
|
||||||
|
msg.append(doubleNewLine);
|
||||||
|
msg.append(TextComponent.of("[Column]", TextColor.RED)
|
||||||
|
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
|
||||||
|
msg.append(doubleNewLine);
|
||||||
|
msg.append(TextComponent.of("[Overlay]", TextColor.RED)
|
||||||
|
.hoverEvent(HoverEvent.showText(TextComponent.of(disabled))));
|
||||||
|
msg.append(doubleNewLine);
|
||||||
} else {
|
} else {
|
||||||
StringBuilder compArgs = new StringBuilder();
|
StringBuilder compArgs = new StringBuilder();
|
||||||
compArgs.append(" " + settings.patternArg + maskArgs);
|
compArgs.append(" " + settings.patternArg + maskArgs);
|
||||||
|
|
||||||
msg
|
msg.append(TextComponent.of("[WaterId]")
|
||||||
.append(TextComponent.of("[WaterId]")
|
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi waterId " + pattern)))
|
||||||
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi waterId " + pattern)))
|
.clickEvent(ClickEvent.runCommand("/cfi waterId " + pattern)));
|
||||||
.clickEvent(ClickEvent.runCommand("/cfi waterId " + pattern)))
|
msg.append(" - Water id for whole map");
|
||||||
.append(" - Water id for whole map")
|
msg.append(newline());
|
||||||
.append(newline())
|
msg.append(TextComponent.of("[BedrockId]")
|
||||||
.append(TextComponent.of("[BedrockId]")
|
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi baseId " + pattern)))
|
||||||
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi baseId " + pattern)))
|
.clickEvent(ClickEvent.runCommand("/cfi baseId " + pattern)));
|
||||||
.clickEvent(ClickEvent.runCommand("/cfi baseId " + pattern)))
|
msg.append(TextComponent.of(" - Bedrock id for whole map"));
|
||||||
.append(TextComponent.of(" - Bedrock id for whole map"))
|
msg.append(newline());
|
||||||
.append(newline())
|
msg.append(TextComponent.of("[Floor]")
|
||||||
.append(TextComponent.of("[Floor]")
|
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi floor " + compArgs)))
|
||||||
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi floor " + compArgs)))
|
.clickEvent(ClickEvent.runCommand("/cfi floor " + compArgs)));
|
||||||
.clickEvent(ClickEvent.runCommand("/cfi floor " + compArgs)))
|
msg.append(TextComponent.of(" - Set the floor in the masked areas"));
|
||||||
.append(TextComponent.of(" - Set the floor in the masked areas")).append(newline())
|
msg.append(newline());
|
||||||
.append(TextComponent.of("[Main]")
|
msg.append(TextComponent.of("[Main]")
|
||||||
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi main " + compArgs)))
|
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi main " + compArgs)))
|
||||||
.clickEvent(ClickEvent.runCommand("/cfi main " + compArgs)))
|
.clickEvent(ClickEvent.runCommand("/cfi main " + compArgs)));
|
||||||
.append(TextComponent.of(" - Set the main block in the masked areas")).append(newline())
|
msg.append(TextComponent.of(" - Set the main block in the masked areas"));
|
||||||
.append(TextComponent.of("[Column]").hoverEvent(HoverEvent.showText(TextComponent.of("/cfi column" + compArgs)))
|
msg.append(newline());
|
||||||
.clickEvent(ClickEvent.runCommand("/cfi column" + compArgs))).append(" - Set the columns in the masked areas").append(newline())
|
msg.append(TextComponent.of("[Column]")
|
||||||
.append(TextComponent.of("[Overlay]").hoverEvent(HoverEvent.showText(TextComponent.of("/cfi overlay" + compArgs)))
|
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi column" + compArgs)))
|
||||||
.clickEvent(ClickEvent.runCommand("/cfi overlay" + compArgs))).append(" - Set the overlay in the masked areas").append(newline());
|
.clickEvent(ClickEvent.runCommand("/cfi column" + compArgs)));
|
||||||
|
msg.append(" - Set the columns in the masked areas");
|
||||||
|
msg.append(newline());
|
||||||
|
msg.append(TextComponent.of("[Overlay]")
|
||||||
|
.hoverEvent(HoverEvent.showText(TextComponent.of("/cfi overlay" + compArgs)))
|
||||||
|
.clickEvent(ClickEvent.runCommand("/cfi overlay" + compArgs)));
|
||||||
|
msg.append(" - Set the overlay in the masked areas");
|
||||||
|
msg.append(newline());
|
||||||
}
|
}
|
||||||
|
|
||||||
msg.append(newline())
|
msg.append(newline())
|
||||||
@ -1263,17 +1286,19 @@ public class CFICommands {
|
|||||||
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of(option))));
|
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of(option))));
|
||||||
}
|
}
|
||||||
producer.newline();
|
producer.newline();
|
||||||
producer.newline().append(TextComponent.of("<> [View]", TextColor.DARK_AQUA)
|
producer.newline();
|
||||||
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "download"))
|
producer.append(TextComponent.of("<> [View]", TextColor.DARK_AQUA)
|
||||||
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("View full res image"))));
|
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "download"))
|
||||||
|
.hoverEvent(HoverEvent
|
||||||
producer.newline().append(TextComponent.of(">< [Cancel]", TextColor.RED)
|
.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("View full res image"))));
|
||||||
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "cancel"))
|
producer.newline();
|
||||||
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("cancel"))));
|
producer.append(TextComponent.of(">< [Cancel]", TextColor.RED)
|
||||||
|
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "cancel"))
|
||||||
producer.newline().append(TextComponent.of(">> [Done]", TextColor.DARK_GREEN)
|
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("cancel"))));
|
||||||
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "done"))
|
producer.newline();
|
||||||
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("done"))));
|
producer.append(TextComponent.of(">> [Done]", TextColor.DARK_GREEN)
|
||||||
|
.clickEvent(ClickEvent.of(ClickEvent.Action.RUN_COMMAND, prefix + "done"))
|
||||||
|
.hoverEvent(HoverEvent.of(HoverEvent.Action.SHOW_TEXT, TextComponent.of("done"))));
|
||||||
|
|
||||||
actor.print(producer.create());
|
actor.print(producer.create());
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.boydti.fawe.config;
|
package com.boydti.fawe.config;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.configuration.MemorySection;
|
import com.boydti.fawe.configuration.MemorySection;
|
||||||
import com.boydti.fawe.configuration.file.YamlConfiguration;
|
import com.boydti.fawe.configuration.file.YamlConfiguration;
|
||||||
import com.sk89q.worldedit.extension.platform.Actor;
|
import com.sk89q.worldedit.extension.platform.Actor;
|
||||||
@ -114,7 +115,7 @@ public enum BBC {
|
|||||||
BRUSH_TARGET_MASK_SET("Set target mask to %s0", "WorldEdit.Brush"),
|
BRUSH_TARGET_MASK_SET("Set target mask to %s0", "WorldEdit.Brush"),
|
||||||
BRUSH_TARGET_OFFSET_SET("Set target offset to %s0", "WorldEdit.Brush"),
|
BRUSH_TARGET_OFFSET_SET("Set target offset to %s0", "WorldEdit.Brush"),
|
||||||
BRUSH_EQUIPPED("Equipped brush %s0", "WorldEdit.Brush"),
|
BRUSH_EQUIPPED("Equipped brush %s0", "WorldEdit.Brush"),
|
||||||
BRUSH_TRY_OTHER("There are other more suitable brushes e.g.\n - //br height [radius=5] [#clipboard|file=null] [rotation=0] [yscale=1.00]", "WorldEdit.Brush"),
|
BRUSH_TRY_OTHER("There are other more suitable brushes e.g.,\n - //br height [radius=5] [#clipboard|file=null] [rotation=0] [yscale=1.00]", "WorldEdit.Brush"),
|
||||||
BRUSH_COPY("Left click the base of an object to copy, right click to paste. Increase the brush radius if necessary.", "WorldEdit.Brush"),
|
BRUSH_COPY("Left click the base of an object to copy, right click to paste. Increase the brush radius if necessary.", "WorldEdit.Brush"),
|
||||||
BRUSH_HEIGHT_INVALID("Invalid height map file (%s0)", "WorldEdit.Brush"),
|
BRUSH_HEIGHT_INVALID("Invalid height map file (%s0)", "WorldEdit.Brush"),
|
||||||
BRUSH_SMOOTH("Note: Use the blend brush if you want to smooth overhangs or caves.", "WorldEdit.Brush"),
|
BRUSH_SMOOTH("Note: Use the blend brush if you want to smooth overhangs or caves.", "WorldEdit.Brush"),
|
||||||
@ -484,7 +485,7 @@ public enum BBC {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (actor == null) {
|
if (actor == null) {
|
||||||
Fawe.debug(this.format(args));
|
getLogger(BBC.class).debug(this.format(args));
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
Method method = actor.getClass().getMethod("print", String.class);
|
Method method = actor.getClass().getMethod("print", String.class);
|
||||||
@ -501,7 +502,7 @@ public enum BBC {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
Fawe.debug(this.format(args));
|
getLogger(BBC.class).debug(this.format(args));
|
||||||
} else {
|
} else {
|
||||||
player.print(this.format(args));
|
player.print(this.format(args));
|
||||||
}
|
}
|
||||||
|
@ -20,9 +20,13 @@ import java.util.Collection;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
public class Config {
|
public class Config {
|
||||||
|
|
||||||
|
private final Logger log = LoggerFactory.getLogger(Config.class);
|
||||||
|
|
||||||
public Config() {
|
public Config() {
|
||||||
save(new PrintWriter(new ByteArrayOutputStream(0)), getClass(), this, 0);
|
save(new PrintWriter(new ByteArrayOutputStream(0)), getClass(), this, 0);
|
||||||
}
|
}
|
||||||
@ -48,7 +52,7 @@ public class Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Fawe.debug("Failed to get config option: " + key);
|
log.debug("Failed to get config option: " + key);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +84,7 @@ public class Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Fawe.debug("Failed to set config option: " + key + ": " + value + " | " + instance + " | " + root.getSimpleName() + ".yml");
|
log.debug("Failed to set config option: " + key + ": " + value + " | " + instance + " | " + root.getSimpleName() + ".yml");
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean load(File file) {
|
public boolean load(File file) {
|
||||||
@ -339,8 +343,8 @@ public class Config {
|
|||||||
Field field = instance.getClass().getField(toFieldName(split[split.length - 1]));
|
Field field = instance.getClass().getField(toFieldName(split[split.length - 1]));
|
||||||
setAccessible(field);
|
setAccessible(field);
|
||||||
return field;
|
return field;
|
||||||
} catch (Throwable e) {
|
} catch (Throwable ignored) {
|
||||||
Fawe.debug("Invalid config field: " + StringMan.join(split, ".") + " for " + toNodeName(instance.getClass().getSimpleName()));
|
log.debug("Invalid config field: " + StringMan.join(split, ".") + " for " + toNodeName(instance.getClass().getSimpleName()));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,16 @@
|
|||||||
package com.boydti.fawe.database;
|
package com.boydti.fawe.database;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.config.Config;
|
||||||
import com.sk89q.worldedit.world.World;
|
import com.sk89q.worldedit.world.World;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
public class DBHandler {
|
public class DBHandler {
|
||||||
|
|
||||||
|
private final Logger log = LoggerFactory.getLogger(Config.class);
|
||||||
|
|
||||||
public final static DBHandler IMP = new DBHandler();
|
public final static DBHandler IMP = new DBHandler();
|
||||||
|
|
||||||
private Map<String, RollbackDatabase> databases = new ConcurrentHashMap<>(8, 0.9f, 1);
|
private Map<String, RollbackDatabase> databases = new ConcurrentHashMap<>(8, 0.9f, 1);
|
||||||
@ -21,11 +26,7 @@ public class DBHandler {
|
|||||||
databases.put(worldName, database);
|
databases.put(worldName, database);
|
||||||
return database;
|
return database;
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Fawe.debug("============ NO JDBC DRIVER! ============");
|
log.error("No JDBC driver found!\n TODO: Bundle driver with FAWE (or disable database)", e);
|
||||||
Fawe.debug("TODO: Bundle driver with FAWE (or disable database)");
|
|
||||||
Fawe.debug("=========================================");
|
|
||||||
e.printStackTrace();
|
|
||||||
Fawe.debug("=========================================");
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,9 +22,14 @@ import java.sql.SQLException;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
public class RollbackDatabase extends AsyncNotifyQueue {
|
public class RollbackDatabase extends AsyncNotifyQueue {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(RollbackDatabase.class);
|
||||||
|
|
||||||
private final String prefix;
|
private final String prefix;
|
||||||
private final File dbLocation;
|
private final File dbLocation;
|
||||||
private final String worldName;
|
private final String worldName;
|
||||||
@ -113,27 +118,55 @@ public class RollbackDatabase extends AsyncNotifyQueue {
|
|||||||
public void purge(int diff) {
|
public void purge(int diff) {
|
||||||
long now = System.currentTimeMillis() / 1000;
|
long now = System.currentTimeMillis() / 1000;
|
||||||
final int then = (int) (now - diff);
|
final int then = (int) (now - diff);
|
||||||
addTask(new Runnable() {
|
addTask(() -> {
|
||||||
@Override
|
try (PreparedStatement stmt = connection.prepareStatement(PURGE)) {
|
||||||
public void run() {
|
stmt.setInt(1, then);
|
||||||
try (PreparedStatement stmt = connection.prepareStatement(PURGE)) {
|
stmt.executeUpdate();
|
||||||
stmt.setInt(1, then);
|
} catch (SQLException e) {
|
||||||
stmt.executeUpdate();
|
e.printStackTrace();
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void getPotentialEdits(UUID uuid, long minTime, BlockVector3 pos1, BlockVector3 pos2, RunnableVal<DiskStorageHistory> onEach, Runnable whenDone, boolean delete, boolean ascending) {
|
public void getPotentialEdits(UUID uuid, long minTime, BlockVector3 pos1, BlockVector3 pos2, RunnableVal<DiskStorageHistory> onEach, Runnable whenDone, boolean delete, boolean ascending) {
|
||||||
final World world = FaweAPI.getWorld(this.worldName);
|
final World world = FaweAPI.getWorld(this.worldName);
|
||||||
addTask(new Runnable() {
|
addTask(() -> {
|
||||||
@Override
|
String stmtStr = ascending ? uuid == null ? GET_EDITS_ASC : GET_EDITS_USER_ASC :
|
||||||
public void run() {
|
uuid == null ? GET_EDITS : GET_EDITS_USER;
|
||||||
String stmtStr = ascending ? uuid == null ? GET_EDITS_ASC : GET_EDITS_USER_ASC :
|
try (PreparedStatement stmt = connection.prepareStatement(stmtStr)) {
|
||||||
uuid == null ? GET_EDITS : GET_EDITS_USER;
|
stmt.setInt(1, pos1.getBlockX());
|
||||||
try (PreparedStatement stmt = connection.prepareStatement(stmtStr)) {
|
stmt.setInt(2, pos2.getBlockX());
|
||||||
|
stmt.setByte(3, (byte) (pos1.getBlockY() - 128));
|
||||||
|
stmt.setByte(4, (byte) (pos2.getBlockY() - 128));
|
||||||
|
stmt.setInt(5, pos1.getBlockZ());
|
||||||
|
stmt.setInt(6, pos2.getBlockZ());
|
||||||
|
stmt.setInt(7, (int) (minTime / 1000));
|
||||||
|
if (uuid != null) {
|
||||||
|
byte[] uuidBytes = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits()).array();
|
||||||
|
stmt.setBytes(8, uuidBytes);
|
||||||
|
}
|
||||||
|
ResultSet result = stmt.executeQuery();
|
||||||
|
if (!result.next()) {
|
||||||
|
TaskManager.IMP.taskNow(whenDone, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
byte[] uuidBytes = result.getBytes(1);
|
||||||
|
int index = result.getInt(2);
|
||||||
|
ByteBuffer bb = ByteBuffer.wrap(uuidBytes);
|
||||||
|
long high = bb.getLong();
|
||||||
|
long low = bb.getLong();
|
||||||
|
DiskStorageHistory history = new DiskStorageHistory(world, new UUID(high, low), index);
|
||||||
|
if (history.getBDFile().exists()) {
|
||||||
|
onEach.run(history);
|
||||||
|
}
|
||||||
|
} while (result.next());
|
||||||
|
TaskManager.IMP.taskNow(whenDone, false);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if (delete && uuid != null) {
|
||||||
|
try (PreparedStatement stmt = connection.prepareStatement(DELETE_EDITS_USER)) {
|
||||||
stmt.setInt(1, pos1.getBlockX());
|
stmt.setInt(1, pos1.getBlockX());
|
||||||
stmt.setInt(2, pos2.getBlockX());
|
stmt.setInt(2, pos2.getBlockX());
|
||||||
stmt.setByte(3, (byte) (pos1.getBlockY() - 128));
|
stmt.setByte(3, (byte) (pos1.getBlockY() - 128));
|
||||||
@ -141,45 +174,11 @@ public class RollbackDatabase extends AsyncNotifyQueue {
|
|||||||
stmt.setInt(5, pos1.getBlockZ());
|
stmt.setInt(5, pos1.getBlockZ());
|
||||||
stmt.setInt(6, pos2.getBlockZ());
|
stmt.setInt(6, pos2.getBlockZ());
|
||||||
stmt.setInt(7, (int) (minTime / 1000));
|
stmt.setInt(7, (int) (minTime / 1000));
|
||||||
if (uuid != null) {
|
byte[] uuidBytes = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits()).array();
|
||||||
byte[] uuidBytes = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits()).array();
|
stmt.setBytes(8, uuidBytes);
|
||||||
stmt.setBytes(8, uuidBytes);
|
|
||||||
}
|
|
||||||
ResultSet result = stmt.executeQuery();
|
|
||||||
if (!result.next()) {
|
|
||||||
TaskManager.IMP.taskNow(whenDone, false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
byte[] uuidBytes = result.getBytes(1);
|
|
||||||
int index = result.getInt(2);
|
|
||||||
ByteBuffer bb = ByteBuffer.wrap(uuidBytes);
|
|
||||||
long high = bb.getLong();
|
|
||||||
long low = bb.getLong();
|
|
||||||
DiskStorageHistory history = new DiskStorageHistory(world, new UUID(high, low), index);
|
|
||||||
if (history.getBDFile().exists()) {
|
|
||||||
onEach.run(history);
|
|
||||||
}
|
|
||||||
} while (result.next());
|
|
||||||
TaskManager.IMP.taskNow(whenDone, false);
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
if (delete && uuid != null) {
|
|
||||||
try (PreparedStatement stmt = connection.prepareStatement(DELETE_EDITS_USER)) {
|
|
||||||
stmt.setInt(1, pos1.getBlockX());
|
|
||||||
stmt.setInt(2, pos2.getBlockX());
|
|
||||||
stmt.setByte(3, (byte) (pos1.getBlockY() - 128));
|
|
||||||
stmt.setByte(4, (byte) (pos2.getBlockY() - 128));
|
|
||||||
stmt.setInt(5, pos1.getBlockZ());
|
|
||||||
stmt.setInt(6, pos2.getBlockZ());
|
|
||||||
stmt.setInt(7, (int) (minTime / 1000));
|
|
||||||
byte[] uuidBytes = ByteBuffer.allocate(16).putLong(uuid.getMostSignificantBits()).putLong(uuid.getLeastSignificantBits()).array();
|
|
||||||
stmt.setBytes(8, uuidBytes);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -216,10 +215,8 @@ public class RollbackDatabase extends AsyncNotifyQueue {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
RollbackOptimizedHistory[] copy = new RollbackOptimizedHistory[size];
|
RollbackOptimizedHistory[] copy = IntStream.range(0, size)
|
||||||
for (int i = 0; i < size; i++) {
|
.mapToObj(i -> historyChanges.poll()).toArray(RollbackOptimizedHistory[]::new);
|
||||||
copy[i] = historyChanges.poll();
|
|
||||||
}
|
|
||||||
|
|
||||||
try (PreparedStatement stmt = connection.prepareStatement(INSERT_EDIT)) {
|
try (PreparedStatement stmt = connection.prepareStatement(INSERT_EDIT)) {
|
||||||
for (RollbackOptimizedHistory change : copy) {
|
for (RollbackOptimizedHistory change : copy) {
|
||||||
@ -276,7 +273,7 @@ public class RollbackDatabase extends AsyncNotifyQueue {
|
|||||||
dbLocation.createNewFile();
|
dbLocation.createNewFile();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Fawe.debug("&cUnable to create database!");
|
log.debug("Unable to create the database!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Class.forName("org.sqlite.JDBC");
|
Class.forName("org.sqlite.JDBC");
|
||||||
@ -330,7 +327,6 @@ public class RollbackDatabase extends AsyncNotifyQueue {
|
|||||||
* Checks if a connection is open with the database
|
* Checks if a connection is open with the database
|
||||||
*
|
*
|
||||||
* @return true if the connection is open
|
* @return true if the connection is open
|
||||||
* @throws SQLException if the connection cannot be checked
|
|
||||||
*/
|
*/
|
||||||
public boolean checkConnection() {
|
public boolean checkConnection() {
|
||||||
try {
|
try {
|
||||||
|
@ -18,9 +18,12 @@ import java.util.List;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
public class CorruptSchematicStreamer {
|
public class CorruptSchematicStreamer {
|
||||||
|
|
||||||
|
private final Logger log = LoggerFactory.getLogger(CorruptSchematicStreamer.class);
|
||||||
private final InputStream stream;
|
private final InputStream stream;
|
||||||
private final UUID uuid;
|
private final UUID uuid;
|
||||||
private LinearClipboard fc;
|
private LinearClipboard fc;
|
||||||
@ -65,10 +68,9 @@ public class CorruptSchematicStreamer {
|
|||||||
matchIndex = 0;
|
matchIndex = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Fawe.debug(" - Recover " + matchTag + " = success");
|
log.debug(" - Recover " + matchTag + " = success");
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Fawe.debug(" - Recover " + matchTag + " = partial failure");
|
log.error(" - Recover " + matchTag + " = partial failure", e);
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +80,7 @@ public class CorruptSchematicStreamer {
|
|||||||
}
|
}
|
||||||
BlockVector3 dimensions = guessDimensions(volume.get(), width.get(), height.get(), length.get());
|
BlockVector3 dimensions = guessDimensions(volume.get(), width.get(), height.get(), length.get());
|
||||||
if (width.get() == 0 || height.get() == 0 || length.get() == 0) {
|
if (width.get() == 0 || height.get() == 0 || length.get() == 0) {
|
||||||
Fawe.debug("No dimensions found! Estimating based on factors:" + dimensions);
|
log.debug("No dimensions found! Estimating based on factors:" + dimensions);
|
||||||
}
|
}
|
||||||
if (Settings.IMP.CLIPBOARD.USE_DISK) {
|
if (Settings.IMP.CLIPBOARD.USE_DISK) {
|
||||||
fc = new DiskOptimizedClipboard(dimensions, uuid);
|
fc = new DiskOptimizedClipboard(dimensions, uuid);
|
||||||
|
@ -173,10 +173,12 @@ public class MCAChunk implements IChunk {
|
|||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public int getX() {
|
public int getX() {
|
||||||
return chunkX;
|
return chunkX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public int getZ() {
|
public int getZ() {
|
||||||
return chunkZ;
|
return chunkZ;
|
||||||
}
|
}
|
||||||
@ -435,6 +437,7 @@ public class MCAChunk implements IChunk {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setEntity(CompoundTag entityTag) {
|
public void setEntity(CompoundTag entityTag) {
|
||||||
setModified();
|
setModified();
|
||||||
long least = entityTag.getLong("UUIDLeast");
|
long least = entityTag.getLong("UUIDLeast");
|
||||||
@ -464,6 +467,7 @@ public class MCAChunk implements IChunk {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Set<CompoundTag> getEntities() {
|
public Set<CompoundTag> getEntities() {
|
||||||
return new HashSet<>(entities.values());
|
return new HashSet<>(entities.values());
|
||||||
}
|
}
|
||||||
@ -505,6 +509,7 @@ public class MCAChunk implements IChunk {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Set<UUID> getEntityRemoves() {
|
public Set<UUID> getEntityRemoves() {
|
||||||
return new HashSet<>();
|
return new HashSet<>();
|
||||||
}
|
}
|
||||||
@ -542,6 +547,7 @@ public class MCAChunk implements IChunk {
|
|||||||
Arrays.fill(this.biomes, biome);
|
Arrays.fill(this.biomes, biome);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void removeEntity(UUID uuid) {
|
public void removeEntity(UUID uuid) {
|
||||||
entities.remove(uuid);
|
entities.remove(uuid);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.boydti.fawe.jnbt.anvil;
|
package com.boydti.fawe.jnbt.anvil;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.FaweCache;
|
import com.boydti.fawe.FaweCache;
|
||||||
import com.boydti.fawe.beta.Trimable;
|
import com.boydti.fawe.beta.Trimable;
|
||||||
import com.boydti.fawe.beta.implementation.IChunkExtent;
|
import com.boydti.fawe.beta.implementation.IChunkExtent;
|
||||||
@ -18,7 +19,6 @@ import com.sk89q.worldedit.world.World;
|
|||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream;
|
import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
@ -40,7 +40,7 @@ import java.util.zip.InflaterInputStream;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Chunk format: http://minecraft.gamepedia.com/Chunk_format#Entity_format
|
* Chunk format: http://minecraft.gamepedia.com/Chunk_format#Entity_format
|
||||||
* e.g.: `.Level.Entities.#` (Starts with a . as the root tag is unnamed)
|
* e.g., `.Level.Entities.#` (Starts with a . as the root tag is unnamed)
|
||||||
* Note: This class isn't thread safe. You can use it in an async thread, but not multiple at the same time
|
* Note: This class isn't thread safe. You can use it in an async thread, but not multiple at the same time
|
||||||
*/
|
*/
|
||||||
public class MCAFile extends ExtentBatchProcessorHolder implements Trimable, IChunkExtent {
|
public class MCAFile extends ExtentBatchProcessorHolder implements Trimable, IChunkExtent {
|
||||||
@ -291,7 +291,7 @@ public class MCAFile extends ExtentBatchProcessorHolder implements Trimable, ICh
|
|||||||
if (offset < offsets.length) {
|
if (offset < offsets.length) {
|
||||||
offsets[offset] = i;
|
offsets[offset] = i;
|
||||||
} else {
|
} else {
|
||||||
Fawe.debug("Ignoring invalid offset " + offset);
|
getLogger(MCAFile.class).debug("Ignoring invalid offset " + offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -707,4 +707,4 @@ public class MCAFile extends ExtentBatchProcessorHolder implements Trimable, ICh
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,9 +51,9 @@ public class ClipboardSpline extends Spline {
|
|||||||
* to the first node, 0.25 to the second, 0.5 to the third, ... .<br>
|
* to the first node, 0.25 to the second, 0.5 to the third, ... .<br>
|
||||||
* By providing this method with the amount of nodes used by the interpolation implementation the distribution of the
|
* By providing this method with the amount of nodes used by the interpolation implementation the distribution of the
|
||||||
* nodes is converted to a proportional distribution based on the length between two adjacent nodes calculated by {@link Interpolation#arcLength(double, double)}.<br>
|
* nodes is converted to a proportional distribution based on the length between two adjacent nodes calculated by {@link Interpolation#arcLength(double, double)}.<br>
|
||||||
* This means that the distance between two positions used to paste the clipboard (e.g. 0.75 - 0.5 = 0.25) on the curve
|
* This means that the distance between two positions used to paste the clipboard (e.g., 0.75 - 0.5 = 0.25) on the curve
|
||||||
* will always amount to that part of the length (e.g. 40 units) of the curve. In this example it would amount to
|
* will always amount to that part of the length (e.g., 40 units) of the curve. In this example it would amount to
|
||||||
* 0.25 * 40 = 10 units of curve length between these two positions.
|
* 0.25 × 40 = 10 units of curve length between these two positions.
|
||||||
* <p>
|
* <p>
|
||||||
* Be advised that currently subsequent changes to the interpolation parameters may not be supported.
|
* Be advised that currently subsequent changes to the interpolation parameters may not be supported.
|
||||||
* @param editSession The EditSession which will be used when pasting the clipboard content
|
* @param editSession The EditSession which will be used when pasting the clipboard content
|
||||||
@ -115,4 +115,4 @@ public class ClipboardSpline extends Spline {
|
|||||||
|
|
||||||
return operation instanceof ForwardExtentCopy ? ((ForwardExtentCopy) operation).getAffected() : 0;
|
return operation instanceof ForwardExtentCopy ? ((ForwardExtentCopy) operation).getAffected() : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ public abstract class Spline {
|
|||||||
* to the first node, 0.25 to the second, 0.5 to the third, ... .<br>
|
* to the first node, 0.25 to the second, 0.5 to the third, ... .<br>
|
||||||
* By providing this method with the amount of nodes used by the interpolation implementation the distribution of the
|
* By providing this method with the amount of nodes used by the interpolation implementation the distribution of the
|
||||||
* nodes is converted to a proportional distribution based on the length between two adjacent nodes calculated by {@link Interpolation#arcLength(double, double)}.<br>
|
* nodes is converted to a proportional distribution based on the length between two adjacent nodes calculated by {@link Interpolation#arcLength(double, double)}.<br>
|
||||||
* This means that the distance between two positions used to paste the clipboard (e.g. 0.75 - 0.5 = 0.25) on the curve
|
* This means that the distance between two positions used to paste the clipboard (e.g., 0.75 - 0.5 = 0.25) on the curve
|
||||||
* will always amount to that part of the length (e.g. 40 units) of the curve. In this example it would amount to
|
* will always amount to that part of the length (e.g. 40 units) of the curve. In this example it would amount to
|
||||||
* 0.25 * 40 = 10 units of curve length between these two positions.
|
* 0.25 * 40 = 10 units of curve length between these two positions.
|
||||||
* <p>
|
* <p>
|
||||||
@ -73,7 +73,7 @@ public abstract class Spline {
|
|||||||
* Set the forward direction of the structure.<br>
|
* Set the forward direction of the structure.<br>
|
||||||
* This direction is used to determine the rotation of the clipboard to align to the curve. The horizontal slope
|
* This direction is used to determine the rotation of the clipboard to align to the curve. The horizontal slope
|
||||||
* of the curve for a specific point is calculated by {@link Interpolation#get1stDerivative(double)}.
|
* of the curve for a specific point is calculated by {@link Interpolation#get1stDerivative(double)}.
|
||||||
* Subsequently this angle between this vector and the gradient vector is calculated and the clipboard content
|
* Subsequently, this angle between this vector, and the gradient vector is calculated, and the clipboard content
|
||||||
* is rotated by that angle to follow the curve slope.
|
* is rotated by that angle to follow the curve slope.
|
||||||
* <p>
|
* <p>
|
||||||
* The default direction is a (1;0) vector (pointing in the positive x-direction).
|
* The default direction is a (1;0) vector (pointing in the positive x-direction).
|
||||||
@ -87,7 +87,7 @@ public abstract class Spline {
|
|||||||
* Get the forward direction of the structure.<br>
|
* Get the forward direction of the structure.<br>
|
||||||
* This direction is used to determine the rotation of the clipboard to align to the curve. The horizontal slope
|
* This direction is used to determine the rotation of the clipboard to align to the curve. The horizontal slope
|
||||||
* of the curve for a specific point is calculated by {@link Interpolation#get1stDerivative(double)}.
|
* of the curve for a specific point is calculated by {@link Interpolation#get1stDerivative(double)}.
|
||||||
* Subsequently this angle between this vector and the gradient vector is calculated and the clipboard content
|
* Subsequently, this angle between this vector, and the gradient vector is calculated, and the clipboard content
|
||||||
* is rotated by that angle to follow the curve slope.
|
* is rotated by that angle to follow the curve slope.
|
||||||
* <p>
|
* <p>
|
||||||
* The default direction is a (1;0) vector (pointing in the positive x-direction).
|
* The default direction is a (1;0) vector (pointing in the positive x-direction).
|
||||||
@ -192,4 +192,4 @@ public abstract class Spline {
|
|||||||
this.flexLength = flexLength;
|
this.flexLength = flexLength;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.boydti.fawe.object.brush.visualization.cfi;
|
package com.boydti.fawe.object.brush.visualization.cfi;
|
||||||
|
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.FaweCache;
|
import com.boydti.fawe.FaweCache;
|
||||||
import com.boydti.fawe.beta.IBlocks;
|
import com.boydti.fawe.beta.IBlocks;
|
||||||
@ -1982,7 +1984,7 @@ public class HeightMapMCAGenerator extends MCAWriter implements StreamChange, Dr
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IChunkGet get(int x, int z) {
|
public IChunkGet get(int x, int z) {
|
||||||
Fawe.debug("Should not be using buffering with HMMG");
|
getLogger(HeightMapMCAGenerator.class).debug("Should not be using buffering with HMMG");
|
||||||
return new FallbackChunkGet(this, x, z);
|
return new FallbackChunkGet(this, x, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package com.boydti.fawe.object.change;
|
package com.boydti.fawe.object.change;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
|
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
|
||||||
import com.boydti.fawe.util.ExtentTraverser;
|
import com.boydti.fawe.util.ExtentTraverser;
|
||||||
import com.sk89q.worldedit.WorldEditException;
|
import com.sk89q.worldedit.WorldEditException;
|
||||||
@ -9,9 +11,6 @@ import com.sk89q.worldedit.history.change.Change;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
|
||||||
|
|
||||||
public class CFIChange implements Change {
|
public class CFIChange implements Change {
|
||||||
private final File file;
|
private final File file;
|
||||||
|
|
||||||
@ -25,7 +24,7 @@ public class CFIChange implements Change {
|
|||||||
if (found != null) {
|
if (found != null) {
|
||||||
return found.get();
|
return found.get();
|
||||||
}
|
}
|
||||||
Fawe.debug("FAWE does not support: " + context.getExtent() + " for " + getClass() + " (bug Empire92)");
|
getLogger(CFIChange.class).debug("FAWE does not support: " + context.getExtent() + " for " + getClass() + " (bug Empire92)");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.boydti.fawe.object.change;
|
package com.boydti.fawe.object.change;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.beta.IQueueExtent;
|
import com.boydti.fawe.beta.IQueueExtent;
|
||||||
import com.boydti.fawe.util.MathMan;
|
import com.boydti.fawe.util.MathMan;
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
@ -15,7 +16,6 @@ import com.sk89q.worldedit.history.change.Change;
|
|||||||
import com.sk89q.worldedit.util.Location;
|
import com.sk89q.worldedit.util.Location;
|
||||||
import com.sk89q.worldedit.world.entity.EntityType;
|
import com.sk89q.worldedit.world.entity.EntityType;
|
||||||
import com.sk89q.worldedit.world.entity.EntityTypes;
|
import com.sk89q.worldedit.world.entity.EntityTypes;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -59,7 +59,7 @@ public class MutableEntityChange implements Change {
|
|||||||
most = ((LongTag) map.get("PersistentIDMSB")).getValue();
|
most = ((LongTag) map.get("PersistentIDMSB")).getValue();
|
||||||
least = ((LongTag) map.get("PersistentIDLSB")).getValue();
|
least = ((LongTag) map.get("PersistentIDLSB")).getValue();
|
||||||
} else {
|
} else {
|
||||||
Fawe.debug("Skipping entity without uuid.");
|
getLogger(MutableEntityChange.class).debug("Skipping entity without uuid.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
List<DoubleTag> pos = (List<DoubleTag>) map.get("Pos").getValue();
|
List<DoubleTag> pos = (List<DoubleTag>) map.get("Pos").getValue();
|
||||||
@ -74,7 +74,7 @@ public class MutableEntityChange implements Change {
|
|||||||
Map<String, Tag> map = tag.getValue();
|
Map<String, Tag> map = tag.getValue();
|
||||||
Tag posTag = map.get("Pos");
|
Tag posTag = map.get("Pos");
|
||||||
if (posTag == null) {
|
if (posTag == null) {
|
||||||
Fawe.debug("Missing pos tag: " + tag);
|
getLogger(MutableEntityChange.class).debug("Missing pos tag: " + tag);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
List<DoubleTag> pos = (List<DoubleTag>) posTag.getValue();
|
List<DoubleTag> pos = (List<DoubleTag>) posTag.getValue();
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.boydti.fawe.object.changeset;
|
package com.boydti.fawe.object.changeset;
|
||||||
|
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.FaweAPI;
|
import com.boydti.fawe.FaweAPI;
|
||||||
import com.boydti.fawe.FaweCache;
|
import com.boydti.fawe.FaweCache;
|
||||||
@ -270,7 +272,7 @@ public abstract class FaweChangeSet implements ChangeSet, IBatchProcessor {
|
|||||||
} else if (change.getClass() == EntityRemove.class) {
|
} else if (change.getClass() == EntityRemove.class) {
|
||||||
add((EntityRemove) change);
|
add((EntityRemove) change);
|
||||||
} else {
|
} else {
|
||||||
Fawe.debug("Unknown change: " + change.getClass());
|
getLogger(FaweChangeSet.class).debug("Unknown change: " + change.getClass());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* regarding copyright ownership. The ASF licenses this file
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
* to you under the Apache License, Version 2.0 (the
|
* to you under the Apache License, Version 2.0 (the
|
||||||
* "License"); you may not use this file except in compliance
|
* "License"); you may not use this file except in compliance
|
||||||
* with the License. You may obtain a copy of the License at
|
* with the License. You may obtain a copy of the License at
|
||||||
* <p>
|
* <p>
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.boydti.fawe.object.schematic;
|
package com.boydti.fawe.object.schematic;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.FaweCache;
|
import com.boydti.fawe.FaweCache;
|
||||||
import com.boydti.fawe.util.ReflectionUtils;
|
import com.boydti.fawe.util.ReflectionUtils;
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
@ -59,6 +60,7 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter {
|
|||||||
return read(UUID.randomUUID());
|
return read(UUID.randomUUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Clipboard read(UUID clipboardId) throws IOException {
|
public Clipboard read(UUID clipboardId) throws IOException {
|
||||||
NamedTag rootTag = inputStream.readNamedTag();
|
NamedTag rootTag = inputStream.readNamedTag();
|
||||||
|
|
||||||
@ -158,7 +160,7 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter {
|
|||||||
int height = region.getHeight();
|
int height = region.getHeight();
|
||||||
int length = region.getLength();
|
int length = region.getLength();
|
||||||
if (width > WARN_SIZE || height > WARN_SIZE || length > WARN_SIZE) {
|
if (width > WARN_SIZE || height > WARN_SIZE || length > WARN_SIZE) {
|
||||||
Fawe.debug("A structure longer than 32 is unsupported by minecraft (but probably still works)");
|
getLogger(MinecraftStructure.class).debug("A structure longer than 32 is unsupported by minecraft (but probably still works)");
|
||||||
}
|
}
|
||||||
Map<String, Object> structure = FaweCache.IMP.asMap("version", 1, "author", owner);
|
Map<String, Object> structure = FaweCache.IMP.asMap("version", 1, "author", owner);
|
||||||
// ignored: version / owner
|
// ignored: version / owner
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.boydti.fawe.regions.general.integrations.plotquared;
|
package com.boydti.fawe.regions.general.integrations.plotquared;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
|
||||||
import com.boydti.fawe.FaweAPI;
|
import com.boydti.fawe.FaweAPI;
|
||||||
|
import com.boydti.fawe.object.RegionWrapper;
|
||||||
import com.boydti.fawe.regions.FaweMask;
|
import com.boydti.fawe.regions.FaweMask;
|
||||||
import com.boydti.fawe.regions.FaweMaskManager;
|
import com.boydti.fawe.regions.FaweMaskManager;
|
||||||
import com.boydti.fawe.regions.general.RegionFilter;
|
import com.boydti.fawe.regions.general.RegionFilter;
|
||||||
@ -25,24 +25,31 @@ import com.sk89q.worldedit.math.BlockVector3;
|
|||||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
import com.sk89q.worldedit.regions.Region;
|
||||||
import com.sk89q.worldedit.regions.RegionIntersection;
|
import com.sk89q.worldedit.regions.RegionIntersection;
|
||||||
|
import com.sk89q.worldedit.world.World;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import org.slf4j.Logger;
|
||||||
import com.sk89q.worldedit.world.World;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
public class PlotSquaredFeature extends FaweMaskManager {
|
public class PlotSquaredFeature extends FaweMaskManager {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(PlotSquaredFeature.class);
|
||||||
|
|
||||||
public PlotSquaredFeature() {
|
public PlotSquaredFeature() {
|
||||||
super("PlotSquared");
|
super("PlotSquared");
|
||||||
Fawe.debug("Optimizing PlotSquared");
|
log.debug("Optimizing PlotSquared");
|
||||||
if (com.boydti.fawe.config.Settings.IMP.PLOTSQUARED_HOOK) {
|
if (com.boydti.fawe.config.Settings.IMP.PLOTSQUARED_HOOK) {
|
||||||
Settings.Enabled_Components.WORLDEDIT_RESTRICTIONS = false;
|
Settings.Enabled_Components.WORLDEDIT_RESTRICTIONS = false;
|
||||||
setupBlockQueue();
|
try {
|
||||||
setupSchematicHandler();
|
setupBlockQueue();
|
||||||
setupChunkManager();
|
setupSchematicHandler();
|
||||||
|
setupChunkManager();
|
||||||
|
} catch (Throwable ignored) {
|
||||||
|
log.debug("Please update PlotSquared: http://ci.athion.net/job/PlotSquared/");
|
||||||
|
}
|
||||||
if (Settings.PLATFORM.equalsIgnoreCase("bukkit")) {
|
if (Settings.PLATFORM.equalsIgnoreCase("bukkit")) {
|
||||||
new FaweTrim();
|
new FaweTrim();
|
||||||
}
|
}
|
||||||
@ -57,7 +64,7 @@ public class PlotSquaredFeature extends FaweMaskManager {
|
|||||||
new ReplaceAll();
|
new ReplaceAll();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Fawe.debug("You need to update PlotSquared to access the CFI and REPLACEALL commands");
|
log.debug("You need to update PlotSquared to access the CFI and REPLACEALL commands");
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
@ -66,35 +73,23 @@ public class PlotSquaredFeature extends FaweMaskManager {
|
|||||||
return UUIDHandler.getName(uuid);
|
return UUIDHandler.getName(uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupBlockQueue() {
|
private void setupBlockQueue() throws RuntimeException {
|
||||||
try {
|
// If it's going to fail, throw an error now rather than later
|
||||||
// If it's going to fail, throw an error now rather than later
|
QueueProvider provider = QueueProvider.of(FaweLocalBlockQueue.class, null);
|
||||||
QueueProvider provider = QueueProvider.of(FaweLocalBlockQueue.class, null);
|
GlobalBlockQueue.IMP.setProvider(provider);
|
||||||
GlobalBlockQueue.IMP.setProvider(provider);
|
HybridPlotManager.REGENERATIVE_CLEAR = false;
|
||||||
HybridPlotManager.REGENERATIVE_CLEAR = false;
|
log.debug(" - QueueProvider: " + FaweLocalBlockQueue.class);
|
||||||
Fawe.debug(" - QueueProvider: " + FaweLocalBlockQueue.class);
|
log.debug(" - HybridPlotManager.REGENERATIVE_CLEAR: " + HybridPlotManager.REGENERATIVE_CLEAR);
|
||||||
Fawe.debug(" - HybridPlotManager.REGENERATIVE_CLEAR: " + HybridPlotManager.REGENERATIVE_CLEAR);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
Fawe.debug("Please update PlotSquared: http://ci.athion.net/job/PlotSquared/");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupChunkManager() {
|
private void setupChunkManager() throws RuntimeException {
|
||||||
try {
|
ChunkManager.manager = new FaweChunkManager(ChunkManager.manager);
|
||||||
ChunkManager.manager = new FaweChunkManager(ChunkManager.manager);
|
log.debug(" - ChunkManager: " + ChunkManager.manager);
|
||||||
Fawe.debug(" - ChunkManager: " + ChunkManager.manager);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
Fawe.debug("Please update PlotSquared: http://ci.athion.net/job/PlotSquared/");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupSchematicHandler() {
|
private void setupSchematicHandler() throws RuntimeException {
|
||||||
try {
|
SchematicHandler.manager = new FaweSchematicHandler();
|
||||||
SchematicHandler.manager = new FaweSchematicHandler();
|
log.debug(" - SchematicHandler: " + SchematicHandler.manager);
|
||||||
Fawe.debug(" - SchematicHandler: " + SchematicHandler.manager);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
Fawe.debug("Please update PlotSquared: http://ci.athion.net/job/PlotSquared/");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isAllowed(Player player, Plot plot, MaskType type) {
|
public boolean isAllowed(Player player, Plot plot, MaskType type) {
|
||||||
@ -128,9 +123,9 @@ public class PlotSquaredFeature extends FaweMaskManager {
|
|||||||
PlotArea area = pp.getApplicablePlotArea();
|
PlotArea area = pp.getApplicablePlotArea();
|
||||||
int min = area != null ? area.MIN_BUILD_HEIGHT : 0;
|
int min = area != null ? area.MIN_BUILD_HEIGHT : 0;
|
||||||
int max = area != null ? Math.min(255, area.MAX_BUILD_HEIGHT) : 255;
|
int max = area != null ? Math.min(255, area.MAX_BUILD_HEIGHT) : 255;
|
||||||
final HashSet<com.boydti.fawe.object.RegionWrapper> faweRegions = new HashSet<>();
|
final HashSet<RegionWrapper> faweRegions = new HashSet<>();
|
||||||
for (CuboidRegion current : regions) {
|
for (CuboidRegion current : regions) {
|
||||||
faweRegions.add(new com.boydti.fawe.object.RegionWrapper(current.getMinimumX(), current.getMaximumX(), min, max, current.getMinimumZ(), current.getMaximumZ()));
|
faweRegions.add(new RegionWrapper(current.getMinimumX(), current.getMaximumX(), min, max, current.getMinimumZ(), current.getMaximumZ()));
|
||||||
}
|
}
|
||||||
final CuboidRegion region = regions.iterator().next();
|
final CuboidRegion region = regions.iterator().next();
|
||||||
final BlockVector3 pos1 = BlockVector3.at(region.getMinimumX(), min, region.getMinimumZ());
|
final BlockVector3 pos1 = BlockVector3.at(region.getMinimumX(), min, region.getMinimumZ());
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.boydti.fawe.util;
|
package com.boydti.fawe.util;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.FaweCache;
|
import com.boydti.fawe.FaweCache;
|
||||||
import com.boydti.fawe.object.brush.BrushSettings;
|
import com.boydti.fawe.object.brush.BrushSettings;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
@ -12,7 +13,6 @@ import com.sk89q.worldedit.LocalSession;
|
|||||||
import com.sk89q.worldedit.blocks.BaseItem;
|
import com.sk89q.worldedit.blocks.BaseItem;
|
||||||
import com.sk89q.worldedit.command.tool.BrushTool;
|
import com.sk89q.worldedit.command.tool.BrushTool;
|
||||||
import com.sk89q.worldedit.entity.Player;
|
import com.sk89q.worldedit.entity.Player;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
@ -51,8 +51,7 @@ public final class BrushCache {
|
|||||||
brushCache.put(key, tool);
|
brushCache.put(key, tool);
|
||||||
return tool;
|
return tool;
|
||||||
} catch (Exception throwable) {
|
} catch (Exception throwable) {
|
||||||
throwable.printStackTrace();
|
getLogger(BrushCache.class).debug("Invalid brush for " + player + " holding " + item.getType() + ": " + json.getValue(), throwable);
|
||||||
Fawe.debug("Invalid brush for " + player + " holding " + item.getType() + ": " + json.getValue());
|
|
||||||
item.setNbtData(null);
|
item.setNbtData(null);
|
||||||
brushCache.remove(key);
|
brushCache.remove(key);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -94,7 +94,7 @@ public final class DocumentationPrinter {
|
|||||||
stream.print(" - `[arg]` - An optional parameter \n");
|
stream.print(" - `[arg]` - An optional parameter \n");
|
||||||
stream.print(" - `<arg1|arg2>` - Multiple parameters options \n");
|
stream.print(" - `<arg1|arg2>` - Multiple parameters options \n");
|
||||||
stream.print(" - `<arg=value>` - Default or suggested value \n");
|
stream.print(" - `<arg=value>` - Default or suggested value \n");
|
||||||
stream.print(" - `-a` - A command flag e.g. `//<command> -a [flag-value]`");
|
stream.print(" - `-a` - A command flag e.g., `//<command> -a [flag-value]`");
|
||||||
stream.println();
|
stream.println();
|
||||||
stream.print("## See also\n");
|
stream.print("## See also\n");
|
||||||
stream.print(" - [Masks](https://github.com/boy0001/FastAsyncWorldedit/wiki/WorldEdit---FAWE-mask-list)\n");
|
stream.print(" - [Masks](https://github.com/boy0001/FastAsyncWorldedit/wiki/WorldEdit---FAWE-mask-list)\n");
|
||||||
|
@ -242,16 +242,16 @@ public class EditSessionBuilder {
|
|||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Settings.IMP.EXTENT.DEBUG) {
|
if (Settings.IMP.EXTENT.DEBUG && event.getActor() != null) {
|
||||||
Fawe.debug("&cPotentially unsafe extent blocked: " + toReturn.getClass().getName());
|
event.getActor().printDebug("Potentially unsafe extent blocked: " + toReturn.getClass().getName());
|
||||||
Fawe.debug("&8 - &7For area restrictions, it is recommended to use the FaweAPI");
|
event.getActor().printDebug(" - For area restrictions, it is recommended to use the FaweAPI");
|
||||||
Fawe.debug("&8 - &7For block logging, it is recommended to use use BlocksHub");
|
event.getActor().printDebug(" - For block logging, it is recommended to use use BlocksHub");
|
||||||
Fawe.debug("&8 - &7To allow this plugin add it to the FAWE `allowed-plugins` list");
|
event.getActor().printDebug(" - To allow this plugin add it to the FAWE `allowed-plugins` list");
|
||||||
Fawe.debug("&8 - &7To hide this message set `debug` to false in the FAWE config.yml");
|
event.getActor().printDebug(" - To hide this message set `debug` to false in the FAWE config.yml");
|
||||||
if (toReturn.getClass().getName().contains("CoreProtect")) {
|
if (toReturn.getClass().getName().contains("CoreProtect")) {
|
||||||
Fawe.debug("Note on CoreProtect: ");
|
event.getActor().printDebug("Note on CoreProtect: ");
|
||||||
Fawe.debug(" - If you disable CP's WE logger (CP config) and this still shows, please update CP");
|
event.getActor().printDebug(" - If you disable CP's WE logger (CP config) and this still shows, please update CP");
|
||||||
Fawe.debug(" - Use BlocksHub and set `debug` false in the FAWE config");
|
event.getActor().printDebug(" - Use BlocksHub and set `debug` false in the FAWE config");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.boydti.fawe.util;
|
package com.boydti.fawe.util;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
@ -10,35 +11,36 @@ import java.util.Base64;
|
|||||||
|
|
||||||
public enum Jars {
|
public enum Jars {
|
||||||
|
|
||||||
MM_v1_7_3("https://github.com/InventivetalentDev/MapManager/releases/download/1.7.3-SNAPSHOT/MapManager_v1.7.3-SNAPSHOT.jar",
|
MM_v1_7_3(
|
||||||
"M3YLUQZZ66K2DMVDCYLEU38U3ZKRKHRAXQGGPVKFO6G=", 554831),
|
"https://github.com/InventivetalentDev/MapManager/releases/download/1.7.3-SNAPSHOT/MapManager_v1.7.3-SNAPSHOT.jar",
|
||||||
|
"M3YLUQZZ66K2DMVDCYLEU38U3ZKRKHRAXQGGPVKFO6G=", 554831),
|
||||||
|
|
||||||
PL_v3_7_3("https://github.com/InventivetalentDev/PacketListenerAPI/releases/download/3.7.3-SNAPSHOT/PacketListenerAPI_v3.7.3-SNAPSHOT.jar",
|
PL_v3_7_3(
|
||||||
"ETDBRZLN5PRVDFR/MSQDPM6JJER3WQOKHCN8FUXO5ZM=", 167205),
|
"https://github.com/InventivetalentDev/PacketListenerAPI/releases/download/3.7.3-SNAPSHOT/PacketListenerAPI_v3.7.3-SNAPSHOT.jar",
|
||||||
|
"ETDBRZLN5PRVDFR/MSQDPM6JJER3WQOKHCN8FUXO5ZM=", 167205),
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
public final String url;
|
public final String url;
|
||||||
public final int filesize;
|
public final int fileSize;
|
||||||
public final String digest;
|
public final String digest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param url
|
* @param url Where this jar can be found and downloaded
|
||||||
* Where this jar can be found and downloaded
|
* @param digest The SHA-256 hexadecimal digest
|
||||||
* @param digest
|
* @param fileSize Size of this jar in bytes
|
||||||
* The SHA-256 hexadecimal digest
|
|
||||||
* @param filesize
|
|
||||||
* Size of this jar in bytes
|
|
||||||
*/
|
*/
|
||||||
Jars(String url, String digest, int filesize) {
|
Jars(String url, String digest, int fileSize) {
|
||||||
this.url = url;
|
this.url = url;
|
||||||
this.digest = digest.toUpperCase();
|
this.digest = digest.toUpperCase();
|
||||||
this.filesize = filesize;
|
this.fileSize = fileSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** download a jar, verify hash, return byte[] containing the jar */
|
/**
|
||||||
|
* Download a jar, verify hash, return byte[] containing the jar
|
||||||
|
*/
|
||||||
public byte[] download() throws IOException {
|
public byte[] download() throws IOException {
|
||||||
byte[] jarBytes = new byte[this.filesize];
|
byte[] jarBytes = new byte[this.fileSize];
|
||||||
URL url = new URL(this.url);
|
URL url = new URL(this.url);
|
||||||
try (DataInputStream dis = new DataInputStream(url.openConnection().getInputStream())) {
|
try (DataInputStream dis = new DataInputStream(url.openConnection().getInputStream())) {
|
||||||
dis.readFully(jarBytes);
|
dis.readFully(jarBytes);
|
||||||
@ -51,14 +53,13 @@ public enum Jars {
|
|||||||
String jarDigest = Base64.getEncoder().encodeToString(jarDigestBytes).toUpperCase();
|
String jarDigest = Base64.getEncoder().encodeToString(jarDigestBytes).toUpperCase();
|
||||||
|
|
||||||
if (this.digest.equals(jarDigest)) {
|
if (this.digest.equals(jarDigest)) {
|
||||||
Fawe.debug("++++ HASH CHECK ++++");
|
getLogger(Jars.class).debug("++++ HASH CHECK ++++");
|
||||||
Fawe.debug(this.url);
|
getLogger(Jars.class).debug(this.url);
|
||||||
Fawe.debug(this.digest);
|
getLogger(Jars.class).debug(this.digest);
|
||||||
return jarBytes;
|
return jarBytes;
|
||||||
} else {
|
} else {
|
||||||
|
getLogger(Jars.class).debug(jarDigest + " | " + url);
|
||||||
Fawe.debug(jarDigest + " | " + url);
|
throw new IllegalStateException("The downloaded jar does not match the hash");
|
||||||
throw new IllegalStateException("downloaded jar does not match the hash");
|
|
||||||
}
|
}
|
||||||
} catch (NoSuchAlgorithmException e) {
|
} catch (NoSuchAlgorithmException e) {
|
||||||
// Shouldn't ever happen, Minecraft won't even run on such a JRE
|
// Shouldn't ever happen, Minecraft won't even run on such a JRE
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package com.boydti.fawe.util;
|
package com.boydti.fawe.util;
|
||||||
|
|
||||||
|
import static java.lang.System.arraycopy;
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.config.BBC;
|
import com.boydti.fawe.config.BBC;
|
||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.config.Settings;
|
||||||
@ -24,18 +27,7 @@ import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
|
|||||||
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
|
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
|
||||||
import com.sk89q.worldedit.history.changeset.ChangeSet;
|
import com.sk89q.worldedit.history.changeset.ChangeSet;
|
||||||
import com.sk89q.worldedit.util.Location;
|
import com.sk89q.worldedit.util.Location;
|
||||||
import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream;
|
import java.awt.Graphics2D;
|
||||||
import net.jpountz.lz4.LZ4BlockInputStream;
|
|
||||||
import net.jpountz.lz4.LZ4BlockOutputStream;
|
|
||||||
import net.jpountz.lz4.LZ4Compressor;
|
|
||||||
import net.jpountz.lz4.LZ4Factory;
|
|
||||||
import net.jpountz.lz4.LZ4FastDecompressor;
|
|
||||||
import net.jpountz.lz4.LZ4InputStream;
|
|
||||||
import net.jpountz.lz4.LZ4Utils;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
@ -84,8 +76,15 @@ import java.util.zip.GZIPInputStream;
|
|||||||
import java.util.zip.Inflater;
|
import java.util.zip.Inflater;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipInputStream;
|
import java.util.zip.ZipInputStream;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import static java.lang.System.arraycopy;
|
import javax.imageio.ImageIO;
|
||||||
|
import net.jpountz.lz4.LZ4BlockInputStream;
|
||||||
|
import net.jpountz.lz4.LZ4BlockOutputStream;
|
||||||
|
import net.jpountz.lz4.LZ4Compressor;
|
||||||
|
import net.jpountz.lz4.LZ4Factory;
|
||||||
|
import net.jpountz.lz4.LZ4FastDecompressor;
|
||||||
|
import net.jpountz.lz4.LZ4InputStream;
|
||||||
|
import net.jpountz.lz4.LZ4Utils;
|
||||||
|
|
||||||
public class MainUtil {
|
public class MainUtil {
|
||||||
|
|
||||||
@ -374,7 +373,7 @@ public class MainUtil {
|
|||||||
|
|
||||||
public static URL upload(String urlStr, boolean save, String uuid, String file, String extension, final RunnableVal<OutputStream> writeTask) {
|
public static URL upload(String urlStr, boolean save, String uuid, String file, String extension, final RunnableVal<OutputStream> writeTask) {
|
||||||
if (writeTask == null) {
|
if (writeTask == null) {
|
||||||
Fawe.debug("&cWrite task cannot be null");
|
getLogger(MainUtil.class).debug("Write task cannot be null");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
String filename = (file == null ? "plot" : file) + (extension != null ? "." + extension : "");
|
String filename = (file == null ? "plot" : file) + (extension != null ? "." + extension : "");
|
||||||
@ -422,7 +421,7 @@ public class MainUtil {
|
|||||||
content = scanner.next().trim();
|
content = scanner.next().trim();
|
||||||
}
|
}
|
||||||
if (!content.startsWith("<")) {
|
if (!content.startsWith("<")) {
|
||||||
Fawe.debug(content);
|
getLogger(MainUtil.class).debug(content);
|
||||||
}
|
}
|
||||||
if (responseCode == 200) {
|
if (responseCode == 200) {
|
||||||
return url;
|
return url;
|
||||||
@ -600,8 +599,7 @@ public class MainUtil {
|
|||||||
return newFile;
|
return newFile;
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
getLogger(MainUtil.class).debug("Could not save " + resource, e);
|
||||||
Fawe.debug("&cCould not save " + resource);
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.boydti.fawe.util;
|
package com.boydti.fawe.util;
|
||||||
|
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
|
import com.boydti.fawe.beta.implementation.queue.QueueHandler;
|
||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.config.Settings;
|
||||||
@ -66,7 +68,7 @@ public abstract class TaskManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run a buch of tasks in parallel using the shared thread pool
|
* Run a bunch of tasks in parallel using the shared thread pool
|
||||||
*
|
*
|
||||||
* @param runnables
|
* @param runnables
|
||||||
*/
|
*/
|
||||||
@ -80,8 +82,8 @@ public abstract class TaskManager {
|
|||||||
/**
|
/**
|
||||||
* Run a bunch of tasks in parallel
|
* Run a bunch of tasks in parallel
|
||||||
*
|
*
|
||||||
* @param runnables The tasks to run
|
* @param runnables the tasks to run
|
||||||
* @param numThreads Number of threads (null = config.yml parallel threads)
|
* @param numThreads number of threads (null = config.yml parallel threads)
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void parallel(Collection<Runnable> runnables, @Nullable Integer numThreads) {
|
public void parallel(Collection<Runnable> runnables, @Nullable Integer numThreads) {
|
||||||
@ -136,7 +138,6 @@ public abstract class TaskManager {
|
|||||||
/**
|
/**
|
||||||
* Disable async catching for a specific task
|
* Disable async catching for a specific task
|
||||||
*
|
*
|
||||||
* @param queue
|
|
||||||
* @param run
|
* @param run
|
||||||
*/
|
*/
|
||||||
public void runUnsafe(Runnable run) {
|
public void runUnsafe(Runnable run) {
|
||||||
@ -231,10 +232,9 @@ public abstract class TaskManager {
|
|||||||
* Break up a task and run it in fragments of 5ms.<br>
|
* Break up a task and run it in fragments of 5ms.<br>
|
||||||
* - Each task will run on the main thread.<br>
|
* - Each task will run on the main thread.<br>
|
||||||
*
|
*
|
||||||
* @param objects - The list of objects to run the task for
|
* @param objects the list of objects to run the task for
|
||||||
* @param task - The task to run on each object
|
* @param task the task to run on each object
|
||||||
* @param whenDone - When the object task completes
|
* @param whenDone when the object task completes
|
||||||
* @param <T>
|
|
||||||
*/
|
*/
|
||||||
public <T> void objectTask(Collection<T> objects, final RunnableVal<T> task, final Runnable whenDone) {
|
public <T> void objectTask(Collection<T> objects, final RunnableVal<T> task, final Runnable whenDone) {
|
||||||
final Iterator<T> iterator = objects.iterator();
|
final Iterator<T> iterator = objects.iterator();
|
||||||
@ -264,7 +264,7 @@ public abstract class TaskManager {
|
|||||||
running.wait(timeout);
|
running.wait(timeout);
|
||||||
if (running.get() && System.currentTimeMillis() - start > Settings.IMP.QUEUE.DISCARD_AFTER_MS) {
|
if (running.get() && System.currentTimeMillis() - start > Settings.IMP.QUEUE.DISCARD_AFTER_MS) {
|
||||||
new RuntimeException("FAWE is taking a long time to execute a task (might just be a symptom): ").printStackTrace();
|
new RuntimeException("FAWE is taking a long time to execute a task (might just be a symptom): ").printStackTrace();
|
||||||
Fawe.debug("For full debug information use: /fawe threads");
|
getLogger(TaskManager.class).debug("For full debug information use: /fawe threads");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -291,11 +291,9 @@ public abstract class TaskManager {
|
|||||||
/**
|
/**
|
||||||
* Run a task on the main thread when the TPS is high enough, and wait for execution to finish:<br>
|
* Run a task on the main thread when the TPS is high enough, and wait for execution to finish:<br>
|
||||||
* - Useful if you need to access something from the Bukkit API from another thread<br>
|
* - Useful if you need to access something from the Bukkit API from another thread<br>
|
||||||
* - Usualy wait time is around 25ms<br>
|
* - Usually wait time is around 25ms<br>
|
||||||
*
|
*
|
||||||
* @param function
|
* @param function
|
||||||
* @param timeout - How long to wait for execution
|
|
||||||
* @param <T>
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public <T> T syncWhenFree(@NotNull final RunnableVal<T> function) {
|
public <T> T syncWhenFree(@NotNull final RunnableVal<T> function) {
|
||||||
@ -313,11 +311,9 @@ public abstract class TaskManager {
|
|||||||
/**
|
/**
|
||||||
* Quickly run a task on the main thread, and wait for execution to finish:<br>
|
* Quickly run a task on the main thread, and wait for execution to finish:<br>
|
||||||
* - Useful if you need to access something from the Bukkit API from another thread<br>
|
* - Useful if you need to access something from the Bukkit API from another thread<br>
|
||||||
* - Usualy wait time is around 25ms<br>
|
* - Usually wait time is around 25ms<br>
|
||||||
*
|
*
|
||||||
* @param function
|
* @param function
|
||||||
* @param timeout - How long to wait for execution
|
|
||||||
* @param <T>
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public <T> T sync(@NotNull final RunnableVal<T> function) {
|
public <T> T sync(@NotNull final RunnableVal<T> function) {
|
||||||
@ -330,7 +326,6 @@ public abstract class TaskManager {
|
|||||||
* - Usually wait time is around 25ms<br>
|
* - Usually wait time is around 25ms<br>
|
||||||
*
|
*
|
||||||
* @param function
|
* @param function
|
||||||
* @param <T>
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public <T> T sync(final Supplier<T> function) {
|
public <T> T sync(final Supplier<T> function) {
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.boydti.fawe.util;
|
package com.boydti.fawe.util;
|
||||||
|
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.beta.implementation.filter.block.SingleFilterBlock;
|
import com.boydti.fawe.beta.implementation.filter.block.SingleFilterBlock;
|
||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.config.Settings;
|
||||||
@ -18,8 +20,6 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
|||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
import it.unimi.dsi.fastutil.ints.IntArraySet;
|
import it.unimi.dsi.fastutil.ints.IntArraySet;
|
||||||
import it.unimi.dsi.fastutil.longs.LongArrayList;
|
import it.unimi.dsi.fastutil.longs.LongArrayList;
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
@ -607,8 +607,8 @@ public class TextureUtil implements TextureHolder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (files.length == 0) {
|
if (files.length == 0) {
|
||||||
Fawe.debug(
|
getLogger(TextureUtil.class).debug(
|
||||||
"Please create a `FastAsyncWorldEdit/textures` folder with `.minecraft/versions/1.13.jar` jar or mods in it. If the file exists, please make sure the server has read access to the directory");
|
"Please create a `FastAsyncWorldEdit/textures` folder with `.minecraft/versions/1.14.jar` jar or mods in it. If the file exists, please make sure the server has read access to the directory");
|
||||||
} else {
|
} else {
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
ZipFile zipFile = new ZipFile(file);
|
ZipFile zipFile = new ZipFile(file);
|
||||||
|
@ -33,9 +33,9 @@ public class ImageUtil {
|
|||||||
BufferedImage scaledImage = image;
|
BufferedImage scaledImage = image;
|
||||||
int width, height;
|
int width, height;
|
||||||
if (higherQuality) {
|
if (higherQuality) {
|
||||||
// Use multi-step technique: start with original size, then
|
/* Use multi-step technique: start with original size, then
|
||||||
// scale down in multiple passes with drawImage()
|
scale down in multiple passes with drawImage()
|
||||||
// until the target size is reached
|
until the target size is reached. */
|
||||||
width = scaledImage.getWidth();
|
width = scaledImage.getWidth();
|
||||||
height = scaledImage.getHeight();
|
height = scaledImage.getHeight();
|
||||||
} else {
|
} else {
|
||||||
|
@ -80,7 +80,7 @@ public class TaskBuilder extends Metadatable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Run some sync tasks in parallel<br>
|
* Run some sync tasks in parallel<br>
|
||||||
* - All sync parallel tasks which occur directly after each other will be run at the same time
|
* - All sync parallel tasks, which occur directly after each other will be run at the same time
|
||||||
*
|
*
|
||||||
* @param run
|
* @param run
|
||||||
* @return this
|
* @return this
|
||||||
@ -200,7 +200,7 @@ public class TaskBuilder extends Metadatable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Have all async tasks run on a new thread<br>
|
* Have all async tasks run on a new thread<br>
|
||||||
* - As opposed to trying to using the current thread
|
* - As opposed to trying to use the current thread
|
||||||
*/
|
*/
|
||||||
public void buildAsync() {
|
public void buildAsync() {
|
||||||
TaskManager.IMP.async(this::build);
|
TaskManager.IMP.async(this::build);
|
||||||
|
@ -20,10 +20,8 @@
|
|||||||
package com.sk89q.jnbt;
|
package com.sk89q.jnbt;
|
||||||
|
|
||||||
import com.sk89q.worldedit.extent.Extent;
|
import com.sk89q.worldedit.extent.Extent;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
|
||||||
import com.sk89q.worldedit.math.Vector3;
|
import com.sk89q.worldedit.math.Vector3;
|
||||||
import com.sk89q.worldedit.util.Location;
|
import com.sk89q.worldedit.util.Location;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -269,7 +267,7 @@ public class CompoundTag extends Tag {
|
|||||||
*
|
*
|
||||||
* <p>If the key does not exist or its value is not a list tag,
|
* <p>If the key does not exist or its value is not a list tag,
|
||||||
* then an empty list will be returned. If the given key references
|
* then an empty list will be returned. If the given key references
|
||||||
* a list but the list of of a different type, then an empty
|
* a list but the list of a different type, then an empty
|
||||||
* list will also be returned.</p>
|
* list will also be returned.</p>
|
||||||
*
|
*
|
||||||
* @param key the key
|
* @param key the key
|
||||||
@ -295,7 +293,7 @@ public class CompoundTag extends Tag {
|
|||||||
/**
|
/**
|
||||||
* Get a {@code long[]} named with the given key.
|
* Get a {@code long[]} named with the given key.
|
||||||
*
|
*
|
||||||
* <p>If the key does not exist or its value is not an long array tag,
|
* <p>If the key does not exist or its value is not a long array tag,
|
||||||
* then an empty array will be returned.</p>
|
* then an empty array will be returned.</p>
|
||||||
*
|
*
|
||||||
* @param key the key
|
* @param key the key
|
||||||
|
@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
package com.sk89q.jnbt;
|
package com.sk89q.jnbt;
|
||||||
|
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
|
||||||
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ public class CommandException extends Exception {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the command that was called, which will include the sub-command
|
* Gets the command that was called, which will include the sub-command
|
||||||
* (i.e. "/br sphere").
|
* (i.e., "/br sphere").
|
||||||
*
|
*
|
||||||
* @param prefix the command shebang character (such as "/") -- may be empty
|
* @param prefix the command shebang character (such as "/") -- may be empty
|
||||||
* @param spacedSuffix a suffix to put at the end (optional) -- may be null
|
* @param spacedSuffix a suffix to put at the end (optional) -- may be null
|
||||||
|
@ -62,11 +62,11 @@ public class YAMLNode {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a property at a location. This will either return an Object
|
* Gets a property at a location. This will either return an Object
|
||||||
* or null, with null meaning that no configuration value exists at
|
* or null, with null meaning no configuration value exists at
|
||||||
* that location. This could potentially return a default value (not yet
|
* that location. This could potentially return a default value (not yet
|
||||||
* implemented) as defined by a plugin, if this is a plugin-tied
|
* implemented) as defined by a plugin, if this is a plugin-tied
|
||||||
* configuration.
|
* configuration.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @return object or null
|
* @return object or null
|
||||||
*/
|
*/
|
||||||
@ -107,7 +107,7 @@ public class YAMLNode {
|
|||||||
/**
|
/**
|
||||||
* Prepare a value for serialization, in case it's not a native type
|
* Prepare a value for serialization, in case it's not a native type
|
||||||
* (and we don't want to serialize objects as YAML objects).
|
* (and we don't want to serialize objects as YAML objects).
|
||||||
*
|
*
|
||||||
* @param value the value to serialize
|
* @param value the value to serialize
|
||||||
* @return the new object
|
* @return the new object
|
||||||
*/
|
*/
|
||||||
@ -146,7 +146,7 @@ public class YAMLNode {
|
|||||||
/**
|
/**
|
||||||
* Set the property at a location. This will override existing
|
* Set the property at a location. This will override existing
|
||||||
* configuration data to have it conform to key/value mappings.
|
* configuration data to have it conform to key/value mappings.
|
||||||
*
|
*
|
||||||
* @param path the path
|
* @param path the path
|
||||||
* @param value the new value
|
* @param value the new value
|
||||||
*/
|
*/
|
||||||
@ -185,7 +185,7 @@ public class YAMLNode {
|
|||||||
* Adds a new node to the given path. The returned object is a reference
|
* Adds a new node to the given path. The returned object is a reference
|
||||||
* to the new node. This method will replace an existing node at
|
* to the new node. This method will replace an existing node at
|
||||||
* the same path. See {@code setProperty}.
|
* the same path. See {@code setProperty}.
|
||||||
*
|
*
|
||||||
* @param path the path
|
* @param path the path
|
||||||
* @return a node for the path
|
* @return a node for the path
|
||||||
*/
|
*/
|
||||||
@ -197,11 +197,11 @@ public class YAMLNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a string at a location. This will either return an String
|
* Gets a string at a location. This will either return a String
|
||||||
* or null, with null meaning that no configuration value exists at
|
* or null, with null meaning that no configuration value exists at
|
||||||
* that location. If the object at the particular location is not actually
|
* that location. If the object at the particular location is not actually
|
||||||
* a string, it will be converted to its string representation.
|
* a string, it will be converted to its string representation.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @return string or null
|
* @return string or null
|
||||||
*/
|
*/
|
||||||
@ -214,10 +214,10 @@ public class YAMLNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a vector at a location. This will either return an Vector
|
* Gets a vector at a location. This will either return a Vector
|
||||||
* or a null. If the object at the particular location is not
|
* or a null. If the object at the particular location is not
|
||||||
* actually a string, it will be converted to its string representation.
|
* actually a string, it will be converted to its string representation.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @return string or default
|
* @return string or default
|
||||||
*/
|
*/
|
||||||
@ -239,10 +239,10 @@ public class YAMLNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a 2D vector at a location. This will either return an Vector
|
* Gets a 2D vector at a location. This will either return a Vector
|
||||||
* or a null. If the object at the particular location is not
|
* or a null. If the object at the particular location is not
|
||||||
* actually a string, it will be converted to its string representation.
|
* actually a string, it will be converted to its string representation.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @return string or default
|
* @return string or default
|
||||||
*/
|
*/
|
||||||
@ -263,10 +263,10 @@ public class YAMLNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a string at a location. This will either return an Vector
|
* Gets a string at a location. This will either return a Vector
|
||||||
* or the default value. If the object at the particular location is not
|
* or the default value. If the object at the particular location is not
|
||||||
* actually a string, it will be converted to its string representation.
|
* actually a string, it will be converted to its string representation.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value
|
* @param def default value
|
||||||
* @return string or default
|
* @return string or default
|
||||||
@ -281,10 +281,10 @@ public class YAMLNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a string at a location. This will either return an String
|
* Gets a string at a location. This will either return a String
|
||||||
* or the default value. If the object at the particular location is not
|
* or the default value. If the object at the particular location is not
|
||||||
* actually a string, it will be converted to its string representation.
|
* actually a string, it will be converted to its string representation.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value
|
* @param def default value
|
||||||
* @return string or default
|
* @return string or default
|
||||||
@ -303,7 +303,7 @@ public class YAMLNode {
|
|||||||
* or null. If the object at the particular location is not
|
* or null. If the object at the particular location is not
|
||||||
* actually a integer, the default value will be returned. However, other
|
* actually a integer, the default value will be returned. However, other
|
||||||
* number types will be casted to an integer.
|
* number types will be casted to an integer.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @return integer or null
|
* @return integer or null
|
||||||
*/
|
*/
|
||||||
@ -321,7 +321,7 @@ public class YAMLNode {
|
|||||||
* or the default value. If the object at the particular location is not
|
* or the default value. If the object at the particular location is not
|
||||||
* actually a integer, the default value will be returned. However, other
|
* actually a integer, the default value will be returned. However, other
|
||||||
* number types will be casted to an integer.
|
* number types will be casted to an integer.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value
|
* @param def default value
|
||||||
* @return int or default
|
* @return int or default
|
||||||
@ -337,11 +337,11 @@ public class YAMLNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a double at a location. This will either return an double
|
* Gets a double at a location. This will either return a double
|
||||||
* or null. If the object at the particular location is not
|
* or null. If the object at the particular location is not
|
||||||
* actually a double, the default value will be returned. However, other
|
* actually a double, the default value will be returned. However, other
|
||||||
* number types will be casted to an double.
|
* number types will be casted to a double.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @return double or null
|
* @return double or null
|
||||||
*/
|
*/
|
||||||
@ -355,11 +355,11 @@ public class YAMLNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a double at a location. This will either return an double
|
* Gets a double at a location. This will either return a double
|
||||||
* or the default value. If the object at the particular location is not
|
* or the default value. If the object at the particular location is not
|
||||||
* actually a double, the default value will be returned. However, other
|
* actually a double, the default value will be returned. However, other
|
||||||
* number types will be casted to an double.
|
* number types will be casted to a double.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value
|
* @param def default value
|
||||||
* @return double or default
|
* @return double or default
|
||||||
@ -375,10 +375,10 @@ public class YAMLNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a boolean at a location. This will either return an boolean
|
* Gets a boolean at a location. This will either return a boolean
|
||||||
* or null. If the object at the particular location is not
|
* or null. If the object at the particular location is not
|
||||||
* actually a boolean, the default value will be returned.
|
* actually a boolean, the default value will be returned.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @return boolean or null
|
* @return boolean or null
|
||||||
*/
|
*/
|
||||||
@ -392,10 +392,10 @@ public class YAMLNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a boolean at a location. This will either return an boolean
|
* Gets a boolean at a location. This will either return a boolean
|
||||||
* or the default value. If the object at the particular location is not
|
* or the default value. If the object at the particular location is not
|
||||||
* actually a boolean, the default value will be returned.
|
* actually a boolean, the default value will be returned.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value
|
* @param def default value
|
||||||
* @return boolean or default
|
* @return boolean or default
|
||||||
@ -413,7 +413,7 @@ public class YAMLNode {
|
|||||||
/**
|
/**
|
||||||
* Get a list of keys at a location. If the map at the particular location
|
* Get a list of keys at a location. If the map at the particular location
|
||||||
* does not exist or it is not a map, null will be returned.
|
* does not exist or it is not a map, null will be returned.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @return list of keys
|
* @return list of keys
|
||||||
*/
|
*/
|
||||||
@ -433,7 +433,7 @@ public class YAMLNode {
|
|||||||
/**
|
/**
|
||||||
* Gets a list of objects at a location. If the list is not defined,
|
* Gets a list of objects at a location. If the list is not defined,
|
||||||
* null will be returned. The node must be an actual list.
|
* null will be returned. The node must be an actual list.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @return boolean or default
|
* @return boolean or default
|
||||||
*/
|
*/
|
||||||
@ -456,7 +456,7 @@ public class YAMLNode {
|
|||||||
* and an empty list will be returned instead. If an item in the list
|
* and an empty list will be returned instead. If an item in the list
|
||||||
* is not a string, it will be converted to a string. The node must be
|
* is not a string, it will be converted to a string. The node must be
|
||||||
* an actual list and not just a string.
|
* an actual list and not just a string.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value or null for an empty list as default
|
* @param def default value or null for an empty list as default
|
||||||
* @return list of strings
|
* @return list of strings
|
||||||
@ -486,7 +486,7 @@ public class YAMLNode {
|
|||||||
* default will be returned. 'null' can be passed for the default
|
* default will be returned. 'null' can be passed for the default
|
||||||
* and an empty list will be returned instead. The node must be
|
* and an empty list will be returned instead. The node must be
|
||||||
* an actual list and not just an integer.
|
* an actual list and not just an integer.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value or null for an empty list as default
|
* @param def default value or null for an empty list as default
|
||||||
* @return list of integers
|
* @return list of integers
|
||||||
@ -515,7 +515,7 @@ public class YAMLNode {
|
|||||||
* default will be returned. 'null' can be passed for the default
|
* default will be returned. 'null' can be passed for the default
|
||||||
* and an empty list will be returned instead. The node must be
|
* and an empty list will be returned instead. The node must be
|
||||||
* an actual list and cannot be just a double.
|
* an actual list and cannot be just a double.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value or null for an empty list as default
|
* @param def default value or null for an empty list as default
|
||||||
* @return list of integers
|
* @return list of integers
|
||||||
@ -544,7 +544,7 @@ public class YAMLNode {
|
|||||||
* default will be returned. 'null' can be passed for the default
|
* default will be returned. 'null' can be passed for the default
|
||||||
* and an empty list will be returned instead. The node must be
|
* and an empty list will be returned instead. The node must be
|
||||||
* an actual list and cannot be just a boolean,
|
* an actual list and cannot be just a boolean,
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value or null for an empty list as default
|
* @param def default value or null for an empty list as default
|
||||||
* @return list of integers
|
* @return list of integers
|
||||||
@ -573,7 +573,7 @@ public class YAMLNode {
|
|||||||
* default will be returned. 'null' can be passed for the default
|
* default will be returned. 'null' can be passed for the default
|
||||||
* and an empty list will be returned instead. The node must be
|
* and an empty list will be returned instead. The node must be
|
||||||
* an actual node and cannot be just a vector,
|
* an actual node and cannot be just a vector,
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value or null for an empty list as default
|
* @param def default value or null for an empty list as default
|
||||||
* @return list of integers
|
* @return list of integers
|
||||||
@ -603,7 +603,7 @@ public class YAMLNode {
|
|||||||
* default will be returned. 'null' can be passed for the default
|
* default will be returned. 'null' can be passed for the default
|
||||||
* and an empty list will be returned instead. The node must be
|
* and an empty list will be returned instead. The node must be
|
||||||
* an actual node and cannot be just a vector,
|
* an actual node and cannot be just a vector,
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value or null for an empty list as default
|
* @param def default value or null for an empty list as default
|
||||||
* @return list of integers
|
* @return list of integers
|
||||||
@ -633,7 +633,7 @@ public class YAMLNode {
|
|||||||
* default will be returned. 'null' can be passed for the default
|
* default will be returned. 'null' can be passed for the default
|
||||||
* and an empty list will be returned instead. The node must be
|
* and an empty list will be returned instead. The node must be
|
||||||
* an actual node and cannot be just a vector,
|
* an actual node and cannot be just a vector,
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value or null for an empty list as default
|
* @param def default value or null for an empty list as default
|
||||||
* @return list of integers
|
* @return list of integers
|
||||||
@ -663,7 +663,7 @@ public class YAMLNode {
|
|||||||
* default will be returned. 'null' can be passed for the default
|
* default will be returned. 'null' can be passed for the default
|
||||||
* and an empty list will be returned instead. The node must be
|
* and an empty list will be returned instead. The node must be
|
||||||
* an actual node and cannot be just a boolean,
|
* an actual node and cannot be just a boolean,
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @param def default value or null for an empty list as default
|
* @param def default value or null for an empty list as default
|
||||||
* @return list of integers
|
* @return list of integers
|
||||||
@ -690,7 +690,7 @@ public class YAMLNode {
|
|||||||
* Get a configuration node at a path. If the node doesn't exist or the
|
* Get a configuration node at a path. If the node doesn't exist or the
|
||||||
* path does not lead to a node, null will be returned. A node has
|
* path does not lead to a node, null will be returned. A node has
|
||||||
* key/value mappings.
|
* key/value mappings.
|
||||||
*
|
*
|
||||||
* @param path the path
|
* @param path the path
|
||||||
* @return node or null
|
* @return node or null
|
||||||
*/
|
*/
|
||||||
@ -708,7 +708,7 @@ public class YAMLNode {
|
|||||||
/**
|
/**
|
||||||
* Get a list of nodes at a location. If the map at the particular location
|
* Get a list of nodes at a location. If the map at the particular location
|
||||||
* does not exist or it is not a map, null will be returned.
|
* does not exist or it is not a map, null will be returned.
|
||||||
*
|
*
|
||||||
* @param path path to node (dot notation)
|
* @param path path to node (dot notation)
|
||||||
* @return map of nodes
|
* @return map of nodes
|
||||||
*/
|
*/
|
||||||
@ -736,7 +736,7 @@ public class YAMLNode {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Casts a value to an integer. May return null.
|
* Casts a value to an integer. May return null.
|
||||||
*
|
*
|
||||||
* @param o the object
|
* @param o the object
|
||||||
* @return an integer or null
|
* @return an integer or null
|
||||||
*/
|
*/
|
||||||
@ -788,7 +788,7 @@ public class YAMLNode {
|
|||||||
/**
|
/**
|
||||||
* Remove the property at a location. This will override existing
|
* Remove the property at a location. This will override existing
|
||||||
* configuration data to have it conform to key/value mappings.
|
* configuration data to have it conform to key/value mappings.
|
||||||
*
|
*
|
||||||
* @param path a path
|
* @param path a path
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
@ -445,6 +445,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
|||||||
* @return whether the queue is enabled
|
* @return whether the queue is enabled
|
||||||
* @deprecated Use {@link EditSession#getReorderMode()} with MULTI_STAGE instead.
|
* @deprecated Use {@link EditSession#getReorderMode()} with MULTI_STAGE instead.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public boolean isQueueEnabled() {
|
public boolean isQueueEnabled() {
|
||||||
return true;
|
return true;
|
||||||
@ -456,6 +457,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
|||||||
* Uses {@link ReorderMode#MULTI_STAGE}
|
* Uses {@link ReorderMode#MULTI_STAGE}
|
||||||
* @deprecated Use {@link EditSession#setReorderMode(ReorderMode)} with MULTI_STAGE instead.
|
* @deprecated Use {@link EditSession#setReorderMode(ReorderMode)} with MULTI_STAGE instead.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void enableQueue() {
|
public void enableQueue() {
|
||||||
super.enableQueue();
|
super.enableQueue();
|
||||||
@ -464,6 +466,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
|||||||
/**
|
/**
|
||||||
* Disable the queue. This will close the queue.
|
* Disable the queue. This will close the queue.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void disableQueue() {
|
public void disableQueue() {
|
||||||
super.disableQueue();
|
super.disableQueue();
|
||||||
@ -1537,7 +1540,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
|||||||
/**
|
/**
|
||||||
* Drain nearby pools of water or lava, optionally removed waterlogged states from blocks.
|
* Drain nearby pools of water or lava, optionally removed waterlogged states from blocks.
|
||||||
*
|
*
|
||||||
* @param origin the origin to drain from, which will search a 3x3 area
|
* @param origin the origin to drain from, which will search a 3×3 area
|
||||||
* @param radius the radius of the removal, where a value should be 0 or greater
|
* @param radius the radius of the removal, where a value should be 0 or greater
|
||||||
* @param waterlogged true to make waterlogged blocks non-waterlogged as well
|
* @param waterlogged true to make waterlogged blocks non-waterlogged as well
|
||||||
* @return number of blocks affected
|
* @return number of blocks affected
|
||||||
@ -1566,7 +1569,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
|||||||
}
|
}
|
||||||
RecursiveVisitor visitor = new RecursiveVisitor(mask, replace, (int) (radius * 2 + 1));
|
RecursiveVisitor visitor = new RecursiveVisitor(mask, replace, (int) (radius * 2 + 1));
|
||||||
|
|
||||||
// Around the origin in a 3x3 block
|
// Around the origin in a 3×3 block
|
||||||
for (BlockVector3 position : CuboidRegion.fromCenter(origin, 1)) {
|
for (BlockVector3 position : CuboidRegion.fromCenter(origin, 1)) {
|
||||||
if (mask.test(position)) {
|
if (mask.test(position)) {
|
||||||
visitor.visit(position);
|
visitor.visit(position);
|
||||||
@ -1607,7 +1610,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
|
|||||||
BlockReplace replace = new BlockReplace(this, fluid.getDefaultState());
|
BlockReplace replace = new BlockReplace(this, fluid.getDefaultState());
|
||||||
NonRisingVisitor visitor = new NonRisingVisitor(mask, replace);
|
NonRisingVisitor visitor = new NonRisingVisitor(mask, replace);
|
||||||
|
|
||||||
// Around the origin in a 3x3 block
|
// Around the origin in a 3×3 block
|
||||||
for (BlockVector3 position : CuboidRegion.fromCenter(origin, 1)) {
|
for (BlockVector3 position : CuboidRegion.fromCenter(origin, 1)) {
|
||||||
if (liquidMask.test(position)) {
|
if (liquidMask.test(position)) {
|
||||||
visitor.visit(position);
|
visitor.visit(position);
|
||||||
|
@ -39,7 +39,6 @@ import com.boydti.fawe.util.StringMan;
|
|||||||
import com.boydti.fawe.util.TextureHolder;
|
import com.boydti.fawe.util.TextureHolder;
|
||||||
import com.boydti.fawe.util.TextureUtil;
|
import com.boydti.fawe.util.TextureUtil;
|
||||||
import com.boydti.fawe.wrappers.WorldWrapper;
|
import com.boydti.fawe.wrappers.WorldWrapper;
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import com.sk89q.jchronic.Chronic;
|
import com.sk89q.jchronic.Chronic;
|
||||||
import com.sk89q.jchronic.Options;
|
import com.sk89q.jchronic.Options;
|
||||||
import com.sk89q.jchronic.utils.Span;
|
import com.sk89q.jchronic.utils.Span;
|
||||||
@ -88,10 +87,8 @@ import java.io.FileOutputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.IdentityHashMap;
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
@ -889,7 +886,7 @@ public class LocalSession implements TextureHolder {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the position use for commands that take a center point
|
* Get the position use for commands that take a center point
|
||||||
* (i.e. //forestgen, etc.).
|
* (i.e., //forestgen, etc.).
|
||||||
*
|
*
|
||||||
* @param actor the actor
|
* @param actor the actor
|
||||||
* @return the position to use
|
* @return the position to use
|
||||||
|
@ -157,7 +157,7 @@ public class BrushCommands {
|
|||||||
aliases = {"bb", "blend"},
|
aliases = {"bb", "blend"},
|
||||||
desc = "Smooths and blends terrain",
|
desc = "Smooths and blends terrain",
|
||||||
descFooter = "Smooths and blends terrain\n" +
|
descFooter = "Smooths and blends terrain\n" +
|
||||||
"Pic: https://i.imgur.com/cNUQUkj.png -> https://i.imgur.com/hFOFsNf.png"
|
"Pic: https://i.imgur.com/cNUQUkj.png → https://i.imgur.com/hFOFsNf.png"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.blendball")
|
@CommandPermissions("worldedit.brush.blendball")
|
||||||
public void blendBallBrush(InjectedValueAccess context,
|
public void blendBallBrush(InjectedValueAccess context,
|
||||||
@ -203,7 +203,7 @@ public class BrushCommands {
|
|||||||
|
|
||||||
@Command(
|
@Command(
|
||||||
name = "circle",
|
name = "circle",
|
||||||
desc = "Creates a circle which revolves around your facing direction"
|
desc = "Creates a circle, which revolves around your facing direction"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.sphere")
|
@CommandPermissions("worldedit.brush.sphere")
|
||||||
public void circleBrush(Player player, InjectedValueAccess context,
|
public void circleBrush(Player player, InjectedValueAccess context,
|
||||||
@ -285,7 +285,7 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.sweep")
|
@CommandPermissions("worldedit.brush.sweep")
|
||||||
public void sweepBrush(Player player, InjectedValueAccess context,
|
public void sweepBrush(Player player, InjectedValueAccess context,
|
||||||
@Arg(name = "copies", desc = "int", def = "-1") int copies) throws WorldEditException {
|
@Arg(desc = "int", def = "-1") int copies) throws WorldEditException {
|
||||||
player.print(BBC.BRUSH_SPLINE.s());
|
player.print(BBC.BRUSH_SPLINE.s());
|
||||||
set(context, new SweepBrush(copies));
|
set(context, new SweepBrush(copies));
|
||||||
}
|
}
|
||||||
@ -324,10 +324,11 @@ public class BrushCommands {
|
|||||||
@CommandPermissions("worldedit.brush.surfacespline") // 0, 0, 0, 10, 0,
|
@CommandPermissions("worldedit.brush.surfacespline") // 0, 0, 0, 10, 0,
|
||||||
public void surfaceSpline(Player player, InjectedValueAccess context, Pattern fill,
|
public void surfaceSpline(Player player, InjectedValueAccess context, Pattern fill,
|
||||||
@Arg(desc = "The radius to sample for blending", def = "0")
|
@Arg(desc = "The radius to sample for blending", def = "0")
|
||||||
Expression radius, @Arg(name = "tension", desc = "double", def = "0") double tension,
|
Expression radius,
|
||||||
@Arg(name = "bias", desc = "double", def = "0") double bias,
|
@Arg(desc = "double", def = "0") double tension,
|
||||||
@Arg(name = "continuity", desc = "double", def = "0") double continuity,
|
@Arg(desc = "double", def = "0") double bias,
|
||||||
@Arg(name = "quality", desc = "double", def = "10") double quality) throws WorldEditException {
|
@Arg(desc = "double", def = "0") double continuity,
|
||||||
|
@Arg(desc = "double", def = "10") double quality) throws WorldEditException {
|
||||||
player.print(BBC.BRUSH_SPLINE.format(radius));
|
player.print(BBC.BRUSH_SPLINE.format(radius));
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
set(context,
|
set(context,
|
||||||
@ -343,13 +344,13 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.rock")
|
@CommandPermissions("worldedit.brush.rock")
|
||||||
public void blobBrush(InjectedValueAccess context, Pattern fill,
|
public void blobBrush(InjectedValueAccess context, Pattern fill,
|
||||||
@Arg(name = "radius", desc = "Vector3", def = "10")
|
@Arg(desc = "Vector3", def = "10")
|
||||||
Vector3 radius,
|
Vector3 radius,
|
||||||
@Arg(name = "sphericity", desc = "double", def = "100")
|
@Arg(desc = "double", def = "100")
|
||||||
double sphericity,
|
double sphericity,
|
||||||
@Arg(name = "frequency", desc = "double", def = "30")
|
@Arg(desc = "double", def = "30")
|
||||||
double frequency,
|
double frequency,
|
||||||
@Arg(name = "amplitude", desc = "double", def = "50")
|
@Arg(desc = "double", def = "50")
|
||||||
double amplitude) throws WorldEditException {
|
double amplitude) throws WorldEditException {
|
||||||
double max = MathMan.max(radius.getX(), radius.getY(), radius.getZ());
|
double max = MathMan.max(radius.getX(), radius.getY(), radius.getZ());
|
||||||
worldEdit.checkMaxBrushRadius(max);
|
worldEdit.checkMaxBrushRadius(max);
|
||||||
@ -424,10 +425,10 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.stencil")
|
@CommandPermissions("worldedit.brush.stencil")
|
||||||
public void stencilBrush(LocalSession session, InjectedValueAccess context, Pattern fill,
|
public void stencilBrush(LocalSession session, InjectedValueAccess context, Pattern fill,
|
||||||
@Arg(name = "radius", desc = "Expression", def = "5") Expression radius,
|
@Arg(desc = "Expression", def = "5") Expression radius,
|
||||||
@Arg(name = "image", desc = "String", def = "") String image,
|
@Arg(desc = "String", def = "") String image,
|
||||||
@Arg(def = "0", desc = "rotation") @Range(min = 0, max = 360) int rotation,
|
@Arg(def = "0", desc = "rotation") @Range(min = 0, max = 360) int rotation,
|
||||||
@Arg(name = "yscale", desc = "double", def = "1") double yscale,
|
@Arg(desc = "double", def = "1") double yscale,
|
||||||
@Switch(name = 'w', desc = "Apply at maximum saturation") boolean onlyWhite,
|
@Switch(name = 'w', desc = "Apply at maximum saturation") boolean onlyWhite,
|
||||||
@Switch(name = 'r', desc = "Apply random rotation") boolean randomRotate) throws WorldEditException, FileNotFoundException {
|
@Switch(name = 'r', desc = "Apply random rotation") boolean randomRotate) throws WorldEditException, FileNotFoundException {
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
@ -454,7 +455,7 @@ public class BrushCommands {
|
|||||||
descFooter = "Use a height map to paint any surface.\n")
|
descFooter = "Use a height map to paint any surface.\n")
|
||||||
@CommandPermissions("worldedit.brush.stencil")
|
@CommandPermissions("worldedit.brush.stencil")
|
||||||
public void imageBrush(LocalSession session, InjectedValueAccess context,
|
public void imageBrush(LocalSession session, InjectedValueAccess context,
|
||||||
@Arg(name = "radius", desc = "Expression", def = "5")
|
@Arg(desc = "Expression", def = "5")
|
||||||
Expression radius,
|
Expression radius,
|
||||||
ProvideBindings.ImageUri imageUri,
|
ProvideBindings.ImageUri imageUri,
|
||||||
@Arg(def = "1", desc = "scale height") @Range(min = Double.MIN_NORMAL)
|
@Arg(def = "1", desc = "scale height") @Range(min = Double.MIN_NORMAL)
|
||||||
@ -487,7 +488,7 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.surface")
|
@CommandPermissions("worldedit.brush.surface")
|
||||||
public void surfaceBrush(InjectedValueAccess context, Pattern fill,
|
public void surfaceBrush(InjectedValueAccess context, Pattern fill,
|
||||||
@Arg(name = "radius", desc = "Expression", def = "5")
|
@Arg(desc = "Expression", def = "5")
|
||||||
Expression radius) throws WorldEditException {
|
Expression radius) throws WorldEditException {
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
set(context, new SurfaceSphereBrush()).setFill(fill).setSize(radius);
|
set(context, new SurfaceSphereBrush()).setFill(fill).setSize(radius);
|
||||||
@ -501,16 +502,16 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.scatter")
|
@CommandPermissions("worldedit.brush.scatter")
|
||||||
public void scatterBrush(InjectedValueAccess context, Pattern fill,
|
public void scatterBrush(InjectedValueAccess context, Pattern fill,
|
||||||
@Arg(name = "radius", desc = "Expression", def = "5") Expression radius,
|
@Arg(desc = "Expression", def = "5") Expression radius,
|
||||||
@Arg(name = "points", desc = "double", def = "5") double pointsOpt,
|
@Arg(desc = "double", def = "5") double points,
|
||||||
@Arg(name = "distance", desc = "double", def = "1") double distanceOpt,
|
@Arg(desc = "double", def = "1") double distance,
|
||||||
@Switch(name = 'o', desc = "Overlay the block") boolean overlay) throws WorldEditException {
|
@Switch(name = 'o', desc = "Overlay the block") boolean overlay) throws WorldEditException {
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
Brush brush;
|
Brush brush;
|
||||||
if (overlay) {
|
if (overlay) {
|
||||||
brush = new ScatterOverlayBrush((int) pointsOpt, (int) distanceOpt);
|
brush = new ScatterOverlayBrush((int) points, (int) distance);
|
||||||
} else {
|
} else {
|
||||||
brush = new ScatterBrush((int) pointsOpt, (int) distanceOpt);
|
brush = new ScatterBrush((int) points, (int) distance);
|
||||||
}
|
}
|
||||||
set(context, brush).setSize(radius).setFill(fill);
|
set(context, brush).setSize(radius).setFill(fill);
|
||||||
}
|
}
|
||||||
@ -523,8 +524,8 @@ public class BrushCommands {
|
|||||||
@CommandPermissions("worldedit.brush.populateschematic")
|
@CommandPermissions("worldedit.brush.populateschematic")
|
||||||
public void scatterSchemBrush(Player player, InjectedValueAccess context, Mask mask,
|
public void scatterSchemBrush(Player player, InjectedValueAccess context, Mask mask,
|
||||||
@Arg(name = "clipboard", desc = "Clipboard uri") String clipboardStr,
|
@Arg(name = "clipboard", desc = "Clipboard uri") String clipboardStr,
|
||||||
@Arg(name = "radius", desc = "Expression", def = "30") Expression radius,
|
@Arg(desc = "Expression", def = "30") Expression radius,
|
||||||
@Arg(name = "density", desc = "double", def = "50") double density,
|
@Arg(desc = "double", def = "50") double density,
|
||||||
@Switch(name = 'r', desc = "Apply random rotation") boolean rotate) throws WorldEditException {
|
@Switch(name = 'r', desc = "Apply random rotation") boolean rotate) throws WorldEditException {
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
try {
|
try {
|
||||||
@ -555,7 +556,7 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.layer")
|
@CommandPermissions("worldedit.brush.layer")
|
||||||
public void surfaceLayer(InjectedValueAccess context,
|
public void surfaceLayer(InjectedValueAccess context,
|
||||||
@Arg(name = "radius", desc = "Expression") Expression radius, List<BlockState> blockLayers) throws WorldEditException {
|
@Arg(desc = "Expression") Expression radius, List<BlockState> blockLayers) throws WorldEditException {
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
set(context, new LayerBrush(blockLayers.toArray(new BlockState[0]))).setSize(radius);
|
set(context, new LayerBrush(blockLayers.toArray(new BlockState[0]))).setSize(radius);
|
||||||
}
|
}
|
||||||
@ -570,12 +571,12 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.splatter")
|
@CommandPermissions("worldedit.brush.splatter")
|
||||||
public void splatterBrush(InjectedValueAccess context, Pattern fill,
|
public void splatterBrush(InjectedValueAccess context, Pattern fill,
|
||||||
@Arg(name = "radius", desc = "Expression", def = "5") Expression radius,
|
@Arg(desc = "Expression", def = "5") Expression radius,
|
||||||
@Arg(name = "points", desc = "double", def = "1") double pointsOpt,
|
@Arg(desc = "double", def = "1") double points,
|
||||||
@Arg(name = "recursion", desc = "double", def = "5") double recursion,
|
@Arg(desc = "double", def = "5") double recursion,
|
||||||
@Arg(name = "solid", desc = "boolean", def = "true") boolean solid) throws WorldEditException {
|
@Arg(desc = "boolean", def = "true") boolean solid) throws WorldEditException {
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
set(context, new SplatterBrush((int) pointsOpt, (int) recursion, solid)).setSize(radius).setFill(fill);
|
set(context, new SplatterBrush((int) points, (int) recursion, solid)).setSize(radius).setFill(fill);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(
|
@Command(
|
||||||
@ -590,7 +591,7 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.scattercommand")
|
@CommandPermissions("worldedit.brush.scattercommand")
|
||||||
public void scatterCommandBrush(Player player, InjectedValueAccess context,
|
public void scatterCommandBrush(Player player, InjectedValueAccess context,
|
||||||
@Arg(name = "radius", desc = "Expression") Expression radius, double points,
|
@Arg(desc = "Expression") Expression radius, double points,
|
||||||
double distance, List<String> commandStr) throws WorldEditException {
|
double distance, List<String> commandStr) throws WorldEditException {
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
set(context,
|
set(context,
|
||||||
@ -732,7 +733,7 @@ public class BrushCommands {
|
|||||||
"Snow Pic: https://i.imgur.com/Hrzn0I4.png"
|
"Snow Pic: https://i.imgur.com/Hrzn0I4.png"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.height")
|
@CommandPermissions("worldedit.brush.height")
|
||||||
public void heightBrush(LocalSession session, @Arg(name = "radius", desc = "Expression", def = "5") Expression radius, @Arg(name = "image", desc = "String", def = "") String image, @Arg(def = "0", desc = "rotation") @Range(min = 0, max = 360) int rotation, @Arg(name = "yscale", desc = "double", def = "1") double yscale, @Switch(name = 'r', desc = "TODO") boolean randomRotate, @Switch(name = 'l', desc = "TODO") boolean layers, @Switch(name = 's', desc = "TODO") boolean dontSmooth, InjectedValueAccess context) throws WorldEditException, FileNotFoundException {
|
public void heightBrush(LocalSession session, @Arg(desc = "Expression", def = "5") Expression radius, @Arg(desc = "String", def = "") String image, @Arg(def = "0", desc = "rotation") @Range(min = 0, max = 360) int rotation, @Arg(desc = "double", def = "1") double yscale, @Switch(name = 'r', desc = "TODO") boolean randomRotate, @Switch(name = 'l', desc = "TODO") boolean layers, @Switch(name = 's', desc = "TODO") boolean dontSmooth, InjectedValueAccess context) throws WorldEditException, FileNotFoundException {
|
||||||
terrainBrush(session, radius, image, rotation, yscale, false, randomRotate, layers, !dontSmooth, ScalableHeightMap.Shape.CONE, context);
|
terrainBrush(session, radius, image, rotation, yscale, false, randomRotate, layers, !dontSmooth, ScalableHeightMap.Shape.CONE, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -744,13 +745,13 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.height")
|
@CommandPermissions("worldedit.brush.height")
|
||||||
public void cliffBrush(LocalSession session,
|
public void cliffBrush(LocalSession session,
|
||||||
@Arg(name = "radius", desc = "Expression", def = "5")
|
@Arg(desc = "Expression", def = "5")
|
||||||
Expression radius,
|
Expression radius,
|
||||||
@Arg(name = "image", desc = "String", def = "")
|
@Arg(desc = "String", def = "")
|
||||||
String image,
|
String image,
|
||||||
@Arg(def = "0", desc = "rotation") @Step(90) @Range(min = 0, max = 360)
|
@Arg(def = "0", desc = "rotation") @Step(90) @Range(min = 0, max = 360)
|
||||||
int rotation,
|
int rotation,
|
||||||
@Arg(name = "yscale", desc = "double", def = "1")
|
@Arg(desc = "double", def = "1")
|
||||||
double yscale,
|
double yscale,
|
||||||
@Switch(name = 'r', desc = "Enables random off-axis rotation")
|
@Switch(name = 'r', desc = "Enables random off-axis rotation")
|
||||||
boolean randomRotate,
|
boolean randomRotate,
|
||||||
@ -767,7 +768,7 @@ public class BrushCommands {
|
|||||||
desc = "This brush raises or lowers land towards the clicked point"
|
desc = "This brush raises or lowers land towards the clicked point"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.height")
|
@CommandPermissions("worldedit.brush.height")
|
||||||
public void flattenBrush(LocalSession session, @Arg(name = "radius", desc = "Expression", def = "5") Expression radius, @Arg(name = "image", desc = "String", def = "") String image, @Arg(def = "0", desc = "rotation") @Step(90) @Range(min = 0, max = 360) int rotation, @Arg(name = "yscale", desc = "double", def = "1") double yscale,
|
public void flattenBrush(LocalSession session, @Arg(desc = "Expression", def = "5") Expression radius, @Arg(desc = "String", def = "") String image, @Arg(def = "0", desc = "rotation") @Step(90) @Range(min = 0, max = 360) int rotation, @Arg(desc = "double", def = "1") double yscale,
|
||||||
@Switch(name = 'r', desc = "Enables random off-axis rotation")
|
@Switch(name = 'r', desc = "Enables random off-axis rotation")
|
||||||
boolean randomRotate,
|
boolean randomRotate,
|
||||||
@Switch(name = 'l', desc = "Will work on snow layers")
|
@Switch(name = 'l', desc = "Will work on snow layers")
|
||||||
@ -778,7 +779,7 @@ public class BrushCommands {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void terrainBrush(LocalSession session,
|
private void terrainBrush(LocalSession session,
|
||||||
@Arg(name = "radius", desc = "Expression") Expression radius, String image, int rotation,
|
@Arg(desc = "Expression") Expression radius, String image, int rotation,
|
||||||
double yscale, boolean flat, boolean randomRotate, boolean layers, boolean smooth,
|
double yscale, boolean flat, boolean randomRotate, boolean layers, boolean smooth,
|
||||||
Shape shape, InjectedValueAccess context) throws WorldEditException, FileNotFoundException {
|
Shape shape, InjectedValueAccess context) throws WorldEditException, FileNotFoundException {
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
@ -826,7 +827,7 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.copy")
|
@CommandPermissions("worldedit.brush.copy")
|
||||||
public void copy(Player player, LocalSession session, InjectedValueAccess context,
|
public void copy(Player player, LocalSession session, InjectedValueAccess context,
|
||||||
@Arg(name = "radius", desc = "Expression", def = "5") Expression radius,
|
@Arg(desc = "Expression", def = "5") Expression radius,
|
||||||
@Switch(name = 'r', desc = "Apply random rotation on paste") boolean randomRotate,
|
@Switch(name = 'r', desc = "Apply random rotation on paste") boolean randomRotate,
|
||||||
@Switch(name = 'a', desc = "Apply auto view based rotation on paste") boolean autoRotate) throws WorldEditException {
|
@Switch(name = 'a', desc = "Apply auto view based rotation on paste") boolean autoRotate) throws WorldEditException {
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
@ -847,7 +848,7 @@ public class BrushCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.brush.command")
|
@CommandPermissions("worldedit.brush.command")
|
||||||
public void command(InjectedValueAccess context,
|
public void command(InjectedValueAccess context,
|
||||||
@Arg(name = "radius", desc = "Expression") Expression radius,
|
@Arg(desc = "Expression") Expression radius,
|
||||||
@Arg(desc = "Command to run") List<String> input) throws WorldEditException {
|
@Arg(desc = "Command to run") List<String> input) throws WorldEditException {
|
||||||
worldEdit.checkMaxBrushRadius(radius);
|
worldEdit.checkMaxBrushRadius(radius);
|
||||||
String cmd = StringMan.join(input, " ");
|
String cmd = StringMan.join(input, " ");
|
||||||
|
@ -189,7 +189,7 @@ public class GeneralCommands {
|
|||||||
} else {
|
} else {
|
||||||
session.setUseServerCUI(true);
|
session.setUseServerCUI(true);
|
||||||
session.updateServerCUI(player);
|
session.updateServerCUI(player);
|
||||||
player.print("Server CUI enabled. This only supports cuboid regions, with a maximum size of 32x32x32.");
|
player.print("Server CUI enabled. This only supports cuboid regions, with a maximum size of 32×32×32.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,7 +211,7 @@ public class GeneralCommands {
|
|||||||
@Command(
|
@Command(
|
||||||
name = "gmask",
|
name = "gmask",
|
||||||
aliases = {"/gmask"},
|
aliases = {"/gmask"},
|
||||||
descFooter = "The global destination mask applies to all edits you do and masks based on the destination blocks (i.e. the blocks in the world).",
|
descFooter = "The global destination mask applies to all edits you do and masks based on the destination blocks (i.e., the blocks in the world).",
|
||||||
desc = "Set the global mask"
|
desc = "Set the global mask"
|
||||||
)
|
)
|
||||||
@CommandPermissions({"worldedit.global-mask", "worldedit.mask.global"})
|
@CommandPermissions({"worldedit.global-mask", "worldedit.mask.global"})
|
||||||
@ -308,7 +308,7 @@ public class GeneralCommands {
|
|||||||
@Command(
|
@Command(
|
||||||
name = "/gtexture",
|
name = "/gtexture",
|
||||||
aliases = {"gtexture"},
|
aliases = {"gtexture"},
|
||||||
descFooter = "The global destination mask applies to all edits you do and masks based on the destination blocks (i.e. the blocks in the world).",
|
descFooter = "The global destination mask applies to all edits you do and masks based on the destination blocks (i.e., the blocks in the world).",
|
||||||
desc = "Set the global mask"
|
desc = "Set the global mask"
|
||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.global-texture")
|
@CommandPermissions("worldedit.global-texture")
|
||||||
@ -368,7 +368,7 @@ public class GeneralCommands {
|
|||||||
name = "/gsmask",
|
name = "/gsmask",
|
||||||
aliases = {"gsmask", "globalsourcemask", "/globalsourcemask"},
|
aliases = {"gsmask", "globalsourcemask", "/globalsourcemask"},
|
||||||
desc = "Set the global source mask",
|
desc = "Set the global source mask",
|
||||||
descFooter = "The global source mask applies to all edits you do and masks based on the source blocks (e.g. the blocks in your clipboard)"
|
descFooter = "The global source mask applies to all edits you do and masks based on the source blocks (e.g., the blocks in your clipboard)"
|
||||||
)
|
)
|
||||||
@CommandPermissions({"worldedit.global-mask", "worldedit.mask.global"})
|
@CommandPermissions({"worldedit.global-mask", "worldedit.mask.global"})
|
||||||
public void gsmask(Player player, LocalSession session, EditSession editSession, @Arg(desc = "The mask to set", def = "") Mask maskOpt) throws WorldEditException {
|
public void gsmask(Player player, LocalSession session, EditSession editSession, @Arg(desc = "The mask to set", def = "") Mask maskOpt) throws WorldEditException {
|
||||||
|
@ -130,8 +130,8 @@ public class GenerationCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.generation.image")
|
@CommandPermissions("worldedit.generation.image")
|
||||||
@Logging(PLACEMENT)
|
@Logging(PLACEMENT)
|
||||||
public void image(Actor actor, LocalSession session, EditSession editSession, String argStr, @Arg(name = "randomize", desc = "boolean", def = "true") boolean randomize,
|
public void image(Actor actor, LocalSession session, EditSession editSession, String argStr, @Arg(desc = "boolean", def = "true") boolean randomize,
|
||||||
@Arg(desc = "TODO", def = "100") int threshold, @Arg(name = "dimensions", desc = "BlockVector2", def = "") BlockVector2 dimensions) throws WorldEditException, IOException {
|
@Arg(desc = "TODO", def = "100") int threshold, @Arg(desc = "BlockVector2", def = "") BlockVector2 dimensions) throws WorldEditException, IOException {
|
||||||
TextureUtil tu = Fawe.get().getCachedTextureUtil(randomize, 0, threshold);
|
TextureUtil tu = Fawe.get().getCachedTextureUtil(randomize, 0, threshold);
|
||||||
URL url = new URL(argStr);
|
URL url = new URL(argStr);
|
||||||
if (!url.getHost().equalsIgnoreCase("i.imgur.com") && !url.getHost().equalsIgnoreCase("empcraft.com")) {
|
if (!url.getHost().equalsIgnoreCase("i.imgur.com") && !url.getHost().equalsIgnoreCase("empcraft.com")) {
|
||||||
@ -171,7 +171,7 @@ public class GenerationCommands {
|
|||||||
)
|
)
|
||||||
@CommandPermissions("worldedit.generation.ore")
|
@CommandPermissions("worldedit.generation.ore")
|
||||||
@Logging(PLACEMENT)
|
@Logging(PLACEMENT)
|
||||||
public void ore(Actor actor, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, Pattern material, @Arg(name="size", desc="Ore vein size") @Range(min = 0) int size, int freq, @Range(min = 0, max = 100) int rarity, @Range(min = 0, max = 255) int minY, @Range(min = 0, max = 255) int maxY, InjectedValueAccess context) throws WorldEditException {
|
public void ore(Actor actor, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, Pattern material, @Arg(desc="Ore vein size") @Range(min = 0) int size, int freq, @Range(min = 0, max = 100) int rarity, @Range(min = 0, max = 255) int minY, @Range(min = 0, max = 255) int maxY, InjectedValueAccess context) throws WorldEditException {
|
||||||
actor.checkConfirmationRegion(() -> {
|
actor.checkConfirmationRegion(() -> {
|
||||||
editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY);
|
editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY);
|
||||||
BBC.VISITOR_BLOCK.send(actor, editSession.getBlockChangeCount());
|
BBC.VISITOR_BLOCK.send(actor, editSession.getBlockChangeCount());
|
||||||
@ -190,7 +190,7 @@ public class GenerationCommands {
|
|||||||
BlockVector2 radius,
|
BlockVector2 radius,
|
||||||
@Arg(desc = "The height of the cylinder", def = "1")
|
@Arg(desc = "The height of the cylinder", def = "1")
|
||||||
int height,
|
int height,
|
||||||
@Range(min = 1) @Arg(name = "thickness", desc = "double", def = "1") double thickness, InjectedValueAccess context) throws WorldEditException {
|
@Range(min = 1) @Arg(desc = "double", def = "1") double thickness, InjectedValueAccess context) throws WorldEditException {
|
||||||
double max = MathMan.max(radius.getBlockX(), radius.getBlockZ());
|
double max = MathMan.max(radius.getBlockX(), radius.getBlockZ());
|
||||||
worldEdit.checkMaxRadius(max);
|
worldEdit.checkMaxRadius(max);
|
||||||
BlockVector3 pos = session.getPlacementPosition(actor);
|
BlockVector3 pos = session.getPlacementPosition(actor);
|
||||||
@ -274,15 +274,15 @@ public class GenerationCommands {
|
|||||||
@CommandPermissions("worldedit.generation.forest")
|
@CommandPermissions("worldedit.generation.forest")
|
||||||
@Logging(POSITION)
|
@Logging(POSITION)
|
||||||
public int forestGen(Actor actor, LocalSession session, EditSession editSession,
|
public int forestGen(Actor actor, LocalSession session, EditSession editSession,
|
||||||
@Arg(name = "size", desc = "The size of the forest, in blocks", def = "10")
|
@Arg(desc = "The size of the forest, in blocks", def = "10")
|
||||||
int sizeOpt,
|
int size,
|
||||||
@Arg(desc = "The type of forest", def = "tree")
|
@Arg(desc = "The type of forest", def = "tree")
|
||||||
TreeType type,
|
TreeType type,
|
||||||
@Range(min = 0, max = 100) @Arg(desc = "The density of the forest, between 0 and 100", def = "5")
|
@Range(min = 0, max = 100) @Arg(desc = "The density of the forest, between 0 and 100", def = "5")
|
||||||
double density) throws WorldEditException {
|
double density) throws WorldEditException {
|
||||||
checkCommandArgument(0 <= density && density <= 100, "Density must be between 0 and 100");
|
checkCommandArgument(0 <= density && density <= 100, "Density must be between 0 and 100");
|
||||||
density /= 100;
|
density /= 100;
|
||||||
int affected = editSession.makeForest(session.getPlacementPosition(actor), sizeOpt, density, type);
|
int affected = editSession.makeForest(session.getPlacementPosition(actor), size, density, type);
|
||||||
actor.print(affected + " trees created.");
|
actor.print(affected + " trees created.");
|
||||||
return affected;
|
return affected;
|
||||||
}
|
}
|
||||||
@ -294,8 +294,8 @@ public class GenerationCommands {
|
|||||||
@CommandPermissions("worldedit.generation.pumpkins")
|
@CommandPermissions("worldedit.generation.pumpkins")
|
||||||
@Logging(POSITION)
|
@Logging(POSITION)
|
||||||
public int pumpkins(Actor actor, LocalSession session, EditSession editSession,
|
public int pumpkins(Actor actor, LocalSession session, EditSession editSession,
|
||||||
@Arg(name = "size", desc = "The size of the patch", def = "10")
|
@Arg(desc = "The size of the patch", def = "10")
|
||||||
int sizeOpt,
|
int size,
|
||||||
@Arg(desc = "//TODO", def = "10")
|
@Arg(desc = "//TODO", def = "10")
|
||||||
int apothem,
|
int apothem,
|
||||||
@Arg(desc = "//TODO ", def = "0.02")
|
@Arg(desc = "//TODO ", def = "0.02")
|
||||||
|
@ -67,7 +67,7 @@ import org.enginehub.piston.annotation.param.Arg;
|
|||||||
// descFooter = "Patterns determine what blocks are placed\n" +
|
// descFooter = "Patterns determine what blocks are placed\n" +
|
||||||
// " - Use [brackets] for arguments\n" +
|
// " - Use [brackets] for arguments\n" +
|
||||||
// " - Use , to OR multiple\n" +
|
// " - Use , to OR multiple\n" +
|
||||||
// "e.g. #surfacespread[10][#existing],andesite\n" +
|
// "e.g., #surfacespread[10][#existing],andesite\n" +
|
||||||
// "More Info: https://git.io/vSPmA"
|
// "More Info: https://git.io/vSPmA"
|
||||||
//)
|
//)
|
||||||
@CommandContainer//(superTypes = CommandPermissionsConditionGenerator.Registration.class)
|
@CommandContainer//(superTypes = CommandPermissionsConditionGenerator.Registration.class)
|
||||||
@ -78,7 +78,7 @@ public class PatternCommands {
|
|||||||
aliases = {"#*", "*", ".*"},
|
aliases = {"#*", "*", ".*"},
|
||||||
desc = "Use the block that is already there"
|
desc = "Use the block that is already there"
|
||||||
)
|
)
|
||||||
public Pattern existing(Extent extent, @Arg(name = "properties", desc = "String", def = "") String properties) { // TODO FIXME , @Arg(name = "properties", desc = "String", def = "") String properties
|
public Pattern existing(Extent extent, @Arg(desc = "String", def = "") String properties) { // TODO FIXME , @Arg(name = "properties", desc = "String", def = "") String properties
|
||||||
if (properties == null) return new ExistingPattern(extent);
|
if (properties == null) return new ExistingPattern(extent);
|
||||||
return new PropertyPattern(extent).addRegex(".*[" + properties + "]");
|
return new PropertyPattern(extent).addRegex(".*[" + properties + "]");
|
||||||
}
|
}
|
||||||
@ -119,16 +119,16 @@ public class PatternCommands {
|
|||||||
name = "#anglecolor",
|
name = "#anglecolor",
|
||||||
desc = "A darker block based on the existing terrain angle"
|
desc = "A darker block based on the existing terrain angle"
|
||||||
)
|
)
|
||||||
public Pattern anglecolor(Extent extent, LocalSession session, @Arg(name = "distance", desc = "int", def = "1") int distanceOpt) {
|
public Pattern anglecolor(Extent extent, LocalSession session, @Arg(desc = "int", def = "1") int distance) {
|
||||||
return new AngleColorPattern(extent, session, distanceOpt);
|
return new AngleColorPattern(extent, session, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(
|
@Command(
|
||||||
name = "#angledata",
|
name = "#angledata",
|
||||||
desc = "Block data based on the existing terrain angle"
|
desc = "Block data based on the existing terrain angle"
|
||||||
)
|
)
|
||||||
public Pattern angledata(Extent extent, @Arg(name = "distance", desc = "int", def = "1") int distanceOpt) {
|
public Pattern angledata(Extent extent, @Arg(desc = "int", def = "1") int distance) {
|
||||||
return new DataAnglePattern(extent, distanceOpt);
|
return new DataAnglePattern(extent, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(
|
@Command(
|
||||||
@ -153,7 +153,7 @@ public class PatternCommands {
|
|||||||
name = "#desaturate",
|
name = "#desaturate",
|
||||||
desc = "Desaturated color of the existing block"
|
desc = "Desaturated color of the existing block"
|
||||||
)
|
)
|
||||||
public Pattern desaturate(Extent extent, LocalSession session, @Arg(name = "percent", desc = "double", def = "100") double percent) {
|
public Pattern desaturate(Extent extent, LocalSession session, @Arg(desc = "double", def = "100") double percent) {
|
||||||
return new DesaturatePattern(extent, percent / 100d, session);
|
return new DesaturatePattern(extent, percent / 100d, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ public class PatternCommands {
|
|||||||
name = "#fullcopy",
|
name = "#fullcopy",
|
||||||
desc = "Places your full clipboard at each block"
|
desc = "Places your full clipboard at each block"
|
||||||
)
|
)
|
||||||
public Pattern fullcopy(Player player, Extent extent, LocalSession session, @Arg(name = "location", desc = "String", def = "#copy") String location, @Arg(name = "rotate", desc = "boolean", def = "false") boolean rotate, @Arg(name = "flip", desc = "boolean", def = "false") boolean flip) throws EmptyClipboardException, InputParseException, IOException {
|
public Pattern fullcopy(Player player, Extent extent, LocalSession session, @Arg(desc = "String", def = "#copy") String location, @Arg(desc = "boolean", def = "false") boolean rotate, @Arg(desc = "boolean", def = "false") boolean flip) throws EmptyClipboardException, InputParseException, IOException {
|
||||||
List<ClipboardHolder> clipboards;
|
List<ClipboardHolder> clipboards;
|
||||||
switch (location.toLowerCase()) {
|
switch (location.toLowerCase()) {
|
||||||
case "#copy":
|
case "#copy":
|
||||||
@ -313,14 +313,14 @@ public class PatternCommands {
|
|||||||
name = "#offset",
|
name = "#offset",
|
||||||
desc = "Offset a pattern"
|
desc = "Offset a pattern"
|
||||||
)
|
)
|
||||||
public Pattern offset(@Arg(name = "x", desc = "x offset") double x, @Arg(name = "y", desc = "y offset") double y, @Arg(name = "z", desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
|
public Pattern offset(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
|
||||||
|
|
||||||
return new OffsetPattern(pattern, (int) x, (int) y, (int) z);
|
return new OffsetPattern(pattern, (int) x, (int) y, (int) z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(
|
@Command(
|
||||||
name = "#surfacespread",
|
name = "#surfacespread",
|
||||||
desc = "Applies to only blocks on a surface. Selects a block from provided pattern with a given ranomized offset `[0, <distance>)`. e.g. Use `#existing` to randomly offset blocks in the world, or `#copy` to offset blocks in your clipboard"
|
desc = "Applies to only blocks on a surface. Selects a block from provided pattern with a given randomized offset `[0, <distance>)`. e.g., Use `#existing` to randomly offset blocks in the world, or `#copy` to offset blocks in your clipboard"
|
||||||
)
|
)
|
||||||
public Pattern surfacespread(@Arg(desc = "spread distance (blocks)") double distance, @Arg(desc = "Pattern")Pattern pattern) {
|
public Pattern surfacespread(@Arg(desc = "spread distance (blocks)") double distance, @Arg(desc = "Pattern")Pattern pattern) {
|
||||||
|
|
||||||
@ -331,7 +331,7 @@ public class PatternCommands {
|
|||||||
name = "#solidspread",
|
name = "#solidspread",
|
||||||
desc = "Randomly spread solid blocks"
|
desc = "Randomly spread solid blocks"
|
||||||
)
|
)
|
||||||
public Pattern solidspread(@Arg(name = "x", desc = "x offset") double x, @Arg(name = "y", desc = "y offset") double y, @Arg(name = "z", desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
|
public Pattern solidspread(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
|
||||||
|
|
||||||
return new SolidRandomOffsetPattern(pattern, (int) x, (int) y, (int) z);
|
return new SolidRandomOffsetPattern(pattern, (int) x, (int) y, (int) z);
|
||||||
}
|
}
|
||||||
@ -341,7 +341,7 @@ public class PatternCommands {
|
|||||||
aliases = {"#randomoffset"},
|
aliases = {"#randomoffset"},
|
||||||
desc = "Randomly spread blocks"
|
desc = "Randomly spread blocks"
|
||||||
)
|
)
|
||||||
public Pattern spread(@Arg(name = "x", desc = "x offset") double x, @Arg(name = "y", desc = "y offset") double y, @Arg(name = "z", desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
|
public Pattern spread(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
|
||||||
|
|
||||||
return new RandomOffsetPattern(pattern, (int) x, (int) y, (int) z);
|
return new RandomOffsetPattern(pattern, (int) x, (int) y, (int) z);
|
||||||
}
|
}
|
||||||
|
@ -221,7 +221,7 @@ public class UtilityCommands {
|
|||||||
descFooter = "Patterns determine what blocks are placed\n" +
|
descFooter = "Patterns determine what blocks are placed\n" +
|
||||||
" - Use [brackets] for arguments\n" +
|
" - Use [brackets] for arguments\n" +
|
||||||
" - Use , to OR multiple\n" +
|
" - Use , to OR multiple\n" +
|
||||||
"e.g. #surfacespread[10][#existing],andesite\n" +
|
"e.g., #surfacespread[10][#existing],andesite\n" +
|
||||||
"More Info: https://git.io/vSPmA"
|
"More Info: https://git.io/vSPmA"
|
||||||
)
|
)
|
||||||
@CommandQueued(false)
|
@CommandQueued(false)
|
||||||
@ -237,7 +237,7 @@ public class UtilityCommands {
|
|||||||
" - Use [brackets] for arguments\n" +
|
" - Use [brackets] for arguments\n" +
|
||||||
" - Use , to OR multiple\n" +
|
" - Use , to OR multiple\n" +
|
||||||
" - Use & to AND multiple\n" +
|
" - Use & to AND multiple\n" +
|
||||||
"e.g. >[stone,dirt],#light[0][5],$jungle\n" +
|
"e.g., >[stone,dirt],#light[0][5],$jungle\n" +
|
||||||
"More Info: https://git.io/v9r4K"
|
"More Info: https://git.io/v9r4K"
|
||||||
)
|
)
|
||||||
@CommandQueued(false)
|
@CommandQueued(false)
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package com.sk89q.worldedit.command.tool;
|
package com.sk89q.worldedit.command.tool;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
import com.boydti.fawe.config.BBC;
|
import com.boydti.fawe.config.BBC;
|
||||||
@ -83,7 +84,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool
|
|||||||
// TODO:
|
// TODO:
|
||||||
// Serialize methods
|
// Serialize methods
|
||||||
// serialize BrushSettings (primary and secondary only if different)
|
// serialize BrushSettings (primary and secondary only if different)
|
||||||
// set transient values e.g. context
|
// set transient values e.g., context
|
||||||
|
|
||||||
public enum BrushAction {
|
public enum BrushAction {
|
||||||
PRIMARY,
|
PRIMARY,
|
||||||
@ -126,7 +127,7 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool
|
|||||||
}.getType();
|
}.getType();
|
||||||
Map<String, Object> root = gson.fromJson(json, type);
|
Map<String, Object> root = gson.fromJson(json, type);
|
||||||
if (root == null) {
|
if (root == null) {
|
||||||
Fawe.debug("Failed to load " + json);
|
getLogger(BrushTool.class).debug("Failed to load " + json);
|
||||||
return new BrushTool();
|
return new BrushTool();
|
||||||
}
|
}
|
||||||
Map<String, Object> primary = (Map<String, Object>) root.get("primary");
|
Map<String, Object> primary = (Map<String, Object>) root.get("primary");
|
||||||
|
@ -354,7 +354,7 @@ public interface Player extends Entity, Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the World the player is editing in (may not match the world they are in)<br/> - e.g. If
|
* Get the World the player is editing in (may not match the world they are in)<br/> - e.g., If
|
||||||
* they are editing a CFI world.<br/>
|
* they are editing a CFI world.<br/>
|
||||||
*
|
*
|
||||||
* @return Editing world
|
* @return Editing world
|
||||||
@ -439,12 +439,12 @@ public interface Player extends Entity, Actor {
|
|||||||
getSession().setClipboard(holder);
|
getSession().setClipboard(holder);
|
||||||
}
|
}
|
||||||
} catch (Exception event) {
|
} catch (Exception event) {
|
||||||
Fawe.debug("====== INVALID CLIPBOARD ======");
|
printError("====== INVALID CLIPBOARD ======");
|
||||||
event.printStackTrace();
|
event.printStackTrace();
|
||||||
Fawe.debug("===============---=============");
|
printError("===============---=============");
|
||||||
Fawe.debug("This shouldn't result in any failure");
|
printError("This shouldn't result in any failure");
|
||||||
Fawe.debug("File: " + file.getName() + " (len:" + file.length() + ")");
|
printError("File: " + file.getName() + " (len:" + file.length() + ")");
|
||||||
Fawe.debug("===============---=============");
|
printError("===============---=============");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package com.sk89q.worldedit.extension.platform.binding;
|
package com.sk89q.worldedit.extension.platform.binding;
|
||||||
|
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import com.boydti.fawe.Fawe;
|
||||||
|
import com.boydti.fawe.util.MainUtil;
|
||||||
import com.boydti.fawe.util.StringMan;
|
import com.boydti.fawe.util.StringMan;
|
||||||
import com.sk89q.worldedit.WorldEdit;
|
import com.sk89q.worldedit.WorldEdit;
|
||||||
import com.sk89q.worldedit.internal.annotation.Selection;
|
import com.sk89q.worldedit.internal.annotation.Selection;
|
||||||
@ -56,7 +59,7 @@ public class Bindings {
|
|||||||
Annotation annotation = annotations[0] == binding ? annotations[1] : annotations[0];
|
Annotation annotation = annotations[0] == binding ? annotations[1] : annotations[0];
|
||||||
key = Key.of(ret, annotation);
|
key = Key.of(ret, annotation);
|
||||||
} else {
|
} else {
|
||||||
Fawe.debug("Cannot annotate: " + method + " with " + StringMan.getString(annotations));
|
getLogger(Bindings.class).debug("Cannot annotate: " + method + " with " + StringMan.getString(annotations));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,14 +20,15 @@
|
|||||||
package com.sk89q.worldedit.extent;
|
package com.sk89q.worldedit.extent;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
|
||||||
import com.boydti.fawe.beta.IBatchProcessor;
|
import com.boydti.fawe.beta.IBatchProcessor;
|
||||||
import com.boydti.fawe.object.HistoryExtent;
|
import com.boydti.fawe.object.HistoryExtent;
|
||||||
import com.boydti.fawe.object.changeset.FaweChangeSet;
|
import com.boydti.fawe.object.changeset.FaweChangeSet;
|
||||||
import com.boydti.fawe.object.exception.FaweException;
|
import com.boydti.fawe.object.exception.FaweException;
|
||||||
import com.boydti.fawe.object.extent.LightingExtent;
|
import com.boydti.fawe.object.extent.LightingExtent;
|
||||||
import com.boydti.fawe.util.ExtentTraverser;
|
import com.boydti.fawe.util.ExtentTraverser;
|
||||||
|
import com.boydti.fawe.util.MainUtil;
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
import com.sk89q.worldedit.WorldEditException;
|
import com.sk89q.worldedit.WorldEditException;
|
||||||
import com.sk89q.worldedit.entity.BaseEntity;
|
import com.sk89q.worldedit.entity.BaseEntity;
|
||||||
@ -81,6 +82,7 @@ public class AbstractDelegateExtent implements Extent, LightingExtent {
|
|||||||
Queue based methods
|
Queue based methods
|
||||||
TODO NOT IMPLEMENTED: IQueueExtent and such need to implement these
|
TODO NOT IMPLEMENTED: IQueueExtent and such need to implement these
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public boolean isQueueEnabled() {
|
public boolean isQueueEnabled() {
|
||||||
return extent.isQueueEnabled();
|
return extent.isQueueEnabled();
|
||||||
}
|
}
|
||||||
@ -97,7 +99,7 @@ public class AbstractDelegateExtent implements Extent, LightingExtent {
|
|||||||
Extent next = ((AbstractDelegateExtent) extent).getExtent();
|
Extent next = ((AbstractDelegateExtent) extent).getExtent();
|
||||||
new ExtentTraverser(this).setNext(next);
|
new ExtentTraverser(this).setNext(next);
|
||||||
} else {
|
} else {
|
||||||
Fawe.debug("Cannot disable queue");
|
getLogger(AbstractDelegateExtent.class).debug("Cannot disable queue");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,9 +199,7 @@ public class AbstractDelegateExtent implements Extent, LightingExtent {
|
|||||||
return extent.setBiome(position.getX(), 0, position.getZ(), biome);
|
return extent.setBiome(position.getX(), 0, position.getZ(), biome);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
@Override
|
||||||
Light
|
|
||||||
*/
|
|
||||||
public int getSkyLight(int x, int y, int z) {
|
public int getSkyLight(int x, int y, int z) {
|
||||||
if (extent instanceof LightingExtent) {
|
if (extent instanceof LightingExtent) {
|
||||||
return ((LightingExtent) extent).getSkyLight(x, y, z);
|
return ((LightingExtent) extent).getSkyLight(x, y, z);
|
||||||
@ -207,12 +207,14 @@ public class AbstractDelegateExtent implements Extent, LightingExtent {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public int getBlockLight(int x, int y, int z) {
|
public int getBlockLight(int x, int y, int z) {
|
||||||
if (extent instanceof LightingExtent) {
|
if (extent instanceof LightingExtent) {
|
||||||
return ((LightingExtent) extent).getBlockLight(x, y, z);
|
return ((LightingExtent) extent).getBlockLight(x, y, z);
|
||||||
}
|
}
|
||||||
return getBrightness(x, y, z);
|
return getBrightness(x, y, z);
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
public int getOpacity(int x, int y, int z) {
|
public int getOpacity(int x, int y, int z) {
|
||||||
if (extent instanceof LightingExtent) {
|
if (extent instanceof LightingExtent) {
|
||||||
return ((LightingExtent) extent).getOpacity(x, y, z);
|
return ((LightingExtent) extent).getOpacity(x, y, z);
|
||||||
|
@ -211,6 +211,7 @@ public class PassthroughExtent extends AbstractDelegateExtent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// special
|
// special
|
||||||
|
@Override
|
||||||
public Extent disableHistory() {
|
public Extent disableHistory() {
|
||||||
return super.disableHistory();
|
return super.disableHistory();
|
||||||
}
|
}
|
||||||
@ -235,14 +236,17 @@ public class PassthroughExtent extends AbstractDelegateExtent {
|
|||||||
return getExtent().cancel();
|
return getExtent().cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean isQueueEnabled() {
|
public boolean isQueueEnabled() {
|
||||||
return getExtent().isQueueEnabled();
|
return getExtent().isQueueEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void enableQueue() {
|
public void enableQueue() {
|
||||||
getExtent().enableQueue();
|
getExtent().enableQueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void disableQueue() {
|
public void disableQueue() {
|
||||||
getExtent().disableQueue();
|
getExtent().disableQueue();
|
||||||
}
|
}
|
||||||
|
@ -103,9 +103,9 @@ public interface ClipboardFormat {
|
|||||||
Set<String> getFileExtensions();
|
Set<String> getFileExtensions();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the actor's clipboard
|
* Sets the actor's clipboard.
|
||||||
* @param actor
|
* @param actor
|
||||||
* @param uri
|
* @param uri the URI of the schematic to hold
|
||||||
* @param inputStream the input stream
|
* @param inputStream the input stream
|
||||||
* @throws IOException thrown on I/O error
|
* @throws IOException thrown on I/O error
|
||||||
*/
|
*/
|
||||||
|
@ -20,11 +20,8 @@
|
|||||||
package com.sk89q.worldedit.extent.clipboard.io;
|
package com.sk89q.worldedit.extent.clipboard.io;
|
||||||
|
|
||||||
import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard;
|
import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard;
|
||||||
import com.sk89q.worldedit.extent.Extent;
|
|
||||||
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
|
|
||||||
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
|
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -48,12 +45,7 @@ public interface ClipboardReader extends Closeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default Clipboard read(UUID uuid) throws IOException {
|
default Clipboard read(UUID uuid) throws IOException {
|
||||||
return read(uuid, new Function<BlockVector3, Clipboard>() {
|
return read(uuid, DiskOptimizedClipboard::new);
|
||||||
@Override
|
|
||||||
public Clipboard apply(BlockVector3 dimensions) {
|
|
||||||
return new DiskOptimizedClipboard(dimensions);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default Clipboard read(UUID uuid, Function<BlockVector3, Clipboard> createOutput) throws IOException {
|
default Clipboard read(UUID uuid, Function<BlockVector3, Clipboard> createOutput) throws IOException {
|
||||||
|
@ -19,7 +19,9 @@
|
|||||||
|
|
||||||
package com.sk89q.worldedit.extent.clipboard.io;
|
package com.sk89q.worldedit.extent.clipboard.io;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.FaweCache;
|
import com.boydti.fawe.FaweCache;
|
||||||
import com.boydti.fawe.jnbt.streamer.InfoReader;
|
import com.boydti.fawe.jnbt.streamer.InfoReader;
|
||||||
import com.boydti.fawe.jnbt.streamer.IntValueReader;
|
import com.boydti.fawe.jnbt.streamer.IntValueReader;
|
||||||
@ -51,7 +53,6 @@ import com.sk89q.worldedit.world.block.BaseBlock;
|
|||||||
import com.sk89q.worldedit.world.block.BlockCategories;
|
import com.sk89q.worldedit.world.block.BlockCategories;
|
||||||
import com.sk89q.worldedit.world.block.BlockID;
|
import com.sk89q.worldedit.world.block.BlockID;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
|
||||||
import com.sk89q.worldedit.world.block.BlockType;
|
import com.sk89q.worldedit.world.block.BlockType;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypeSwitch;
|
import com.sk89q.worldedit.world.block.BlockTypeSwitch;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypeSwitchBuilder;
|
import com.sk89q.worldedit.world.block.BlockTypeSwitchBuilder;
|
||||||
@ -59,9 +60,6 @@ import com.sk89q.worldedit.world.entity.EntityType;
|
|||||||
import com.sk89q.worldedit.world.entity.EntityTypes;
|
import com.sk89q.worldedit.world.entity.EntityTypes;
|
||||||
import com.sk89q.worldedit.world.registry.BlockMaterial;
|
import com.sk89q.worldedit.world.registry.BlockMaterial;
|
||||||
import com.sk89q.worldedit.world.registry.LegacyMapper;
|
import com.sk89q.worldedit.world.registry.LegacyMapper;
|
||||||
import net.jpountz.lz4.LZ4BlockInputStream;
|
|
||||||
import net.jpountz.lz4.LZ4BlockOutputStream;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -69,8 +67,8 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import net.jpountz.lz4.LZ4BlockInputStream;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import net.jpountz.lz4.LZ4BlockOutputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads schematic files based that are compatible with MCEdit and other editors.
|
* Reads schematic files based that are compatible with MCEdit and other editors.
|
||||||
@ -180,21 +178,12 @@ public class SchematicReader implements ClipboardReader {
|
|||||||
|
|
||||||
StreamDelegate tilesDelegate = schematic.add("TileEntities");
|
StreamDelegate tilesDelegate = schematic.add("TileEntities");
|
||||||
tilesDelegate.withInfo((length, type) -> tiles = new ArrayList<>(length));
|
tilesDelegate.withInfo((length, type) -> tiles = new ArrayList<>(length));
|
||||||
tilesDelegate.withElem(new ValueReader<Map<String, Object>>() {
|
tilesDelegate.withElem((ValueReader<Map<String, Object>>) (index, tile) -> tiles.add(tile));
|
||||||
@Override
|
|
||||||
public void apply(int index, Map<String, Object> tile) {
|
|
||||||
tiles.add(tile);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
StreamDelegate entitiesDelegate = schematic.add("Entities");
|
StreamDelegate entitiesDelegate = schematic.add("Entities");
|
||||||
entitiesDelegate.withInfo((length, type) -> entities = new ArrayList<>(length));
|
entitiesDelegate.withInfo((length, type) -> entities = new ArrayList<>(length));
|
||||||
entitiesDelegate.withElem(new ValueReader<Map<String, Object>>() {
|
entitiesDelegate.withElem(
|
||||||
@Override
|
(ValueReader<Map<String, Object>>) (index, entity) -> entities.add(entity));
|
||||||
public void apply(int index, Map<String, Object> entity) {
|
|
||||||
entities.add(entity);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,7 +359,7 @@ public class SchematicReader implements ClipboardReader {
|
|||||||
Location loc = ent.getEntityLocation(clipboard);
|
Location loc = ent.getEntityLocation(clipboard);
|
||||||
clipboard.createEntity(loc, state);
|
clipboard.createEntity(loc, state);
|
||||||
} else {
|
} else {
|
||||||
Fawe.debug("Invalid entity: " + id);
|
getLogger(SchematicReader.class).debug("Invalid entity: " + id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -396,10 +385,10 @@ public class SchematicReader implements ClipboardReader {
|
|||||||
Direction left = facing.getLeft();
|
Direction left = facing.getLeft();
|
||||||
Direction right = facing.getRight();
|
Direction right = facing.getRight();
|
||||||
|
|
||||||
BlockStateHolder forwardBlock = fc.getBlock(x + forward.getBlockX(), y + forward.getBlockY(), z + forward.getBlockZ());
|
BlockState forwardBlock = fc.getBlock(x + forward.getBlockX(), y + forward.getBlockY(), z + forward.getBlockZ());
|
||||||
BlockType forwardType = forwardBlock.getBlockType();
|
BlockType forwardType = forwardBlock.getBlockType();
|
||||||
if (forwardType.hasProperty(PropertyKey.SHAPE) && forwardType.hasProperty(PropertyKey.FACING)) {
|
if (forwardType.hasProperty(PropertyKey.SHAPE) && forwardType.hasProperty(PropertyKey.FACING)) {
|
||||||
Direction forwardFacing = (Direction) forwardBlock.getState(PropertyKey.FACING);
|
Direction forwardFacing = forwardBlock.getState(PropertyKey.FACING);
|
||||||
if (forwardFacing == left) {
|
if (forwardFacing == left) {
|
||||||
BlockState rightBlock = fc.getBlock(x + right.toBlockVector().getBlockX(), y + right.toBlockVector().getBlockY(), z + right.toBlockVector().getBlockZ());
|
BlockState rightBlock = fc.getBlock(x + right.toBlockVector().getBlockX(), y + right.toBlockVector().getBlockY(), z + right.toBlockVector().getBlockZ());
|
||||||
BlockType rightType = rightBlock.getBlockType();
|
BlockType rightType = rightBlock.getBlockType();
|
||||||
|
@ -336,7 +336,7 @@ public class SpongeSchematicReader extends NBTSchematicReader {
|
|||||||
Location loc = ent.getEntityLocation(clipboard);
|
Location loc = ent.getEntityLocation(clipboard);
|
||||||
clipboard.createEntity(loc, state);
|
clipboard.createEntity(loc, state);
|
||||||
} else {
|
} else {
|
||||||
Fawe.debug("Invalid entity: " + id);
|
log.debug("Invalid entity: " + id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,8 @@
|
|||||||
package com.sk89q.worldedit.function.mask;
|
package com.sk89q.worldedit.function.mask;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.slf4j.LoggerFactory.getLogger;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import java.util.AbstractMap;
|
import java.util.AbstractMap;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -150,7 +150,7 @@ public class MaskIntersection extends AbstractMask {
|
|||||||
while (changed |= combineMasks(pairingFunction(), failedCombines) && --maxIteration > 0);
|
while (changed |= combineMasks(pairingFunction(), failedCombines) && --maxIteration > 0);
|
||||||
|
|
||||||
if (maxIteration == 0) {
|
if (maxIteration == 0) {
|
||||||
Fawe.debug("Failed optimize MaskIntersection");
|
getLogger(MaskIntersection.class).debug("Failed optimize MaskIntersection");
|
||||||
for (Mask mask : masks) {
|
for (Mask mask : masks) {
|
||||||
System.out.println(mask.getClass() + " / " + mask);
|
System.out.println(mask.getClass() + " / " + mask);
|
||||||
}
|
}
|
||||||
|
@ -31,12 +31,12 @@ import java.util.List;
|
|||||||
public final class Polygons {
|
public final class Polygons {
|
||||||
|
|
||||||
private Polygons() {
|
private Polygons() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the polygon shape of a cylinder which can then be used for e.g. intersection detection.
|
* Calculates the polygon shape of a cylinder, which can then be used for e.g., intersection detection.
|
||||||
*
|
*
|
||||||
* @param center the center point of the cylinder
|
* @param center the center point of the cylinder
|
||||||
* @param radius the radius of the cylinder
|
* @param radius the radius of the cylinder
|
||||||
* @param maxPoints max points to be used for the calculation
|
* @param maxPoints max points to be used for the calculation
|
||||||
@ -60,5 +60,5 @@ public final class Polygons {
|
|||||||
|
|
||||||
return points;
|
return points;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
package com.sk89q.worldedit.registry.state;
|
package com.sk89q.worldedit.registry.state;
|
||||||
|
|
||||||
import com.boydti.fawe.Fawe;
|
|
||||||
import com.boydti.fawe.util.ReflectionUtils;
|
import com.boydti.fawe.util.ReflectionUtils;
|
||||||
import com.sk89q.util.ReflectionUtil;
|
|
||||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -102,19 +98,18 @@ public enum PropertyKey {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get or create the property key
|
* Get or create the property key
|
||||||
* @param id The name of the property (e.g. `waterlogged`)
|
* @param id The name of the property (e.g., `waterlogged`)
|
||||||
* @return PropertyKey enum
|
* @return PropertyKey enum
|
||||||
*/
|
*/
|
||||||
public static final PropertyKey getOrCreate(String id) {
|
public static PropertyKey getOrCreate(String id) {
|
||||||
PropertyKey property = PropertyKey.get(id);
|
PropertyKey property = PropertyKey.get(id);
|
||||||
if (property == null) {
|
if (property == null) {
|
||||||
Fawe.debug("Registering property " + id);
|
|
||||||
property = ReflectionUtils.addEnum(PropertyKey.class, id.toUpperCase(Locale.ROOT));
|
property = ReflectionUtils.addEnum(PropertyKey.class, id.toUpperCase(Locale.ROOT));
|
||||||
if (property.getId() == null) {
|
if (property.getId() == null) {
|
||||||
try {
|
try {
|
||||||
ReflectionUtils.setFailsafeFieldValue(PropertyKey.class.getDeclaredField("id"), property, property.name().toLowerCase());
|
ReflectionUtils.setFailsafeFieldValue(PropertyKey.class.getDeclaredField("id"), property, property.name().toLowerCase());
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException("Could not register property with an id of " + id , e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
keys.put(property.name().toLowerCase(), property);
|
keys.put(property.name().toLowerCase(), property);
|
||||||
|
@ -82,7 +82,7 @@ public class BlockState implements BlockStateHolder<BlockState>, FawePattern {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a temporary BlockState for a given type and string
|
* Returns a temporary BlockState for a given type and string
|
||||||
* @param state String e.g. minecraft:water[level=4]
|
* @param state String e.g., minecraft:water[level=4]
|
||||||
* @return BlockState
|
* @return BlockState
|
||||||
*/
|
*/
|
||||||
public static BlockState get(String state) throws InputParseException {
|
public static BlockState get(String state) throws InputParseException {
|
||||||
@ -92,8 +92,8 @@ public class BlockState implements BlockStateHolder<BlockState>, FawePattern {
|
|||||||
/**
|
/**
|
||||||
* Returns a temporary BlockState for a given type and string
|
* Returns a temporary BlockState for a given type and string
|
||||||
* - It's faster if a BlockType is provided compared to parsing the string
|
* - It's faster if a BlockType is provided compared to parsing the string
|
||||||
* @param type BlockType e.g. BlockTypes.STONE (or null)
|
* @param type BlockType e.g., BlockTypes.STONE (or null)
|
||||||
* @param state String e.g. minecraft:water[level=4]
|
* @param state String e.g., minecraft:water[level=4]
|
||||||
* @return BlockState
|
* @return BlockState
|
||||||
*/
|
*/
|
||||||
public static BlockState get(@Nullable BlockType type, String state) throws InputParseException {
|
public static BlockState get(@Nullable BlockType type, String state) throws InputParseException {
|
||||||
@ -103,8 +103,8 @@ public class BlockState implements BlockStateHolder<BlockState>, FawePattern {
|
|||||||
/**
|
/**
|
||||||
* Returns a temporary BlockState for a given type and string
|
* Returns a temporary BlockState for a given type and string
|
||||||
* - It's faster if a BlockType is provided compared to parsing the string
|
* - It's faster if a BlockType is provided compared to parsing the string
|
||||||
* @param type BlockType e.g. BlockTypes.STONE (or null)
|
* @param type BlockType e.g., BlockTypes.STONE (or null)
|
||||||
* @param state String e.g. minecraft:water[level=4]
|
* @param state String e.g., minecraft:water[level=4]
|
||||||
* @return BlockState
|
* @return BlockState
|
||||||
*/
|
*/
|
||||||
public static BlockState get(@Nullable BlockType type, String state, BlockState defaultState) throws InputParseException {
|
public static BlockState get(@Nullable BlockType type, String state, BlockState defaultState) throws InputParseException {
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren