diff --git a/src/main/java/gent/zeus/mc13dtl/MC13DTL.java b/src/main/java/gent/zeus/mc13dtl/MC13DTL.java index e074056..ff9aa67 100644 --- a/src/main/java/gent/zeus/mc13dtl/MC13DTL.java +++ b/src/main/java/gent/zeus/mc13dtl/MC13DTL.java @@ -2,6 +2,7 @@ package gent.zeus.mc13dtl; import gent.zeus.mc13dtl.group.GroupAddCommand; import gent.zeus.mc13dtl.group.GroupRemoveCommand; +import gent.zeus.mc13dtl.group.SetScoreCommand; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitScheduler; @@ -28,12 +29,13 @@ public class MC13DTL extends JavaPlugin { commands.register("start-game", "Start a game of 13 days to live", new StartGameCommand()); commands.register("toggle-pause", "Toggle paused state", new TogglePauseCommand()); commands.register("group-add", "Add player to team", new GroupAddCommand()); + commands.register("set-score", "Set the score of a team", new SetScoreCommand()); commands.register("group-remove", "Remove player from team", new GroupRemoveCommand()); }); BukkitScheduler scheduler = this.getServer().getScheduler(); - scheduler.runTaskTimer(this, new EventRunner(), 0, 100); scheduler.runTask(this, () -> { board = new TeamScoreBoard(); }); + scheduler.runTaskTimer(this, new EventRunner(), 0, 100); } } diff --git a/src/main/java/gent/zeus/mc13dtl/TeamScoreBoard.java b/src/main/java/gent/zeus/mc13dtl/TeamScoreBoard.java index 1a64f2a..c8ab40a 100644 --- a/src/main/java/gent/zeus/mc13dtl/TeamScoreBoard.java +++ b/src/main/java/gent/zeus/mc13dtl/TeamScoreBoard.java @@ -12,8 +12,8 @@ import java.util.Set; public class TeamScoreBoard { - private ScoreboardManager sm; - private Scoreboard scoreboard; + private final ScoreboardManager sm; + private final Scoreboard scoreboard; private Objective objective; diff --git a/src/main/java/gent/zeus/mc13dtl/events/Difficulty.java b/src/main/java/gent/zeus/mc13dtl/events/Difficulty.java new file mode 100644 index 0000000..7a977c5 --- /dev/null +++ b/src/main/java/gent/zeus/mc13dtl/events/Difficulty.java @@ -0,0 +1,10 @@ +package gent.zeus.mc13dtl.events; + +public enum Difficulty { + BABY, + EASY, + MEDIUM, + HARD, + SWEAT, + IMPOSSIBLE +} diff --git a/src/main/java/gent/zeus/mc13dtl/events/Event.java b/src/main/java/gent/zeus/mc13dtl/events/Event.java index 49a3017..b2e33e6 100644 --- a/src/main/java/gent/zeus/mc13dtl/events/Event.java +++ b/src/main/java/gent/zeus/mc13dtl/events/Event.java @@ -11,11 +11,15 @@ import org.bukkit.scoreboard.Team; import gent.zeus.mc13dtl.MC13DTL; + public abstract class Event implements Listener { protected Team team; + protected final Difficulty difficulty; - public Event(Team team) { + public Event(Team team, Difficulty difficulty) { this.team = team; + this.difficulty = difficulty; + MC13DTL.board.sendMessageToTeam(team, Component.text("Difficulty is " + this.difficulty.toString())); MC13DTL.board.sendMessageToTeam(team, Component.text(getMessage()).color(NamedTextColor.GRAY).decorate(TextDecoration.ITALIC)); MC13DTL.instance.getServer().getPluginManager().registerEvents(this, MC13DTL.instance); EventRunner.currentEvents.add(this); diff --git a/src/main/java/gent/zeus/mc13dtl/events/EventRunner.java b/src/main/java/gent/zeus/mc13dtl/events/EventRunner.java index 4d71991..b6b158e 100644 --- a/src/main/java/gent/zeus/mc13dtl/events/EventRunner.java +++ b/src/main/java/gent/zeus/mc13dtl/events/EventRunner.java @@ -5,34 +5,78 @@ import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.persistence.PersistentDataType; import org.bukkit.scoreboard.Team; + import java.util.List; import java.util.ArrayList; +import java.util.OptionalDouble; +import java.util.Set; +import java.util.stream.Collectors; import gent.zeus.mc13dtl.MC13DTL; import gent.zeus.mc13dtl.events.catalog.TestEvent; import gent.zeus.mc13dtl.events.catalog.TestEvent2; public class EventRunner implements Runnable { - static List currentEvents = new ArrayList<>(); + static List currentEvents = new ArrayList<>(); - @Override - public void run() { - World world = Bukkit.getWorld("world"); - NamespacedKey eventKey = new NamespacedKey(MC13DTL.instance, "last-event-day"); - long lastRunDay = world.getPersistentDataContainer().get(eventKey, PersistentDataType.LONG); - long day = Bukkit.getWorld("world").getFullTime() / 24000; - if (day > lastRunDay && Bukkit.getWorld("world").getTime() >= 14000) { - while (!currentEvents.isEmpty()) { - Event event = currentEvents.get(0); - event.eventFailed(); - } - for (Team i : MC13DTL.board.getTeams()) { - switch ((int) day) { - case 0 -> new TestEvent(i); - case 1 -> new TestEvent2(i); + private long day; + + @Override + public void run() { + World world = Bukkit.getWorld("world"); + NamespacedKey eventKey = new NamespacedKey(MC13DTL.instance, "last-event-day"); + long lastRunDay = world.getPersistentDataContainer().get(eventKey, PersistentDataType.LONG); + day = Bukkit.getWorld("world").getFullTime() / 24000; + if (day > lastRunDay && Bukkit.getWorld("world").getTime() >= 14000) { + while (!currentEvents.isEmpty()) { + Event event = currentEvents.getFirst(); + event.eventFailed(); + } + + List teams = MC13DTL.board.getTeams().stream().toList(); + List difficulties = getDifficulties(teams); + for (int i = 0; i < teams.size() && i < difficulties.size(); i++) { + Team team = teams.get(i); + Difficulty difficulty = difficulties.get(i); + switch ((int) day) { + case 0 -> new TestEvent(team, difficulty); + case 1 -> new TestEvent2(team, difficulty); + } + } + world.getPersistentDataContainer().set(eventKey, PersistentDataType.LONG, day); } - } - world.getPersistentDataContainer().set(eventKey, PersistentDataType.LONG, day); } - } + + private long getDayScore() { + return this.day * 10 + 1; + } + + private List getDifficulties(List teams) { + List scores = teams.stream().map(team -> MC13DTL.board.getScore(team)).toList(); + + OptionalDouble averageOpt = scores.stream().mapToDouble(a -> a).average(); + Long average = Math.round(averageOpt.isPresent() ? averageOpt.getAsDouble() : 0); + + List difficulties = new ArrayList<>(); + + // average is mapped to Difficulty.Medium + for (Integer score : scores) { + long distance = (score - average) / getDayScore(); + + if (distance <= -3) { + difficulties.add(Difficulty.BABY); + } else if (distance <= -1) { + difficulties.add(Difficulty.EASY); + } else if (distance == 0) { + difficulties.add(Difficulty.MEDIUM); + } else if (distance <= 4) { + difficulties.add(Difficulty.SWEAT); + } else { + difficulties.add(Difficulty.IMPOSSIBLE); + } + } + + return difficulties; + } + } diff --git a/src/main/java/gent/zeus/mc13dtl/events/catalog/TestEvent.java b/src/main/java/gent/zeus/mc13dtl/events/catalog/TestEvent.java index 8dfcd85..31552ac 100644 --- a/src/main/java/gent/zeus/mc13dtl/events/catalog/TestEvent.java +++ b/src/main/java/gent/zeus/mc13dtl/events/catalog/TestEvent.java @@ -1,5 +1,6 @@ package gent.zeus.mc13dtl.events.catalog; +import gent.zeus.mc13dtl.events.Difficulty; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.scoreboard.Team; @@ -7,8 +8,8 @@ import org.bukkit.scoreboard.Team; import gent.zeus.mc13dtl.events.Event; public class TestEvent extends Event { - public TestEvent(Team team) { - super(team); + public TestEvent(Team team, Difficulty difficulty) { + super(team, difficulty); } @Override diff --git a/src/main/java/gent/zeus/mc13dtl/events/catalog/TestEvent2.java b/src/main/java/gent/zeus/mc13dtl/events/catalog/TestEvent2.java index 7bbc7d0..5bed8ca 100644 --- a/src/main/java/gent/zeus/mc13dtl/events/catalog/TestEvent2.java +++ b/src/main/java/gent/zeus/mc13dtl/events/catalog/TestEvent2.java @@ -1,5 +1,6 @@ package gent.zeus.mc13dtl.events.catalog; +import gent.zeus.mc13dtl.events.Difficulty; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.scoreboard.Team; @@ -7,26 +8,26 @@ import org.bukkit.scoreboard.Team; import gent.zeus.mc13dtl.events.Event; public class TestEvent2 extends Event { - public TestEvent2(Team team) { - super(team); - } - - @Override - protected String getMessage() { - return "Super difficult event!"; - } - - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - if (event.getPlayer() == null) { - return; + public TestEvent2(Team team, Difficulty difficulty) { + super(team, difficulty); } - eventSuccess(); - } - @Override - protected int scoreAwarded() { - return 200; - } + @Override + protected String getMessage() { + return "Super difficult event!"; + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + if (event.getPlayer() == null) { + return; + } + eventSuccess(); + } + + @Override + protected int scoreAwarded() { + return 200; + } } diff --git a/src/main/java/gent/zeus/mc13dtl/group/SetScoreCommand.java b/src/main/java/gent/zeus/mc13dtl/group/SetScoreCommand.java new file mode 100644 index 0000000..da706d6 --- /dev/null +++ b/src/main/java/gent/zeus/mc13dtl/group/SetScoreCommand.java @@ -0,0 +1,33 @@ +package gent.zeus.mc13dtl.group; + +import gent.zeus.mc13dtl.MC13DTL; +import io.papermc.paper.command.brigadier.BasicCommand; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scoreboard.Team; +import org.jetbrains.annotations.NotNull; + +public class SetScoreCommand implements BasicCommand { + + @Override + public void execute(@NotNull CommandSourceStack commandSourceStack, @NotNull String[] args) { + try { + if (args.length == 2) { + int index = Integer.parseInt(args[0]); + int score = Integer.parseInt(args[1]); + Team team = MC13DTL.board.getTeam(index); + MC13DTL.board.setScore(team, score); + } else { + commandSourceStack.getSender().sendMessage("usage: /group-add "); + } + } catch (NumberFormatException ex) { + commandSourceStack.getSender().sendMessage("usage: /group-add "); + } + } + + @Override + public String permission() { + return "13dtl.manage-groups"; + } +}