Merge branch 'main' into FightSystem/WaterRemover

This commit is contained in:
2026-10-26 13:26:31 +01:00
62 changed files with 2482 additions and 1013 deletions
@@ -109,7 +109,6 @@ TEAM_READY = §aTeam ready
TEAM_NOT_READY = §c§mTeam ready
SKIP_READY = §aSkipping to next event
SKIP_NOT_READY = §c§mSkipping to next event
TEAM_CHAT = {0}{1}§8» {0}{2}
CHOOSE_KIT = §eChoose kit
RESPAWN = §eRespawn
MANAGE_PLAYERS = §cManage players
@@ -20,19 +20,14 @@
package de.steamwar.fightsystem.ai;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.fight.FightSchematic;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
import de.steamwar.sql.SchematicNode;
import de.steamwar.sql.SteamwarUser;
import java.util.List;
import java.util.Random;
public class DummyAI extends AI {
private static final Random random = new Random();
public DummyAI(FightTeam team) {
super(team, SteamwarUser.get("public"));
@@ -41,8 +36,7 @@ public class DummyAI extends AI {
@Override
public SchematicNode chooseSchematic() {
List<SchematicNode> publics = SchematicNode.getAllSchematicsOfType(0, Config.GameModeConfig.Schematic.Type.toDB());
return publics.get(random.nextInt(publics.size()));
return FightSchematic.getPublicSchematic().orElseThrow();
}
@Override
@@ -255,7 +255,15 @@ public class GUI {
private static void schemDialog(Player p, SchematicType type, boolean publicSchems, boolean unchecked) {
SchematicSelector selector = new SchematicSelector(p, Config.test() ? SchematicSelector.selectSchematic() : SchematicSelector.selectSchematicType(unchecked ? type.checkType() : type), node -> {
schemSelect(p, node);
});
}) {
@Override
protected List<SchematicNode> getSchematicList(SchematicNode parent) {
if (!publicSchems || parent != null) return super.getSchematicList(parent);
List<Integer> publics = Config.GameModeConfig.Schematic.Publics;
if (publics.isEmpty()) return super.getSchematicList(null);
return publics.stream().map(SchematicNode::byId).collect(Collectors.toList());
}
};
selector.setPublicMode(publicSchems ? SchematicSelector.PublicMode.PUBLIC_ONLY : SchematicSelector.PublicMode.PRIVATE_ONLY);
selector.open();
}
@@ -46,6 +46,7 @@ import org.bukkit.util.Vector;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Random;
import java.util.logging.Level;
@@ -109,31 +110,47 @@ public class FightSchematic extends StateDependent {
clipboard = null;
}
private static final Random random = new Random();
public static Optional<SchematicNode> getPublicSchematic() {
List<Integer> publicsOverridden = Config.GameModeConfig.Schematic.Publics;
if (!publicsOverridden.isEmpty()) {
int publicId = publicsOverridden.get(random.nextInt(publicsOverridden.size()));
SchematicNode schematicNode = SchematicNode.getSchematicNode(publicId);
if (schematicNode != null) {
return Optional.of(schematicNode);
}
}
List<SchematicNode> publics = SchematicNode.getAllSchematicsOfType(0, Config.GameModeConfig.Schematic.Type.toDB());
if (publics.isEmpty()) {
for (SchematicType type : Config.GameModeConfig.Schematic.SubTypes) {
publics = SchematicNode.getAllSchematicsOfType(0, type.toDB());
if (!publics.isEmpty()) {
break;
}
}
if (publics.isEmpty()) {
return Optional.empty();
}
}
return Optional.of(publics.get(random.nextInt(publics.size())));
}
@Override
public void enable() {
if (FightState.getFightState() == FightState.SPECTATE) return;
if (clipboard == null) {
List<SchematicNode> publics = SchematicNode.getAllSchematicsOfType(0, Config.GameModeConfig.Schematic.Type.toDB());
if (publics.isEmpty()) {
for (SchematicType type : Config.GameModeConfig.Schematic.SubTypes) {
publics = SchematicNode.getAllSchematicsOfType(0, type.toDB());
if (!publics.isEmpty()) {
break;
}
}
if (publics.isEmpty()) {
return;
}
}
setSchematic(publics.get(new Random().nextInt(publics.size())));
Optional<SchematicNode> schematicNode = getPublicSchematic();
if (schematicNode.isEmpty()) return;
setSchematic(schematicNode.get());
}
if (ArenaMode.AntiReplay.contains(Config.mode)) {
boolean changeRotation = false;
if (Config.GameModeConfig.WinConditions.contains(Winconditions.RANDOM_ROTATE)) {
changeRotation = new Random().nextBoolean();
changeRotation = random.nextBoolean();
usedRotate = rotate ^ changeRotation;
}
if (team.isBlue()) {
@@ -256,10 +256,6 @@ public class FightTeam {
broadcast(player -> FightSystem.getMessage().send(message, player, params));
}
public void broadcastChat(Player sender, String message) {
broadcast(player -> FightSystem.getMessage().sendPrefixless("TEAM_CHAT", player, ChatMessageType.CHAT, prefix, sender.getName(), message));
}
private void broadcast(Consumer<Player> f) {
players.forEach((uuid, fightPlayer) -> {
Player player = Bukkit.getPlayer(uuid);
@@ -19,50 +19,41 @@
package de.steamwar.fightsystem.listener;
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.StateDependentListener;
import de.steamwar.linkage.Linked;
import de.steamwar.network.packets.PacketHandler;
import de.steamwar.network.packets.server.ChatRecordPacket;
import de.steamwar.sql.SteamwarUser;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import java.util.logging.Level;
/**
* Chat is handled by Velocity. Messages written on this server are only sent here to be recorded for the replay.
*/
@Linked
public class Chat implements Listener {
public class Chat extends PacketHandler {
public Chat() {
new StateDependentListener(ArenaMode.All, FightState.All, this);
}
@Handler
public void handleChatRecord(ChatRecordPacket packet) {
SteamwarUser user = SteamwarUser.byId(packet.getPlayerId());
String message = packet.getMessage();
FightSystem.getPlugin().getLogger().log(Level.INFO, user.getUserName() + "» " + message);
@EventHandler
public void handlePlayerChat(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
String message = event.getMessage();
FightSystem.getPlugin().getLogger().log(Level.INFO, player.getName() + "» " + message);
FightTeam fightTeam = Fight.getPlayerTeam(player);
Player player = Bukkit.getPlayer(user.getUUID());
FightTeam fightTeam = player != null ? Fight.getPlayerTeam(player) : null;
if (fightTeam != null) {
String teamName = fightTeam.getColoredName();
if (message.startsWith(Config.GameModeConfig.TeamChatPrefix)) {
fightTeam.broadcastChat(player, message.substring(1));
} else {
broadcastChat("PARTICIPANT_CHAT", teamName, player.getName(), message);
}
} else if (Config.isReferee(player)) {
broadcastChat("FIGHTLEADER_CHAT", player.getName(), message);
GlobalRecorder.getInstance().chat("PARTICIPANT_CHAT", fightTeam.getColoredName(), user.getUserName(), message);
} else if (player != null && Config.isReferee(player)) {
GlobalRecorder.getInstance().chat("FIGHTLEADER_CHAT", user.getUserName(), message);
} else {
broadcastChat("SPECTATOR_CHAT", player.getName(), message);
GlobalRecorder.getInstance().chat("SPECTATOR_CHAT", user.getUserName(), message);
}
event.setCancelled(true);
}
public static void broadcastChat(String message, Object... params) {