From 87b651a4f166c3d75a36bacb5cd5c10b44e66754 Mon Sep 17 00:00:00 2001 From: Prot-CN Date: Sun, 17 Mar 2019 08:15:14 +0600 Subject: [PATCH] UPDATE 0.1.1 ~ new classes and methods etc. --- .gitattributes | 1 + .gitignore | 10 + .idea/artifacts/PrisonAPI_jar.xml | 8 - .idea/dataSources.local.xml | 15 - .idea/dataSources.xml | 19 - .../4defc9a2-e1ce-4207-91c9-549baaa59221.xml | 1027 ----------------- .idea/libraries/spigot_1_12.xml | 11 - .idea/misc.xml | 14 - .idea/vcs.xml | 6 - .idea/workspace.xml | 852 -------------- pom.xml | 2 +- src/main/java/META-INF/MANIFEST.MF | 3 - .../ru/prisonlife/api/Configurations.java | 28 + .../java/ru/prisonlife/api/PrisonAPI.java | 72 +- .../prisonlife/api/storage/InfoOfWanted.java | 15 + .../storage/RegistrationPrisonerForCage.java | 22 + .../api/storage/trades/InviteInCage.java | 68 ++ .../api/storage/trades/SaleCage.java | 76 ++ .../prisonlife/api/storage/trades/Trade.java | 10 + .../api/storage/trades/TradeFormat.java | 36 + .../api/storage/trades/TradeType.java | 5 + .../ru/prisonlife/api/template/BoardCage.java | 57 + .../java/ru/prisonlife/api/template/Cage.java | 415 +++++++ .../ru/prisonlife/api/template/Faction.java | 46 +- .../ru/prisonlife/api/template/Manager.java | 41 +- .../ru/prisonlife/api/template/Policeman.java | 155 +-- .../ru/prisonlife/api/template/Prisoner.java | 138 ++- .../ru/prisonlife/api/template/Score.java | 6 +- target/classes/META-INF/MANIFEST.MF | 3 - target/classes/plugin.yml | 4 - .../prisonlife/api/PrisonAPI$Factions.class | Bin 1974 -> 0 bytes .../classes/ru/prisonlife/api/PrisonAPI.class | Bin 1510 -> 0 bytes .../ru/prisonlife/api/template/Faction.class | Bin 10378 -> 0 bytes .../ru/prisonlife/api/template/Level.class | Bin 3084 -> 0 bytes .../ru/prisonlife/api/template/Manager.class | Bin 7615 -> 0 bytes .../prisonlife/api/template/Policeman$1.class | Bin 1488 -> 0 bytes .../prisonlife/api/template/Policeman$2.class | Bin 3550 -> 0 bytes .../prisonlife/api/template/Policeman.class | Bin 4834 -> 0 bytes .../ru/prisonlife/api/template/Prisoner.class | Bin 12115 -> 0 bytes .../ru/prisonlife/api/template/Score.class | Bin 2791 -> 0 bytes .../ru/prisonlife/api/template/Stats.class | Bin 8383 -> 0 bytes .../ru/prisonlife/api/template/Wallet.class | Bin 2882 -> 0 bytes 42 files changed, 1018 insertions(+), 2147 deletions(-) create mode 100644 .gitattributes create mode 100644 .gitignore delete mode 100644 .idea/artifacts/PrisonAPI_jar.xml delete mode 100644 .idea/dataSources.local.xml delete mode 100644 .idea/dataSources.xml delete mode 100644 .idea/dataSources/4defc9a2-e1ce-4207-91c9-549baaa59221.xml delete mode 100644 .idea/libraries/spigot_1_12.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml delete mode 100644 src/main/java/META-INF/MANIFEST.MF create mode 100644 src/main/java/ru/prisonlife/api/Configurations.java create mode 100644 src/main/java/ru/prisonlife/api/storage/InfoOfWanted.java create mode 100644 src/main/java/ru/prisonlife/api/storage/RegistrationPrisonerForCage.java create mode 100644 src/main/java/ru/prisonlife/api/storage/trades/InviteInCage.java create mode 100644 src/main/java/ru/prisonlife/api/storage/trades/SaleCage.java create mode 100644 src/main/java/ru/prisonlife/api/storage/trades/Trade.java create mode 100644 src/main/java/ru/prisonlife/api/storage/trades/TradeFormat.java create mode 100644 src/main/java/ru/prisonlife/api/storage/trades/TradeType.java create mode 100644 src/main/java/ru/prisonlife/api/template/BoardCage.java create mode 100644 src/main/java/ru/prisonlife/api/template/Cage.java delete mode 100644 target/classes/META-INF/MANIFEST.MF delete mode 100644 target/classes/plugin.yml delete mode 100644 target/classes/ru/prisonlife/api/PrisonAPI$Factions.class delete mode 100644 target/classes/ru/prisonlife/api/PrisonAPI.class delete mode 100644 target/classes/ru/prisonlife/api/template/Faction.class delete mode 100644 target/classes/ru/prisonlife/api/template/Level.class delete mode 100644 target/classes/ru/prisonlife/api/template/Manager.class delete mode 100644 target/classes/ru/prisonlife/api/template/Policeman$1.class delete mode 100644 target/classes/ru/prisonlife/api/template/Policeman$2.class delete mode 100644 target/classes/ru/prisonlife/api/template/Policeman.class delete mode 100644 target/classes/ru/prisonlife/api/template/Prisoner.class delete mode 100644 target/classes/ru/prisonlife/api/template/Score.class delete mode 100644 target/classes/ru/prisonlife/api/template/Stats.class delete mode 100644 target/classes/ru/prisonlife/api/template/Wallet.class diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..2125666 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b82ef1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +## IDEA ## +.idea/ +out/ +*.iml +*.ipr +*.iws +*.ids + +## MAVEN ## +target/ diff --git a/.idea/artifacts/PrisonAPI_jar.xml b/.idea/artifacts/PrisonAPI_jar.xml deleted file mode 100644 index c802572..0000000 --- a/.idea/artifacts/PrisonAPI_jar.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - D:/Devel_Minecraft/spi_server_1.12/plugins - - - - - \ No newline at end of file diff --git a/.idea/dataSources.local.xml b/.idea/dataSources.local.xml deleted file mode 100644 index d57c82f..0000000 --- a/.idea/dataSources.local.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - #@ - ` - - - master_key - root - *:prison4life - - - \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml deleted file mode 100644 index e270bb3..0000000 --- a/.idea/dataSources.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - mysql - true - com.mysql.jdbc.Driver - jdbc:mysql://localhost:3306/prison4life - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/dataSources/4defc9a2-e1ce-4207-91c9-549baaa59221.xml b/.idea/dataSources/4defc9a2-e1ce-4207-91c9-549baaa59221.xml deleted file mode 100644 index 9fa23d6..0000000 --- a/.idea/dataSources/4defc9a2-e1ce-4207-91c9-549baaa59221.xml +++ /dev/null @@ -1,1027 +0,0 @@ - - - - - 5.7.24 - InnoDB - InnoDB - lower/lower - - - utf8_general_ci - - - latin1_swedish_ci - - - latin1_swedish_ci - - - utf8_general_ci - - - 1 - 1 - latin1_swedish_ci - - - utf8_general_ci - - - armscii8 - 0 - - - armscii8 - 1 - - - ascii - 0 - - - ascii - 1 - - - big5 - 0 - - - big5 - 1 - - - binary - 1 - - - cp1250 - 0 - - - cp1250 - 0 - - - cp1250 - 0 - - - cp1250 - 1 - - - cp1250 - 0 - - - cp1251 - 0 - - - cp1251 - 0 - - - cp1251 - 1 - - - cp1251 - 0 - - - cp1251 - 0 - - - cp1256 - 0 - - - cp1256 - 1 - - - cp1257 - 0 - - - cp1257 - 1 - - - cp1257 - 0 - - - cp850 - 0 - - - cp850 - 1 - - - cp852 - 0 - - - cp852 - 1 - - - cp866 - 0 - - - cp866 - 1 - - - cp932 - 0 - - - cp932 - 1 - - - dec8 - 0 - - - dec8 - 1 - - - eucjpms - 0 - - - eucjpms - 1 - - - euckr - 0 - - - euckr - 1 - - - gb18030 - 0 - - - gb18030 - 1 - - - gb18030 - 0 - - - gb2312 - 0 - - - gb2312 - 1 - - - gbk - 0 - - - gbk - 1 - - - geostd8 - 0 - - - geostd8 - 1 - - - greek - 0 - - - greek - 1 - - - hebrew - 0 - - - hebrew - 1 - - - hp8 - 0 - - - hp8 - 1 - - - keybcs2 - 0 - - - keybcs2 - 1 - - - koi8r - 0 - - - koi8r - 1 - - - koi8u - 0 - - - koi8u - 1 - - - latin1 - 0 - - - latin1 - 0 - - - latin1 - 0 - - - latin1 - 0 - - - latin1 - 0 - - - latin1 - 0 - - - latin1 - 0 - - - latin1 - 1 - - - latin2 - 0 - - - latin2 - 0 - - - latin2 - 0 - - - latin2 - 1 - - - latin2 - 0 - - - latin5 - 0 - - - latin5 - 1 - - - latin7 - 0 - - - latin7 - 0 - - - latin7 - 1 - - - latin7 - 0 - - - macce - 0 - - - macce - 1 - - - macroman - 0 - - - macroman - 1 - - - sjis - 0 - - - sjis - 1 - - - swe7 - 0 - - - swe7 - 1 - - - tis620 - 0 - - - tis620 - 1 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 1 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ucs2 - 0 - - - ujis - 0 - - - ujis - 1 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 1 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16 - 0 - - - utf16le - 0 - - - utf16le - 1 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 1 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf32 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 1 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 1 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - - utf8mb4 - 0 - - -
-
- - 1 - varchar(255)|0s - normal - - - 2 - varchar(255)|0s - normal - - - 3 - int(11)|0s - normal - - - 1 - varchar(255)|0s - normal - - - 2 - varchar(255)|0s - normal - - - 3 - int(11)|0s - normal - - - 4 - double|0s - normal - - - 5 - varchar(255)|0s - normal - - - 6 - int(11)|0s - normal - - - 7 - int(11)|0s - normal - - - 8 - int(11)|0s - normal - - - 9 - int(11)|0s - normal - - - 10 - int(11)|0s - normal - - - 11 - int(11)|0s - normal - - - 12 - int(11)|0s - normal - - - 13 - int(11)|0s - normal - - - 14 - int(11)|0s - normal - - - 1 - varchar(255)|0s - normal - - - 2 - varchar(255)|0s - normal - - - 3 - int(11)|0s - normal - - - 4 - int(11)|0s - normal - - - \ No newline at end of file diff --git a/.idea/libraries/spigot_1_12.xml b/.idea/libraries/spigot_1_12.xml deleted file mode 100644 index f0066eb..0000000 --- a/.idea/libraries/spigot_1_12.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 803a716..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index f6bb769..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,852 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1548877621012 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PrisonAPI:jar - - - - - - - - No facets are configured - - - - - - - - - - - - - - - 1.8 - - - - - - - - PrisonAPI - - - - - - - - spigot-1.12 - - - - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index da4efa2..62d73ac 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ ru.prisonlifeprison-api - 0.1.0.4 + 0.1.1 UTF-8 diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF deleted file mode 100644 index f2a831e..0000000 --- a/src/main/java/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: ru.prisonlife.api.PrisonAPI - diff --git a/src/main/java/ru/prisonlife/api/Configurations.java b/src/main/java/ru/prisonlife/api/Configurations.java new file mode 100644 index 0000000..7fbd169 --- /dev/null +++ b/src/main/java/ru/prisonlife/api/Configurations.java @@ -0,0 +1,28 @@ +package ru.prisonlife.api; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; + +public enum Configurations { + FACTIONS("plugins/PrisonFactions/"), MANAGER("plugins/PrisonManager/"), + CAGES("plugins/PrisonCages/"), SUSPECT("plugins/PrisonSuspect/"), + ECONOMY("plugins/PrisonEconomy/"), RESPECT("plugins/PrisonRespect/"); + + private File file; + private FileConfiguration fileConfiguration; + + Configurations(String path) { + file = new File(path); + fileConfiguration = YamlConfiguration.loadConfiguration(new File(file.getPath(), "parameters.yml")); + } + + public FileConfiguration execute() { + return fileConfiguration; + } + + public File root() { + return file; + } +} diff --git a/src/main/java/ru/prisonlife/api/PrisonAPI.java b/src/main/java/ru/prisonlife/api/PrisonAPI.java index 8cebcef..df8c8d5 100644 --- a/src/main/java/ru/prisonlife/api/PrisonAPI.java +++ b/src/main/java/ru/prisonlife/api/PrisonAPI.java @@ -1,25 +1,37 @@ package ru.prisonlife.api; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import ru.prisonlife.api.storage.InfoOfWanted; +import ru.prisonlife.api.storage.RegistrationPrisonerForCage; +import ru.prisonlife.api.storage.trades.TradeFormat; +import ru.prisonlife.api.storage.trades.TradeType; +import ru.prisonlife.api.template.BoardCage; +import ru.prisonlife.api.template.Manager; +import ru.prisonlife.api.template.Policeman; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; +import java.io.File; +import java.sql.*; +import java.util.*; public class PrisonAPI extends JavaPlugin { - public static final String PLUGIN_PATH = "plugins/PrisonManager"; + public static final String PLUGIN_MANAGER_PATH = "plugins/PrisonManager"; + public static Map>> CACHE_TERR_EDITOR = new HashMap<>(); + public static Map ARRESTED = new HashMap<>(); + public static Map> TRADES = new HashMap<>(); + public static Map SIGN_FOR_CAGES = new HashMap<>(); - public static final Plugin plugin = Bukkit.getPluginManager().getPlugin("PrisonAPI"); + public static Connection CONN; public enum Factions { NONE(0), ASIANS(1), LATINOS(2), NIGGAZ(3), POLICE(4); public static Factions valueOf(int id) { - for (Factions factions : Factions.values()) { - if (factions.id == id) { + for(Factions factions : Factions.values()) { + if(factions.id == id) { return factions; } } @@ -38,9 +50,9 @@ public class PrisonAPI extends JavaPlugin { } } - public static Connection CONN; - public void onEnable() { + for(TradeType type : TradeType.values()) + PrisonAPI.TRADES.put(type, new HashMap<>()); try { CONN = DriverManager.getConnection( "jdbc:mysql://localhost:3306/prison4life", @@ -48,15 +60,51 @@ public class PrisonAPI extends JavaPlugin { } catch (SQLException e) { e.printStackTrace(); } + getServer().getPluginManager().registerEvents(new Policeman(null), this); } public void onDisable() { try { - if (!CONN.isClosed()) { + if(!CONN.isClosed()) { CONN.close(); } } catch (SQLException e) { e.printStackTrace(); } } + + public static Manager getRandomPrison() { + File[] prisons = Configurations.MANAGER.root().listFiles(); + assert prisons != null; String _this = prisons[new Random().nextInt(prisons.length)].getName(); + return new Manager(_this.replace("PRISON_", "").replace(".yml", "")); + } + + public static List getSulist() { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT UUID, SUSPECT FROM player_stats WHERE SUSPECT > ?")) { + statement.setInt(1, 0); + List iow = new ArrayList<>(); + try(ResultSet resultSet = statement.executeQuery()) { + while(resultSet.next()) { + UUID uuid = UUID.fromString(resultSet.getString(1)); + int su = resultSet.getInt(2); + iow.add(new InfoOfWanted(uuid, su)); + } + if(iow.size() != 0) + return iow; + else + return null; + } + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } + + public static TradeFormat getTradedCageByRole(Player player) { + for(TradeType i : TRADES.keySet()) + for(String j : TRADES.get(i).keySet()) + if(TRADES.get(i).get(j).trader.equals(player) || TRADES.get(i).get(j).member.equals(player)) + return TRADES.get(i).get(j); + return null; + } } diff --git a/src/main/java/ru/prisonlife/api/storage/InfoOfWanted.java b/src/main/java/ru/prisonlife/api/storage/InfoOfWanted.java new file mode 100644 index 0000000..db75f4e --- /dev/null +++ b/src/main/java/ru/prisonlife/api/storage/InfoOfWanted.java @@ -0,0 +1,15 @@ +package ru.prisonlife.api.storage; + +import org.bukkit.Bukkit; + +import java.util.UUID; + +public class InfoOfWanted { + public String name; + public int suspect; + + public InfoOfWanted(UUID uuid, int suspect) { + name = Bukkit.getOfflinePlayer(uuid).getName(); + this.suspect = suspect; + } +} diff --git a/src/main/java/ru/prisonlife/api/storage/RegistrationPrisonerForCage.java b/src/main/java/ru/prisonlife/api/storage/RegistrationPrisonerForCage.java new file mode 100644 index 0000000..041bf7f --- /dev/null +++ b/src/main/java/ru/prisonlife/api/storage/RegistrationPrisonerForCage.java @@ -0,0 +1,22 @@ +package ru.prisonlife.api.storage; + +public class RegistrationPrisonerForCage { + public String prison, cage; + public int time, blocks; + + public RegistrationPrisonerForCage(String prison, String cage, int time, int blocks) { + this.prison = prison; + this.cage = cage; + this.time = time; + this.blocks = blocks; + } + + public void toFinish() { + time = 0; + blocks = 0; + } + + public boolean isReady() { + return time <= 0 && blocks <= 0; + } +} diff --git a/src/main/java/ru/prisonlife/api/storage/trades/InviteInCage.java b/src/main/java/ru/prisonlife/api/storage/trades/InviteInCage.java new file mode 100644 index 0000000..865eef3 --- /dev/null +++ b/src/main/java/ru/prisonlife/api/storage/trades/InviteInCage.java @@ -0,0 +1,68 @@ +package ru.prisonlife.api.storage.trades; + +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import ru.prisonlife.api.Configurations; +import ru.prisonlife.api.PrisonAPI; +import ru.prisonlife.api.template.Cage; + +public class InviteInCage extends TradeFormat { + + private ProtectedRegion region; + + public InviteInCage(Cage cage, Player trader, Player member, int time) { + super(cage, trader, member, time); + region = WorldGuardPlugin.inst().getRegionManager(cage.getWorld()).getRegion(cage.name); + tradeType = TradeType.CAGE; + } + + @Override + public void start() { + PrisonAPI.TRADES.get(TradeType.CAGE).put(cage.name, this); + trade.runTaskTimer(Bukkit.getPluginManager().getPlugin("PrisonCages"), 20, 20); + } + + @Override + public void accept() { + trade.cancel(); + region.getMembers().addPlayer(member.getUniqueId()); + cage.addGuest(member.getUniqueId().toString()); + trader.sendMessage(ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.INVITE.OWNER.END")))); + member.sendMessage(ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.INVITE.TARGET.END")))); + PrisonAPI.TRADES.get(TradeType.CAGE).remove(cage.name); + } + + @Override + public void exception(Player player) { + if(player != null) { + player.sendMessage(ChatColor.translateAlternateColorCodes('&', + Configurations.CAGES.execute().getString("MESSAGES.INVITE.EXCEPTION"))); + } + } + + @Override + public void deny(Player player) { + trade.cancel(); + if(player.equals(trader)) { + trader.sendMessage(ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.INVITE.OWNER.DENY.FOR_OWNER")))); + member.sendMessage(ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.INVITE.OWNER.DENY.FOR_TARGET")))); + } else { + trader.sendMessage( ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.INVITE.TARGET.DENY.FOR_OWNER")))); + member.sendMessage( ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.INVITE.TARGET.DENY.FOR_TARGET")))); + } + PrisonAPI.TRADES.get(TradeType.CAGE).remove(cage.name); + } + + private String __convert__(String msg) { + return msg.replace("%cage_name%", cage.name).replace("%cage_rent%", String.valueOf(cage.getPaid())); + } +} diff --git a/src/main/java/ru/prisonlife/api/storage/trades/SaleCage.java b/src/main/java/ru/prisonlife/api/storage/trades/SaleCage.java new file mode 100644 index 0000000..284d1b0 --- /dev/null +++ b/src/main/java/ru/prisonlife/api/storage/trades/SaleCage.java @@ -0,0 +1,76 @@ +package ru.prisonlife.api.storage.trades; + +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import ru.prisonlife.api.Configurations; +import ru.prisonlife.api.PrisonAPI; +import ru.prisonlife.api.template.Cage; + +public class SaleCage extends TradeFormat { + + public int price; + + private ProtectedRegion region; + + public SaleCage(Cage cage, Player trader, Player member, int price, int time) { + super(cage, trader, member, time); + this.price = price; + region = WorldGuardPlugin.inst().getRegionManager(cage.getWorld()).getRegion(cage.name); + tradeType = TradeType.CAGE; + } + + @Override + public void start() { + PrisonAPI.TRADES.get(TradeType.CAGE).put(cage.name, this); + trade.runTaskTimer(Bukkit.getPluginManager().getPlugin("PrisonCages"), 20, 20); + } + + @Override + public void accept() { + trade.cancel(); + cage.sellCage(member, price); + region.getOwners().removePlayer(trader.getUniqueId()); + region.getOwners().addPlayer(member.getUniqueId()); + trader.sendMessage(ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.SALE.OWNER.END")))); + member.sendMessage(ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.SALE.BUYER.END")))); + PrisonAPI.TRADES.get(TradeType.CAGE).remove(cage.name); + } + + @Override + public void exception(Player player) { + if(player != null) { + player.sendMessage(ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.SALE.EXCEPTION")))); + } + } + + @Override + public void deny(Player player) { + trade.cancel(); + if(player.equals(trader)) { + trader.sendMessage(ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.SALE.OWNER.DENY.FOR_OWNER")))); + member.sendMessage(ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.SALE.OWNER.DENY.FOR_BUYER")))); + } else { + trader.sendMessage( ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.SALE.BUYER.DENY.FOR_OWNER")))); + member.sendMessage( ChatColor.translateAlternateColorCodes('&', + __convert__(Configurations.CAGES.execute().getString("MESSAGES.SALE.BUYER.DENY.FOR_BUYER")))); + } + PrisonAPI.TRADES.get(TradeType.CAGE).remove(cage.name); + } + + private String __convert__(String msg) { + return msg.replace( + "%cage_name%", cage.name).replace("%cage_rent%", cage.getPaid() + "").replace( + "%cage_seller", trader.getName()).replace("%cage_buy%", member.getName()).replace( + "%cage_price%", price + "").replace( + "%default_price%", cage.getDefaultRentPrice() + ""); + } +} diff --git a/src/main/java/ru/prisonlife/api/storage/trades/Trade.java b/src/main/java/ru/prisonlife/api/storage/trades/Trade.java new file mode 100644 index 0000000..49db46f --- /dev/null +++ b/src/main/java/ru/prisonlife/api/storage/trades/Trade.java @@ -0,0 +1,10 @@ +package ru.prisonlife.api.storage.trades; + +import org.bukkit.entity.Player; + +public interface Trade { + void start(); + void accept(); + void deny(Player player); + void exception(Player player); +} diff --git a/src/main/java/ru/prisonlife/api/storage/trades/TradeFormat.java b/src/main/java/ru/prisonlife/api/storage/trades/TradeFormat.java new file mode 100644 index 0000000..252af44 --- /dev/null +++ b/src/main/java/ru/prisonlife/api/storage/trades/TradeFormat.java @@ -0,0 +1,36 @@ +package ru.prisonlife.api.storage.trades; + +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import ru.prisonlife.api.PrisonAPI; +import ru.prisonlife.api.template.Cage; + +public abstract class TradeFormat implements Trade { + + public Cage cage; + public Player trader, member; + public int time; + public TradeType tradeType; + public BukkitRunnable trade = new BukkitRunnable() { + @Override + public void run() { + if(time > 0 && trader.isOnline() && member.isOnline()) + --time; + else { + cancel(); + exception(trader.isOnline() ? trader : (member.isOnline() ? member : null)); + PrisonAPI.TRADES.get(tradeType).remove(cage.name); + /*for(TradeType type : PrisonAPI.TRADES.keySet()) + if(tradeType == type) + PrisonAPI.TRADES.get(type).remove(cage.name);*/ + } + } + }; + + public TradeFormat(Cage cage, Player trader, Player member, int time) { + this.cage = cage; + this.trader = trader; + this.member = member; + this.time = time; + } +} diff --git a/src/main/java/ru/prisonlife/api/storage/trades/TradeType.java b/src/main/java/ru/prisonlife/api/storage/trades/TradeType.java new file mode 100644 index 0000000..ce8c56a --- /dev/null +++ b/src/main/java/ru/prisonlife/api/storage/trades/TradeType.java @@ -0,0 +1,5 @@ +package ru.prisonlife.api.storage.trades; + +public enum TradeType { + CAGE +} diff --git a/src/main/java/ru/prisonlife/api/template/BoardCage.java b/src/main/java/ru/prisonlife/api/template/BoardCage.java new file mode 100644 index 0000000..c5debc7 --- /dev/null +++ b/src/main/java/ru/prisonlife/api/template/BoardCage.java @@ -0,0 +1,57 @@ +package ru.prisonlife.api.template; + +import org.bukkit.ChatColor; +import org.bukkit.block.Sign; + +public class BoardCage { + + public String name; + public Sign sign; + public Cage cage; + private String[] startMenu; + private String boldWhite = ChatColor.WHITE + "" + ChatColor.BOLD; + + + public BoardCage(Sign sign) { + this.sign = sign; + name = ChatColor.stripColor(sign.getLine(1)); + cage = Cage.getExisting(name); + Cage.getExisting(name).boardCage = this; + } + + public void setStartMenu(String[] startMenu){ + this.startMenu = startMenu; + } + + public String[] getStartMenu() { + return startMenu; + } + + public void editLine(int i, String str) { + sign.setLine(i, str); + sign.update(); + } + + public void startMenu() { + for(int i = 0; i < startMenu.length; i++) + sign.setLine(i, startMenu[i]); + sign.update(); + } + + public void newOwner(String name) { + editLine(2, boldWhite + name); + editLine(3, boldWhite + "Дней: " + cage.getPaid()); + } + + public void downDaysLeft() { + int oldPaid = cage.getPaid(); + cage.setPaid(oldPaid - 1); + editLine(3, boldWhite + "Дней: " + (oldPaid - 1)); + } + + public void upDaysLeft() { + int oldPaid = cage.getPaid(); + cage.setPaid(oldPaid + 1); + editLine(3, boldWhite + "Дней: " + (oldPaid + 1)); + } +} diff --git a/src/main/java/ru/prisonlife/api/template/Cage.java b/src/main/java/ru/prisonlife/api/template/Cage.java new file mode 100644 index 0000000..0ca8638 --- /dev/null +++ b/src/main/java/ru/prisonlife/api/template/Cage.java @@ -0,0 +1,415 @@ +package ru.prisonlife.api.template; + +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import org.bukkit.*; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import ru.prisonlife.api.Configurations; +import ru.prisonlife.api.PrisonAPI; + +import java.io.File; +import java.io.IOException; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.*; + +public class Cage { + + public String name; + public BoardCage boardCage; + private static Map storage = new HashMap<>(); // HOT FIX EBUCHEY INFLYACII PAMYATI! + private FileConfiguration[] configurations = new FileConfiguration[2]; + private File[] modules = new File[2]; + private static final String[] FILES = {"main.yml", "upgrade.yml"}; + private File dir; + private ProtectedRegion region; + + private Cage(String name) { + this.name = name; + dir = new File(Configurations.CAGES.root().getPath(), name); + String[][] inside = {{"WORLD", "OWNER", "PAID", "RENT", "CURRENT_RENT", "SALE_PRICE", "MAXIMUM_TERM", "SPAWN_POINT.WORLD", "SPAWN_POINT.CORDS", "GUESTS"}, + {"FRIENDS", "ENDER_CHEST", "HACK_CHEST", "HACK_DOOR", "NEW_PRICE"}}; + if(!dir.exists()) { + dir.mkdir(); + try { + for(int k = 0; k < 2; k++) { + modules[k] = new File(dir.getPath(), FILES[k]); + configurations[k] = YamlConfiguration.loadConfiguration(modules[k]); + for(int j = 0; j < inside[k].length; j++) + configurations[k].set(inside[k][j], k == 0 ? "-" : false); + configurations[k].save(modules[k]); + } + } catch(IOException z) { + z.printStackTrace(); + } + } + } + + public static void create(String name) { + storage.put(name, new Cage(name)); + } + + public static Cage getExisting(String name) { + return storage.get(name); + } + + public static boolean exists(String name) { + return storage.containsKey(name); + } + + public ProtectedRegion getRegion() { + return region; + } + + public World getWorld() { + return Bukkit.getWorld(configurations[0].getString("WORLD")); + } + + public String getOwner() { + return configurations[0].getString("OWNER"); + } + + public int getPaid() { + return configurations[0].getInt("PAID"); + } + + public int getRentPrice() { + return configurations[0].getInt("CURRENT_RENT"); + } + + public int getDefaultRentPrice() { return configurations[0].getInt("RENT"); } + + public int getSalePrice() { + return configurations[0].getInt("SALE_PRICE"); + } + + public int getMaximumTerm() { + return configurations[0].getInt("MAXIMUM_TERM"); + } + + public String getWorldOfPoint() { + return configurations[0].getString("SPAWN_POINT.WORLD"); + } + + public List getCordsOfPoint() { + return configurations[0].getDoubleList("SPAWN_POINT.CORDS"); + } + + public List getGuests() { + return configurations[0].getStringList("GUESTS"); + } + + public boolean hasUpgradeGuests() { + return configurations[1].getBoolean("FRIENDS"); + } + + public boolean hasUpgradeEnderChest() { return configurations[1].getBoolean("ENDER_CHEST"); } + + public boolean hasUpgradeHackChest() { + return configurations[1].getBoolean("HACK_CHEST"); + } + + public boolean hasUpgradeHackDoor() { + return configurations[1].getBoolean("HACK_DOOR"); + } + + public boolean hasUpgradeNewPrice() { + return configurations[1].getBoolean("NEW_PRICE"); + } + + public void setRegion(ProtectedRegion region) { + this.region = region; + } + + public void setWorld(String name) { + try { + configurations[0].set("WORLD", name); + configurations[0].save(modules[0]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void setOwner(String uuid) { + try { + configurations[0].set("OWNER", uuid); + configurations[0].save(modules[0]); + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("UPDATE player_stats SET HOME_CAGE = ? WHERE UUID = ?")) { + statement.setString(1, name); + statement.setString(2, uuid); + + statement.executeUpdate(); + } + } catch(IOException | SQLException e) { + e.printStackTrace(); + } + } + + public void setPaid(int value) { + try { + configurations[0].set("PAID", value); + configurations[0].save(modules[0]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void setRentPrice(int price) { + try { + configurations[0].set("CURRENT_RENT", price); + configurations[0].save(modules[0]); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void setDefaultRentPrice(int price) { + try { + configurations[0].set("RENT", price); + configurations[0].save(modules[0]); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void setSalePrice(int price) { + try { + configurations[0].set("SALE_PRICE", price); + configurations[0].save(modules[0]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void setMaximumTerm(int term) { + try { + configurations[0].set("MAXIMUM_TERM", term); + configurations[0].save(modules[0]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void setWorldOfPoint(String world) { + try { + configurations[0].set("SPAWN_POINT.WORLD", world); + configurations[0].save(modules[0]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void setCordsOfPoint(List point) { + try { + configurations[0].set("SPAWN_POINT.CORDS", point); + configurations[0].save(modules[0]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void setGuests(List guests) { + try { + configurations[0].set("GUESTS", guests == null ? "-" : guests); + configurations[0].save(modules[0]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void addGuest(String guest) { + try { + List guests = getGuests(); + guests.add(guest); + configurations[0].set("GUESTS", guests); + configurations[0].save(modules[0]); + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("UPDATE player_stats SET HOME_CAGE = ? WHERE UUID = ?")) { + statement.setString(1, name); + statement.setString(2, guest); + + statement.executeUpdate(); + } + } catch(IOException | SQLException e) { + e.printStackTrace(); + } + } + + public void delGuest(String guest) { + List list = getGuests(); + if(list.contains(guest)) { + region.getMembers().removePlayer(guest); + list.remove(guest); + try { + configurations[0].set("GUESTS", list); + configurations[0].save(modules[0]); + __clear__(Bukkit.getOfflinePlayer(UUID.fromString(guest))); + } catch(IOException e) { + e.printStackTrace(); + } + } + } + + public void setUpgradeGuests(boolean status) { + try { + configurations[1].set("FRIENDS", status); + configurations[1].save(modules[1]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void setUpgradeEnderChest(boolean status) { + try { + configurations[1].set("ENDER_CHEST", status); + configurations[1].save(modules[1]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void setUpgradeHackChest(boolean status) { + try { + configurations[1].set("HACK_CHEST", status); + configurations[1].save(modules[1]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void setUpgradeHackDoor(boolean status) { + try { + configurations[1].set("HACK_DOOR", status); + configurations[1].save(modules[1]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void setUpgradeNewPrice(boolean status) { + try { + configurations[1].set("NEW_PRICE", status); + configurations[1].save(modules[1]); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public void rebootUpgrades() { + setUpgradeGuests(false); + setUpgradeEnderChest(false); + setUpgradeHackDoor(false); + setUpgradeHackChest(false); + setUpgradeNewPrice(false); + } + + public void mainInfo(Player whom) { + String owner = getOwner(); + List guests = transformGuestsToOfflinePlayers(getGuests()); + String[] info = { + "Владелец: " + ChatColor.RED + (!owner.equals("-") ? Bukkit.getOfflinePlayer(UUID.fromString(owner)).getName() : "-"), + "Цена покупки на один день: " + ChatColor.YELLOW + "" + ChatColor.BOLD + getRentPrice(), + "Цена продажи: " + ChatColor.YELLOW + "" + ChatColor.BOLD + getSalePrice(), + "Максимальный срок аренды: " + ChatColor.LIGHT_PURPLE + "" + ChatColor.BOLD + getMaximumTerm() + ChatColor.RESET + " дн.", + "Оплачено: " + ChatColor.GREEN + "" + ChatColor.BOLD + getPaid() + ChatColor.RESET + " дн.", + "Гости: " + getGuests() + }; + for(String i : info) { + if(i.equals(info[5])) { + if(guests.size() == 0) + i = "Гости: -"; + else { + StringBuilder iBuilder = new StringBuilder(i); + for(OfflinePlayer j : guests) + iBuilder.append(ChatColor.GOLD).append(j.getName()).append(" "); + i = iBuilder.toString(); + } + } + whom.sendMessage(i + "\n"); + } + } + + public void gradeInfo(Player whom) { + String[] info = { + "<Друзья>: ", "<Эндер-сундук>: ", "<Взлом сундуков>: ", + "<Взлом двери>: ", "<Снижение цены на аренду>: " + }; + boolean[] status = { + hasUpgradeGuests(), hasUpgradeEnderChest(), hasUpgradeHackChest(), + hasUpgradeHackDoor(), hasUpgradeNewPrice() + }; + whom.sendMessage("Улучшения: \n"); + for(int i = 0; i < info.length; i++) + whom.sendMessage(info[i] + (status[i] ? "+" : "-")); + } + + public void teleport(Player player) { + List c = getCordsOfPoint(); + player.teleport(new Location(Bukkit.getWorld(getWorldOfPoint()), c.get(0), c.get(1), c.get(2))); + } + + public void sellCage(Player player, int price) { + try { + Prisoner trader = new Prisoner(Bukkit.getOfflinePlayer(UUID.fromString(getOwner())).getPlayer()), buyer = new Prisoner(player); + buyer.getWallet().deposit(price); + trader.getWallet().addBalance(price); + __rm_guests__(); + __clear__(trader.getPlayer()); + setOwner(player.getUniqueId().toString()); + boardCage.newOwner(player.getName()); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void ownerLeaveCage() { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(getOwner())).getPlayer(); + Prisoner ps = new Prisoner(p); + try { + region.getOwners().removePlayer(p.getUniqueId()); + ps.getWallet().addBalance(getSalePrice()); + __rm_guests__(); + __clear__(p); + setOwner("-"); + setPaid(0); + rebootUpgrades(); + boardCage.startMenu(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public List transformGuestsToOfflinePlayers(List guests) { + List list = new ArrayList<>(); + if(guests != null) { + for(String i : guests) + list.add(Bukkit.getOfflinePlayer(UUID.fromString(i))); + return list; + } else + return null; + } + + private void __clear__(OfflinePlayer player) { + try { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("UPDATE player_stats SET HOME_CAGE = ? WHERE UUID = ?")) { + statement.setString(1, "-"); + statement.setString(2, player.getUniqueId().toString()); + + statement.executeUpdate(); + } + } catch(SQLException e) { + e.printStackTrace(); + } + } + + private void __rm_guests__() { + List guests = transformGuestsToOfflinePlayers(getGuests()); + if(guests != null && guests.size() != 0) { + for(OfflinePlayer g : guests) { + region.getMembers().removePlayer(g.getUniqueId()); + __clear__(g.getPlayer()); + } + setGuests(null); + } + } +} diff --git a/src/main/java/ru/prisonlife/api/template/Faction.java b/src/main/java/ru/prisonlife/api/template/Faction.java index bc4d271..ef1559d 100644 --- a/src/main/java/ru/prisonlife/api/template/Faction.java +++ b/src/main/java/ru/prisonlife/api/template/Faction.java @@ -18,27 +18,25 @@ public class Faction { } public String getType() throws SQLException { - try (PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT FACTION FROM player_stats WHERE UUID = ?")) { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT FACTION FROM player_stats WHERE UUID = ?")) { statement.setString(1, me.getPlayer().getUniqueId().toString()); - try (ResultSet resultSet = statement.executeQuery()) { - if (resultSet.next()) { + try(ResultSet resultSet = statement.executeQuery()) { + if(resultSet.next()) return resultSet.getString(1); - } else { + else return "null"; - } } } } public int getId() throws SQLException { - try (PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT FACTION FROM player_stats WHERE UUID = ?")) { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT FACTION FROM player_stats WHERE UUID = ?")) { statement.setString(1, me.getPlayer().getUniqueId().toString()); - try (ResultSet resultSet = statement.executeQuery()) { - if (resultSet.next()) { + try(ResultSet resultSet = statement.executeQuery()) { + if(resultSet.next()) return PrisonAPI.Factions.valueOf(resultSet.getString(1)).getId(); - } } } @@ -46,15 +44,14 @@ public class Faction { } public int getRangId() throws SQLException { - try (PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT F_RANG FROM player_stats WHERE UUID = ?")) { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT F_RANG FROM player_stats WHERE UUID = ?")) { statement.setString(1, me.getPlayer().getUniqueId().toString()); - try (ResultSet resultSet = statement.executeQuery()) { - if (resultSet.next()) { + try(ResultSet resultSet = statement.executeQuery()) { + if(resultSet.next()) return resultSet.getInt(1); - } else { + else return 0; - } } } } @@ -91,15 +88,13 @@ public class Faction { } public int getRespect() throws SQLException { - try (PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT RESPECT FROM prison4life.player_stats WHERE UUID = ?")) { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT RESPECT FROM prison4life.player_stats WHERE UUID = ?")) { statement.setString(1, me.getPlayer().getUniqueId().toString()); - - try (ResultSet resultSet = statement.executeQuery()) { - if (resultSet.next()) { + try(ResultSet resultSet = statement.executeQuery()) { + if(resultSet.next()) return resultSet.getInt(1); - } else { + else return 0; - } } } } @@ -109,7 +104,7 @@ public class Faction { } public void setRespect(int value) throws SQLException { - try (PreparedStatement statement = PrisonAPI.CONN.prepareStatement("UPDATE player_stats SET RESPECT = ? WHERE UUID = ?")) { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("UPDATE player_stats SET RESPECT = ? WHERE UUID = ?")) { statement.setInt(1, value); statement.setString(2, me.getPlayer().getUniqueId().toString()); @@ -118,15 +113,14 @@ public class Faction { } public int getRespectDailyCooldown() throws SQLException { - try (PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT COOLDOWN FROM daily_respect_task WHERE UUID = ?")) { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT COOLDOWN FROM daily_respect_task WHERE UUID = ?")) { statement.setString(1, me.getPlayer().getUniqueId().toString()); - try (ResultSet resultSet = statement.executeQuery()) { - if (resultSet.next()) { + try(ResultSet resultSet = statement.executeQuery()) { + if(resultSet.next()) return resultSet.getInt(1); - } else { + else return 0; - } } } } diff --git a/src/main/java/ru/prisonlife/api/template/Manager.java b/src/main/java/ru/prisonlife/api/template/Manager.java index 71675f8..3a9aa5a 100644 --- a/src/main/java/ru/prisonlife/api/template/Manager.java +++ b/src/main/java/ru/prisonlife/api/template/Manager.java @@ -18,7 +18,7 @@ public class Manager { private FileConfiguration fileConfiguration; public Manager(String id) { - file = new File(PrisonAPI.PLUGIN_PATH + "/", "PRISON_" + id + ".yml"); + file = new File(PrisonAPI.PLUGIN_MANAGER_PATH + "/", "PRISON_" + id + ".yml"); fileConfiguration = YamlConfiguration.loadConfiguration(file); } @@ -26,6 +26,10 @@ public class Manager { return file.exists(); } + public String getName() { + return file.getName().replace("PRISON_", "").replace(".yml", ""); + } + public String getWorld() { return fileConfiguration.getString("WORLD"); } @@ -55,7 +59,7 @@ public class Manager { } public List getSpawnCords(int faction) { - return fileConfiguration.getIntegerList("FACTIONS." + selectFactType(faction) + ".CORDS"); + return fileConfiguration.getIntegerList("FACTIONS." + PrisonAPI.Factions.valueOf(faction) + ".CORDS"); } public void setSpawnCords(int faction, List data) { @@ -139,26 +143,39 @@ public class Manager { } public List getAllTerrs() { - List terrs = new ArrayList<>(); - for(String t : fileConfiguration.getConfigurationSection("TERRITORIES").getKeys(false)) - terrs.add(t); - return terrs; + try { + List terrs = new ArrayList<>(); + for (String t : fileConfiguration.getConfigurationSection("TERRITORIES").getKeys(false)) + terrs.add(t); + return terrs; + } catch(NullPointerException z) { + return null; + } } public List getCages() { - List cages = new ArrayList<>(); - for(String c : fileConfiguration.getConfigurationSection("CAGES").getKeys(false)) - cages.add(c); - return cages; + try { + List cages = new ArrayList<>(); + for (String c : fileConfiguration.getConfigurationSection("CAGES").getKeys(false)) + cages.add(c); + return cages; + } catch(NullPointerException z) { + return null; + } } public List getPointCage(String cage) { return new ArrayList<>(fileConfiguration.getIntegerList("CAGES." + cage)); } + public Location getLocationCage(String cage) { + List point = getPointCage(cage); + return new Location(Bukkit.getWorld(getWorld()), point.get(0) + 0.5, point.get(1), point.get(2) + 0.5); + } + public void teleportInToCage(Prisoner prs, String cage) { - List data =fileConfiguration.getIntegerList("CAGES." + cage); - Location loc = new Location(Bukkit.getWorld(fileConfiguration.getString("WORLD")), + List data = fileConfiguration.getIntegerList("CAGES." + cage); + Location loc = new Location(Bukkit.getWorld(getWorld()), data.get(0) + 0.5, data.get(1), data.get(2) + 0.5); prs.getPlayer().teleport(loc); } diff --git a/src/main/java/ru/prisonlife/api/template/Policeman.java b/src/main/java/ru/prisonlife/api/template/Policeman.java index 625294f..ad381f5 100644 --- a/src/main/java/ru/prisonlife/api/template/Policeman.java +++ b/src/main/java/ru/prisonlife/api/template/Policeman.java @@ -2,100 +2,103 @@ package ru.prisonlife.api.template; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; +import ru.prisonlife.api.Configurations; import ru.prisonlife.api.PrisonAPI; +import ru.prisonlife.api.storage.RegistrationPrisonerForCage; -import java.io.File; -import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; -public class Policeman extends Prisoner { +public class Policeman extends Prisoner implements Listener { - private Map timeInCage = new HashMap<>(); + private static Map TIME_IN_CAGE = new HashMap<>(), ACTION_BAR = new HashMap<>(); + private static final Plugin API = Bukkit.getPluginManager().getPlugin("PrisonAPI"); public Policeman(Player player) { super(player); } - public void arrestPrisoner(Prisoner prs) throws SQLException { - if(prs.getPlayer().isOnline()) { - Manager mng = new Manager(super.getPrison()); + public boolean arrestPrisoner(Prisoner prs) throws SQLException { + Player p = prs.getPlayer(); + if(p.isOnline()) { + String prison = super.getPrison(), uuid = p.getUniqueId().toString(); + Manager mng = new Manager(prison); List all_cages = mng.getCages(); - PreparedStatement st = PrisonAPI.CONN.prepareStatement("SELECT UUID FROM player_stats WHERE UUID = ?"); - st.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = st.executeQuery()) { - if(!resultSet.next()) { - int su = prs.getSuspect(); - st.close(); - st = PrisonAPI.CONN.prepareStatement( - "INSERT INTO players_in_cages(NAME, UUID, TIME_IN_CAGE, BLOCKS_LEFT) " + - "VALUES (?, ?, ?, ?)"); - st.setString(1, getPlayer().getName()); - st.setString(2, me.getUniqueId().toString()); - st.setInt(3, (su * 6)); - st.setInt(4, (su * 100)); - st.executeUpdate(); - } - } - st.close(); - prs.setSuspect(0); - mng.teleportInToCage(prs, all_cages.get(new Random().nextInt(all_cages.size()))); - FileConfiguration configurationSuspect = YamlConfiguration.loadConfiguration(new File("plugins/PrisonSuspect/", "parameters.yml")); - String actionMessage = ChatColor.translateAlternateColorCodes('&', - configurationSuspect.getString("MESSAGES.ACTION_BAR_PROGRESS")); - BukkitRunnable actionBar = new BukkitRunnable() {//"MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE" - @Override - public void run() { - prs.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(actionMessage)); - } - }; - timeInCage.put(prs, new BukkitRunnable() { - @Override - public void run() { // Future = Пометить, что когда in Cage и вышел, то удалить поток, а если зашёл и in Cage - запустить ~ Optimize - try { - int time = 0; - String uuid = prs.getPlayer().getUniqueId().toString(); - PreparedStatement st = PrisonAPI.CONN.prepareStatement( - "SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?"); - st.setString(1, uuid); - try(ResultSet resultSet = st.executeQuery()) { - if(resultSet.next()) - time = resultSet.getInt(1); - } - if(time == 0) { - prs.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', - configurationSuspect.getString("MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE"))); - actionBar.cancel(); - cancel(); - timeInCage.remove(prs); - st = PrisonAPI.CONN.prepareStatement("DELETE FROM players_in_cages WHERE UUID = ?"); - st.setString(1, uuid); - st.execute(); - } else { - if(prs.getPlayer().isOnline()) { - st = PrisonAPI.CONN.prepareStatement("UPDATE players_in_cages SET TIME_IN_CAGE = " + (time - 1) + " WHERE UUID = ?"); - st.setString(1, uuid); - st.execute(); - } - } - st.close(); - } catch(SQLException e) { - e.printStackTrace(); - } - } - }); - int m = 20 * 60; - actionBar.runTaskTimer(PrisonAPI.plugin, 5, 5); - timeInCage.get(prs).runTaskTimer(PrisonAPI.plugin, m, m); + if(all_cages != null) { + int su = prs.getSuspect(); + String cage = all_cages.get(new Random().nextInt(all_cages.size())); + PrisonAPI.ARRESTED.put(uuid, new RegistrationPrisonerForCage(prison, cage, su * 6, su * 100)); + prs.setSuspect(0); + mng.teleportInToCage(prs, cage); + __put__(prs); + __start__(uuid); + return true; + } else + me.sendMessage(ChatColor.RED + "Произошла аварийная ошибка.\nСообщите администраторам об отсутствии карцеров на сервере!"); + } + return false; + } + + public static void freeFromArrest(Prisoner prs) { + Player p = prs.getPlayer(); + String uuid = p.getUniqueId().toString(); + p.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', + Configurations.SUSPECT.execute().getString("MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE"))); + PrisonAPI.ARRESTED.get(uuid).toFinish(); + ACTION_BAR.get(uuid).cancel(); + TIME_IN_CAGE.get(uuid).cancel(); + ACTION_BAR.remove(uuid); + TIME_IN_CAGE.remove(uuid); + } + + @EventHandler + private void startThreadsForJoinedPlayer(PlayerJoinEvent e) { + Player p = e.getPlayer(); + String uuid = p.getUniqueId().toString(); + if(PrisonAPI.ARRESTED.containsKey(uuid)) { + __put__(new Prisoner(p)); + __start__(uuid); } } + + private void __start__(String uuid) { + ACTION_BAR.get(uuid).runTaskTimer(API, 5, 5); + TIME_IN_CAGE.get(uuid).runTaskTimer(API, 20 * 60, 20 * 60); + } + + private void __put__(Prisoner prs) { + Player p = prs.getPlayer(); + String uuid = p.getUniqueId().toString(); + ACTION_BAR.put(uuid, new BukkitRunnable() { + @Override + public void run() { + if(p.isOnline()) + p.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText( + ChatColor.translateAlternateColorCodes('&', Configurations.SUSPECT.execute().getString( + "MESSAGES.ACTION_BAR_PROGRESS").replace("%time%", String.valueOf( + prs.getTimeLeftInCage())).replace("%blocks%", String.valueOf( + prs.getBlocksLeftToBreak()))))); // prs.getTimeLeftInCage() и prs.getBlocksLeftToBreak() <- статистика оставшегося (реал тайм) + + } + }); + TIME_IN_CAGE.put(uuid, new BukkitRunnable() { + @Override + public void run() { + if(p.isOnline()) + if(PrisonAPI.ARRESTED.get(uuid).time < 2) freeFromArrest(prs); + else --PrisonAPI.ARRESTED.get(uuid).time; + } + }); + } } diff --git a/src/main/java/ru/prisonlife/api/template/Prisoner.java b/src/main/java/ru/prisonlife/api/template/Prisoner.java index 7ba205f..2980fe2 100644 --- a/src/main/java/ru/prisonlife/api/template/Prisoner.java +++ b/src/main/java/ru/prisonlife/api/template/Prisoner.java @@ -14,6 +14,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.UUID; public class Prisoner { @@ -41,7 +42,7 @@ public class Prisoner { public String getPrison() { Location loc = me.getLocation(); - for (File file : Objects.requireNonNull(new File(PrisonAPI.PLUGIN_PATH).listFiles())) { + for(File file : Objects.requireNonNull(new File(PrisonAPI.PLUGIN_MANAGER_PATH).listFiles())) { FileConfiguration fileConfiguration = YamlConfiguration.loadConfiguration(file); List> data = new ArrayList<>(); List fromConfig = fileConfiguration.getIntegerList("DIAGONAL_POINTS"), @@ -49,19 +50,19 @@ public class Prisoner { int[] loc_n = {loc.getBlockX(), loc.getBlockY() - 1, loc.getBlockZ()}; data.add(fromConfig.subList(0, 3)); data.add(fromConfig.subList(3, 6)); - for (int i = 0; i < 3; i++) { + for(int i = 0; i < 3; i++) { min.add(Math.min(data.get(0).get(i), data.get(1).get(i))); max.add(Math.max(data.get(0).get(i), data.get(1).get(i))); } int c = 0; - for (int k : loc_n) { + for(int k : loc_n) { for (int n = 0; n < 3; n++) { if (k >= min.get(n) && k <= max.get(n)) { ++c; } } } - if (c == 3) { + if(c == 3) { return file.getName().replace("PRISON_", "").replace(".yml", ""); } } @@ -72,7 +73,7 @@ public class Prisoner { String prison = getPrison(); if(!prison.equals("Not Prison")) { Location loc = me.getLocation(); - FileConfiguration fileConfiguration = YamlConfiguration.loadConfiguration(new File(PrisonAPI.PLUGIN_PATH, "PRISON_" + prison + ".yml")); + FileConfiguration fileConfiguration = YamlConfiguration.loadConfiguration(new File(PrisonAPI.PLUGIN_MANAGER_PATH, "PRISON_" + prison + ".yml")); try { if(fileConfiguration.getConfigurationSection("TERRITORIES").getKeys(false).size() != 0) { for(String terr : fileConfiguration.getConfigurationSection("TERRITORIES").getKeys(false)) { @@ -107,8 +108,8 @@ public class Prisoner { public void teleportToFactionSpawn() { try { Prisoner ps = new Prisoner(me); - Manager mng = new Manager(getPrison()); - String f = ps.getFaction().getType(); + String prison = getPrison(), f = ps.getFaction().getType(); + Manager mng = prison.equals("Not Prison") ? PrisonAPI.getRandomPrison() : new Manager(prison); List c = mng.getSpawnCords(ps.getFaction().getId()); if(!f.equals("NONE") && c.size() != 0) me.teleport(new Location(Bukkit.getWorld(mng.getWorld()), c.get(0) + 0.5, c.get(1), c.get(2) + 0.5)); @@ -138,7 +139,6 @@ public class Prisoner { try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("UPDATE player_stats SET SUSPECT = ? WHERE UUID = ?")) { statement.setInt(1, value); statement.setString(2, me.getPlayer().getUniqueId().toString()); - statement.executeUpdate(); } } catch(SQLException z) { @@ -148,67 +148,85 @@ public class Prisoner { public void addSuspect(int value) { int su = getSuspect() + value; - setSuspect(su); if(su > 6) setSuspect(su - (su - 6)); + else + setSuspect(su); } - public int getTimeLeftInCage() { - try { - PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?"); - statement.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = statement.executeQuery()) { - if(resultSet.next()) - return resultSet.getInt(1); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return 0; + public void delSuspect(int value) { + int su = getSuspect() - value; + if(su < 0) + setSuspect(0); + else + setSuspect(su); } - public void setTimeLeftInCage(int value) { + public Cage getCage() { try { - PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?"); - statement.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = statement.executeQuery()) { - if(resultSet.next()) { - statement = PrisonAPI.CONN.prepareStatement("UPDATE players_in_cages SET TIME_IN_CAGE = ? WHERE UUID = ?"); - statement.setInt(1, value); - statement.setString(2, me.getUniqueId().toString()); - statement.execute(); + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT HOME_CAGE FROM player_stats WHERE UUID = ?")) { + statement.setString(1, me.getPlayer().getUniqueId().toString()); + + try(ResultSet resultSet = statement.executeQuery()) { + if(resultSet.next()) { + String name = resultSet.getString(1); + if(!name.equals("-")) { + return Cage.getExisting(name); + } + } } } } catch(SQLException z) { z.printStackTrace(); } + + return null; + } + + public void setCage(String name) { + try { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("UPDATE player_stats SET HOME_CAGE = ? WHERE UUID = ?")) { + statement.setString(1, name); + statement.setString(2, me.getPlayer().getUniqueId().toString()); + + statement.execute(); + } + } catch(SQLException z) { + z.printStackTrace(); + } } - public int getBlocksLeftToBreak() { - try { - PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT BLOCKS_LEFT FROM players_in_cages WHERE UUID = ?"); - statement.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = statement.executeQuery()) { - if(resultSet.next()) - return resultSet.getInt(1); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return 0; + public void leaveTheCage() { + Cage cage = getCage(); + if(cage != null) + if(Bukkit.getOfflinePlayer(UUID.fromString(cage.getOwner())).getPlayer().equals(me)) + cage.ownerLeaveCage(); + else + cage.delGuest(me.getUniqueId().toString()); } - public boolean isLocateInCage() { - try { - PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT UUID FROM players_in_cages WHERE UUID = ?"); - statement.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = statement.executeQuery()) { - if(resultSet.next()) - return true; - } - } catch (SQLException e) { - e.printStackTrace(); - } + + public int getTimeLeftInCage() { + return PrisonAPI.ARRESTED.get(me.getUniqueId().toString()).time; + } + + public void setTimeLeftInCage(int value) { + PrisonAPI.ARRESTED.get(me.getUniqueId().toString()).time = value; + } + + public int getBlocksLeftToBreak() { + return PrisonAPI.ARRESTED.get(me.getUniqueId().toString()).blocks; + } + + public void setBlocksLeftToBreak(int value) { + PrisonAPI.ARRESTED.get(me.getUniqueId().toString()).blocks = value; + } + + public boolean isArrested() { + return PrisonAPI.ARRESTED.containsKey(me.getUniqueId().toString()); + } + + public boolean isMemberTrade() { return false; } @@ -233,9 +251,9 @@ public class Prisoner { statement.close(); statement = PrisonAPI.CONN.prepareStatement( - "INSERT INTO player_stats(NAME, UUID, LEVEL, POINTS, FACTION, RESPECT, F_RANG, SUSPECT, WALLET, " + + "INSERT INTO player_stats(NAME, UUID, LEVEL, POINTS, HOME_CAGE, FACTION, RESPECT, F_RANG, SUSPECT, WALLET, " + "G_TIME, D_BLOCKS, K_PLAYERS, K_MOBS, DEATHS) " - + "VALUES (?, ?, 1, 0, 'NONE', 0, 0, 0, 0, 0, 0, 0, 0, 0)"); + + "VALUES (?, ?, 1, 0, '-', 'NONE', 0, 0, 0, 0, 0, 0, 0, 0, 0)"); statement.setString(1, getPlayer().getName()); statement.setString(2, me.getUniqueId().toString()); statement.executeUpdate(); @@ -256,4 +274,14 @@ public class Prisoner { } statement.close(); } + + @Override + public boolean equals(Object obj) { + if(obj == null) return false; + else if(obj instanceof Prisoner) { + Prisoner that = (Prisoner) obj; + return this.me.equals(that.me); + } + return false; + } } \ No newline at end of file diff --git a/src/main/java/ru/prisonlife/api/template/Score.java b/src/main/java/ru/prisonlife/api/template/Score.java index b656e20..59148bd 100644 --- a/src/main/java/ru/prisonlife/api/template/Score.java +++ b/src/main/java/ru/prisonlife/api/template/Score.java @@ -15,11 +15,11 @@ public class Score { } public double getPoints() throws SQLException { - try (PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT POINTS FROM player_stats WHERE UUID = ?")) { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("SELECT POINTS FROM player_stats WHERE UUID = ?")) { statement.setString(1, me.getPlayer().getUniqueId().toString()); try (ResultSet resultSet = statement.executeQuery()) { - if (resultSet.next()) { + if(resultSet.next()) { return resultSet.getDouble(1); } else { return 0d; //TODO нужно или default значение, или exception @@ -29,7 +29,7 @@ public class Score { } public void setPoints(double value) throws SQLException { - try (PreparedStatement statement = PrisonAPI.CONN.prepareStatement("UPDATE player_stats SET POINTS = ? WHERE UUID = ?")) { + try(PreparedStatement statement = PrisonAPI.CONN.prepareStatement("UPDATE player_stats SET POINTS = ? WHERE UUID = ?")) { statement.setDouble(1, value); statement.setString(2, me.getPlayer().getUniqueId().toString()); diff --git a/target/classes/META-INF/MANIFEST.MF b/target/classes/META-INF/MANIFEST.MF deleted file mode 100644 index f2a831e..0000000 --- a/target/classes/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: ru.prisonlife.api.PrisonAPI - diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml deleted file mode 100644 index 870e79e..0000000 --- a/target/classes/plugin.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: PrisonAPI -version: ${project.version} -authors: [Overlord_S, Prot_CN, Wani4ka, DmitriyMX] -main: ru.prisonlife.api.PrisonAPI \ No newline at end of file diff --git a/target/classes/ru/prisonlife/api/PrisonAPI$Factions.class b/target/classes/ru/prisonlife/api/PrisonAPI$Factions.class deleted file mode 100644 index cb49e2cd93280f46899ee47c042d9257e0edb260..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1974 zcma)6T~`}b6y2AZ%na#3OMp;9Xn{gYK#8qXD^MgwprdJm4n<@A8j>MS9VS^}(&Z2E z!9U?zE?<1{p{5F5vaEgfkN6jSs-ANbzADR=Je+gSz31$6&%QhJ=ZoK-0hq;hCsf>t zVj1t~Nat+PuprmX3FIycb0$vIg$4&#}oHSZDu!6b3%v8r#4nF5BR;`v%6? zZyLD5{zC)f>_0Lv!M>p5V*xdn&#ed;t4=ZWD#5ORX$65>TlSsZU6;bE*;+kat$DkZ z!1uP@v{Uuc>oUx&TjPgi^8#ANwlXJ)gCfsZWPj5)c+8 zjc;bM_g5(C+Jm+`JaYUx-zhbjYP(2Xu9RGX^I0!&bM>7qx3=MI`Lv@;wEVWf++_Bl z^TzvR|Tya8g(JXG$8 zR~j+#Ilf@y2y~4Em2jlwZj)Y0qb9ac*aY`&;tEuH6%gB&)6p+E?uYZ&@g=i^`${36(CQ%N>9{EPwYxh z1XE@QO8~f#U@cLs(Fc%}0fAR28Y9oYXaiyo9nYaWrih3jtI4w-%AY~Hl|M^(ToH|_ zQ%@0j4wdsePUXKwJ7zNr*Kva)MtHr2@EuJMp}m!-(6ZCdZYzt!$sdrI9=X6_c;vEm<{36wG6xMFdmIR7R#~=%0>Yo2*Yr zxF(B{7My|GSZo!4E5`-=1E_^qOi}jH`viS5>Q_}6#bq=QiOA@pj0QDLMhO`W>AH-P z#_t59G|*=k)CS^qA=1D_yP!3YunT$vN&5)|kKR;9lqdjVSVhm#aBpKt&X6HWNFS7` K6495J2LA>6E3H-l diff --git a/target/classes/ru/prisonlife/api/PrisonAPI.class b/target/classes/ru/prisonlife/api/PrisonAPI.class deleted file mode 100644 index 1e16459822d35098720a4e1bbae6daf78c2017b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1510 zcma)6U31e$6g_LlmTW6=aGIoqKnkRgK#2lLfjZ$MaXzVH%p~NYFC9fujfhyelFYRI zDg6UH12Zl3fgiw+>h!GS%I;7YUUv81z4zR+=U(ak-+#RWu#9FIRb18ajgD(&EWj*b z1dAH3mr=xx3YM^}mT$|riCa2uSMVL`DrQB)s)jon?h5EzwiA1Sj0B8bDc!K)+fn4w zthB7h+q=ylTWbe90yXQY{oFQvTei*pIP_$DMPRtW#MqYcq3w5F9rpx^9lzW5q`;IF zgl+SvdvfB%X6iIs$sH4i8V{RIf$I+#WPR1~du+@5K{s^VEl+V9 z$%-u~Xr0B$u-E)Km*enHVkZH%fPlWb`0#|0hwkjG<L1WvCTRv)6&a>LCs5#ejes}kUBoD^lj%}YWP(7WQ#D6y#1uV{(AT z^Z*SV`LXqchmN_7$EAb?F!BcFTIDT_9A0BsDJce&tTJkzz8tQg#=XqjQMT;V{nP&d D&(~P- diff --git a/target/classes/ru/prisonlife/api/template/Faction.class b/target/classes/ru/prisonlife/api/template/Faction.class deleted file mode 100644 index 7e8771b53773aa8b61754866baa288d2a12c1840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10378 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 SKB^k{9pK0-@TxPLX8sT7mByO@ diff --git a/target/classes/ru/prisonlife/api/template/Policeman$1.class b/target/classes/ru/prisonlife/api/template/Policeman$1.class deleted file mode 100644 index 8f40390e1d742d4c4e9df5ffa0a2c179a90430e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1488 zcma)6ZBx@g5Pq($#HNv#iim)swqRRcA_}4uP+E0lrXWIxFMhxyJ=#cm=_Dy*f0mBm z%LjjeKgw~Fw&-Z-G&8xoz1w|u_qpBs`Rn@+0E>7Yg^D}=aMvFaDq={gn8I`n_mGMr zjf{#J%&M5fyaHXpeFo)(TgjT^GE5bmx?Xck*Or!fBy?Ugbx%}l7Wag{6YL8o%P{0y zaKkfgxg}hemjy$-@SdM=-Qu#W?|F_X%cR)nRZKTYKBl`O+m>mFDwn>+swquxo#9=o zHZ_1e`#jCH51ePupNiEb`hiVV@R z@OCWT5DvpcDqZ+1dLcd2Yv|2Wx`NS*&ZzL*npw6zTI{tJi7r^lrV>FWr111=>0pT% zlV#CtntX+Ot44>kln-ATp^xDc6cWQ diff --git a/target/classes/ru/prisonlife/api/template/Policeman$2.class b/target/classes/ru/prisonlife/api/template/Policeman$2.class deleted file mode 100644 index 6f76e2287adaee148c04f973fab7fb36a85fe510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3550 zcma)9>sK4c75@zgtq_Y%NK7n0Qnki}hp~v$G%nbVK?qy15Euza96NN8#;|5t$*Wyr z_uaHfn>Kwvll0v*?z?pw6w{v5^iz6H`!Do+KlXD^&Z+yGl?1|24xGcCotb;@+{f?U z8U6jgfBFl64`Q_$-I!7&qexbf=`eaQ6UHo_YQfXE6vi{S+>9%DHiWqrd;~@d=8;n* z-vWuNiYzFysKE^5K3of7DGUqCVb~}rB}Jw4dYIZtCgHT81UCdvDOphr&uO?3#zUA1 z;ieits>sJe__!J`D>f?sL>OK8q=rvv__TnwVpyF;rzCJR<#@58W0nfGWnPsrqiDul zxm>giSH>p&b?FQV>{k-Gf_>Fo@EpT63wFjU6=lv9cqCPD7Gm?>(vs=MHnGI6nwE@> zk;LmIsjgM2GjdALh~X$R>U5NHi!$$7(us}uN~b*AHs&o!xuCmfmO2Lnx^}d?V3|3& zY}iWTlxdsp8G+ZkcPFwVS1lm*=I+YndV&AzU(bv{AYRBzfxRiymT7N!UOHLjyFh!Y zkTa|q!!gyox)@OL5YUshEuFY!luDA*-Fe!1g5ha&Je#yz9o_86l4rRY$)rAzx@N2x zvC?%bHdR|Cd%!i9X^Tkm)AP){GRtSQ40|D#aUIiMAX`I;Dh_R^m~>>(aAZE?5?0I7 zcF7~C=fMq@%*9mVMotzLB)Hp3*4)y#QS=@4ar+q!&ujQB3x#kN2xkhOlamTv0(&NF zDL<~vVf+$y&MK5>&bV|J3waHn)A0gc)G>fZbo8Q6$1(KlIF6W(6ByF)c^zNCOB%kY z<4bs1!*5~)Ny8_g!i6LZP*TzvRkB04rTF&<^L+>}mf&a~%p z#)2$GXU`|564B}DG(c=pyP+2)Aw(L zGP~#$o>Pg|@gw|Lpl3Xh$?(9;aq3RbO->~<6Y0bhjY!WWo=Rrtlp(%J8h)bVr}&wM z*LD0HZ|Jy%U+DNHhIIT2zt->@9lyoz1o}qlPj+`M==i-d^$&QBN!zfplJF7FwDOWw z+&4WrI!ujQ;*m+*6SmV)9k=nOB7bDE?g^N{KK~4bzIt5fcuR$;Yp0e~!$Ic>fg`(U zDgtfy`Xg{){rD}&CF0jN*DFJyb2l~-r-s8Kb8C&2rMh#i*7}Vq&m%h>QDtNiFGzRN z$0IASyQjYIuJO$7rrce?5oR~Cn= z(Wnm)b5?gue9>^@1*^cCKIA%vT~g11Vat_{%@2P^T~oYj9`25B6RoXFgj7k|`Ek0- z4#_NUXBM3e<_tS0Ew*-PgnSW}vN2U0MJ~-dq02tIHpGqmiS5|0nP$1mC7Wn)4=(2YUNfA$pIk zqM^5c6^*@-z$ya0Z=>n9FY_2_kTSq&e2BEe*K+`mJC=~LA!d0P& z_RhgqF;lg%t&1Ox?e~}Qz#Z&cLq`L+5Gdop-ZJ*{Q`|vB@vh-O17?*c2e)`~NMQCB zMiray_F?7CW90oa9(ww1ystf4#`_Nj@@0IW{RltH=-gHZgK|{)8cOw*@$hY?U>sTg zY`Bl%j$^qxt}p@5<0ZVz`7&-m%^}W;IN$P(P^nwNVbWnHZ3OLb ziLs>MgHJlR~&TB|&cv7Qr$dI;hc7cl*?qVN8TX+;7r7pAt?=k>^jeX!f m%)E!QcM(zy=M+f=7_xC5NodkxRuo;nh?D#Z)2wce{QDoTXSg8% diff --git a/target/classes/ru/prisonlife/api/template/Policeman.class b/target/classes/ru/prisonlife/api/template/Policeman.class deleted file mode 100644 index 3ce61e77db3e72b5b540bab609632f756b9e56e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4834 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 diff --git a/target/classes/ru/prisonlife/api/template/Stats.class b/target/classes/ru/prisonlife/api/template/Stats.class deleted file mode 100644 index 6e13690b0513a68da2eb3cdf0b41e63757d0138a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8383 zcmeI0O>k4!703Tqmi+W(AO>SArbK)derM^qytlk%i@wOVs`4BmPNvf87q>qnUY1?idic%vYC}d z&WgMhbF%rCEG}Dd#frCO^Bq~dtKi!Tt_qlDRDnamOx}~u#IvbnBL1f8iKgS8oH~N~xo9p+Z>+k~dNJXeYUwQ(Xg9g3zkr?g02xHQJOb zw(XSZPeiY%84B4cw9=uJ(NQQCN{v%Sp-iDg0lg&+`P67`s$j@yQ=-_mM^gDrOznxw zgR*M@KO)2DL=&z%(SSw;H=KAM9|#;9?)P;L`Q6MGIyNRlo^?n3L+&$ULxGUreahY8 zKG*9X^t*?L13uYR@LeZvVqU>DC%%VU3T``b2j5q4*NGqCo`U;M{188K;zNAo#K-7x z;>Wlyuv0t2L^L_+8JfzZ-ja#q#82>vz>$bQ=k9UDpN+VmY~3$y`J}Cv*RyqYtUuWKhJP?p z*5Tr635hV3viBy)g2IG91;mu}MI#stiss?J>Wu%-16$5!Sb48k36>TF2xCL`k zz09m)E{yWQ$t?%uQ%F9T0@%kV@L|3x@bN2I%GM74n$XOV7PfjgZene3`U0Y<`FAjV z&YlUaEVrS8Wfjb9*{~f)*xRj3!-J#jaUG6PD<5VOXPl!>F~k)L=jMNdifZ#BEGC3R zxW!z5a}kwhv{;&c3)2FWMOXzEU|WQ}0xgSh2%Kwqh)C;0)UxXo_zXQ>bF0g|fNh_l zy*Sq9HM`7VmwCx+q4>Vl;=8<+t*%N<+@_1WEK8rmf_8Kgf>r!Gj`M~3B7MAsG_vfU z$2eraLfiR%SlO=T_)hM47k9Or>uM=gO{rQwQR=j4xGC?zyL=J*niiLNBQEnefmaxn zuTzf?)@2rE1t*09uR>>7x7&MJoZ)YoS}Rvg8UmJOYBk9jYI&7EGc}&#kIxT1)~0`J z9ze9oSZ~*29TcHvbGZ;VFJgy4STLlEctPM347c)ls!cdyVGs|v%nwn=shu+LHQq{> zxfn`)u$jSTz-y^TI~xYOr6{3~)mVOA@qg6iwYV%iYs->XDdV4&{#o^-*8OuSOX1c~ z>yp>@xTp3OmtB|DJ$2cZ@B(@f#sE)w8nei;{*ce=Pg#F~KjP1Ax6_`BAxLQGU@@(;B7k*L&aIquNbJ&?7i5%prPTqmluaXst0w7Xf) z@jWZDd+2nbt<89XGP) zX)ulNsd}tSnO6IpX7cAj+ynRc2?YbVoAk!c-d+G#TF6q$CC zOzR-iPLOG*jjViznATGSPbt&tB-31LndT$Y{F`PP|0^rUv=_H7(|Va*0W$4%GA+p6 zg~+sCGA%@=g^lca8cgHA!R44%|D0)CpK0>FagasF-`dJC?WN~T+xkpPFzaT>v=o_^Cevnl)_LaL z9GNytre(>rJef8}re(>r6q%MM(-LIboRO8!5Yy!AhW62`lxc3sw0&!t_BNUJ&Ze2h z@5|+wwtwp~?JBeD8kzPUnRcDKyFsR1CDU$@Y401^^E8;o5BlYpcHlYFwm#EtGVA8a zv|D7_Z8Gf+&-xyjcAreU! Wv_or|_7R!(@ur#9&yRB^4Ezt+^vc%& diff --git a/target/classes/ru/prisonlife/api/template/Wallet.class b/target/classes/ru/prisonlife/api/template/Wallet.class deleted file mode 100644 index cf5c3ddff3e277bf52204baf66230e1e5779b089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2882 zcmb_eOKcle6g|(G@z~=@+NSxrDaC18>ip_{pn%ghr1>-{j`MNSgm2^6({vKYcI|O# zCAO%Mx@7|r>u!*$B1jbwgjE*okg}v=%L<7F8y1A~W@0Bz(!v5+exLj9yYIYv&w2Jw ze}DS}fLBq{(TLamXuunOyosm}-2q(0B^{U16Tn;O)o}%V0rX=)HiH3N#gJ@h8dAf+=o$V8I#Sph6xP`0nd^ta57dXMe+r!n9F9Yn`R`Lw<5N=l+Pq> zGcxAb%|f?;_o9`x?8^e-@PFFTc3nW}%cXh5ftZyw&b#8 z=UYa_zGW2!T3-}?I+@9sHsSbO$Yw!6pEvC*$xJevV&tlD+pvJYU=~XmJ7L-ab+Luy zon)kVI}@2GTN%J#w0XlNGfS7F+b&}TGoLJ&=|p*zuGO5R7DtkK2dI<1N#YZe!L~Me{w6vMe6)hgB7k9wc6S-0$We!?0I|28W zrzLI!M=))m2|*1r2HwHD0;dxLv4OtH&~$GsHZU0)oERMmv0nGg!VP(;VrY73U}7LN zH8tEHx)kcs@ScJ9@qva94cx%221cDjN<-R!iJKZG4b0<~0SgPflz~NL3@jmQActvz z!%hO3;Q7eptwQc2Su+E9+%|9=tp-_pM&Rt!Sby*2z_UOSgtvu~Kz89WP(aaujaGq{ z7m(1+hQPsX7^8CwW{NpHQYr18x{+j+#Y)`;>MO>?c&t)8hc~QL^IjOP1bW9wWcw?_Ig%2d|6T{4H$%p&7BIV;&# zCL%e--8IizC`UWzUW9rpZ`gS~sW;OuyEKG{_sIbBZQR5#Y8F3{1=NRZ_>0g?G++-ONB~s{kf9!HmTv^ zerc=T!ZMXl^PxZspV3A>(R?=( zwi*gYejLCt&Kg{Ayo?ZM+{Y7wj3uO|xW<^CKe;c!BhP(>s#;|gss}MK(xJ3}4bKX^ ztIz~i;9G^i3LUG^1>z#Abgd#F@ENAMxW(|`g4(r?)}XSECN5PAJVbre8&rbc6&!d7 zziaGRM@#2A8X4!Hbg7GaJIfxftzP}I>VJ$CRfB3&394&RZ6AC-;`8mq7u43`T_as< zQU6|~dS_5~eO;tM{~8Wq2yu)vN2Ug!;&Xh#{t3RvkL*6s`Oh40(C;alc}guK9d&pUA}8AM3r^sqWQRC~ zS8$4~AxpNn6y`bKp>dO!_iAX<(5|6FLnm9(i)}z1W2>uw!Ly0Fe{tF*7u8*1oG3$# zvB}H$b}xbpTj$8lRh4ze*zatsg}!YjUQ{;eDpLbWg}-zBMsUUz1NwMfDX>6$`w9*< z&#s_$TVcAh6mnFwt*$^tT>+fMIfmOA`uy`kr}qhcf}v0D5bldZ^B2)YEhc#rji{HU zgbzCs9ue_QrTP9U>J)UU`)Rpz74-tslw*R@Xynw9