summaryrefslogtreewikicommitdiff
path: root/src/main/java/cat/freya/khs/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cat/freya/khs/util')
-rw-r--r--src/main/java/cat/freya/khs/util/Location.java151
-rw-r--r--src/main/java/cat/freya/khs/util/PAPIExpansion.java174
-rw-r--r--src/main/java/cat/freya/khs/util/Pair.java21
-rw-r--r--src/main/java/cat/freya/khs/util/Tuple.java27
-rw-r--r--src/main/java/cat/freya/khs/util/packet/AbstractPacket.java29
-rw-r--r--src/main/java/cat/freya/khs/util/packet/BlockChangePacket.java24
-rw-r--r--src/main/java/cat/freya/khs/util/packet/EntityMetadataPacket.java69
-rw-r--r--src/main/java/cat/freya/khs/util/packet/EntityTeleportPacket.java29
8 files changed, 524 insertions, 0 deletions
diff --git a/src/main/java/cat/freya/khs/util/Location.java b/src/main/java/cat/freya/khs/util/Location.java
new file mode 100644
index 0000000..f42e203
--- /dev/null
+++ b/src/main/java/cat/freya/khs/util/Location.java
@@ -0,0 +1,151 @@
+package cat.freya.khs.util;
+
+import cat.freya.khs.world.VoidGenerator;
+import cat.freya.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 cat.freya.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/cat/freya/khs/util/PAPIExpansion.java b/src/main/java/cat/freya/khs/util/PAPIExpansion.java
new file mode 100644
index 0000000..a569c0f
--- /dev/null
+++ b/src/main/java/cat/freya/khs/util/PAPIExpansion.java
@@ -0,0 +1,174 @@
+package cat.freya.khs.util;
+
+import me.clip.placeholderapi.expansion.PlaceholderExpansion;
+import cat.freya.khs.Main;
+import cat.freya.khs.database.Database;
+import cat.freya.khs.database.util.PlayerInfo;
+import cat.freya.khs.game.Board;
+import cat.freya.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 cat.freya.khs.configuration.Config.placeholderError;
+import static cat.freya.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.6";
+ }
+
+ @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/cat/freya/khs/util/Pair.java b/src/main/java/cat/freya/khs/util/Pair.java
new file mode 100644
index 0000000..6baf9b9
--- /dev/null
+++ b/src/main/java/cat/freya/khs/util/Pair.java
@@ -0,0 +1,21 @@
+package cat.freya.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/cat/freya/khs/util/Tuple.java b/src/main/java/cat/freya/khs/util/Tuple.java
new file mode 100644
index 0000000..b3228e1
--- /dev/null
+++ b/src/main/java/cat/freya/khs/util/Tuple.java
@@ -0,0 +1,27 @@
+package cat.freya.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/cat/freya/khs/util/packet/AbstractPacket.java b/src/main/java/cat/freya/khs/util/packet/AbstractPacket.java
new file mode 100644
index 0000000..cede0e1
--- /dev/null
+++ b/src/main/java/cat/freya/khs/util/packet/AbstractPacket.java
@@ -0,0 +1,29 @@
+package cat.freya.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/cat/freya/khs/util/packet/BlockChangePacket.java b/src/main/java/cat/freya/khs/util/packet/BlockChangePacket.java
new file mode 100644
index 0000000..7b71b0d
--- /dev/null
+++ b/src/main/java/cat/freya/khs/util/packet/BlockChangePacket.java
@@ -0,0 +1,24 @@
+package cat.freya.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/cat/freya/khs/util/packet/EntityMetadataPacket.java b/src/main/java/cat/freya/khs/util/packet/EntityMetadataPacket.java
new file mode 100644
index 0000000..04f1ad5
--- /dev/null
+++ b/src/main/java/cat/freya/khs/util/packet/EntityMetadataPacket.java
@@ -0,0 +1,69 @@
+package cat.freya.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 cat.freya.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/cat/freya/khs/util/packet/EntityTeleportPacket.java b/src/main/java/cat/freya/khs/util/packet/EntityTeleportPacket.java
new file mode 100644
index 0000000..eec03d0
--- /dev/null
+++ b/src/main/java/cat/freya/khs/util/packet/EntityTeleportPacket.java
@@ -0,0 +1,29 @@
+package cat.freya.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);
+ }
+
+}