package jk_5.nailed.plugins.worldedit;
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.platform.*;
import com.sk89q.worldedit.util.command.Dispatcher;
import com.sk89q.worldedit.world.World;
import jk_5.nailed.server.NailedPlatform;
import jk_5.nailed.server.player.NailedPlayer;
import jk_5.nailed.server.world.NailedDimensionManager;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.management.ServerConfigurationManager;
import net.minecraft.world.WorldServer;
import javax.annotation.Nullable;
import java.util.*;
class NailedWorldEditPlatform extends AbstractPlatform implements MultiUserPlatform {
private static final NailedWorldEditPlatform INSTANCE = new NailedWorldEditPlatform();
private final WorldEditConfig config = new WorldEditConfig();
private final MinecraftServer server = MinecraftServer.getServer();
private boolean hookingEvents = false;
boolean isHookingEvents() {
return hookingEvents;
}
@Override
public int resolveItem(String name) {
if(name == null){
return 0;
}
Item i = ((Item) Item.itemRegistry.getObject(name));
if(i == null){
i = ((Item) Item.itemRegistry.getObject("minecraft:" + name));
}
if(i == null){
return 0;
}
return Item.getIdFromItem(i);
}
@Override
public boolean isValidMobType(String type) {
return EntityList.stringToClassMapping.containsKey(type);
}
@Override
public void reload() {
}
@Override
public int schedule(long delay, long period, Runnable task) {
return -1;
}
@Override
public List<? extends com.sk89q.worldedit.world.World> getWorlds() {
List<WorldServer> worlds = Arrays.asList(NailedDimensionManager.instance().getVanillaWorlds());
List<com.sk89q.worldedit.world.World> ret = new ArrayList<com.sk89q.worldedit.world.World>(worlds.size());
for (WorldServer world : worlds) {
ret.add(new WorldEditWorld(world));
}
return ret;
}
@Nullable
@Override
public Player matchPlayer(Player player) {
if (player instanceof WorldEditPlayer) {
return player;
} else {
NailedPlayer pl = NailedPlatform.instance().getPlayer(player.getUniqueId());
if(pl == null){
return null;
}
return new WorldEditPlayer(pl);
}
}
@Nullable
@Override
public World matchWorld(World world) {
if (world instanceof WorldEditWorld) {
return world;
} else {
for (WorldServer ws : NailedDimensionManager.instance().getVanillaWorlds()) {
if (ws.getWorldInfo().getWorldName().equals(world.getName())) {
return new WorldEditWorld(ws);
}
}
return null;
}
}
@Override
public void registerCommands(Dispatcher dispatcher) {
if(server == null) return;
NailedWorldEditPlugin.instance().commands = dispatcher.getCommands();
//for (final CommandMapping command : dispatcher.getCommands()) {
//TODO: register permissions
/*if (command.getDescription().getPermissions().size() > 0) {
ForgeWorldEdit.inst.getPermissionsProvider().registerPermission(wrapper, command.getDescription().getPermissions().get(0));
for (int i = 1; i < command.getDescription().getPermissions().size(); i++) {
ForgeWorldEdit.inst.getPermissionsProvider().registerPermission(null, command.getDescription().getPermissions().get(i));
}
}*/
//}
}
@Override
public void registerGameHooks() {
// We registered the events already anyway, so we just 'turn them on'
hookingEvents = true;
}
@Override
public WorldEditConfig getConfiguration() {
return config;
}
@Override
public String getVersion() {
return NailedWorldEditPlugin.instance().getClass().getPackage().getImplementationVersion();
}
@Override
public String getPlatformName() {
return "Nailed";
}
@Override
public String getPlatformVersion() {
return NailedWorldEditPlugin.instance().getClass().getPackage().getImplementationVersion();
}
@Override
public Map<Capability, Preference> getCapabilities() {
Map<Capability, Preference> capabilities = new EnumMap<Capability, Preference>(Capability.class);
capabilities.put(Capability.CONFIGURATION, Preference.PREFERRED);
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.NORMAL);
return capabilities;
}
@Override
public Collection<Actor> getConnectedUsers() {
List<Actor> users = new ArrayList<Actor>();
ServerConfigurationManager scm = server.getConfigurationManager();
for(String name : scm.getAllUsernames()){
EntityPlayerMP entity = scm.getPlayerByUsername(name);
if(entity != null){
users.add(new WorldEditPlayer(NailedPlatform.instance().getPlayerFromEntity(entity)));
}
}
return users;
}
public static NailedWorldEditPlatform instance(){
return INSTANCE;
}
public static ItemStack toVanilla(BaseItemStack item) {
ItemStack ret = new ItemStack(Item.getItemById(item.getType()), item.getAmount(), item.getData());
for(Map.Entry<Integer, Integer> entry : item.getEnchantments().entrySet()){
ret.addEnchantment(net.minecraft.enchantment.Enchantment.getEnchantmentById(entry.getKey()), entry.getValue());
}
return ret;
}
}