SteamWar/FightSystem
Archiviert
13
1

New Fight UI #288

Zusammengeführt
Lixfel hat 9 Commits von newFightUI nach master 2021-10-01 17:25:56 +02:00 zusammengeführt
37 geänderte Dateien mit 554 neuen und 228 gelöschten Zeilen

Datei anzeigen

@ -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);
}
}

Datei anzeigen

@ -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<FightUI.BossBarType, PacketPlayOutEntityMetadata> 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<Player> 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)));
});
}
}

Datei anzeigen

@ -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);
}
}

Datei anzeigen

@ -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<FightUI.BossBarType, BossBar> 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:
Lixfel markierte diese Unterhaltung als gelöst
Review

Gibt es keine BarColor.Black?

Gibt es keine BarColor.Black?
Review

Nein.

Nein.
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
}
}

Datei anzeigen

@ -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);
}
}

Datei anzeigen

@ -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);
}

Datei anzeigen

@ -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();
}

Datei anzeigen

@ -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;
}

Datei anzeigen

@ -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())){
Lixfel markierte diese Unterhaltung als gelöst
Review

Was wird passieren, wenn ein team tie heißt? dann kannst du kein tie mehr machen!

Was wird passieren, wenn ein team tie heißt? dann kannst du kein tie mehr machen!
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;
}

Datei anzeigen

@ -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){

Datei anzeigen

@ -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();
}
}

Datei anzeigen

@ -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());
}
}

Datei anzeigen

@ -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) {
private void removeLeader() {
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 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<Integer> 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 getHeartRatio(){
int maximumHearts = 0;
double currentHearts = 0;
for(FightPlayer fightPlayer : players.values()){
maximumHearts += 20;
if(!fightPlayer.isLiving())
continue;
currentHearts += fightPlayer.getPlayer().getHealth();
public double getCurrentHearts() {
return players.values().stream().filter(FightPlayer::isLiving).mapToDouble(fp -> fp.getPlayer().getHealth()).sum();
}
assert maximumHearts != 0;
return currentHearts / maximumHearts;
public double getHeartRatio(){
int maximumHearts = players.size() * 20;
return maximumHearts != 0 ? getCurrentHearts() / maximumHearts : 0;
}
public int getPlayerCount() {
return players.size();
}
public int getAlivePlayers() {
return (int) players.values().stream().filter(FightPlayer::isLiving).count();
}
public ChatColor getColor() {

Datei anzeigen

@ -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);

Datei anzeigen

@ -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<FightState> 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<String, Integer> 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<String> 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

Datei anzeigen

@ -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());
}
}

Datei anzeigen

@ -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))

Datei anzeigen

@ -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();

Datei anzeigen

@ -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(){

Datei anzeigen

@ -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<ArenaMode> mode, Set<FightState> 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;
}
}

Datei anzeigen

@ -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();
}
}

Datei anzeigen

@ -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 <https://www.gnu.org/licenses/>.
*/
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<Player, BossBarType> 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<String> 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;
}
}

Datei anzeigen

@ -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);
}
}

Datei anzeigen

@ -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");
}
}
}

Datei anzeigen

@ -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");
}
}
}

Datei anzeigen

@ -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<PrintableWincondition> getPrintableWinconditions(){

Datei anzeigen

@ -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");
}
}

Datei anzeigen

@ -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");
}
}
}

Datei anzeigen

@ -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");
}
}
}

Datei anzeigen

@ -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");
}
}
}

Datei anzeigen

@ -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");
}
}
}

Datei anzeigen

@ -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 {

Datei anzeigen

@ -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.");
}
}
}

Datei anzeigen

@ -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");
}
}

Datei anzeigen

@ -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.");
}
}
}

Datei anzeigen

@ -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");
}
}

Datei anzeigen

@ -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.");
}
}
}