From 4e8152d28220c471d464128df9f3c2e89efa6d00 Mon Sep 17 00:00:00 2001 From: jojo Date: Sun, 31 May 2020 18:56:50 +0200 Subject: [PATCH 1/8] Add GamemodeCommand --- .../de/steamwar/fightsystem/FightSystem.java | 11 +++ .../fightsystem/commands/CommandInjector.java | 24 +++++ .../fightsystem/commands/GamemodeCommand.java | 88 +++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 FightSystem_Main/src/de/steamwar/fightsystem/commands/CommandInjector.java create mode 100644 FightSystem_Main/src/de/steamwar/fightsystem/commands/GamemodeCommand.java diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java index fa6e642..0e0fe09 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java @@ -1,5 +1,6 @@ package de.steamwar.fightsystem; +import de.steamwar.core.CommandRemover; import de.steamwar.core.Core; import de.steamwar.fightsystem.commands.*; import de.steamwar.fightsystem.countdown.*; @@ -23,6 +24,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.logging.Level; public class FightSystem extends JavaPlugin { @@ -47,6 +49,15 @@ public class FightSystem extends JavaPlugin { TechHider.init(); FightScoreboard.init(); + try { + CommandRemover.removeAll("gamemode"); + CommandInjector.injectCommand(new GamemodeCommand()); + } catch (Exception e) { + getLogger().log(Level.SEVERE, "Failed to replace commands", e); + Bukkit.shutdown(); + return; + } + new EntityDamageListener(); new EntityExplodeListener(); new FoodLevelChangeListener(); diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/CommandInjector.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/CommandInjector.java new file mode 100644 index 0000000..7864bec --- /dev/null +++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/CommandInjector.java @@ -0,0 +1,24 @@ +package de.steamwar.fightsystem.commands; + +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.SimpleCommandMap; + +import java.lang.reflect.Field; + +public class CommandInjector { + + private CommandInjector(){} + + private static final String PACKAGE_NAME = Bukkit.getServer().getClass().getPackage().getName(); + private static final String VERSION = PACKAGE_NAME.substring(PACKAGE_NAME.lastIndexOf('.') + 1); + + public static void injectCommand(Command cmd) throws Exception { + Class serverClass = Class.forName("org.bukkit.craftbukkit." + VERSION + ".CraftServer"); + Field f1 = serverClass.getDeclaredField("commandMap"); + f1.setAccessible(true); + SimpleCommandMap commandMap = (SimpleCommandMap) f1.get(Bukkit.getServer()); + commandMap.register("BauSystem", cmd); + } +} + diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/GamemodeCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/GamemodeCommand.java new file mode 100644 index 0000000..97de445 --- /dev/null +++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/GamemodeCommand.java @@ -0,0 +1,88 @@ +package de.steamwar.fightsystem.commands; + +import com.google.common.collect.ImmutableList; +import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.FightSystem; +import org.apache.commons.lang.Validate; +import org.bukkit.GameMode; +import org.bukkit.command.CommandSender; +import org.bukkit.command.defaults.BukkitCommand; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +public class GamemodeCommand extends BukkitCommand { + + private static final List GAMEMODE_NAMES = ImmutableList.of("adventure", "creative", "survival", + "spectator"); + + public GamemodeCommand() { + super("gamemode"); + List aliases = new ArrayList<>(); + aliases.add("gm"); + this.setAliases(aliases); + this.description = "Ändert den Spielmodus eines Spielers"; + this.usageMessage = "/gm [Spielmodus]"; + } + + public boolean execute(CommandSender sender, String currentAlias, String[] args) { + if (!(sender instanceof Player)) { + return false; + }else if (args.length == 0) { + sender.sendMessage(FightSystem.PREFIX + this.usageMessage); + return false; + } + + Player p = (Player) sender; + + if (!(Config.test() || p == FightSystem.getEventLeiter())) { + p.sendMessage(FightSystem.PREFIX + "§cDu darfst hier deinen Spielmodus nicht ändern"); + return false; + } + + GameMode mode = createMode(args[0]); + + if(mode == null){ + p.sendMessage(FightSystem.PREFIX + "§cUnbekannter Spielmodus"); + return false; + } + + p.setGameMode(mode); + return true; + } + + @SuppressWarnings("deprecation") + private GameMode createMode(String modeArg){ + try { + return GameMode.getByValue(Integer.parseInt(modeArg)); + } catch (NumberFormatException ignored) { + if ((modeArg.equalsIgnoreCase("creative")) || (modeArg.equalsIgnoreCase("c"))) + return GameMode.CREATIVE; + else if ((modeArg.equalsIgnoreCase("adventure")) || (modeArg.equalsIgnoreCase("a"))) + return GameMode.ADVENTURE; + else if ((modeArg.equalsIgnoreCase("spectator")) || (modeArg.equalsIgnoreCase("sp"))) + return GameMode.SPECTATOR; + else if ((modeArg.equalsIgnoreCase("survival")) || (modeArg.equalsIgnoreCase("s"))) + return GameMode.SURVIVAL; + } + return null; + } + + @Override + public List tabComplete(CommandSender sender, String alias, String[] args) { + Validate.notNull(sender, "Sender cannot be null"); + Validate.notNull(args, "Arguments cannot be null"); + Validate.notNull(alias, "Alias cannot be null"); + + if (args.length == 1) + return StringUtil.copyPartialMatches(args[0], GAMEMODE_NAMES, + new ArrayList<>(GAMEMODE_NAMES.size())); + if (args.length == 2) { + return super.tabComplete(sender, alias, args); + } + return ImmutableList.of(); + } + +} From 2ee2d744328c4d181fab68c73d7714fd7ee2233e Mon Sep 17 00:00:00 2001 From: Lixfel Date: Wed, 3 Jun 2020 10:38:14 +0200 Subject: [PATCH 2/8] Hotfix watertechko + simplify and speedup Signed-off-by: Lixfel --- .../WinconditionWaterTechKO.java | 51 ++++++------------- 1 file changed, 16 insertions(+), 35 deletions(-) diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java index 3b673a1..0b81775 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java @@ -7,51 +7,35 @@ import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.utils.WaterRemover; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.World; import org.bukkit.scheduler.BukkitTask; import java.util.EnumSet; -import java.util.HashSet; -import java.util.Set; public class WinconditionWaterTechKO extends Wincondition { - private static final Set teamRedWater = new HashSet<>(); - private static final Set teamBlueWater = new HashSet<>(); + private static int teamRedWater; + private static int teamBlueWater; private static final World WORLD = Bukkit.getWorlds().get(0); private BukkitTask task; public WinconditionWaterTechKO() { - super(Config.WaterTechKO, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING, FightState.SPECTATE)); + super(Config.WaterTechKO, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING)); } public static int getTeamBlueWater() { - return teamBlueWater.size(); + return teamBlueWater; } public static int getTeamRedWater() { - return teamRedWater.size(); + return teamRedWater; } @Override public void enable() { - checkForWater(teamRedWater, - Config.TeamRedCornerX, - Config.TeamRedCornerY, - Config.TeamRedCornerZ, - Config.TeamRedCornerX + Config.SchemsizeX, - Config.TeamRedCornerY + Config.SchemsizeY, - Config.TeamRedCornerZ + Config.SchemsizeZ); - checkForWater(teamBlueWater, - Config.TeamBlueCornerX, - Config.TeamBlueCornerY, - Config.TeamBlueCornerZ, - Config.TeamBlueCornerX + Config.SchemsizeX, - Config.TeamBlueCornerY + Config.SchemsizeY, - Config.TeamBlueCornerZ + Config.SchemsizeZ); - task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::addWater, 200, 200); + checkTask(); + task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::checkTask, 200, 200); } @Override @@ -59,25 +43,22 @@ public class WinconditionWaterTechKO extends Wincondition { task.cancel(); } - private void checkEmpty(FightTeam team, Set teamWater){ - if(teamWater.isEmpty()){ + private void checkEmpty(FightTeam team, int teamWater){ + if(teamWater == 0){ Bukkit.broadcastMessage(FightSystem.PREFIX + "§eDas Team " + team.getColoredName() + " §eist Tech K.O.!"); Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> FightSystem.setSpectateState(Fight.getOpposite(team), "WaterTechKO")); } } - private void addWater() { - if(FightSystem.getFightState() != FightState.PRE_RUNNING && FightSystem.getFightState() != FightState.RUNNING) - return; - - checkForWater(teamRedWater, + private void checkTask() { + teamRedWater = calcWater( Config.TeamRedCornerX, Config.TeamRedCornerY, Config.TeamRedCornerZ, Config.TeamRedCornerX + Config.SchemsizeX, Config.TeamRedCornerY + Config.SchemsizeY, Config.TeamRedCornerZ + Config.SchemsizeZ); - checkForWater(teamBlueWater, + teamBlueWater = calcWater( Config.TeamBlueCornerX, Config.TeamBlueCornerY, Config.TeamBlueCornerZ, @@ -89,16 +70,16 @@ public class WinconditionWaterTechKO extends Wincondition { checkEmpty(Fight.getBlueTeam(), teamBlueWater); } - private void checkForWater(Set teamWater, int minX, int minY, int minZ, int maxX, int maxY, int maxZ){ - teamWater.clear(); - + private int calcWater(int minX, int minY, int minZ, int maxX, int maxY, int maxZ){ + int teamWater = 0; for(int x = minX; x <= maxX; x++) { for(int y = minY; y <= maxY; y++) { for (int z = minZ; z <= maxZ; z++) { if (WaterRemover.isWater(WORLD.getBlockAt(x, y, z))) - teamWater.add(new Location(WORLD, x, y, z)); + teamWater++; } } } + return teamWater; } } From ff965cca754f3d2ce074e928fa37bc40995d5098 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Wed, 3 Jun 2020 11:21:50 +0200 Subject: [PATCH 3/8] Sync WaterTechKO-Detector? Signed-off-by: Lixfel --- .../fightsystem/winconditions/WinconditionWaterTechKO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java index 0b81775..7f034c4 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java @@ -35,7 +35,7 @@ public class WinconditionWaterTechKO extends Wincondition { @Override public void enable() { checkTask(); - task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::checkTask, 200, 200); + task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::checkTask, 200, 200); } @Override @@ -46,7 +46,7 @@ public class WinconditionWaterTechKO extends Wincondition { private void checkEmpty(FightTeam team, int teamWater){ if(teamWater == 0){ Bukkit.broadcastMessage(FightSystem.PREFIX + "§eDas Team " + team.getColoredName() + " §eist Tech K.O.!"); - Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> FightSystem.setSpectateState(Fight.getOpposite(team), "WaterTechKO")); + FightSystem.setSpectateState(Fight.getOpposite(team), "WaterTechKO"); } } From 77133bf72a3ead75e467c54c3127271649a69727 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Wed, 3 Jun 2020 11:22:53 +0200 Subject: [PATCH 4/8] Revert "Sync WaterTechKO-Detector?" This reverts commit ff965cca Signed-off-by: Lixfel --- .../fightsystem/winconditions/WinconditionWaterTechKO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java index 7f034c4..0b81775 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java @@ -35,7 +35,7 @@ public class WinconditionWaterTechKO extends Wincondition { @Override public void enable() { checkTask(); - task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::checkTask, 200, 200); + task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::checkTask, 200, 200); } @Override @@ -46,7 +46,7 @@ public class WinconditionWaterTechKO extends Wincondition { private void checkEmpty(FightTeam team, int teamWater){ if(teamWater == 0){ Bukkit.broadcastMessage(FightSystem.PREFIX + "§eDas Team " + team.getColoredName() + " §eist Tech K.O.!"); - FightSystem.setSpectateState(Fight.getOpposite(team), "WaterTechKO"); + Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> FightSystem.setSpectateState(Fight.getOpposite(team), "WaterTechKO")); } } From d462d7d0080eebec0287c46f5466321e828f64e8 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 4 Jun 2020 13:16:54 +0200 Subject: [PATCH 5/8] Hotfix flying in arena issue Signed-off-by: Lixfel --- .../src/de/steamwar/fightsystem/fight/FightTeam.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java index 22e7a21..fde3dbf 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -228,8 +228,15 @@ public class FightTeam implements IFightTeam{ return ready; } + private void allowFlying(boolean fly){ + for(FightPlayer p : players) + if(p.getPlayer() != null) + p.getPlayer().setAllowFlight(fly); + } + public void pasteSchematic(){ FreezeWorld freezer = new FreezeWorld(); + allowFlying(true); DyeColor c = ColorConverter.chat2dye(color); EditSession e; try { @@ -266,6 +273,7 @@ public class FightTeam implements IFightTeam{ broadcast(FightSystem.PREFIX + "§cFehler beim Pasten der Schematic"); throw new SecurityException("Error pasting arena in schematic", ex); } + allowFlying(false); Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> HandlerList.unregisterAll(freezer), 3); Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), this::teleportToSpawn,40); } From eb6f45a485837469a3d0932eebf071e38bae3ce2 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 4 Jun 2020 13:18:46 +0200 Subject: [PATCH 6/8] Hotfix flying in arena issue Signed-off-by: Lixfel --- .../src/de/steamwar/fightsystem/fight/FightTeam.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java index fde3dbf..f2b79ca 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -229,9 +229,12 @@ public class FightTeam implements IFightTeam{ } private void allowFlying(boolean fly){ - for(FightPlayer p : players) - if(p.getPlayer() != null) + for(FightPlayer p : players){ + if(p.getPlayer() != null){ p.getPlayer().setAllowFlight(fly); + p.getPlayer().setFlying(fly); + } + } } public void pasteSchematic(){ From cf8f36630ea3b0b4f0178e2251808cfadd82dc39 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 4 Jun 2020 13:27:28 +0200 Subject: [PATCH 7/8] Hotfix flying in arena issue Signed-off-by: Lixfel --- .../src/de/steamwar/fightsystem/fight/FightTeam.java | 11 ----------- .../listener/FreezeWorldStateListener.java | 7 +++++++ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java index f2b79ca..22e7a21 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -228,18 +228,8 @@ public class FightTeam implements IFightTeam{ return ready; } - private void allowFlying(boolean fly){ - for(FightPlayer p : players){ - if(p.getPlayer() != null){ - p.getPlayer().setAllowFlight(fly); - p.getPlayer().setFlying(fly); - } - } - } - public void pasteSchematic(){ FreezeWorld freezer = new FreezeWorld(); - allowFlying(true); DyeColor c = ColorConverter.chat2dye(color); EditSession e; try { @@ -276,7 +266,6 @@ public class FightTeam implements IFightTeam{ broadcast(FightSystem.PREFIX + "§cFehler beim Pasten der Schematic"); throw new SecurityException("Error pasting arena in schematic", ex); } - allowFlying(false); Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> HandlerList.unregisterAll(freezer), 3); Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), this::teleportToSpawn,40); } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java index b9f59d6..4f6fb2a 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java @@ -13,6 +13,7 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.event.inventory.InventoryPickupItemEvent; import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerKickEvent; import java.util.EnumSet; @@ -47,6 +48,12 @@ public class FreezeWorldStateListener extends BasicListener { event.setCancelled(true); } + @EventHandler + public void handlePlayerKickEvent(PlayerKickEvent e){ + if(e.getReason().equals("Flying is not enabled on this server!")) + e.setCancelled(true); + } + @EventHandler public void onInventoryDrag(InventoryDragEvent event) { if(PersonalKitCreator.notInKitCreator(event.getWhoClicked())) From 51fe8cfbe54cc48b9e8b7f28a3aa19a88d5b5761 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 4 Jun 2020 16:56:14 +0200 Subject: [PATCH 8/8] Hotfix flying in arena issue Signed-off-by: Lixfel --- .../steamwar/fightsystem/listener/FreezeWorldStateListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java index 4f6fb2a..5a16f24 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java @@ -50,7 +50,7 @@ public class FreezeWorldStateListener extends BasicListener { @EventHandler public void handlePlayerKickEvent(PlayerKickEvent e){ - if(e.getReason().equals("Flying is not enabled on this server!")) + if(e.getReason().contains("Flying is not enabled")) e.setCancelled(true); }