diff --git a/nukkit/build.gradle b/nukkit/build.gradle index 767af849..dc0f28f6 100644 --- a/nukkit/build.gradle +++ b/nukkit/build.gradle @@ -1,6 +1,10 @@ +repositories { + flatDir {dirs 'lib'} +} dependencies { compile project(':core') compile 'cn.nukkit:nukkit:1.0-SNAPSHOT' + compile name: 'worldedit-core-6.1.4-SNAPSHOT-dist' } processResources { @@ -18,10 +22,17 @@ apply plugin: 'com.github.johnrengelman.shadow' jar.enabled = false shadowJar { dependencies { - include(dependency(':core')) + include(dependency(name: 'worldedit-core-6.1.4-SNAPSHOT-dist')) + include(dependency('com.google.code.gson:gson:2.2.4')) + include(dependency('org.yaml:snakeyaml:1.16')) + include(dependency('com.google.guava:guava:17.0')) } archiveName = "${parent.name}-${project.name}-${parent.version}.jar" destinationDir = file '../target' + + relocate('com.google.gson', 'com.sk89q.worldedit.internal.gson') + relocate 'org.yaml.snakeyaml', 'com.boydti.fawe.yaml' + relocate 'com.google.common', 'com.sk89q.worldedit.internal.common' } shadowJar.doLast { task -> diff --git a/nukkit/lib/worldedit-core-6.1.4-SNAPSHOT-dist.jar b/nukkit/lib/worldedit-core-6.1.4-SNAPSHOT-dist.jar new file mode 100644 index 00000000..f0570c96 Binary files /dev/null and b/nukkit/lib/worldedit-core-6.1.4-SNAPSHOT-dist.jar differ diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/FaweNukkit.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/FaweNukkit.java new file mode 100644 index 00000000..cca3c544 --- /dev/null +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/FaweNukkit.java @@ -0,0 +1,84 @@ +package com.boydti.fawe.nukkit; + +import com.boydti.fawe.IFawe; +import com.boydti.fawe.object.FaweCommand; +import com.boydti.fawe.object.FawePlayer; +import com.boydti.fawe.object.FaweQueue; +import com.boydti.fawe.regions.FaweMaskManager; +import com.boydti.fawe.util.TaskManager; +import com.sk89q.worldedit.world.World; +import java.io.File; +import java.util.Collection; +import java.util.UUID; + +public class FaweNukkit implements IFawe { + @Override + public void debug(String s) { + + } + + @Override + public File getDirectory() { + return null; + } + + @Override + public void setupCommand(String label, FaweCommand cmd) { + + } + + @Override + public FawePlayer wrap(Object obj) { + return null; + } + + @Override + public void setupVault() { + + } + + @Override + public TaskManager getTaskManager() { + return null; + } + + @Override + public FaweQueue getNewQueue(String world, boolean fast) { + return null; + } + + @Override + public String getWorldName(World world) { + return null; + } + + @Override + public Collection getMaskManagers() { + return null; + } + + @Override + public void startMetrics() { + + } + + @Override + public String getPlatform() { + return null; + } + + @Override + public UUID getUUID(String name) { + return null; + } + + @Override + public String getName(UUID uuid) { + return null; + } + + @Override + public Object getBlocksHubApi() { + return null; + } +} diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitCommandManager.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitCommandManager.java index 4ff6299c..f5344f74 100644 --- a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitCommandManager.java +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitCommandManager.java @@ -21,7 +21,9 @@ public class NukkitCommandManager { executor, plugin); cmd.setPermissions(command.getPermissions()); - commandMap.register(plugin.getDescription().getName(), cmd); + for (String alias : command.getAliases()) { + commandMap.register(alias, cmd); + } return true; } } diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitCommandSender.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitCommandSender.java new file mode 100644 index 00000000..24ecece9 --- /dev/null +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitCommandSender.java @@ -0,0 +1,156 @@ +/* + * 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 Lesser 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 Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.boydti.fawe.nukkit.core; + +import cn.nukkit.Player; +import cn.nukkit.command.CommandSender; +import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.internal.cui.CUIEvent; +import com.sk89q.worldedit.session.SessionKey; +import com.sk89q.worldedit.util.auth.AuthorizationException; +import java.io.File; +import java.util.UUID; +import javax.annotation.Nullable; + + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +public class NukkitCommandSender implements Actor { + + /** + * One time generated ID. + */ + private static final UUID DEFAULT_ID = UUID.fromString("a233eb4b-4cab-42cd-9fd9-7e7b9a3f74be"); + + private CommandSender sender; + private NukkitWorldEdit plugin; + + public NukkitCommandSender(NukkitWorldEdit plugin, CommandSender sender) { + checkNotNull(plugin); + checkNotNull(sender); + checkArgument(!(sender instanceof Player), "Cannot wrap a player"); + + this.plugin = plugin; + this.sender = sender; + } + + @Override + public UUID getUniqueId() { + return DEFAULT_ID; + } + + @Override + public String getName() { + return sender.getName(); + } + + @Override + public void printRaw(String msg) { + for (String part : msg.split("\n")) { + sender.sendMessage(part); + } + } + + @Override + public void print(String msg) { + for (String part : msg.split("\n")) { + sender.sendMessage("\u00A7d" + part); + } + } + + @Override + public void printDebug(String msg) { + for (String part : msg.split("\n")) { + sender.sendMessage("\u00A77" + part); + } + } + + @Override + public void printError(String msg) { + for (String part : msg.split("\n")) { + sender.sendMessage("\u00A7c" + part); + } + } + + @Override + public boolean canDestroyBedrock() { + return true; + } + + @Override + public String[] getGroups() { + return new String[0]; + } + + @Override + public boolean hasPermission(String perm) { + return true; + } + + @Override + public void checkPermission(String permission) throws AuthorizationException { + } + + @Override + public boolean isPlayer() { + return false; + } + + @Override + public File openFileOpenDialog(String[] extensions) { + return null; + } + + @Override + public File openFileSaveDialog(String[] extensions) { + return null; + } + + @Override + public void dispatchCUIEvent(CUIEvent event) { + } + + @Override + public SessionKey getSessionKey() { + return new SessionKey() { + @Nullable + @Override + public String getName() { + return null; + } + + @Override + public boolean isActive() { + return false; + } + + @Override + public boolean isPersistent() { + return false; + } + + @Override + public UUID getUniqueId() { + return DEFAULT_ID; + } + }; + } +} \ No newline at end of file diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitConfiguration.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitConfiguration.java index b4c1b041..6a8ec4ff 100644 --- a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitConfiguration.java +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitConfiguration.java @@ -1,17 +1,16 @@ package com.boydti.fawe.nukkit.core; import com.sk89q.util.yaml.YAMLProcessor; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.util.YAMLConfiguration; import java.io.File; public class NukkitConfiguration extends YAMLConfiguration { public boolean noOpPermissions = false; - private final WorldEditPlugin plugin; + private final NukkitWorldEdit plugin; - public NukkitConfiguration(YAMLProcessor config, WorldEditPlugin plugin) { - super(config, plugin.getLogger()); + public NukkitConfiguration(YAMLProcessor config, NukkitWorldEdit plugin) { + super(config, plugin.getWELogger()); this.plugin = plugin; } diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitPlatform.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitPlatform.java index 0f111df4..539be3f4 100644 --- a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitPlatform.java +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitPlatform.java @@ -21,7 +21,6 @@ package com.boydti.fawe.nukkit.core; import cn.nukkit.item.Item; import cn.nukkit.level.Level; -import com.boydti.fawe.util.TaskManager; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.AbstractPlatform; import com.sk89q.worldedit.extension.platform.Actor; @@ -43,12 +42,14 @@ import javax.annotation.Nullable; class NukkitPlatform extends AbstractPlatform implements MultiUserPlatform { private final NukkitWorldEdit mod; + private final NukkitTaskManager taskManager; private boolean hookingEvents = false; private NukkitCommandManager commandManager; NukkitPlatform(NukkitWorldEdit mod) { this.mod = mod; this.commandManager = new NukkitCommandManager(mod.getServer().getCommandMap()); + this.taskManager = new NukkitTaskManager(mod); } boolean isHookingEvents() { @@ -78,7 +79,7 @@ class NukkitPlatform extends AbstractPlatform implements MultiUserPlatform { @Override public int schedule(long delay, long period, Runnable task) { - TaskManager.IMP.repeat(task, (int) period); + this.taskManager.repeat(task, (int) period); return 0; // TODO This isn't right, but we only check for -1 values } diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitPlayerBlockBag.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitPlayerBlockBag.java index 2166ceab..b0bf0995 100644 --- a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitPlayerBlockBag.java +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitPlayerBlockBag.java @@ -192,6 +192,7 @@ public class NukkitPlayerBlockBag extends BlockBag { if (items != null) { player.getInventory().setContents(items); items = null; + player.getInventory().sendContents(player); } } diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitTaskManager.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitTaskManager.java index 6741feed..c653e74f 100644 --- a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitTaskManager.java +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitTaskManager.java @@ -2,11 +2,10 @@ package com.boydti.fawe.nukkit.core; import cn.nukkit.plugin.Plugin; import cn.nukkit.scheduler.TaskHandler; -import com.boydti.fawe.util.TaskManager; import java.util.HashMap; -import org.apache.commons.lang.mutable.MutableInt; +import java.util.concurrent.atomic.AtomicInteger; -public class NukkitTaskManager extends TaskManager { +public class NukkitTaskManager { private final Plugin plugin; @@ -14,22 +13,19 @@ public class NukkitTaskManager extends TaskManager { this.plugin = plugin; } - @Override public int repeat(final Runnable r, final int interval) { TaskHandler task = this.plugin.getServer().getScheduler().scheduleRepeatingTask(r, interval, false); return task.getTaskId(); } - @Override public int repeatAsync(final Runnable r, final int interval) { TaskHandler task = this.plugin.getServer().getScheduler().scheduleRepeatingTask(r, interval, true); return task.getTaskId(); } - public MutableInt index = new MutableInt(0); + public AtomicInteger index = new AtomicInteger(0); public HashMap tasks = new HashMap<>(); - @Override public void async(final Runnable r) { if (r == null) { return; @@ -37,7 +33,6 @@ public class NukkitTaskManager extends TaskManager { this.plugin.getServer().getScheduler().scheduleTask(r, true); } - @Override public void task(final Runnable r) { if (r == null) { return; @@ -45,7 +40,6 @@ public class NukkitTaskManager extends TaskManager { this.plugin.getServer().getScheduler().scheduleTask(r, false); } - @Override public void later(final Runnable r, final int delay) { if (r == null) { return; @@ -53,12 +47,10 @@ public class NukkitTaskManager extends TaskManager { this.plugin.getServer().getScheduler().scheduleDelayedTask(r, delay); } - @Override public void laterAsync(final Runnable r, final int delay) { this.plugin.getServer().getScheduler().scheduleDelayedTask(r, delay, true); } - @Override public void cancel(final int task) { if (task != -1) { this.plugin.getServer().getScheduler().cancelTask(task); diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitUtil.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitUtil.java index 8ffa0094..0057b510 100644 --- a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitUtil.java +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitUtil.java @@ -28,11 +28,11 @@ import cn.nukkit.math.Vector3; import com.sk89q.worldedit.BlockVector; import com.sk89q.worldedit.BlockWorldVector; import com.sk89q.worldedit.LocalWorld; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.WorldVector; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.util.Location; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.WorldVector; public final class NukkitUtil { @@ -125,15 +125,27 @@ public final class NukkitUtil { return new NukkitEntity(e); } - public static com.sk89q.worldedit.entity.Entity createEntity(Location location, BaseEntity entity) { + public static com.sk89q.worldedit.entity.Entity createEntity(Level level, Location location, BaseEntity entity) { + // TODO + System.out.print("TODO create entity"); return null; } public static BaseBlock getBlock(Level level, Vector position) { - return null; + Vector3 pos = new Vector3(position.getX(), position.getY(), position.getZ()); + Block block = level.getBlock(pos); + int id = block.getId(); + int data = block.getDamage(); + return new BaseBlock(id, data); } - public static boolean setBlock(Level level, Vector position, BaseBlock block) { - return false; + public static boolean setBlock(Level level, Vector pos, BaseBlock block) { + int x = pos.getBlockX(); + int y = pos.getBlockY(); + int z = pos.getBlockZ(); + level.setBlockIdAt(x, y, z, block.getId()); + level.setBlockDataAt(x, y, z, block.getData()); + return true; + } } \ No newline at end of file diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitWorld.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitWorld.java index 5946ccbd..aee5c067 100644 --- a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitWorld.java +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitWorld.java @@ -1,6 +1,5 @@ package com.boydti.fawe.nukkit.core; -import cn.nukkit.block.Block; import cn.nukkit.blockentity.BlockEntity; import cn.nukkit.blockentity.BlockEntityChest; import cn.nukkit.entity.Entity; @@ -26,7 +25,6 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import javax.annotation.Nullable; -import org.bukkit.Material; import static com.google.common.base.Preconditions.checkNotNull; @@ -80,7 +78,7 @@ public class NukkitWorld extends LocalWorld { @Nullable @Override public com.sk89q.worldedit.entity.Entity createEntity(com.sk89q.worldedit.util.Location location, BaseEntity entity) { - return NukkitUtil.createEntity(location, entity); + return NukkitUtil.createEntity(getLevel(), location, entity); } /** diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitWorldEdit.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitWorldEdit.java index 77692767..fbf14984 100644 --- a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitWorldEdit.java +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitWorldEdit.java @@ -21,13 +21,20 @@ package com.boydti.fawe.nukkit.core; import cn.nukkit.Nukkit; import cn.nukkit.Player; +import cn.nukkit.command.Command; +import cn.nukkit.command.CommandSender; import cn.nukkit.plugin.PluginBase; -import cn.nukkit.utils.Logger; +import com.google.common.base.Joiner; +import com.sk89q.util.yaml.YAMLProcessor; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.event.platform.CommandEvent; import com.sk89q.worldedit.event.platform.PlatformReadyEvent; +import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; import java.io.File; +import java.util.Arrays; +import java.util.logging.Logger; import static com.google.common.base.Preconditions.checkNotNull; @@ -57,12 +64,24 @@ public class NukkitWorldEdit extends PluginBase { @Override public void onEnable() { - // TODO load FAWE - config.load(); - this.platform = new NukkitPlatform(this); - WorldEdit.getInstance().getPlatformManager().register(platform); - logger.info("WorldEdit for Nukkit (version " + getInternalVersion() + ") is loaded"); - WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent()); + try { + // TODO load FAWE + logger = Logger.getLogger(NukkitWorldEdit.class.getCanonicalName()); + File file = new File(getDataFolder(), "config.yml"); + if (!file.exists()) { + file.getParentFile().mkdirs(); + file.createNewFile(); + } + config = new NukkitConfiguration(new YAMLProcessor(file, true), this); + config.load(); + this.platform = new NukkitPlatform(this); + getServer().getPluginManager().registerEvents(new WorldEditListener(this), this); + WorldEdit.getInstance().getPlatformManager().register(platform); + logger.info("WorldEdit for Nukkit (version " + getInternalVersion() + ") is loaded"); + WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent()); + } catch (Throwable e) { + e.printStackTrace(); + } } @Override @@ -70,6 +89,28 @@ public class NukkitWorldEdit extends PluginBase { WorldEdit.getInstance().getPlatformManager().unregister(platform); } + @Override + public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { + // Add the command to the array because the underlying command handling + // code of WorldEdit expects it + String[] split = new String[args.length + 1]; + System.arraycopy(args, 0, split, 1, args.length); + split[0] = cmd.getName(); + + CommandEvent event = new CommandEvent(wrapCommandSender(sender), Joiner.on(" ").join(Arrays.asList(split))); + WorldEdit.getInstance().getEventBus().post(event); + + return true; + } + + public Actor wrapCommandSender(CommandSender sender) { + if (sender instanceof Player) { + return wrapPlayer((Player) sender); + } + + return new NukkitCommandSender(this, sender); + } + /** * Get the configuration. * @@ -79,6 +120,10 @@ public class NukkitWorldEdit extends PluginBase { return this.config; } + public Logger getWELogger() { + return logger; + } + /** * Get the WorldEdit proxy for the given player. * diff --git a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/WorldEditListener.java b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/WorldEditListener.java index e066d7e9..cc5722e7 100644 --- a/nukkit/src/main/java/com/boydti/fawe/nukkit/core/WorldEditListener.java +++ b/nukkit/src/main/java/com/boydti/fawe/nukkit/core/WorldEditListener.java @@ -26,6 +26,7 @@ import cn.nukkit.block.Block; import cn.nukkit.event.EventHandler; import cn.nukkit.event.EventPriority; import cn.nukkit.event.Listener; +import cn.nukkit.event.block.BlockBreakEvent; import cn.nukkit.event.player.PlayerCommandPreprocessEvent; import cn.nukkit.event.player.PlayerGameModeChangeEvent; import cn.nukkit.event.player.PlayerInteractEvent; @@ -93,12 +94,28 @@ public class WorldEditListener implements Listener { } } + @EventHandler(priority = EventPriority.MONITOR) + public void onBlockBreak(BlockBreakEvent event) { + final LocalPlayer player = plugin.wrapPlayer(event.getPlayer()); + final World world = player.getWorld(); + final WorldEdit we = WorldEdit.getInstance(); + final Block clickedBlock = event.getBlock(); + final WorldVector pos = new WorldVector(LocalWorldAdapter.adapt(world), clickedBlock.getX(), clickedBlock.getY(), clickedBlock.getZ()); + if (we.handleBlockLeftClick(player, pos)) { + event.setCancelled(true); + } + if (we.handleArmSwing(player)) { + event.setCancelled(true); + } + event.setCancelled(true); + } + /** * Called when a player interacts * * @param event Relevant event details */ - @EventHandler(ignoreCancelled = true,priority = EventPriority.MONITOR) + @EventHandler(priority = EventPriority.MONITOR) public void onPlayerInteract(PlayerInteractEvent event) { final LocalPlayer player = plugin.wrapPlayer(event.getPlayer()); final World world = player.getWorld(); diff --git a/nukkit/src/main/resources/plugin.yml b/nukkit/src/main/resources/plugin.yml new file mode 100644 index 00000000..4bf4d689 --- /dev/null +++ b/nukkit/src/main/resources/plugin.yml @@ -0,0 +1,5 @@ +name: "${name}" +version: "${version}" +author: Empire92 +api: ["1.0.0"] +main: com.boydti.fawe.nukkit.core.NukkitWorldEdit \ No newline at end of file