package com.plotsquared.nukkit.util;
import cn.nukkit.OfflinePlayer;
import cn.nukkit.Player;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockWallSign;
import cn.nukkit.blockentity.BlockEntity;
import cn.nukkit.blockentity.BlockEntitySign;
import cn.nukkit.entity.Entity;
import cn.nukkit.item.Item;
import cn.nukkit.level.Level;
import cn.nukkit.level.Position;
import cn.nukkit.level.generator.biome.Biome;
import cn.nukkit.math.Vector3;
import com.intellectualcrafters.plot.object.Location;
import com.intellectualcrafters.plot.object.PlotBlock;
import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.RegionWrapper;
import com.intellectualcrafters.plot.object.schematic.PlotItem;
import com.intellectualcrafters.plot.util.MathMan;
import com.intellectualcrafters.plot.util.StringComparison;
import com.intellectualcrafters.plot.util.StringMan;
import com.intellectualcrafters.plot.util.UUIDHandler;
import com.intellectualcrafters.plot.util.WorldUtil;
import com.plotsquared.nukkit.NukkitMain;
import com.plotsquared.nukkit.object.NukkitPlayer;
import java.lang.reflect.Field;
import java.util.ArrayList;
public class NukkitUtil extends WorldUtil {
private static String lastString = null;
private static Level lastWorld = null;
private static Player lastPlayer = null;
private static PlotPlayer lastPlotPlayer = null;
private static NukkitMain plugin;
public NukkitUtil(NukkitMain plugin) {
this.plugin = plugin;
}
public static void removePlayer(String player) {
lastPlayer = null;
lastPlotPlayer = null;
}
public static PlotPlayer getPlayer(OfflinePlayer op) {
if (op.isOnline()) {
return getPlayer(op.getPlayer());
}
return null;
}
public static PlotPlayer getPlayer(Player player) {
if (player == lastPlayer) {
return lastPlotPlayer;
}
String name = player.getName();
PlotPlayer plotPlayer = UUIDHandler.getPlayer(name);
if (plotPlayer != null) {
return plotPlayer;
}
lastPlotPlayer = new NukkitPlayer(player);
UUIDHandler.getPlayers().put(name, lastPlotPlayer);
lastPlayer = player;
return lastPlotPlayer;
}
public static Location getLocation(cn.nukkit.level.Location location) {
return new Location(location.getLevel().getName(), MathMan.roundInt(location.getX()), MathMan.roundInt(location.getY()),
MathMan.roundInt(location.getZ()));
}
public static Location getLocation(cn.nukkit.level.Position location) {
return new Location(location.getLevel().getName(), MathMan.roundInt(location.getX()), MathMan.roundInt(location.getY()),
MathMan.roundInt(location.getZ()));
}
public static cn.nukkit.level.Location getLocation(Location location) {
return new cn.nukkit.level.Location(location.getX(), location.getY(), location.getZ(), 0, 0, getWorld(location.getWorld()));
}
public static Level getWorld(String string) {
if (StringMan.isEqual(string, lastString)) {
if (lastWorld != null) {
return lastWorld;
}
}
Level world = plugin.getServer().getLevelByName(string);
lastString = string;
lastWorld = world;
return world;
}
public static String getWorld(Entity entity) {
return entity.getLevel().getName();
}
public static Entity[] getEntities(String worldName) {
return getWorld(worldName).getEntities();
}
public static Location getLocation(Entity entity) {
cn.nukkit.level.Location location = entity.getLocation();
String world = location.getLevel().getName();
return new Location(world, location.getFloorX(), location.getFloorY(), location.getFloorZ());
}
public static Location getLocationFull(Entity entity) {
cn.nukkit.level.Location location = entity.getLocation();
return new Location(location.getLevel().getName(), MathMan.roundInt(location.getX()), MathMan.roundInt(location.getY()), MathMan.roundInt(location.getZ()),
(float) location.getYaw(), (float) location.getPitch());
}
@Override
public boolean isWorld(String worldName) {
return getWorld(worldName) != null;
}
@Override
public String getBiome(String world, int x, int z) {
int id = getWorld(world).getBiomeId(x, z);
return Biome.getBiome(id).getName();
}
@Override
public void setSign(String worldName, int x, int y, int z, String[] lines) {
Level world = getWorld(worldName);
BlockWallSign sign = new BlockWallSign(0);
Vector3 pos = new Vector3(x, y, z);
world.setBlock(pos, sign);
BlockEntity tile = world.getBlockEntity(pos);
if (tile instanceof BlockEntitySign) {
((BlockEntitySign) tile).setText(lines[0], lines[1], lines[2], lines[3]);
tile.scheduleUpdate();
}
}
@Override
public String[] getSign(Location location) {
Level world = getWorld(location.getWorld());
Vector3 pos = new Vector3(location.getX(), location.getY(), location.getZ());
BlockEntity tile = world.getBlockEntity(pos);
if (tile instanceof BlockEntitySign) {
return ((BlockEntitySign) tile).getText();
}
return null;
}
@Override
public Location getSpawn(PlotPlayer player) {
return getLocation(((NukkitPlayer) player).player.getSpawn());
}
@Override
public Location getSpawn(String world) {
Position loc = getWorld(world).getSpawnLocation();
return new Location(world, loc.getFloorX(), loc.getFloorY(), loc.getFloorZ(), 0, 0);
}
@Override
public void setSpawn(Location location) {
Level world = getWorld(location.getWorld());
if (world != null) {
world.setSpawnLocation(new Vector3(location.getX(), location.getY(), location.getZ()));
}
}
@Override
public void saveWorld(String worldName) {
Level world = getWorld(worldName);
if (world != null) {
world.save();
}
}
@Override
public int getHighestBlock(String world, int x, int z) {
return getWorld(world).getHeightMap(x, z);
}
@Override
public int getBiomeFromString(String biomeString) {
try {
Biome biome = Biome.getBiome(biomeString.toUpperCase());
return biome.getId();
} catch (Throwable ignored) {
return -1;
}
}
@Override
public String[] getBiomeList() {
ArrayList<String> biomes = new ArrayList<>();
for (Field field : Biome.class.getDeclaredFields()) {
if (field.getName().equals(field.getName().toUpperCase())) {
biomes.add(field.getName());
}
}
return biomes.toArray(new String[biomes.size()]);
}
@Override
public boolean addItems(String worldName, PlotItem items) {
return false;
}
@Override
public boolean isBlockSolid(PlotBlock block) {
try {
Item item = Item.get(block.id, (int) block.data);
return (item != null && item.canBePlaced() && !Block.transparent[item.getId()] && Block.solid[item.getId()]);
} catch (Exception ignored) {
ignored.printStackTrace();
return false;
}
}
@Override
public String getClosestMatchingName(PlotBlock block) {
try {
return Item.get(block.id, (int) block.data).getName();
} catch (Exception ignored) {
return null;
}
}
@Override
public StringComparison<PlotBlock>.ComparisonResult getClosestBlock(String name) {
try {
Item item = Item.fromString(name);
return new StringComparison<PlotBlock>().new ComparisonResult(0, PlotBlock.get(item.getId(), item.getDamage()));
} catch (IllegalArgumentException ignored) {}
try {
byte data;
String[] split = name.split(":");
if (split.length == 2) {
data = Byte.parseByte(split[1]);
name = split[0];
} else {
data = 0;
}
double match;
short id;
if (MathMan.isInteger(split[0])) {
id = Short.parseShort(split[0]);
match = 0;
} else {
StringComparison<Item>.ComparisonResult comparison = new StringComparison<>(name, Item.getCreativeItems()).getBestMatchAdvanced();
match = comparison.match;
id = (short) comparison.best.getId();
}
PlotBlock block = PlotBlock.get(id, data);
StringComparison<PlotBlock> outer = new StringComparison<>();
return outer.new ComparisonResult(match, block);
} catch (NumberFormatException ignored) {}
return null;
}
@Override
public void setBiomes(String worldName, RegionWrapper region, String biomeString) {
Level world = getWorld(worldName);
try {
int biome = (int) Biome.class.getDeclaredField(biomeString.toUpperCase()).get(null);
for (int x = region.minX; x <= region.maxX; x++) {
for (int z = region.minZ; z <= region.maxZ; z++) {
world.setBiomeId(x, z, biome);
}
}
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public PlotBlock getBlock(Location location) {
Level world = getWorld(location.getWorld());
int id = world.getBlockIdAt(location.getX(), location.getY(), location.getZ());
if (id == 0) {
return PlotBlock.get(0, 0);
}
int data = world.getBlockDataAt(location.getX(), location.getY(), location.getZ());
return PlotBlock.get(id, data);
}
@Override
public String getMainWorld() {
return plugin.getServer().getDefaultLevel().getName();
}
}