diff --git a/buildSrc/src/main/kotlin/PlatformConfig.kt b/buildSrc/src/main/kotlin/PlatformConfig.kt index 47db67011..d4a3d45cd 100644 --- a/buildSrc/src/main/kotlin/PlatformConfig.kt +++ b/buildSrc/src/main/kotlin/PlatformConfig.kt @@ -126,6 +126,18 @@ fun Project.applyShadowConfiguration() { } } +fun Project.addJarManifest(includeClasspath: Boolean = false) { + tasks.named("jar") { + val attributes = mutableMapOf( + "WorldEdit-Version" to project(":worldedit-core").version + ) + if (includeClasspath) { + attributes["Class-Path"] = CLASSPATH + } + manifest.attributes(attributes) + } +} + val CLASSPATH = listOf("truezip", "truevfs", "js") .map { "$it.jar" } .flatMap { listOf(it, "WorldEdit/$it") } diff --git a/gradle.properties b/gradle.properties index fc36c4337..71973855b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,5 +7,5 @@ org.gradle.configureondemand=true org.gradle.parallel=true org.gradle.caching=true -loom.version=0.2.6-20200124.104118-60 -mixin.version=0.8+build.17 +loom.version=0.4.33 +mixin.version=0.8.1+build.21 diff --git a/settings.gradle.kts b/settings.gradle.kts index 56f98fe6a..8b3b222f8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,7 +2,7 @@ rootProject.name = "FastAsyncWorldEdit" include("worldedit-libs") -listOf("bukkit", "core").forEach { +listOf("bukkit", "core", "fabric").forEach { include("worldedit-libs:$it") include("worldedit-$it") } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/CommandWrapper.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/CommandWrapper.java index f3f1da254..8590093a6 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/CommandWrapper.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/CommandWrapper.java @@ -19,10 +19,6 @@ package com.sk89q.worldedit.fabric; -import static com.sk89q.worldedit.fabric.FabricAdapter.adaptPlayer; -import static net.minecraft.server.command.CommandManager.argument; -import static net.minecraft.server.command.CommandManager.literal; - import com.google.common.collect.ImmutableList; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; @@ -50,6 +46,10 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Predicate; +import static com.sk89q.worldedit.fabric.FabricAdapter.adaptPlayer; +import static net.minecraft.server.command.CommandManager.argument; +import static net.minecraft.server.command.CommandManager.literal; + public final class CommandWrapper { @@ -60,14 +60,13 @@ public final class CommandWrapper { ImmutableList.Builder aliases = ImmutableList.builder(); aliases.add(command.getName()).addAll(command.getAliases()); - Command commandRunner = - ctx -> { - WorldEdit.getInstance().getEventBus().post(new com.sk89q.worldedit.event.platform.CommandEvent( - adaptPlayer(ctx.getSource().getPlayer()), - ctx.getInput() - )); - return 0; - }; + Command commandRunner = ctx -> { + WorldEdit.getInstance().getEventBus().post(new com.sk89q.worldedit.event.platform.CommandEvent( + adaptPlayer(ctx.getSource().getPlayer()), + ctx.getInput() + )); + return 0; + }; for (String alias : aliases.build()) { LiteralArgumentBuilder base = literal(alias).executes(commandRunner) diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java index 7b9fb2eaf..53b74c3f7 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricAdapter.java @@ -19,8 +19,6 @@ package com.sk89q.worldedit.fabric; -import static com.google.common.base.Preconditions.checkNotNull; - import com.google.common.collect.ImmutableList; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.Tag; @@ -45,8 +43,9 @@ import com.sk89q.worldedit.world.item.ItemTypes; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.state.StateFactory; +import net.minecraft.state.StateManager; import net.minecraft.state.property.DirectionProperty; import net.minecraft.util.Identifier; import net.minecraft.util.StringIdentifiable; @@ -57,11 +56,25 @@ import net.minecraft.world.biome.Biome; import java.util.Comparator; import java.util.Map; +import java.util.Objects; import java.util.TreeMap; import java.util.stream.Collectors; +import javax.annotation.Nullable; + +import static com.google.common.base.Preconditions.checkNotNull; public final class FabricAdapter { + private static @Nullable MinecraftServer server; + + private static MinecraftServer requireServer() { + return Objects.requireNonNull(server, "No server injected"); + } + + static void setServer(@Nullable MinecraftServer server) { + FabricAdapter.server = server; + } + private FabricAdapter() { } @@ -70,11 +83,16 @@ public final class FabricAdapter { } public static Biome adapt(BiomeType biomeType) { - return Registry.BIOME.get(new Identifier(biomeType.getId())); + return requireServer() + .getRegistryManager() + .get(Registry.BIOME_KEY) + .get(new Identifier(biomeType.getId())); } public static BiomeType adapt(Biome biome) { - return BiomeTypes.get(Registry.BIOME.getId(biome).toString()); + Identifier id = requireServer().getRegistryManager().get(Registry.BIOME_KEY).getId(biome); + Objects.requireNonNull(id, "biome is not registered"); + return BiomeTypes.get(id.toString()); } public static Vector3 adapt(Vec3d vector) { @@ -102,7 +120,10 @@ public final class FabricAdapter { } } - public static Direction adaptEnumFacing(net.minecraft.util.math.Direction face) { + public static Direction adaptEnumFacing(@Nullable net.minecraft.util.math.Direction face) { + if (face == null) { + return null; + } switch (face) { case NORTH: return Direction.NORTH; case SOUTH: return Direction.SOUTH; @@ -155,8 +176,9 @@ public final class FabricAdapter { return props; } - private static net.minecraft.block.BlockState applyProperties(StateFactory stateContainer, - net.minecraft.block.BlockState newState, Map, Object> states) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static net.minecraft.block.BlockState applyProperties(StateManager stateContainer, + net.minecraft.block.BlockState newState, Map, Object> states) { for (Map.Entry, Object> state : states.entrySet()) { net.minecraft.state.property.Property property = stateContainer.getProperty(state.getKey().getName()); Comparable value = (Comparable) state.getValue(); @@ -166,7 +188,7 @@ public final class FabricAdapter { value = adapt(dir); } else if (property instanceof net.minecraft.state.property.EnumProperty) { String enumName = (String) value; - value = ((net.minecraft.state.property.EnumProperty) property).getValue((String) value).orElseGet(() -> { + value = ((net.minecraft.state.property.EnumProperty) property).parse((String) value).orElseGet(() -> { throw new IllegalStateException("Enum property " + property.getName() + " does not contain " + enumName); }); } @@ -180,7 +202,7 @@ public final class FabricAdapter { Block mcBlock = adapt(blockState.getBlockType()); net.minecraft.block.BlockState newState = mcBlock.getDefaultState(); Map, Object> states = blockState.getStates(); - return applyProperties(mcBlock.getStateFactory(), newState, states); + return applyProperties(mcBlock.getStateManager(), newState, states); } public static BlockState adapt(net.minecraft.block.BlockState blockState) { diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBiomeRegistry.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBiomeRegistry.java index ea2c48849..d78b95bd5 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBiomeRegistry.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBiomeRegistry.java @@ -19,39 +19,50 @@ package com.sk89q.worldedit.fabric; +import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import com.sk89q.worldedit.world.biome.BiomeData; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.registry.BiomeRegistry; -import net.minecraft.world.biome.Biome; +import net.minecraft.util.Identifier; +import net.minecraft.util.Util; /** * Provides access to biome data in Fabric. */ class FabricBiomeRegistry implements BiomeRegistry { + @Override + public Component getRichName(BiomeType biomeType) { + return TranslatableComponent.of(Util.createTranslationKey("biome", new Identifier(biomeType.getId()))); + } + + @Deprecated @Override public BiomeData getData(BiomeType biome) { - return new FabricBiomeData(FabricAdapter.adapt(biome)); + return new FabricBiomeData(biome); } /** * Cached biome data information. */ + @Deprecated private static class FabricBiomeData implements BiomeData { - private final Biome biome; + private final BiomeType biome; /** * Create a new instance. * * @param biome the base biome */ - private FabricBiomeData(Biome biome) { + private FabricBiomeData(BiomeType biome) { this.biome = biome; } + @SuppressWarnings("deprecation") @Override public String getName() { - return biome.getName().asFormattedString(); + return biome.getId(); } } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockCategoryRegistry.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockCategoryRegistry.java index 7332eee79..1d5d1b185 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockCategoryRegistry.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockCategoryRegistry.java @@ -33,8 +33,11 @@ import java.util.stream.Collectors; public class FabricBlockCategoryRegistry implements BlockCategoryRegistry { @Override public Set getCategorisedByName(String category) { - return Optional.ofNullable(BlockTags.getContainer().get(new Identifier(category))) - .map(Tag::values).orElse(Collections.emptySet()) - .stream().map(FabricAdapter::adapt).collect(Collectors.toSet()); + return Optional.ofNullable(BlockTags.getTagGroup().getTag(new Identifier(category))) + .map(Tag::values) + .orElse(Collections.emptyList()) + .stream() + .map(FabricAdapter::adapt) + .collect(Collectors.toSet()); } } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockMaterial.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockMaterial.java index a91e489e9..ae420c10f 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockMaterial.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockMaterial.java @@ -21,6 +21,7 @@ package com.sk89q.worldedit.fabric; import com.sk89q.worldedit.world.registry.BlockMaterial; import com.sk89q.worldedit.world.registry.PassthroughBlockMaterial; +import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.block.piston.PistonBehavior; @@ -34,10 +35,12 @@ import javax.annotation.Nullable; public class FabricBlockMaterial extends PassthroughBlockMaterial { private final Material delegate; + private final BlockState block; - public FabricBlockMaterial(Material delegate, @Nullable BlockMaterial secondary) { + public FabricBlockMaterial(Material delegate, BlockState block, @Nullable BlockMaterial secondary) { super(secondary); this.delegate = delegate; + this.block = block; } @Override @@ -82,7 +85,7 @@ public class FabricBlockMaterial extends PassthroughBlockMaterial { @Override public boolean isToolRequired() { - return !delegate.canBreakByHand(); + return block.isToolRequired(); } @Override diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockRegistry.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockRegistry.java index c54a27769..0c1ff52eb 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockRegistry.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockRegistry.java @@ -20,16 +20,13 @@ package com.sk89q.worldedit.fabric; import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.registry.BlockMaterial; import com.sk89q.worldedit.world.registry.BundledBlockRegistry; -import net.fabricmc.api.EnvType; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.Block; -import net.minecraft.block.Material; - -import javax.annotation.Nullable; import java.util.Collection; import java.util.HashMap; @@ -39,24 +36,20 @@ import java.util.TreeMap; public class FabricBlockRegistry extends BundledBlockRegistry { - private Map materialMap = new HashMap<>(); + private final Map materialMap = new HashMap<>(); - @Nullable @Override - public String getName(BlockType blockType) { - Block block = FabricAdapter.adapt(blockType); - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - return block.getName().asFormattedString(); - } else { - return super.getName(blockType); - } + public Component getRichName(BlockType blockType) { + return TranslatableComponent.of(FabricAdapter.adapt(blockType).getTranslationKey()); } @Override public BlockMaterial getMaterial(BlockType blockType) { Block block = FabricAdapter.adapt(blockType); - return materialMap.computeIfAbsent(block.getDefaultState().getMaterial(), - m -> new FabricBlockMaterial(m, super.getMaterial(blockType))); + return materialMap.computeIfAbsent( + block.getDefaultState(), + m -> new FabricBlockMaterial(m.getMaterial(), m, super.getMaterial(blockType)) + ); } @Override diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricConfiguration.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricConfiguration.java index 555d79c74..76f2a9b4c 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricConfiguration.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricConfiguration.java @@ -21,7 +21,7 @@ package com.sk89q.worldedit.fabric; import com.sk89q.worldedit.util.PropertiesConfiguration; -import java.io.File; +import java.nio.file.Path; public class FabricConfiguration extends PropertiesConfiguration { @@ -29,7 +29,7 @@ public class FabricConfiguration extends PropertiesConfiguration { public boolean cheatMode = false; public FabricConfiguration(FabricWorldEdit mod) { - super(new File(mod.getWorkingDir(), "worldedit.properties")); + super(mod.getWorkingDir().resolve("worldedit.properties")); } @Override @@ -39,7 +39,7 @@ public class FabricConfiguration extends PropertiesConfiguration { } @Override - public File getWorkingDirectory() { + public Path getWorkingDirectoryPath() { return FabricWorldEdit.inst.getWorkingDir(); } } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricDataFixer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricDataFixer.java index 169dc01b6..e59956df3 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricDataFixer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricDataFixer.java @@ -33,18 +33,19 @@ import com.google.gson.JsonParseException; import com.mojang.datafixers.DSL.TypeReference; import com.mojang.datafixers.DataFixer; import com.mojang.datafixers.DataFixerBuilder; -import com.mojang.datafixers.Dynamic; import com.mojang.datafixers.schemas.Schema; +import com.mojang.serialization.Dynamic; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.fabric.internal.NBTConverter; -import net.minecraft.datafixer.NbtOps; import net.minecraft.datafixer.Schemas; import net.minecraft.datafixer.TypeReferences; import net.minecraft.nbt.FloatTag; import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; import net.minecraft.text.LiteralText; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.DyeColor; import net.minecraft.util.Identifier; @@ -66,25 +67,28 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.Executor; import java.util.stream.Collectors; - import javax.annotation.Nullable; /** * Handles converting all Pre 1.13.2 data using the Legacy DataFix System (ported to 1.13.2) * + *

* We register a DFU Fixer per Legacy Data Version and apply the fixes using legacy strategy * which is safer, faster and cleaner code. + *

* + *

* The pre DFU code did not fail when the Source version was unknown. + *

* + *

* This class also provides util methods for converting compounds to wrap the update call to - * receive the source version in the compound - * + * receive the source version in the compound. + *

*/ -@SuppressWarnings("UnnecessarilyQualifiedStaticUsage") +@SuppressWarnings({ "UnnecessarilyQualifiedStaticUsage", "unchecked", "rawtypes" }) class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.world.DataFixer { - @SuppressWarnings("unchecked") @Override public T fixUp(FixType type, T original, int srcVer) { if (type == FixTypes.CHUNK) { @@ -131,7 +135,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private String nbtToState(net.minecraft.nbt.CompoundTag tagCompound) { StringBuilder sb = new StringBuilder(); sb.append(tagCompound.getString("Name")); - if (tagCompound.containsKey("Properties", 10)) { + if (tagCompound.contains("Properties", 10)) { sb.append('['); net.minecraft.nbt.CompoundTag props = tagCompound.getCompound("Properties"); sb.append(props.getKeys().stream().map(k -> k + "=" + props.getString(k).replace("\"", "")).collect(Collectors.joining(","))); @@ -168,8 +172,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo } private static String fixName(String key, int srcVer, TypeReference type) { - return INSTANCE.fixer.update(type, new Dynamic<>(OPS_NBT, new StringTag(key)), srcVer, DATA_VERSION) - .asString().orElse(key); + return INSTANCE.fixer.update(type, new Dynamic<>(OPS_NBT, StringTag.of(key)), srcVer, DATA_VERSION) + .asString().result().orElse(key); } private static final NbtOps OPS_NBT = NbtOps.INSTANCE; @@ -181,7 +185,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private final Map> inspectors = new EnumMap<>(LegacyType.class); // Set on build - private DataFixer fixer; + private final DataFixer fixer; private static final Map DFU_TO_LEGACY = new HashMap<>(); public enum LegacyType { @@ -281,7 +285,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo } public static net.minecraft.nbt.CompoundTag convert(TypeReference type, net.minecraft.nbt.CompoundTag cmp) { - int i = cmp.containsKey("DataVersion", 99) ? cmp.getInt("DataVersion") : -1; + int i = cmp.contains("DataVersion", 99) ? cmp.getInt("DataVersion") : -1; return convert(type, cmp, i); } @@ -460,6 +464,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private void registerEntityItemListEquipment(String type) { registerEntityItemList(type, "ArmorItems", "HandItems"); } + private static final Map OLD_ID_TO_KEY_MAP = new HashMap<>(); static { @@ -587,17 +592,17 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo } private static void convertItem(net.minecraft.nbt.CompoundTag nbttagcompound, String key, int sourceVer, int targetVer) { - if (nbttagcompound.containsKey(key, 10)) { + if (nbttagcompound.contains(key, 10)) { convertCompound(LegacyType.ITEM_INSTANCE, nbttagcompound, key, sourceVer, targetVer); } } private static void convertItems(net.minecraft.nbt.CompoundTag nbttagcompound, String key, int sourceVer, int targetVer) { - if (nbttagcompound.containsKey(key, 9)) { + if (nbttagcompound.contains(key, 9)) { ListTag nbttaglist = nbttagcompound.getList(key, 10); for (int j = 0; j < nbttaglist.size(); ++j) { - nbttaglist.add(j, convert(LegacyType.ITEM_INSTANCE, nbttaglist.getCompoundTag(j), sourceVer, targetVer)); + nbttaglist.add(j, convert(LegacyType.ITEM_INSTANCE, nbttaglist.getCompound(j), sourceVer, targetVer)); } } @@ -605,7 +610,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterEquipment implements DataConverter { - DataConverterEquipment() {} + DataConverterEquipment() { + } @Override public int getDataVersion() { @@ -617,14 +623,14 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo ListTag nbttaglist = cmp.getList("Equipment", 10); ListTag nbttaglist1; - if (!nbttaglist.isEmpty() && !cmp.containsKey("HandItems", 10)) { + if (!nbttaglist.isEmpty() && !cmp.contains("HandItems", 10)) { nbttaglist1 = new ListTag(); nbttaglist1.add(nbttaglist.get(0)); nbttaglist1.add(new net.minecraft.nbt.CompoundTag()); cmp.put("HandItems", nbttaglist1); } - if (nbttaglist.size() > 1 && !cmp.containsKey("ArmorItem", 10)) { + if (nbttaglist.size() > 1 && !cmp.contains("ArmorItem", 10)) { nbttaglist1 = new ListTag(); nbttaglist1.add(nbttaglist.get(1)); nbttaglist1.add(nbttaglist.get(2)); @@ -634,23 +640,23 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo } cmp.remove("Equipment"); - if (cmp.containsKey("DropChances", 9)) { + if (cmp.contains("DropChances", 9)) { nbttaglist1 = cmp.getList("DropChances", 5); ListTag nbttaglist2; - if (!cmp.containsKey("HandDropChances", 10)) { + if (!cmp.contains("HandDropChances", 10)) { nbttaglist2 = new ListTag(); - nbttaglist2.add(new FloatTag(nbttaglist1.getFloat(0))); - nbttaglist2.add(new FloatTag(0.0F)); + nbttaglist2.add(FloatTag.of(nbttaglist1.getFloat(0))); + nbttaglist2.add(FloatTag.of(0.0F)); cmp.put("HandDropChances", nbttaglist2); } - if (!cmp.containsKey("ArmorDropChances", 10)) { + if (!cmp.contains("ArmorDropChances", 10)) { nbttaglist2 = new ListTag(); - nbttaglist2.add(new FloatTag(nbttaglist1.getFloat(1))); - nbttaglist2.add(new FloatTag(nbttaglist1.getFloat(2))); - nbttaglist2.add(new FloatTag(nbttaglist1.getFloat(3))); - nbttaglist2.add(new FloatTag(nbttaglist1.getFloat(4))); + nbttaglist2.add(FloatTag.of(nbttaglist1.getFloat(1))); + nbttaglist2.add(FloatTag.of(nbttaglist1.getFloat(2))); + nbttaglist2.add(FloatTag.of(nbttaglist1.getFloat(3))); + nbttaglist2.add(FloatTag.of(nbttaglist1.getFloat(4))); cmp.put("ArmorDropChances", nbttaglist2); } @@ -666,7 +672,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final Map b = Maps.newHashMap(); private static final Map c = Maps.newHashMap(); - DataInspectorBlockEntity() {} + DataInspectorBlockEntity() { + } @Nullable private static String convertEntityId(int i, String s) { @@ -680,12 +687,12 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo @Override public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { - if (!cmp.containsKey("tag", 10)) { + if (!cmp.contains("tag", 10)) { return cmp; } else { net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); - if (nbttagcompound1.containsKey("BlockEntityTag", 10)) { + if (nbttagcompound1.contains("BlockEntityTag", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttagcompound1.getCompound("BlockEntityTag"); String s = cmp.getString("id"); String s1 = convertEntityId(sourceVer, s); @@ -696,7 +703,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo // DataInspectorBlockEntity.a.warn("Unable to resolve BlockEntity for ItemInstance: {}", s); flag = false; } else { - flag = !nbttagcompound2.containsKey("id"); + flag = !nbttagcompound2.contains("id"); nbttagcompound2.putString("id", s1); } @@ -807,13 +814,14 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final Logger a = LogManager.getLogger(FabricDataFixer.class); - DataInspectorEntity() {} + DataInspectorEntity() { + } @Override public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); - if (nbttagcompound1.containsKey("EntityTag", 10)) { + if (nbttagcompound1.contains("EntityTag", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttagcompound1.getCompound("EntityTag"); String s = cmp.getString("id"); String s1; @@ -834,7 +842,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo DataInspectorEntity.a.warn("Unable to resolve Entity for ItemInstance: {}", s); flag = false; } else { - flag = !nbttagcompound2.containsKey("id", 8); + flag = !nbttagcompound2.contains("id", 8); nbttagcompound2.putString("id", s1); } @@ -885,6 +893,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo return nbttagcompound; } } + private static class DataInspectorItem extends DataInspectorTagged { private final String[] keys; @@ -907,14 +916,15 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final String[] materials = new String[2268]; - DataConverterMaterialId() {} + DataConverterMaterialId() { + } public int getDataVersion() { return 102; } public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { - if (cmp.containsKey("id", 99)) { + if (cmp.contains("id", 99)) { short short0 = cmp.getShort("id"); if (short0 > 0 && short0 < materials.length && materials[short0] != null) { @@ -1246,7 +1256,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterArmorStand implements DataConverter { - DataConverterArmorStand() {} + DataConverterArmorStand() { + } public int getDataVersion() { return 147; @@ -1263,25 +1274,26 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterBanner implements DataConverter { - DataConverterBanner() {} + DataConverterBanner() { + } public int getDataVersion() { return 804; } public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { - if ("minecraft:banner".equals(cmp.getString("id")) && cmp.containsKey("tag", 10)) { + if ("minecraft:banner".equals(cmp.getString("id")) && cmp.contains("tag", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); - if (nbttagcompound1.containsKey("BlockEntityTag", 10)) { + if (nbttagcompound1.contains("BlockEntityTag", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttagcompound1.getCompound("BlockEntityTag"); - if (nbttagcompound2.containsKey("Base", 99)) { + if (nbttagcompound2.contains("Base", 99)) { cmp.putShort("Damage", (short) (nbttagcompound2.getShort("Base") & 15)); - if (nbttagcompound1.containsKey("display", 10)) { + if (nbttagcompound1.contains("display", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound3 = nbttagcompound1.getCompound("display"); - if (nbttagcompound3.containsKey("Lore", 9)) { + if (nbttagcompound3.contains("Lore", 9)) { ListTag nbttaglist = nbttagcompound3.getList("Lore", 8); if (nbttaglist.size() == 1 && "(+NBT)".equals(nbttaglist.getString(0))) { @@ -1310,7 +1322,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final String[] potions = new String[128]; - DataConverterPotionId() {} + DataConverterPotionId() { + } public int getDataVersion() { return 102; @@ -1321,7 +1334,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); short short0 = cmp.getShort("Damage"); - if (!nbttagcompound1.containsKey("Potion", 8)) { + if (!nbttagcompound1.contains("Potion", 8)) { String s = DataConverterPotionId.potions[short0 & 127]; nbttagcompound1.putString("Potion", s == null ? "minecraft:water" : s); @@ -1475,7 +1488,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final String[] eggs = new String[256]; - DataConverterSpawnEgg() {} + DataConverterSpawnEgg() { + } public int getDataVersion() { return 105; @@ -1487,7 +1501,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttagcompound1.getCompound("EntityTag"); short short0 = cmp.getShort("Damage"); - if (!nbttagcompound2.containsKey("id", 8)) { + if (!nbttagcompound2.contains("id", 8)) { String s = DataConverterSpawnEgg.eggs[short0 & 255]; if (s != null) { @@ -1579,9 +1593,10 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterMinecart implements DataConverter { - private static final List a = Lists.newArrayList(new String[] { "MinecartRideable", "MinecartChest", "MinecartFurnace", "MinecartTNT", "MinecartSpawner", "MinecartHopper", "MinecartCommandBlock"}); + private static final List a = Lists.newArrayList(new String[] { "MinecartRideable", "MinecartChest", "MinecartFurnace", "MinecartTNT", "MinecartSpawner", "MinecartHopper", "MinecartCommandBlock" }); - DataConverterMinecart() {} + DataConverterMinecart() { + } public int getDataVersion() { return 106; @@ -1606,7 +1621,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterMobSpawner implements DataConverter { - DataConverterMobSpawner() {} + DataConverterMobSpawner() { + } public int getDataVersion() { return 107; @@ -1616,7 +1632,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo if (!"MobSpawner".equals(cmp.getString("id"))) { return cmp; } else { - if (cmp.containsKey("EntityId", 8)) { + if (cmp.contains("EntityId", 8)) { String s = cmp.getString("EntityId"); net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("SpawnData"); @@ -1625,13 +1641,13 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo cmp.remove("EntityId"); } - if (cmp.containsKey("SpawnPotentials", 9)) { + if (cmp.contains("SpawnPotentials", 9)) { ListTag nbttaglist = cmp.getList("SpawnPotentials", 10); for (int i = 0; i < nbttaglist.size(); ++i) { - net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttaglist.getCompoundTag(i); + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttaglist.getCompound(i); - if (nbttagcompound2.containsKey("Type", 8)) { + if (nbttagcompound2.contains("Type", 8)) { net.minecraft.nbt.CompoundTag nbttagcompound3 = nbttagcompound2.getCompound("Properties"); nbttagcompound3.putString("id", nbttagcompound2.getString("Type")); @@ -1649,14 +1665,15 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterUUID implements DataConverter { - DataConverterUUID() {} + DataConverterUUID() { + } public int getDataVersion() { return 108; } public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { - if (cmp.containsKey("UUID", 8)) { + if (cmp.contains("UUID", 8)) { cmp.putUuid("UUID", UUID.fromString(cmp.getString("UUID"))); } @@ -1668,7 +1685,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final Set a = Sets.newHashSet("ArmorStand", "Bat", "Blaze", "CaveSpider", "Chicken", "Cow", "Creeper", "EnderDragon", "Enderman", "Endermite", "EntityHorse", "Ghast", "Giant", "Guardian", "LavaSlime", "MushroomCow", "Ozelot", "Pig", "PigZombie", "Rabbit", "Sheep", "Shulker", "Silverfish", "Skeleton", "Slime", "SnowMan", "Spider", "Squid", "Villager", "VillagerGolem", "Witch", "WitherBoss", "Wolf", "Zombie"); - DataConverterHealth() {} + DataConverterHealth() { + } public int getDataVersion() { return 109; @@ -1678,11 +1696,11 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo if (DataConverterHealth.a.contains(cmp.getString("id"))) { float f; - if (cmp.containsKey("HealF", 99)) { + if (cmp.contains("HealF", 99)) { f = cmp.getFloat("HealF"); cmp.remove("HealF"); } else { - if (!cmp.containsKey("Health", 99)) { + if (!cmp.contains("Health", 99)) { return cmp; } @@ -1698,14 +1716,15 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterSaddle implements DataConverter { - DataConverterSaddle() {} + DataConverterSaddle() { + } public int getDataVersion() { return 110; } public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { - if ("EntityHorse".equals(cmp.getString("id")) && !cmp.containsKey("SaddleItem", 10) && cmp.getBoolean("Saddle")) { + if ("EntityHorse".equals(cmp.getString("id")) && !cmp.contains("SaddleItem", 10) && cmp.getBoolean("Saddle")) { net.minecraft.nbt.CompoundTag nbttagcompound1 = new net.minecraft.nbt.CompoundTag(); nbttagcompound1.putString("id", "minecraft:saddle"); @@ -1721,7 +1740,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterHanging implements DataConverter { - DataConverterHanging() {} + DataConverterHanging() { + } public int getDataVersion() { return 111; @@ -1732,16 +1752,16 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo boolean flag = "Painting".equals(s); boolean flag1 = "ItemFrame".equals(s); - if ((flag || flag1) && !cmp.containsKey("Facing", 99)) { + if ((flag || flag1) && !cmp.contains("Facing", 99)) { Direction enumdirection; - if (cmp.containsKey("Direction", 99)) { + if (cmp.contains("Direction", 99)) { enumdirection = Direction.fromHorizontal(cmp.getByte("Direction")); cmp.putInt("TileX", cmp.getInt("TileX") + enumdirection.getOffsetX()); cmp.putInt("TileY", cmp.getInt("TileY") + enumdirection.getOffsetY()); cmp.putInt("TileZ", cmp.getInt("TileZ") + enumdirection.getOffsetZ()); cmp.remove("Direction"); - if (flag1 && cmp.containsKey("ItemRotation", 99)) { + if (flag1 && cmp.contains("ItemRotation", 99)) { cmp.putByte("ItemRotation", (byte) (cmp.getByte("ItemRotation") * 2)); } } else { @@ -1758,7 +1778,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterDropChances implements DataConverter { - DataConverterDropChances() {} + DataConverterDropChances() { + } public int getDataVersion() { return 113; @@ -1767,14 +1788,14 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { ListTag nbttaglist; - if (cmp.containsKey("HandDropChances", 9)) { + if (cmp.contains("HandDropChances", 9)) { nbttaglist = cmp.getList("HandDropChances", 5); if (nbttaglist.size() == 2 && nbttaglist.getFloat(0) == 0.0F && nbttaglist.getFloat(1) == 0.0F) { cmp.remove("HandDropChances"); } } - if (cmp.containsKey("ArmorDropChances", 9)) { + if (cmp.contains("ArmorDropChances", 9)) { nbttaglist = cmp.getList("ArmorDropChances", 5); if (nbttaglist.size() == 4 && nbttaglist.getFloat(0) == 0.0F && nbttaglist.getFloat(1) == 0.0F && nbttaglist.getFloat(2) == 0.0F && nbttaglist.getFloat(3) == 0.0F) { cmp.remove("ArmorDropChances"); @@ -1787,14 +1808,15 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterRiding implements DataConverter { - DataConverterRiding() {} + DataConverterRiding() { + } public int getDataVersion() { return 135; } public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { - while (cmp.containsKey("Riding", 10)) { + while (cmp.contains("Riding", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound1 = this.b(cmp); this.convert(cmp, nbttagcompound1); @@ -1821,7 +1843,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterBook implements DataConverter { - DataConverterBook() {} + DataConverterBook() { + } public int getDataVersion() { return 165; @@ -1831,7 +1854,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo if ("minecraft:written_book".equals(cmp.getString("id"))) { net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); - if (nbttagcompound1.containsKey("pages", 9)) { + if (nbttagcompound1.contains("pages", 9)) { ListTag nbttaglist = nbttagcompound1.getList("pages", 8); for (int i = 0; i < nbttaglist.size(); ++i) { @@ -1875,7 +1898,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo object = new LiteralText(""); } - nbttaglist.set(i, new StringTag(Text.Serializer.toJson((Text) object))); + nbttaglist.set(i, StringTag.of(Text.Serializer.toJson((Text) object))); } nbttagcompound1.put("pages", nbttaglist); @@ -1890,14 +1913,15 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final Identifier a = new Identifier("cooked_fished"); - DataConverterCookedFish() {} + DataConverterCookedFish() { + } public int getDataVersion() { return 502; } public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { - if (cmp.containsKey("id", 8) && DataConverterCookedFish.a.equals(new Identifier(cmp.getString("id")))) { + if (cmp.contains("id", 8) && DataConverterCookedFish.a.equals(new Identifier(cmp.getString("id")))) { cmp.putString("id", "minecraft:cooked_fish"); } @@ -1909,7 +1933,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final Random a = new Random(); - DataConverterZombie() {} + DataConverterZombie() { + } public int getDataVersion() { return 502; @@ -1917,10 +1942,10 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { if ("Zombie".equals(cmp.getString("id")) && cmp.getBoolean("IsVillager")) { - if (!cmp.containsKey("ZombieType", 99)) { + if (!cmp.contains("ZombieType", 99)) { int i = -1; - if (cmp.containsKey("VillagerProfession", 99)) { + if (cmp.contains("VillagerProfession", 99)) { try { i = this.convert(cmp.getInt("VillagerProfession")); } catch (RuntimeException runtimeexception) { @@ -1948,7 +1973,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterVBO implements DataConverter { - DataConverterVBO() {} + DataConverterVBO() { + } public int getDataVersion() { return 505; @@ -1962,7 +1988,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterGuardian implements DataConverter { - DataConverterGuardian() {} + DataConverterGuardian() { + } public int getDataVersion() { return 700; @@ -1983,7 +2010,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterSkeleton implements DataConverter { - DataConverterSkeleton() {} + DataConverterSkeleton() { + } public int getDataVersion() { return 701; @@ -2010,7 +2038,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterZombieType implements DataConverter { - DataConverterZombieType() {} + DataConverterZombieType() { + } public int getDataVersion() { return 702; @@ -2045,7 +2074,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterHorse implements DataConverter { - DataConverterHorse() {} + DataConverterHorse() { + } public int getDataVersion() { return 703; @@ -2089,7 +2119,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final Map a = Maps.newHashMap(); - DataConverterTileEntity() {} + DataConverterTileEntity() { + } public int getDataVersion() { return 704; @@ -2136,7 +2167,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final Map a = Maps.newHashMap(); - DataConverterEntity() {} + DataConverterEntity() { + } public int getDataVersion() { return 704; @@ -2233,7 +2265,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterPotionWater implements DataConverter { - DataConverterPotionWater() {} + DataConverterPotionWater() { + } public int getDataVersion() { return 806; @@ -2245,11 +2278,11 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo if ("minecraft:potion".equals(s) || "minecraft:splash_potion".equals(s) || "minecraft:lingering_potion".equals(s) || "minecraft:tipped_arrow".equals(s)) { net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); - if (!nbttagcompound1.containsKey("Potion", 8)) { + if (!nbttagcompound1.contains("Potion", 8)) { nbttagcompound1.putString("Potion", "minecraft:water"); } - if (!cmp.containsKey("tag", 10)) { + if (!cmp.contains("tag", 10)) { cmp.put("tag", nbttagcompound1); } } @@ -2260,14 +2293,15 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterShulker implements DataConverter { - DataConverterShulker() {} + DataConverterShulker() { + } public int getDataVersion() { return 808; } public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { - if ("minecraft:shulker".equals(cmp.getString("id")) && !cmp.containsKey("Color", 99)) { + if ("minecraft:shulker".equals(cmp.getString("id")) && !cmp.contains("Color", 99)) { cmp.putByte("Color", (byte) 10); } @@ -2277,19 +2311,20 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterShulkerBoxItem implements DataConverter { - public static final String[] a = new String[] { "minecraft:white_shulker_box", "minecraft:orange_shulker_box", "minecraft:magenta_shulker_box", "minecraft:light_blue_shulker_box", "minecraft:yellow_shulker_box", "minecraft:lime_shulker_box", "minecraft:pink_shulker_box", "minecraft:gray_shulker_box", "minecraft:silver_shulker_box", "minecraft:cyan_shulker_box", "minecraft:purple_shulker_box", "minecraft:blue_shulker_box", "minecraft:brown_shulker_box", "minecraft:green_shulker_box", "minecraft:red_shulker_box", "minecraft:black_shulker_box"}; + public static final String[] a = new String[] { "minecraft:white_shulker_box", "minecraft:orange_shulker_box", "minecraft:magenta_shulker_box", "minecraft:light_blue_shulker_box", "minecraft:yellow_shulker_box", "minecraft:lime_shulker_box", "minecraft:pink_shulker_box", "minecraft:gray_shulker_box", "minecraft:silver_shulker_box", "minecraft:cyan_shulker_box", "minecraft:purple_shulker_box", "minecraft:blue_shulker_box", "minecraft:brown_shulker_box", "minecraft:green_shulker_box", "minecraft:red_shulker_box", "minecraft:black_shulker_box" }; - DataConverterShulkerBoxItem() {} + DataConverterShulkerBoxItem() { + } public int getDataVersion() { return 813; } public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { - if ("minecraft:shulker_box".equals(cmp.getString("id")) && cmp.containsKey("tag", 10)) { + if ("minecraft:shulker_box".equals(cmp.getString("id")) && cmp.contains("tag", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); - if (nbttagcompound1.containsKey("BlockEntityTag", 10)) { + if (nbttagcompound1.contains("BlockEntityTag", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttagcompound1.getCompound("BlockEntityTag"); if (nbttagcompound2.getList("Items", 10).isEmpty()) { @@ -2317,7 +2352,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterShulkerBoxBlock implements DataConverter { - DataConverterShulkerBoxBlock() {} + DataConverterShulkerBoxBlock() { + } public int getDataVersion() { return 813; @@ -2334,14 +2370,15 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterLang implements DataConverter { - DataConverterLang() {} + DataConverterLang() { + } public int getDataVersion() { return 816; } public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { - if (cmp.containsKey("lang", 8)) { + if (cmp.contains("lang", 8)) { cmp.putString("lang", cmp.getString("lang").toLowerCase(Locale.ROOT)); } @@ -2351,7 +2388,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterTotem implements DataConverter { - DataConverterTotem() {} + DataConverterTotem() { + } public int getDataVersion() { return 820; @@ -2370,7 +2408,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static final Logger a = LogManager.getLogger(FabricDataFixer.class); - DataConverterBedBlock() {} + DataConverterBedBlock() { + } public int getDataVersion() { return 1125; @@ -2387,7 +2426,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo ListTag nbttaglist1 = nbttagcompound1.getList("Sections", 10); for (int k = 0; k < nbttaglist1.size(); ++k) { - net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttaglist1.getCompoundTag(k); + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttaglist1.getCompound(k); byte b0 = nbttagcompound2.getByte("Y"); byte[] abyte = nbttagcompound2.getByteArray("Blocks"); @@ -2416,7 +2455,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterBedItem implements DataConverter { - DataConverterBedItem() {} + DataConverterBedItem() { + } public int getDataVersion() { return 1125; @@ -2434,17 +2474,17 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataConverterSignText implements DataConverter { public static final Gson a = new GsonBuilder().registerTypeAdapter(Text.class, new JsonDeserializer() { - Text a(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { + MutableText a(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { if (jsonelement.isJsonPrimitive()) { return new LiteralText(jsonelement.getAsString()); } else if (jsonelement.isJsonArray()) { JsonArray jsonarray = jsonelement.getAsJsonArray(); - Text iTextComponent = null; - Iterator iterator = jsonarray.iterator(); + MutableText iTextComponent = null; + Iterator iterator = jsonarray.iterator(); while (iterator.hasNext()) { - JsonElement jsonelement1 = (JsonElement) iterator.next(); - Text iTextComponent1 = this.a(jsonelement1, jsonelement1.getClass(), jsondeserializationcontext); + JsonElement jsonelement1 = iterator.next(); + MutableText iTextComponent1 = this.a(jsonelement1, jsonelement1.getClass(), jsondeserializationcontext); if (iTextComponent == null) { iTextComponent = iTextComponent1; @@ -2464,7 +2504,8 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo } }).create(); - DataConverterSignText() {} + DataConverterSignText() { + } public int getDataVersion() { return 101; @@ -2529,10 +2570,10 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataInspectorPlayerVehicle implements DataInspector { @Override public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { - if (cmp.containsKey("RootVehicle", 10)) { + if (cmp.contains("RootVehicle", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("RootVehicle"); - if (nbttagcompound1.containsKey("Entity", 10)) { + if (nbttagcompound1.contains("Entity", 10)) { convertCompound(LegacyType.ENTITY, nbttagcompound1, "Entity", sourceVer, targetVer); } } @@ -2544,7 +2585,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataInspectorLevelPlayer implements DataInspector { @Override public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { - if (cmp.containsKey("Player", 10)) { + if (cmp.contains("Player", 10)) { convertCompound(LegacyType.PLAYER, cmp, "Player", sourceVer, targetVer); } @@ -2559,23 +2600,23 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo int j; net.minecraft.nbt.CompoundTag nbttagcompound1; - if (cmp.containsKey("entities", 9)) { + if (cmp.contains("entities", 9)) { nbttaglist = cmp.getList("entities", 10); for (j = 0; j < nbttaglist.size(); ++j) { nbttagcompound1 = (net.minecraft.nbt.CompoundTag) nbttaglist.get(j); - if (nbttagcompound1.containsKey("nbt", 10)) { + if (nbttagcompound1.contains("nbt", 10)) { convertCompound(LegacyType.ENTITY, nbttagcompound1, "nbt", sourceVer, targetVer); } } } - if (cmp.containsKey("blocks", 9)) { + if (cmp.contains("blocks", 9)) { nbttaglist = cmp.getList("blocks", 10); for (j = 0; j < nbttaglist.size(); ++j) { nbttagcompound1 = (net.minecraft.nbt.CompoundTag) nbttaglist.get(j); - if (nbttagcompound1.containsKey("nbt", 10)) { + if (nbttagcompound1.contains("nbt", 10)) { convertCompound(LegacyType.BLOCK_ENTITY, nbttagcompound1, "nbt", sourceVer, targetVer); } } @@ -2588,12 +2629,12 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataInspectorChunks implements DataInspector { @Override public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { - if (cmp.containsKey("Level", 10)) { + if (cmp.contains("Level", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("Level"); ListTag nbttaglist; int j; - if (nbttagcompound1.containsKey("Entities", 9)) { + if (nbttagcompound1.contains("Entities", 9)) { nbttaglist = nbttagcompound1.getList("Entities", 10); for (j = 0; j < nbttaglist.size(); ++j) { @@ -2601,7 +2642,7 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo } } - if (nbttagcompound1.containsKey("TileEntities", 9)) { + if (nbttagcompound1.contains("TileEntities", 9)) { nbttaglist = nbttagcompound1.getList("TileEntities", 10); for (j = 0; j < nbttaglist.size(); ++j) { @@ -2617,11 +2658,11 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo private static class DataInspectorEntityPassengers implements DataInspector { @Override public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { - if (cmp.containsKey("Passengers", 9)) { + if (cmp.contains("Passengers", 9)) { ListTag nbttaglist = cmp.getList("Passengers", 10); for (int j = 0; j < nbttaglist.size(); ++j) { - nbttaglist.set(j, convert(LegacyType.ENTITY, nbttaglist.getCompoundTag(j), sourceVer, targetVer)); + nbttaglist.set(j, convert(LegacyType.ENTITY, nbttaglist.getCompound(j), sourceVer, targetVer)); } } @@ -2634,11 +2675,11 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { convertItems(cmp, "Inventory", sourceVer, targetVer); convertItems(cmp, "EnderItems", sourceVer, targetVer); - if (cmp.containsKey("ShoulderEntityLeft", 10)) { + if (cmp.contains("ShoulderEntityLeft", 10)) { convertCompound(LegacyType.ENTITY, cmp, "ShoulderEntityLeft", sourceVer, targetVer); } - if (cmp.containsKey("ShoulderEntityRight", 10)) { + if (cmp.contains("ShoulderEntityRight", 10)) { convertCompound(LegacyType.ENTITY, cmp, "ShoulderEntityRight", sourceVer, targetVer); } @@ -2651,14 +2692,14 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo @Override public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { - if (entityVillager.equals(new Identifier(cmp.getString("id"))) && cmp.containsKey("Offers", 10)) { + if (entityVillager.equals(new Identifier(cmp.getString("id"))) && cmp.contains("Offers", 10)) { net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("Offers"); - if (nbttagcompound1.containsKey("Recipes", 9)) { + if (nbttagcompound1.contains("Recipes", 9)) { ListTag nbttaglist = nbttagcompound1.getList("Recipes", 10); for (int j = 0; j < nbttaglist.size(); ++j) { - net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttaglist.getCompoundTag(j); + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttaglist.getCompound(j); convertItem(nbttagcompound2, "buy", sourceVer, targetVer); convertItem(nbttagcompound2, "buyB", sourceVer, targetVer); @@ -2695,11 +2736,11 @@ class FabricDataFixer extends DataFixerBuilder implements com.sk89q.worldedit.wo @Override public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { if (tileEntityMobSpawner.equals(new Identifier(cmp.getString("id")))) { - if (cmp.containsKey("SpawnPotentials", 9)) { + if (cmp.contains("SpawnPotentials", 9)) { ListTag nbttaglist = cmp.getList("SpawnPotentials", 10); for (int j = 0; j < nbttaglist.size(); ++j) { - net.minecraft.nbt.CompoundTag nbttagcompound1 = nbttaglist.getCompoundTag(j); + net.minecraft.nbt.CompoundTag nbttagcompound1 = nbttaglist.getCompound(j); convertCompound(LegacyType.ENTITY, nbttagcompound1, "Entity", sourceVer, targetVer); } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java index 1316ef2b3..02ac3a4a8 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java @@ -19,8 +19,6 @@ package com.sk89q.worldedit.fabric; -import static com.google.common.base.Preconditions.checkNotNull; - import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.entity.metadata.EntityProperties; @@ -35,9 +33,10 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import java.lang.ref.WeakReference; - import javax.annotation.Nullable; +import static com.google.common.base.Preconditions.checkNotNull; + class FabricEntity implements Entity { private final WeakReference entityRef; @@ -64,7 +63,7 @@ class FabricEntity implements Entity { public Location getLocation() { net.minecraft.entity.Entity entity = entityRef.get(); if (entity != null) { - Vector3 position = Vector3.at(entity.x, entity.y, entity.z); + Vector3 position = Vector3.at(entity.getX(), entity.getY(), entity.getZ()); float yaw = entity.yaw; float pitch = entity.pitch; diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntityProperties.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntityProperties.java index 2be4ebd02..b87bba178 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntityProperties.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntityProperties.java @@ -19,10 +19,7 @@ package com.sk89q.worldedit.fabric; -import static com.google.common.base.Preconditions.checkNotNull; - import com.sk89q.worldedit.entity.metadata.EntityProperties; -import net.minecraft.entity.EnderEyeEntity; import net.minecraft.entity.Entity; import net.minecraft.entity.ExperienceOrbEntity; import net.minecraft.entity.FallingBlockEntity; @@ -36,15 +33,17 @@ import net.minecraft.entity.decoration.painting.PaintingEntity; import net.minecraft.entity.mob.AmbientEntity; import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.TameableEntity; import net.minecraft.entity.passive.GolemEntity; +import net.minecraft.entity.passive.TameableEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.Projectile; +import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.entity.vehicle.AbstractMinecartEntity; import net.minecraft.entity.vehicle.BoatEntity; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.village.Trader; +import static com.google.common.base.Preconditions.checkNotNull; + public class FabricEntityProperties implements EntityProperties { private final Entity entity; @@ -61,7 +60,7 @@ public class FabricEntityProperties implements EntityProperties { @Override public boolean isProjectile() { - return entity instanceof EnderEyeEntity || entity instanceof Projectile; + return entity instanceof ProjectileEntity; } @Override diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemCategoryRegistry.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemCategoryRegistry.java index 8f7af6f90..c48419f03 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemCategoryRegistry.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemCategoryRegistry.java @@ -33,8 +33,11 @@ import java.util.stream.Collectors; public class FabricItemCategoryRegistry implements ItemCategoryRegistry { @Override public Set getCategorisedByName(String category) { - return Optional.ofNullable(ItemTags.getContainer().get(new Identifier(category))) - .map(Tag::values).orElse(Collections.emptySet()) - .stream().map(FabricAdapter::adapt).collect(Collectors.toSet()); + return Optional.ofNullable(ItemTags.getTagGroup().getTag(new Identifier(category))) + .map(Tag::values) + .orElse(Collections.emptyList()) + .stream() + .map(FabricAdapter::adapt) + .collect(Collectors.toSet()); } } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemRegistry.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemRegistry.java index 6f19555c6..8218b932f 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemRegistry.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemRegistry.java @@ -19,24 +19,26 @@ package com.sk89q.worldedit.fabric; +import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.BundledItemRegistry; -import net.fabricmc.api.EnvType; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.resource.language.I18n; -import net.minecraft.item.Item; - -import javax.annotation.Nullable; public class FabricItemRegistry extends BundledItemRegistry { - @Nullable @Override - public String getName(ItemType itemType) { - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - final Item item = FabricAdapter.adapt(itemType); - return I18n.translate(item.getTranslationKey()); - } - return super.getName(itemType); + public Component getRichName(ItemType itemType) { + return TranslatableComponent.of( + FabricAdapter.adapt(itemType).getTranslationKey() + ); } + + @Override + public Component getRichName(BaseItemStack itemStack) { + return TranslatableComponent.of( + FabricAdapter.adapt(itemStack).getTranslationKey() + ); + } + } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPermissionsProvider.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPermissionsProvider.java index 61efefe24..e1dd7d296 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPermissionsProvider.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPermissionsProvider.java @@ -30,7 +30,7 @@ public interface FabricPermissionsProvider { class VanillaPermissionsProvider implements FabricPermissionsProvider { - private FabricPlatform platform; + private final FabricPlatform platform; public VanillaPermissionsProvider(FabricPlatform platform) { this.platform = platform; @@ -39,12 +39,13 @@ public interface FabricPermissionsProvider { @Override public boolean hasPermission(ServerPlayerEntity player, String permission) { FabricConfiguration configuration = platform.getConfiguration(); - return configuration.cheatMode || - player.server.getPlayerManager().isOperator(player.getGameProfile()) || - (configuration.creativeEnable && player.interactionManager.getGameMode() == GameMode.CREATIVE); + return configuration.cheatMode + || player.server.getPlayerManager().isOperator(player.getGameProfile()) + || (configuration.creativeEnable && player.interactionManager.getGameMode() == GameMode.CREATIVE); } @Override - public void registerPermission(String permission) {} + public void registerPermission(String permission) { + } } } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java index 299f1596a..a9bb6caa2 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlatform.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.fabric; import com.google.common.collect.Sets; +import com.mojang.brigadier.CommandDispatcher; import com.sk89q.worldedit.command.util.PermissionCondition; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.AbstractPlatform; @@ -35,15 +36,16 @@ import com.sk89q.worldedit.world.registry.Registries; import net.minecraft.SharedConstants; import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; +import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.dedicated.MinecraftDedicatedServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import net.minecraft.world.level.ServerWorldProperties; import org.enginehub.piston.Command; import org.enginehub.piston.CommandManager; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -51,6 +53,7 @@ import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.Set; +import javax.annotation.Nullable; import static java.util.stream.Collectors.toList; @@ -61,10 +64,12 @@ class FabricPlatform extends AbstractPlatform implements MultiUserPlatform { private final FabricDataFixer dataFixer; private final @Nullable Watchdog watchdog; private boolean hookingEvents = false; + private CommandDispatcher nativeDispatcher; FabricPlatform(FabricWorldEdit mod, MinecraftServer server) { this.mod = mod; this.server = server; + this.nativeDispatcher = server.getCommandManager().getDispatcher(); this.dataFixer = new FabricDataFixer(getDataVersion()); this.watchdog = server instanceof MinecraftDedicatedServer ? (Watchdog) server : null; @@ -138,7 +143,7 @@ class FabricPlatform extends AbstractPlatform implements MultiUserPlatform { return world; } else { for (ServerWorld ws : server.getWorlds()) { - if (ws.getLevelProperties().getLevelName().equals(world.getName())) { + if (((ServerWorldProperties) ws.getLevelProperties()).getLevelName().equals(world.getName())) { return new FabricWorld(ws); } } @@ -147,13 +152,18 @@ class FabricPlatform extends AbstractPlatform implements MultiUserPlatform { } } + public void setNativeDispatcher(CommandDispatcher nativeDispatcher) { + this.nativeDispatcher = nativeDispatcher; + } + @Override public void registerCommands(CommandManager manager) { - if (server == null) return; - net.minecraft.server.command.CommandManager mcMan = server.getCommandManager(); + if (server == null) { + return; + } for (Command command : manager.getAllCommands().collect(toList())) { - CommandWrapper.register(mcMan.getDispatcher(), command); + CommandWrapper.register(nativeDispatcher, command); Set perms = command.getCondition().as(PermissionCondition.class) .map(PermissionCondition::getPermissions) .orElseGet(Collections::emptySet); diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java index 01d06bd9e..f200565b0 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java @@ -25,8 +25,8 @@ import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.extension.platform.AbstractPlayerActor; import com.sk89q.worldedit.extent.inventory.BlockBag; +import com.sk89q.worldedit.fabric.internal.ExtendedPlayerEntity; import com.sk89q.worldedit.fabric.internal.NBTConverter; -import com.sk89q.worldedit.fabric.mixin.AccessorServerPlayerEntity; import com.sk89q.worldedit.fabric.net.handler.WECUIPacketHandler; import com.sk89q.worldedit.internal.cui.CUIEvent; import com.sk89q.worldedit.math.BlockVector3; @@ -35,6 +35,7 @@ import com.sk89q.worldedit.session.SessionKey; import com.sk89q.worldedit.util.HandSide; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.formatting.WorldEditText; +import com.sk89q.worldedit.util.formatting.component.TextUtils; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.serializer.gson.GsonComponentSerializer; import com.sk89q.worldedit.world.World; @@ -44,22 +45,23 @@ import com.sk89q.worldedit.world.block.BlockTypes; import io.netty.buffer.Unpooled; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.LiteralText; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Hand; import net.minecraft.util.Identifier; -import net.minecraft.util.PacketByteBuf; import net.minecraft.util.math.BlockPos; -import javax.annotation.Nullable; import java.io.IOException; import java.util.Locale; import java.util.UUID; +import javax.annotation.Nullable; public class FabricPlayer extends AbstractPlayerActor { @@ -85,7 +87,7 @@ public class FabricPlayer extends AbstractPlayerActor { @Override public String getName() { - return this.player.getName().asFormattedString(); + return this.player.getName().asString(); } @Override @@ -95,7 +97,7 @@ public class FabricPlayer extends AbstractPlayerActor { @Override public Location getLocation() { - Vector3 position = Vector3.at(this.player.x, this.player.y, this.player.z); + Vector3 position = Vector3.at(this.player.getX(), this.player.getY(), this.player.getZ()); return new Location( FabricWorldEdit.inst.getWorld(this.player.world), position, @@ -133,41 +135,45 @@ public class FabricPlayer extends AbstractPlayerActor { @Override public Locale getLocale() { - return Locale.forLanguageTag(((AccessorServerPlayerEntity) this.player).getClientLanguage().replace("_", "-")); + return TextUtils.getLocaleByMinecraftTag(((ExtendedPlayerEntity) this.player).getLanguage()); } @Override + @Deprecated public void printRaw(String msg) { for (String part : msg.split("\n")) { - this.player.sendMessage(new LiteralText(part)); + this.player.sendMessage(new LiteralText(part), false); } } @Override + @Deprecated public void printDebug(String msg) { sendColorized(msg, Formatting.GRAY); } @Override + @Deprecated public void print(String msg) { sendColorized(msg, Formatting.LIGHT_PURPLE); } @Override + @Deprecated public void printError(String msg) { sendColorized(msg, Formatting.RED); } @Override public void print(Component component) { - this.player.sendMessage(Text.Serializer.fromJson(GsonComponentSerializer.INSTANCE.serialize(WorldEditText.format(component, getLocale())))); + this.player.sendMessage(Text.Serializer.fromJson(GsonComponentSerializer.INSTANCE.serialize(WorldEditText.format(component, getLocale()))), false); } private void sendColorized(String msg, Formatting formatting) { for (String part : msg.split("\n")) { - LiteralText component = new LiteralText(part); - component.getStyle().setColor(formatting); - this.player.sendMessage(component); + MutableText component = new LiteralText(part) + .styled(style -> style.withColor(formatting)); + this.player.sendMessage(component, false); } } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java index e93ae036e..f4cb08d8c 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java @@ -19,36 +19,42 @@ package com.sk89q.worldedit.fabric; -import static com.google.common.base.Preconditions.checkNotNull; - import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import com.google.common.io.Files; +import com.google.common.util.concurrent.Futures; +import com.mojang.serialization.Dynamic; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; +import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.fabric.internal.ExtendedMinecraftServer; import com.sk89q.worldedit.fabric.internal.FabricWorldNativeAccess; import com.sk89q.worldedit.fabric.internal.NBTConverter; +import com.sk89q.worldedit.fabric.mixin.AccessorLevelProperties; +import com.sk89q.worldedit.fabric.mixin.AccessorServerChunkManager; import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.internal.block.BlockStateIdAccess; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; -import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffectSet; import com.sk89q.worldedit.util.TreeGenerator.TreeType; +import com.sk89q.worldedit.util.io.file.SafeFiles; import com.sk89q.worldedit.world.AbstractWorld; +import com.sk89q.worldedit.world.RegenOptions; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -57,77 +63,78 @@ import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.weather.WeatherType; import com.sk89q.worldedit.world.weather.WeatherTypes; import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.LeavesBlock; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.EntityType; import net.minecraft.entity.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.WorldGenerationProgressListener; import net.minecraft.server.world.ServerChunkManager; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.ActionResult; import net.minecraft.util.Clearable; import net.minecraft.util.Hand; +import net.minecraft.util.Identifier; +import net.minecraft.util.Util; +import net.minecraft.util.dynamic.RegistryOps; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; -import net.minecraft.world.WorldSaveHandler; -import net.minecraft.world.biome.DefaultBiomeFeatures; +import net.minecraft.world.WorldProperties; +import net.minecraft.world.biome.source.BiomeAccessType; +import net.minecraft.world.biome.source.BiomeArray; +import net.minecraft.world.biome.source.HorizontalVoronoiBiomeAccessType; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkManager; import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.chunk.WorldChunk; -import net.minecraft.world.gen.feature.BirchTreeFeature; -import net.minecraft.world.gen.feature.DarkOakTreeFeature; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; -import net.minecraft.world.gen.feature.FeatureConfig; -import net.minecraft.world.gen.feature.HugeBrownMushroomFeature; -import net.minecraft.world.gen.feature.HugeRedMushroomFeature; -import net.minecraft.world.gen.feature.JungleGroundBushFeature; -import net.minecraft.world.gen.feature.JungleTreeFeature; -import net.minecraft.world.gen.feature.LargeOakTreeFeature; -import net.minecraft.world.gen.feature.MegaJungleTreeFeature; -import net.minecraft.world.gen.feature.MegaPineTreeFeature; -import net.minecraft.world.gen.feature.OakTreeFeature; -import net.minecraft.world.gen.feature.PineTreeFeature; -import net.minecraft.world.gen.feature.PlantedFeatureConfig; -import net.minecraft.world.gen.feature.SavannaTreeFeature; -import net.minecraft.world.gen.feature.SpruceTreeFeature; -import net.minecraft.world.gen.feature.SwampTreeFeature; -import net.minecraft.world.level.LevelProperties; +import net.minecraft.world.dimension.DimensionOptions; +import net.minecraft.world.gen.GeneratorOptions; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.ConfiguredFeatures; +import net.minecraft.world.level.ServerWorldProperties; +import net.minecraft.world.level.storage.LevelStorage; -import java.io.File; import java.lang.ref.WeakReference; +import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; -import java.util.Locale; +import java.util.Map; +import java.util.Objects; import java.util.Optional; -import java.util.OptionalInt; import java.util.Random; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Collectors; - import javax.annotation.Nullable; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + /** * An adapter to Minecraft worlds for WorldEdit. */ public class FabricWorld extends AbstractWorld { private static final Random random = new Random(); - private static final int UPDATE = 1, NOTIFY = 2; - private static final net.minecraft.block.BlockState JUNGLE_LOG = Blocks.JUNGLE_LOG.getDefaultState(); - private static final net.minecraft.block.BlockState JUNGLE_LEAF = Blocks.JUNGLE_LEAVES.getDefaultState().with(LeavesBlock.PERSISTENT, Boolean.TRUE); - private static final net.minecraft.block.BlockState JUNGLE_SHRUB = Blocks.OAK_LEAVES.getDefaultState().with(LeavesBlock.PERSISTENT, Boolean.TRUE); + private static Identifier getDimensionRegistryKey(World world) { + return Objects.requireNonNull(world.getServer(), "server cannot be null") + .getRegistryManager() + .getDimensionTypes() + .getId(world.getDimension()); + } private final WeakReference worldRef; private final FabricWorldNativeAccess worldNativeAccess; @@ -143,21 +150,6 @@ public class FabricWorld extends AbstractWorld { this.worldNativeAccess = new FabricWorldNativeAccess(worldRef); } - /** - * Get the underlying handle to the world. - * - * @return the world - * @throws WorldEditException thrown if a reference to the world was lost (i.e. world was unloaded) - */ - public World getWorldChecked() throws WorldEditException { - World world = worldRef.get(); - if (world != null) { - return world; - } else { - throw new WorldReferenceLostException("The reference to the world was lost (i.e. the world may have been unloaded)"); - } - } - /** * Get the underlying handle to the world. * @@ -175,32 +167,31 @@ public class FabricWorld extends AbstractWorld { @Override public String getName() { - return getWorld().getLevelProperties().getLevelName(); + WorldProperties levelProperties = getWorld().getLevelProperties(); + return ((ServerWorldProperties) levelProperties).getLevelName(); } @Override public String getId() { - return getWorld().getLevelProperties().getLevelName() - .replace(" ", "_").toLowerCase(Locale.ROOT) - + getWorld().dimension.getType().getSuffix(); + return getName() + "_" + getDimensionRegistryKey(getWorld()); } @Override public Path getStoragePath() { final World world = getWorld(); - if (world instanceof ServerWorld) { - return ((ServerWorld) world).getSaveHandler().getWorldDir().toPath(); - } - return null; + MinecraftServer server = world.getServer(); + checkState(server instanceof ExtendedMinecraftServer, "Need a server world"); + return ((ExtendedMinecraftServer) server).getStoragePath(world); } @Override public > boolean setBlock(BlockVector3 position, B block, SideEffectSet sideEffects) throws WorldEditException { + clearContainerBlockContents(position); return worldNativeAccess.setBlock(position, block, sideEffects); } @Override - public Set applySideEffects(BlockVector3 position, BlockState previousType, SideEffectSet sideEffectSet) throws WorldEditException { + public Set applySideEffects(BlockVector3 position, BlockState previousType, SideEffectSet sideEffectSet) { worldNativeAccess.applySideEffects(position, previousType, sideEffectSet); return Sets.intersection(FabricWorldEdit.inst.getPlatform().getSupportedSideEffects(), sideEffectSet.getSideEffectsToApply()); } @@ -223,21 +214,32 @@ public class FabricWorld extends AbstractWorld { } @Override - public BiomeType getBiome(BlockVector2 position) { - checkNotNull(position); - return FabricAdapter.adapt(getWorld().getBiome(new BlockPos(position.getBlockX(), 0, position.getBlockZ()))); + public boolean fullySupports3DBiomes() { + BiomeAccessType biomeAccessType = getWorld().getDimension().getBiomeAccessType(); + return !(biomeAccessType instanceof HorizontalVoronoiBiomeAccessType); } @Override - public boolean setBiome(BlockVector2 position, BiomeType biome) { + public BiomeType getBiome(BlockVector3 position) { + checkNotNull(position); + Chunk chunk = getWorld().getChunk(position.getX() >> 4, position.getZ() >> 4); + return getBiomeInChunk(position, chunk); + } + + private BiomeType getBiomeInChunk(BlockVector3 position, Chunk chunk) { + BiomeArray biomeArray = checkNotNull(chunk.getBiomeArray()); + return FabricAdapter.adapt(biomeArray.getBiomeForNoiseGen(position.getX() >> 2, position.getY() >> 2, position.getZ() >> 2)); + } + + @Override + public boolean setBiome(BlockVector3 position, BiomeType biome) { checkNotNull(position); checkNotNull(biome); - Chunk chunk = getWorld().getChunk(position.getBlockX() >> 4, position.getBlockZ() >> 4, ChunkStatus.FULL, false); - if (chunk == null) { - return false; - } - chunk.getBiomeArray()[((position.getBlockZ() & 0xF) << 4 | position.getBlockX() & 0xF)] = FabricAdapter.adapt(biome); + Chunk chunk = getWorld().getChunk(position.getBlockX() >> 4, position.getBlockZ() >> 4); + MutableBiomeArray biomeArray = MutableBiomeArray.inject(checkNotNull(chunk.getBiomeArray())); + biomeArray.setBiome(position.getX(), position.getY(), position.getZ(), FabricAdapter.adapt(biome)); + chunk.setShouldSave(true); return true; } @@ -255,7 +257,7 @@ public class FabricWorld extends AbstractWorld { return false; } fakePlayer.setStackInHand(Hand.MAIN_HAND, stack); - fakePlayer.setPositionAndAngles(position.getBlockX(), position.getBlockY(), position.getBlockZ(), + fakePlayer.updatePositionAndAngles(position.getBlockX(), position.getBlockY(), position.getBlockZ(), (float) face.toVector().toYaw(), (float) face.toVector().toPitch()); final BlockPos blockPos = FabricAdapter.toBlockPos(position); final BlockHitResult rayTraceResult = new BlockHitResult(FabricAdapter.toVec3(position), @@ -264,11 +266,10 @@ public class FabricWorld extends AbstractWorld { ActionResult used = stack.useOnBlock(itemUseContext); if (used != ActionResult.SUCCESS) { // try activating the block - if (getWorld().getBlockState(blockPos).activate(world, fakePlayer, Hand.MAIN_HAND, rayTraceResult)) { - used = ActionResult.SUCCESS; - } else { - used = stack.getItem().use(world, fakePlayer, Hand.MAIN_HAND).getResult(); - } + used = getWorld().getBlockState(blockPos).onUse(world, fakePlayer, Hand.MAIN_HAND, rayTraceResult); + } + if (used != ActionResult.SUCCESS) { + used = stack.use(world, fakePlayer, Hand.MAIN_HAND).getResult(); } return used == ActionResult.SUCCESS; } @@ -294,85 +295,194 @@ public class FabricWorld extends AbstractWorld { } @Override - public boolean regenerate(Region region, EditSession editSession) { + public boolean regenerate(Region region, Extent extent, RegenOptions options) { // Don't even try to regen if it's going to fail. ChunkManager provider = getWorld().getChunkManager(); if (!(provider instanceof ServerChunkManager)) { return false; } - File saveFolder = Files.createTempDir(); - // register this just in case something goes wrong - // normally it should be deleted at the end of this method - saveFolder.deleteOnExit(); try { - ServerWorld originalWorld = (ServerWorld) getWorld(); - - MinecraftServer server = originalWorld.getServer(); - WorldSaveHandler saveHandler = new WorldSaveHandler(saveFolder, originalWorld.getSaveHandler().getWorldDir().getName(), server, server.getDataFixer()); - World freshWorld = new ServerWorld(server, server.getWorkerExecutor(), saveHandler, originalWorld.getLevelProperties(), - originalWorld.dimension.getType(), originalWorld.getProfiler(), new NoOpChunkStatusListener()); - - // Pre-gen all the chunks - // We need to also pull one more chunk in every direction - CuboidRegion expandedPreGen = new CuboidRegion(region.getMinimumPoint().subtract(16, 0, 16), region.getMaximumPoint().add(16, 0, 16)); - for (BlockVector2 chunk : expandedPreGen.getChunks()) { - freshWorld.getChunk(chunk.getBlockX(), chunk.getBlockZ()); - } - - FabricWorld from = new FabricWorld(freshWorld); - for (BlockVector3 vec : region) { - editSession.setBlock(vec, from.getFullBlock(vec)); - } - } catch (MaxChangedBlocksException e) { - throw new RuntimeException(e); - } finally { - saveFolder.delete(); + doRegen(region, extent, options); + } catch (Exception e) { + throw new IllegalStateException("Regen failed", e); } return true; } + private void doRegen(Region region, Extent extent, RegenOptions options) throws Exception { + Path tempDir = Files.createTempDirectory("WorldEditWorldGen"); + LevelStorage levelStorage = LevelStorage.create(tempDir); + try (LevelStorage.Session session = levelStorage.createSession("WorldEditTempGen")) { + ServerWorld originalWorld = (ServerWorld) getWorld(); + long seed = options.getSeed().orElse(originalWorld.getSeed()); + AccessorLevelProperties levelProperties = (AccessorLevelProperties) + originalWorld.getServer().getSaveProperties(); + GeneratorOptions originalOpts = levelProperties.getGeneratorOptions(); + + RegistryOps nbtRegOps = RegistryOps.of( + NbtOps.INSTANCE, + ((ExtendedMinecraftServer) originalWorld.getServer()) + .getServerResourceManager().getResourceManager(), + (DynamicRegistryManager.Impl) originalWorld.getServer().getRegistryManager() + ); + GeneratorOptions newOpts = GeneratorOptions.CODEC + .encodeStart(nbtRegOps, originalOpts) + .flatMap(tag -> + GeneratorOptions.CODEC.parse( + recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>()) + ) + ) + .get().map( + l -> l, + error -> { + throw new IllegalStateException("Unable to map GeneratorOptions: " + error.message()); + } + ); + + levelProperties.setGeneratorOptions(newOpts); + RegistryKey worldRegKey = originalWorld.getRegistryKey(); + DimensionOptions dimGenOpts = newOpts.getDimensions().get(worldRegKey.getValue()); + checkNotNull(dimGenOpts, "No DimensionOptions for %s", worldRegKey); + try (ServerWorld serverWorld = new ServerWorld( + originalWorld.getServer(), Util.getMainWorkerExecutor(), session, + ((ServerWorldProperties) originalWorld.getLevelProperties()), + worldRegKey, + originalWorld.getDimension(), + new WorldEditGenListener(), + dimGenOpts.getChunkGenerator(), + originalWorld.isDebugWorld(), + seed, + // No spawners are needed for this world. + ImmutableList.of(), + // This controls ticking, we don't need it so set it to false. + false + )) { + regenForWorld(region, extent, serverWorld, options); + + // drive the server executor until all tasks are popped off + while (originalWorld.getServer().runTask()) { + Thread.yield(); + } + } finally { + levelProperties.setGeneratorOptions(originalOpts); + } + } finally { + SafeFiles.tryHardToDeleteDir(tempDir); + } + } + + @SuppressWarnings("unchecked") + private Dynamic recursivelySetSeed(Dynamic dynamic, long seed, Set> seen) { + if (!seen.add(dynamic)) { + return dynamic; + } + return dynamic.updateMapValues(pair -> { + if (pair.getFirst().asString("").equals("seed")) { + return pair.mapSecond(v -> v.createLong(seed)); + } + if (pair.getSecond().getValue() instanceof net.minecraft.nbt.CompoundTag) { + return pair.mapSecond(v -> recursivelySetSeed((Dynamic) v, seed, seen)); + } + return pair; + }); + } + + private void regenForWorld(Region region, Extent extent, ServerWorld serverWorld, + RegenOptions options) throws WorldEditException { + List> chunkLoadings = submitChunkLoadTasks(region, serverWorld); + + // drive executor until loading finishes + ((AccessorServerChunkManager) serverWorld.getChunkManager()).getMainThreadExecutor() + .runTasks(() -> { + // bail out early if a future fails + if (chunkLoadings.stream().anyMatch(ftr -> + ftr.isDone() && Futures.getUnchecked(ftr) == null + )) { + return false; + } + return chunkLoadings.stream().allMatch(CompletableFuture::isDone); + }); + + Map chunks = new HashMap<>(); + for (CompletableFuture future : chunkLoadings) { + @Nullable + Chunk chunk = future.getNow(null); + checkState(chunk != null, "Failed to generate a chunk, regen failed."); + chunks.put(chunk.getPos(), chunk); + } + + for (BlockVector3 vec : region) { + BlockPos pos = FabricAdapter.toBlockPos(vec); + Chunk chunk = chunks.get(new ChunkPos(pos)); + BlockStateHolder state = FabricAdapter.adapt(chunk.getBlockState(pos)); + BlockEntity blockEntity = chunk.getBlockEntity(pos); + if (blockEntity != null) { + net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); + blockEntity.toTag(tag); + state = state.toBaseBlock(NBTConverter.fromNative(tag)); + } + extent.setBlock(vec, state.toBaseBlock()); + + if (options.shouldRegenBiomes()) { + BiomeType biome = getBiomeInChunk(vec, chunk); + extent.setBiome(vec, biome); + } + } + } + + private List> submitChunkLoadTasks(Region region, ServerWorld world) { + AccessorServerChunkManager chunkManager = (AccessorServerChunkManager) world.getChunkManager(); + List> chunkLoadings = new ArrayList<>(); + // Pre-gen all the chunks + for (BlockVector2 chunk : region.getChunks()) { + chunkLoadings.add( + chunkManager.callGetChunkFuture(chunk.getX(), chunk.getZ(), ChunkStatus.FEATURES, true) + .thenApply(either -> either.left().orElse(null)) + ); + } + return chunkLoadings; + } + @Nullable - private static Feature createTreeFeatureGenerator(TreeType type) { + private static ConfiguredFeature createTreeFeatureGenerator(TreeType type) { switch (type) { - case TREE: return new OakTreeFeature(DefaultFeatureConfig::deserialize, true); - case BIG_TREE: return new LargeOakTreeFeature(DefaultFeatureConfig::deserialize, true); - case REDWOOD: return new PineTreeFeature(DefaultFeatureConfig::deserialize); - case TALL_REDWOOD: return new SpruceTreeFeature(DefaultFeatureConfig::deserialize, true); - case BIRCH: return new BirchTreeFeature(DefaultFeatureConfig::deserialize, true, false); - case JUNGLE: return new MegaJungleTreeFeature(DefaultFeatureConfig::deserialize, true, 10, 20, JUNGLE_LOG, JUNGLE_LEAF); - case SMALL_JUNGLE: return new JungleTreeFeature(DefaultFeatureConfig::deserialize, true, 4 + random.nextInt(7), JUNGLE_LOG, JUNGLE_LEAF, false); - case SHORT_JUNGLE: return new JungleTreeFeature(DefaultFeatureConfig::deserialize, true, 4 + random.nextInt(7), JUNGLE_LOG, JUNGLE_LEAF, true); - case JUNGLE_BUSH: return new JungleGroundBushFeature(DefaultFeatureConfig::deserialize, JUNGLE_LOG, JUNGLE_SHRUB); - case SWAMP: return new SwampTreeFeature(DefaultFeatureConfig::deserialize); - case ACACIA: return new SavannaTreeFeature(DefaultFeatureConfig::deserialize, true); - case DARK_OAK: return new DarkOakTreeFeature(DefaultFeatureConfig::deserialize, true); - case MEGA_REDWOOD: return new MegaPineTreeFeature(DefaultFeatureConfig::deserialize, true, random.nextBoolean()); - case TALL_BIRCH: return new BirchTreeFeature(DefaultFeatureConfig::deserialize, true, true); - case RED_MUSHROOM: return new HugeRedMushroomFeature(PlantedFeatureConfig::deserialize); - case BROWN_MUSHROOM: return new HugeBrownMushroomFeature(PlantedFeatureConfig::deserialize); + // Based off of the SaplingGenerator class, as well as uses of DefaultBiomeFeatures fields + case TREE: return ConfiguredFeatures.OAK; + case BIG_TREE: return ConfiguredFeatures.FANCY_OAK; + case REDWOOD: return ConfiguredFeatures.SPRUCE; + case TALL_REDWOOD: return ConfiguredFeatures.MEGA_SPRUCE; + case MEGA_REDWOOD: return ConfiguredFeatures.MEGA_PINE; + case BIRCH: return ConfiguredFeatures.BIRCH; + case JUNGLE: return ConfiguredFeatures.MEGA_JUNGLE_TREE; + case SMALL_JUNGLE: return ConfiguredFeatures.JUNGLE_TREE; + case SHORT_JUNGLE: return ConfiguredFeatures.JUNGLE_TREE_NO_VINE; + case JUNGLE_BUSH: return ConfiguredFeatures.JUNGLE_BUSH; + case SWAMP: return ConfiguredFeatures.SWAMP_TREE; + case ACACIA: return ConfiguredFeatures.ACACIA; + case DARK_OAK: return ConfiguredFeatures.DARK_OAK; + case TALL_BIRCH: return ConfiguredFeatures.BIRCH_TALL; + case RED_MUSHROOM: return ConfiguredFeatures.HUGE_RED_MUSHROOM; + case BROWN_MUSHROOM: return ConfiguredFeatures.HUGE_BROWN_MUSHROOM; + case WARPED_FUNGUS: return ConfiguredFeatures.WARPED_FUNGI; + case CRIMSON_FUNGUS: return ConfiguredFeatures.CRIMSON_FUNGI; + case CHORUS_PLANT: return ConfiguredFeatures.CHORUS_PLANT; case RANDOM: return createTreeFeatureGenerator(TreeType.values()[ThreadLocalRandom.current().nextInt(TreeType.values().length)]); default: return null; } } - private FeatureConfig createFeatureConfig(TreeType type) { - if (type == TreeType.RED_MUSHROOM || type == TreeType.BROWN_MUSHROOM) { - return new PlantedFeatureConfig(true); - } else { - return new DefaultFeatureConfig(); - } - } - @Override - public boolean generateTree(TreeType type, EditSession editSession, BlockVector3 position) throws MaxChangedBlocksException { - @SuppressWarnings("unchecked") - Feature generator = (Feature) createTreeFeatureGenerator(type); - return generator != null - && generator.generate(getWorld(), getWorld().getChunkManager().getChunkGenerator(), random, - FabricAdapter.toBlockPos(position), createFeatureConfig(type)); + public boolean generateTree(TreeType type, EditSession editSession, BlockVector3 position) { + ConfiguredFeature generator = createTreeFeatureGenerator(type); + ServerWorld world = (ServerWorld) getWorld(); + ServerChunkManager chunkManager = world.getChunkManager(); + return generator != null && generator.generate( + world, chunkManager.getChunkGenerator(), random, + FabricAdapter.toBlockPos(position) + ); } @Override @@ -389,19 +499,22 @@ public class FabricWorld extends AbstractWorld { public void fixLighting(Iterable chunks) { World world = getWorld(); for (BlockVector2 chunk : chunks) { - world.getChunkManager().getLightingProvider().suppressLight(new ChunkPos(chunk.getBlockX(), chunk.getBlockZ()), true); + world.getChunkManager().getLightingProvider().setColumnEnabled( + new ChunkPos(chunk.getBlockX(), chunk.getBlockZ()), true + ); } } @Override public boolean playEffect(Vector3 position, int type, int data) { - getWorld().playLevelEvent(type, FabricAdapter.toBlockPos(position.toBlockPoint()), data); + // TODO update sound API + // getWorld().playSound(type, FabricAdapter.toBlockPos(position.toBlockPoint()), data); return true; } @Override public WeatherType getWeather() { - LevelProperties info = getWorld().getLevelProperties(); + WorldProperties info = getWorld().getLevelProperties(); if (info.isThundering()) { return WeatherTypes.THUNDER_STORM; } @@ -413,7 +526,7 @@ public class FabricWorld extends AbstractWorld { @Override public long getRemainingWeatherDuration() { - LevelProperties info = getWorld().getLevelProperties(); + ServerWorldProperties info = (ServerWorldProperties) getWorld().getLevelProperties(); if (info.isThundering()) { return info.getThunderTime(); } @@ -430,7 +543,7 @@ public class FabricWorld extends AbstractWorld { @Override public void setWeather(WeatherType weatherType, long duration) { - LevelProperties info = getWorld().getLevelProperties(); + ServerWorldProperties info = (ServerWorldProperties) getWorld().getLevelProperties(); if (weatherType == WeatherTypes.THUNDER_STORM) { info.setClearWeatherTime(0); info.setThundering(true); @@ -453,7 +566,12 @@ public class FabricWorld extends AbstractWorld { @Override public BlockVector3 getSpawnPosition() { - return FabricAdapter.adapt(getWorld().getSpawnPos()); + WorldProperties worldProps = getWorld().getLevelProperties(); + return BlockVector3.at( + worldProps.getSpawnX(), + worldProps.getSpawnY(), + worldProps.getSpawnZ() + ); } @Override @@ -507,13 +625,19 @@ public class FabricWorld extends AbstractWorld { @Override public List getEntities(Region region) { final World world = getWorld(); - if (!(world instanceof ServerWorld)) { - return Collections.emptyList(); - } - return ((ServerWorld) world).getEntities(null, entity -> true) - .stream() - .filter(e -> region.contains(FabricAdapter.adapt(e.getBlockPos()))) - .map(FabricEntity::new).collect(Collectors.toList()); + Box box = new Box( + FabricAdapter.toBlockPos(region.getMinimumPoint()), + FabricAdapter.toBlockPos(region.getMaximumPoint().add(BlockVector3.ONE)) + ); + List nmsEntities = world.getEntitiesByType( + null, + box, + e -> region.contains(FabricAdapter.adapt(e.getBlockPos())) + ); + return ImmutableList.copyOf(Lists.transform( + nmsEntities, + FabricEntity::new + )); } @Override @@ -522,10 +646,10 @@ public class FabricWorld extends AbstractWorld { if (!(world instanceof ServerWorld)) { return Collections.emptyList(); } - return ((ServerWorld) world).getEntities(null, entity -> true) - .stream() - .map(FabricEntity::new) - .collect(Collectors.toList()); + return ImmutableList.copyOf(Iterables.transform( + ((ServerWorld) world).iterateEntities(), + FabricEntity::new + )); } @Nullable @@ -533,7 +657,9 @@ public class FabricWorld extends AbstractWorld { public Entity createEntity(Location location, BaseEntity entity) { World world = getWorld(); final Optional> entityType = EntityType.get(entity.getType().getId()); - if (!entityType.isPresent()) return null; + if (!entityType.isPresent()) { + return null; + } net.minecraft.entity.Entity createdEntity = entityType.get().create(world); if (createdEntity != null) { CompoundTag nativeTag = entity.getNbtData(); @@ -545,7 +671,7 @@ public class FabricWorld extends AbstractWorld { createdEntity.fromTag(tag); } - createdEntity.setPositionAndAngles(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + createdEntity.updatePositionAndAngles(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); world.spawnEntity(createdEntity); return new FabricEntity(createdEntity); @@ -554,27 +680,4 @@ public class FabricWorld extends AbstractWorld { } } - /** - * Thrown when the reference to the world is lost. - */ - @SuppressWarnings("serial") - private static final class WorldReferenceLostException extends WorldEditException { - private WorldReferenceLostException(String message) { - super(message); - } - } - - private static class NoOpChunkStatusListener implements WorldGenerationProgressListener { - @Override - public void start(ChunkPos chunkPos) { - } - - @Override - public void setChunkStatus(ChunkPos chunkPos, @Nullable ChunkStatus chunkStatus) { - } - - @Override - public void stop() { - } - } } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java index 54b243d8d..766794181 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java @@ -19,13 +19,13 @@ package com.sk89q.worldedit.fabric; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.sk89q.worldedit.fabric.FabricAdapter.adaptPlayer; - +import com.mojang.brigadier.CommandDispatcher; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.event.platform.PlatformReadyEvent; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.Platform; +import com.sk89q.worldedit.extension.platform.PlatformManager; import com.sk89q.worldedit.fabric.net.handler.WECUIPacketHandler; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.biome.BiomeType; @@ -35,22 +35,25 @@ import com.sk89q.worldedit.world.entity.EntityType; import com.sk89q.worldedit.world.item.ItemCategory; import com.sk89q.worldedit.world.item.ItemType; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.player.AttackBlockCallback; import net.fabricmc.fabric.api.event.player.UseBlockCallback; import net.fabricmc.fabric.api.event.player.UseItemCallback; -import net.fabricmc.fabric.api.event.server.ServerStartCallback; -import net.fabricmc.fabric.api.event.server.ServerStopCallback; -import net.fabricmc.fabric.api.event.server.ServerTickCallback; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.tag.BlockTags; import net.minecraft.tag.ItemTags; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.Identifier; +import net.minecraft.util.TypedActionResult; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -65,6 +68,9 @@ import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.sk89q.worldedit.fabric.FabricAdapter.adaptPlayer; + /** * The Fabric implementation of WorldEdit. */ @@ -91,11 +97,11 @@ public class FabricWorldEdit implements ModInitializer { @Override public void onInitialize() { this.container = FabricLoader.getInstance().getModContainer("worldedit").orElseThrow( - () -> new IllegalStateException("WorldEdit mod missing in Fabric") + () -> new IllegalStateException("WorldEdit mod missing in Fabric") ); // Setup working directory - workingDir = new File(FabricLoader.getInstance().getConfigDirectory(), "worldedit").toPath(); + workingDir = FabricLoader.getInstance().getConfigDir().resolve("worldedit"); if (!Files.exists(workingDir)) { try { Files.createDirectory(workingDir); @@ -106,15 +112,34 @@ public class FabricWorldEdit implements ModInitializer { WECUIPacketHandler.init(); - ServerTickCallback.EVENT.register(ThreadSafeCache.getInstance()); - ServerStartCallback.EVENT.register(this::onStartServer); - ServerStopCallback.EVENT.register(this::onStopServer); + ServerTickEvents.END_SERVER_TICK.register(ThreadSafeCache.getInstance()); + CommandRegistrationCallback.EVENT.register(this::registerCommands); + ServerLifecycleEvents.SERVER_STARTED.register(this::onStartServer); + ServerLifecycleEvents.SERVER_STOPPING.register(this::onStopServer); AttackBlockCallback.EVENT.register(this::onLeftClickBlock); UseBlockCallback.EVENT.register(this::onRightClickBlock); UseItemCallback.EVENT.register(this::onRightClickAir); LOGGER.info("WorldEdit for Fabric (version " + getInternalVersion() + ") is loaded"); } + private void registerCommands(CommandDispatcher dispatcher, boolean dedicated) { + PlatformManager manager = WorldEdit.getInstance().getPlatformManager(); + if (manager.getPlatforms().isEmpty()) { + // We'll register as part of our platform initialization later. + return; + } + + // This is a re-register (due to /reload), we must add our commands now + + Platform commandsPlatform = manager.queryCapability(Capability.USER_COMMANDS); + if (commandsPlatform != platform || !platform.isHookingEvents()) { + // We're not in control of commands/events -- do not re-register. + return; + } + platform.setNativeDispatcher(dispatcher); + platform.registerCommands(manager.getPlatformCommandManager().getCommandManager()); + } + private void setupPlatform(MinecraftServer server) { this.platform = new FabricPlatform(this, server); @@ -123,7 +148,7 @@ public class FabricWorldEdit implements ModInitializer { this.provider = new FabricPermissionsProvider.VanillaPermissionsProvider(platform); } - private void setupRegistries() { + private void setupRegistries(MinecraftServer server) { // Blocks for (Identifier name : Registry.BLOCK.getIds()) { if (BlockType.REGISTRY.get(name.toString()) == null) { @@ -144,18 +169,18 @@ public class FabricWorldEdit implements ModInitializer { } } // Biomes - for (Identifier name : Registry.BIOME.getIds()) { + for (Identifier name : server.getRegistryManager().get(Registry.BIOME_KEY).getIds()) { if (BiomeType.REGISTRY.get(name.toString()) == null) { BiomeType.REGISTRY.register(name.toString(), new BiomeType(name.toString())); } } // Tags - for (Identifier name : BlockTags.getContainer().getKeys()) { + for (Identifier name : BlockTags.getTagGroup().getTagIds()) { if (BlockCategory.REGISTRY.get(name.toString()) == null) { BlockCategory.REGISTRY.register(name.toString(), new BlockCategory(name.toString())); } } - for (Identifier name : ItemTags.getContainer().getKeys()) { + for (Identifier name : ItemTags.getTagGroup().getTagIds()) { if (ItemCategory.REGISTRY.get(name.toString()) == null) { ItemCategory.REGISTRY.register(name.toString(), new ItemCategory(name.toString())); } @@ -163,12 +188,16 @@ public class FabricWorldEdit implements ModInitializer { } private void onStartServer(MinecraftServer minecraftServer) { + FabricAdapter.setServer(minecraftServer); setupPlatform(minecraftServer); - setupRegistries(); + setupRegistries(minecraftServer); config = new FabricConfiguration(this); config.load(); WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent()); + minecraftServer.reloadResources( + minecraftServer.getDataPackManager().getEnabledNames() + ); } private void onStopServer(MinecraftServer minecraftServer) { @@ -198,8 +227,9 @@ public class FabricWorldEdit implements ModInitializer { blockPos.getY(), blockPos.getZ() ); + com.sk89q.worldedit.util.Direction weDirection = FabricAdapter.adaptEnumFacing(direction); - if (we.handleBlockLeftClick(player, pos)) { + if (we.handleBlockLeftClick(player, pos, weDirection)) { return ActionResult.SUCCESS; } @@ -210,12 +240,6 @@ public class FabricWorldEdit implements ModInitializer { return ActionResult.PASS; } - public void onLeftClickAir(PlayerEntity playerEntity, World world, Hand hand) { - WorldEdit we = WorldEdit.getInstance(); - FabricPlayer player = adaptPlayer((ServerPlayerEntity) playerEntity); - we.handleArmSwing(player); - } - private ActionResult onRightClickBlock(PlayerEntity playerEntity, World world, Hand hand, BlockHitResult blockHitResult) { if (shouldSkip() || hand == Hand.OFF_HAND || world.isClient) { return ActionResult.PASS; @@ -229,8 +253,9 @@ public class FabricWorldEdit implements ModInitializer { blockHitResult.getBlockPos().getY(), blockHitResult.getBlockPos().getZ() ); + com.sk89q.worldedit.util.Direction direction = FabricAdapter.adaptEnumFacing(blockHitResult.getSide()); - if (we.handleBlockRightClick(player, pos)) { + if (we.handleBlockRightClick(player, pos, direction)) { return ActionResult.SUCCESS; } @@ -241,19 +266,20 @@ public class FabricWorldEdit implements ModInitializer { return ActionResult.PASS; } - private ActionResult onRightClickAir(PlayerEntity playerEntity, World world, Hand hand) { + private TypedActionResult onRightClickAir(PlayerEntity playerEntity, World world, Hand hand) { + ItemStack stackInHand = playerEntity.getStackInHand(hand); if (shouldSkip() || hand == Hand.OFF_HAND || world.isClient) { - return ActionResult.PASS; + return TypedActionResult.pass(stackInHand); } WorldEdit we = WorldEdit.getInstance(); FabricPlayer player = adaptPlayer((ServerPlayerEntity) playerEntity); if (we.handleRightClick(player)) { - return ActionResult.SUCCESS; + return TypedActionResult.success(stackInHand); } - return ActionResult.PASS; + return TypedActionResult.pass(stackInHand); } // TODO Pass empty left click to server @@ -303,8 +329,8 @@ public class FabricWorldEdit implements ModInitializer { * * @return the working directory */ - public File getWorkingDir() { - return this.workingDir.toFile(); + public Path getWorkingDir() { + return this.workingDir; } /** diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/PropertyAdapter.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/PropertyAdapter.java index 82222462f..b7c11f7bd 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/PropertyAdapter.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/PropertyAdapter.java @@ -19,14 +19,14 @@ package com.sk89q.worldedit.fabric; -import static com.google.common.base.Preconditions.checkArgument; - import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.registry.state.Property; import java.util.List; import java.util.Optional; +import static com.google.common.base.Preconditions.checkArgument; + class PropertyAdapter> implements Property { private final net.minecraft.state.property.Property property; @@ -49,7 +49,7 @@ class PropertyAdapter> implements Property { @Override public T getValueFor(String string) throws IllegalArgumentException { - Optional val = property.getValue(string); + Optional val = property.parse(string); checkArgument(val.isPresent(), "%s has no value for %s", getName(), string); return val.get(); } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/ThreadSafeCache.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/ThreadSafeCache.java index 46ffe898c..4aba1e1ab 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/ThreadSafeCache.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/ThreadSafeCache.java @@ -19,11 +19,10 @@ package com.sk89q.worldedit.fabric; -import net.fabricmc.fabric.api.event.server.ServerTickCallback; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; -import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.UUID; @@ -32,11 +31,11 @@ import java.util.concurrent.CopyOnWriteArraySet; /** * Caches data that cannot be accessed from another thread safely. */ -public class ThreadSafeCache implements ServerTickCallback { +public class ThreadSafeCache implements ServerTickEvents.EndTick { private static final long REFRESH_DELAY = 1000 * 30; private static final ThreadSafeCache INSTANCE = new ThreadSafeCache(); - private Set onlineIds = Collections.emptySet(); + private Set onlineIds = new CopyOnWriteArraySet<>(); private long lastRefresh = 0; /** @@ -49,7 +48,7 @@ public class ThreadSafeCache implements ServerTickCallback { } @Override - public void tick(MinecraftServer server) { + public void onEndTick(MinecraftServer server) { long now = System.currentTimeMillis(); if (now - lastRefresh > REFRESH_DELAY) { diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/WorldEditFakePlayer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/WorldEditFakePlayer.java index 50678307c..e4f90f2d6 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/WorldEditFakePlayer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/WorldEditFakePlayer.java @@ -27,10 +27,9 @@ import net.minecraft.server.network.ServerPlayerInteractionManager; import net.minecraft.server.world.ServerWorld; import net.minecraft.stat.Stat; import net.minecraft.text.Text; -import net.minecraft.world.dimension.DimensionType; -import javax.annotation.Nullable; import java.util.UUID; +import javax.annotation.Nullable; public class WorldEditFakePlayer extends ServerPlayerEntity { private static final GameProfile FAKE_WORLDEDIT_PROFILE = new GameProfile(UUID.nameUUIDFromBytes("worldedit".getBytes()), "[WorldEdit]"); @@ -52,17 +51,8 @@ public class WorldEditFakePlayer extends ServerPlayerEntity { } @Override - public void sendMessage(Text component) { - } - - @Override - public void addChatMessage(Text component, boolean opt) { - } - - @Nullable - @Override - public Entity changeDimension(DimensionType dimensionType) { - return this; + public void sendMessage(Text message, boolean actionBar) { + super.sendMessage(message, actionBar); } @Override diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java index 2b7e2b38b..5e839b3ea 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java @@ -32,12 +32,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.chunk.WorldChunk; -import javax.annotation.Nullable; import java.lang.ref.WeakReference; import java.util.Objects; +import javax.annotation.Nullable; public class FabricWorldNativeAccess implements WorldNativeAccess { - private static final int UPDATE = 1, NOTIFY = 2; + private static final int UPDATE = 1; + private static final int NOTIFY = 2; private final WeakReference world; @@ -75,7 +76,7 @@ public class FabricWorldNativeAccess implements WorldNativeAccess list = new ArrayList<>(); Class listClass = StringTag.class; int tags = other.size(); @@ -211,6 +221,10 @@ public final class NBTConverter { return new LongTag(other.getLong()); } + public static LongArrayTag fromNative(net.minecraft.nbt.LongArrayTag other) { + return new LongArrayTag(other.getLongArray().clone()); + } + public static StringTag fromNative(net.minecraft.nbt.StringTag other) { return new StringTag(other.asString()); } @@ -224,15 +238,14 @@ public final class NBTConverter { } public static ByteArrayTag fromNative(net.minecraft.nbt.ByteArrayTag other) { - byte[] value = other.getByteArray(); - return new ByteArrayTag(Arrays.copyOf(value, value.length)); + return new ByteArrayTag(other.getByteArray().clone()); } public static CompoundTag fromNative(net.minecraft.nbt.CompoundTag other) { Set tags = other.getKeys(); Map map = new HashMap<>(); for (String tagName : tags) { - map.put(tagName, fromNative(other.getTag(tagName))); + map.put(tagName, fromNative(other.get(tagName))); } return new CompoundTag(map); } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorServerChunkManager.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorServerChunkManager.java index 0ef033a8b..d97743c73 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorServerChunkManager.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorServerChunkManager.java @@ -39,4 +39,4 @@ public interface AccessorServerChunkManager { @Accessor ServerChunkManager.MainThreadExecutor getMainThreadExecutor(); -} +} \ No newline at end of file diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorServerPlayerEntity.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorServerPlayerEntity.java deleted file mode 100644 index f9474a1fb..000000000 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorServerPlayerEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.fabric.mixin; - -import net.minecraft.server.network.ServerPlayerEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ServerPlayerEntity.class) -public interface AccessorServerPlayerEntity { - - @Accessor - String getClientLanguage(); -} diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java index e4c64a634..55cb7ae3c 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java @@ -20,15 +20,22 @@ package com.sk89q.worldedit.fabric.mixin; import com.sk89q.worldedit.extension.platform.Watchdog; -import net.minecraft.server.ServerTask; +import com.sk89q.worldedit.fabric.internal.ExtendedMinecraftServer; +import net.minecraft.resource.ServerResourceManager; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.NonBlockingThreadExecutor; -import net.minecraft.util.SystemUtil; +import net.minecraft.server.ServerTask; +import net.minecraft.util.Util; +import net.minecraft.util.thread.ReentrantThreadExecutor; +import net.minecraft.world.World; +import net.minecraft.world.level.storage.LevelStorage; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.nio.file.Path; @Mixin(MinecraftServer.class) -public abstract class MixinMinecraftServer extends NonBlockingThreadExecutor implements Watchdog { +public abstract class MixinMinecraftServer extends ReentrantThreadExecutor implements Watchdog, ExtendedMinecraftServer { public MixinMinecraftServer(String name) { super(name); @@ -36,10 +43,20 @@ public abstract class MixinMinecraftServer extends NonBlockingThreadExecutor=0.4.0", "fabric-api-base": "*", - "fabric-events-lifecycle-v0": "*", + "fabric-command-api-v1": "*", + "fabric-lifecycle-events-v1": "*", "fabric-events-interaction-v0": "*", "fabric-networking-v0": "*" }, "mixins": [ "worldedit.mixins.json" - ] + ], + "accessWidener" : "worldedit.accesswidener" } diff --git a/worldedit-fabric/src/main/resources/worldedit.accesswidener b/worldedit-fabric/src/main/resources/worldedit.accesswidener new file mode 100644 index 000000000..027fe2d27 --- /dev/null +++ b/worldedit-fabric/src/main/resources/worldedit.accesswidener @@ -0,0 +1,2 @@ +accessWidener v1 named +accessible class net/minecraft/server/world/ServerChunkManager$MainThreadExecutor diff --git a/worldedit-fabric/src/main/resources/worldedit.mixins.json b/worldedit-fabric/src/main/resources/worldedit.mixins.json index 2cbff165c..8fc6e845f 100644 --- a/worldedit-fabric/src/main/resources/worldedit.mixins.json +++ b/worldedit-fabric/src/main/resources/worldedit.mixins.json @@ -3,13 +3,16 @@ "package": "com.sk89q.worldedit.fabric.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "MixinBiomeArray", "MixinServerPlayerEntity", "MixinMinecraftServer", - "AccessorServerPlayerEntity" + "AccessorClientSettingsC2SPacket", + "AccessorLevelProperties", + "AccessorServerChunkManager" ], "server": [ ], "injectors": { "defaultRequire": 1 } -} \ No newline at end of file +}