diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock
index b4911b7..34130c3 100644
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..936d500
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+BlockAndSeek
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index b86273d..bc52ee8 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,15 @@
-
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/discord.xml b/.idea/discord.xml
new file mode 100644
index 0000000..baf5572
--- /dev/null
+++ b/.idea/discord.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 5cd9a10..87a20fc 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,7 @@
-
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 1b7e58d..ae6737f 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -4,6 +4,7 @@
+
\ No newline at end of file
diff --git a/.idea/modules/BlockAndSeek.main.iml b/.idea/modules/BlockAndSeek.main.iml
index bbeeb3e..d329813 100644
--- a/.idea/modules/BlockAndSeek.main.iml
+++ b/.idea/modules/BlockAndSeek.main.iml
@@ -1,5 +1,10 @@
+
+
+
+
+
diff --git a/.idea/modules/BlockAndSeek.test.iml b/.idea/modules/BlockAndSeek.test.iml
new file mode 100644
index 0000000..a376b96
--- /dev/null
+++ b/.idea/modules/BlockAndSeek.test.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ ADVENTURE
+
+ 1
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 7af82b3..090d6fd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +1,9 @@
+import java.nio.ByteBuffer
+import java.nio.ByteOrder
+
plugins {
id 'java'
- id("xyz.jpenilla.run-paper") version "2.3.1"
+ id "com.gradleup.shadow" version "9.2.2"
}
group = 'hdvtdev'
@@ -8,6 +11,7 @@ version = '0.0.1-a'
repositories {
mavenCentral()
+ maven { url 'https://storehouse.okaeri.eu/repository/maven-releases/'}
maven { url 'https://repo.md-5.net/content/groups/public/' }
maven { url 'https://jitpack.io' }
maven {
@@ -21,15 +25,24 @@ repositories {
maven { url 'https://libraries.minecraft.net/' }
}
+def okaeriConfigsVersion = '5.0.13'
+
dependencies {
compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")
- implementation group: 'me.libraryaddict.disguises', name: 'libsdisguises', version: '11.0.6'
- //TODO implementation 'me.lucko:commodore:2.2'
+ compileOnly group: 'me.libraryaddict.disguises', name: 'libsdisguises', version: '11.0.6'
+ compileOnly 'org.projectlombok:lombok:1.18.42'
+ annotationProcessor 'org.projectlombok:lombok:1.18.42'
+ implementation "eu.okaeri:okaeri-configs-validator-okaeri:$okaeriConfigsVersion"
+ implementation "eu.okaeri:okaeri-configs-yaml-bukkit:$okaeriConfigsVersion"
+ implementation "eu.okaeri:okaeri-configs-serdes-bukkit:$okaeriConfigsVersion"
+ implementation "eu.okaeri:okaeri-configs-serdes-commons:$okaeriConfigsVersion"
+
+ implementation "org.incendo:cloud-paper:2.0.0-beta.13"
}
-def targetJavaVersion = 21
+def targetJavaVersion = 17
java {
def javaVersion = JavaVersion.toVersion(targetJavaVersion)
sourceCompatibility = javaVersion
@@ -56,14 +69,83 @@ processResources {
}
}
-jar {
- //destinationDirectory.set(file("/home/hadvart/Documents/Minecraft/Pufferfish 1.20.4/plugins"))
- from sourceSets.main.output
- from {
- configurations.runtimeClasspath.findAll {
- it.name.startsWith('Java-Probability-Collection') || it.name.startsWith('commodore') || it.name.startsWith('brigadier')
- }.collect { zipTree(it) }
- }
- duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+tasks.shadowJar {
+ archiveClassifier.set("")
+ relocate("eu.okaeri", "hdvtdev.blockandseek.libs.okaeri")
+ relocate("org.incendo", "hdvtdev.blockandseek.libs.cloud")
}
+tasks.build {
+ dependsOn(tasks.shadowJar)
+}
+
+tasks.register('deploy') {
+ dependsOn build
+
+
+ doLast {
+ def targetDir = project.property('server.plugins.dir')
+ def rconHost = project.property('rcon.host')
+ def rconPort = project.property('rcon.port') as int
+ def rconPass = project.property('rcon.password')
+
+
+ def jarFile = tasks.jar.archiveFile.get().asFile
+
+ if (!file(targetDir).exists()) {
+ println "Err folder not found : $targetDir"
+ return
+ }
+
+ copy {
+ from jarFile
+ into targetDir
+ }
+
+ try {
+ sendRconCommand(rconHost, rconPort, rconPass, "plugman reload BlockAndSeek")
+ sendRconCommand(rconHost, rconPort, rconPass, "reload")
+ println "Plugin reloaded"
+ } catch (Exception e) {
+ println "RCON: ${e.message}"
+ }
+ }
+}
+
+def sendRconCommand(String host, int port, String password, String command) {
+ new Socket(host, port).withCloseable { socket ->
+ def out = socket.outputStream
+ def inp = socket.inputStream
+
+ def sendPacket = { int id, int type, String body ->
+ byte[] bodyBytes = body.getBytes("UTF-8")
+ int length = 4 + 4 + bodyBytes.length + 2 // id + type + body + 2 nulls
+ ByteBuffer buffer = ByteBuffer.allocate(4 + length)
+ buffer.order(ByteOrder.LITTLE_ENDIAN)
+
+ buffer.putInt(length)
+ buffer.putInt(id)
+ buffer.putInt(type)
+ buffer.put(bodyBytes)
+ buffer.put((byte) 0)
+ buffer.put((byte) 0)
+
+ out.write(buffer.array())
+ out.flush()
+ }
+
+
+ sendPacket(1, 3, password)
+
+ inp.read(new byte[4096])
+
+ sendPacket(2, 2, command)
+
+ byte[] buffer = new byte[4096]
+ int read = inp.read(buffer)
+ if (read > 12) {
+ String response = new String(buffer, 12, read - 12 - 2, "UTF-8")
+ println "Server response: $response"
+ }
+ }
+}
diff --git a/gradle.properties b/gradle.properties
index e69de29..07be753 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -0,0 +1,7 @@
+plugin.name=MySuperPlugin
+
+server.plugins.dir=/home/hadvart/Documents/minecraft/Pufferfish/1.21.8/plugins
+
+rcon.host=127.0.0.1
+rcon.port=25575
+rcon.password=14881488
\ No newline at end of file
diff --git a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java
deleted file mode 100644
index 01e97ac..0000000
--- a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package hdvtdev.blockAndSeek;
-
-import hdvtdev.blockAndSeek.eventListeners.DefaultEventListener;
-import hdvtdev.blockAndSeek.eventListeners.EventListener;
-import hdvtdev.blockAndSeek.eventListeners.ForceControlEventListener;
-import hdvtdev.blockAndSeek.managers.ConfigManager;
-import me.libraryaddict.disguise.LibsDisguises;
-import org.bukkit.Bukkit;
-import org.bukkit.command.PluginCommand;
-import org.bukkit.configuration.serialization.ConfigurationSerialization;
-import org.bukkit.plugin.Plugin;
-import org.bukkit.plugin.PluginManager;
-import org.bukkit.plugin.java.JavaPlugin;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Objects;
-import java.util.logging.Logger;
-
-public class BlockAndSeek extends JavaPlugin {
-
- private static JavaPlugin javaPlugin;
-
- public static Plugin getInstance() {
- return javaPlugin;
- }
-
- public static File getPluginDataFolder() {
- return javaPlugin.getDataFolder();
- }
-
- public static File getServerDataFolder() {
- return javaPlugin.getServer().getPluginsFolder().getParentFile();
- }
-
- public static InputStream getPluginResource(String resource) {
- return javaPlugin.getResource(resource);
- }
-
- public static void saveResource(String file) {
- javaPlugin.saveResource(file, false);
- }
-
- public static Logger getPluginLogger() {
- return javaPlugin.getLogger();
- }
-
- @Override
- public void onEnable() {
-
- javaPlugin = this;
-
- ConfigurationSerialization.registerClass(BlockAndSeekMap.class, "BlockAndSeekMap");
- ConfigurationSerialization.registerClass(Config.class, "BlockAndSeekConfig");
-
-
- LibsDisguises libsDisguises = (LibsDisguises) Bukkit.getPluginManager().getPlugin("LibsDisguises");
- if (libsDisguises == null) {
- getLogger().severe("LibsDisguises not found! It's required for the plugin to work!");
- super.onDisable();
- }
-
- try {
- ConfigManager.loadAll();
- } catch (IOException e) {
- getLogger().severe("Failed to save some .yml configs!");
- }
-
- PluginCommand command = Objects.requireNonNull(getCommand("blockandseek"));
- command.setExecutor(new CommandListener());
-
- PluginManager manager = getServer().getPluginManager();
- manager.registerEvents(ConfigManager.getConfig().forceControl() ? new ForceControlEventListener() : new EventListener(), this);
- manager.registerEvents(new DefaultEventListener(), this);
-
-
- }
-
- @Override
- public void onDisable() {
- }
-
-}
diff --git a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java
deleted file mode 100644
index 071e9c9..0000000
--- a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java
+++ /dev/null
@@ -1,315 +0,0 @@
-package hdvtdev.blockAndSeek;
-
-import hdvtdev.blockAndSeek.managers.ConfigManager;
-import hdvtdev.blockAndSeek.managers.GamesManager;
-import hdvtdev.blockAndSeek.managers.ItemManager;
-import hdvtdev.blockAndSeek.managers.PropManager;
-import hdvtdev.blockAndSeek.roulette.RouletteCreator;
-import me.libraryaddict.disguise.DisguiseAPI;
-import org.bukkit.*;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.PlayerInventory;
-import org.bukkit.persistence.PersistentDataContainer;
-import org.bukkit.persistence.PersistentDataType;
-import org.bukkit.scheduler.BukkitRunnable;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class BlockAndSeekGame {
-
- private final Map players = new ConcurrentHashMap<>();
- private final Map hiderRoulette = new HashMap<>();
-
- private volatile boolean started = false;
- private final BlockAndSeekMap map;
- private final Location lobby;
- private final Location spawn;
- private final String name;
-
- public BlockAndSeekGame(String name, BlockAndSeekMap map) {
- this.map = map;
- World world = Bukkit.getWorld(name);
- world.setTime(1000);
- world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false);
- world.setStorm(false);
- world.setGameRule(GameRule.DO_WEATHER_CYCLE, false);
- this.name = name;
- this.lobby = map.getLobbyLocation(world);
- this.spawn = map.getSpawnLocation(world);
- this.startBukkitTask();
- }
-
- public int playerCount() {
- return players.size();
- }
-
- public boolean isStarted() {
- return started;
- }
-
- public int maxPlayers() {
- return map.getMaxPlayers();
- }
-
- public boolean addPlayer(Player player) {
- if (!started) {
- players.put(player, PlayerType.HIDER);
- player.getPersistentDataContainer().set(Keys.GAME, PersistentDataType.STRING, name);
- player.teleport(lobby);
- PlayerInventory inventory = player.getInventory();
- inventory.clear();
- inventory.setItem(8, Localization.translateItem(player, ItemManager.getLeaveItem()));
- player.setGameMode(GameMode.SURVIVAL);
- player.setInvulnerable(true);
- player.setHealth(20.0);
- player.setFoodLevel(20);
- Localization.sendMessage(
- players.keySet(),
- true,
- "player-join",
- "{player}", player.getName(),
- "{players}", players.size() + "/" + map.getMaxPlayers()
- );
- return true;
- } else return false;
- }
-
- public void removePlayer(Player player) {
- players.remove(player);
- DisguiseAPI.undisguiseToAll(player);
- player.getInventory().clear();
- player.setGameMode(GameMode.SURVIVAL);
- player.getPersistentDataContainer().remove(Keys.GAME);
- Config config = ConfigManager.getConfig();
- if (config.forceControl()) ItemManager.defaultInventory(player);
- player.teleport(config.defaultSpawn());
-
-
- Localization.sendMessage(
- players.keySet(),
- true,
- "player-leave",
- "{player}", player.getName(),
- "{players}", started ? "" : players.size() + "/" + map.getMaxPlayers()
- );
- }
-
- public void setSpectator(Player hider, @Nullable Player seeker) {
- hider.spigot().respawn();
- hider.teleport(hider.getLastDeathLocation());
- players.put(hider, PlayerType.SPECTATOR);
- hider.setGameMode(GameMode.SPECTATOR);
- Localization.sendMessage(
- players.keySet(),
- true,
- seeker == null ? "hider-died" : "hider-was-found",
- "{hider}", hider.getName(),
- "{seeker}", seeker == null ? "" : seeker.getName()
- );
- }
-
- private long getHidersCount() {
- return players.values().stream().filter(type -> type == PlayerType.HIDER).count();
- }
-
- private long getSeekersCount() {
- return players.values().stream().filter(type -> type == PlayerType.SEEKER).count();
- }
-
- private List getSeekers() {
- return players.entrySet().stream().filter(entry -> entry.getValue() == PlayerType.SEEKER).map(Map.Entry::getKey).toList();
- }
-
- private List getHiders() {
- return players.entrySet().stream().filter(entry -> entry.getValue() == PlayerType.HIDER).map(Map.Entry::getKey).toList();
- }
-
- private Player getLastHider() {
- return players.keySet().iterator().next();
- }
-
- private void start() {
- started = true;
- selectRandomSeekers((int) Math.round(players.size() * 0.25));
- List hiders = getHiders();
- for (Player hider : hiders) {
- hider.getPersistentDataContainer().set(Keys.HIDER, PersistentDataType.BOOLEAN, true);
- hider.teleport(spawn);
- hider.setInvulnerable(false);
- PlayerInventory inventory = hider.getInventory();
- inventory.clear();
- inventory.addItem(Localization.translateItem(hider, ItemManager.getFreezeItem()));
- inventory.addItem(Localization.translateItem(hider, ItemManager.getFaceChangingItem()));
- hiderRoulette.put(hider, new RouletteCreator(hider, map.getBlocks()));
- }
- }
-
- private void end(boolean force) {
- GamesManager.remove(name);
- if (!force) {
- Config config = ConfigManager.getConfig();
- Location serverLobby = config.defaultSpawn();
- boolean defaultInventory = config.forceControl();
- for (Player player : players.keySet()) {
-
-
- DisguiseAPI.undisguiseToAll(player);
- if (defaultInventory) ItemManager.defaultInventory(player);
- player.setGlowing(false);
- player.setInvulnerable(false);
- Utils.setLevelWithBar(player, 0);
- player.setVisibleByDefault(true);
- player.setHealth(20);
- player.setGameMode(GameMode.SURVIVAL);
- player.teleport(serverLobby);
-
- }
- }
- }
-
- private void preEnd() {
- for (Player player : players.keySet()) {
- PersistentDataContainer container = player.getPersistentDataContainer();
- player.setInvulnerable(true);
- container.remove(Keys.HIDER);
- container.remove(Keys.SEEKER);
- container.remove(Keys.GAME);
- }
- for (Player hider : getHiders()) {
- hider.getInventory().clear();
- PropManager.unfreezeIfFrozen(hider);
- hider.setGlowing(true);
- RouletteCreator rouletteCreator = hiderRoulette.get(hider);
- rouletteCreator.getTask().cancelBoth();
- rouletteCreator.closeInventory();
- }
- }
-
- private void selectRandomSeekers(int count) {
- ArrayList rawSeekers = new ArrayList<>();
- Set playerSet = players.keySet();
- for (Player player : playerSet) {
- if (!GamesManager.triggerSeekerImmune(player)) rawSeekers.add(player);
- }
- Collections.shuffle(rawSeekers);
-
- for (Player seeker : rawSeekers.subList(0, Math.min(count, playerSet.size()))) {
- players.put(seeker, PlayerType.SEEKER);
- ItemManager.setSeekerSet(seeker);
- Utils.setLevelWithBar(seeker, 100);
- seeker.setInvulnerable(false);
- seeker.getPersistentDataContainer().set(Keys.SEEKER, PersistentDataType.BOOLEAN, true);
- GamesManager.addSeekerImmune(seeker);
- }
-
- }
-
- private void startBukkitTask() {
- new BukkitRunnable() {
-
- int waitTime = 30;
- final int defaultWaitTime = waitTime;
- int duration = map.getDuration();
- final int seekerDeploy = duration - 15;
-
-
- @Override
- public void run() {
- if (waitTime != 0) {
- int playerSize = players.size();
- if (playerSize >= map.getMinPlayers()) {
- if (waitTime % 5 == 0 || waitTime <= 5) {
- Localization.sendMessage(
- players.keySet(),
- true,
- "wait-time-left",
- "{time}", String.valueOf(waitTime)
- );
- }
- waitTime--;
- } else if (playerSize == 0) {
- end(true);
- this.cancel();
- } else if (waitTime != defaultWaitTime) {
- waitTime = defaultWaitTime;
- }
- } else {
- if (!started) {
- start();
- } else {
-
- if (players.isEmpty()) {
- end(false);
- this.cancel();
- return;
- }
-
- if (duration > 0 && getHidersCount() == 0) {
- Localization.sendTitle(
- players.keySet(),
- false,
- "seekers-won"
- );
- preEnd();
- duration = -1;
- }
-
- if (duration == seekerDeploy) {
- for (Player seeker : getSeekers()) {
- seeker.teleport(spawn);
- }
- }
-
- if (duration > 0 && getSeekersCount() == 0) duration = 0;
-
- if (duration == 0) {
-
- preEnd();
- if (getHidersCount() == 1) {
- Localization.sendTitle(
- players.keySet(),
- false,
- "hiders-solo-win",
- "{hider}", getLastHider().getName()
- );
- } else {
- Localization.sendTitle(
- players.keySet(),
- false,
- "hiders-won"
- );
- }
- duration--; // уменьшаем только один раз
- } else if (duration > 0) {
- Localization.sendActionBar(
- players.keySet(),
- false,
- "game-time-left",
- "{time}", String.valueOf(duration)
- );
- duration--;
- } else if (duration == -10) {
- end(false);
- this.cancel();
- } else {
- duration--;
- }
- }
- }
- }
-
-
- }.runTaskTimer(BlockAndSeek.getInstance(), 0L, 20L);
- }
-
-
- private enum PlayerType {
- SEEKER,
- HIDER,
- SPECTATOR
- }
-
-
-}
diff --git a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekMap.java b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekMap.java
deleted file mode 100644
index a8bbfb7..0000000
--- a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekMap.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package hdvtdev.blockAndSeek;
-
-
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.World;
-import org.bukkit.configuration.serialization.ConfigurationSerializable;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.*;
-
-public class BlockAndSeekMap implements ConfigurationSerializable {
-
- private List spawn;
- private List lobby;
- private int duration;
- private int minPlayers;
- private int maxPlayers;
- private List blocks;
-
- public BlockAndSeekMap() {
-
- }
-
- public BlockAndSeekMap(List spawn, List lobby, int duration, int minPlayers, int maxPlayers,
- List blocks) {
- this.spawn = spawn;
- this.lobby = lobby;
- this.duration = duration;
- this.minPlayers = minPlayers;
- this.maxPlayers = maxPlayers;
- this.blocks = blocks;
- }
-
- public List getSpawn() {
- return spawn;
- }
-
- public Location getSpawnLocation(@Nullable World world) {
- return new Location(world, spawn.getFirst(), spawn.get(1), spawn.get(2));
- }
-
- public void setSpawn(List spawn) {
- this.spawn = spawn;
- }
-
- public List getLobby() {
- return lobby;
- }
-
- public Location getLobbyLocation(@Nullable World world) {
- return new Location(world, lobby.getFirst(), lobby.get(1), lobby.get(2));
- }
-
- public void setLobby(List lobby) {
- this.lobby = lobby;
- }
-
- public int getDuration() {
- return duration;
- }
-
- public void setDuration(int duration) {
- this.duration = duration;
- }
-
- public int getMinPlayers() {
- return minPlayers;
- }
-
- public void setMinPlayers(int minPlayers) {
- this.minPlayers = minPlayers;
- }
-
- public int getMaxPlayers() {
- return maxPlayers;
- }
-
- public void setMaxPlayers(int maxPlayers) {
- this.maxPlayers = maxPlayers;
- }
-
- public List getBlocks() {
- return blocks;
- }
-
- public void setBlocks(List blocks) {
- this.blocks = blocks;
- }
-
- public boolean isReady() {
- return !spawn.isEmpty() && !lobby.isEmpty() && duration > 0 && !blocks.isEmpty() && minPlayers > 0 && maxPlayers > 0;
- }
-
- public static BlockAndSeekMap defaultMap() {
- return new BlockAndSeekMap(List.of(), List.of(), 0, 0, 0, List.of());
- }
-
- public Set check() {
- Set status = new HashSet<>();
- if (spawn.isEmpty()) status.add(MapStatus.SPAWN_REQUIRED);
- if (lobby.isEmpty()) status.add(MapStatus.LOBBY_REQUIRED);
- if (duration <= 0) status.add(MapStatus.DURATION_REQUIRED);
- if (minPlayers <= 0) status.add(MapStatus.MIN_PLAYERS_REQUIRED);
- if (maxPlayers <= 0) status.add(MapStatus.MAX_PLAYERS_REQUIRED);
- if (blocks.isEmpty()) status.add(MapStatus.BLOCKS_REQUIRED);
- return status;
- }
-
- @Override
- public @NotNull Map serialize() {
-
- Map map = new HashMap<>();
- map.put("spawn", spawn);
- map.put("lobby", lobby);
- map.put("duration", duration);
- map.put("min-players", minPlayers);
- map.put("max-players", maxPlayers);
- List