diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5ab06e5..81f6923 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,9 @@ name: Build on: push: - branches: [ master ] + branches: + - master + - develop paths: - '**/*.java' - '**/*.kt' @@ -10,7 +12,9 @@ on: - 'gradle/**' - 'resources/**' pull_request: - branches: [ master ] + branches: + - master + - develop paths: - '**/*.java' - '**/*.kt' @@ -52,14 +56,13 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' run: | wget "https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar" - java -jar BuildTools.jar --rev 1.14.4 + java -jar BuildTools.jar --rev 1.15.2 - - name: Setup ProtocolLib - run: | - wget -O ./libs/ProtocolLib.jar "https://github.com/dmulloy2/ProtocolLib/releases/download/4.6.0/ProtocolLib.jar" + - name: Download ProtocolLib + run: wget -O ./libs/ProtocolLib.jar "https://github.com/dmulloy2/ProtocolLib/releases/download/4.8.0/ProtocolLib.jar" - name: Build with Gradle - run: ./gradlew build + run: ./gradlew shadowJar - name: Upload a Build Artifact uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 diff --git a/build.gradle.kts b/build.gradle.kts index 06616aa..2b3b693 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,6 @@ plugins { `java-library` `maven-publish` - alias(libs.plugins.runPaper) alias(libs.plugins.spotless) alias(libs.plugins.shadow) } @@ -26,16 +25,16 @@ repositories { } dependencies { - compileOnly(libs.spigotApi) compileOnly(libs.spigot) - compileOnly(libs.bukkit) compileOnly(libs.noteblockapi) compileOnly(libs.lunachat) +// compileOnly(libs.protocolLib) compileOnly(files("libs/ProtocolLib.jar")) compileOnly(libs.dadadachecker) compileOnly(libs.blockstudio) compileOnly(libs.paperApi) - implementation(libs.cloudPaper) + implementation(libs.acfPaper) + implementation(libs.jspecify) } // Project Settings @@ -53,14 +52,6 @@ java { } tasks { - runServer { - minecraftVersion("1.14.4") - downloadPlugins { - url("https://github.com/ucchyocean/LunaChat/releases/download/v3.0.16/LunaChat.jar") // LunaChat 3.0.16 - url("https://github.com/koca2000/NoteBlockAPI/releases/download/1.6.3/NoteBlockAPI-1.6.3.jar") // NoteBlockAPI 1.6.3 - url("https://github.com/dmulloy2/ProtocolLib/releases/download/4.6.0/ProtocolLib.jar") // ProtocolLib 4.6.0 - } - } compileJava { options.encoding = defaultEncoding diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b41c773..2fabf8e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,31 +1,25 @@ [versions] -runPaper = "2.3.1" # 3.x.x can't run in Java8 spotless = "6.13.0" # 6.14.0 can't run in Java8 shadow = "8.3.0" -protocolLib = "4.5.0" -paperApi = "1.14.4-R0.1-SNAPSHOT" +paperApi = "1.15.2-R0.1-SNAPSHOT" blockstudio = "-SNAPSHOT" dadadachecker = "1.0.0" noteblockapi = "1.6.3" lunachat = "3.0.16" -bukkit = "1.14.4-R0.1-SNAPSHOT" -spigot = "1.14.4-R0.1-SNAPSHOT" -spigotApi = "1.14.4-R0.1-SNAPSHOT" -cloudPaper = "2.0.0-beta.10" +spigot = "1.15.2-R0.1-SNAPSHOT" +jspecify = "1.0.0" +acfPaper = "0.5.1-SNAPSHOT" [plugins] -runPaper = { id = "xyz.jpenilla.run-paper", version.ref = "runPaper" } spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } [libraries] -protocolLib = { module = "com.comphenix.protocol:ProtocolLib", version.ref = "protocolLib" } paperApi = { module = "com.destroystokyo.paper:paper-api", version.ref = "paperApi" } blockstudio = { module = "com.github.Be4rJP:BlockStudio", version.ref = "blockstudio" } dadadachecker = { module = "com.github.Be4rJP:DADADAChecker", version.ref = "dadadachecker" } noteblockapi = { module = "com.github.koca2000:NoteBlockAPI", version.ref = "noteblockapi" } lunachat = { module = "com.github.ucchyocean:LunaChat", version.ref = "lunachat" } -bukkit = { module = "org.bukkit:bukkit", version.ref = "bukkit" } spigot = { module = "org.spigotmc:spigot", version.ref = "spigot" } -spigotApi = { module = "org.spigotmc:spigot-api", version.ref = "spigotApi" } -cloudPaper = { module = "org.incendo:cloud-paper", version.ref = "cloudPaper" } \ No newline at end of file +jspecify = { module = "org.jspecify:jspecify", version.ref = "jspecify" } +acfPaper = { module = "co.aikar:acf-paper", version.ref = "acfPaper" } diff --git a/libs/.gitignore b/libs/.gitignore index d392f0e..f23b948 100644 --- a/libs/.gitignore +++ b/libs/.gitignore @@ -1 +1 @@ -*.jar +*.jar \ No newline at end of file diff --git a/src/main/java/be4rjp/sclat/Main.java b/src/main/java/be4rjp/sclat/Sclat.java similarity index 87% rename from src/main/java/be4rjp/sclat/Main.java rename to src/main/java/be4rjp/sclat/Sclat.java index 6f03546..c35f4b3 100644 --- a/src/main/java/be4rjp/sclat/Main.java +++ b/src/main/java/be4rjp/sclat/Sclat.java @@ -3,37 +3,44 @@ import be4rjp.blockstudio.BlockStudio; import be4rjp.blockstudio.api.BlockStudioAPI; import be4rjp.dadadachecker.DADADACheckerAPI; -import be4rjp.sclat.api.Sclat; +import be4rjp.sclat.api.Plugins; +import be4rjp.sclat.api.SclatUtil; import be4rjp.sclat.api.ServerType; import be4rjp.sclat.api.async.AsyncPlayerListener; import be4rjp.sclat.api.async.AsyncThreadManager; +import be4rjp.sclat.api.color.TeamColorSets; import be4rjp.sclat.api.config.CustomConfig; -import be4rjp.sclat.commands.sclatCommandExecutor; +import be4rjp.sclat.api.enchant.GlowEnchant; +import be4rjp.sclat.api.equipment.EquipmentServer; +import be4rjp.sclat.api.holo.PlayerHolograms; +import be4rjp.sclat.api.rank.RankingUpdater; +import be4rjp.sclat.api.status.StatusServer; +import be4rjp.sclat.api.wiremesh.Wiremesh; +import be4rjp.sclat.commands.SclatCommand; import be4rjp.sclat.config.Config; import be4rjp.sclat.data.DataMgr; import be4rjp.sclat.data.MapData; import be4rjp.sclat.data.Match; import be4rjp.sclat.data.PaintData; -import be4rjp.sclat.data.Wiremesh; import be4rjp.sclat.gui.ClickListener; import be4rjp.sclat.listener.SquidListener; import be4rjp.sclat.lunachat.LunaChatListener; import be4rjp.sclat.manager.ArmorStandMgr; -import be4rjp.sclat.manager.ColorMgr; import be4rjp.sclat.manager.GameMgr; import be4rjp.sclat.manager.MainWeaponMgr; import be4rjp.sclat.manager.MapDataMgr; import be4rjp.sclat.manager.MatchMgr; import be4rjp.sclat.manager.NoteBlockAPIMgr; import be4rjp.sclat.manager.PlayerReturnManager; -import be4rjp.sclat.manager.RankMgr; import be4rjp.sclat.manager.ServerStatusManager; import be4rjp.sclat.manager.WeaponClassMgr; import be4rjp.sclat.protocollib.SclatPacketListener; -import be4rjp.sclat.server.EquipmentServer; -import be4rjp.sclat.server.StatusServer; import be4rjp.sclat.tutorial.Tutorial; -import be4rjp.sclat.weapon.SnowballListener; +import be4rjp.sclat.weapon.listener.MainWeapon; +import be4rjp.sclat.weapon.listener.SPWeapon; +import be4rjp.sclat.weapon.listener.SnowballListener; +import be4rjp.sclat.weapon.listener.SubWeapon; +import co.aikar.commands.PaperCommandManager; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import com.google.common.io.ByteArrayDataInput; @@ -50,6 +57,8 @@ import org.bukkit.scoreboard.NameTagVisibility; import org.bukkit.scoreboard.Scoreboard; import org.bukkit.scoreboard.ScoreboardManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; @@ -58,15 +67,16 @@ * * @author Be4rJP */ -public class Main extends JavaPlugin implements PluginMessageListener { +public class Sclat extends JavaPlugin implements PluginMessageListener { + public static final Logger logger = LoggerFactory.getLogger(Sclat.class); public static Config conf; - private static Main plugin; + private static Sclat plugin; public static Location lobby; - public static Glow glow; + public static GlowEnchant glowEnchant; public static List pdspList; @@ -90,10 +100,6 @@ public class Main extends JavaPlugin implements PluginMessageListener { // EquipmentShare public static EquipmentServer es = null; - // API - public static boolean NoteBlockAPI = true; - public static boolean LunaChat = true; - // 重複しない数字 // ボム等で使用 private static int NDNumber = 0; @@ -111,10 +117,14 @@ public class Main extends JavaPlugin implements PluginMessageListener { public static double PARTICLE_RENDER_DISTANCE = 0; public static double PARTICLE_RENDER_DISTANCE_SQUARED; + public static final PlayerHolograms playerHolograms = new PlayerHolograms(); + + private static PaperCommandManager commandManager; + @Override public void onEnable() { plugin = this; - glow = new Glow(); + glowEnchant = new GlowEnchant(); pdspList = new ArrayList<>(); @@ -122,35 +132,14 @@ public void onEnable() { AsyncThreadManager.setup(1); // ----------------------------APICheck------------------------------- - NoteBlockAPI = true; - if (!Bukkit.getPluginManager().isPluginEnabled("NoteBlockAPI")) { - getLogger().severe("*** NoteBlockAPI is not installed or not enabled. ***"); - NoteBlockAPI = false; + if (!Plugins.onInit(logger)) return; - } + logger.info("API check was complted."); - // LunaChat - if (!Bukkit.getPluginManager().isPluginEnabled("LunaChat")) { - getLogger().severe("*** LunaChat is not installed or not enabled. ***"); - LunaChat = false; - } + protocolManager = ProtocolLibrary.getProtocolManager(); + SclatPacketListener.init(); - // ProtocolLib - if (!Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) { - getLogger().severe("*** ProtocolLib is not installed or not enabled. ***"); - return; - } else { - protocolManager = ProtocolLibrary.getProtocolManager(); - new SclatPacketListener(); - } - - // DADADAChecker - if (!Bukkit.getPluginManager().isPluginEnabled("DADADAChecker")) { - getLogger().severe("*** DADADAChecker is not installed or not enabled. ***"); - return; - } else { - dadadaCheckerAPI = new DADADACheckerAPI(this); - } + dadadaCheckerAPI = new DADADACheckerAPI(this); // ------------------------------------------------------------------- // --------------------------Load config------------------------------ @@ -190,25 +179,26 @@ public void onEnable() { pm.registerEvents(new GameMgr(), this); pm.registerEvents(new SquidListener(), this); pm.registerEvents(new ClickListener(), this); - pm.registerEvents(new be4rjp.sclat.weapon.MainWeapon(), this); - pm.registerEvents(new be4rjp.sclat.weapon.SubWeapon(), this); - pm.registerEvents(new be4rjp.sclat.weapon.SPWeapon(), this); + pm.registerEvents(new MainWeapon(), this); + pm.registerEvents(new SubWeapon(), this); + pm.registerEvents(new SPWeapon(), this); pm.registerEvents(new SnowballListener(), this); pm.registerEvents(new AsyncPlayerListener(), this); - if (LunaChat) + if (Plugins.LUNACHAT.isLoaded()) pm.registerEvents(new LunaChatListener(), this); // ------------------------------------------------------------------- // ------------------------RegisteringCommands------------------------ getLogger().info("Registering Commands..."); - getCommand("sclat").setExecutor(new sclatCommandExecutor()); - getCommand("sclat").setTabCompleter(new sclatCommandExecutor()); + commandManager = new PaperCommandManager(this); + // commandManager.enableUnstableAPI("help"); + commandManager.registerCommand(new SclatCommand(this), true); // ------------------------------------------------------------------- // ------------------------Setup from config-------------------------- getLogger().info("SetupColor..."); - ColorMgr.SetupColor(); + TeamColorSets.SetupColor(); getLogger().info("SetupMainWeapon..."); MainWeaponMgr.SetupMainWeapon(); getLogger().info("WeaponClassSetup..."); @@ -277,7 +267,7 @@ public void onEnable() { // ------------------------------------------------------------------- // ------------------------Load NBS songs----------------------------- - if (NoteBlockAPI) + if (Plugins.NOTEBLOCKAPI.isLoaded()) NoteBlockAPIMgr.LoadSongFiles(); // ------------------------------------------------------------------- @@ -324,7 +314,7 @@ public void onEnable() { // --------------------Send restarted server info--------------------- if (conf.getConfig().contains("RestartMatchCount")) - Sclat.sendRestartedServerInfo(); + SclatUtil.sendRestartedServerInfo(); // ------------------------------------------------------------------- // -----------------------------Shop---------------------------------- @@ -350,7 +340,7 @@ public void onEnable() { // -----------------------Ranking Holograms--------------------------- if (type == ServerType.LOBBY) { - RankMgr.makeRankingTask(); + RankingUpdater.makeRankingTask(); } // ------------------------------------------------------------------- @@ -369,7 +359,7 @@ public void onEnable() { // ------------------------------------------------------------------- // ------------------------Tutorial wire mesh------------------------- - if (Main.tutorial) { + if (Sclat.tutorial) { for (MapData mData : DataMgr.maplist) { for (Wiremesh wiremesh : mData.getWiremeshListTask().getWiremeshsList()) { wiremesh.startTask(); @@ -406,6 +396,8 @@ public void onDisable() { e.printStackTrace(); } + commandManager.unregisterCommands(); + // -----------------------Tutorial server list------------------------ if (type == ServerType.LOBBY) { tutorialServers = new CustomConfig(this, "tutorial.yml"); @@ -442,7 +434,7 @@ public void onDisable() { as.remove(); // Worldが保存される前にアンロードして塗られた状態で保存されるのを防ぐ - if (Main.type == ServerType.LOBBY) { + if (Sclat.type == ServerType.LOBBY) { for (String mapname : conf.getMapConfig().getConfigurationSection("Maps").getKeys(false)) { String worldName = conf.getMapConfig().getString("Maps." + mapname + ".WorldName"); Bukkit.unloadWorld(worldName, false); @@ -454,7 +446,7 @@ public void onDisable() { } } - public static Main getPlugin() { + public static Sclat getPlugin() { return plugin; } diff --git a/src/main/java/be4rjp/sclat/Animation.java b/src/main/java/be4rjp/sclat/api/Animation.java similarity index 92% rename from src/main/java/be4rjp/sclat/Animation.java rename to src/main/java/be4rjp/sclat/api/Animation.java index 40a7471..8714960 100644 --- a/src/main/java/be4rjp/sclat/Animation.java +++ b/src/main/java/be4rjp/sclat/api/Animation.java @@ -1,11 +1,9 @@ -package be4rjp.sclat; +package be4rjp.sclat.api; -import be4rjp.sclat.api.GaugeAPI; -import be4rjp.sclat.api.Sclat; -import be4rjp.sclat.api.SoundType; +import be4rjp.sclat.Sclat; +import be4rjp.sclat.api.team.Team; import be4rjp.sclat.data.DataMgr; -import be4rjp.sclat.data.Team; import org.bukkit.ChatColor; import org.bukkit.Sound; import org.bukkit.entity.Player; @@ -61,13 +59,13 @@ public void run() { } if (i == 40) { if (winteam == DataMgr.getPlayerData(player).getTeam()) - Sclat.playGameSound(player, SoundType.CONGRATULATIONS); + SclatUtil.playGameSound(player, SoundType.CONGRATULATIONS); cancel(); } i++; } }; - task.runTaskTimer(Main.getPlugin(), 0, 2); + task.runTaskTimer(Sclat.getPlugin(), 0, 2); } public static void AreaResultAnimation(Player p, int team0point, int team1point, String team0color, @@ -103,13 +101,13 @@ public void run() { } if (i == 40) { if (winteam == DataMgr.getPlayerData(player).getTeam()) - Sclat.playGameSound(player, SoundType.CONGRATULATIONS); + SclatUtil.playGameSound(player, SoundType.CONGRATULATIONS); cancel(); } i++; } }; - task.runTaskTimer(Main.getPlugin(), 0, 2); + task.runTaskTimer(Sclat.getPlugin(), 0, 2); } public static void TDMResultAnimation(Player p, int team0point, int team1point, String team0color, @@ -173,12 +171,12 @@ public void run() { } if (i == 40) { if (winteam == DataMgr.getPlayerData(player).getTeam()) - Sclat.playGameSound(player, SoundType.CONGRATULATIONS); + SclatUtil.playGameSound(player, SoundType.CONGRATULATIONS); cancel(); } i++; } }; - task.runTaskTimer(Main.getPlugin(), 0, 2); + task.runTaskTimer(Sclat.getPlugin(), 0, 2); } } diff --git a/src/main/java/be4rjp/sclat/manager/BungeeCordMgr.java b/src/main/java/be4rjp/sclat/api/BungeeCordAPI.java similarity index 67% rename from src/main/java/be4rjp/sclat/manager/BungeeCordMgr.java rename to src/main/java/be4rjp/sclat/api/BungeeCordAPI.java index e75e6ea..4b49350 100644 --- a/src/main/java/be4rjp/sclat/manager/BungeeCordMgr.java +++ b/src/main/java/be4rjp/sclat/api/BungeeCordAPI.java @@ -1,7 +1,7 @@ -package be4rjp.sclat.manager; +package be4rjp.sclat.api; -import be4rjp.sclat.Main; +import be4rjp.sclat.Sclat; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import org.bukkit.entity.Player; @@ -10,11 +10,11 @@ * * @author Be4rJP */ -public class BungeeCordMgr { +public class BungeeCordAPI { public static void PlayerSendServer(Player player, String servername) { ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeUTF("Connect"); out.writeUTF(servername); - player.sendPluginMessage(Main.getPlugin(), "BungeeCord", out.toByteArray()); + player.sendPluginMessage(Sclat.getPlugin(), "BungeeCord", out.toByteArray()); } } diff --git a/src/main/java/be4rjp/sclat/api/GlowingAPI.java b/src/main/java/be4rjp/sclat/api/GlowingAPI.java index 0b6647c..99a301e 100644 --- a/src/main/java/be4rjp/sclat/api/GlowingAPI.java +++ b/src/main/java/be4rjp/sclat/api/GlowingAPI.java @@ -1,6 +1,6 @@ package be4rjp.sclat.api; -import be4rjp.sclat.Main; +import be4rjp.sclat.Sclat; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.WrappedDataWatcher; @@ -11,7 +11,7 @@ public class GlowingAPI { public static void setGlowing(Entity entity, Player player, boolean flag) { - PacketContainer packet = Main.protocolManager.createPacket(PacketType.Play.Server.ENTITY_METADATA); + PacketContainer packet = Sclat.protocolManager.createPacket(PacketType.Play.Server.ENTITY_METADATA); packet.getIntegers().write(0, entity.getEntityId()); WrappedDataWatcher watcher = new WrappedDataWatcher(); WrappedDataWatcher.Serializer serializer = WrappedDataWatcher.Registry.get(Byte.class); @@ -19,7 +19,7 @@ public static void setGlowing(Entity entity, Player player, boolean flag) { watcher.setObject(0, serializer, (byte) (flag ? 0x40 : 0)); packet.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects()); try { - Main.protocolManager.sendServerPacket(player, packet); + Sclat.protocolManager.sendServerPacket(player, packet); } catch (InvocationTargetException e) { e.printStackTrace(); } diff --git a/src/main/java/be4rjp/sclat/api/IOwnable.java b/src/main/java/be4rjp/sclat/api/IOwnable.java new file mode 100644 index 0000000..827d3a1 --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/IOwnable.java @@ -0,0 +1,7 @@ +package be4rjp.sclat.api; + +import org.bukkit.entity.Player; + +public interface IOwnable { + Player getOwner(); +} diff --git a/src/main/java/be4rjp/sclat/api/Plugins.java b/src/main/java/be4rjp/sclat/api/Plugins.java new file mode 100644 index 0000000..a877d2e --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/Plugins.java @@ -0,0 +1,62 @@ +package be4rjp.sclat.api; + +import org.bukkit.Bukkit; +import org.slf4j.Logger; + +import java.util.ArrayList; + +public enum Plugins { + DADADACHECKER("DADADAChecker"), LUNACHAT("LunaChat", + false), NOTEBLOCKAPI("NoteBlockAPI"), PROTOCOLLIB("ProtocolLib"); + + public final String pluginName; + public final boolean isRequired; + private Boolean _isLoaded = null; + Plugins(String pluginName) { + this(pluginName, true); + } + Plugins(String pluginName, boolean isRequired) { + this.pluginName = pluginName; + this.isRequired = isRequired; + } + + public boolean isLoaded() { + if (_isLoaded == null) { + _isLoaded = Bukkit.getPluginManager().isPluginEnabled(pluginName); + } + return _isLoaded; + } + + /** + * To support plugman load. + */ + private void resetLoadedState() { + _isLoaded = null; + } + + /** + * Initialize check + * + * @return is init-check succeeded + */ + public static boolean onInit(Logger logger) { + ArrayList missingPlugins = new ArrayList<>(); + for (Plugins plugin : Plugins.values()) { + plugin.resetLoadedState(); + if (!plugin.isLoaded() && plugin.isRequired) { + missingPlugins.add(plugin.pluginName); + } + } + + // If some required plugins are missing + if (!missingPlugins.isEmpty()) { + logger.error("Some plugins are missing. Please install or enable."); + logger.error("*** Missing required plugins ***"); + missingPlugins.forEach(p -> logger.error("- {}", p)); + logger.error("********************************"); + return false; + } + + return true; + } +} diff --git a/src/main/java/be4rjp/sclat/api/Sclat.java b/src/main/java/be4rjp/sclat/api/SclatUtil.java similarity index 64% rename from src/main/java/be4rjp/sclat/api/Sclat.java rename to src/main/java/be4rjp/sclat/api/SclatUtil.java index 83636c9..58c754f 100644 --- a/src/main/java/be4rjp/sclat/api/Sclat.java +++ b/src/main/java/be4rjp/sclat/api/SclatUtil.java @@ -1,33 +1,19 @@ package be4rjp.sclat.api; -import be4rjp.sclat.Main; +import be4rjp.sclat.Sclat; +import be4rjp.sclat.api.packet.WorldPackets; +import be4rjp.sclat.api.player.PlayerData; +import be4rjp.sclat.api.status.StatusClient; +import be4rjp.sclat.api.team.Team; import be4rjp.sclat.data.DataMgr; -import be4rjp.sclat.data.PlayerData; -import be4rjp.sclat.data.Team; -import be4rjp.sclat.manager.BungeeCordMgr; import be4rjp.sclat.manager.DeathMgr; import be4rjp.sclat.manager.MatchMgr; -import be4rjp.sclat.server.StatusClient; -import net.minecraft.server.v1_14_R1.Block; -import net.minecraft.server.v1_14_R1.BlockPosition; -import net.minecraft.server.v1_14_R1.EntityPlayer; -import net.minecraft.server.v1_14_R1.IBlockAccess; -import net.minecraft.server.v1_14_R1.IBlockData; -import net.minecraft.server.v1_14_R1.PacketPlayOutAbilities; -import net.minecraft.server.v1_14_R1.PacketPlayOutBlockChange; -import net.minecraft.server.v1_14_R1.PacketPlayOutNamedEntitySpawn; -import net.minecraft.server.v1_14_R1.PacketPlayOutWorldBorder; -import net.minecraft.server.v1_14_R1.PlayerAbilities; -import net.minecraft.server.v1_14_R1.WorldBorder; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Instrument; import org.bukkit.Location; import org.bukkit.Note; import org.bukkit.Sound; -import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; @@ -36,7 +22,7 @@ import java.util.ArrayList; import java.util.List; -import static be4rjp.sclat.Main.conf; +import static be4rjp.sclat.Sclat.conf; /** * @@ -46,77 +32,31 @@ * */ -public class Sclat { +public class SclatUtil { public static void setBlockByNMS(org.bukkit.block.Block b, org.bukkit.Material material, boolean applyPhysics) { - Location loc = b.getLocation(); - Block block = ((CraftBlockData) Bukkit.createBlockData(material)).getState().getBlock(); - net.minecraft.server.v1_14_R1.World nmsWorld = ((CraftWorld) loc.getWorld()).getHandle(); - BlockPosition bp = new BlockPosition(loc.getX(), loc.getY(), loc.getZ()); - IBlockData ibd = block.getBlockData(); - nmsWorld.setTypeAndData(bp, ibd, applyPhysics ? 3 : 2); + b.setType(material, applyPhysics); } public static void setBlockByNMSChunk(org.bukkit.block.Block b, org.bukkit.Material material, boolean applyPhysics) { - Location loc = b.getLocation(); - int x = loc.getBlockX(); - int y = loc.getBlockY(); - int z = loc.getBlockZ(); - Block block = ((CraftBlockData) Bukkit.createBlockData(material)).getState().getBlock(); - net.minecraft.server.v1_14_R1.World nmsWorld = ((CraftWorld) loc.getWorld()).getHandle(); - net.minecraft.server.v1_14_R1.Chunk nmsChunk = nmsWorld.getChunkAt(x >> 4, z >> 4); - BlockPosition bp = new BlockPosition(x, y, z); - IBlockData ibd = block.getBlockData(); - nmsChunk.setType(bp, ibd, applyPhysics); + b.setBlockData(material.createBlockData(), applyPhysics); } public static void sendBlockChangeForAllPlayer(org.bukkit.block.Block b, org.bukkit.Material material) { - Location loc = b.getLocation(); - int x = loc.getBlockX(); - int y = loc.getBlockY(); - int z = loc.getBlockZ(); - BlockPosition bp = new BlockPosition(x, y, z); - net.minecraft.server.v1_14_R1.World nmsWorld = ((CraftWorld) loc.getWorld()).getHandle(); - net.minecraft.server.v1_14_R1.Chunk nmsChunk = nmsWorld.getChunkAt(x >> 4, z >> 4); - Block block = ((CraftBlockData) Bukkit.createBlockData(material)).getState().getBlock(); - IBlockAccess iba = (IBlockAccess) nmsWorld; - PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(iba, bp); - for (Player target : Main.getPlugin().getServer().getOnlinePlayers()) { - if (target.getWorld() == b.getWorld()) { - ((CraftPlayer) target).getHandle().playerConnection.sendPacket(packet); - } - } + WorldPackets.broadcastBlockChange(b.getLocation(), material); } public static void sendWorldBorderWarningPacket(Player player) { - EntityPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); - net.minecraft.server.v1_14_R1.WorldBorder wb = new WorldBorder(); - wb.world = nmsPlayer.getWorldServer(); - wb.setSize(1); - wb.setCenter(player.getLocation().getX() + 10_000, player.getLocation().getZ() + 10_000); - PacketPlayOutWorldBorder packet = new PacketPlayOutWorldBorder(wb, - PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE); - ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); + WorldPackets.sendWorldBorderWarningPacket(player); } public static void sendWorldBorderWarningClearPacket(Player player) { - EntityPlayer nmsPlayer = ((CraftPlayer) player).getHandle(); - net.minecraft.server.v1_14_R1.WorldBorder wb = new WorldBorder(); - wb.world = nmsPlayer.getWorldServer(); - wb.setSize(30_000_000); - wb.setCenter(player.getLocation().getX(), player.getLocation().getZ()); - PacketPlayOutWorldBorder packet = new PacketPlayOutWorldBorder(wb, - PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE); - ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); + WorldPackets.sendWorldBorderWarningClearPacket(player); } public static void setPlayerFOV(Player player, float fov) { - PlayerAbilities abilities = new PlayerAbilities(); - abilities.walkSpeed = fov; - DataMgr.getPlayerData(player).setFov(fov); - PacketPlayOutAbilities packet = new PacketPlayOutAbilities(abilities); - ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); + WorldPackets.setPlayerFOV(player, fov); } /* @@ -125,8 +65,8 @@ public static void setPlayerFOV(Player player, float fov) { * b.getLocation(); Block block = ((CraftBlockData) * Bukkit.createBlockData(material)).getState().getBlock(); int x = * loc.getBlockX(); int y = loc.getBlockY(); int z = loc.getBlockZ(); - * net.minecraft.server.v1_14_R1.World nmsWorld = ((CraftWorld) - * loc.getWorld()).getHandle(); net.minecraft.server.v1_14_R1.Chunk nmsChunk = + * net.minecraft.server.v1_15_R1.World nmsWorld = ((CraftWorld) + * loc.getWorld()).getHandle(); net.minecraft.server.v1_15_R1.Chunk nmsChunk = * nmsWorld.getChunkAt(x >> 4, z >> 4); ChunkSection cs = * nmsChunk.getSections()[y >> 4]; IBlockData ibd = block.getBlockData(); if (cs * == nmsChunk.a()) { cs = new ChunkSection(y >> 4 << 4, false); @@ -143,8 +83,8 @@ public static void restartServer() { conf.getConfig().getInt("StatusShare.Port"), commands); sc.startClient(); - for (Player player : Main.getPlugin().getServer().getOnlinePlayers()) { - BungeeCordMgr.PlayerSendServer(player, "sclat"); + for (Player player : Sclat.getPlugin().getServer().getOnlinePlayers()) { + BungeeCordAPI.PlayerSendServer(player, "sclat"); DataMgr.getPlayerData(player).setServerName("Sclat"); } BukkitRunnable task = new BukkitRunnable() { @@ -153,7 +93,7 @@ public void run() { Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "restart"); } }; - task.runTaskLater(Main.getPlugin(), 100); + task.runTaskLater(Sclat.getPlugin(), 100); } public static void sendRestartedServerInfo() { @@ -167,20 +107,6 @@ public static void sendRestartedServerInfo() { sc.startClient(); } - public static void setPlayerPrefix(Player player, String prefix) { - String name = prefix + player.getDisplayName(); - CraftPlayer cp = (CraftPlayer) player; - EntityPlayer ep = cp.getHandle(); - String origName = ep.getName(); - for (Player target : Main.getPlugin().getServer().getOnlinePlayers()) { - if (player != target) { - CraftPlayer ct = (CraftPlayer) player; - ct.getHandle().playerConnection.sendPacket(new PacketPlayOutNamedEntitySpawn(ep)); - } - } - - } - public static void sendMessage(String message, MessageType type) { String sclat = "[§bSclat§r] "; StringBuilder buff = new StringBuilder(); @@ -188,17 +114,17 @@ public static void sendMessage(String message, MessageType type) { buff.append(message); switch (type) { case ALL_PLAYER : { - for (Player player : Main.getPlugin().getServer().getOnlinePlayers()) { + for (Player player : Sclat.getPlugin().getServer().getOnlinePlayers()) { player.sendMessage(buff.toString()); } break; } case CONSOLE : { - Main.getPlugin().getServer().getLogger().info(buff.toString()); + Sclat.getPlugin().getServer().getLogger().info(buff.toString()); break; } case BROADCAST : { - Main.getPlugin().getServer().broadcastMessage(buff.toString()); + Sclat.getPlugin().getServer().broadcastMessage(buff.toString()); break; } } @@ -210,7 +136,7 @@ public static void sendMessage(String message, MessageType type, Team team) { buff.append(sclat); buff.append(message); if (type == MessageType.TEAM) { - for (Player player : Main.getPlugin().getServer().getOnlinePlayers()) { + for (Player player : Sclat.getPlugin().getServer().getOnlinePlayers()) { Team playerTeam = DataMgr.getPlayerData(player).getTeam(); if (playerTeam == null) continue; @@ -252,24 +178,24 @@ public static void sendSclatLobby(Player player) { @Override public void run() { try { - BungeeCordMgr.PlayerSendServer(player, "sclat"); + BungeeCordAPI.PlayerSendServer(player, "sclat"); DataMgr.getPlayerData(player).setServerName("Sclat"); } catch (Exception e) { } } }; - send.runTaskLater(Main.getPlugin(), 20); + send.runTaskLater(Sclat.getPlugin(), 20); } public static void createInkExplosionEffect(Location center, double radius, int accuracy, Player player) { List s_locs = Sphere.getSphere(center, radius - 0.5, accuracy); org.bukkit.block.data.BlockData bd = DataMgr.getPlayerData(player).getTeam().getTeamColor().getWool() .createBlockData(); - for (Player o_player : Main.getPlugin().getServer().getOnlinePlayers()) { + for (Player o_player : Sclat.getPlugin().getServer().getOnlinePlayers()) { if (DataMgr.getPlayerData(o_player).getSettings().ShowEffect_BombEx()) { for (Location loc : s_locs) { if (o_player.getWorld() == loc.getWorld()) { - if (o_player.getLocation().distanceSquared(loc) < Main.PARTICLE_RENDER_DISTANCE_SQUARED) { + if (o_player.getLocation().distanceSquared(loc) < Sclat.PARTICLE_RENDER_DISTANCE_SQUARED) { o_player.spawnParticle(org.bukkit.Particle.BLOCK_DUST, loc, 0, loc.getX() - center.getX(), loc.getY() - center.getY(), loc.getZ() - center.getZ(), 1, bd); } @@ -280,7 +206,7 @@ public static void createInkExplosionEffect(Location center, double radius, int } public static void repelBarrier(Location center, double radius, Player shooter) { - for (Player player : Main.getPlugin().getServer().getOnlinePlayers()) { + for (Player player : Sclat.getPlugin().getServer().getOnlinePlayers()) { PlayerData playerData = DataMgr.getPlayerData(player); if (player.getWorld() != center.getWorld()) diff --git a/src/main/java/be4rjp/sclat/api/SimpleRunnable.java b/src/main/java/be4rjp/sclat/api/SimpleRunnable.java new file mode 100644 index 0000000..8b7ee83 --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/SimpleRunnable.java @@ -0,0 +1,26 @@ +package be4rjp.sclat.api; + +import be4rjp.sclat.Sclat; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.util.function.Consumer; + +public class SimpleRunnable { + public static BukkitRunnable from(Consumer action) { + return new BukkitRunnable() { + @Override + public void run() { + action.accept(this::cancel); + } + }; + } + + public static BukkitTask runTaskLater(Consumer action, long delay) { + return from(action).runTaskLater(Sclat.getPlugin(), delay); + } + + public static BukkitTask runTaskTimer(Consumer action, long delay, long period) { + return from(action).runTaskTimer(Sclat.getPlugin(), delay, period); + } +} diff --git a/src/main/java/be4rjp/sclat/api/Sphere.java b/src/main/java/be4rjp/sclat/api/Sphere.java index ca196cb..f0c6fc3 100644 --- a/src/main/java/be4rjp/sclat/api/Sphere.java +++ b/src/main/java/be4rjp/sclat/api/Sphere.java @@ -13,7 +13,7 @@ public class Sphere { public static List getSphere(Location baseLoc, double r, int accuracy) { - List tempList = new ArrayList(); + List tempList = new ArrayList<>(); int count = 0; for (int i = 0; i < 180; i += accuracy) { for (int t = 0; t < 360; t += accuracy) { @@ -33,7 +33,7 @@ public static List getSphere(Location baseLoc, double r, int accuracy) } public static List getXZCircle(Location baseLoc, double r, double r_accuracy, int accuracy) { - List tempList = new ArrayList(); + List tempList = new ArrayList<>(); for (int tr = 1; tr <= r; tr += r_accuracy) { for (int t = 0; t < 360; t += accuracy / tr) { double x = tr * Math.sin(Math.toRadians(t)); diff --git a/src/main/java/be4rjp/sclat/api/async/AsyncTask.java b/src/main/java/be4rjp/sclat/api/async/AsyncTask.java index 1e3a243..168d851 100644 --- a/src/main/java/be4rjp/sclat/api/async/AsyncTask.java +++ b/src/main/java/be4rjp/sclat/api/async/AsyncTask.java @@ -1,6 +1,6 @@ package be4rjp.sclat.api.async; -import be4rjp.sclat.Main; +import be4rjp.sclat.Sclat; import org.bukkit.scheduler.BukkitRunnable; public abstract class AsyncTask implements Runnable { @@ -26,7 +26,7 @@ public void runTaskLater(long delay) { public void run() { AsyncThreadManager.getRandomTickThread().runTask(runnable); } - }.runTaskLater(Main.getPlugin(), delay); + }.runTaskLater(Sclat.getPlugin(), delay); } public void runTaskTimer(long delay, long period) { @@ -41,7 +41,7 @@ public void run() { } thread.runTask(runnable); } - }.runTaskTimer(Main.getPlugin(), delay, period); + }.runTaskTimer(Sclat.getPlugin(), delay, period); } } diff --git a/src/main/java/be4rjp/sclat/api/async/AsyncThreadManager.java b/src/main/java/be4rjp/sclat/api/async/AsyncThreadManager.java index de222c6..ef71d34 100644 --- a/src/main/java/be4rjp/sclat/api/async/AsyncThreadManager.java +++ b/src/main/java/be4rjp/sclat/api/async/AsyncThreadManager.java @@ -1,6 +1,6 @@ package be4rjp.sclat.api.async; -import be4rjp.sclat.Main; +import be4rjp.sclat.Sclat; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -42,7 +42,7 @@ public static void toOffline(Player player) { } public static void sync(Runnable runnable) { - Bukkit.getScheduler().runTask(Main.getPlugin(), runnable); + Bukkit.getScheduler().runTask(Sclat.getPlugin(), runnable); } } diff --git a/src/main/java/be4rjp/sclat/data/Color.java b/src/main/java/be4rjp/sclat/api/color/Color.java similarity index 97% rename from src/main/java/be4rjp/sclat/data/Color.java rename to src/main/java/be4rjp/sclat/api/color/Color.java index a776f7d..033a18e 100644 --- a/src/main/java/be4rjp/sclat/data/Color.java +++ b/src/main/java/be4rjp/sclat/api/color/Color.java @@ -1,5 +1,5 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.color; import org.bukkit.ChatColor; import org.bukkit.Material; diff --git a/src/main/java/be4rjp/sclat/manager/ColorMgr.java b/src/main/java/be4rjp/sclat/api/color/TeamColorSets.java similarity index 87% rename from src/main/java/be4rjp/sclat/manager/ColorMgr.java rename to src/main/java/be4rjp/sclat/api/color/TeamColorSets.java index b671878..2c8a2b1 100644 --- a/src/main/java/be4rjp/sclat/manager/ColorMgr.java +++ b/src/main/java/be4rjp/sclat/api/color/TeamColorSets.java @@ -1,7 +1,6 @@ -package be4rjp.sclat.manager; +package be4rjp.sclat.api.color; -import be4rjp.sclat.Main; -import be4rjp.sclat.data.Color; +import be4rjp.sclat.Sclat; import be4rjp.sclat.data.DataMgr; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -12,7 +11,7 @@ * * @author Be4rJP */ -public class ColorMgr { +public class TeamColorSets { public synchronized static void SetupColor() { Color blue = new Color("Blue"); blue.setWool(Material.BLUE_WOOL); @@ -26,7 +25,7 @@ public synchronized static void SetupColor() { bh.setItemMeta(bhm); blue.setBougu(bh); blue.setChatColor(ChatColor.BLUE); - if (Main.colors.isEmpty() || Main.colors.contains("Blue")) { + if (Sclat.colors.isEmpty() || Sclat.colors.contains("Blue")) { DataMgr.setColor("Blue", blue); DataMgr.addColorList(blue); } @@ -43,7 +42,7 @@ public synchronized static void SetupColor() { ah.setItemMeta(ahm); aqua.setBougu(ah); aqua.setChatColor(ChatColor.AQUA); - if (Main.colors.isEmpty() || Main.colors.contains("Aqua")) { + if (Sclat.colors.isEmpty() || Sclat.colors.contains("Aqua")) { DataMgr.setColor("Aqua", aqua); DataMgr.addColorList(aqua); } @@ -60,7 +59,7 @@ public synchronized static void SetupColor() { oh.setItemMeta(ohm); orange.setBougu(oh); orange.setChatColor(ChatColor.GOLD); - if (Main.colors.isEmpty() || Main.colors.contains("Orange")) { + if (Sclat.colors.isEmpty() || Sclat.colors.contains("Orange")) { DataMgr.setColor("Orange", orange); DataMgr.addColorList(orange); } @@ -77,7 +76,7 @@ public synchronized static void SetupColor() { lh.setItemMeta(lhm); lime.setBougu(lh); lime.setChatColor(ChatColor.GREEN); - if (Main.colors.isEmpty() || Main.colors.contains("Lime")) { + if (Sclat.colors.isEmpty() || Sclat.colors.contains("Lime")) { DataMgr.setColor("Lime", lime); DataMgr.addColorList(lime); } @@ -94,7 +93,7 @@ public synchronized static void SetupColor() { yh.setItemMeta(yhm); y.setBougu(yh); y.setChatColor(ChatColor.YELLOW); - if (Main.colors.isEmpty() || Main.colors.contains("Yellow")) { + if (Sclat.colors.isEmpty() || Sclat.colors.contains("Yellow")) { DataMgr.setColor("Yellow", y); DataMgr.addColorList(y); } diff --git a/src/main/java/be4rjp/sclat/api/config/WeaponConfig.java b/src/main/java/be4rjp/sclat/api/config/WeaponConfig.java new file mode 100644 index 0000000..50bdf7d --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/config/WeaponConfig.java @@ -0,0 +1,40 @@ +package be4rjp.sclat.api.config; + +import be4rjp.sclat.Sclat; +import be4rjp.sclat.data.DataMgr; +import be4rjp.sclat.data.WeaponClass; +import org.bukkit.configuration.ConfigurationSection; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +@NullMarked +public class WeaponConfig { + // Todo: needs more refactorization + public static WeaponClass parseSection(String className, ConfigurationSection section) { + List missingProperties = new ArrayList<>(); + String weaponName = getStringOrRecord(section, "MainWeaponName", missingProperties); + String subWeaponName = getStringOrRecord(section, "SubWeaponName", missingProperties); + String spWeaponName = getStringOrRecord(section, "SPWeaponName", missingProperties); + if (!missingProperties.isEmpty()) { + Sclat.logger.warn("Missing weapon properties in {}: [{}]", className, String.join(", ", missingProperties)); + } + + WeaponClass wc = new WeaponClass(className); + wc.setMainWeapon(DataMgr.getWeapon(weaponName)); + wc.setSubWeaponName(subWeaponName); + wc.setSPWeaponName(spWeaponName); + return wc; + } + + @Nullable + private static String getStringOrRecord(ConfigurationSection section, String path, List missingList) { + String result = section.getString(path); + if (result == null) { + missingList.add(path); + } + return result; + } +} diff --git a/src/main/java/be4rjp/sclat/Glow.java b/src/main/java/be4rjp/sclat/api/enchant/GlowEnchant.java similarity index 76% rename from src/main/java/be4rjp/sclat/Glow.java rename to src/main/java/be4rjp/sclat/api/enchant/GlowEnchant.java index 185aee6..2d5f2d6 100644 --- a/src/main/java/be4rjp/sclat/Glow.java +++ b/src/main/java/be4rjp/sclat/api/enchant/GlowEnchant.java @@ -1,4 +1,4 @@ -package be4rjp.sclat; +package be4rjp.sclat.api.enchant; import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.EnchantmentTarget; @@ -8,11 +8,11 @@ import java.lang.reflect.Field; import java.util.Map; -public class Glow extends EnchantmentWrapper { +public class GlowEnchant extends EnchantmentWrapper { - private static Glow glow = null; + private static GlowEnchant glowEnchant = null; - public Glow() { + public GlowEnchant() { super("sclatg"); } @@ -42,26 +42,26 @@ public int getStartLevel() { public ItemStack enchantGlow(ItemStack is) { enableGlow(); - is.addEnchantment(glow, 1); + is.addEnchantment(glowEnchant, 1); return is; } public ItemStack removeGlow(ItemStack is) { enableGlow(); - is.removeEnchantment(glow); + is.removeEnchantment(glowEnchant); return is; } public Boolean isGlowing(ItemStack is) { enableGlow(); - return is.getEnchantments().containsKey(glow); + return is.getEnchantments().containsKey(glowEnchant); } @SuppressWarnings("unchecked") public void enableGlow() { try { - if (glow == null) { - glow = new Glow(); + if (glowEnchant == null) { + glowEnchant = new GlowEnchant(); Field f = Enchantment.class.getDeclaredField("acceptingNew"); f.setAccessible(true); f.set(null, true); @@ -69,7 +69,7 @@ public void enableGlow() { hmapf.setAccessible(true); Map hmap = (Map) hmapf.get(hmapf); if (!hmap.containsKey("sclatg")) { - Enchantment.registerEnchantment(glow); + Enchantment.registerEnchantment(glowEnchant); } } } catch (Exception ex) { diff --git a/src/main/java/be4rjp/sclat/api/equipment/EquipmentClient.java b/src/main/java/be4rjp/sclat/api/equipment/EquipmentClient.java new file mode 100644 index 0000000..c3a42b5 --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/equipment/EquipmentClient.java @@ -0,0 +1,84 @@ +package be4rjp.sclat.api.equipment; + +import be4rjp.sclat.Sclat; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; + +public class EquipmentClient { + private List commands = new ArrayList<>(); + + private final String host; + private final int port; + + private final BukkitRunnable task; + + public EquipmentClient(String host, int port, List commands) { + this.host = host; + this.port = port; + this.commands = commands; + this.task = new BukkitRunnable() { + @Override + public void run() { + BufferedReader reader = null; + + try (Socket cSocket = new Socket(host, port); + PrintWriter writer = new PrintWriter(cSocket.getOutputStream(), true)) { + try { + // System.out.println("test"); + // IPアドレスとポート番号を指定してクライアント側のソケットを作成 + + // クライアント側からサーバへの送信用 + + // サーバ側からの受取用 + reader = new BufferedReader(new InputStreamReader(cSocket.getInputStream())); + + // 命令送信ループ + String cmd = null; + while (true) { + if (!commands.isEmpty()) { + + cmd = commands.get(0); + + // 送信用の文字を送信 + writer.println(cmd); + + // stopの入力でループを抜ける + if (cmd.equals("stop")) { + break; + } + + // サーバ側からの受取の結果を表示 + // System.out.println("result:" + reader.readLine()); + + commands.remove(0); + } else { + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + System.out.println("Client is stopped!"); + } + } + }; + } + + public void startClient() { + this.task.runTaskAsynchronously(Sclat.getPlugin()); + } + + public void addCommand(String command) { + commands.add(command); + } +} diff --git a/src/main/java/be4rjp/sclat/server/EquipmentServer.java b/src/main/java/be4rjp/sclat/api/equipment/EquipmentServer.java similarity index 93% rename from src/main/java/be4rjp/sclat/server/EquipmentServer.java rename to src/main/java/be4rjp/sclat/api/equipment/EquipmentServer.java index 33c8d7f..4eed02f 100644 --- a/src/main/java/be4rjp/sclat/server/EquipmentServer.java +++ b/src/main/java/be4rjp/sclat/api/equipment/EquipmentServer.java @@ -1,6 +1,6 @@ -package be4rjp.sclat.server; +package be4rjp.sclat.api.equipment; -import be4rjp.sclat.Main; +import be4rjp.sclat.Sclat; import java.io.BufferedReader; import java.io.IOException; @@ -9,7 +9,7 @@ import java.net.ServerSocket; import java.net.Socket; -import static be4rjp.sclat.Main.conf; +import static be4rjp.sclat.Sclat.conf; public class EquipmentServer extends Thread { @@ -99,8 +99,8 @@ public void run() { } case "mod" : { // mod [PlayerName] if (args.length == 2) { - if (Main.modList.contains(args[1])) { - Main.modList.add(args[1]); + if (Sclat.modList.contains(args[1])) { + Sclat.modList.add(args[1]); } } break; diff --git a/src/main/java/be4rjp/sclat/server/EquipmentServerManager.java b/src/main/java/be4rjp/sclat/api/equipment/EquipmentServerManager.java similarity index 77% rename from src/main/java/be4rjp/sclat/server/EquipmentServerManager.java rename to src/main/java/be4rjp/sclat/api/equipment/EquipmentServerManager.java index 49ef192..1bcdef5 100644 --- a/src/main/java/be4rjp/sclat/server/EquipmentServerManager.java +++ b/src/main/java/be4rjp/sclat/api/equipment/EquipmentServerManager.java @@ -1,7 +1,7 @@ -package be4rjp.sclat.server; +package be4rjp.sclat.api.equipment; -import be4rjp.sclat.Main; -import be4rjp.sclat.api.Sclat; +import be4rjp.sclat.Sclat; +import be4rjp.sclat.api.SclatUtil; import be4rjp.sclat.data.DataMgr; import be4rjp.sclat.manager.PlayerStatusMgr; import org.bukkit.entity.Player; @@ -27,14 +27,15 @@ public static void doCommands() { if (args[3].length() == 36) { switch (args[1]) { case "weapon" : - for (Player player : Main.getPlugin().getServer().getOnlinePlayers()) + for (Player player : Sclat.getPlugin().getServer().getOnlinePlayers()) if (player.getUniqueId().toString().equals(args[3])) DataMgr.getPlayerData(player) .setWeaponClass(DataMgr.getWeaponClass(args[2])); break; case "gear" : - for (Player player : Main.getPlugin().getServer().getOnlinePlayers()) - if (player.getUniqueId().toString().equals(args[3]) && Sclat.isNumber(args[2])) + for (Player player : Sclat.getPlugin().getServer().getOnlinePlayers()) + if (player.getUniqueId().toString().equals(args[3]) + && SclatUtil.isNumber(args[2])) DataMgr.getPlayerData(player).setGearNumber(Integer.parseInt(args[2])); break; case "rank" : diff --git a/src/main/java/be4rjp/sclat/api/holo/HologramLine.java b/src/main/java/be4rjp/sclat/api/holo/HologramLine.java new file mode 100644 index 0000000..c80a242 --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/holo/HologramLine.java @@ -0,0 +1,75 @@ +package be4rjp.sclat.api.holo; + +import be4rjp.sclat.api.packet.Packets; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public class HologramLine { + private final int entityId; + private final UUID uuid; + private final Location location; + private String text; + private boolean visible = true; + + public HologramLine(Location loc, String text) { + this.entityId = ThreadLocalRandom.current().nextInt(100000, 999999); + this.uuid = UUID.randomUUID(); + this.location = loc; + this.text = text; + } + + public void setText(String text) { + this.text = text; + } + public void setVisible(boolean visible) { + this.visible = visible; + } + public int getEntityId() { + return entityId; + } + + public void sendSpawn(Player player) { + // Spawn Packet (1.14.4 ArmorStand ID is 1) + PacketContainer spawn = Packets.createPacket(PacketType.Play.Server.SPAWN_ENTITY_LIVING); + spawn.getIntegers().write(0, entityId); + spawn.getUUIDs().write(0, uuid); + spawn.getIntegers().write(1, 1); + spawn.getDoubles().write(0, location.getX()).write(1, location.getY()).write(2, location.getZ()); + + // Metadata Packet + PacketContainer meta = Packets.createPacket(PacketType.Play.Server.ENTITY_METADATA); + meta.getIntegers().write(0, entityId); + + WrappedDataWatcher watcher = new WrappedDataWatcher(); + watcher.setObject(0, WrappedDataWatcher.Registry.get(Byte.class), (byte) 0x20); // Invisible + watcher.setObject(2, WrappedDataWatcher.Registry.getChatComponentSerializer(true), + Optional.of(WrappedChatComponent.fromText(text).getHandle())); + watcher.setObject(3, WrappedDataWatcher.Registry.get(Boolean.class), visible); + watcher.setObject(14, WrappedDataWatcher.Registry.get(Byte.class), (byte) 0x01); // Small + + meta.getWatchableCollectionModifier().write(0, watcher.getWatchableObjects()); + + Packets.sendServerPacket(player, spawn); + Packets.sendServerPacket(player, meta); + } + + public void sendDestroy(Player player) { + PacketContainer destroy = ProtocolLibrary.getProtocolManager() + .createPacket(PacketType.Play.Server.ENTITY_DESTROY); + destroy.getIntegerArrays().write(0, new int[]{entityId}); + try { + ProtocolLibrary.getProtocolManager().sendServerPacket(player, destroy); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/be4rjp/sclat/api/holo/PlayerHolograms.java b/src/main/java/be4rjp/sclat/api/holo/PlayerHolograms.java new file mode 100644 index 0000000..d168702 --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/holo/PlayerHolograms.java @@ -0,0 +1,47 @@ +package be4rjp.sclat.api.holo; + +import be4rjp.sclat.manager.PlayerStatusMgr; +import org.bukkit.entity.Player; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.HashMap; +import java.util.Set; +import java.util.UUID; +import java.util.function.Consumer; + +@NullMarked +public class PlayerHolograms { + protected final HashMap rankingHoloMap = new HashMap<>(); + + public void add(Player player) { + RankingHolograms playerHolo = new RankingHolograms(player); + rankingHoloMap.put(player.getUniqueId(), playerHolo); + PlayerStatusMgr.HologramUpdateRunnable(player); + } + + public void ifPresent(Player player, Consumer holoConsumer) { + RankingHolograms holo = get(player); + if (holo != null) { + holoConsumer.accept(holo); + } + } + + @Nullable + public RankingHolograms get(Player player) { + return get(player.getUniqueId()); + } + + @Nullable + public RankingHolograms get(UUID playerUuid) { + return rankingHoloMap.get(playerUuid); + } + + public void remove(Player player) { + rankingHoloMap.remove(player.getUniqueId()); + } + + public Set getKeys() { + return rankingHoloMap.keySet(); + } +} diff --git a/src/main/java/be4rjp/sclat/data/RankingHolograms.java b/src/main/java/be4rjp/sclat/api/holo/RankingHolograms.java similarity index 90% rename from src/main/java/be4rjp/sclat/data/RankingHolograms.java rename to src/main/java/be4rjp/sclat/api/holo/RankingHolograms.java index 531c593..01766bd 100644 --- a/src/main/java/be4rjp/sclat/data/RankingHolograms.java +++ b/src/main/java/be4rjp/sclat/api/holo/RankingHolograms.java @@ -1,22 +1,27 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.holo; -import be4rjp.sclat.Main; +import be4rjp.sclat.Sclat; +import be4rjp.sclat.api.rank.RankingType; +import be4rjp.sclat.api.rank.RankingUpdater; +import be4rjp.sclat.api.rank.Ratings; import be4rjp.sclat.manager.PlayerStatusMgr; -import be4rjp.sclat.manager.RankMgr; -import net.minecraft.server.v1_14_R1.*; +import net.minecraft.server.v1_15_R1.EntityArmorStand; +import net.minecraft.server.v1_15_R1.PacketPlayOutEntityDestroy; +import net.minecraft.server.v1_15_R1.PacketPlayOutSpawnEntityLiving; +import net.minecraft.server.v1_15_R1.WorldServer; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_14_R1.util.CraftChatMessage; +import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_15_R1.util.CraftChatMessage; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import java.util.ArrayList; import java.util.List; -import static be4rjp.sclat.Main.conf; +import static be4rjp.sclat.Sclat.conf; public class RankingHolograms { private final EntityArmorStand title; @@ -206,7 +211,7 @@ public void run() { list.add(armorStand); if (rankingType == RankingType.TOTAL) { - String uuid = RankMgr.ranking.get(i); + String uuid = RankingUpdater.ranking.get(i); String mcid = conf.getUUIDCash().getString(uuid); int rank = PlayerStatusMgr.getRank(uuid); @@ -214,14 +219,14 @@ public void run() { if (rank != 0) { armorStand.setCustomName( CraftChatMessage.fromStringOrNull("§e" + String.valueOf(i + 1) + "位 §f" + mcid - + " §6Rank : §r" + rank + " [§b " + RankMgr.toABCRank(rank) + " §f]")); + + " §6Rank : §r" + rank + " [§b " + Ratings.toABCRank(rank) + " §f]")); } else { armorStand.setCustomName(CraftChatMessage.fromStringOrNull("--")); } } if (rankingType == RankingType.KILL) { - String uuid = RankMgr.killRanking.get(i); + String uuid = RankingUpdater.killRanking.get(i); String mcid = conf.getUUIDCash().getString(uuid); int kill = PlayerStatusMgr.getKill(uuid); @@ -235,7 +240,7 @@ public void run() { } if (rankingType == RankingType.PAINT) { - String uuid = RankMgr.paintRanking.get(i); + String uuid = RankingUpdater.paintRanking.get(i); String mcid = conf.getUUIDCash().getString(uuid); int paint = PlayerStatusMgr.getPaint(uuid); @@ -257,7 +262,7 @@ public void run() { if (rankingType == RankingType.TOTAL) { String mcid = player.getName(); int ranking = 1; - for (String uuid : RankMgr.ranking) { + for (String uuid : RankingUpdater.ranking) { if (uuid.equals(player.getUniqueId().toString())) break; ranking++; @@ -266,13 +271,13 @@ public void run() { int rank = PlayerStatusMgr.getRank(player.getUniqueId().toString()); you.setCustomName(CraftChatMessage.fromStringOrNull("§aYou ->> §e" + (rank == 0 ? "-" : ranking) - + "位 §f" + mcid + " §6Rank : §r" + rank + " [§b " + RankMgr.toABCRank(rank) + " §f]")); + + "位 §f" + mcid + " §6Rank : §r" + rank + " [§b " + Ratings.toABCRank(rank) + " §f]")); } if (rankingType == RankingType.KILL) { String mcid = player.getName(); int ranking = 1; - for (String uuid : RankMgr.killRanking) { + for (String uuid : RankingUpdater.killRanking) { if (uuid.equals(player.getUniqueId().toString())) break; ranking++; @@ -287,7 +292,7 @@ public void run() { if (rankingType == RankingType.PAINT) { String mcid = player.getName(); int ranking = 1; - for (String uuid : RankMgr.paintRanking) { + for (String uuid : RankingUpdater.paintRanking) { if (uuid.equals(player.getUniqueId().toString())) break; ranking++; @@ -325,6 +330,6 @@ public void run() { } } }; - async.runTaskAsynchronously(Main.getPlugin()); + async.runTaskAsynchronously(Sclat.getPlugin()); } } diff --git a/src/main/java/be4rjp/sclat/api/packet/EntityPackets.java b/src/main/java/be4rjp/sclat/api/packet/EntityPackets.java new file mode 100644 index 0000000..b059d00 --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/packet/EntityPackets.java @@ -0,0 +1,15 @@ +package be4rjp.sclat.api.packet; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import org.bukkit.entity.Player; +import org.jspecify.annotations.NullMarked; + +@NullMarked +public class EntityPackets { + public static boolean sendDestroyEntities(Player player, int... entityIds) { + PacketContainer destroyPacket = Packets.createPacket(PacketType.Play.Server.ENTITY_DESTROY); + destroyPacket.getIntegerArrays().write(0, entityIds); + return Packets.sendServerPacket(player, destroyPacket); + } +} diff --git a/src/main/java/be4rjp/sclat/api/packet/Packets.java b/src/main/java/be4rjp/sclat/api/packet/Packets.java new file mode 100644 index 0000000..73030b3 --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/packet/Packets.java @@ -0,0 +1,48 @@ +package be4rjp.sclat.api.packet; + +import be4rjp.sclat.Sclat; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketContainer; +import org.bukkit.entity.Player; +import org.jspecify.annotations.NullMarked; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationTargetException; + +@NullMarked +public class Packets { + private static final Logger logger = LoggerFactory.getLogger(EntityPackets.class); + public static ProtocolManager manager() { + return Sclat.protocolManager; + } + + public static PacketContainer createPacket(PacketType packetType) { + return manager().createPacket(packetType); + } + + public static PacketContainer createPacket(PacketType packetType, boolean b) { + return manager().createPacket(packetType, b); + } + + public static boolean sendServerPacket(Player player, PacketContainer packet) { + try { + manager().sendServerPacket(player, packet); + return true; + } catch (InvocationTargetException e) { + logger.error("Failed to send packet", e); + return false; + } + } + + public static boolean broadcastServerPacket(PacketContainer packet) { + try { + manager().broadcastServerPacket(packet); + return true; + } catch (Exception e) { + logger.error("Failed to broadcast packet", e); + return false; + } + } +} diff --git a/src/main/java/be4rjp/sclat/api/packet/WorldPackets.java b/src/main/java/be4rjp/sclat/api/packet/WorldPackets.java new file mode 100644 index 0000000..d3e49d6 --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/packet/WorldPackets.java @@ -0,0 +1,102 @@ +package be4rjp.sclat.api.packet; + +import be4rjp.sclat.data.DataMgr; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.BlockPosition; +import com.comphenix.protocol.wrappers.EnumWrappers; +import com.comphenix.protocol.wrappers.WrappedBlockData; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +public class WorldPackets { + public static boolean broadcastBlockChange(Location location, Material material) { + PacketContainer packet = Packets.createPacket(PacketType.Play.Server.BLOCK_CHANGE); + packet.getBlockPositionModifier().write(0, new BlockPosition(location.toVector())); + packet.getBlockData().write(0, WrappedBlockData.createData(material)); + return Packets.broadcastServerPacket(packet); + } + + public static boolean sendWorldBorderWarningPacket(Player player) { + PacketContainer packet = Packets.createPacket(PacketType.Play.Server.WORLD_BORDER); + + // Set the action to INITIALIZE (Enum index 3 in 1.14.4) + packet.getWorldBorderActions().write(0, EnumWrappers.WorldBorderAction.INITIALIZE); + + // Set Center (far away from the player to trigger the warning) + packet.getDoubles().write(0, player.getLocation().getX() + 10000.0); // Center X + packet.getDoubles().write(1, player.getLocation().getZ() + 10000.0); // Center Z + + // Set Sizes + packet.getDoubles().write(2, 0.0); // Old radius + packet.getDoubles().write(3, 1.0); // New radius (Size 1) + + // Set Lerp Speed (Time to reach new radius) + packet.getLongs().write(0, 0L); + + // Set Other Required Data for INITIALIZE + packet.getIntegers().write(0, 29999984); // Portal Teleport Boundary + packet.getIntegers().write(1, 5); // Warning Time + packet.getIntegers().write(2, 5); // Warning Distance + + return Packets.sendServerPacket(player, packet); + } + + public static boolean sendWorldBorderWarningClearPacket(Player player) { + PacketContainer packet = Packets.createPacket(PacketType.Play.Server.WORLD_BORDER); + + // Set the action to INITIALIZE + packet.getWorldBorderActions().write(0, EnumWrappers.WorldBorderAction.INITIALIZE); + + // Set Center to player's current position so they are in the middle + packet.getDoubles().write(0, player.getLocation().getX()); // Center X + packet.getDoubles().write(1, player.getLocation().getZ()); // Center Z + + // Set Sizes to maximum (30 million is the Minecraft default limit) + packet.getDoubles().write(2, 30_000_000.0); // Old radius + packet.getDoubles().write(3, 30_000_000.0); // New radius + + // Set Lerp Speed + packet.getLongs().write(0, 0L); + + // Set Required Constants + packet.getIntegers().write(0, 29999984); // Portal boundary + packet.getIntegers().write(1, 5); // Warning time + packet.getIntegers().write(2, 5); // Warning distance + + return Packets.sendServerPacket(player, packet); + } + + public static boolean setPlayerFOV(Player player, float fov) { + PacketContainer packet = Packets.createPacket(PacketType.Play.Server.ABILITIES); + + // 1. Set the walk speed (which controls the FOV zoom/widening) + // In 1.14.4, walkSpeed is usually the second float (index 1) + packet.getFloat().write(1, fov); + + // 2. Set the fly speed (index 0) to the player's current fly speed to avoid + // bugs + packet.getFloat().write(0, player.getFlySpeed()); + + // 3. Set the flags (invulnerable, flying, canFly, instabuild) + // We use a bitmask or just mirror the player's current state + byte flags = 0; + if (player.getAllowFlight()) + flags |= 0x04; + if (player.isFlying()) + flags |= 0x02; + // (Add more flags if you need to maintain invulnerability or creative mode + // status) + + packet.getBooleans().write(0, player.isInvulnerable()); + packet.getBooleans().write(1, player.isFlying()); + packet.getBooleans().write(2, player.getAllowFlight()); + packet.getBooleans().write(3, player.getGameMode() == org.bukkit.GameMode.CREATIVE); + + // Update your local data manager + DataMgr.getPlayerData(player).setFov(fov); + + return Packets.sendServerPacket(player, packet); + } +} diff --git a/src/main/java/be4rjp/sclat/data/PlayerData.java b/src/main/java/be4rjp/sclat/api/player/PlayerData.java similarity index 97% rename from src/main/java/be4rjp/sclat/data/PlayerData.java rename to src/main/java/be4rjp/sclat/api/player/PlayerData.java index 7f5bc22..1c3d6d9 100644 --- a/src/main/java/be4rjp/sclat/data/PlayerData.java +++ b/src/main/java/be4rjp/sclat/api/player/PlayerData.java @@ -1,6 +1,10 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.player; -import net.minecraft.server.v1_14_R1.ItemStack; +import be4rjp.sclat.api.team.Team; +import be4rjp.sclat.data.MainWeapon; +import be4rjp.sclat.data.Match; +import be4rjp.sclat.data.WeaponClass; +import net.minecraft.server.v1_15_R1.ItemStack; import org.bukkit.Location; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Player; diff --git a/src/main/java/be4rjp/sclat/data/PlayerReturn.java b/src/main/java/be4rjp/sclat/api/player/PlayerReturn.java similarity index 79% rename from src/main/java/be4rjp/sclat/data/PlayerReturn.java rename to src/main/java/be4rjp/sclat/api/player/PlayerReturn.java index 018909a..4bfbdd6 100644 --- a/src/main/java/be4rjp/sclat/data/PlayerReturn.java +++ b/src/main/java/be4rjp/sclat/api/player/PlayerReturn.java @@ -1,6 +1,6 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.player; -import be4rjp.sclat.Main; +import be4rjp.sclat.Sclat; import org.bukkit.scheduler.BukkitRunnable; public class PlayerReturn { @@ -18,7 +18,7 @@ public void run() { flag = false; } }; - this.task.runTaskLater(Main.getPlugin(), 400); + this.task.runTaskLater(Sclat.getPlugin(), 400); } public boolean getFlag() { diff --git a/src/main/java/be4rjp/sclat/data/PlayerSettings.java b/src/main/java/be4rjp/sclat/api/player/PlayerSettings.java similarity index 98% rename from src/main/java/be4rjp/sclat/data/PlayerSettings.java rename to src/main/java/be4rjp/sclat/api/player/PlayerSettings.java index 526f965..d2cbc33 100644 --- a/src/main/java/be4rjp/sclat/data/PlayerSettings.java +++ b/src/main/java/be4rjp/sclat/api/player/PlayerSettings.java @@ -1,5 +1,5 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.player; import org.bukkit.entity.Player; diff --git a/src/main/java/be4rjp/sclat/data/RankingType.java b/src/main/java/be4rjp/sclat/api/rank/RankingType.java similarity index 61% rename from src/main/java/be4rjp/sclat/data/RankingType.java rename to src/main/java/be4rjp/sclat/api/rank/RankingType.java index d22d028..5272387 100644 --- a/src/main/java/be4rjp/sclat/data/RankingType.java +++ b/src/main/java/be4rjp/sclat/api/rank/RankingType.java @@ -1,4 +1,4 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.rank; public enum RankingType { TOTAL, KILL, PAINT diff --git a/src/main/java/be4rjp/sclat/manager/RankMgr.java b/src/main/java/be4rjp/sclat/api/rank/RankingUpdater.java similarity index 52% rename from src/main/java/be4rjp/sclat/manager/RankMgr.java rename to src/main/java/be4rjp/sclat/api/rank/RankingUpdater.java index 4b2bfde..73c3b41 100644 --- a/src/main/java/be4rjp/sclat/manager/RankMgr.java +++ b/src/main/java/be4rjp/sclat/api/rank/RankingUpdater.java @@ -1,108 +1,24 @@ +package be4rjp.sclat.api.rank; -package be4rjp.sclat.manager; - -import be4rjp.sclat.Main; -import be4rjp.sclat.data.DataMgr; +import be4rjp.sclat.Sclat; +import be4rjp.sclat.api.holo.RankingHolograms; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; -import java.util.*; - -import static be4rjp.sclat.Main.conf; - -/** - * - * @author Be4rJP - */ -public class RankMgr { +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; - private static final String[] ranks = {"E", "D-", "D", "D+", "C-", "C", "C+", "B-", "B", "B+", "A-", "A", "A+", - "S-", "S", "S+", "MASTER"}; - private static final int MAX_RATE = (ranks.length - 1) * 500; +import static be4rjp.sclat.Sclat.conf; +public class RankingUpdater { public static List ranking = new ArrayList<>(); public static List killRanking = new ArrayList<>(); public static List paintRanking = new ArrayList<>(); - // レートを500単位で区切ってランク付けする - public static String toABCRank(int ir) { - return ir >= 0 ? ranks[ir <= MAX_RATE ? ir / 500 : ranks.length - 1] : "UnRanked"; - } - public static int IndicateRankPointmove(Player p, int rankPoint) { - if (rankPoint == 0) - return 0; - - int rank = PlayerStatusMgr.getRank(p); - - double rank_Rate = 1.0; - - if (rank < 500) { - rank_Rate = 3.0; - } else if (rank < 2000) { - rank_Rate = 2.0; - } else if (rank < 3500) { - rank_Rate = 1.5; - } else if (rank < 6500) { - rank_Rate = 1.0; - } else if (rank < 8000) { - rank_Rate = 0.75; - } else if (rank < 20000) { - rank_Rate = 0.5; - } else { - rank_Rate = 0.2; - } - int plus = (int) ((double) rankPoint * rank_Rate); - return plus; - - } - public static void addPlayerRankPoint(String uuid, int rankPoint) { - if (rankPoint == 0) - return; - - int rank = PlayerStatusMgr.getRank(uuid); - - // int MAX_RATE = ranks.length * 500; - - double rank_Rate = 1.0; - - if (rank < 500) { - rank_Rate = 3.0; - } else if (rank < 2000) { - rank_Rate = 2.0; - } else if (rank < 3500) { - rank_Rate = 1.5; - } else if (rank < 6500) { - rank_Rate = 1.0; - } else if (rank < 8000) { - rank_Rate = 0.75; - } else if (rank < 20000) { - rank_Rate = 0.5; - } else { - rank_Rate = 0.2; - } - - // if(rank >= MAX_RATE) { - // if(rankPoint < 0){ - // double minusRate = (double)MAX_RATE / ((double)MAX_RATE - (double)rank); - // int minus = (int)((double)rankPoint * minusRate); - // PlayerStatusMgr.addRank(uuid, -minus); - // } - // return; - // } - int plus = (int) ((double) rankPoint * rank_Rate); - if (plus > 0) { - // double plusRate = ((double)MAX_RATE - (double)rank) / (double)MAX_RATE; - // int plus = (int)((double)rankPoint * plusRate); - PlayerStatusMgr.addRank(uuid, plus); - } - // }else{ - // double minusRate = (double)MAX_RATE / ((double)MAX_RATE - (double)rank); - // int minus = (int)((double)rankPoint * minusRate); - // PlayerStatusMgr.addRank(uuid, minus); - // } - - } - public static void makeRankingAsync() { BukkitRunnable async = new BukkitRunnable() { @Override @@ -130,7 +46,7 @@ public void run() { } } }; - async.runTaskAsynchronously(Main.getPlugin()); + async.runTaskAsynchronously(Sclat.getPlugin()); } public static void makeKillRankingAsync() { @@ -161,7 +77,7 @@ public void run() { } } }; - async.runTaskAsynchronously(Main.getPlugin()); + async.runTaskAsynchronously(Sclat.getPlugin()); } public static void makePaintRankingAsync() { @@ -191,7 +107,7 @@ public void run() { } } }; - async.runTaskAsynchronously(Main.getPlugin()); + async.runTaskAsynchronously(Sclat.getPlugin()); } public static void makeRankingTask() { @@ -201,14 +117,14 @@ public void run() { makeRankingAsync(); makeKillRankingAsync(); makePaintRankingAsync(); - for (Player player : Main.getPlugin().getServer().getOnlinePlayers()) { + for (Player player : Sclat.getPlugin().getServer().getOnlinePlayers()) { try { - DataMgr.getRankingHolograms(player).refreshRankingAsync(); + Sclat.playerHolograms.ifPresent(player, RankingHolograms::refreshRankingAsync); } catch (Exception e) { } } } }; - task.runTaskTimer(Main.getPlugin(), 0, conf.getConfig().getInt("MakeRankingPeriod")); + task.runTaskTimer(Sclat.getPlugin(), 0, conf.getConfig().getInt("MakeRankingPeriod")); } } diff --git a/src/main/java/be4rjp/sclat/api/rank/Ratings.java b/src/main/java/be4rjp/sclat/api/rank/Ratings.java new file mode 100644 index 0000000..4efda7e --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/rank/Ratings.java @@ -0,0 +1,79 @@ + +package be4rjp.sclat.api.rank; + +import be4rjp.sclat.manager.PlayerStatusMgr; +import org.bukkit.entity.Player; + +/** + * + * @author Be4rJP + */ +public class Ratings { + + private static final String[] ranks = {"E", "D-", "D", "D+", "C-", "C", "C+", "B-", "B", "B+", "A-", "A", "A+", + "S-", "S", "S+", "MASTER"}; + private static final int MAX_RATE = (ranks.length - 1) * 500; + + // レートを500単位で区切ってランク付けする + public static String toABCRank(int ir) { + return ir >= 0 ? ranks[ir <= MAX_RATE ? ir / 500 : ranks.length - 1] : "UnRanked"; + } + public static int IndicateRankPointmove(Player p, int rankPoint) { + if (rankPoint == 0) + return 0; + + int rank = PlayerStatusMgr.getRank(p); + + double rank_Rate = 1.0; + + if (rank < 500) { + rank_Rate = 3.0; + } else if (rank < 2000) { + rank_Rate = 2.0; + } else if (rank < 3500) { + rank_Rate = 1.5; + } else if (rank < 6500) { + rank_Rate = 1.0; + } else if (rank < 8000) { + rank_Rate = 0.75; + } else if (rank < 20000) { + rank_Rate = 0.5; + } else { + rank_Rate = 0.2; + } + int plus = (int) ((double) rankPoint * rank_Rate); + return plus; + + } + public static void addPlayerRankPoint(String uuid, int rankPoint) { + if (rankPoint == 0) + return; + + int rank = PlayerStatusMgr.getRank(uuid); + + // int MAX_RATE = ranks.length * 500; + + double rank_Rate = 1.0; + + if (rank < 500) { + rank_Rate = 3.0; + } else if (rank < 2000) { + rank_Rate = 2.0; + } else if (rank < 3500) { + rank_Rate = 1.5; + } else if (rank < 6500) { + rank_Rate = 1.0; + } else if (rank < 8000) { + rank_Rate = 0.75; + } else if (rank < 20000) { + rank_Rate = 0.5; + } else { + rank_Rate = 0.2; + } + + int plus = (int) ((double) rankPoint * rank_Rate); + if (plus > 0) { + PlayerStatusMgr.addRank(uuid, plus); + } + } +} diff --git a/src/main/java/be4rjp/sclat/api/raytrace/BoundingBox.java b/src/main/java/be4rjp/sclat/api/raytrace/BoundingBox.java index 3ae6907..47f2cb9 100644 --- a/src/main/java/be4rjp/sclat/api/raytrace/BoundingBox.java +++ b/src/main/java/be4rjp/sclat/api/raytrace/BoundingBox.java @@ -1,8 +1,8 @@ package be4rjp.sclat.api.raytrace; -import net.minecraft.server.v1_14_R1.AxisAlignedBB; -import org.bukkit.craftbukkit.v1_14_R1.entity.CraftEntity; +import net.minecraft.server.v1_15_R1.AxisAlignedBB; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity; import org.bukkit.entity.Entity; import org.bukkit.util.Vector; diff --git a/src/main/java/be4rjp/sclat/data/NoteBlockSong.java b/src/main/java/be4rjp/sclat/api/song/NoteBlockSong.java similarity index 92% rename from src/main/java/be4rjp/sclat/data/NoteBlockSong.java rename to src/main/java/be4rjp/sclat/api/song/NoteBlockSong.java index c1c6bb3..8874808 100644 --- a/src/main/java/be4rjp/sclat/data/NoteBlockSong.java +++ b/src/main/java/be4rjp/sclat/api/song/NoteBlockSong.java @@ -1,5 +1,5 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.song; import com.xxmicloxx.NoteBlockAPI.model.Song; diff --git a/src/main/java/be4rjp/sclat/api/MineStat.java b/src/main/java/be4rjp/sclat/api/status/MineStat.java similarity index 99% rename from src/main/java/be4rjp/sclat/api/MineStat.java rename to src/main/java/be4rjp/sclat/api/status/MineStat.java index dab7c24..2da322b 100644 --- a/src/main/java/be4rjp/sclat/api/MineStat.java +++ b/src/main/java/be4rjp/sclat/api/status/MineStat.java @@ -1,4 +1,4 @@ -package be4rjp.sclat.api; +package be4rjp.sclat.api.status; import java.io.BufferedReader; import java.io.DataOutputStream; diff --git a/src/main/java/be4rjp/sclat/data/ServerStatus.java b/src/main/java/be4rjp/sclat/api/status/ServerStatus.java similarity index 94% rename from src/main/java/be4rjp/sclat/data/ServerStatus.java rename to src/main/java/be4rjp/sclat/api/status/ServerStatus.java index 520ac6b..1cf8941 100644 --- a/src/main/java/be4rjp/sclat/data/ServerStatus.java +++ b/src/main/java/be4rjp/sclat/api/status/ServerStatus.java @@ -1,7 +1,7 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.status; -import be4rjp.sclat.Main; -import be4rjp.sclat.api.MineStat; +import be4rjp.sclat.Sclat; +import be4rjp.sclat.data.MatchServerRunnable; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.scheduler.BukkitRunnable; @@ -69,7 +69,7 @@ public void run() { } } }; - task.runTaskTimerAsynchronously(Main.getPlugin(), 0, this.period); + task.runTaskTimerAsynchronously(Sclat.getPlugin(), 0, this.period); this.task2 = new BukkitRunnable() { @Override @@ -96,7 +96,7 @@ public void run() { } } }; - task2.runTaskTimer(Main.getPlugin(), 5, this.period); + task2.runTaskTimer(Sclat.getPlugin(), 5, this.period); } public int getPlayerCount() { diff --git a/src/main/java/be4rjp/sclat/api/status/StatusClient.java b/src/main/java/be4rjp/sclat/api/status/StatusClient.java new file mode 100644 index 0000000..5674d57 --- /dev/null +++ b/src/main/java/be4rjp/sclat/api/status/StatusClient.java @@ -0,0 +1,85 @@ +package be4rjp.sclat.api.status; + +import be4rjp.sclat.Sclat; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; + +public class StatusClient { + + private List commands = new ArrayList<>(); + + private final String host; + private final int port; + + private final BukkitRunnable task; + + public StatusClient(String host, int port, List commands) { + this.host = host; + this.port = port; + this.commands = commands; + this.task = new BukkitRunnable() { + @Override + public void run() { + BufferedReader reader = null; + + try (Socket cSocket = new Socket(host, port); + PrintWriter writer = new PrintWriter(cSocket.getOutputStream(), true)) { + try { + // System.out.println("test"); + // IPアドレスとポート番号を指定してクライアント側のソケットを作成 + + // クライアント側からサーバへの送信用 + + // サーバ側からの受取用 + reader = new BufferedReader(new InputStreamReader(cSocket.getInputStream())); + + // 命令送信ループ + String cmd = null; + while (true) { + if (!commands.isEmpty()) { + + cmd = commands.get(0); + + // 送信用の文字を送信 + writer.println(cmd); + + // stopの入力でループを抜ける + if (cmd.equals("stop")) { + break; + } + + // サーバ側からの受取の結果を表示 + // System.out.println("result:" + reader.readLine()); + + commands.remove(0); + } else { + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + System.out.println("Client is stopped!"); + } + } + }; + } + + public void startClient() { + this.task.runTaskAsynchronously(Sclat.getPlugin()); + } + + public void addCommand(String command) { + commands.add(command); + } +} diff --git a/src/main/java/be4rjp/sclat/server/StatusServer.java b/src/main/java/be4rjp/sclat/api/status/StatusServer.java similarity index 91% rename from src/main/java/be4rjp/sclat/server/StatusServer.java rename to src/main/java/be4rjp/sclat/api/status/StatusServer.java index ea639ef..9f592b2 100644 --- a/src/main/java/be4rjp/sclat/server/StatusServer.java +++ b/src/main/java/be4rjp/sclat/api/status/StatusServer.java @@ -1,13 +1,12 @@ -package be4rjp.sclat.server; +package be4rjp.sclat.api.status; -import be4rjp.sclat.Main; +import be4rjp.sclat.Sclat; import be4rjp.sclat.api.MessageType; -import be4rjp.sclat.api.Sclat; +import be4rjp.sclat.api.SclatUtil; import be4rjp.sclat.api.SoundType; -import be4rjp.sclat.data.ServerStatus; +import be4rjp.sclat.api.rank.Ratings; import be4rjp.sclat.manager.PlayerReturnManager; import be4rjp.sclat.manager.PlayerStatusMgr; -import be4rjp.sclat.manager.RankMgr; import be4rjp.sclat.manager.ServerStatusManager; import java.io.BufferedReader; @@ -109,13 +108,13 @@ public void run() { } case "add" : { // add [statusName] [number] [uuid] if (args.length == 4) { - if (Sclat.isNumber(args[2]) && args[3].length() == 36) { + if (SclatUtil.isNumber(args[2]) && args[3].length() == 36) { switch (args[1]) { case "money" : PlayerStatusMgr.addMoney(args[3], Integer.parseInt(args[2])); break; case "rank" : - RankMgr.addPlayerRankPoint(args[3], Integer.parseInt(args[2])); + Ratings.addPlayerRankPoint(args[3], Integer.parseInt(args[2])); break; case "level" : PlayerStatusMgr.addLv(args[3], Integer.parseInt(args[2])); @@ -151,14 +150,14 @@ public void run() { for (ServerStatus ss : ServerStatusManager.serverList) { if (ss.getServerName().equals(args[1])) { ss.setWaitingEndTime(Long.parseLong(args[2])); - Sclat.sendMessage(ss.getDisplayName() + "§aの試合待機が開始されました!", + SclatUtil.sendMessage(ss.getDisplayName() + "§aの試合待機が開始されました!", MessageType.ALL_PLAYER); - Sclat.sendMessage( + SclatUtil.sendMessage( "§a§l" + (ss.getWaitingEndTime() - (System.currentTimeMillis() / 1000)) + "§b秒後に開始されます", MessageType.ALL_PLAYER); - Main.getPlugin().getServer().getOnlinePlayers() - .forEach(player -> Sclat.playGameSound(player, SoundType.SUCCESS)); + Sclat.getPlugin().getServer().getOnlinePlayers() + .forEach(player -> SclatUtil.playGameSound(player, SoundType.SUCCESS)); } } } diff --git a/src/main/java/be4rjp/sclat/data/Team.java b/src/main/java/be4rjp/sclat/api/team/Team.java similarity index 94% rename from src/main/java/be4rjp/sclat/data/Team.java rename to src/main/java/be4rjp/sclat/api/team/Team.java index 56e6ed1..01f5c6c 100644 --- a/src/main/java/be4rjp/sclat/data/Team.java +++ b/src/main/java/be4rjp/sclat/api/team/Team.java @@ -1,4 +1,6 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.team; + +import be4rjp.sclat.api.color.Color; /** * diff --git a/src/main/java/be4rjp/sclat/data/TeamLoc.java b/src/main/java/be4rjp/sclat/api/team/TeamLoc.java similarity index 96% rename from src/main/java/be4rjp/sclat/data/TeamLoc.java rename to src/main/java/be4rjp/sclat/api/team/TeamLoc.java index 9b201de..80f156e 100644 --- a/src/main/java/be4rjp/sclat/data/TeamLoc.java +++ b/src/main/java/be4rjp/sclat/api/team/TeamLoc.java @@ -1,8 +1,10 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.team; + +import be4rjp.sclat.data.MapData; +import org.bukkit.Location; import java.util.Collections; import java.util.List; -import org.bukkit.Location; /** * diff --git a/src/main/java/be4rjp/sclat/data/Wiremesh.java b/src/main/java/be4rjp/sclat/api/wiremesh/Wiremesh.java similarity index 75% rename from src/main/java/be4rjp/sclat/data/Wiremesh.java rename to src/main/java/be4rjp/sclat/api/wiremesh/Wiremesh.java index 13100e1..f88e3b6 100644 --- a/src/main/java/be4rjp/sclat/data/Wiremesh.java +++ b/src/main/java/be4rjp/sclat/api/wiremesh/Wiremesh.java @@ -1,19 +1,31 @@ -package be4rjp.sclat.data; - -import java.util.*; - -import be4rjp.sclat.Main; -import net.minecraft.server.v1_14_R1.*; +package be4rjp.sclat.api.wiremesh; + +import be4rjp.sclat.Sclat; +import net.minecraft.server.v1_15_R1.DataWatcher; +import net.minecraft.server.v1_15_R1.EntityArmorStand; +import net.minecraft.server.v1_15_R1.EntityFallingBlock; +import net.minecraft.server.v1_15_R1.EntityPlayer; +import net.minecraft.server.v1_15_R1.IBlockData; +import net.minecraft.server.v1_15_R1.PacketPlayOutEntityDestroy; +import net.minecraft.server.v1_15_R1.PacketPlayOutEntityMetadata; +import net.minecraft.server.v1_15_R1.PacketPlayOutMount; +import net.minecraft.server.v1_15_R1.PacketPlayOutSpawnEntity; +import net.minecraft.server.v1_15_R1.PacketPlayOutSpawnEntityLiving; +import net.minecraft.server.v1_15_R1.WorldServer; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_15_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + /** * * @author Be4rJP @@ -53,7 +65,7 @@ public Wiremesh(Block b, Material origType, BlockData bData) { as.setInvisible(true); fb.startRiding(as); - for (Player player : Main.getPlugin().getServer().getOnlinePlayers()) { + for (Player player : Sclat.getPlugin().getServer().getOnlinePlayers()) { if (block.getWorld() != player.getWorld()) continue; @@ -66,7 +78,7 @@ public void run() { try { playerList.removeIf(player -> !player.isOnline()); - for (Player player : Main.getPlugin().getServer().getOnlinePlayers()) { + for (Player player : Sclat.getPlugin().getServer().getOnlinePlayers()) { if (block.getWorld() != player.getWorld()) continue; @@ -85,7 +97,7 @@ public void run() { if (!playerList.contains(player)) { PacketPlayOutSpawnEntity fbPacket = new PacketPlayOutSpawnEntity(fb, - net.minecraft.server.v1_14_R1.Block.getCombinedId(ibd)); + net.minecraft.server.v1_15_R1.Block.getCombinedId(ibd)); entityPlayer.playerConnection.sendPacket(fbPacket); PacketPlayOutSpawnEntityLiving asPacket = new PacketPlayOutSpawnEntityLiving(as); entityPlayer.playerConnection.sendPacket(asPacket); @@ -123,7 +135,7 @@ public void run() { } public void startTask() { - this.runTaskTimerAsynchronously(Main.getPlugin(), 0, 5); + this.runTaskTimerAsynchronously(Sclat.getPlugin(), 0, 5); } public void stopTask() { diff --git a/src/main/java/be4rjp/sclat/data/WiremeshListTask.java b/src/main/java/be4rjp/sclat/api/wiremesh/WiremeshListTask.java similarity index 93% rename from src/main/java/be4rjp/sclat/data/WiremeshListTask.java rename to src/main/java/be4rjp/sclat/api/wiremesh/WiremeshListTask.java index d91dfbf..d2b89e7 100644 --- a/src/main/java/be4rjp/sclat/data/WiremeshListTask.java +++ b/src/main/java/be4rjp/sclat/api/wiremesh/WiremeshListTask.java @@ -1,14 +1,16 @@ -package be4rjp.sclat.data; +package be4rjp.sclat.api.wiremesh; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import be4rjp.sclat.data.RegionBlocks; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * * @author Be4rJP @@ -52,8 +54,6 @@ public List getWiremeshsList() { } public void stopTask() { - wiremeshsList.forEach((wm) -> { - wm.stopTask(); - }); + wiremeshsList.forEach(Wiremesh::stopTask); } } diff --git a/src/main/java/be4rjp/sclat/commands/CommanderType.java b/src/main/java/be4rjp/sclat/commands/CommanderType.java deleted file mode 100644 index c2962a0..0000000 --- a/src/main/java/be4rjp/sclat/commands/CommanderType.java +++ /dev/null @@ -1,5 +0,0 @@ -package be4rjp.sclat.commands; - -public enum CommanderType { - MEMBER, ADMIN, CONSOLE -} diff --git a/src/main/java/be4rjp/sclat/commands/SclatCommand.java b/src/main/java/be4rjp/sclat/commands/SclatCommand.java new file mode 100644 index 0000000..92316c5 --- /dev/null +++ b/src/main/java/be4rjp/sclat/commands/SclatCommand.java @@ -0,0 +1,186 @@ +package be4rjp.sclat.commands; + +import be4rjp.sclat.Sclat; +import be4rjp.sclat.api.BungeeCordAPI; +import be4rjp.sclat.api.MessageType; +import be4rjp.sclat.api.SclatUtil; +import be4rjp.sclat.api.SoundType; +import be4rjp.sclat.api.equipment.EquipmentClient; +import be4rjp.sclat.api.status.ServerStatus; +import be4rjp.sclat.data.DataMgr; +import be4rjp.sclat.emblem.EmblemManager; +import be4rjp.sclat.manager.ServerStatusManager; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.bukkit.contexts.OnlinePlayer; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static be4rjp.sclat.Sclat.conf; + +@CommandAlias("sclat") +@CommandPermission("sclat.admin") +public class SclatCommand extends BaseCommand { + private final Sclat plugin; + public SclatCommand(Sclat plugin) { + this.plugin = plugin; + } + + @Subcommand("setUpdateRate") + public void onSetUpdateRate(CommandSender sender, int rate) { + conf.getConfig().set("BlockUpdateRate", rate); + sender.sendMessage("setConfig [BlockUpdateRate] : " + rate); + } + + @Subcommand("fly") + @CommandCompletion("*") + public void onFly(CommandSender sender, OnlinePlayer targetPlayer) { + String playerName = targetPlayer.player.getName(); + Sclat.flyList.add(playerName); + sender.sendMessage(String.format("%s was added to flyList", playerName)); + } + + @Subcommand("reloadEmblems") + public void onReloadEmblems(CommandSender sender) { + conf.loadEmblemLoreData(); + conf.loadEmblemUserData(); + sender.sendMessage("称号のデータを再読み込みしました。"); + } + + @Subcommand("migrateEmblems") + public void onMigrateEmblems(CommandSender sender) { + if (!conf.emblemsFile.exists()) { + sender.sendMessage(ChatColor.RED + "Old emblem userdata file isn't exists."); + return; + } + + YamlConfiguration oldData = YamlConfiguration.loadConfiguration(conf.emblemsFile); + Set dataUuids = oldData.getKeys(false); + for (String _uuid : dataUuids) { + List userEmblems = oldData.getStringList(_uuid); + for (String emblem : userEmblems) { + conf.getEmblemUserdata().set(_uuid + "." + emblem, 1); + } + } + sender.sendMessage(ChatColor.GREEN + "Migration was succeeded!"); + + try { + conf.saveEmblemUserdata(); + sender.sendMessage(ChatColor.GREEN + "Successfully to save emblem userdata"); + } catch (IOException e) { + sender.sendMessage(ChatColor.RED + "Failed to save emblem userdata"); + e.printStackTrace(); + } + } + + @Subcommand("saveEmblems") + public void onSaveEmblems(CommandSender sender) { + try { + conf.saveEmblemUserdata(); + sender.sendMessage(ChatColor.GREEN + "Successfully to save emblem userdata"); + } catch (IOException e) { + sender.sendMessage(ChatColor.RED + "Failed to save emblem userdata"); + e.printStackTrace(); + } + } + + @Subcommand("checkEmblems") + public void onCheckEmblems(CommandSender sender) { + Map> dataMap = EmblemManager.getDataMap(); + for (String _key : dataMap.keySet()) { + sender.sendMessage(_key); + Map playerUuids = dataMap.getOrDefault(_key, new HashMap<>()); + playerUuids.forEach((k, v) -> sender.sendMessage("- " + k + ": " + v)); + } + } + + @Subcommand("mod") + public void onMod(CommandSender sender, String serverName) { + if (sender instanceof Player) { + for (ServerStatus ss : ServerStatusManager.serverList) { + if (ss.getServerName().equals(serverName)) { + List commands = new ArrayList<>(); + commands.add("mod " + sender.getName()); + commands.add("stop"); + // Todo: use redis. fallbacks PluginMessaging + EquipmentClient sc = new EquipmentClient( + conf.getConfig().getString("EquipShare." + serverName + ".Host"), + conf.getConfig().getInt("EquipShare." + serverName + ".Port"), commands); + sc.startClient(); + + SclatUtil.sendMessage("Moderatorとして転送中...", MessageType.PLAYER, (Player) sender); + SclatUtil.sendMessage("2秒後に転送されます", MessageType.PLAYER, (Player) sender); + SclatUtil.playGameSound((Player) sender, SoundType.SUCCESS); + + BukkitRunnable task = new BukkitRunnable() { + @Override + public void run() { + try { + BungeeCordAPI.PlayerSendServer((Player) sender, ss.getServerName()); + DataMgr.getPlayerData((Player) sender).setServerName(ss.getDisplayName()); + } catch (Exception ignored) { + } + } + }; + task.runTaskLater(Sclat.getPlugin(), 40); + } + } + } else { + sender.sendMessage(ChatColor.RED + "This command is player only."); + } + } + + @Subcommand("ss") + @CommandPermission("sclat.admin") + public class SS extends BaseCommand { + public void onMT(CommandSender sender, String server, boolean toMaintenance) { + for (ServerStatus ss : ServerStatusManager.serverList) { + if (ss.getServerName().equals(server)) { + ss.setMaintenance(toMaintenance); + sender.sendMessage("Switched " + ss.getDisplayName() + " §rto " + + (toMaintenance ? "§cMAINTENANCE" : "§6NORMAL")); + return; + } + } + } + } + + @Subcommand("tutorial") + public class Tutorial extends BaseCommand { + @Subcommand("add") + public void onAdd(CommandSender sender, String server) { + List list = Sclat.tutorialServers.getConfig().getStringList("server-list"); + if (!list.contains(server)) { + list.add(server); + Sclat.tutorialServers.getConfig().set("server-list", list); + } else { + sender.sendMessage(ChatColor.RED + "This server is already exist."); + } + } + + @Subcommand("list") + public void onList(CommandSender sender) { + List list = Sclat.tutorialServers.getConfig().getStringList("server-list"); + sender.sendMessage(list.toString()); + } + + @Subcommand("reload") + public void onReload(CommandSender sender) { + Sclat.tutorialServers.reloadConfig(); + sender.sendMessage(ChatColor.GREEN + "Tutorial config was reloaded!"); + } + } +} diff --git a/src/main/java/be4rjp/sclat/commands/sclatCommandExecutor.java b/src/main/java/be4rjp/sclat/commands/sclatCommandExecutor.java deleted file mode 100644 index db053fc..0000000 --- a/src/main/java/be4rjp/sclat/commands/sclatCommandExecutor.java +++ /dev/null @@ -1,363 +0,0 @@ -package be4rjp.sclat.commands; - -import be4rjp.sclat.Main; -import be4rjp.sclat.api.MessageType; -import be4rjp.sclat.api.Sclat; -import be4rjp.sclat.api.ServerType; -import be4rjp.sclat.api.SoundType; -import be4rjp.sclat.data.DataMgr; -import be4rjp.sclat.data.ServerStatus; -import be4rjp.sclat.emblem.EmblemManager; -import be4rjp.sclat.manager.BungeeCordMgr; -import be4rjp.sclat.manager.ServerStatusManager; -import be4rjp.sclat.server.EquipmentClient; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static be4rjp.sclat.Main.conf; - -//sclat Command -public class sclatCommandExecutor implements CommandExecutor, TabExecutor { - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String commandLabel, - String[] args) { - if (args == null) - return false; - if (args.length == 0) - return false; - - // ------------------------Check sender type----------------------------- - CommanderType type = CommanderType.CONSOLE; - if (sender instanceof Player) { - if (sender.hasPermission("sclat.admin")) - type = CommanderType.ADMIN; - else - type = CommanderType.MEMBER; - } - // ---------------------------------------------------------------------- - - // -------------------------/sclat setUpdateRate---------------------------- - if (args[0].equalsIgnoreCase("setUpdateRate") || args[0].equalsIgnoreCase("sur")) { - if (args.length != 2) - return false; - - if (type == CommanderType.MEMBER) { - sender.sendMessage(ChatColor.RED + "You don't have permission."); - Sclat.playGameSound((Player) sender, SoundType.ERROR); - return true; - } - - String num = args[1]; - if (Sclat.isNumber(num)) { - Main.conf.getConfig().set("BlockUpdateRate", Integer.valueOf(num)); - sender.sendMessage("setConfig [BlockUpdateRate] : " + num); - return true; - } else { - sender.sendMessage("Please type with number"); - return false; - } - } - // ------------------------------------------------------------------------- - - // ----------------------------/sclat fly----------------------------------- - if (args[0].equalsIgnoreCase("fly")) { - if (args.length != 2) - return false; - - if (type == CommanderType.MEMBER) { - sender.sendMessage(ChatColor.RED + "You don't have permission."); - Sclat.playGameSound((Player) sender, SoundType.ERROR); - return true; - } - - String playerName = args[1]; - for (Player player : Main.getPlugin().getServer().getOnlinePlayers()) { - if (playerName.equals(player.getName())) { - Main.flyList.add(playerName); - return true; - } - } - } - // ------------------------------------------------------------------------- - - // ----- /sclat refresh-config----- - if (args[0].equalsIgnoreCase("refresh-config")) { - if (args.length != 2) - return false; - - if (type == CommanderType.MEMBER) { - sender.sendMessage(ChatColor.RED + "You don't have permission."); - Sclat.playGameSound((Player) sender, SoundType.ERROR); - return true; - } - - if (sender instanceof Player) { - Player player = (Player) sender; - String targetConfig = args[1]; - Sclat.sendMessage(String.format("%sの設定を再読み込み中...", targetConfig), MessageType.PLAYER, player); - switch (targetConfig.toLowerCase()) { - case "emblemuserdata" : - conf.loadEmblemUserData(); - break; - case "emblemloredata" : - conf.loadEmblemLoreData(); - break; - default : - Sclat.sendMessage("そのオプションは存在しません!", MessageType.PLAYER, player); - return true; - } - Sclat.sendMessage("再読み込み完了", MessageType.PLAYER, player); - } - } - // -------------------------------- - - // ----------------/sclat migrate-emblems----------------- - if (args[0].equalsIgnoreCase("migrate-emblems")) { - if (args.length != 1) - return false; - - if (type == CommanderType.MEMBER) { - sender.sendMessage(ChatColor.RED + "You don't have permission."); - Sclat.playGameSound((Player) sender, SoundType.ERROR); - return true; - } - - if (!conf.emblemsFile.exists()) { - sender.sendMessage(ChatColor.RED + "Old emblem userdata file isn't exists."); - return true; - } - - YamlConfiguration oldData = YamlConfiguration.loadConfiguration(conf.emblemsFile); - Set dataUuids = oldData.getKeys(false); - for (String _uuid : dataUuids) { - List userEmblems = oldData.getStringList(_uuid); - for (String emblem : userEmblems) { - conf.getEmblemUserdata().set(_uuid + "." + emblem, 1); - } - } - sender.sendMessage(ChatColor.GREEN + "Migration was succeeded!"); - - try { - conf.saveEmblemUserdata(); - sender.sendMessage(ChatColor.GREEN + "Successfully to save emblem userdata"); - } catch (IOException e) { - sender.sendMessage(ChatColor.RED + "Failed to save emblem userdata"); - e.printStackTrace(); - } - return true; - } - // ------------------------------------------------------- - - // ----------------/sclat save-emblems-------------------- - if (args[0].equalsIgnoreCase("save-emblems")) { - if (args.length != 1) - return false; - - if (type == CommanderType.MEMBER) { - sender.sendMessage(ChatColor.RED + "You don't have permission."); - Sclat.playGameSound((Player) sender, SoundType.ERROR); - return true; - } - - try { - conf.saveEmblemUserdata(); - sender.sendMessage(ChatColor.GREEN + "Successfully to save emblem userdata"); - } catch (IOException e) { - sender.sendMessage(ChatColor.RED + "Failed to save emblem userdata"); - e.printStackTrace(); - } - return true; - } - // ------------------------------------------------------- - - // ----------------/sclat check-emblems------------------- - if (args[0].equalsIgnoreCase("check-emblems")) { - if (args.length != 1) - return false; - - if (type == CommanderType.MEMBER) { - sender.sendMessage(ChatColor.RED + "You don't have permission."); - Sclat.playGameSound((Player) sender, SoundType.ERROR); - return true; - } - - Map> dataMap = EmblemManager.getDataMap(); - for (String _key : dataMap.keySet()) { - sender.sendMessage(_key); - Map playerUuids = dataMap.getOrDefault(_key, new HashMap<>()); - playerUuids.forEach((k, v) -> sender.sendMessage("- " + k + ": " + v)); - } - } - // -------------------------------------------------------- - - // ----------------------------/sclat mod----------------------------------- - if (args[0].equalsIgnoreCase("mod")) { - if (args.length != 2) - return false; - - if (type == CommanderType.MEMBER) { - sender.sendMessage(ChatColor.RED + "You don't have permission."); - Sclat.playGameSound((Player) sender, SoundType.ERROR); - return true; - } - - if (sender instanceof Player) { - String serverName = args[1]; - for (ServerStatus ss : ServerStatusManager.serverList) { - if (ss.getServerName().equals(serverName)) { - List commands = new ArrayList<>(); - commands.add("mod " + sender.getName()); - commands.add("stop"); - EquipmentClient sc = new EquipmentClient( - conf.getConfig().getString("EquipShare." + serverName + ".Host"), - conf.getConfig().getInt("EquipShare." + serverName + ".Port"), commands); - sc.startClient(); - - Sclat.sendMessage("Moderatorとして転送中...", MessageType.PLAYER, (Player) sender); - Sclat.sendMessage("2秒後に転送されます", MessageType.PLAYER, (Player) sender); - Sclat.playGameSound((Player) sender, SoundType.SUCCESS); - - BukkitRunnable task = new BukkitRunnable() { - @Override - public void run() { - try { - BungeeCordMgr.PlayerSendServer((Player) sender, ss.getServerName()); - DataMgr.getPlayerData((Player) sender).setServerName(ss.getDisplayName()); - } catch (Exception ignored) { - } - } - }; - task.runTaskLater(Main.getPlugin(), 40); - } - } - return true; - } else { - return false; - } - - } - // ------------------------------------------------------------------------- - - // ------------------/sclat ss --------------------- - if (args[0].equalsIgnoreCase("ss")) { - if (args.length < 4 || Main.type != ServerType.LOBBY) - return false; - - if (type == CommanderType.MEMBER) { - sender.sendMessage(ChatColor.RED + "You don't have permission."); - Sclat.playGameSound((Player) sender, SoundType.ERROR); - return true; - } - - if (args[1].equals("mt")) { - String server = args[2]; - for (ServerStatus ss : ServerStatusManager.serverList) { - if (ss.getServerName().equals(server)) { - ss.setMaintenance(args[3].equals("true")); - sender.sendMessage("Switched " + ss.getDisplayName() + " §rto " - + (args[3].equals("true") ? "§cMAINTENANCE" : "§6NORMAL")); - return true; - } - } - } - } - // ------------------------------------------------------------------------- - - // ---------------------/sclat tutorial