diff --git a/FightSystem_12/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper12.java b/FightSystem_12/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper12.java index deef5e6..b8f46e4 100644 --- a/FightSystem_12/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper12.java +++ b/FightSystem_12/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper12.java @@ -24,6 +24,7 @@ import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.SoundCategory; import org.bukkit.entity.Arrow; +import org.bukkit.entity.Player; import org.bukkit.scoreboard.Team; public class WorldOfColorWrapper12 implements WorldOfColorWrapper.IWorldOfColorWrapper { @@ -41,4 +42,9 @@ public class WorldOfColorWrapper12 implements WorldOfColorWrapper.IWorldOfColorW public void playSound(Location location, Sound sound, String soundCategory, float volume, float pitch) { location.getWorld().playSound(location, sound, SoundCategory.valueOf(soundCategory), volume, pitch); } + + @Override + public void sendTitle(Player player, String title, String subtitle, int start, int hold, int stop) { + player.sendTitle(title, subtitle, start, hold, stop); + } } diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/BountifulWrapper8.java b/FightSystem_8/src/de/steamwar/fightsystem/utils/BountifulWrapper8.java index c5b5801..93d59fb 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/utils/BountifulWrapper8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/utils/BountifulWrapper8.java @@ -20,28 +20,32 @@ package de.steamwar.fightsystem.utils; import com.comphenix.tinyprotocol.Reflection; +import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.listener.Recording; import de.steamwar.fightsystem.record.GlobalRecorder; import de.steamwar.fightsystem.record.REntity; import net.md_5.bungee.api.chat.BaseComponent; -import net.minecraft.server.v1_8_R3.ChatComponentText; -import net.minecraft.server.v1_8_R3.PacketPlayOutChat; +import net.minecraft.server.v1_8_R3.*; import net.royawesome.jlibnoise.MathHelper; -import org.bukkit.Effect; -import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.*; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.scoreboard.Team; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; public class BountifulWrapper8 implements BountifulWrapper.IBountifulWrapper { + public BountifulWrapper8() { + EntityEnderDragon dragon = new EntityEnderDragon(null); + dragon.setLocation(Config.ArenaRegion.centerX(), -100, Config.ArenaRegion.centerZ(), 0, 0); + this.spawnDragonId = dragon.getId(); + this.spawnDragon = new PacketPlayOutSpawnEntityLiving(dragon); + } + @Override public boolean mainHand(Object packet) { return true; @@ -157,4 +161,50 @@ public class BountifulWrapper8 implements BountifulWrapper.IBountifulWrapper { equipmentSlot.set(packet, 0); } } + + private final Map barMap = new HashMap<>(); + @Override + public void setBossbar(double leftBlueProgress, double leftRedProgress, String leftBlueText, String leftRedText) { + barMap.clear(); + barMap.put(FightUI.BossBarType.BLUE_LEFT, createPacket(leftBlueProgress, leftBlueText)); + barMap.put(FightUI.BossBarType.RED_LEFT, createPacket(leftRedProgress, leftRedText)); + } + + private PacketPlayOutEntityMetadata createPacket(double progress, String text) { + DataWatcher watcher = new DataWatcher(null); + watcher.a(0, (byte) 0x20); + watcher.a(2, text); + watcher.a(3, (byte) 1); + watcher.a(4, (byte) 1); + watcher.a(6, (float)(progress * 200)); + //watcher.a(10, text); + //watcher.a(11, (byte) 1); + return new PacketPlayOutEntityMetadata(spawnDragonId, watcher, true); + } + + @Override + public void removeFromBar(Player player, FightUI.BossBarType type) { + // not used + } + + @Override + public void addToBar(Player player, FightUI.BossBarType type) { + // not used + } + + private final Set seesDragon = new HashSet<>(); + private final PacketPlayOutSpawnEntityLiving spawnDragon; + private final int spawnDragonId; + @Override + public void broadcastBossbar() { + seesDragon.removeIf(player -> !player.isOnline()); + Bukkit.getOnlinePlayers().forEach(player -> { + if(!seesDragon.contains(player)) { + ((CraftPlayer)player).getHandle().playerConnection.sendPacket(spawnDragon); + seesDragon.add(player); + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(barMap.get(FightUI.getInstance().bossBarType(player))); + }); + } } diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper8.java b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper8.java index dfe0228..96e8665 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper8.java @@ -23,6 +23,7 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.entity.Arrow; +import org.bukkit.entity.Player; import org.bukkit.scoreboard.Team; public class WorldOfColorWrapper8 implements WorldOfColorWrapper.IWorldOfColorWrapper { @@ -40,4 +41,10 @@ public class WorldOfColorWrapper8 implements WorldOfColorWrapper.IWorldOfColorWr public void playSound(Location location, Sound sound, String soundCategory, float volume, float pitch) { location.getWorld().playSound(location, sound, volume, pitch); } + + @SuppressWarnings("deprecation") + @Override + public void sendTitle(Player player, String title, String subtitle, int start, int hold, int stop) { + player.sendTitle(title, subtitle); + } } diff --git a/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java b/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java index dc7dbee..cfeac37 100644 --- a/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java +++ b/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java @@ -20,16 +20,19 @@ package de.steamwar.fightsystem.utils; import com.comphenix.tinyprotocol.Reflection; +import de.steamwar.fightsystem.fight.Fight; +import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.listener.Recording; import de.steamwar.fightsystem.record.GlobalRecorder; import de.steamwar.fightsystem.record.REntity; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.BaseComponent; -import org.bukkit.Material; -import org.bukkit.Particle; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -40,6 +43,8 @@ import org.bukkit.scoreboard.Team; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; public class BountifulWrapper9 implements BountifulWrapper.IBountifulWrapper { @@ -48,6 +53,12 @@ public class BountifulWrapper9 implements BountifulWrapper.IBountifulWrapper { private static final Object mainHand = enumHand.getEnumConstants()[0]; private static final Reflection.FieldAccessor blockPlaceHand = Reflection.getField(Recording.blockPlacePacket, enumHand, 0); + public BountifulWrapper9() { + for(FightUI.BossBarType type : FightUI.BossBarType.values()) { + barMap.put(type, Bukkit.createBossBar(type.name(), BarColor.WHITE, BarStyle.SOLID)); + } + } + @Override public boolean mainHand(Object packet) { return blockPlaceHand.get(packet) == mainHand; @@ -193,4 +204,66 @@ public class BountifulWrapper9 implements BountifulWrapper.IBountifulWrapper { equipmentSlot.set(packet, itemSlots[0]); } } + + private final Map barMap = new HashMap<>(); + @Override + public void setBossbar(double leftBlueProgress, double leftRedProgress, String leftBlueText, String leftRedText) { + setupTeamBar(Fight.getBlueTeam(), barMap.get(FightUI.BossBarType.BLUE_LEFT), leftBlueProgress, leftBlueText); + setupTeamBar(Fight.getRedTeam(), barMap.get(FightUI.BossBarType.RED_LEFT), leftRedProgress, leftRedText); + } + + private void setupTeamBar(FightTeam team, BossBar bar, double progress, String title) { + BarColor color = chat2bar(team.getColor()); + if(bar.getColor() != color) + bar.setColor(color); + + if(bar.getProgress() != progress) + bar.setProgress(progress); + + bar.setTitle(title); + } + + private BarColor chat2bar(ChatColor color) { + switch(color) { + case DARK_BLUE: + case DARK_AQUA: + case BLUE: + case AQUA: + return BarColor.BLUE; + case GREEN: + case DARK_GREEN: + return BarColor.GREEN; + case DARK_RED: + case RED: + return BarColor.RED; + case DARK_PURPLE: + return BarColor.PURPLE; + case GOLD: + case YELLOW: + return BarColor.YELLOW; + case LIGHT_PURPLE: + return BarColor.PINK; + case BLACK: + case WHITE: + case GRAY: + case DARK_GRAY: + default: + return BarColor.WHITE; + } + } + + @Override + public void removeFromBar(Player player, FightUI.BossBarType type) { + barMap.get(type).removePlayer(player); + } + + @Override + public void addToBar(Player player, FightUI.BossBarType type) { + barMap.get(type).addPlayer(player); + } + + @Override + public void broadcastBossbar() { + // Handled by Spigot BossBarAPI + } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index 8c977c4..0e18eca 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -33,6 +33,7 @@ import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.OneShotStateDependent; import de.steamwar.fightsystem.utils.EnterHandler; import de.steamwar.fightsystem.utils.FightStatistics; +import de.steamwar.fightsystem.utils.FightUI; import de.steamwar.fightsystem.utils.TechHider; import de.steamwar.fightsystem.winconditions.*; import de.steamwar.sql.EventFight; @@ -80,13 +81,13 @@ public class FightSystem extends JavaPlugin { new NormalJoin(); new RankedJoin(); new PersonalKitCreator(); - new FightScoreboard(); new ArrowStopper(); new ArrowPickup(); new EnterHandler(); new TechHider(); new FightWorld(); + new FightUI(); new WinconditionAllDead(); new WinconditionCaptainDead(); @@ -129,8 +130,8 @@ public class FightSystem extends JavaPlugin { new LiveRecorder(); new FileRecorder(); - new OneShotStateDependent(ArenaMode.AntiReplay, FightState.PreRunning, () -> FightSystem.broadcast("§aDer Kampf beginnt!")); - new OneShotStateDependent(ArenaMode.AntiReplay, FightState.Running, () -> FightSystem.broadcast("§aArena freigegeben!")); + new OneShotStateDependent(ArenaMode.AntiReplay, FightState.PreRunning, () -> FightUI.addSubtitle("§7Kits verteilt")); + new OneShotStateDependent(ArenaMode.AntiReplay, FightState.Running, () -> FightUI.addSubtitle("§aArena freigegeben")); new OneShotStateDependent(ArenaMode.AntiTest, FightState.Running, FightStatistics::start); try { @@ -182,12 +183,12 @@ public class FightSystem extends JavaPlugin { FightState.setFightState(FightState.RUNNING); } - public static void setSpectateState(FightTeam winFightTeam, String windescription) { + public static void setSpectateState(FightTeam winFightTeam, String windescription, String subtitle) { if(!PacketProcessor.isReplaying()){ if(winFightTeam != null) { - FightSystem.broadcast("§aDas Team " + winFightTeam.getColoredName() + " §ahat gewonnen!"); + FightUI.printWin(winFightTeam.getPrefix() + "Sieg " + winFightTeam.getName(), subtitle); } else { - FightSystem.broadcast("§aKein Team hat gewonnen!"); + FightUI.printWin("§7Unentschieden", subtitle); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/Commands.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/Commands.java index 26bed7c..ed0d06d 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/Commands.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/commands/Commands.java @@ -112,7 +112,6 @@ public class Commands { return; p.sendMessage(FightSystem.PREFIX + "§aDu bist Team " + team.getColoredName() + " §abeigetreten!"); - team.broadcast(FightSystem.PREFIX + "§aDer Spieler §e" + p.getName() + " §aist dem Team beigetreten!"); team.addMember(p); } @@ -125,7 +124,7 @@ public class Commands { return; p.sendMessage(FightSystem.PREFIX + "§aDu hast die Einladung von " + team.getColoredName() + " §aabgelehnt!"); - team.broadcast(FightSystem.PREFIX + "§cDer Spieler §e" + p.getName() + " §chat die Einladung abgelehnt!"); + team.broadcast("§e" + p.getName() + " §chat die Einladung abgelehnt"); team.getInvited().remove(p); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java index 0b960b0..6c4bb00 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java @@ -74,9 +74,9 @@ public class GUI { inv.setItem(2, Material.GLASS, "§7POST_SCHEM_SETUP", (ClickType click) -> FightSystem.setPostSchemState()); inv.setItem(3, Material.GLASS, "§ePRE_RUNNING", (ClickType click) -> FightSystem.setPreRunningState()); inv.setItem(4, Material.GLASS, "§eRUNNING", (ClickType click) -> FightSystem.setRunningState()); - inv.setItem(5, Material.GLASS, "§7SPECTATE Blue", (ClickType click) -> FightSystem.setSpectateState(Fight.getBlueTeam(), "operator")); - inv.setItem(6, Material.GLASS, "§7SPECTATE Red", (ClickType click) -> FightSystem.setSpectateState(Fight.getRedTeam(), "operator")); - inv.setItem(7, Material.GLASS, "§7SPECTATE Tie", (ClickType click) -> FightSystem.setSpectateState(null, "operator")); + inv.setItem(5, Material.GLASS, "§7SPECTATE Blue", (ClickType click) -> FightSystem.setSpectateState(Fight.getBlueTeam(), "operator", null)); + inv.setItem(6, Material.GLASS, "§7SPECTATE Red", (ClickType click) -> FightSystem.setSpectateState(Fight.getRedTeam(), "operator", null)); + inv.setItem(7, Material.GLASS, "§7SPECTATE Tie", (ClickType click) -> FightSystem.setSpectateState(null, "operator", null)); inv.setCallback(-999, (ClickType click) -> p.closeInventory()); inv.open(); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/LockschemCommand.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/LockschemCommand.java index 27dbb97..ebb172e 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/LockschemCommand.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/commands/LockschemCommand.java @@ -70,7 +70,7 @@ public class LockschemCommand implements CommandExecutor { } Schematic.getSchemFromDB(fightTeam.getSchematic()).setSchemType(SchematicType.Normal); player.sendMessage(FightSystem.PREFIX + "Schematic von " + fightTeam.getColoredName() + " §cgesperrt!"); - fightTeam.broadcast(FightSystem.PREFIX + "§cDie Schematic wurde von " + player.getName() + " gesperrt!"); + fightTeam.broadcast("§cDie Schematic wurde von " + player.getName() + " gesperrt"); return false; } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/WinCommand.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/WinCommand.java index d2a18ea..776c4a0 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/WinCommand.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/commands/WinCommand.java @@ -33,15 +33,12 @@ public class WinCommand implements CommandExecutor { return false; } - if(args[0].equalsIgnoreCase(Fight.getBlueTeam().getName())){ - FightSystem.broadcast("§cDer Kampfleiter hat den Kampf entschieden!"); - FightSystem.setSpectateState(Fight.getBlueTeam(), "Referee"); + if(args[0].equalsIgnoreCase("tie")){ + FightSystem.setSpectateState(null, "Referee", "§7Kampfleiterentscheidung"); + }else if(args[0].equalsIgnoreCase(Fight.getBlueTeam().getName())){ + FightSystem.setSpectateState(Fight.getBlueTeam(), "Referee", "§7Kampfleiterentscheidung"); }else if(args[0].equalsIgnoreCase(Fight.getRedTeam().getName())){ - FightSystem.broadcast("§cDer Kampfleiter hat den Kampf entschieden!"); - FightSystem.setSpectateState(Fight.getRedTeam(), "Referee"); - }else if(args[0].equalsIgnoreCase("tie")){ - FightSystem.broadcast("§cDer Kampfleiter hat den Kampf entschieden!"); - FightSystem.setSpectateState(null, "Referee"); + FightSystem.setSpectateState(Fight.getRedTeam(), "Referee", "§7Kampfleiterentscheidung"); } return false; } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/countdown/Countdown.java b/FightSystem_Core/src/de/steamwar/fightsystem/countdown/Countdown.java index 565bd04..8c8997f 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/countdown/Countdown.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/countdown/Countdown.java @@ -23,6 +23,7 @@ import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.listener.BasicListener; import de.steamwar.fightsystem.record.GlobalRecorder; +import de.steamwar.fightsystem.utils.FightUI; import de.steamwar.fightsystem.utils.SWSound; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.TextComponent; @@ -86,7 +87,7 @@ public abstract class Countdown { countdown.show(); } - FightSystem.broadcast("§aBeide Teams waren damit einverstanden, zum nächsten Event zu beschleunigen!"); + FightUI.addSubtitle("§7Sprung zum nächsten Ereignis"); } private void broadcast(String message){ diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/countdown/TimeOverCountdown.java b/FightSystem_Core/src/de/steamwar/fightsystem/countdown/TimeOverCountdown.java index 30659cb..5232087 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/countdown/TimeOverCountdown.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/countdown/TimeOverCountdown.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem.countdown; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.utils.SWSound; public class TimeOverCountdown extends Countdown { @@ -39,7 +38,6 @@ public class TimeOverCountdown extends Countdown { @Override public void countdownFinished() { - FightSystem.broadcast("§aZeit abgelaufen!"); timeOver.run(); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java index 159317d..2c91709 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java @@ -72,7 +72,7 @@ public class FightSchematic extends StateDependent { try { clipboard = schem.load(); } catch (IOException e) { - team.broadcast(FightSystem.PREFIX + "§cSchematic konnte nicht geladen werden!"); + team.broadcast("§cSchematic konnte nicht geladen werden"); Bukkit.getLogger().log(Level.SEVERE, e, () -> "Couldn't load Schematic " + schem.getSchemName()); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java index be1f4b5..7696963 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -34,6 +34,8 @@ import de.steamwar.fightsystem.utils.*; import de.steamwar.inventory.SWItem; import de.steamwar.sql.Schematic; import de.steamwar.sql.SteamwarUser; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.*; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; @@ -42,6 +44,7 @@ import org.bukkit.scoreboard.NameTagVisibility; import org.bukkit.scoreboard.Team; import java.util.*; +import java.util.logging.Level; public class FightTeam { @@ -184,7 +187,14 @@ public class FightTeam { } public void broadcast(String message) { - players.forEach((player, fp) -> player.sendMessage(message)); + BaseComponent[] msg = TextComponent.fromLegacyText(message); + players.forEach((player, fp) -> BountifulWrapper.impl.toActionbar(player, msg)); + } + + public void broadcastChat(String message) { + FightSystem.getPlugin().getLogger().log(Level.INFO, message); + BaseComponent[] msg = TextComponent.fromLegacyText(message); + players.forEach((player, fp) -> BountifulWrapper.impl.toChat(player, msg)); } public void addMember(Player player) { @@ -210,6 +220,8 @@ public class FightTeam { if(isLeaderless()) setLeader(fightPlayer); + else + FightUI.addSubtitle("§a§l» " + prefix + player.getName()); } public void removePlayer(Player player) { @@ -220,8 +232,10 @@ public class FightTeam { players.remove(player); team.removeEntry(player.getName()); + FightUI.addSubtitle("§c§l« " + prefix + player.getName()); + if(fightPlayer.equals(leader)) - setLeader(null); + removeLeader(); GlobalRecorder.getInstance().entityDespawns(player); Fight.setPlayerGamemode(player, GameMode.SPECTATOR); @@ -247,17 +261,16 @@ public class FightTeam { return leader; } - private void setLeader(FightPlayer leader) { - if (leader == null) { - this.leader = null; - if(!players.isEmpty()) { - setLeader(players.values().iterator().next()); - FightSystem.broadcast("§aDer Spieler §e" + this.leader.getPlayer().getName() + " §aist nun Leader von Team " + getColoredName() + "§a!"); - }else if(FightState.getFightState() != FightState.PRE_LEADER_SETUP && !ArenaMode.RankedEvent.contains(Config.mode)){ - Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), FightSystem::setPreLeaderState, 1); - } - return; + private void removeLeader() { + this.leader = null; + if(!players.isEmpty()) { + setLeader(players.values().iterator().next()); + }else if(FightState.getFightState() != FightState.PRE_LEADER_SETUP && !ArenaMode.RankedEvent.contains(Config.mode)){ + Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), FightSystem::setPreLeaderState, 1); } + } + + private void setLeader(FightPlayer leader) { PersonalKitCreator.closeIfInKitCreator(leader.getPlayer()); this.leader = leader; @@ -265,6 +278,8 @@ public class FightTeam { if(ready) setReady(false); + FightUI.addSubtitle("§a§l» " + prefix + "Leader " + leader.getPlayer().getName()); + Optional maxRank = Schematic.getSchemsOfType(leader.getPlayer().getUniqueId(), Config.SchematicType).stream().map(Schematic::getRank).max(Integer::compare); if(Config.RanksEnabled) schemRank = maxRank.orElse(1); @@ -329,40 +344,40 @@ public class FightTeam { public void setSchem(Schematic schematic){ this.schematic.setSchematic(schematic); - broadcast(FightSystem.PREFIX + "§7Das §e" + Config.GameName + " " + schematic.getSchemName() + " §7wird für den Kampf verwendet!"); + broadcast("§e" + Config.GameName + " " + schematic.getSchemName() + " §7gewählt"); } public void setReady(boolean ready) { Player l = leader.getPlayer(); if(!schematic.hasSchematic()){ - l.sendMessage(FightSystem.PREFIX + "§cZuerst muss eine Schematic gewählt sein!"); + BountifulWrapper.impl.toActionbar(l, TextComponent.fromLegacyText("§cZuerst muss eine Schematic gewählt sein!")); return; } this.ready = ready; if(ready) { l.getInventory().setItem(4, new ItemBuilder(SWItem.getDye(8), (short) 8).removeAllAttributs().addEnchantment(Enchantment.DURABILITY,1 ).setDisplayName("§aBereit").build()); - broadcast(FightSystem.PREFIX + "§aEuer Team ist nun bereit!"); + broadcast("§aTeam bereit"); if(Fight.getOpposite(this).isReady() || ArenaMode.SoloLeader.contains(Config.mode)) FightSystem.setPreRunningState(); } else { l.getInventory().setItem(4, new ItemBuilder(SWItem.getDye(10), (short) 10).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§cNicht bereit").build()); - broadcast(FightSystem.PREFIX + "§cEuer Team ist nicht mehr bereit!"); + broadcast("§c§mTeam bereit"); } } public void skip(){ this.skip = !skip; if(skip){ - broadcast(FightSystem.PREFIX + "§aEuer Team ist nun bereit, zum nächsten Event zu beschleunigen!"); + broadcast("§aBeschleunigung zum nächsten Event"); if(Fight.getOpposite(this).skip || Config.test()){ skip = false; Fight.getOpposite(this).skip = false; Countdown.skip(); } }else{ - broadcast(FightSystem.PREFIX + "§cEuer Team ist nicht mehr bereit, zum nächsten Event zu beschleunigen!"); + broadcast("§c§mBeschleunigung zum nächsten Event"); } } @@ -390,19 +405,21 @@ public class FightTeam { return spawn; } + public double getCurrentHearts() { + return players.values().stream().filter(FightPlayer::isLiving).mapToDouble(fp -> fp.getPlayer().getHealth()).sum(); + } + public double getHeartRatio(){ - int maximumHearts = 0; - double currentHearts = 0; - for(FightPlayer fightPlayer : players.values()){ - maximumHearts += 20; - if(!fightPlayer.isLiving()) - continue; + int maximumHearts = players.size() * 20; + return maximumHearts != 0 ? getCurrentHearts() / maximumHearts : 0; + } - currentHearts += fightPlayer.getPlayer().getHealth(); - } + public int getPlayerCount() { + return players.size(); + } - assert maximumHearts != 0; - return currentHearts / maximumHearts; + public int getAlivePlayers() { + return (int) players.values().stream().filter(FightPlayer::isLiving).count(); } public ChatColor getColor() { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Chat.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Chat.java index 21fdd77..ec5ee6b 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Chat.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Chat.java @@ -36,6 +36,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; +import java.util.logging.Level; + public class Chat implements Listener { public Chat(){ @@ -51,7 +53,7 @@ public class Chat implements Listener { if(fightTeam != null) { String teamName = fightTeam.getColoredName(); if(message.startsWith(Config.TeamChatDetection)) { - fightTeam.broadcast(teamName + " " + player.getName() + "» " + message.substring(1)); + fightTeam.broadcastChat(teamName + " " + player.getName() + "» " + message.substring(1)); } else { broadcastChat(teamName + " " + player.getName() + "§8» §7" + message); } @@ -66,6 +68,7 @@ public class Chat implements Listener { private void broadcastChat(String message) { GlobalRecorder.getInstance().chat(message); + FightSystem.getPlugin().getLogger().log(Level.INFO, message); BaseComponent[] msg = TextComponent.fromLegacyText(message); for(Player p : Bukkit.getOnlinePlayers()) BountifulWrapper.impl.toChat(p, msg); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/FightScoreboard.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/FightScoreboard.java index c747520..957f085 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/FightScoreboard.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/FightScoreboard.java @@ -19,18 +19,9 @@ package de.steamwar.fightsystem.listener; -import de.steamwar.core.TPSWatcher; import de.steamwar.fightsystem.ArenaMode; -import de.steamwar.fightsystem.countdown.Countdown; -import de.steamwar.fightsystem.fight.Fight; -import de.steamwar.fightsystem.fight.FightTeam; -import de.steamwar.fightsystem.record.GlobalRecorder; -import de.steamwar.fightsystem.record.PacketProcessor; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; -import de.steamwar.fightsystem.states.StateDependentTask; -import de.steamwar.fightsystem.winconditions.PrintableWincondition; -import de.steamwar.fightsystem.winconditions.Wincondition; import de.steamwar.scoreboard.SWScoreboard; import de.steamwar.scoreboard.ScoreboardCallback; import org.bukkit.Bukkit; @@ -40,7 +31,8 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.scoreboard.Scoreboard; -import java.util.*; +import java.util.HashMap; +import java.util.Objects; public class FightScoreboard implements Listener, ScoreboardCallback { @@ -48,23 +40,21 @@ public class FightScoreboard implements Listener, ScoreboardCallback { return Objects.requireNonNull(Bukkit.getScoreboardManager()).getMainScoreboard(); } - private static final Set fullScoreboard = EnumSet.of(FightState.RUNNING, FightState.SPECTATE); private static FightScoreboard scoreboard; public static FightScoreboard getScoreboard(){ + if(scoreboard == null) + scoreboard = new FightScoreboard(); return scoreboard; } - private int index = 0; - private String title = ""; private final HashMap scores = new HashMap<>(); - public FightScoreboard(){ - new StateDependentListener(ArenaMode.AntiReplay, FightState.All, this); - new StateDependentTask(ArenaMode.AntiReplay, FightState.All, this::updateScoreboard, 0, 20); - scoreboard = this; + private FightScoreboard(){ + new StateDependentListener(ArenaMode.Replay, FightState.All, this); + Bukkit.getOnlinePlayers().forEach(player -> SWScoreboard.createScoreboard(player, this)); } @EventHandler @@ -77,63 +67,13 @@ public class FightScoreboard implements Listener, ScoreboardCallback { SWScoreboard.removeScoreboard(event.getPlayer()); } - private void generalScoreboard(){ - setTitle("§eKampf"); - List scoreList = new ArrayList<>(); - - Countdown timeOverCountdown = Wincondition.getTimeOverCountdown(); - if(timeOverCountdown != null){ - int fightTime = timeOverCountdown.getTimeLeft(); - if (fightTime >= 60) - scoreList.add("§7Zeit: §a" + fightTime / 60 + "m " + fightTime % 60 + "s"); - else - scoreList.add("§7Zeit: §a" + fightTime + "s"); - } - - scoreList.add("§7TPS: §e" + TPSWatcher.getTPS()); - - if(fullScoreboard.contains(FightState.getFightState())){ - for(PrintableWincondition wincondition : Wincondition.getPrintableWinconditions()){ - scoreList.add(wincondition.getDisplay(Fight.getRedTeam())); - scoreList.add(wincondition.getDisplay(Fight.getBlueTeam())); - } - } - - int value = scoreList.size(); - for(String score : scoreList){ - addScore(score, value--); - } - } - - private void teamScoreboard(FightTeam fightTeam){ - fightTeam.getPlayers().forEach(fp -> { - if(fp.isLiving()) - addScore(fightTeam.getPrefix() + fp.getPlayer().getName(), (int) Math.ceil(fp.getPlayer().getHealth())); - }); - } - - private void updateScoreboard() { - if(PacketProcessor.isReplaying()) - return; - - if ((index++ / 5) % 2 == 0) { - generalScoreboard(); - } else { - setTitle(Fight.getBlueTeam().getColoredName() + " " + Fight.getRedTeam().getColoredName()); - teamScoreboard(Fight.getBlueTeam()); - teamScoreboard(Fight.getRedTeam()); - } - } - public void setTitle(String t) { scores.clear(); title = t; - GlobalRecorder.getInstance().scoreboardTitle(t); } public void addScore(String string, int i) { scores.put(string, i); - GlobalRecorder.getInstance().scoreboardData(string, i); } @Override diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java index 154ed42..430e043 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java @@ -24,10 +24,11 @@ import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightPlayer; import de.steamwar.fightsystem.fight.FightTeam; -import de.steamwar.fightsystem.record.GlobalRecorder; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; +import de.steamwar.fightsystem.utils.FightUI; import de.steamwar.fightsystem.utils.SWSound; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -51,9 +52,9 @@ public class IngameDeath implements Listener { if(team == null) return; - FightSystem.broadcast("§cDer Spieler " + team.getPrefix() + player.getName() + " §cist gestorben!"); + FightUI.addSubtitle(team.getPrefix() + player.getName() + " §7ist gestorben"); Fight.playSound(SWSound.ENTITY_WITHER_DEATH.getSound(), 100.0F, 1.0F); - team.getFightPlayer(player).setOut(); + Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> team.getFightPlayer(player).setOut()); } @EventHandler(priority = EventPriority.HIGH) @@ -66,10 +67,10 @@ public class IngameDeath implements Listener { return; FightPlayer fightPlayer = team.getFightPlayer(player); - if(fightPlayer.isLiving()) { - FightSystem.broadcast("§cDer Spieler " + team.getPrefix() + player.getName() + " §chat den Kampf verlassen!"); - team.getFightPlayer(player).setOut(); - GlobalRecorder.getInstance().entityDespawns(player); - } + if(!fightPlayer.isLiving()) + return; + + FightUI.addSubtitle(team.getPrefix() + player.getName() + " §7hat den Kampf verlassen"); + Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> team.getFightPlayer(player).setOut()); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java index 1a69667..1d2f412 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java @@ -141,7 +141,7 @@ public class Recording implements Listener { GlobalRecorder.getInstance().entityMoves(e.getPlayer()); } - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onPlayerDeath(PlayerDeathEvent e){ if(isNotSent(e.getEntity())) return; @@ -149,6 +149,14 @@ public class Recording implements Listener { GlobalRecorder.getInstance().entityDespawns(e.getEntity()); } + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPlayerQuit(PlayerQuitEvent e){ + if(isNotSent(e.getPlayer())) + return; + + GlobalRecorder.getInstance().entityDespawns(e.getPlayer()); + } + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockPhysics(BlockPhysicsEvent e){ if(FlatteningWrapper.impl.doRecord(e)) diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java index c8d0845..6324d15 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java @@ -30,10 +30,7 @@ import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.fight.FreezeWorld; import de.steamwar.fightsystem.listener.BasicListener; import de.steamwar.fightsystem.listener.FightScoreboard; -import de.steamwar.fightsystem.utils.BlockIdWrapper; -import de.steamwar.fightsystem.utils.BountifulWrapper; -import de.steamwar.fightsystem.utils.TechHider; -import de.steamwar.fightsystem.utils.WorldOfColorWrapper; +import de.steamwar.fightsystem.utils.*; import de.steamwar.sql.Schematic; import de.steamwar.sql.Team; import net.md_5.bungee.api.ChatMessageType; @@ -112,6 +109,9 @@ public class PacketProcessor { packetDecoder[0xb4] = () -> pasteEmbeddedSchem(Fight.getRedTeam()); packetDecoder[0xc0] = this::scoreboardTitle; packetDecoder[0xc1] = this::scoreboardData; + packetDecoder[0xc2] = this::bossBar; + packetDecoder[0xc3] = this::subtitle; + packetDecoder[0xc4] = this::printWin; packetDecoder[0xef] = source::readUTF; packetDecoder[0xff] = this::tick; @@ -373,11 +373,33 @@ public class PacketProcessor { FightScoreboard.getScoreboard().addScore(key, value); } + private void bossBar() throws IOException { + double leftBlueProgress = source.readDouble(); + double leftRedProgress = source.readDouble(); + String leftBlueText = source.readUTF(); + String leftRedText = source.readUTF(); + + FightUI.getInstance().setBossbar(leftBlueProgress, leftRedProgress, leftBlueText, leftRedText); + } + + private void subtitle() throws IOException { + String subtitle = source.readUTF(); + + FightUI.addSubtitle(subtitle); + } + + private void printWin() throws IOException { + String title = source.readUTF(); + String subtitle = source.readUTF(); + + FightUI.printWin(title, subtitle); + } + private void endReplay(){ REntity.dieAll(); freezer.disable(); if(Config.replayserver() || ArenaMode.AntiReplay.contains(Config.mode)) { - FightSystem.setSpectateState(null, "Replay ends"); + FightSystem.setSpectateState(null, "Replay ends", null); }else{ Bukkit.broadcastMessage(FightSystem.PREFIX + "§cReplay beendet"); new EventSpectateCountdown().enable(); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java index c98e21d..e75a016 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java @@ -102,7 +102,7 @@ public interface Recorder { * BlockPacket (0x30) + pos int, byte, int + int BlockState * ParticlePacket (0x31) + double x, y, z + string particleType * SoundPacket (0x32) + int x, y, z + string soundType + string soundCategory + float volume, pitch - * ShortBlockPacket (0x33) + pos relative to ArenaMinX,ArenaMinZ byte, byte, byte + short BlockState + * DEPRECATED ShortBlockPacket (0x33) + pos relative to ArenaMinX,ArenaMinZ byte, byte, byte + short BlockState * SoundAtPlayerPacket (0x34) + string (soundType, soundCategory) + float volume, pitch * ShortBlockPacket (0x35) + pos relative to ArenaMinX,BluePasteY,ArenaMinZ byte, byte, byte + short BlockState * @@ -117,8 +117,11 @@ public interface Recorder { * BlueEmbeddedSchemPacket (0xB3) + int blueSchemId + gzipt NBT blob * RedEmbeddedSchemPacket (0xB4) + int redSchemId + gzipt NBT blob * - * ScoreboardTitlePacket (0xC0) + String scoreboardTitle - * ScoreboardDataPacket (0xC1) + String key + int value + * DEPRECATED ScoreboardTitlePacket (0xC0) + String scoreboardTitle + * DEPRECATED ScoreboardDataPacket (0xC1) + String key + int value + * BossBarPacket (0xC2) + double leftBlueProgress, leftRedProgress + String leftBlueText, leftRedText + * SubtitlePacket (0xC3) + String subtitle + * PrintWinPacket (0xC4) + String title, subtitle * * CommentPacket (0xfe) + String comment * TickPacket (0xff) @@ -265,12 +268,16 @@ public interface Recorder { write(embedId, schemId, buffer.toByteArray()); } - default void scoreboardTitle(String title){ - write(0xc0, title); + default void bossBar(double leftBlueProgress, double leftRedProgress, String leftBlueText, String leftRedText) { + write(0xc2, leftBlueProgress, leftRedProgress, leftBlueText, leftRedText); } - default void scoreboardData(String key, int value){ - write(0xc1, key, value); + default void subtitle(String subtitle) { + write(0xc3, subtitle); + } + + default void printWin(String title, String subtitle) { + write(0xc4, title, subtitle); } default void tick(){ diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/states/StateDependentCountdown.java b/FightSystem_Core/src/de/steamwar/fightsystem/states/StateDependentCountdown.java index dd205cc..d955e5e 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/states/StateDependentCountdown.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/states/StateDependentCountdown.java @@ -28,6 +28,12 @@ import java.util.Set; public class StateDependentCountdown extends StateDependent { + private static Countdown mainCountdown = null; + + public static Countdown getMainCountdown() { + return mainCountdown; + } + private final Countdown countdown; public StateDependentCountdown(Set mode, Set states, Countdown countdown) { @@ -48,11 +54,14 @@ public class StateDependentCountdown extends StateDependent { @Override public void enable() { + mainCountdown = countdown; countdown.enable(); } @Override public void disable() { countdown.disable(); + if(mainCountdown == countdown) + mainCountdown = null; } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/BountifulWrapper.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/BountifulWrapper.java index 2fa5cba..06b9c89 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/BountifulWrapper.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/BountifulWrapper.java @@ -57,5 +57,10 @@ public class BountifulWrapper { void setTeleportPacketPosition(Object packet, double x, double y, double z); void setSpawnPacketUUID(Object packet, UUID uuid); void setEquipmentPacketSlot(Object packet, String slot); + + void setBossbar(double leftBlueProgress, double leftRedProgress, String leftBlueText, String leftRedText); + void removeFromBar(Player player, FightUI.BossBarType type); + void addToBar(Player player, FightUI.BossBarType type); + void broadcastBossbar(); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightUI.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightUI.java new file mode 100644 index 0000000..09c6f7a --- /dev/null +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightUI.java @@ -0,0 +1,213 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2021 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.steamwar.fightsystem.utils; + +import de.steamwar.core.TPSWatcher; +import de.steamwar.fightsystem.ArenaMode; +import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.fight.Fight; +import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.fightsystem.record.GlobalRecorder; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.StateDependentCountdown; +import de.steamwar.fightsystem.states.StateDependentTask; +import de.steamwar.fightsystem.winconditions.Wincondition; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Queue; +import java.util.logging.Level; +import java.util.stream.Collectors; + +public class FightUI { + + private static FightUI instance; + public static FightUI getInstance() { + return instance; + } + + private final Map currentBarType = new HashMap<>(); + + public FightUI() { + new StateDependentTask(ArenaMode.AntiReplay, FightState.All, this::update, 20, 20); + new StateDependentTask(ArenaMode.All, FightState.All, this::sendToPlayers, 5, 5); + new StateDependentTask(ArenaMode.All, FightState.All, this::tpsWatcher, 20, 20); + instance = this; + } + + private void update() { + final FightTeam blue = Fight.getBlueTeam(); + final FightTeam red = Fight.getRedTeam(); + + double blueHearts = blue.getCurrentHearts(); + double redHearts = red.getCurrentHearts(); + double totalHearts = blueHearts + redHearts; + if(redHearts == 0.0 || blueHearts == 0.0) { + blueHearts = 0.5; + redHearts = 0.5; + totalHearts = 1.0; + } + + int timeLeft = StateDependentCountdown.getMainCountdown() != null ? StateDependentCountdown.getMainCountdown().getTimeLeft() : 0; + String time = "§7" + (timeLeft/60) + "§8:§7" + (timeLeft%60<10 ? "0" : "") + (timeLeft%60); + String bluePlayers = blue.getPrefix() + blue.getAlivePlayers() + "§8/§7" + blue.getPlayerCount(); + String redPlayers = red.getPrefix() + red.getAlivePlayers() + "§8/§7" + red.getPlayerCount(); + String redAdditional = Wincondition.getPrintableWinconditions().stream().map(w -> w.getDisplay(red)).collect(Collectors.joining(" ")); + String blueAdditional = Wincondition.getPrintableWinconditions().stream().map(w -> w.getDisplay(blue)).collect(Collectors.joining(" ")); + + Generator generator; + switch(FightState.getFightState()){ + case PRE_LEADER_SETUP: + generator = (l, r, lP, rP, lW, rW) -> "§7Warten auf Teamleader"; + break; + case PRE_SCHEM_SETUP: + generator = (l, r, lP, rP, lW, rW) -> l.getColoredName() + " §7Schemauswahl " + time + " " + r.getColoredName(); + break; + case POST_SCHEM_SETUP: + generator = (l, r, lP, rP, lW, rW) -> l.getColoredName() + " " + lP + " §7Vorbereitung " + time + " " + rP + " " + r.getColoredName(); + break; + case PRE_RUNNING: + generator = (l, r, lP, rP, lW, rW) -> l.getColoredName() + " " + lP + " §7Kampfbeginn in " + time + " " + rP + " " + r.getColoredName(); + break; + case RUNNING: + generator = (l, r, lP, rP, lW, rW) -> l.getColoredName() + " " + lP + " " + lW + " " + time + " " + rW + " " + rP + " " + r.getColoredName(); + break; + case SPECTATE: + default: + generator = (l, r, lP, rP, lW, rW) -> l.getColoredName() + " §7Kampf vorbei " + time + " " + r.getColoredName(); + break; + } + + setBossbar( + blueHearts / totalHearts, redHearts / totalHearts, + generator.gen(blue, red, bluePlayers, redPlayers, blueAdditional, redAdditional), + generator.gen(red, blue, redPlayers, bluePlayers, redAdditional, blueAdditional) + ); + } + + private interface Generator { + String gen(FightTeam l, FightTeam r, String lPlayers, String rPlayers, String lWinconditions, String rWinconditions); + } + + public void setBossbar(double leftBlueProgress, double leftRedProgress, String leftBlueText, String leftRedText) { + GlobalRecorder.getInstance().bossBar(leftBlueProgress, leftRedProgress, leftBlueText, leftRedText); + BountifulWrapper.impl.setBossbar(leftBlueProgress, leftRedProgress, leftBlueText, leftRedText); + } + + public BossBarType bossBarType(Player player) { + return currentBarType.get(player); + } + + private void sendToPlayers() { + Bukkit.getOnlinePlayers().forEach(player -> { + BossBarType type = BossBarType.byAngle(CraftbukkitWrapper.impl.headRotation(player)); + BossBarType current = currentBarType.get(player); + + if(type != current) { + if(current != null) + BountifulWrapper.impl.removeFromBar(player, current); + BountifulWrapper.impl.addToBar(player, type); + currentBarType.put(player, type); + } + }); + BountifulWrapper.impl.broadcastBossbar(); + } + + private void tpsWatcher() { + double tps = TPSWatcher.getTPS(); + if(tps < 15.0) { + BaseComponent[] message = TextComponent.fromLegacyText("§c" + tps + " §7TPS"); + Bukkit.getOnlinePlayers().forEach(player -> BountifulWrapper.impl.toActionbar(player, message)); + } + } + + public enum BossBarType { + BLUE_LEFT(345, 165), + RED_LEFT(165, 345); + + private static final boolean blueNegZ = Config.blueNegZ(); + + private final double minAngle; + private final double maxAngle; + + BossBarType(double minAngle, double maxAngle) { + this.minAngle = minAngle; + this.maxAngle = maxAngle; + } + + private static BossBarType byAngle(double angle) { + if(blueNegZ) + angle += 180; + angle = ((angle % 360) + 360) % 360; + + for(BossBarType type : values()) { + if(type.minAngle < type.maxAngle ? type.minAngle <= angle && angle < type.maxAngle : type.minAngle < angle || angle <= type.maxAngle) + return type; + } + + throw new SecurityException("No boss bar for angle " + angle + " found"); + } + } + + + private static final Queue queue = new LinkedList<>(); + private static boolean subtitleScheduled = false; + + public static void printWin(String title, String winreason) { + queue.clear(); + + FightSystem.getPlugin().getLogger().log(Level.INFO, title + " " + winreason); + GlobalRecorder.getInstance().printWin(title, winreason); + Bukkit.getOnlinePlayers().forEach(p -> { + p.resetTitle(); + WorldOfColorWrapper.impl.sendTitle(p, title, winreason, 5, 40, 5); + }); + } + + public static void addSubtitle(String message) { + if(FightState.Spectate.contains(FightState.getFightState())) + return; + + queue.add(message); + GlobalRecorder.getInstance().subtitle(message); + FightSystem.getPlugin().getLogger().log(Level.INFO, message); + + if(!subtitleScheduled) + printSubtitle(); + } + + private static void printSubtitle() { + if(queue.isEmpty()) { + subtitleScheduled = false; + return; + } + String message = queue.poll(); + + Bukkit.getOnlinePlayers().forEach(p -> WorldOfColorWrapper.impl.sendTitle(p, "", message, 5, 40, 5)); + Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), FightUI::printSubtitle, 100); + subtitleScheduled = true; + } +} diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper.java index 6d17a26..2bd0c37 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/WorldOfColorWrapper.java @@ -24,6 +24,7 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.entity.Arrow; +import org.bukkit.entity.Player; import org.bukkit.scoreboard.Team; public class WorldOfColorWrapper { @@ -36,5 +37,7 @@ public class WorldOfColorWrapper { boolean isInBlock(Arrow e); void playSound(Location location, Sound sound, String soundCategory, float volume, float pitch); + + void sendTitle(Player player, String title, String subtitle, int start, int hold, int stop); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java index fc8e9c9..6d30380 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.ArenaMode; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; @@ -34,8 +33,7 @@ public class EventTeamOffWincondition extends Wincondition{ @Override public void enable() { if(Fight.getBlueTeam().allPlayersOut() && Fight.getRedTeam().allPlayersOut()){ - FightSystem.broadcast("§cBeide Teams sind offline!"); - win(null); + win(null, "§7Beide Teams offline"); }else{ teamOff(Fight.getBlueTeam()); teamOff(Fight.getRedTeam()); @@ -51,8 +49,7 @@ public class EventTeamOffWincondition extends Wincondition{ private void teamOff(FightTeam team){ if(team.allPlayersOut()){ - FightSystem.broadcast("§cDas Team " + team.getColoredName() + " §cist offline!"); - win(Fight.getOpposite(team)); + win(Fight.getOpposite(team), team.getColoredName() + " §7offline"); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/RankedPlayerLeftWincondition.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/RankedPlayerLeftWincondition.java index 56f849f..9a1b9ba 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/RankedPlayerLeftWincondition.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/RankedPlayerLeftWincondition.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.ArenaMode; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; @@ -45,8 +44,7 @@ public class RankedPlayerLeftWincondition extends Wincondition implements Listen return; if(team.isPlayerLeader(player)) { - FightSystem.broadcast("§cDer Leader von " + team.getColoredName() + " §chat den Kampf verlassen!"); - win(Fight.getOpposite(team)); + win(Fight.getOpposite(team), team.getPrefix() + team.getLeader().getPlayer().getName() + " §7hat den Kampf verlassen"); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Wincondition.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Wincondition.java index 7154d8e..871019e 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Wincondition.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Wincondition.java @@ -47,17 +47,12 @@ public abstract class Wincondition { return timeOverCountdown.getCountdown(); } - protected void win(FightTeam team){ - FightSystem.setSpectateState(team, windescription); + protected void win(FightTeam team, String subtitle){ + FightSystem.setSpectateState(team, windescription, subtitle); } protected FightTeam isTarget(Player player){ - FightTeam fightTeam = Fight.getPlayerTeam(player); - if(fightTeam == null) - return null; - - fightTeam.getFightPlayer(player).setOut(); - return fightTeam; + return Fight.getPlayerTeam(player); } public static List getPrintableWinconditions(){ diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java index 572d1ee..15479fd 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java @@ -19,8 +19,8 @@ package de.steamwar.fightsystem.winconditions; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; +import de.steamwar.fightsystem.fight.FightPlayer; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; @@ -39,22 +39,24 @@ public class WinconditionAllDead extends Wincondition implements Listener { @EventHandler public void handlePlayerDeath(PlayerDeathEvent event) { - handleDeath(event.getEntity().getPlayer(), " §cist gestorben!"); + handleDeath(event.getEntity().getPlayer()); } @EventHandler public void handlePlayerQuit(PlayerQuitEvent event) { - handleDeath(event.getPlayer(), " §chat den Kampf verlassen!"); + handleDeath(event.getPlayer()); } - private void handleDeath(Player player, String message){ + private void handleDeath(Player player){ FightTeam team = isTarget(player); if(team == null) return; - if(team.allPlayersOut()) { - FightSystem.broadcast("§cDer letzte Spieler aus " + team.getColoredName() + message); - win(Fight.getOpposite(team)); + for(FightPlayer fp : team.getPlayers()) { + if(fp.isLiving() && fp.getPlayer() != player) + return; } + + win(Fight.getOpposite(team), team.getPrefix() + "Alle Spieler kampfunfähig"); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java index 9a1bd7d..4db4948 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java @@ -19,7 +19,6 @@ package de.steamwar.fightsystem.winconditions; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; @@ -39,22 +38,21 @@ public class WinconditionCaptainDead extends Wincondition implements Listener { @EventHandler public void handlePlayerDeath(PlayerDeathEvent event) { - handleDeath(event.getEntity().getPlayer(), " §cist gestorben!"); + handleDeath(event.getEntity().getPlayer()); } @EventHandler public void handlePlayerQuit(PlayerQuitEvent event) { - handleDeath(event.getPlayer(), " §chat den Kampf verlassen!"); + handleDeath(event.getPlayer()); } - private void handleDeath(Player player, String message){ + private void handleDeath(Player player){ FightTeam team = isTarget(player); if(team == null) return; if(team.isPlayerLeader(player)) { - FightSystem.broadcast("§cDer Leader von " + team.getColoredName() + message); - win(Fight.getOpposite(team)); + win(Fight.getOpposite(team), team.getPrefix() + team.getLeader().getPlayer().getName() + " kampfunfähig"); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java index 3e71579..6c36956 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.countdown.TimeOverCountdown; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.states.FightState; @@ -40,14 +39,11 @@ public class WinconditionHeartRatioTimeout extends Wincondition { double redHeartRatio = Fight.getRedTeam().getHeartRatio(); if(blueHeartRatio > redHeartRatio) { - FightSystem.broadcast("§cDie Zeit ist abgelaufen, und Team " + Fight.getBlueTeam().getColoredName() + " §chatte mehr verbleibende Leben!"); - win(Fight.getBlueTeam()); + win(Fight.getBlueTeam(), Fight.getBlueTeam().getPrefix() + "Mehr verbleibende Leben"); }else if(blueHeartRatio < redHeartRatio){ - FightSystem.broadcast("§cDie Zeit ist abgelaufen, und Team " + Fight.getRedTeam().getColoredName() + " §chatte mehr verbleibende Leben!"); - win(Fight.getRedTeam()); + win(Fight.getRedTeam(), Fight.getRedTeam().getPrefix() + "Mehr verbleibende Leben"); }else{ - FightSystem.broadcast("§cDie Zeit ist abgelaufen, und beide Teams hatten die gleiche Anzahl an verbleibenden Leben!"); - win(null); + win(null, "§7Zeit abgelaufen"); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java index 7a2f730..6610031 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; @@ -64,7 +63,7 @@ public class WinconditionPercentSystem extends Wincondition implements Listener, @Override public String getDisplay(FightTeam team) { - return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%"; + return team.getPrefix() + (Math.round(100.0 * getPercent(team)) / 100.0) + "§8%"; } @Override @@ -92,8 +91,7 @@ public class WinconditionPercentSystem extends Wincondition implements Listener, destroyedBlocks += event.blockList().size(); percent = (double)destroyedBlocks * 100 / volume; if(percent >= Config.PercentWin) { - FightSystem.broadcast("§cTeam " + team.getColoredName() + " §chat zu viel Schaden erlitten!"); - win(Fight.getOpposite(team)); + win(Fight.getOpposite(team), team.getColoredName() + " §7zu beschädigt"); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPercentTimeout.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPercentTimeout.java index be67855..2dc96c0 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPercentTimeout.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPercentTimeout.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.countdown.TimeOverCountdown; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.states.FightState; @@ -40,14 +39,11 @@ public class WinconditionPercentTimeout extends Wincondition { double redPercent = Wincondition.percentWincondition.getPercent(Fight.getRedTeam()); if(bluePercent > redPercent) { - FightSystem.broadcast("§cDie Zeit ist abgelaufen, und Team " + Fight.getRedTeam().getColoredName() + " §chat weniger Schaden erlitten!"); - win(Fight.getRedTeam()); + win(Fight.getRedTeam(), Fight.getRedTeam().getColoredName() + " §7weniger beschädigt"); }else if(bluePercent < redPercent){ - FightSystem.broadcast("§cDie Zeit ist abgelaufen, und Team " + Fight.getBlueTeam().getColoredName() + " §chat weniger Schaden erlitten!"); - win(Fight.getBlueTeam()); + win(Fight.getBlueTeam(), Fight.getBlueTeam().getColoredName() + " §7weniger beschädigt"); }else{ - FightSystem.broadcast("§cDie Zeit ist abgelaufen, und beide Teams hatten gleichen Schaden erlitten!"); - win(null); + win(null, "§7Zeit abgelaufen"); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java index 52ac282..6430a17 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.countdown.TimeOverCountdown; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; @@ -70,28 +69,25 @@ public class WinconditionPoints extends Wincondition implements PrintableWincond int bluePoints = teamMap.get(Fight.getBlueTeam()).getPoints(); if(bluePoints < redPoints) { - FightSystem.broadcast("§cDas Team " + Fight.getRedTeam().getColoredName() + " §chat mehr Punkte!"); - win(Fight.getRedTeam()); + win(Fight.getRedTeam(), Fight.getRedTeam().getPrefix() + " hat mehr Punkte"); }else if(bluePoints > redPoints){ - FightSystem.broadcast("§cDas Team " + Fight.getBlueTeam().getColoredName() + " §chat mehr Punkte!"); - win(Fight.getBlueTeam()); + win(Fight.getBlueTeam(), Fight.getBlueTeam().getPrefix() + " hat mehr Punkte"); }else{ - FightSystem.broadcast("§cBeide Teams haben gleich viele Punkte!"); - win(null); + win(null, "§7Gleicher Punktestand"); } } @EventHandler public void handlePlayerDeath(PlayerDeathEvent event) { - handleDeath(event.getEntity().getPlayer(), " §cist gestorben!"); + handleDeath(event.getEntity().getPlayer()); } @EventHandler public void handlePlayerQuit(PlayerQuitEvent event) { - handleDeath(event.getPlayer(), " §chat den Kampf verlassen!"); + handleDeath(event.getPlayer()); } - private void handleDeath(Player player, String message){ + private void handleDeath(Player player){ FightTeam team = isTarget(player); if(team == null) return; @@ -99,7 +95,6 @@ public class WinconditionPoints extends Wincondition implements PrintableWincond TeamPoints enemy = teamMap.get(Fight.getOpposite(team)); if(team.isPlayerLeader(player)) { enemy.points += 500; - FightSystem.broadcast("§cDer Leader von " + team.getColoredName() + message); timeOver(); }else if(team.getPlayers().size() <= 5) enemy.points += 300; @@ -110,7 +105,7 @@ public class WinconditionPoints extends Wincondition implements PrintableWincond @Override public String getDisplay(FightTeam team) { - return team.getPrefix() + "Punkte: " + teamMap.get(team).getPoints(); + return team.getPrefix() + teamMap.get(team).getPoints() + " §8Punkte"; } private class TeamPoints { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java index 4fda590..82db796 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; @@ -57,7 +56,7 @@ public class WinconditionPumpkinTechKO extends Wincondition implements Printable @Override public String getDisplay(FightTeam team) { - return team.getPrefix() + "Kanonen: " + teamMap.get(team).pumpkins; + return team.getPrefix() + teamMap.get(team).pumpkins + " §8Kanonen"; } private class TeamPumpkin { @@ -77,8 +76,7 @@ public class WinconditionPumpkinTechKO extends Wincondition implements Printable }); if(pumpkins == 0) { - FightSystem.broadcast("§cDas Team " + team.getColoredName() + " §cist Tech K.O.!"); - win(Fight.getOpposite(team)); + win(Fight.getOpposite(team), team.getColoredName() + " ist Tech K.O."); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java index fd2b511..219d1cd 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java @@ -64,7 +64,7 @@ public class WinconditionRelativePercent extends Wincondition implements Printab @Override public String getDisplay(FightTeam team) { - return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%"; + return team.getPrefix() + (Math.round(100.0 * getPercent(team)) / 100.0) + "§8%"; } public static class TeamPercent extends StateDependent { @@ -99,8 +99,7 @@ public class WinconditionRelativePercent extends Wincondition implements Printab return; if(getPercent() >= Config.PercentWin){ - FightSystem.broadcast("§cTeam " + team.getColoredName() + " §chat zu viel Schaden erlitten!"); - FightSystem.setSpectateState(Fight.getOpposite(team), "RelativePercent"); + FightSystem.setSpectateState(Fight.getOpposite(team), "RelativePercent", team.getColoredName() + " §7zu beschädigt"); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java index 3a61db5..0e4d069 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java @@ -20,13 +20,12 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.countdown.Countdown; -import de.steamwar.fightsystem.utils.SWSound; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentTask; +import de.steamwar.fightsystem.utils.SWSound; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.TNTPrimed; @@ -121,8 +120,7 @@ public class WinconditionTimeTechKO extends Wincondition { @Override public void countdownFinished() { - FightSystem.broadcast("§cTeam " + team.getColoredName() + " §chat zu lange nicht geschossen!"); - win(Fight.getOpposite(team)); + win(Fight.getOpposite(team), team.getColoredName() + " ist Tech K.O."); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java index e6d8a3f..f720f8a 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.countdown.TimeOverCountdown; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentCountdown; @@ -35,7 +34,6 @@ public class WinconditionTimeout extends Wincondition { } protected void timeOver() { - FightSystem.broadcast("§cDie Zeit ist abgelaufen!"); - win(null); + win(null, "§7Zeit abgelaufen"); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java index f6f2c5b..9367406 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem.winconditions; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; @@ -55,7 +54,7 @@ public class WinconditionWaterTechKO extends Wincondition implements PrintableWi @Override public String getDisplay(FightTeam team) { - return team.getPrefix() + "Wasser: " + teamMap.get(team).water; + return team.getPrefix() + teamMap.get(team).water + " §8Wasser"; } private class TeamWater { @@ -74,8 +73,7 @@ public class WinconditionWaterTechKO extends Wincondition implements PrintableWi }); if(water == 0){ - FightSystem.broadcast("§cTeam " + team.getColoredName() + " §cwurde Tech K.O. gesetzt!"); - win(Fight.getOpposite(team)); + win(Fight.getOpposite(team), team.getColoredName() + " ist Tech K.O."); } } }