geforkt von SteamWar/BungeeCore
Nice Replay display
Signed-off-by: Lixfel <agga-games@gmx.de>
Dieser Commit ist enthalten in:
Ursprung
d6e01e6bae
Commit
7ad4d73674
@ -28,7 +28,9 @@ import net.md_5.bungee.api.chat.HoverEvent;
|
|||||||
import net.md_5.bungee.api.chat.TextComponent;
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
|
import java.text.DateFormat;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
@ -71,6 +73,8 @@ public class Message {
|
|||||||
if(params[i] instanceof Message) {
|
if(params[i] instanceof Message) {
|
||||||
Message msg = (Message) params[i];
|
Message msg = (Message) params[i];
|
||||||
params[i] = parse(msg.getMessage(), sender, msg.getParams());
|
params[i] = parse(msg.getMessage(), sender, msg.getParams());
|
||||||
|
} else if(params[i] instanceof Date) {
|
||||||
|
params[i] = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale).format((Date) params[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return format.format(params);
|
return format.format(params);
|
||||||
|
@ -1,15 +1,19 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.ArenaMode;
|
import de.steamwar.bungeecore.ArenaMode;
|
||||||
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.SubserverSystem;
|
import de.steamwar.bungeecore.SubserverSystem;
|
||||||
import de.steamwar.bungeecore.inventory.SWItem;
|
import de.steamwar.bungeecore.inventory.SWItem;
|
||||||
import de.steamwar.bungeecore.inventory.SWListInv;
|
import de.steamwar.bungeecore.inventory.SWListInv;
|
||||||
import de.steamwar.bungeecore.inventory.SWStreamInv;
|
import de.steamwar.bungeecore.inventory.SWStreamInv;
|
||||||
import de.steamwar.bungeecore.sql.Fight;
|
import de.steamwar.bungeecore.sql.Fight;
|
||||||
|
import de.steamwar.bungeecore.sql.SchematicType;
|
||||||
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class ReplayCommand extends BasicCommand {
|
public class ReplayCommand extends BasicCommand {
|
||||||
@ -22,34 +26,39 @@ public class ReplayCommand extends BasicCommand {
|
|||||||
public void execute(CommandSender sender, String[] args) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
if(!(sender instanceof ProxiedPlayer))
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//TODO Translate
|
|
||||||
ProxiedPlayer player = (ProxiedPlayer) sender;
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
new SWStreamInv<>(player, "Letzte Kämpfe", (click, fight) -> {
|
|
||||||
|
new SWStreamInv<>(player, Message.parse("REPLAY_TITLE", player), (click, fight) -> {
|
||||||
if(!fight.isReplayAvailable()) {
|
if(!fight.isReplayAvailable()) {
|
||||||
player.sendMessage("Replay nicht möglich");
|
Message.send("REPLAY_UNAVAILABLE", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ArenaMode mode = fight.getGameMode();
|
ArenaMode mode = fight.getGameMode();
|
||||||
if(mode == null){
|
|
||||||
player.sendMessage("Replay kann aufgrund deaktivertem Spielmodus nicht gestartet werden");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SubserverSystem.startArena(mode, mode.getRandomMap(), 0, 0, 0, fight.getFightID(), null, null, null, null, false).sendPlayer(player);
|
SubserverSystem.startArena(mode, mode.getRandomMap(), 0, 0, 0, fight.getFightID(), null, null, null, null, false).sendPlayer(player);
|
||||||
}, page -> Fight.getPage(page, 45).stream().map(fight -> new SWListInv.SWListEntry<>(getFightItem(player, fight), fight)).collect(Collectors.toList())).open();
|
}, page -> Fight.getPage(page, 45).stream().map(fight -> new SWListInv.SWListEntry<>(getFightItem(player, fight), fight)).collect(Collectors.toList())).open();
|
||||||
}
|
}
|
||||||
|
|
||||||
private SWItem getFightItem(ProxiedPlayer player, Fight fight) {
|
private SWItem getFightItem(ProxiedPlayer player, Fight fight) {
|
||||||
String title = "§3" + (fight.getWin() == 1 ? "§l" : "") + fight.getBlueLeader().getUserName() + " §r§8vs §c" + (fight.getWin() == 2 ? "§l" : "") + fight.getRedLeader().getUserName();
|
SchematicType type = fight.getSchemType();
|
||||||
SWItem item = new SWItem(fight.isReplayAvailable() ? "JUKEBOX" : "STONE", title);
|
SWItem item = new SWItem(type != null ? type.getMaterial() : "BARRIER", parseLeader(player, fight.getBlueLeader(), fight.getBluePlayers().size(), fight.getWin() == 1));
|
||||||
item.setLore(Arrays.asList(
|
|
||||||
"§7" + fight.getStartTime().toString(),
|
List<String> lore = new ArrayList<>();
|
||||||
"§7" + fight.getServer(),
|
lore.add(parseLeader(player, fight.getRedLeader(), fight.getRedPlayers().size(), fight.getWin() == 2));
|
||||||
"§7" + fight.getWinCondition() + " §8nach §e" + fight.getDuration() + "§8s",
|
lore.add(Message.parse("REPLAY_TIME", player, fight.getStartTime()));
|
||||||
fight.getBluePlayers().size() > 1 ? "§3+" + (fight.getBluePlayers().size() - 1) + " §8Spieler" : "",
|
lore.add("");
|
||||||
fight.getRedPlayers().size() > 1 ? "§c+" + (fight.getRedPlayers().size() - 1) + " §8Spieler" : ""
|
lore.add(Message.parse("REPLAY_SERVER", player, fight.getServer()));
|
||||||
));
|
if(!fight.isReplayAvailable())
|
||||||
|
lore.add(Message.parse("REPLAY_UNAVAILABLE", player));
|
||||||
|
item.setLore(lore);
|
||||||
|
|
||||||
|
if(fight.isReplayAvailable())
|
||||||
|
item.setEnchanted(true);
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String parseLeader(ProxiedPlayer player, SteamwarUser leader, int players, boolean winner) {
|
||||||
|
return Message.parse(winner ? (players > 1 ? "REPLAY_WINNER" : "REPLAY_SOLO_WINNER") : (players > 1 ? "REPLAY_LOSER" : "REPLAY_SOLO_LOSER"), player, leader.getUserName(), players - 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,13 +5,14 @@ import de.steamwar.bungeecore.ArenaMode;
|
|||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class Fight {
|
public class Fight {
|
||||||
|
|
||||||
private static final Statement getPage = new Statement("SELECT FightID, GameMode, Server, StartTime, Duration, BlueLeader, RedLeader, BlueSchem, RedSchem, Win, WinCondition, Replay is not NULL AS ReplayAvailable FROM Fight ORDER BY FightID DESC LIMIT ?, ?");
|
private static final Statement getPage = new Statement("SELECT FightID, GameMode, Server, StartTime, Duration, BlueLeader, RedLeader, BlueSchem, RedSchem, Win, WinCondition, ReplayLock, Replay is not NULL AS ReplayAvailable FROM Fight ORDER BY FightID DESC LIMIT ?, ?");
|
||||||
|
|
||||||
private final int fightID;
|
private final int fightID;
|
||||||
private final String gameMode;
|
private final String gameMode;
|
||||||
@ -25,6 +26,8 @@ public class Fight {
|
|||||||
private final int redSchem;
|
private final int redSchem;
|
||||||
private final int win;
|
private final int win;
|
||||||
private final String winCondition;
|
private final String winCondition;
|
||||||
|
|
||||||
|
private final Timestamp replayLock;
|
||||||
private final boolean replayAvailable;
|
private final boolean replayAvailable;
|
||||||
|
|
||||||
private final List<FightPlayer> bluePlayers = new ArrayList<>();
|
private final List<FightPlayer> bluePlayers = new ArrayList<>();
|
||||||
@ -42,6 +45,7 @@ public class Fight {
|
|||||||
redSchem = rs.getInt("RedSchem");
|
redSchem = rs.getInt("RedSchem");
|
||||||
win = rs.getInt("Win");
|
win = rs.getInt("Win");
|
||||||
winCondition = rs.getString("WinCondition");
|
winCondition = rs.getString("WinCondition");
|
||||||
|
replayLock = rs.getTimestamp("ReplayLock");
|
||||||
replayAvailable = rs.getBoolean("ReplayAvailable");
|
replayAvailable = rs.getBoolean("ReplayAvailable");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,17 +79,17 @@ public class Fight {
|
|||||||
return fights;
|
return fights;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SchematicType getSchemType() {
|
||||||
|
return SchematicType.fromDB(gameMode);
|
||||||
|
}
|
||||||
|
|
||||||
public ArenaMode getGameMode() {
|
public ArenaMode getGameMode() {
|
||||||
SchematicType schemType = SchematicType.fromDB(gameMode);
|
SchematicType schemType = getSchemType();
|
||||||
if(schemType == null)
|
if(schemType == null)
|
||||||
return null;
|
return null;
|
||||||
return ArenaMode.getBySchemType(schemType);
|
return ArenaMode.getBySchemType(schemType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRawGameMode() {
|
|
||||||
return gameMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getFightID() {
|
public int getFightID() {
|
||||||
return fightID;
|
return fightID;
|
||||||
}
|
}
|
||||||
@ -94,10 +98,6 @@ public class Fight {
|
|||||||
return startTime;
|
return startTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getDuration() {
|
|
||||||
return duration;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SteamwarUser getBlueLeader() {
|
public SteamwarUser getBlueLeader() {
|
||||||
return SteamwarUser.get(blueLeader);
|
return SteamwarUser.get(blueLeader);
|
||||||
}
|
}
|
||||||
@ -114,10 +114,6 @@ public class Fight {
|
|||||||
return server;
|
return server;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getWinCondition() {
|
|
||||||
return winCondition;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<FightPlayer> getBluePlayers() {
|
public List<FightPlayer> getBluePlayers() {
|
||||||
return bluePlayers;
|
return bluePlayers;
|
||||||
}
|
}
|
||||||
@ -127,6 +123,6 @@ public class Fight {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isReplayAvailable() {
|
public boolean isReplayAvailable() {
|
||||||
return replayAvailable;
|
return replayAvailable && replayLock.before(Timestamp.from(Instant.now())) && getGameMode() != null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ import java.io.IOException;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class SchematicType {
|
public class SchematicType {
|
||||||
public static final SchematicType Normal = new SchematicType("Normal", "", Type.NORMAL, null); //Has to stay publicly availible
|
public static final SchematicType Normal = new SchematicType("Normal", "", null, Type.NORMAL, null); //Has to stay publicly availible
|
||||||
|
|
||||||
private static final Map<String, SchematicType> fromDB;
|
private static final Map<String, SchematicType> fromDB;
|
||||||
private static final Map<SchematicType, SchematicType> fightType;
|
private static final Map<SchematicType, SchematicType> fightType;
|
||||||
@ -64,15 +64,17 @@ public class SchematicType {
|
|||||||
if(tmpFromDB.containsKey(type.toLowerCase()))
|
if(tmpFromDB.containsKey(type.toLowerCase()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
String material = config.getString("Schematic.Material");
|
||||||
|
|
||||||
SchematicType checktype = null;
|
SchematicType checktype = null;
|
||||||
if(!config.getStringList("CheckQuestions").isEmpty()) {
|
if(!config.getStringList("CheckQuestions").isEmpty()) {
|
||||||
checktype = new SchematicType("C" + type, "C" + shortcut, Type.CHECK_TYPE, null);
|
checktype = new SchematicType("C" + type, "C" + shortcut, material, Type.CHECK_TYPE, null);
|
||||||
tmpTypes.add(checktype);
|
tmpTypes.add(checktype);
|
||||||
tmpFromDB.put(checktype.toDB(), checktype);
|
tmpFromDB.put(checktype.toDB(), checktype);
|
||||||
CheckCommand.setCheckQuestions(checktype, config);
|
CheckCommand.setCheckQuestions(checktype, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
SchematicType current = new SchematicType(type, shortcut, config.getKeys().contains("Server") ? Type.FIGHT_TYPE : Type.NORMAL, checktype);
|
SchematicType current = new SchematicType(type, shortcut, material, config.getKeys().contains("Server") ? Type.FIGHT_TYPE : Type.NORMAL, checktype);
|
||||||
if(checktype != null)
|
if(checktype != null)
|
||||||
tmpFightType.put(checktype, current);
|
tmpFightType.put(checktype, current);
|
||||||
tmpFromDB.put(type.toLowerCase(), current);
|
tmpFromDB.put(type.toLowerCase(), current);
|
||||||
@ -86,12 +88,14 @@ public class SchematicType {
|
|||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final String kuerzel;
|
private final String kuerzel;
|
||||||
|
private final String material;
|
||||||
private final Type type;
|
private final Type type;
|
||||||
private final SchematicType checkType;
|
private final SchematicType checkType;
|
||||||
|
|
||||||
private SchematicType(String name, String kuerzel, Type type, SchematicType checkType){
|
private SchematicType(String name, String kuerzel, String material, Type type, SchematicType checkType){
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.kuerzel = kuerzel;
|
this.kuerzel = kuerzel;
|
||||||
|
this.material = material != null && !"".equals(material) ? material : "STONE_BUTTON";
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.checkType = checkType;
|
this.checkType = checkType;
|
||||||
}
|
}
|
||||||
@ -124,6 +128,10 @@ public class SchematicType {
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getMaterial() {
|
||||||
|
return material;
|
||||||
|
}
|
||||||
|
|
||||||
public String getKuerzel() {
|
public String getKuerzel() {
|
||||||
return kuerzel;
|
return kuerzel;
|
||||||
}
|
}
|
||||||
|
@ -337,6 +337,16 @@ REGELN_WS=§eWarShip§8-§7Regelwerk
|
|||||||
REGELN_WS_HOVER=§7https://steamwar.de/spielmodi/warship-regelwerk/
|
REGELN_WS_HOVER=§7https://steamwar.de/spielmodi/warship-regelwerk/
|
||||||
REGELN_WS_URL=https://steamwar.de/spielmodi/warship-regelwerk/
|
REGELN_WS_URL=https://steamwar.de/spielmodi/warship-regelwerk/
|
||||||
|
|
||||||
|
#ReplayCommand
|
||||||
|
REPLAY_TITLE=Letzte Kämpfe
|
||||||
|
REPLAY_UNAVAILABLE=§cReplay nicht möglich
|
||||||
|
REPLAY_SOLO_WINNER=§e§l{0}
|
||||||
|
REPLAY_WINNER=§e§l{0} §7+§e{1}
|
||||||
|
REPLAY_SOLO_LOSER=§e{0}
|
||||||
|
REPLAY_LOSER=§e{0} §7+§e{1}
|
||||||
|
REPLAY_TIME=§7{0}
|
||||||
|
REPLAY_SERVER=§7{0}
|
||||||
|
|
||||||
#ServerTeamchatCommand
|
#ServerTeamchatCommand
|
||||||
STC_USAGE=§8/§7stc §8[§eNachricht an das Team§8]
|
STC_USAGE=§8/§7stc §8[§eNachricht an das Team§8]
|
||||||
STC_FORMAT=§8STC §e{0}» §r{1}
|
STC_FORMAT=§8STC §e{0}» §r{1}
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren