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
108 changes: 55 additions & 53 deletions src/main/java/net/fameless/forcebattle/command/RandomTeamsCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,78 +36,80 @@ protected void executeCommand(final CommandCaller caller, final String[] args) {
return;
}

if (args.length > 0 && !args[0].isEmpty()) {
int size;
try {
size = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
caller.sendMessage(Caption.of("command.not_a_number"));
return;
}
if (args.length == 0 || args[0].isEmpty()) {
sendUsage(caller);
return;
}

List<BattlePlayer> players = new ArrayList<>(BattlePlayer.getOnlinePlayers());
int playerAmount = players.size();
int size;
try {
size = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
caller.sendMessage(Caption.of("command.not_a_number"));
return;
}

if (playerAmount % size != 0) {
caller.sendMessage(Caption.of("error.no_equal_teams"));
return;
}
List<BattlePlayer> players = new ArrayList<>(BattlePlayer.getOnlinePlayers());
int playerAmount = players.size();

int amountOfTeams = playerAmount / size;
if (playerAmount % size != 0) {
caller.sendMessage(Caption.of("error.no_equal_teams"));
return;
}

if (args[1].equalsIgnoreCase("fillExistingTeams")) {
List<Team> existingTeams = new ArrayList<>(Team.teams);
Random random = new Random();
int amountOfTeams = playerAmount / size;
Random random = new Random();

for (Team team : existingTeams) {
for (BattlePlayer p : team.getPlayers()) {
players.remove(p);
}
if (args.length > 1 && args[1].equalsIgnoreCase("fillExistingTeams")) {
List<Team> existingTeams = new ArrayList<>(Team.teams);

for (Team team : existingTeams) {
for (BattlePlayer p : team.getPlayers()) {
players.remove(p);
}
}

for (Team team : existingTeams) {
while (team.getPlayers().size() > size) {
BattlePlayer removed = team.getPlayers().get(random.nextInt(team.getPlayers().size()));
team.removePlayer(removed);
players.add(removed);
}
for (Team team : existingTeams) {
while (team.getPlayers().size() > size) {
BattlePlayer removed = team.getPlayers().get(random.nextInt(team.getPlayers().size()));
team.removePlayer(removed);
players.add(removed);
}
}

for (Team team : existingTeams) {
while (team.getPlayers().size() < size && !players.isEmpty()) {
BattlePlayer randomPlayer = players.remove(random.nextInt(players.size()));
team.addPlayer(randomPlayer);
}
for (Team team : existingTeams) {
while (team.getPlayers().size() < size && !players.isEmpty()) {
BattlePlayer randomPlayer = players.remove(random.nextInt(players.size()));
team.addPlayer(randomPlayer);
}
}

while (!players.isEmpty()) {
BattlePlayer first = players.remove(random.nextInt(players.size()));
Team team = new Team(List.of(first));
while (!players.isEmpty()) {
BattlePlayer first = players.remove(random.nextInt(players.size()));
Team team = new Team(List.of(first));

while (team.getPlayers().size() < size && !players.isEmpty()) {
BattlePlayer next = players.remove(random.nextInt(players.size()));
team.addPlayer(next);
}
while (team.getPlayers().size() < size && !players.isEmpty()) {
BattlePlayer next = players.remove(random.nextInt(players.size()));
team.addPlayer(next);
}
} else {
Team.deleteAll();
}

Random random = new Random();
} else {
Team.deleteAll();

for (int i = 0; i < amountOfTeams; i++) {
BattlePlayer first = players.remove(random.nextInt(players.size()));
Team team = new Team(List.of(first));
for (int i = 0; i < amountOfTeams; i++) {
BattlePlayer first = players.remove(random.nextInt(players.size()));
Team team = new Team(List.of(first));

while (team.getPlayers().size() < size && !players.isEmpty()) {
BattlePlayer next = players.remove(random.nextInt(players.size()));
team.addPlayer(next);
}
while (team.getPlayers().size() < size && !players.isEmpty()) {
BattlePlayer next = players.remove(random.nextInt(players.size()));
team.addPlayer(next);
}
}

caller.sendMessage(Caption.of("notification.randomteams_successfully_created",
TagResolver.resolver("amount", Tag.inserting(Component.text(String.valueOf(amountOfTeams))))));
}

caller.sendMessage(Caption.of("notification.randomteams_successfully_created",
TagResolver.resolver("amount", Tag.inserting(Component.text(String.valueOf(amountOfTeams))))));
}

@Override
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/net/fameless/forcebattle/game/GameListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,8 @@ public void onPlayerSkip(@NotNull PlayerInteractEvent event) {
));
battlePlayer.updateObjective(true, true);

battlePlayer.addSkippedObjectiveToList(oldObjective);

decreaseItemAmount(event);

if (oldObjective.getBattleType() == BattleType.FORCE_ITEM) {
Expand Down Expand Up @@ -418,6 +420,8 @@ public void onTeamSkip(@NotNull PlayerInteractEvent event) {

team.updateObjective(battlePlayer, true, true);

battlePlayer.addSkippedObjectiveToList(oldObjective);

decreaseItemAmount(event);

if (oldObjective.getBattleType() == BattleType.FORCE_ITEM) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,13 @@ private Objective generateObjective(BattleType battleType, BattlePlayer battlePl
if (SettingsManager.isEnabled(SettingsManager.Setting.NO_DUPLICATE_OBJECTIVES)) {
Set<String> finished = new HashSet<>();
if (team == null || !battlePlayer.isInTeam()) {
battlePlayer.getSkippedObjectives().forEach(obj -> finished.add(obj.getObjectiveString()));
Objective.finishedBy(battlePlayer).forEach(obj -> finished.add(obj.getObjectiveString()));
} else {
team.getPlayers().forEach(p -> Objective.finishedBy(p).forEach(obj -> finished.add(obj.getObjectiveString())));
for (BattlePlayer teammate : team.getPlayers()) {
teammate.getSkippedObjectives().forEach(obj -> finished.add(obj.getObjectiveString()));
Objective.finishedBy(teammate).forEach(obj -> finished.add(obj.getObjectiveString()));
}
}
allPossible.removeIf(finished::contains);
}
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/net/fameless/forcebattle/game/Team.java
Original file line number Diff line number Diff line change
Expand Up @@ -210,10 +210,12 @@ public void createBackpackGUIs() {
int requiredSlots = getPlayers().size() * SLOTS_PER_MEMBER;
int requiredPages = (int) Math.ceil(requiredSlots / (double) MAX_PAGE_SIZE);

BACKPACK_INVENTORIES.clear();

for (int i = 0; i < requiredPages; i++) {
int pageSize = Math.min(MAX_PAGE_SIZE, requiredSlots - (i * MAX_PAGE_SIZE));

BACKPACK_INVENTORIES.add(new TeamBackpackGUI(i, pageSize));
BACKPACK_INVENTORIES.add(new TeamBackpackGUI(i, pageSize, this));
}
}

Expand Down
24 changes: 16 additions & 8 deletions src/main/java/net/fameless/forcebattle/gui/ForceBattleGUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ public abstract class ForceBattleGUI implements Listener, InventoryHolder {
protected String title;
protected int size;
protected final List<GUIItem> items;

private Inventory inventory;
private BattlePlayer player;

private final Set<UUID> currentViewers = ConcurrentHashMap.newKeySet();

private boolean hasFinishedLoading = false;

public ForceBattleGUI(String title, int size) {
Expand Down Expand Up @@ -122,18 +123,21 @@ public ItemStack getItem(BattlePlayer player) {
}

public void open(BattlePlayer player) {
this.player = player;
Player p = player.getPlayer();
ForceBattleGUI previous = GUI_MAP.get(p.getUniqueId());

if (previous != null) {
previous.removeViewer(p.getUniqueId());
previous.onClose(new InventoryCloseEvent(p.getOpenInventory()), CloseReason.SERVER_EXITED);
GUI_MAP.remove(p.getUniqueId());
}

if (this.inventory == null) {
this.inventory = Bukkit.createInventory(this, size, title);
}

// Add to viewers
this.currentViewers.add(p.getUniqueId());
GUI_MAP.put(p.getUniqueId(), this);

try {
Expand All @@ -151,11 +155,16 @@ public void open(BattlePlayer player) {
}

public void close(BattlePlayer player, CloseReason reason) {
UUID playerId = player.getPlayer().getUniqueId();
player.getPlayer().closeInventory();
onClose(new InventoryCloseEvent(player.getPlayer().getOpenInventory()), reason);
GUI_MAP.remove(player.getPlayer().getUniqueId());
removeViewer(playerId);
GUI_MAP.remove(playerId);
}

private void removeViewer(UUID playerId) {
currentViewers.remove(playerId);
}

public void updateInventory(BattlePlayer player) {
synchronized (items) {
Expand All @@ -166,10 +175,9 @@ public void updateInventory(BattlePlayer player) {
}
}

public void setTitle(String title) {
this.title = title;
if (inventory != null) {
inventory = Bukkit.createInventory(this, size, title);
public void updateInventoryForPlayer(BattlePlayer player) {
Player bukkitPlayer = player.getPlayer();
if (bukkitPlayer.getOpenInventory().getTopInventory().getHolder() == this) {
updateInventory(player);
}
}
Expand Down
8 changes: 7 additions & 1 deletion src/main/java/net/fameless/forcebattle/gui/GUIListener.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package net.fameless.forcebattle.gui;

import net.fameless.forcebattle.player.BattlePlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
Expand All @@ -20,7 +22,11 @@ public void onClick(InventoryClickEvent event) {

if (clicked instanceof GUIClickableItem clickable) {
event.setCancelled(true);
clickable.onClick(event, gui.getPlayer());

Player player = (Player) event.getWhoClicked();
BattlePlayer battlePlayer = BattlePlayer.adapt(player);

clickable.onClick(event, battlePlayer);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,53 @@
import net.fameless.forcebattle.game.Team;
import net.fameless.forcebattle.gui.ForceBattleGUI;
import net.fameless.forcebattle.gui.GUIClickableItem;
import net.fameless.forcebattle.gui.GUIItem;
import net.fameless.forcebattle.player.BattlePlayer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;

public class TeamBackpackGUI extends ForceBattleGUI {

private final int index;
private final Team team;


public TeamBackpackGUI(int index, int size) {
public TeamBackpackGUI(int index, int size, Team team) {
super(Caption.getAsLegacy("gui.team_backpack_title",
TagResolver.resolver("page", Tag.inserting(Component.text(String.valueOf(index + 1))))), size);
TagResolver.resolver("page", Tag.inserting(Component.text(String.valueOf(index + 1))))), size);
this.index = index;
this.team = team;
}

@Override
public void setItems(final BattlePlayer player) {
Team team = player.getTeam();
int inventoryPages = team.getBACKPACK_INVENTORIES().size();

if (index < 0 || index >= inventoryPages) return;

if (index < inventoryPages - 1) {
set(GUIClickableItem.getGoForthItem(size - 1, team.getBACKPACK_INVENTORIES().get(index + 1)));
int nextArrowSlot = size - 1;
int prevArrowSlot = size - 9;

synchronized (items) {
items.removeIf(item -> {
if (item.slot == nextArrowSlot || item.slot == prevArrowSlot) {
return item instanceof GUIClickableItem;
}
return false;
});
}

if (index > 0) {
set(GUIClickableItem.getGoBackItem(size - 9, team.getBACKPACK_INVENTORIES().get(index - 1)));
GUIItem nextItem = get(nextArrowSlot);
if (nextItem instanceof GUIClickableItem) {
getInventory().setItem(nextArrowSlot, null);
}

GUIItem prevItem = get(prevArrowSlot);
if (prevItem instanceof GUIClickableItem) {
getInventory().setItem(prevArrowSlot, null);
}

if (index < inventoryPages - 1) set(GUIClickableItem.getGoForthItem(size - 1, team.getBACKPACK_INVENTORIES().get(index + 1)));
if (index > 0) set(GUIClickableItem.getGoBackItem(size - 9, team.getBACKPACK_INVENTORIES().get(index - 1)));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ public class BattlePlayer implements CommandCaller {
@Getter
private Objective objective;
@Getter
@Setter
private List<Objective> skippedObjectives = new ArrayList<>();
@Getter
private boolean excluded;
@Getter
@Setter
Expand Down Expand Up @@ -277,6 +280,7 @@ public void reset(boolean newObjective) {

this.points = 0;
this.chainProgress = 0;
this.skippedObjectives = new ArrayList<>();
if (this.isInTeam()) {
this.getTeam().setChainProgress(0);
}
Expand Down Expand Up @@ -329,6 +333,10 @@ public boolean hasPermission(@NotNull String permission) {
return getPlayer().hasPermission(permission);
}

public void addSkippedObjectiveToList(Objective objective) {
skippedObjectives.add(objective);
}

public void addPlayerSkip(final int amount) {
if (getPlayer() == null) {
return;
Expand Down
Loading