Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/java/net/fameless/forcebattle/ForceBattle.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import net.fameless.forcebattle.gui.LanguageGUI;
import net.fameless.forcebattle.gui.ResultGUI;
import net.fameless.forcebattle.gui.SettingsGUI;
import net.fameless.forcebattle.tablist.TablistManager;
import net.fameless.forcebattle.util.BukkitUtil;
import net.fameless.forcebattle.util.ResourceUtil;
import net.kyori.adventure.text.Component;
Expand Down Expand Up @@ -105,6 +106,7 @@ private void initCore() {

Command.createInstances();
BossbarManager.runTask();
TablistManager.startUpdating();
PluginUpdater.checkForUpdate();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package net.fameless.forcebattle.command;

import net.fameless.forcebattle.ForceBattle;
import net.fameless.forcebattle.caption.Caption;
import net.fameless.forcebattle.command.framework.CallerType;
import net.fameless.forcebattle.command.framework.Command;
Expand Down Expand Up @@ -34,10 +33,6 @@ public void executeCommand(CommandCaller caller, String[] args) {
caller.sendMessage(Caption.of("error.backpacks_disabled"));
return;
}
if (!ForceBattle.getTimer().isRunning()) {
caller.sendMessage(Caption.of("error.game_not_started"));
return;
}

Optional<BattlePlayer> senderOpt = BattlePlayer.adapt(caller.getName());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,7 @@

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
Expand All @@ -42,76 +39,60 @@ protected void executeCommand(CommandCaller caller, String[] args) {
return;
}

final HashMap<BattlePlayer, Integer> PLAYER_POINTS_MAP = new HashMap<>();
final HashMap<Team, Integer> TEAM_POINTS_MAP = new HashMap<>();

for (BattlePlayer battlePlayer : BattlePlayer.BATTLE_PLAYERS) {
PLAYER_POINTS_MAP.put(battlePlayer, battlePlayer.getPoints());
}

LinkedHashMap<BattlePlayer, Integer> sortedPlayerPointsMap = PLAYER_POINTS_MAP.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
HashMap.Entry::getKey,
HashMap.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));

for (Team team : Team.teams) {
TEAM_POINTS_MAP.put(team, team.getPoints());
if (args.length == 0) {
sendUsage(caller);
return;
}

LinkedHashMap<Team, Integer> sortedTeamPointsMap = TEAM_POINTS_MAP.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
HashMap.Entry::getKey,
HashMap.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
final long delay = 750;
final long[] counter = {0};

switch (args[0]) {
switch (args[0].toLowerCase()) {
case "player" -> {
sortedPlayerPointsMap.forEach((battlePlayer, points) -> {
long place = sortedPlayerPointsMap.size() - counter[0];
scheduler.schedule(
() -> ForceBattle.broadcast(
MiniMessage.miniMessage().deserialize("<gold>" + place + ". <blue>" + battlePlayer.getName() + "<dark_gray>: <gold>" + points)
), counter[0] * delay, TimeUnit.MILLISECONDS
);
List<BattlePlayer> sortedPlayers = new ArrayList<>(BattlePlayer.BATTLE_PLAYERS);
sortedPlayers.sort(Comparator.comparingInt(BattlePlayer::getPoints).reversed());

for (BattlePlayer player : sortedPlayers) {
int place = BattlePlayer.getPlace(player);
int points = player.getPoints();

scheduler.schedule(() -> ForceBattle.broadcast(
MiniMessage.miniMessage().deserialize(
"<gold>" + place + ". <blue>" + player.getName() + "<dark_gray>: <gold>" + points
)
), counter[0] * delay, TimeUnit.MILLISECONDS);
counter[0]++;
});

scheduler.shutdown();
}
}

case "team" -> {
sortedTeamPointsMap.forEach((team, points) -> {
long place = sortedTeamPointsMap.size() - counter[0];
List<Team> sortedTeams = new ArrayList<>(Team.teams);
sortedTeams.sort(Comparator.comparingInt(Team::getPoints).reversed());

for (Team team : sortedTeams) {
int place = Team.getPlace(team);
int points = team.getPoints();

String players = team.getPlayers().stream()
.sorted(Comparator.comparingInt(BattlePlayer::getPoints).reversed())
.map(p -> p.getName() + " (" + p.getPoints() + ")")
.collect(Collectors.joining(", "));

scheduler.schedule(
() -> ForceBattle.broadcast(
MiniMessage.miniMessage().deserialize("<gold>" + place + ". <blue>" + team.getId() + " (<gray>" + players + "<blue>)" + "<dark_gray" +
">: <gold>" + points)
), counter[0] * delay, TimeUnit.MILLISECONDS
);
scheduler.schedule(() -> ForceBattle.broadcast(
MiniMessage.miniMessage().deserialize(
"<gold>" + place + ". <blue>" + team.getId() +
" (<gray>" + players + "<blue>)<dark_gray>: <gold>" + points
)
), counter[0] * delay, TimeUnit.MILLISECONDS);
counter[0]++;
});

scheduler.shutdown();
}
}

default -> sendUsage(caller);
}

scheduler.shutdown();
}

@Override
Expand Down
26 changes: 15 additions & 11 deletions src/main/java/net/fameless/forcebattle/command/SkipCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,17 +51,21 @@ public void executeCommand(CommandCaller caller, String[] args) {
);
}
case "team" -> {
@NotNull Optional<Team> teamOpt = Team.ofId(Integer.parseInt(args[1]));
teamOpt.ifPresentOrElse(
team -> {
team.updateObjective(null, false, false);
team.getPlayers().forEach(player -> player.sendMessage(Caption.of("notification.skip_by_admin_target")));
caller.sendMessage(Caption.of(
"notification.skip_by_admin_player",
TagResolver.resolver("player", Tag.inserting(Component.text(team.getId())))
));
}, () -> caller.sendMessage(Caption.of("command.no_such_team"))
);
try {
@NotNull Optional<Team> teamOpt = Team.ofId(Integer.parseInt(args[3]));
teamOpt.ifPresentOrElse(
team -> {
team.updateObjective(null, false, false);
team.getPlayers().forEach(player -> player.sendMessage(Caption.of("notification.skip_by_admin_target")));
caller.sendMessage(Caption.of(
"notification.skip_by_admin_player",
TagResolver.resolver("player", Tag.inserting(Component.text(team.getId())))
));
}, () -> caller.sendMessage(Caption.of("command.no_such_team"))
);
} catch (NumberFormatException e) {
caller.sendMessage(Caption.of("command.not_a_number"));
}
}
}
} else {
Expand Down
19 changes: 8 additions & 11 deletions src/main/java/net/fameless/forcebattle/game/GameListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@

public class GameListener implements Listener {

private final List<BattlePlayer> skipCooldown = new ArrayList<>();
private final List<BattlePlayer> playerSkipCooldown = new ArrayList<>();
private final List<BattlePlayer> teamSkipCooldown = new ArrayList<>();
private final List<BattlePlayer> swapCooldown = new ArrayList<>();
private boolean sentUpdateMessage = false;
private boolean startPhase = true;
Expand All @@ -73,10 +74,6 @@ public GameListener() {
TaskManager.startAll();
}

//TODO bp nach dem battle aufmachen
//TODO prüfen ob ruined portals gehen
//TODO /displayresults auf gleiche Plätze setzen wenn Punkte gleich => nächstes team dementsprechend abstufen
//TODO evtl dupe obj fix for both player/team idk
//TODO better tablist
//TODO scoreboard which shows teammate obj

Expand Down Expand Up @@ -285,7 +282,7 @@ public void onPlayerSkip(@NotNull PlayerInteractEvent event) {

BattlePlayer battlePlayer = BattlePlayer.adapt(event.getPlayer());
if (battlePlayer.isExcluded()) return;
if (skipCooldown.contains(battlePlayer)) return;
if (playerSkipCooldown.contains(battlePlayer)) return;

event.setCancelled(true);

Expand All @@ -312,8 +309,8 @@ public void onPlayerSkip(@NotNull PlayerInteractEvent event) {
ItemStack itemStack = new ItemStack(Material.valueOf(oldObjective.getObjectiveString()));
battlePlayer.getPlayer().getWorld().dropItemNaturally(battlePlayer.getPlayer().getLocation(), itemStack);
}
skipCooldown.add(battlePlayer);
Bukkit.getScheduler().runTaskLater(ForceBattle.get(), () -> skipCooldown.remove(battlePlayer), 20);
playerSkipCooldown.add(battlePlayer);
Bukkit.getScheduler().runTaskLater(ForceBattle.get(), () -> playerSkipCooldown.remove(battlePlayer), 20);
}

@EventHandler
Expand All @@ -325,7 +322,7 @@ public void onTeamSkip(@NotNull PlayerInteractEvent event) {
BattlePlayer battlePlayer = BattlePlayer.adapt(event.getPlayer());
Team team = battlePlayer.getTeam();
if (battlePlayer.isExcluded()) return;
if (skipCooldown.contains(battlePlayer)) return;
if (teamSkipCooldown.contains(battlePlayer)) return;

event.setCancelled(true);

Expand Down Expand Up @@ -363,8 +360,8 @@ public void onTeamSkip(@NotNull PlayerInteractEvent event) {
ItemStack itemStack = new ItemStack(Material.valueOf(oldObjective.getObjectiveString()));
battlePlayer.getPlayer().getWorld().dropItemNaturally(battlePlayer.getPlayer().getLocation(), itemStack);
}
skipCooldown.add(battlePlayer);
Bukkit.getScheduler().runTaskLater(ForceBattle.get(), () -> skipCooldown.remove(battlePlayer), 20);
teamSkipCooldown.add(battlePlayer);
Bukkit.getScheduler().runTaskLater(ForceBattle.get(), () -> teamSkipCooldown.remove(battlePlayer), 20);
}

@EventHandler
Expand Down
16 changes: 14 additions & 2 deletions src/main/java/net/fameless/forcebattle/game/ObjectiveManager.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.fameless.forcebattle.game;

import net.fameless.forcebattle.ForceBattle;
import net.fameless.forcebattle.caption.Caption;
import net.fameless.forcebattle.configuration.SettingsManager;
import net.fameless.forcebattle.game.data.BiomeSimplified;
import net.fameless.forcebattle.game.data.StructureSimplified;
Expand All @@ -9,6 +10,9 @@
import net.fameless.forcebattle.util.BattleType;
import net.fameless.forcebattle.util.BukkitUtil;
import net.fameless.forcebattle.game.data.Structure;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
Expand All @@ -22,7 +26,6 @@
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
Expand Down Expand Up @@ -96,7 +99,16 @@ private Objective generateObjective(BattleType battleType, BattlePlayer battlePl
allPossible.removeIf(finished::contains);
}

if (allPossible.isEmpty()) return null;
if (allPossible.isEmpty()) {
battlePlayer.sendMessage(Caption.of(
"error.no_objective_available", TagResolver.resolver("type", Tag.inserting(Component.text(battleType.name())))
));
if (team != null) {
return getNewObjective(team);
} else {
return getNewObjective(battlePlayer);
}
}

String objectiveString = allPossible.get(random.nextInt(allPossible.size()));
return new Objective(battleType, objectiveString);
Expand Down
46 changes: 28 additions & 18 deletions src/main/java/net/fameless/forcebattle/game/Team.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -174,34 +175,45 @@ public static Map<Integer, Team> getPlaces() {
}

public static int getPlace(Team team) {
return getPlaces().entrySet()
.stream()
.filter(entry -> entry.getValue().equals(team))
.map(Map.Entry::getKey)
.findFirst()
.orElse(-1);
}
List<Team> sortedTeams = new ArrayList<>(Team.teams);
sortedTeams.sort(Comparator.comparingInt(Team::getPoints).reversed());

public void updateObjective(BattlePlayer finisher, boolean finishLast, boolean hasBeenSkipped) {
Objective newObjective = ForceBattle.getObjectiveManager().getNewObjective(this);
ObjectiveUpdateEvent updateEvent = new ObjectiveUpdateEvent(this, newObjective);
Bukkit.getPluginManager().callEvent(updateEvent);
if (updateEvent.isCancelled()) {
logger.info("ObjectiveUpdateEvent has been denied by an external plugin.");
return;
int place = 1;
int previousPoints = -1;

for (int i = 0; i < sortedTeams.size(); i++) {
Team current = sortedTeams.get(i);

if (current.getPoints() != previousPoints) {
place = i + 1;
previousPoints = current.getPoints();
}

if (current.equals(team)) {
return place;
}
}

setCurrentObjective(updateEvent.getNewObjective(), finisher, finishLast, hasBeenSkipped);
return -1;
}

public void setCurrentObjective(Objective newObjective, BattlePlayer finisher, boolean finishLast, boolean hasBeenSkipped) {

public void updateObjective(BattlePlayer finisher, boolean finishLast, boolean hasBeenSkipped) {
if (finishLast && this.objective != null) {
this.objective.setFinished(finisher);
this.objective.setHasBeenSkipped(hasBeenSkipped);

finisher.setPoints(finisher.getPoints() + 1);
}

Objective newObjective = ForceBattle.getObjectiveManager().getNewObjective(this);
if (newObjective == null) return;

ObjectiveUpdateEvent updateEvent = new ObjectiveUpdateEvent(this, newObjective);
Bukkit.getPluginManager().callEvent(updateEvent);
if (updateEvent.isCancelled()) return;

this.objective = updateEvent.getNewObjective();
if (ForceBattle.getTimer().isRunning()) {
for (BattlePlayer member : players) {
member.sendMessage(Caption.of(
Expand All @@ -211,8 +223,6 @@ public void setCurrentObjective(Objective newObjective, BattlePlayer finisher, b
));
}
}

this.objective = newObjective;
}

@Getter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
public enum StructureSimplified {
VILLAGE("Village", List.of(Structure.VILLAGE_PLAINS, Structure.VILLAGE_SAVANNA, Structure.VILLAGE_SNOWY, Structure.VILLAGE_TAIGA, Structure.VILLAGE_DESERT)),
PILLAGER_OUTPOST("Pillager Outpost", List.of(Structure.PILLAGER_OUTPOST)),
//RUINED_PORTAL("Ruined Portal", List.of(Structure.RUINED_PORTAL_MOUNTAIN, Structure.RUINED_PORTAL_DESERT, Structure.RUINED_PORTAL_JUNGLE,
// Structure.RUINED_PORTAL_OCEAN, Structure.RUINED_PORTAL_SWAMP, Structure.RUINED_PORTAL_NETHER)),
RUINED_PORTAL("Ruined Portal", List.of(Structure.RUINED_PORTAL_MOUNTAIN, Structure.RUINED_PORTAL_DESERT, Structure.RUINED_PORTAL_JUNGLE,
Structure.RUINED_PORTAL_OCEAN, Structure.RUINED_PORTAL_SWAMP, Structure.RUINED_PORTAL_NETHER)),
OCEAN_RUIN("Ocean Ruin", List.of(Structure.OCEAN_RUIN_COLD, Structure.OCEAN_RUIN_WARM)),
TRIAL_CHAMBERS("Trial Chambers", List.of(Structure.TRIAL_CHAMBERS)),
SHIPWRECK("Shipwreck", List.of(Structure.SHIPWRECK, Structure.SHIPWRECK_BEACHED)),
Expand Down
Loading
Loading