From 177d35f09716d0824136c837dc405c9eafa9703d Mon Sep 17 00:00:00 2001 From: Ninjdai Date: Sat, 28 Sep 2024 08:53:11 +0200 Subject: [PATCH] Update team and roles API/implementation --- .idea/misc.xml | 5 ++ build.gradle | 4 +- gradle.properties | 1 + src/main/java/dev/ninjdai/werewolf/Main.java | 7 +++ .../werewolf/uhc/events/TimedPlayerDeath.java | 41 +++++++++++++++ .../uhc/events/UHCPlayerDeathEvent.java | 35 +++++++++++++ .../dev/ninjdai/werewolf/uhc/roles/Role.java | 52 +++++++++++++++++-- .../werewolf/uhc/roles/RoleMetadata.java | 5 -- .../werewolf/uhc/roles/RoleProperties.java | 5 ++ .../dev/ninjdai/werewolf/uhc/teams/Team.java | 19 +++++-- .../werewolf/uhc/teams/WinCondition.java | 7 +-- 11 files changed, 163 insertions(+), 18 deletions(-) create mode 100644 src/main/java/dev/ninjdai/werewolf/uhc/events/TimedPlayerDeath.java create mode 100644 src/main/java/dev/ninjdai/werewolf/uhc/events/UHCPlayerDeathEvent.java delete mode 100644 src/main/java/dev/ninjdai/werewolf/uhc/roles/RoleMetadata.java create mode 100644 src/main/java/dev/ninjdai/werewolf/uhc/roles/RoleProperties.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 5cd9a10..976a391 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,10 @@ + + + + + diff --git a/build.gradle b/build.gradle index c7924be..e422086 100644 --- a/build.gradle +++ b/build.gradle @@ -8,10 +8,12 @@ version = '0.1.0' repositories { mavenCentral() + maven { url 'https://jitpack.io' } } dependencies { implementation "net.minestom:minestom-snapshots:${minestom_version}" + implementation "com.github.TogAr2:MinestomPvP:${minestompvp_version}" compileOnly 'org.projectlombok:lombok:1.18.34' annotationProcessor 'org.projectlombok:lombok:1.18.34' @@ -26,7 +28,7 @@ java { tasks { jar { manifest { - attributes["Main-Class"] = "dev.ninjdai.lgohc.Main" // Change this to your main class + attributes["Main-Class"] = "dev.ninjdai.werewolf.Main" // Change this to your main class } } diff --git a/gradle.properties b/gradle.properties index 85bbe46..4f12409 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,3 @@ minestom_version = d0754f2a15 +minestompvp_version = 547b6e95af diff --git a/src/main/java/dev/ninjdai/werewolf/Main.java b/src/main/java/dev/ninjdai/werewolf/Main.java index 428d8da..e0e5dae 100644 --- a/src/main/java/dev/ninjdai/werewolf/Main.java +++ b/src/main/java/dev/ninjdai/werewolf/Main.java @@ -1,5 +1,8 @@ package dev.ninjdai.werewolf; +import io.github.togar2.pvp.MinestomPvP; +import io.github.togar2.pvp.feature.CombatFeatureSet; +import io.github.togar2.pvp.feature.CombatFeatures; import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Player; @@ -26,6 +29,10 @@ public class Main { player.setRespawnPoint(new Pos(0, 42, 0)); }); + MinestomPvP.init(); + + CombatFeatureSet legacyVanilla = CombatFeatures.legacyVanilla(); + MinecraftServer.getGlobalEventHandler().addChild(legacyVanilla.createNode()); minecraftServer.start("0.0.0.0", 30065); } diff --git a/src/main/java/dev/ninjdai/werewolf/uhc/events/TimedPlayerDeath.java b/src/main/java/dev/ninjdai/werewolf/uhc/events/TimedPlayerDeath.java new file mode 100644 index 0000000..ae70301 --- /dev/null +++ b/src/main/java/dev/ninjdai/werewolf/uhc/events/TimedPlayerDeath.java @@ -0,0 +1,41 @@ +package dev.ninjdai.werewolf.uhc.events; + +import dev.ninjdai.werewolf.uhc.roles.Role; +import dev.ninjdai.werewolf.uhc.roles.RoleProperties; +import net.kyori.adventure.text.Component; +import net.minestom.server.MinecraftServer; +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.ItemEntity; +import net.minestom.server.entity.Player; +import net.minestom.server.entity.damage.Damage; +import net.minestom.server.instance.Instance; +import net.minestom.server.item.ItemStack; +import net.minestom.server.timer.TaskSchedule; +import org.jetbrains.annotations.NotNull; + +public class TimedPlayerDeath { + private final ItemStack[] inventory; + private final Instance instance; + private final Player targetPlayer; + + public TimedPlayerDeath(@NotNull Player player, @NotNull Damage damage, int seconds) { + this.inventory = player.getInventory().getItemStacks(); + this.instance = player.getInstance(); + this.targetPlayer = player; + + MinecraftServer.getSchedulerManager().scheduleTask(this::trigger, TaskSchedule.seconds(seconds)); + } + + private TaskSchedule trigger(){ + for (ItemStack itemStack: inventory) { + instance.getEntities().add(new ItemEntity(itemStack)); + } + + if ((!this.targetPlayer.getTag(Role.roleTag).isBlank()) + && (!Role.roleMap.get(targetPlayer.getTag(Role.roleTag)).getRoleProperties().contains(RoleProperties.NO_DEATH_MESSAGE))) { + this.instance.sendMessage(Component.text(targetPlayer.getUsername()).append(Component.text(" died"))); + } + + return TaskSchedule.stop(); + } +} diff --git a/src/main/java/dev/ninjdai/werewolf/uhc/events/UHCPlayerDeathEvent.java b/src/main/java/dev/ninjdai/werewolf/uhc/events/UHCPlayerDeathEvent.java new file mode 100644 index 0000000..4f518ee --- /dev/null +++ b/src/main/java/dev/ninjdai/werewolf/uhc/events/UHCPlayerDeathEvent.java @@ -0,0 +1,35 @@ +package dev.ninjdai.werewolf.uhc.events; + +import dev.ninjdai.werewolf.uhc.teams.Team; +import dev.ninjdai.werewolf.uhc.teams.WinCondition; +import io.github.togar2.pvp.events.EntityPreDeathEvent; +import net.minestom.server.MinecraftServer; +import net.minestom.server.entity.GameMode; +import net.minestom.server.entity.Player; +import net.minestom.server.event.EventFilter; +import net.minestom.server.event.EventNode; +import net.minestom.server.event.trait.EntityEvent; + +public class UHCPlayerDeathEvent { + public void onPlayerDeath(EntityPreDeathEvent event) { + Player player = (Player) event.getEntity(); + if(event.getDamage().getAttacker() instanceof Player killer && !killer.getTag(Team.teamTag).isBlank()) { + Team team = Team.teamMap.get(killer.getTag(Team.teamTag)); + WinCondition.checkTeamWin(team, event.getInstance().getPlayers()); + } + + event.setCancelDeath(true); + player.setGameMode(GameMode.SPECTATOR); + + new TimedPlayerDeath(player, event.getDamage(), 15); + } + + public void register() { + EventNode playerNode = EventNode.type("player-listener", EventFilter.ENTITY); + MinecraftServer.getGlobalEventHandler().addChild(playerNode); + + playerNode.addListener(EntityPreDeathEvent.class, event -> { + if (event.getEntity() instanceof Player) onPlayerDeath(event); + }); + } +} diff --git a/src/main/java/dev/ninjdai/werewolf/uhc/roles/Role.java b/src/main/java/dev/ninjdai/werewolf/uhc/roles/Role.java index e581bf0..df0bf32 100644 --- a/src/main/java/dev/ninjdai/werewolf/uhc/roles/Role.java +++ b/src/main/java/dev/ninjdai/werewolf/uhc/roles/Role.java @@ -1,28 +1,60 @@ package dev.ninjdai.werewolf.uhc.roles; import dev.ninjdai.werewolf.uhc.effects.Effect; +import lombok.Getter; import net.minestom.server.item.ItemStack; +import net.minestom.server.tag.Tag; -import java.util.Arrays; -import java.util.List; +import java.util.*; public class Role { - public Role(List roleItems, List roleEffects) { + public Role(String id, String name, List roleItems, List roleEffects, Set roleProperties) { + this.id = id; + this.name = name; this.roleItems = roleItems; this.roleEffects = roleEffects; + this.roleProperties = roleProperties; + + roleMap.put(this.id, this); } Role(Builder builder) { + this.id = builder.id; + this.name = builder.name; this.roleItems = builder.roleItems; this.roleEffects = builder.roleEffects; + this.roleProperties = builder.roleProperties; + + roleMap.put(this.id, this); } - List roleItems; - List roleEffects; + @Getter private String id; + @Getter private String name; + @Getter private List roleItems; + @Getter private List roleEffects; + @Getter private Set roleProperties; + + public static Tag roleTag = Tag.String("role"); + + // ID: Role + public static Map roleMap = new HashMap<>(); public static class Builder { + String id = "dummy"; + String name = "Dummy"; private List roleItems = List.of(); private List roleEffects = List.of(); + Set roleProperties = new HashSet<>(); + + public Builder setId(String id) { + this.id = id; + return this; + } + + public Builder setName(String name) { + this.name = name; + return this; + } public Builder setRoleItems(List roleItems) { this.roleItems = roleItems; @@ -44,6 +76,16 @@ public class Role { return this; } + public Builder setRoleProperties(Set roleProperties) { + this.roleProperties = roleProperties; + return this; + } + + public Builder addRoleProperties(RoleProperties ... roleProperties) { + this.roleProperties.addAll(List.of(roleProperties)); + return this; + } + public Role build() { return new Role(this); } diff --git a/src/main/java/dev/ninjdai/werewolf/uhc/roles/RoleMetadata.java b/src/main/java/dev/ninjdai/werewolf/uhc/roles/RoleMetadata.java deleted file mode 100644 index 87151d6..0000000 --- a/src/main/java/dev/ninjdai/werewolf/uhc/roles/RoleMetadata.java +++ /dev/null @@ -1,5 +0,0 @@ -package dev.ninjdai.werewolf.uhc.roles; - -public abstract class RoleMetadata { - -} diff --git a/src/main/java/dev/ninjdai/werewolf/uhc/roles/RoleProperties.java b/src/main/java/dev/ninjdai/werewolf/uhc/roles/RoleProperties.java new file mode 100644 index 0000000..81862e8 --- /dev/null +++ b/src/main/java/dev/ninjdai/werewolf/uhc/roles/RoleProperties.java @@ -0,0 +1,5 @@ +package dev.ninjdai.werewolf.uhc.roles; + +public enum RoleProperties { + NO_DEATH_MESSAGE, +} diff --git a/src/main/java/dev/ninjdai/werewolf/uhc/teams/Team.java b/src/main/java/dev/ninjdai/werewolf/uhc/teams/Team.java index db1d290..13c00ed 100644 --- a/src/main/java/dev/ninjdai/werewolf/uhc/teams/Team.java +++ b/src/main/java/dev/ninjdai/werewolf/uhc/teams/Team.java @@ -1,14 +1,20 @@ package dev.ninjdai.werewolf.uhc.teams; +import lombok.Getter; import net.minestom.server.color.Color; import net.minestom.server.tag.Tag; +import java.util.HashMap; +import java.util.Map; + public class Team { public Team(String id, String name, Color color, WinCondition.WinConditionType winConditionType) { this.id = id; this.name = name; this.color = color; this.winConditionType = winConditionType; + + teamMap.put(this.id, this); } public Team(Builder builder){ @@ -16,15 +22,20 @@ public class Team { this.name = builder.name; this.color = builder.color; this.winConditionType = builder.winConditionType; + + teamMap.put(this.id, this); } - String id; - String name; - Color color; - WinCondition.WinConditionType winConditionType; + @Getter private String id; + @Getter private String name; + @Getter private Color color; + @Getter private WinCondition.WinConditionType winConditionType; public static Tag teamTag = Tag.String("team"); + // ID: Team + public static Map teamMap = new HashMap<>(); + public static class Builder { private String id = "dummy"; private String name = "Dummy"; diff --git a/src/main/java/dev/ninjdai/werewolf/uhc/teams/WinCondition.java b/src/main/java/dev/ninjdai/werewolf/uhc/teams/WinCondition.java index 8e01e12..26a58df 100644 --- a/src/main/java/dev/ninjdai/werewolf/uhc/teams/WinCondition.java +++ b/src/main/java/dev/ninjdai/werewolf/uhc/teams/WinCondition.java @@ -4,13 +4,14 @@ import net.minestom.server.entity.Player; import java.util.List; import java.util.Objects; +import java.util.Set; public class WinCondition { - public static boolean checkTeamWin(Team team, List players){ - switch (team.winConditionType){ + public static boolean checkTeamWin(Team team, Set players){ + switch (team.getWinConditionType()){ case WinConditionType.ONLY_TEAM_REMAINING -> { for (Player player: players) { - if (! Objects.equals(player.getTag(Team.teamTag), team.id)) return false; + if (! Objects.equals(player.getTag(Team.teamTag), team.getId())) return false; } return true; }