diff options
Diffstat (limited to 'src/main/java/dev/tylerm/khs/util')
8 files changed, 524 insertions, 0 deletions
diff --git a/src/main/java/dev/tylerm/khs/util/Location.java b/src/main/java/dev/tylerm/khs/util/Location.java new file mode 100644 index 0000000..658b3cc --- /dev/null +++ b/src/main/java/dev/tylerm/khs/util/Location.java @@ -0,0 +1,151 @@ +package dev.tylerm.khs.util; + +import dev.tylerm.khs.world.VoidGenerator; +import dev.tylerm.khs.Main; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldCreator; +import org.bukkit.WorldType; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.io.File; + +import static dev.tylerm.khs.configuration.Config.spawnPatch; + +public class Location { + + private final String world; + private final double x; + private final double y; + private final double z; + + public static Location getDefault() { + return new Location( + "", + 0.0, + 0.0, + 0.0 + ); + } + + public static Location from(Player player) { + org.bukkit.Location location = player.getLocation(); + return new Location( + player.getWorld().getName(), + location.getX(), + location.getY(), + location.getZ() + ); + } + + public Location(@NotNull String world, double x, double y, double z) { + this.world = world; + this.x = x; + this.y = y; + this.z = z; + } + + public Location(@NotNull String world, @NotNull org.bukkit.Location location) { + this.world = world; + this.x = location.getX(); + this.y = location.getY(); + this.z = location.getZ(); + } + + public World load(WorldType type, World.Environment environment) { + boolean mapSave = world.startsWith("hs_"); + World bukkitWorld = Bukkit.getWorld(world); + if(bukkitWorld != null) return bukkitWorld; + WorldCreator creator = new WorldCreator(world); + if(type != null) { + creator.type(type); + } + if(environment != null) { + creator.environment(environment); + } + if(mapSave) { + creator.generator(new VoidGenerator()); + } + Bukkit.getServer().createWorld(creator).setAutoSave(!mapSave); + return Bukkit.getWorld(world); + } + + public World load() { + if(!exists()) return null; + if(!Main.getInstance().isLoaded()) return null; + return load(null, null); + } + + private org.bukkit.Location toBukkit() { + return new org.bukkit.Location( + Bukkit.getWorld(world), + x, + y, + z + ); + } + + public void teleport(Player player) { + if(!exists()) return; + if(load() == null) return; + if (spawnPatch) { + Main.getInstance().scheduleTask(() -> player.teleport(toBukkit())); + } else { + player.teleport(toBukkit()); + } + } + + public Location changeWorld(String world) { + return new Location( + world, + x, + y, + z + ); + } + + public String getWorld() { + return world; + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + + public int getBlockX() { + return (int)x; + } + + public int getBlockY() { + return (int)y; + } + + public int getBlockZ() { + return (int)z; + } + + public boolean exists() { + if(world.equals("")) return false; + String path = Main.getInstance().getWorldContainer()+File.separator+world; + File destination = new File(path); + return destination.isDirectory(); + } + + public boolean isNotSetup() { + return getBlockX() == 0 && getBlockY() == 0 && getBlockZ() == 0; + } + + public boolean isNotInBounds(int xmin, int xmax, int zmin, int zmax) { + return getBlockX() <= xmin || getBlockX() >= xmax || getBlockZ() <= zmin || getBlockZ() >= zmax; + } + +} diff --git a/src/main/java/dev/tylerm/khs/util/PAPIExpansion.java b/src/main/java/dev/tylerm/khs/util/PAPIExpansion.java new file mode 100644 index 0000000..e29a098 --- /dev/null +++ b/src/main/java/dev/tylerm/khs/util/PAPIExpansion.java @@ -0,0 +1,174 @@ +package dev.tylerm.khs.util; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import dev.tylerm.khs.Main; +import dev.tylerm.khs.database.Database; +import dev.tylerm.khs.database.util.PlayerInfo; +import dev.tylerm.khs.game.Board; +import dev.tylerm.khs.game.util.Status; + +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; +import java.util.UUID; + +import static dev.tylerm.khs.configuration.Config.placeholderError; +import static dev.tylerm.khs.configuration.Config.placeholderNoData; + +public class PAPIExpansion extends PlaceholderExpansion { + + @Override + public @NotNull String getIdentifier() { + return "hs"; + } + + @Override + public @NotNull String getAuthor() { + return "KenshinEto"; + } + + @Override + public @NotNull String getVersion() { + return "1.7.5"; + } + + @Override + public boolean persist() { + return true; + } + + @SuppressWarnings("ConstantConditions") + @Override + public String onRequest(OfflinePlayer player, @NotNull String params) { + Database database = Main.getInstance().getDatabase(); + String[] args = params.split("_"); + Status status = Main.getInstance().getGame().getStatus(); + Board board = Main.getInstance().getBoard(); + + System.out.println(args); + + if (args.length < 1) return null; + + if (args.length == 1 && args[0].equals("hiders")) { + if (!board.containsUUID(player.getUniqueId())) { + return "-"; + } else if (status == Status.PLAYING || status == Status.STARTING) { + return "" + Main.getInstance().getBoard().getHiders().size(); + } else { + return "-"; + } + } + + if (args.length == 1 && args[0].equals("seekers")) { + if (!board.containsUUID(player.getUniqueId())) { + return "-"; + } else if (status == Status.PLAYING || status == Status.STARTING) { + return "" + Main.getInstance().getBoard().getSeekers().size(); + } else { + return "-"; + } + } + + if ((args.length == 2 || args.length == 3) && (args[0].equals("stats") || args[0].equals("rank-place"))) { + Optional<PlayerInfo> info = this.getPlayerInfo(args.length == 2 ? player.getUniqueId() : database.getNameData().getUUID(args[2])); + if (info.isPresent()) { + switch (args[0]) { + case "stats": + return getValue(info.get(), args[1]); + case "rank-place": + if (getRanking(args[1]) == null) return placeholderError; + Integer count = database.getGameData().getRanking(getRanking(args[1]), player.getUniqueId()); + if (getValue(info.get(), args[1]).equals("0")) return "-"; + if (count == null) return placeholderNoData; + return count.toString(); + } + } else switch (args[0]) { + case "stats": + return placeholderNoData; + case "rank-place": + return "-"; + } + } + + if ((args[0].equals("rank-score") || args[0].equals("rank-name")) && args.length == 3) { + int place = Integer.parseInt(args[2]); + if (place < 1 || getRanking(args[1]) == null) return placeholderError; + + PlayerInfo info = database.getGameData().getInfoRanking(getRanking(args[1]), place); + if (info == null) return placeholderNoData; + + return args[0].equals("rank-score") ? getValue(info, args[1]) : Main.getInstance().getServer().getOfflinePlayer(info.getUniqueId()).getName(); + } + return null; + } + + private String getValue(PlayerInfo info, String query) { + if (query == null) return null; + switch (query) { + case "total-wins": + return String.valueOf(info.getHiderWins() + info.getSeekerWins()); + case "hider-wins": + return String.valueOf(info.getHiderWins()); + case "seeker-wins": + return String.valueOf(info.getSeekerWins()); + case "total-games": + return String.valueOf(info.getHiderGames() + info.getSeekerGames()); + case "hider-games": + return String.valueOf(info.getHiderGames()); + case "seeker-games": + return String.valueOf(info.getSeekerGames()); + case "total-kills": + return String.valueOf(info.getHiderKills() + info.getSeekerKills()); + case "hider-kills": + return String.valueOf(info.getHiderKills()); + case "seeker-kills": + return String.valueOf(info.getSeekerKills()); + case "total-deaths": + return String.valueOf(info.getHiderDeaths() + info.getSeekerDeaths()); + case "hider-deaths": + return String.valueOf(info.getHiderDeaths()); + case "seeker-deaths": + return String.valueOf(info.getSeekerDeaths()); + default: + return null; + } + } + + private String getRanking(@NotNull String query) { + switch (query) { + case "total-wins": + return "(hider_wins + seeker_wins)"; + case "hider-wins": + return "hider_wins"; + case "seeker-wins": + return "seeker_wins"; + case "total-games": + return "(hider_games + seeker_games)"; + case "hider-games": + return "hider_games"; + case "seeker-games": + return "seeker_games"; + case "total-kills": + return "(hider_kills + seeker_kills)"; + case "hider-kills": + return "hider_kills"; + case "seeker-kills": + return "seeker_kills"; + case "total-deaths": + return "(hider_deaths + seeker_deaths)"; + case "hider-deaths": + return "hider_deaths"; + case "seeker-deaths": + return "seeker_deaths"; + default: + return null; + } + } + + private Optional<PlayerInfo> getPlayerInfo(@Nullable UUID uniqueId) { + return Optional.ofNullable(Main.getInstance().getDatabase().getGameData().getInfo(uniqueId)); + } + +} diff --git a/src/main/java/dev/tylerm/khs/util/Pair.java b/src/main/java/dev/tylerm/khs/util/Pair.java new file mode 100644 index 0000000..a650e76 --- /dev/null +++ b/src/main/java/dev/tylerm/khs/util/Pair.java @@ -0,0 +1,21 @@ +package dev.tylerm.khs.util; + +public class Pair<L, R> { + + private final L left; + private final R right; + + public Pair(L left, R right) { + this.left = left; + this.right = right; + } + + public L getLeft() { + return left; + } + + public R getRight() { + return right; + } + +} diff --git a/src/main/java/dev/tylerm/khs/util/Tuple.java b/src/main/java/dev/tylerm/khs/util/Tuple.java new file mode 100644 index 0000000..64ebda6 --- /dev/null +++ b/src/main/java/dev/tylerm/khs/util/Tuple.java @@ -0,0 +1,27 @@ +package dev.tylerm.khs.util; + +public class Tuple<L, C, R> { + + private final L left; + private final C center; + private final R right; + + public Tuple(L left, C center, R right) { + this.left = left; + this.center = center; + this.right = right; + } + + public L getLeft() { + return left; + } + + public C getCenter() { + return center; + } + + public R getRight() { + return right; + } + +} diff --git a/src/main/java/dev/tylerm/khs/util/packet/AbstractPacket.java b/src/main/java/dev/tylerm/khs/util/packet/AbstractPacket.java new file mode 100644 index 0000000..e6113ac --- /dev/null +++ b/src/main/java/dev/tylerm/khs/util/packet/AbstractPacket.java @@ -0,0 +1,29 @@ +package dev.tylerm.khs.util.packet; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketContainer; +import org.bukkit.entity.Player; + +import java.lang.reflect.InvocationTargetException; + +public class AbstractPacket { + + private static final ProtocolManager protocolManager; + static { + protocolManager = ProtocolLibrary.getProtocolManager(); + } + + protected final PacketContainer packet; + + protected AbstractPacket(PacketType type){ + packet = protocolManager.createPacket(type); + packet.getModifier().writeDefaults(); + } + + public void send(Player player){ + protocolManager.sendServerPacket(player, packet); + } + +} diff --git a/src/main/java/dev/tylerm/khs/util/packet/BlockChangePacket.java b/src/main/java/dev/tylerm/khs/util/packet/BlockChangePacket.java new file mode 100644 index 0000000..0603832 --- /dev/null +++ b/src/main/java/dev/tylerm/khs/util/packet/BlockChangePacket.java @@ -0,0 +1,24 @@ +package dev.tylerm.khs.util.packet; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.wrappers.BlockPosition; +import com.comphenix.protocol.wrappers.WrappedBlockData; +import org.bukkit.Location; +import org.bukkit.Material; +import org.jetbrains.annotations.NotNull; + +public class BlockChangePacket extends AbstractPacket { + + public BlockChangePacket(){ + super(PacketType.Play.Server.BLOCK_CHANGE); + } + + public void setBlockPosition(@NotNull Location location){ + super.packet.getBlockPositionModifier().write(0, new BlockPosition(location.toVector())); + } + + public void setMaterial(Material material){ + super.packet.getBlockData().write(0, WrappedBlockData.createData(material)); + } + +} diff --git a/src/main/java/dev/tylerm/khs/util/packet/EntityMetadataPacket.java b/src/main/java/dev/tylerm/khs/util/packet/EntityMetadataPacket.java new file mode 100644 index 0000000..cf5d2a1 --- /dev/null +++ b/src/main/java/dev/tylerm/khs/util/packet/EntityMetadataPacket.java @@ -0,0 +1,69 @@ +package dev.tylerm.khs.util.packet; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.wrappers.WrappedDataValue; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.comphenix.protocol.wrappers.WrappedWatchableObject; + +import dev.tylerm.khs.Main; + +import org.bukkit.entity.Entity; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class EntityMetadataPacket extends AbstractPacket { + + private final WrappedDataWatcher watcher; + private final WrappedDataWatcher.Serializer serializer; + + public EntityMetadataPacket(){ + super(PacketType.Play.Server.ENTITY_METADATA); + watcher = new WrappedDataWatcher(); + serializer = WrappedDataWatcher.Registry.get(Byte.class); + } + + public void setEntity(@NotNull Entity target){ + super.packet.getIntegers().write(0, target.getEntityId()); + watcher.setEntity(target); + } + + public void setGlow(boolean glowing){ + if (glowing) { + watcher.setObject(0, serializer, (byte) (0x40)); + } else { + watcher.setObject(0, serializer, (byte) (0x0)); + } + } + + public void writeMetadata() { + + if (Main.getInstance().supports(19, 3)) { + + final List<WrappedDataValue> wrappedDataValueList = new ArrayList<>(); + + for(final WrappedWatchableObject entry : watcher.getWatchableObjects()) { + if(entry == null) continue; + + final WrappedDataWatcher.WrappedDataWatcherObject watcherObject = entry.getWatcherObject(); + wrappedDataValueList.add( + new WrappedDataValue( + watcherObject.getIndex(), + watcherObject.getSerializer(), + entry.getRawValue() + ) + ); + } + + packet.getDataValueCollectionModifier().write(0, wrappedDataValueList); + + } else { + + packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects()); + + } + + } + +} diff --git a/src/main/java/dev/tylerm/khs/util/packet/EntityTeleportPacket.java b/src/main/java/dev/tylerm/khs/util/packet/EntityTeleportPacket.java new file mode 100644 index 0000000..cd29e28 --- /dev/null +++ b/src/main/java/dev/tylerm/khs/util/packet/EntityTeleportPacket.java @@ -0,0 +1,29 @@ +package dev.tylerm.khs.util.packet; + +import com.comphenix.protocol.PacketType; +import org.bukkit.entity.Entity; +import org.jetbrains.annotations.NotNull; + +public class EntityTeleportPacket extends AbstractPacket { + + public EntityTeleportPacket(){ + super(PacketType.Play.Server.ENTITY_TELEPORT); + } + + public void setEntity(@NotNull Entity entity){ + super.packet.getIntegers().write(0, entity.getEntityId()); + } + + public void setX(double x){ + super.packet.getDoubles().write(0, x); + } + + public void setY(double y){ + super.packet.getDoubles().write(1, y); + } + + public void setZ(double z){ + super.packet.getDoubles().write(2, z); + } + +} |