FAWE for MCPE (WIP)
This commit is contained in:
parent
9f93f56c05
commit
e68530e8f8
@ -57,6 +57,7 @@ subprojects {
|
|||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
maven {url "http://ci.regularbox.com/plugin/repository/everything/"}
|
||||||
maven {url "http://empcraft.com/maven2"}
|
maven {url "http://empcraft.com/maven2"}
|
||||||
maven {url "http://repo.mcstats.org/content/repositories/public"}
|
maven {url "http://repo.mcstats.org/content/repositories/public"}
|
||||||
maven {url "https://hub.spigotmc.org/nexus/content/groups/public/"}
|
maven {url "https://hub.spigotmc.org/nexus/content/groups/public/"}
|
||||||
|
@ -17,7 +17,6 @@ apply plugin: 'com.github.johnrengelman.shadow'
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile project(':core')
|
compile project(':core')
|
||||||
compile 'org.spongepowered:spongeapi:4.+'
|
|
||||||
compile 'com.sk89q.worldedit:worldedit-forge-mc1.8.9:6.1.1'
|
compile 'com.sk89q.worldedit:worldedit-forge-mc1.8.9:6.1.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
31
nukkit/build.gradle
Normal file
31
nukkit/build.gradle
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
dependencies {
|
||||||
|
compile project(':core')
|
||||||
|
compile 'cn.nukkit:nukkit:1.0-SNAPSHOT'
|
||||||
|
}
|
||||||
|
|
||||||
|
processResources {
|
||||||
|
from('src/main/resources') {
|
||||||
|
include 'plugin.yml'
|
||||||
|
expand(
|
||||||
|
name: project.parent.name,
|
||||||
|
version: project.parent.version
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: 'com.github.johnrengelman.shadow'
|
||||||
|
// We only want the shadow jar produced
|
||||||
|
jar.enabled = false
|
||||||
|
shadowJar {
|
||||||
|
dependencies {
|
||||||
|
include(dependency(':core'))
|
||||||
|
}
|
||||||
|
archiveName = "${parent.name}-${project.name}-${parent.version}.jar"
|
||||||
|
destinationDir = file '../target'
|
||||||
|
}
|
||||||
|
shadowJar.doLast {
|
||||||
|
task ->
|
||||||
|
ant.checksum file: task.archivePath
|
||||||
|
}
|
||||||
|
|
||||||
|
build.dependsOn(shadowJar);
|
@ -0,0 +1,41 @@
|
|||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
|
||||||
|
public class CommandInfo {
|
||||||
|
|
||||||
|
private final String[] aliases;
|
||||||
|
private final String usage, desc;
|
||||||
|
private final String[] permissions;
|
||||||
|
|
||||||
|
public CommandInfo(String usage, String desc, String[] aliases) {
|
||||||
|
this(usage, desc, aliases, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommandInfo(String usage, String desc, String[] aliases, String[] permissions) {
|
||||||
|
this.usage = usage;
|
||||||
|
this.desc = desc;
|
||||||
|
this.aliases = aliases;
|
||||||
|
this.permissions = permissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getAliases() {
|
||||||
|
return aliases;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return aliases[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsage() {
|
||||||
|
return usage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getPermissions() {
|
||||||
|
return permissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
import cn.nukkit.command.Command;
|
||||||
|
import cn.nukkit.command.CommandExecutor;
|
||||||
|
import cn.nukkit.command.CommandSender;
|
||||||
|
import cn.nukkit.command.PluginIdentifiableCommand;
|
||||||
|
import cn.nukkit.plugin.Plugin;
|
||||||
|
import com.sk89q.util.StringUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An implementation of a dynamically registered {@link org.bukkit.command.Command} attached to a plugin
|
||||||
|
*/
|
||||||
|
public class DynamicPluginCommand extends Command implements PluginIdentifiableCommand {
|
||||||
|
|
||||||
|
protected final CommandExecutor owner;
|
||||||
|
private final Plugin plugin;
|
||||||
|
protected String[] permissions = new String[0];
|
||||||
|
|
||||||
|
public DynamicPluginCommand(String[] aliases, String desc, String usage, CommandExecutor owner, Plugin plugin) {
|
||||||
|
super(aliases[0], desc, usage, aliases);
|
||||||
|
this.owner = owner;
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute(CommandSender sender, String label, String[] args) {
|
||||||
|
return owner.onCommand(sender, this, label, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getOwner() {
|
||||||
|
return owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPermissions(String[] permissions) {
|
||||||
|
this.permissions = permissions;
|
||||||
|
if (permissions != null) {
|
||||||
|
super.setPermission(StringUtil.joinString(permissions, ";"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getPermissions() {
|
||||||
|
return permissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean testPermissionSilent(CommandSender sender) {
|
||||||
|
return super.testPermissionSilent(sender);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Plugin getPlugin() {
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,244 @@
|
|||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
|
||||||
|
import com.sk89q.jnbt.ByteArrayTag;
|
||||||
|
import com.sk89q.jnbt.ByteTag;
|
||||||
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
|
import com.sk89q.jnbt.DoubleTag;
|
||||||
|
import com.sk89q.jnbt.EndTag;
|
||||||
|
import com.sk89q.jnbt.FloatTag;
|
||||||
|
import com.sk89q.jnbt.IntArrayTag;
|
||||||
|
import com.sk89q.jnbt.IntTag;
|
||||||
|
import com.sk89q.jnbt.ListTag;
|
||||||
|
import com.sk89q.jnbt.LongTag;
|
||||||
|
import com.sk89q.jnbt.ShortTag;
|
||||||
|
import com.sk89q.jnbt.StringTag;
|
||||||
|
import com.sk89q.jnbt.Tag;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts between Jcn.nukkit.nbt.tag. and Minecraft cn.nukkit.nbt.tag. classes.
|
||||||
|
*/
|
||||||
|
final class NBTConverter {
|
||||||
|
|
||||||
|
private NBTConverter() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// private static Tag fromNativeSlow(cn.nukkit.nbt.tag.CompoundTag other) {
|
||||||
|
// try {
|
||||||
|
// byte[] bytes = NBTIO.write(other);
|
||||||
|
// FastByteArrayInputStream in = new FastByteArrayInputStream(bytes);
|
||||||
|
// NBTInputStream nin = new NBTInputStream(in);
|
||||||
|
// return nin.readNamedTag();
|
||||||
|
// } catch (IOException e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
public static CompoundTag fromNative(cn.nukkit.nbt.tag.CompoundTag other) {
|
||||||
|
Map<String, cn.nukkit.nbt.tag.Tag> tags = other.getTags();
|
||||||
|
Map<String, Tag> map = new HashMap<String, Tag>();
|
||||||
|
for (Entry<String, cn.nukkit.nbt.tag.Tag> entry : tags.entrySet()) {
|
||||||
|
map.put(entry.getKey(), fromNative(entry.getValue()));
|
||||||
|
}
|
||||||
|
return new CompoundTag(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static cn.nukkit.nbt.tag.Tag toNative(Tag tag) {
|
||||||
|
if (tag instanceof IntArrayTag) {
|
||||||
|
return toNative((IntArrayTag) tag);
|
||||||
|
|
||||||
|
} else if (tag instanceof ListTag) {
|
||||||
|
return toNative((ListTag) tag);
|
||||||
|
|
||||||
|
} else if (tag instanceof LongTag) {
|
||||||
|
return toNative((LongTag) tag);
|
||||||
|
|
||||||
|
} else if (tag instanceof StringTag) {
|
||||||
|
return toNative((StringTag) tag);
|
||||||
|
|
||||||
|
} else if (tag instanceof IntTag) {
|
||||||
|
return toNative((IntTag) tag);
|
||||||
|
|
||||||
|
} else if (tag instanceof ByteTag) {
|
||||||
|
return toNative((ByteTag) tag);
|
||||||
|
|
||||||
|
} else if (tag instanceof ByteArrayTag) {
|
||||||
|
return toNative((ByteArrayTag) tag);
|
||||||
|
|
||||||
|
} else if (tag instanceof CompoundTag) {
|
||||||
|
return toNative((CompoundTag) tag);
|
||||||
|
|
||||||
|
} else if (tag instanceof FloatTag) {
|
||||||
|
return toNative((FloatTag) tag);
|
||||||
|
|
||||||
|
} else if (tag instanceof ShortTag) {
|
||||||
|
return toNative((ShortTag) tag);
|
||||||
|
|
||||||
|
} else if (tag instanceof DoubleTag) {
|
||||||
|
return toNative((DoubleTag) tag);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Can't convert tag of type " + tag.getClass().getCanonicalName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.IntArrayTag toNative(IntArrayTag tag) {
|
||||||
|
int[] value = tag.getValue();
|
||||||
|
return new cn.nukkit.nbt.tag.IntArrayTag("", Arrays.copyOf(value, value.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.ListTag toNative(ListTag tag) {
|
||||||
|
cn.nukkit.nbt.tag.ListTag list = new cn.nukkit.nbt.tag.ListTag();
|
||||||
|
for (Tag child : tag.getValue()) {
|
||||||
|
if (child instanceof EndTag) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
list.add(toNative(child));
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.LongTag toNative(LongTag tag) {
|
||||||
|
return new cn.nukkit.nbt.tag.LongTag("", tag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.StringTag toNative(StringTag tag) {
|
||||||
|
return new cn.nukkit.nbt.tag.StringTag("", tag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.IntTag toNative(IntTag tag) {
|
||||||
|
return new cn.nukkit.nbt.tag.IntTag("", tag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.ByteTag toNative(ByteTag tag) {
|
||||||
|
return new cn.nukkit.nbt.tag.ByteTag("", tag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.ByteArrayTag toNative(ByteArrayTag tag) {
|
||||||
|
byte[] value = tag.getValue();
|
||||||
|
return new cn.nukkit.nbt.tag.ByteArrayTag("", Arrays.copyOf(value, value.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.CompoundTag toNative(CompoundTag tag) {
|
||||||
|
cn.nukkit.nbt.tag.CompoundTag compound = new cn.nukkit.nbt.tag.CompoundTag();
|
||||||
|
for (Entry<String, Tag> child : tag.getValue().entrySet()) {
|
||||||
|
compound.put(child.getKey(), toNative(child.getValue()));
|
||||||
|
}
|
||||||
|
return compound;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.FloatTag toNative(FloatTag tag) {
|
||||||
|
return new cn.nukkit.nbt.tag.FloatTag("", tag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.ShortTag toNative(ShortTag tag) {
|
||||||
|
return new cn.nukkit.nbt.tag.ShortTag("", tag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static cn.nukkit.nbt.tag.DoubleTag toNative(DoubleTag tag) {
|
||||||
|
return new cn.nukkit.nbt.tag.DoubleTag("", tag.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Tag fromNative(cn.nukkit.nbt.tag.Tag other) {
|
||||||
|
if (other instanceof cn.nukkit.nbt.tag.IntArrayTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.IntArrayTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.ListTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.ListTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.EndTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.EndTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.LongTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.LongTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.StringTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.StringTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.IntTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.IntTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.ByteTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.ByteTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.ByteArrayTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.ByteArrayTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.CompoundTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.CompoundTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.FloatTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.FloatTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.ShortTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.ShortTag) other);
|
||||||
|
|
||||||
|
} else if (other instanceof cn.nukkit.nbt.tag.DoubleTag) {
|
||||||
|
return fromNative((cn.nukkit.nbt.tag.DoubleTag) other);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Can't convert other of type " + other.getClass().getCanonicalName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IntArrayTag fromNative(cn.nukkit.nbt.tag.IntArrayTag other) {
|
||||||
|
int[] value = other.data;
|
||||||
|
return new IntArrayTag(Arrays.copyOf(value, value.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ListTag fromNative(cn.nukkit.nbt.tag.ListTag other) {
|
||||||
|
other = (cn.nukkit.nbt.tag.ListTag) other.copy();
|
||||||
|
List<Tag> list = new ArrayList<Tag>();
|
||||||
|
Class<? extends Tag> listClass = StringTag.class;
|
||||||
|
int tags = other.size();
|
||||||
|
for (int i = 0; i < tags; i++) {
|
||||||
|
Tag child = fromNative(other.get(0));
|
||||||
|
other.remove(0);
|
||||||
|
list.add(child);
|
||||||
|
listClass = child.getClass();
|
||||||
|
}
|
||||||
|
return new ListTag(listClass, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static EndTag fromNative(cn.nukkit.nbt.tag.EndTag other) {
|
||||||
|
return new EndTag();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LongTag fromNative(cn.nukkit.nbt.tag.LongTag other) {
|
||||||
|
return new LongTag(other.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static StringTag fromNative(cn.nukkit.nbt.tag.StringTag other) {
|
||||||
|
return new StringTag(other.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IntTag fromNative(cn.nukkit.nbt.tag.IntTag other) {
|
||||||
|
return new IntTag(other.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ByteTag fromNative(cn.nukkit.nbt.tag.ByteTag other) {
|
||||||
|
return new ByteTag((byte) other.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ByteArrayTag fromNative(cn.nukkit.nbt.tag.ByteArrayTag other) {
|
||||||
|
byte[] value = other.data;
|
||||||
|
return new ByteArrayTag(Arrays.copyOf(value, value.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static FloatTag fromNative(cn.nukkit.nbt.tag.FloatTag other) {
|
||||||
|
return new FloatTag(other.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ShortTag fromNative(cn.nukkit.nbt.tag.ShortTag other) {
|
||||||
|
return new ShortTag((short) other.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static DoubleTag fromNative(cn.nukkit.nbt.tag.DoubleTag other) {
|
||||||
|
return new DoubleTag(other.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
import cn.nukkit.command.CommandExecutor;
|
||||||
|
import cn.nukkit.command.SimpleCommandMap;
|
||||||
|
import cn.nukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
public class NukkitCommandManager {
|
||||||
|
private final SimpleCommandMap commandMap;
|
||||||
|
|
||||||
|
public NukkitCommandManager(SimpleCommandMap map) {
|
||||||
|
this.commandMap = map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean register(CommandInfo command, Plugin plugin, CommandExecutor executor) {
|
||||||
|
if (command == null || commandMap == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
DynamicPluginCommand cmd = new DynamicPluginCommand(
|
||||||
|
command.getAliases(),
|
||||||
|
command.getDesc(), "/" + command.getAliases()[0] + " " + command.getUsage(),
|
||||||
|
executor,
|
||||||
|
plugin);
|
||||||
|
cmd.setPermissions(command.getPermissions());
|
||||||
|
commandMap.register(plugin.getDescription().getName(), cmd);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
public NukkitConfiguration(YAMLProcessor config, WorldEditPlugin plugin) {
|
||||||
|
super(config, plugin.getLogger());
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void load() {
|
||||||
|
super.load();
|
||||||
|
noOpPermissions = config.getBoolean("no-op-permissions", false);
|
||||||
|
migrateLegacyFolders();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void migrateLegacyFolders() {
|
||||||
|
migrate(scriptsDir, "craftscripts");
|
||||||
|
migrate(saveDir, "schematics");
|
||||||
|
migrate("drawings", "draw.js images");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void migrate(String file, String name) {
|
||||||
|
File fromDir = new File(".", file);
|
||||||
|
File toDir = new File(getWorkingDirectory(), file);
|
||||||
|
if (fromDir.exists() & !toDir.exists()) {
|
||||||
|
if (fromDir.renameTo(toDir)) {
|
||||||
|
plugin.getLogger().info("Migrated " + name + " folder '" + file +
|
||||||
|
"' from server root to plugin data folder.");
|
||||||
|
} else {
|
||||||
|
plugin.getLogger().warning("Error while migrating " + name + " folder!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public File getWorkingDirectory() {
|
||||||
|
return plugin.getDataFolder();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit, a Minecraft world manipulation toolkit
|
||||||
|
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
import cn.nukkit.entity.Entity;
|
||||||
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
|
import com.sk89q.worldedit.entity.BaseEntity;
|
||||||
|
import com.sk89q.worldedit.entity.Player;
|
||||||
|
import com.sk89q.worldedit.entity.metadata.EntityType;
|
||||||
|
import com.sk89q.worldedit.extent.Extent;
|
||||||
|
import com.sk89q.worldedit.util.Location;
|
||||||
|
import com.sk89q.worldedit.world.NullWorld;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An adapter to adapt a Bukkit entity into a WorldEdit one.
|
||||||
|
*/
|
||||||
|
class NukkitEntity implements com.sk89q.worldedit.entity.Entity {
|
||||||
|
|
||||||
|
private final WeakReference<cn.nukkit.entity.Entity> entityRef;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance.
|
||||||
|
*
|
||||||
|
* @param entity the entity
|
||||||
|
*/
|
||||||
|
NukkitEntity(cn.nukkit.entity.Entity entity) {
|
||||||
|
checkNotNull(entity);
|
||||||
|
this.entityRef = new WeakReference<Entity>(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Extent getExtent() {
|
||||||
|
Entity entity = entityRef.get();
|
||||||
|
if (entity != null) {
|
||||||
|
return new NukkitWorld(entity.getLevel());
|
||||||
|
} else {
|
||||||
|
return NullWorld.getInstance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Location getLocation() {
|
||||||
|
Entity entity = entityRef.get();
|
||||||
|
if (entity != null) {
|
||||||
|
return NukkitUtil.toLocation(entity.getLocation());
|
||||||
|
} else {
|
||||||
|
return new Location(NullWorld.getInstance());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BaseEntity getState() {
|
||||||
|
Entity entity = entityRef.get();
|
||||||
|
if (entity != null) {
|
||||||
|
if (entity instanceof Player) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
CompoundTag tag = NBTConverter.fromNative(entity.namedTag);
|
||||||
|
return new BaseEntity(entity.getSaveId(), tag);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean remove() {
|
||||||
|
Entity entity = entityRef.get();
|
||||||
|
if (entity != null) {
|
||||||
|
entity.kill();
|
||||||
|
return !entity.isAlive();
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public <T> T getFacet(Class<? extends T> cls) {
|
||||||
|
Entity entity = entityRef.get();
|
||||||
|
if (entity != null && EntityType.class.isAssignableFrom(cls)) {
|
||||||
|
return (T) new NukkitEntityType(entity);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,124 @@
|
|||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
import cn.nukkit.Player;
|
||||||
|
import cn.nukkit.entity.Entity;
|
||||||
|
import cn.nukkit.entity.EntityLiving;
|
||||||
|
import cn.nukkit.entity.item.EntityBoat;
|
||||||
|
import cn.nukkit.entity.item.EntityFallingBlock;
|
||||||
|
import cn.nukkit.entity.item.EntityItem;
|
||||||
|
import cn.nukkit.entity.item.EntityMinecartEmpty;
|
||||||
|
import cn.nukkit.entity.item.EntityPainting;
|
||||||
|
import cn.nukkit.entity.item.EntityPrimedTNT;
|
||||||
|
import cn.nukkit.entity.item.EntityXPOrb;
|
||||||
|
import cn.nukkit.entity.passive.EntityAnimal;
|
||||||
|
import cn.nukkit.entity.passive.EntityNPC;
|
||||||
|
import cn.nukkit.entity.passive.EntityTameable;
|
||||||
|
import cn.nukkit.entity.projectile.EntityProjectile;
|
||||||
|
import com.sk89q.worldedit.entity.metadata.EntityType;
|
||||||
|
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
public class NukkitEntityType implements EntityType {
|
||||||
|
|
||||||
|
private final Entity entity;
|
||||||
|
|
||||||
|
public NukkitEntityType(Entity entity) {
|
||||||
|
checkNotNull(entity);
|
||||||
|
this.entity = entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPlayerDerived() {
|
||||||
|
return entity instanceof Player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isProjectile() {
|
||||||
|
return entity instanceof EntityProjectile;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isItem() {
|
||||||
|
return entity instanceof EntityItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFallingBlock() {
|
||||||
|
return entity instanceof EntityFallingBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPainting() {
|
||||||
|
return entity instanceof EntityPainting;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isItemFrame() {
|
||||||
|
// No item frames on MCPE
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isBoat() {
|
||||||
|
return entity instanceof EntityBoat;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isMinecart() {
|
||||||
|
return entity instanceof EntityMinecartEmpty;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTNT() {
|
||||||
|
return entity instanceof EntityPrimedTNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExperienceOrb() {
|
||||||
|
return entity instanceof EntityXPOrb;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isLiving() {
|
||||||
|
return entity instanceof EntityLiving;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAnimal() {
|
||||||
|
return entity instanceof EntityAnimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAmbient() {
|
||||||
|
// No bats implemented on MCPE
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNPC() {
|
||||||
|
return entity instanceof EntityNPC;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isGolem() {
|
||||||
|
// No golem on MCPE
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTamed() {
|
||||||
|
return entity instanceof EntityTameable && ((EntityTameable) entity).isTamed();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTagged() {
|
||||||
|
return entity.hasCustomName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isArmorStand() {
|
||||||
|
// No armor stand
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit, a Minecraft world manipulation toolkit
|
||||||
|
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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;
|
||||||
|
import com.sk89q.worldedit.extension.platform.Capability;
|
||||||
|
import com.sk89q.worldedit.extension.platform.MultiUserPlatform;
|
||||||
|
import com.sk89q.worldedit.extension.platform.Preference;
|
||||||
|
import com.sk89q.worldedit.util.command.CommandMapping;
|
||||||
|
import com.sk89q.worldedit.util.command.Description;
|
||||||
|
import com.sk89q.worldedit.util.command.Dispatcher;
|
||||||
|
import com.sk89q.worldedit.world.World;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.EnumMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
class NukkitPlatform extends AbstractPlatform implements MultiUserPlatform {
|
||||||
|
|
||||||
|
private final NukkitWorldEdit mod;
|
||||||
|
private boolean hookingEvents = false;
|
||||||
|
private NukkitCommandManager commandManager;
|
||||||
|
|
||||||
|
NukkitPlatform(NukkitWorldEdit mod) {
|
||||||
|
this.mod = mod;
|
||||||
|
this.commandManager = new NukkitCommandManager(mod.getServer().getCommandMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isHookingEvents() {
|
||||||
|
return hookingEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int resolveItem(String name) {
|
||||||
|
Item item = Item.fromString(name);
|
||||||
|
return item == null ? 0 : item.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
public NukkitWorldEdit getMod() {
|
||||||
|
return mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isValidMobType(String type) {
|
||||||
|
System.out.print("Not implemented: isValidMobType");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reload() {
|
||||||
|
getConfiguration().load();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int schedule(long delay, long period, Runnable task) {
|
||||||
|
TaskManager.IMP.repeat(task, (int) period);
|
||||||
|
return 0; // TODO This isn't right, but we only check for -1 values
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<? extends com.sk89q.worldedit.world.World> getWorlds() {
|
||||||
|
Collection<Level> levels = mod.getServer().getLevels().values();
|
||||||
|
List<com.sk89q.worldedit.world.World> ret = new ArrayList<>(levels.size());
|
||||||
|
for (Level level : levels) {
|
||||||
|
ret.add(new NukkitWorld(level));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Player matchPlayer(Player player) {
|
||||||
|
if (player instanceof NukkitPlayer) {
|
||||||
|
return player;
|
||||||
|
} else {
|
||||||
|
cn.nukkit.Player currentPlayer = mod.getServer().getPlayer(player.getName());
|
||||||
|
return currentPlayer != null ? new NukkitPlayer(this, currentPlayer) : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public World matchWorld(World world) {
|
||||||
|
if (world instanceof NukkitWorld) {
|
||||||
|
return world;
|
||||||
|
} else {
|
||||||
|
Level level = NukkitWorldEdit.inst().getServer().getLevelByName(world.getName());
|
||||||
|
return level != null ? new NukkitWorld(level) : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerCommands(Dispatcher dispatcher) {
|
||||||
|
for (CommandMapping command : dispatcher.getCommands()) {
|
||||||
|
Description description = command.getDescription();
|
||||||
|
List<String> permissions = description.getPermissions();
|
||||||
|
String[] permissionsArray = new String[permissions.size()];
|
||||||
|
permissions.toArray(permissionsArray);
|
||||||
|
commandManager.register(new CommandInfo(description.getUsage(), description.getDescription(), command.getAllAliases(), permissionsArray), mod, mod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerGameHooks() {
|
||||||
|
// We registered the events already anyway, so we just 'turn them on'
|
||||||
|
hookingEvents = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NukkitConfiguration getConfiguration() {
|
||||||
|
return mod.getWEConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getVersion() {
|
||||||
|
return mod.getInternalVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPlatformName() {
|
||||||
|
return "Nukkit-Official";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPlatformVersion() {
|
||||||
|
return mod.getInternalVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Capability, Preference> getCapabilities() {
|
||||||
|
Map<Capability, Preference> capabilities = new EnumMap<>(Capability.class);
|
||||||
|
capabilities.put(Capability.CONFIGURATION, Preference.NORMAL);
|
||||||
|
capabilities.put(Capability.WORLDEDIT_CUI, Preference.NORMAL);
|
||||||
|
capabilities.put(Capability.GAME_HOOKS, Preference.NORMAL);
|
||||||
|
capabilities.put(Capability.PERMISSIONS, Preference.NORMAL);
|
||||||
|
capabilities.put(Capability.USER_COMMANDS, Preference.NORMAL);
|
||||||
|
capabilities.put(Capability.WORLD_EDITING, Preference.PREFERRED);
|
||||||
|
return capabilities;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<Actor> getConnectedUsers() {
|
||||||
|
List<Actor> users = new ArrayList<Actor>();
|
||||||
|
for (Map.Entry<UUID, cn.nukkit.Player> entry : mod.getServer().getOnlinePlayers().entrySet()) {
|
||||||
|
users.add(new NukkitPlayer(this, entry.getValue()));
|
||||||
|
}
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,245 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit, a Minecraft world manipulation toolkit
|
||||||
|
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
import cn.nukkit.Player;
|
||||||
|
import cn.nukkit.inventory.PlayerInventory;
|
||||||
|
import cn.nukkit.item.Item;
|
||||||
|
import cn.nukkit.level.Location;
|
||||||
|
import com.sk89q.worldedit.LocalPlayer;
|
||||||
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
|
import com.sk89q.worldedit.Vector;
|
||||||
|
import com.sk89q.worldedit.WorldEditException;
|
||||||
|
import com.sk89q.worldedit.WorldVector;
|
||||||
|
import com.sk89q.worldedit.blocks.BaseBlock;
|
||||||
|
import com.sk89q.worldedit.entity.BaseEntity;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.BlockBag;
|
||||||
|
import com.sk89q.worldedit.internal.cui.CUIEvent;
|
||||||
|
import com.sk89q.worldedit.session.SessionKey;
|
||||||
|
import java.util.UUID;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
public class NukkitPlayer extends LocalPlayer {
|
||||||
|
|
||||||
|
private final NukkitPlatform platform;
|
||||||
|
private Player player;
|
||||||
|
|
||||||
|
public NukkitPlayer(NukkitPlatform platform, Player player) {
|
||||||
|
this.platform = platform;
|
||||||
|
this.player = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UUID getUniqueId() {
|
||||||
|
return player.getUniqueId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemInHand() {
|
||||||
|
PlayerInventory inv = player.getInventory();
|
||||||
|
Item itemStack = inv.getItemInHand();
|
||||||
|
return itemStack != null ? itemStack.getId() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BaseBlock getBlockInHand() throws WorldEditException {
|
||||||
|
PlayerInventory inv = player.getInventory();
|
||||||
|
Item itemStack = inv.getItemInHand();
|
||||||
|
if (itemStack == null) {
|
||||||
|
return new BaseBlock(0, 0);
|
||||||
|
}
|
||||||
|
return new BaseBlock(itemStack.getId(), itemStack.getDamage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return player.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WorldVector getPosition() {
|
||||||
|
Location loc = player.getLocation();
|
||||||
|
return new WorldVector(NukkitUtil.getLocalWorld(loc.getLevel()),
|
||||||
|
loc.getX(), loc.getY(), loc.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getPitch() {
|
||||||
|
return player.getLocation().getPitch();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getYaw() {
|
||||||
|
return player.getLocation().getYaw();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void giveItem(int type, int amt) {
|
||||||
|
player.getInventory().addItem(new Item(type, 0, amt));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printRaw(String msg) {
|
||||||
|
for (String part : msg.split("\n")) {
|
||||||
|
player.sendMessage(part);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void print(String msg) {
|
||||||
|
for (String part : msg.split("\n")) {
|
||||||
|
player.sendMessage("\u00A7d" + part);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printDebug(String msg) {
|
||||||
|
for (String part : msg.split("\n")) {
|
||||||
|
player.sendMessage("\u00A77" + part);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printError(String msg) {
|
||||||
|
for (String part : msg.split("\n")) {
|
||||||
|
player.sendMessage("\u00A7c" + part);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPosition(Vector pos, float pitch, float yaw) {
|
||||||
|
player.teleport(new Location(pos.getX(), pos.getY(), pos.getZ(), yaw, pitch, player.getLevel()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getGroups() {
|
||||||
|
// Is this ever used?
|
||||||
|
return new String[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockBag getInventoryBlockBag() {
|
||||||
|
return new NukkitPlayerBlockBag(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasPermission(String perm) {
|
||||||
|
NukkitConfiguration config = platform.getMod().getWEConfig();
|
||||||
|
return (!config.noOpPermissions && player.isOp()) || player.hasPermission(perm);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LocalWorld getWorld() {
|
||||||
|
return NukkitUtil.getLocalWorld(player.getLevel());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispatchCUIEvent(CUIEvent event) {
|
||||||
|
// No WE-CUI on MCPE
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Player getPlayer() {
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasCreativeMode() {
|
||||||
|
return player.getGamemode() == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void floatAt(int x, int y, int z, boolean alwaysGlass) {
|
||||||
|
if (alwaysGlass || !player.getAllowFlight()) {
|
||||||
|
super.floatAt(x, y, z, alwaysGlass);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setPosition(new Vector(x + 0.5, y, z + 0.5));
|
||||||
|
player.getAdventureSettings().setCanFly(true);
|
||||||
|
player.getAdventureSettings().update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BaseEntity getState() {
|
||||||
|
throw new UnsupportedOperationException("Cannot create a state from this object");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public com.sk89q.worldedit.util.Location getLocation() {
|
||||||
|
Location nativeLocation = player.getLocation();
|
||||||
|
Vector position = NukkitUtil.toVector(nativeLocation);
|
||||||
|
return new com.sk89q.worldedit.util.Location(
|
||||||
|
getWorld(),
|
||||||
|
position,
|
||||||
|
(float) nativeLocation.getYaw(),
|
||||||
|
(float) nativeLocation.getPitch());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public <T> T getFacet(Class<? extends T> cls) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SessionKey getSessionKey() {
|
||||||
|
return new SessionKeyImpl(this.player.getUniqueId(), player.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class SessionKeyImpl implements SessionKey {
|
||||||
|
// If not static, this will leak a reference
|
||||||
|
|
||||||
|
private final UUID uuid;
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
private SessionKeyImpl(UUID uuid, String name) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UUID getUniqueId() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isActive() {
|
||||||
|
// This is a thread safe call on CraftNukkit because it uses a
|
||||||
|
// CopyOnWrite list for the list of players, but the Nukkit
|
||||||
|
// specification doesn't require thread safety (though the
|
||||||
|
// spec is extremely incomplete)
|
||||||
|
return NukkitWorldEdit.inst().getServer().getPlayer(name) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPersistent() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,206 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit, a Minecraft world manipulation toolkit
|
||||||
|
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
import cn.nukkit.Player;
|
||||||
|
import cn.nukkit.inventory.PlayerInventory;
|
||||||
|
import cn.nukkit.item.Item;
|
||||||
|
import com.sk89q.worldedit.WorldVector;
|
||||||
|
import com.sk89q.worldedit.blocks.BaseItem;
|
||||||
|
import com.sk89q.worldedit.blocks.BaseItemStack;
|
||||||
|
import com.sk89q.worldedit.blocks.BlockID;
|
||||||
|
import com.sk89q.worldedit.blocks.ItemType;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.BlockBag;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.BlockBagException;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.OutOfBlocksException;
|
||||||
|
import com.sk89q.worldedit.extent.inventory.OutOfSpaceException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class NukkitPlayerBlockBag extends BlockBag {
|
||||||
|
|
||||||
|
private Player player;
|
||||||
|
private Map<Integer, Item> items;
|
||||||
|
private int size;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the object.
|
||||||
|
*
|
||||||
|
* @param player the player
|
||||||
|
*/
|
||||||
|
public NukkitPlayerBlockBag(Player player) {
|
||||||
|
this.player = player;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads inventory on first use.
|
||||||
|
*/
|
||||||
|
private void loadInventory() {
|
||||||
|
if (items == null) {
|
||||||
|
PlayerInventory inv = player.getInventory();
|
||||||
|
items = inv.getContents();
|
||||||
|
this.size = inv.getSize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the player.
|
||||||
|
*
|
||||||
|
* @return the player
|
||||||
|
*/
|
||||||
|
public Player getPlayer() {
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fetchItem(BaseItem item) throws BlockBagException {
|
||||||
|
final int id = item.getType();
|
||||||
|
final int damage = item.getData();
|
||||||
|
int amount = (item instanceof BaseItemStack) ? ((BaseItemStack) item).getAmount() : 1;
|
||||||
|
assert(amount == 1);
|
||||||
|
boolean usesDamageValue = ItemType.usesDamageValue(id);
|
||||||
|
|
||||||
|
if (id == BlockID.AIR) {
|
||||||
|
throw new IllegalArgumentException("Can't fetch air block");
|
||||||
|
}
|
||||||
|
|
||||||
|
loadInventory();
|
||||||
|
|
||||||
|
boolean found = false;
|
||||||
|
|
||||||
|
for (Map.Entry<Integer, Item> entry : items.entrySet()) {
|
||||||
|
int slot = entry.getKey();
|
||||||
|
Item nukkitItem = entry.getValue();
|
||||||
|
if (nukkitItem == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (nukkitItem.getId() != id) {
|
||||||
|
// Type id doesn't fit
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (usesDamageValue && nukkitItem.getDamage() != damage) {
|
||||||
|
// Damage value doesn't fit.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentCount = nukkitItem.getCount();
|
||||||
|
if (currentCount < 0) {
|
||||||
|
// Unlimited
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentCount > 1) {
|
||||||
|
nukkitItem.setCount(currentCount - 1);
|
||||||
|
found = true;
|
||||||
|
} else {
|
||||||
|
items.remove(slot);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
throw new OutOfBlocksException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void storeItem(BaseItem item) throws BlockBagException {
|
||||||
|
final int id = item.getType();
|
||||||
|
final int damage = item.getData();
|
||||||
|
int amount = (item instanceof BaseItemStack) ? ((BaseItemStack) item).getAmount() : 1;
|
||||||
|
assert(amount <= 64);
|
||||||
|
boolean usesDamageValue = ItemType.usesDamageValue(id);
|
||||||
|
|
||||||
|
if (id == BlockID.AIR) {
|
||||||
|
throw new IllegalArgumentException("Can't store air block");
|
||||||
|
}
|
||||||
|
|
||||||
|
loadInventory();
|
||||||
|
|
||||||
|
int freeSlot = -1;
|
||||||
|
for (int slot = 0; slot < size; ++slot) {
|
||||||
|
Item nukkitItem = items.get(slot);
|
||||||
|
|
||||||
|
if (nukkitItem == null) {
|
||||||
|
// Delay using up a free slot until we know there are no stacks
|
||||||
|
// of this item to merge into
|
||||||
|
|
||||||
|
if (freeSlot == -1) {
|
||||||
|
freeSlot = slot;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nukkitItem.getId() != id) {
|
||||||
|
// Type id doesn't fit
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usesDamageValue && nukkitItem.getDamage() != damage) {
|
||||||
|
// Damage value doesn't fit.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentCount = nukkitItem.getCount();
|
||||||
|
if (currentCount < 0) {
|
||||||
|
// Unlimited
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (currentCount >= 64) {
|
||||||
|
// Full stack
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int spaceLeft = 64 - currentCount;
|
||||||
|
if (spaceLeft >= amount) {
|
||||||
|
nukkitItem.setCount(currentCount + amount);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nukkitItem.setCount(64);
|
||||||
|
amount -= spaceLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (freeSlot > -1) {
|
||||||
|
items.put(freeSlot, new Item(id, 0, amount));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new OutOfSpaceException(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void flushChanges() {
|
||||||
|
if (items != null) {
|
||||||
|
player.getInventory().setContents(items);
|
||||||
|
items = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addSourcePosition(WorldVector pos) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addSingleSourcePosition(WorldVector pos) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
public class NukkitTaskManager extends TaskManager {
|
||||||
|
|
||||||
|
private final Plugin plugin;
|
||||||
|
|
||||||
|
public NukkitTaskManager(final Plugin plugin) {
|
||||||
|
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 HashMap<Integer, Integer> tasks = new HashMap<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void async(final Runnable r) {
|
||||||
|
if (r == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.plugin.getServer().getScheduler().scheduleTask(r, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void task(final Runnable r) {
|
||||||
|
if (r == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.plugin.getServer().getScheduler().scheduleTask(r, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void later(final Runnable r, final int delay) {
|
||||||
|
if (r == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
139
nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitUtil.java
Normal file
139
nukkit/src/main/java/com/boydti/fawe/nukkit/core/NukkitUtil.java
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
* LevelEdit, a Minecraft world manipulation toolkit
|
||||||
|
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||||
|
* Copyright (C) LevelEdit 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
import cn.nukkit.Player;
|
||||||
|
import cn.nukkit.Server;
|
||||||
|
import cn.nukkit.block.Block;
|
||||||
|
import cn.nukkit.entity.Entity;
|
||||||
|
import cn.nukkit.level.Level;
|
||||||
|
import cn.nukkit.math.Vector3;
|
||||||
|
import com.sk89q.worldedit.BlockVector;
|
||||||
|
import com.sk89q.worldedit.BlockWorldVector;
|
||||||
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
|
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 {
|
||||||
|
|
||||||
|
private NukkitUtil() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LocalWorld getLocalWorld(Level w) {
|
||||||
|
return new NukkitWorld(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockVector toVector(Block block) {
|
||||||
|
return new BlockVector(block.getX(), block.getY(), block.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BlockWorldVector toWorldVector(Block block) {
|
||||||
|
return new BlockWorldVector(getLocalWorld(block.getLevel()), block.getX(), block.getY(), block.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vector toVector(cn.nukkit.level.Location loc) {
|
||||||
|
return new Vector(loc.getX(), loc.getY(), loc.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Location toLocation(cn.nukkit.level.Location loc) {
|
||||||
|
return new Location(
|
||||||
|
getLocalWorld(loc.getLevel()),
|
||||||
|
new Vector(loc.getX(), loc.getY(), loc.getZ()),
|
||||||
|
(float) loc.getYaw(), (float) loc.getPitch()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vector toVector(Vector3 vector) {
|
||||||
|
return new Vector(vector.getX(), vector.getY(), vector.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static cn.nukkit.level.Location toLocation(WorldVector pt) {
|
||||||
|
return new cn.nukkit.level.Location(pt.getX(), pt.getY(), pt.getZ(), 0, 0, toLevel(pt));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static cn.nukkit.level.Location toLocation(Level world, Vector pt) {
|
||||||
|
return new cn.nukkit.level.Location(pt.getX(), pt.getY(), pt.getZ(), 0, 0, world);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static cn.nukkit.level.Location center(cn.nukkit.level.Location loc) {
|
||||||
|
return new cn.nukkit.level.Location(
|
||||||
|
loc.getFloorX() + 0.5,
|
||||||
|
loc.getFloorY() + 0.5,
|
||||||
|
loc.getFloorZ() + 0.5,
|
||||||
|
loc.getPitch(),
|
||||||
|
loc.getYaw(),
|
||||||
|
loc.getLevel()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Player matchSinglePlayer(Server server, String name) {
|
||||||
|
Player[] players = server.matchPlayer(name);
|
||||||
|
return players.length > 0 ? players[0] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Block toBlock(BlockWorldVector pt) {
|
||||||
|
return toLevel(pt).getBlock(toLocation(pt));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Level toLevel(WorldVector pt) {
|
||||||
|
return ((NukkitWorld) pt.getWorld()).getLevel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nukkit's Location class has serious problems with floating point
|
||||||
|
* precision.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("RedundantIfStatement")
|
||||||
|
public static boolean equals(cn.nukkit.level.Location a, cn.nukkit.level.Location b) {
|
||||||
|
if (Math.abs(a.getX() - b.getX()) > EQUALS_PRECISION) return false;
|
||||||
|
if (Math.abs(a.getY() - b.getY()) > EQUALS_PRECISION) return false;
|
||||||
|
if (Math.abs(a.getZ() - b.getZ()) > EQUALS_PRECISION) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final double EQUALS_PRECISION = 0.0001;
|
||||||
|
|
||||||
|
public static cn.nukkit.level.Location toLocation(Location location) {
|
||||||
|
return new cn.nukkit.level.Location(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch(), toLevel((LocalWorld) location.getExtent()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Level toLevel(final LocalWorld world) {
|
||||||
|
return ((NukkitWorld) world).getLevel();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NukkitEntity toLocalEntity(Entity e) {
|
||||||
|
return new NukkitEntity(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static com.sk89q.worldedit.entity.Entity createEntity(Location location, BaseEntity entity) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BaseBlock getBlock(Level level, Vector position) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean setBlock(Level level, Vector position, BaseBlock block) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,299 @@
|
|||||||
|
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;
|
||||||
|
import cn.nukkit.inventory.InventoryHolder;
|
||||||
|
import cn.nukkit.item.Item;
|
||||||
|
import cn.nukkit.level.Level;
|
||||||
|
import cn.nukkit.math.Vector3;
|
||||||
|
import com.sk89q.worldedit.BlockVector2D;
|
||||||
|
import com.sk89q.worldedit.EditSession;
|
||||||
|
import com.sk89q.worldedit.LocalWorld;
|
||||||
|
import com.sk89q.worldedit.Vector;
|
||||||
|
import com.sk89q.worldedit.Vector2D;
|
||||||
|
import com.sk89q.worldedit.WorldEdit;
|
||||||
|
import com.sk89q.worldedit.blocks.BaseBlock;
|
||||||
|
import com.sk89q.worldedit.blocks.BaseItemStack;
|
||||||
|
import com.sk89q.worldedit.entity.BaseEntity;
|
||||||
|
import com.sk89q.worldedit.regions.Region;
|
||||||
|
import com.sk89q.worldedit.util.TreeGenerator;
|
||||||
|
import com.sk89q.worldedit.world.biome.BaseBiome;
|
||||||
|
import com.sk89q.worldedit.world.registry.WorldData;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
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;
|
||||||
|
|
||||||
|
public class NukkitWorld extends LocalWorld {
|
||||||
|
|
||||||
|
private static final Logger logger = WorldEdit.logger;
|
||||||
|
|
||||||
|
private final WeakReference<Level> worldRef;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the object.
|
||||||
|
*
|
||||||
|
* @param world the world
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public NukkitWorld(Level world) {
|
||||||
|
this.worldRef = new WeakReference<Level>(world);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector3 mutable = new Vector3(0, 0, 0);
|
||||||
|
private Vector3 setMutable(Vector pt) {
|
||||||
|
mutable.x = pt.getX();
|
||||||
|
mutable.y = pt.getY();
|
||||||
|
mutable.z = pt.getZ();
|
||||||
|
return mutable;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<com.sk89q.worldedit.entity.Entity> getEntities(Region region) {
|
||||||
|
Level world = getLevel();
|
||||||
|
cn.nukkit.entity.Entity[] ents = world.getEntities();
|
||||||
|
List<com.sk89q.worldedit.entity.Entity> entities = new ArrayList<com.sk89q.worldedit.entity.Entity>();
|
||||||
|
for (cn.nukkit.entity.Entity ent : ents) {
|
||||||
|
if (region.contains(NukkitUtil.toVector(ent.getLocation()))) {
|
||||||
|
entities.add(new NukkitEntity(ent));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<com.sk89q.worldedit.entity.Entity> getEntities() {
|
||||||
|
List<com.sk89q.worldedit.entity.Entity> list = new ArrayList<com.sk89q.worldedit.entity.Entity>();
|
||||||
|
for (Entity entity : getLevel().getEntities()) {
|
||||||
|
list.add(new NukkitEntity(entity));
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public com.sk89q.worldedit.entity.Entity createEntity(com.sk89q.worldedit.util.Location location, BaseEntity entity) {
|
||||||
|
return NukkitUtil.createEntity(location, entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the world handle.
|
||||||
|
*
|
||||||
|
* @return the world
|
||||||
|
*/
|
||||||
|
public Level getLevel() {
|
||||||
|
return checkNotNull(worldRef.get(), "The world was unloaded and the reference is unavailable");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return getLevel().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getBlockLightLevel(Vector pt) {
|
||||||
|
return getLevel().getBlockLightAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean regenerate(Region region, EditSession editSession) {
|
||||||
|
BaseBlock[] history = new BaseBlock[16 * 16 * (getMaxY() + 1)];
|
||||||
|
|
||||||
|
for (Vector2D chunk : region.getChunks()) {
|
||||||
|
Vector min = new Vector(chunk.getBlockX() * 16, 0, chunk.getBlockZ() * 16);
|
||||||
|
|
||||||
|
// First save all the blocks inside
|
||||||
|
for (int x = 0; x < 16; ++x) {
|
||||||
|
for (int y = 0; y < (getMaxY() + 1); ++y) {
|
||||||
|
for (int z = 0; z < 16; ++z) {
|
||||||
|
Vector pt = min.add(x, y, z);
|
||||||
|
int index = y * 16 * 16 + z * 16 + x;
|
||||||
|
history[index] = editSession.getBlock(pt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
getLevel().regenerateChunk(chunk.getBlockX(), chunk.getBlockZ());
|
||||||
|
} catch (Throwable t) {
|
||||||
|
logger.log(java.util.logging.Level.WARNING, "Chunk generation via Nukkit raised an error", t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then restore
|
||||||
|
for (int x = 0; x < 16; ++x) {
|
||||||
|
for (int y = 0; y < (getMaxY() + 1); ++y) {
|
||||||
|
for (int z = 0; z < 16; ++z) {
|
||||||
|
Vector pt = min.add(x, y, z);
|
||||||
|
int index = y * 16 * 16 + z * 16 + x;
|
||||||
|
|
||||||
|
// We have to restore the block if it was outside
|
||||||
|
if (!region.contains(pt)) {
|
||||||
|
editSession.smartSetBlock(pt, history[index]);
|
||||||
|
} else { // Otherwise fool with history
|
||||||
|
editSession.rememberChange(pt, history[index],
|
||||||
|
editSession.rawGetBlock(pt));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean clearContainerBlockContents(Vector pt) {
|
||||||
|
BlockEntity block = getLevel().getBlockEntity(setMutable(pt));
|
||||||
|
if (block == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (block instanceof InventoryHolder) {
|
||||||
|
if (block instanceof BlockEntityChest) {
|
||||||
|
((BlockEntityChest) block).getRealInventory().clearAll();
|
||||||
|
} else {
|
||||||
|
((InventoryHolder) block).getInventory().clearAll();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public boolean generateTree(EditSession editSession, Vector pt) {
|
||||||
|
return generateTree(TreeGenerator.TreeType.TREE, editSession, pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public boolean generateBigTree(EditSession editSession, Vector pt) {
|
||||||
|
return generateTree(TreeGenerator.TreeType.BIG_TREE, editSession, pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public boolean generateBirchTree(EditSession editSession, Vector pt) {
|
||||||
|
return generateTree(TreeGenerator.TreeType.BIRCH, editSession, pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public boolean generateRedwoodTree(EditSession editSession, Vector pt) {
|
||||||
|
return generateTree(TreeGenerator.TreeType.REDWOOD, editSession, pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public boolean generateTallRedwoodTree(EditSession editSession, Vector pt) {
|
||||||
|
return generateTree(TreeGenerator.TreeType.TALL_REDWOOD, editSession, pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession, Vector pt) {
|
||||||
|
throw new UnsupportedOperationException("Not implemented yet");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dropItem(Vector pt, BaseItemStack item) {
|
||||||
|
Level world = getLevel();
|
||||||
|
Item nukkitItem = new Item(item.getType(), item.getAmount(),
|
||||||
|
item.getData());
|
||||||
|
world.dropItem(NukkitUtil.toLocation(world, pt), nukkitItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
public boolean isValidBlockType(int type) {
|
||||||
|
Item item = Item.get(type);
|
||||||
|
return item != null && item.getId() < 256 && item.canBePlaced();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkLoadedChunk(Vector pt) {
|
||||||
|
Level world = getLevel();
|
||||||
|
|
||||||
|
if (!world.isChunkLoaded(pt.getBlockX() >> 4, pt.getBlockZ() >> 4)) {
|
||||||
|
world.loadChunk(pt.getBlockX() >> 4, pt.getBlockZ() >> 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
if (other == null) {
|
||||||
|
return false;
|
||||||
|
} else if ((other instanceof NukkitWorld)) {
|
||||||
|
return ((NukkitWorld) other).getLevel().equals(getLevel());
|
||||||
|
} else if (other instanceof com.sk89q.worldedit.world.World) {
|
||||||
|
return ((com.sk89q.worldedit.world.World) other).getName().equals(getName());
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return getLevel().hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxY() {
|
||||||
|
return 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fixAfterFastMode(Iterable<BlockVector2D> chunks) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean playEffect(Vector position, int type, int data) {
|
||||||
|
throw new UnsupportedOperationException("Not implemented yet");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WorldData getWorldData() {
|
||||||
|
throw new UnsupportedOperationException("Not implemented yet");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void simulateBlockMine(Vector pt) {
|
||||||
|
getLevel().getBlock(setMutable(pt)).onBreak(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BaseBlock getBlock(Vector position) {
|
||||||
|
return NukkitUtil.getBlock(getLevel(), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean setBlock(Vector position, BaseBlock block, boolean notifyAndLight) {
|
||||||
|
return NukkitUtil.setBlock(getLevel(), position, block);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
public BaseBlock getLazyBlock(Vector position) {
|
||||||
|
return getBlock(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BaseBiome getBiome(Vector2D position) {
|
||||||
|
int id = getLevel().getBiomeId(position.getBlockX(), position.getBlockZ());
|
||||||
|
return new BaseBiome(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean setBiome(Vector2D position, BaseBiome biome) {
|
||||||
|
getLevel().setBiomeId(position.getBlockX(), position.getBlockZ(), biome.getId());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit, a Minecraft world manipulation toolkit
|
||||||
|
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
import cn.nukkit.Nukkit;
|
||||||
|
import cn.nukkit.Player;
|
||||||
|
import cn.nukkit.plugin.PluginBase;
|
||||||
|
import cn.nukkit.utils.Logger;
|
||||||
|
import com.sk89q.worldedit.LocalSession;
|
||||||
|
import com.sk89q.worldedit.WorldEdit;
|
||||||
|
import com.sk89q.worldedit.event.platform.PlatformReadyEvent;
|
||||||
|
import com.sk89q.worldedit.extension.platform.Platform;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Nukkit implementation of WorldEdit.
|
||||||
|
*/
|
||||||
|
public class NukkitWorldEdit extends PluginBase {
|
||||||
|
|
||||||
|
private Logger logger;
|
||||||
|
|
||||||
|
private static NukkitWorldEdit inst;
|
||||||
|
|
||||||
|
public static NukkitWorldEdit inst() {
|
||||||
|
return inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
private NukkitPlatform platform;
|
||||||
|
|
||||||
|
private NukkitConfiguration config;
|
||||||
|
|
||||||
|
private File workingDir;
|
||||||
|
|
||||||
|
public NukkitWorldEdit() {
|
||||||
|
inst = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@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());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
WorldEdit.getInstance().getPlatformManager().unregister(platform);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the configuration.
|
||||||
|
*
|
||||||
|
* @return the Nukkit configuration
|
||||||
|
*/
|
||||||
|
public NukkitConfiguration getWEConfig() {
|
||||||
|
return this.config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the WorldEdit proxy for the given player.
|
||||||
|
*
|
||||||
|
* @param player the player
|
||||||
|
* @return the WorldEdit player
|
||||||
|
*/
|
||||||
|
public NukkitPlayer wrapPlayer(Player player) {
|
||||||
|
checkNotNull(player);
|
||||||
|
return new NukkitPlayer(platform, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the session for a player.
|
||||||
|
*
|
||||||
|
* @param player the player
|
||||||
|
* @return the session
|
||||||
|
*/
|
||||||
|
public LocalSession getSession(Player player) {
|
||||||
|
checkNotNull(player);
|
||||||
|
return WorldEdit.getInstance().getSessionManager().get(wrapPlayer(player));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the WorldEdit proxy for the platform.
|
||||||
|
*
|
||||||
|
* @return the WorldEdit platform
|
||||||
|
*/
|
||||||
|
public Platform getPlatform() {
|
||||||
|
return this.platform;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the working directory where WorldEdit's files are stored.
|
||||||
|
*
|
||||||
|
* @return the working directory
|
||||||
|
*/
|
||||||
|
public File getWorkingDir() {
|
||||||
|
return this.workingDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the version of the WorldEdit Nukkit implementation.
|
||||||
|
*
|
||||||
|
* @return a version string
|
||||||
|
*/
|
||||||
|
public String getInternalVersion() {
|
||||||
|
return Nukkit.API_VERSION;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* WorldEdit, a Minecraft world manipulation toolkit
|
||||||
|
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
package com.boydti.fawe.nukkit.core;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.nukkit.block.Block;
|
||||||
|
import cn.nukkit.event.EventHandler;
|
||||||
|
import cn.nukkit.event.EventPriority;
|
||||||
|
import cn.nukkit.event.Listener;
|
||||||
|
import cn.nukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
|
import cn.nukkit.event.player.PlayerGameModeChangeEvent;
|
||||||
|
import cn.nukkit.event.player.PlayerInteractEvent;
|
||||||
|
import com.sk89q.util.StringUtil;
|
||||||
|
import com.sk89q.worldedit.LocalPlayer;
|
||||||
|
import com.sk89q.worldedit.WorldEdit;
|
||||||
|
import com.sk89q.worldedit.WorldVector;
|
||||||
|
import com.sk89q.worldedit.internal.LocalWorldAdapter;
|
||||||
|
import com.sk89q.worldedit.world.World;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles all events thrown in relation to a Player
|
||||||
|
*/
|
||||||
|
public class WorldEditListener implements Listener {
|
||||||
|
|
||||||
|
private NukkitWorldEdit plugin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a player plays an animation, such as an arm swing
|
||||||
|
*
|
||||||
|
* @param event Relevant event details
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the object;
|
||||||
|
*
|
||||||
|
* @param plugin the plugin
|
||||||
|
*/
|
||||||
|
public WorldEditListener(NukkitWorldEdit plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void onGamemode(PlayerGameModeChangeEvent event) {
|
||||||
|
// this will automatically refresh their session, we don't have to do anything
|
||||||
|
WorldEdit.getInstance().getSession(plugin.wrapPlayer(event.getPlayer()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a player attempts to use a command
|
||||||
|
*
|
||||||
|
* @param event Relevant event details
|
||||||
|
*/
|
||||||
|
@EventHandler(ignoreCancelled = true,priority = EventPriority.MONITOR)
|
||||||
|
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
|
||||||
|
String[] split = event.getMessage().split(" ");
|
||||||
|
|
||||||
|
if (split.length > 0) {
|
||||||
|
split[0] = split[0].substring(1);
|
||||||
|
split = WorldEdit.getInstance().getPlatformManager().getCommandManager().commandDetection(split);
|
||||||
|
}
|
||||||
|
final String newMessage = "/" + StringUtil.joinString(split, " ");
|
||||||
|
|
||||||
|
if (!newMessage.equals(event.getMessage())) {
|
||||||
|
event.setMessage(newMessage);
|
||||||
|
plugin.getServer().getPluginManager().callEvent(event);
|
||||||
|
|
||||||
|
if (!event.isCancelled()) {
|
||||||
|
if (!event.getMessage().isEmpty()) {
|
||||||
|
plugin.getServer().dispatchCommand(event.getPlayer(), event.getMessage().substring(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a player interacts
|
||||||
|
*
|
||||||
|
* @param event Relevant event details
|
||||||
|
*/
|
||||||
|
@EventHandler(ignoreCancelled = true,priority = EventPriority.MONITOR)
|
||||||
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
|
final LocalPlayer player = plugin.wrapPlayer(event.getPlayer());
|
||||||
|
final World world = player.getWorld();
|
||||||
|
final WorldEdit we = WorldEdit.getInstance();
|
||||||
|
|
||||||
|
int action = event.getAction();
|
||||||
|
if (action == PlayerInteractEvent.LEFT_CLICK_BLOCK) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (action == PlayerInteractEvent.LEFT_CLICK_AIR) {
|
||||||
|
|
||||||
|
if (we.handleArmSwing(player)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} else if (action == PlayerInteractEvent.RIGHT_CLICK_BLOCK) {
|
||||||
|
final Block clickedBlock = event.getBlock();
|
||||||
|
final WorldVector pos = new WorldVector(LocalWorldAdapter.adapt(world), clickedBlock.getX(),
|
||||||
|
clickedBlock.getY(), clickedBlock.getZ());
|
||||||
|
|
||||||
|
if (we.handleBlockRightClick(player, pos)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (we.handleRightClick(player)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
} else if (action == PlayerInteractEvent.RIGHT_CLICK_AIR) {
|
||||||
|
if (we.handleRightClick(player)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,3 @@
|
|||||||
rootProject.name = 'FastAsyncWorldEdit'
|
rootProject.name = 'FastAsyncWorldEdit'
|
||||||
|
|
||||||
include 'core', 'bukkit0', 'bukkit1710', 'bukkit18', 'bukkit19', 'bukkit110', 'forge1710', 'forge189', 'forge194', 'forge110', 'favs'
|
include 'core', 'bukkit0', 'bukkit1710', 'bukkit18', 'bukkit19', 'bukkit110', 'forge1710', 'forge189', 'forge194', 'forge110', 'favs', 'nukkit'
|
||||||
|
Loading…
Reference in New Issue
Block a user