Compare commits
5
Commits
3c5842a92c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4953cec215 | ||
|
|
92f9e732a1 | ||
|
|
95b54d1a03 | ||
|
|
05a63b9a52 | ||
|
|
137e5a5125 |
@@ -8,6 +8,7 @@ import com.alttd.ctf.events.*;
|
|||||||
import com.alttd.ctf.flag.Flag;
|
import com.alttd.ctf.flag.Flag;
|
||||||
import com.alttd.ctf.flag.FlagTryCaptureEvent;
|
import com.alttd.ctf.flag.FlagTryCaptureEvent;
|
||||||
import com.alttd.ctf.game.GameManager;
|
import com.alttd.ctf.game.GameManager;
|
||||||
|
import com.alttd.ctf.game.phases.EndedPhase;
|
||||||
import com.alttd.ctf.gui.ClassSelectionGUI;
|
import com.alttd.ctf.gui.ClassSelectionGUI;
|
||||||
import com.alttd.ctf.gui.GUIInventory;
|
import com.alttd.ctf.gui.GUIInventory;
|
||||||
import com.alttd.ctf.gui.GUIListener;
|
import com.alttd.ctf.gui.GUIListener;
|
||||||
@@ -38,6 +39,7 @@ public class Main extends JavaPlugin {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
|
PlayerStat.main = this;
|
||||||
GUIInventory.setMain(this); // sorry
|
GUIInventory.setMain(this); // sorry
|
||||||
ClassSelectionGUI.setMain(this); // sorry
|
ClassSelectionGUI.setMain(this); // sorry
|
||||||
Package pkg = Main.class.getPackage();
|
Package pkg = Main.class.getPackage();
|
||||||
@@ -46,7 +48,7 @@ public class Main extends JavaPlugin {
|
|||||||
|
|
||||||
reloadConfigs();
|
reloadConfigs();
|
||||||
WorldBorderApi worldBorderApi = worldBorder();
|
WorldBorderApi worldBorderApi = worldBorder();
|
||||||
this.gameManager = new GameManager(worldBorderApi);
|
this.gameManager = new GameManager(this, worldBorderApi);
|
||||||
registerTeams(); //Skipped in reloadConfig if gameManager is not created yet
|
registerTeams(); //Skipped in reloadConfig if gameManager is not created yet
|
||||||
loadPlayerStats(); //Skipped in reloadConfig if gameManager is not created yet
|
loadPlayerStats(); //Skipped in reloadConfig if gameManager is not created yet
|
||||||
Flag flag = new Flag(this, gameManager);
|
Flag flag = new Flag(this, gameManager);
|
||||||
|
|||||||
@@ -40,8 +40,12 @@ public class OnPlayerOnlineStatus implements Listener {
|
|||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
resetPlayer(player);
|
resetPlayer(player);
|
||||||
handleRunningGame(player);
|
if (!player.hasPermission("ctf.bypass")) {
|
||||||
|
handleRunningGame(player);
|
||||||
|
}
|
||||||
handleDiscordLink(player);
|
handleDiscordLink(player);
|
||||||
|
gameManager.getTeamPlayer(player).ifPresent(teamPlayer ->
|
||||||
|
player.teleportAsync(teamPlayer.getTeam().getSpawnLocation()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleRunningGame(Player player) {
|
private void handleRunningGame(Player player) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.alttd.ctf.events;
|
package com.alttd.ctf.events;
|
||||||
|
|
||||||
import com.alttd.ctf.game.GameManager;
|
import com.alttd.ctf.game.GameManager;
|
||||||
|
import com.alttd.ctf.game.GamePhase;
|
||||||
import com.alttd.ctf.stats.Stat;
|
import com.alttd.ctf.stats.Stat;
|
||||||
import com.alttd.ctf.team.TeamPlayer;
|
import com.alttd.ctf.team.TeamPlayer;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -12,6 +13,7 @@ import org.bukkit.entity.ThrownPotion;
|
|||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.block.BlockBreakEvent;
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
import org.bukkit.event.entity.PotionSplashEvent;
|
import org.bukkit.event.entity.PotionSplashEvent;
|
||||||
import org.bukkit.potion.PotionEffect;
|
import org.bukkit.potion.PotionEffect;
|
||||||
import org.bukkit.potion.PotionEffectType;
|
import org.bukkit.potion.PotionEffectType;
|
||||||
@@ -29,11 +31,10 @@ public class OtherGameEvents implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBlockBreak(BlockBreakEvent event) {
|
public void onBlockBreak(BlockBreakEvent event) {
|
||||||
if (gameManager.getGamePhase().isEmpty()) {
|
Optional<GamePhase> gamePhase = gameManager.getGamePhase();
|
||||||
log.info("no game phases");
|
if (gamePhase.isEmpty() || gamePhase.get() == GamePhase.ENDED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log.info(event.getBlock().getType().toString());
|
|
||||||
if (!Tag.SNOW.isTagged(event.getBlock().getType())) {
|
if (!Tag.SNOW.isTagged(event.getBlock().getType())) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
@@ -43,8 +44,9 @@ public class OtherGameEvents implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBlockPlace(BlockBreakEvent event) {
|
public void onBlockPlace(BlockPlaceEvent event) {
|
||||||
if (gameManager.getGamePhase().isEmpty()) {
|
Optional<GamePhase> gamePhase = gameManager.getGamePhase();
|
||||||
|
if (gamePhase.isEmpty() || gamePhase.get() == GamePhase.ENDED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!Tag.SNOW.isTagged(event.getBlock().getType())) {
|
if (!Tag.SNOW.isTagged(event.getBlock().getType())) {
|
||||||
|
|||||||
@@ -88,6 +88,11 @@ public class SnowballEvent implements Listener {
|
|||||||
public void onSnowballThrown(ProjectileLaunchEvent event) {
|
public void onSnowballThrown(ProjectileLaunchEvent event) {
|
||||||
handleSnowballThrown(event, (shooter, shooterTeamPlayer, snowball) -> {
|
handleSnowballThrown(event, (shooter, shooterTeamPlayer, snowball) -> {
|
||||||
GameClass shooterClass = shooterTeamPlayer.getGameClass();
|
GameClass shooterClass = shooterTeamPlayer.getGameClass();
|
||||||
|
if (shooterClass == null) {
|
||||||
|
shooter.sendRichMessage("<red>You appear to not have selected a class, please do so by going to spawn and using /ctf selectclass</red>");
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
shooter.setCooldown(Material.SNOWBALL, shooterClass.getThrowTickSpeed());
|
shooter.setCooldown(Material.SNOWBALL, shooterClass.getThrowTickSpeed());
|
||||||
shooterTeamPlayer.increaseStat(Stat.SNOWBALLS_THROWN);
|
shooterTeamPlayer.increaseStat(Stat.SNOWBALLS_THROWN);
|
||||||
if (shooterClass instanceof Mage mage) {
|
if (shooterClass instanceof Mage mage) {
|
||||||
|
|||||||
@@ -81,10 +81,18 @@ public class Flag implements Runnable {
|
|||||||
if (flagCarrier != null) {
|
if (flagCarrier != null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Team team = teamPlayer.getTeam();
|
||||||
flagLocation.getNearbyPlayers(5).forEach(nearbyPlayer -> {
|
flagLocation.getNearbyPlayers(5).forEach(nearbyPlayer -> {
|
||||||
if (nearbyPlayer.getUniqueId().equals(player.getUniqueId())) {
|
if (nearbyPlayer.getUniqueId().equals(player.getUniqueId())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Optional<TeamPlayer> nearByTeamPlayer = gameManager.getTeamPlayer(nearbyPlayer);
|
||||||
|
if (nearByTeamPlayer.isEmpty()) {
|
||||||
|
return;
|
||||||
|
} else if (nearByTeamPlayer.get().getTeam().equals(team)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Vector direction = nearbyPlayer.getLocation().toVector().subtract(flagLocation.toVector()).normalize();
|
Vector direction = nearbyPlayer.getLocation().toVector().subtract(flagLocation.toVector()).normalize();
|
||||||
direction.setY(0.2);
|
direction.setY(0.2);
|
||||||
nearbyPlayer.setVelocity(direction.multiply(5));
|
nearbyPlayer.setVelocity(direction.multiply(5));
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.alttd.ctf.game;
|
package com.alttd.ctf.game;
|
||||||
|
|
||||||
|
import com.alttd.ctf.Main;
|
||||||
import com.alttd.ctf.flag.Flag;
|
import com.alttd.ctf.flag.Flag;
|
||||||
import com.alttd.ctf.game.phases.ClassSelectionPhase;
|
import com.alttd.ctf.game.phases.ClassSelectionPhase;
|
||||||
import com.alttd.ctf.game.phases.CombatPhase;
|
import com.alttd.ctf.game.phases.CombatPhase;
|
||||||
@@ -27,12 +28,12 @@ public class GameManager {
|
|||||||
private final HashMap<Integer, Team> teams = new HashMap<>();
|
private final HashMap<Integer, Team> teams = new HashMap<>();
|
||||||
private final HashMap<UUID, PlayerStat> playerStats = new HashMap<>();
|
private final HashMap<UUID, PlayerStat> playerStats = new HashMap<>();
|
||||||
|
|
||||||
public GameManager(WorldBorderApi worldBorderApi) {
|
public GameManager(Main main, WorldBorderApi worldBorderApi) {
|
||||||
phases = new HashMap<>();
|
phases = new HashMap<>();
|
||||||
phases.put(GamePhase.CLASS_SELECTION, new ClassSelectionPhase(this, FighterCreator::createFighter, worldBorderApi));
|
phases.put(GamePhase.CLASS_SELECTION, new ClassSelectionPhase(this, FighterCreator::createFighter, worldBorderApi));
|
||||||
phases.put(GamePhase.GATHERING, new GatheringPhase(this, worldBorderApi));
|
phases.put(GamePhase.GATHERING, new GatheringPhase(this, worldBorderApi));
|
||||||
phases.put(GamePhase.COMBAT, new CombatPhase());
|
phases.put(GamePhase.COMBAT, new CombatPhase());
|
||||||
phases.put(GamePhase.ENDED, new EndedPhase(this));
|
phases.put(GamePhase.ENDED, new EndedPhase(main, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<GamePhase> getGamePhase() {
|
public Optional<GamePhase> getGamePhase() {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.alttd.ctf.game.phases;
|
package com.alttd.ctf.game.phases;
|
||||||
|
|
||||||
|
import com.alttd.ctf.Main;
|
||||||
import com.alttd.ctf.config.GameConfig;
|
import com.alttd.ctf.config.GameConfig;
|
||||||
import com.alttd.ctf.flag.Flag;
|
import com.alttd.ctf.flag.Flag;
|
||||||
import com.alttd.ctf.game.GameManager;
|
import com.alttd.ctf.game.GameManager;
|
||||||
@@ -13,9 +14,11 @@ import net.kyori.adventure.text.minimessage.MiniMessage;
|
|||||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.attribute.Attribute;
|
import org.bukkit.attribute.Attribute;
|
||||||
import org.bukkit.attribute.AttributeInstance;
|
import org.bukkit.attribute.AttributeInstance;
|
||||||
|
import org.bukkit.command.ConsoleCommandSender;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -26,9 +29,11 @@ import java.util.Map;
|
|||||||
public class EndedPhase implements GamePhaseExecutor {
|
public class EndedPhase implements GamePhaseExecutor {
|
||||||
|
|
||||||
private final MiniMessage miniMessage = MiniMessage.miniMessage();
|
private final MiniMessage miniMessage = MiniMessage.miniMessage();
|
||||||
|
private final Main main;
|
||||||
private final GameManager gameManager;
|
private final GameManager gameManager;
|
||||||
|
|
||||||
public EndedPhase(GameManager gameManager) {
|
public EndedPhase(Main main, GameManager gameManager) {
|
||||||
|
this.main = main;
|
||||||
this.gameManager = gameManager;
|
this.gameManager = gameManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,6 +93,18 @@ public class EndedPhase implements GamePhaseExecutor {
|
|||||||
messages.add(miniMessage.deserialize("<green><team> has won with <score> captures!</green>",
|
messages.add(miniMessage.deserialize("<green><team> has won with <score> captures!</green>",
|
||||||
Placeholder.component("team", winner.getName()),
|
Placeholder.component("team", winner.getName()),
|
||||||
Placeholder.parsed("score", String.valueOf(highestScore))));
|
Placeholder.parsed("score", String.valueOf(highestScore))));
|
||||||
|
ConsoleCommandSender consoleSender = Bukkit.getConsoleSender();
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(main, () -> {
|
||||||
|
winner.getPlayers().forEach(teamPlayer -> {
|
||||||
|
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(teamPlayer.getUuid());
|
||||||
|
String name = offlinePlayer.getName();
|
||||||
|
if (name == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Bukkit.dispatchCommand(consoleSender, String.format("lp user %s permission settemp ctf.victory.%s true 14d", name, winner.getId()));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
if (wins.size() <= 1) {
|
if (wins.size() <= 1) {
|
||||||
return messages;
|
return messages;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.alttd.ctf.stats;
|
package com.alttd.ctf.stats;
|
||||||
|
|
||||||
|
import com.alttd.ctf.Main;
|
||||||
|
import com.alttd.ctf.config.GameConfig;
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -19,6 +21,9 @@ import java.util.UUID;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Getter
|
@Getter
|
||||||
public final class PlayerStat {
|
public final class PlayerStat {
|
||||||
|
@JsonIgnore
|
||||||
|
public static Main main;
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
private boolean touched;
|
private boolean touched;
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
@@ -48,7 +53,12 @@ public final class PlayerStat {
|
|||||||
switch (stat) {
|
switch (stat) {
|
||||||
case COMPLETED_GAME -> {
|
case COMPLETED_GAME -> {
|
||||||
if (!completedGame) {
|
if (!completedGame) {
|
||||||
Bukkit.dispatchCommand(commandSender, String.format("lp user %s permission settemp ctf.game.completed true 14d", inGameName));
|
Bukkit.getScheduler().runTask(main, () -> {
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(main, () -> {
|
||||||
|
Bukkit.dispatchCommand(commandSender, String.format("lp user %s permission settemp ctf.game.completed true 14d", inGameName));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
completedGame = true;
|
completedGame = true;
|
||||||
}
|
}
|
||||||
@@ -73,7 +83,10 @@ public final class PlayerStat {
|
|||||||
}
|
}
|
||||||
Bukkit.broadcast(MiniMessage.miniMessage().deserialize("<red><player> will receive a consolation prize for being the first to die in powdered snow.</red>",
|
Bukkit.broadcast(MiniMessage.miniMessage().deserialize("<red><player> will receive a consolation prize for being the first to die in powdered snow.</red>",
|
||||||
Placeholder.component("player",player.displayName())));
|
Placeholder.component("player",player.displayName())));
|
||||||
Bukkit.dispatchCommand(commandSender, String.format("lp user %s permission settemp ctf.game.first_powdered_snow_death true 14d", inGameName));
|
Bukkit.getScheduler().runTaskAsynchronously(main, () -> {
|
||||||
|
Bukkit.dispatchCommand(commandSender, String.format("lp user %s permission settemp ctf.game.first_powdered_snow_death true 14d", inGameName));
|
||||||
|
});
|
||||||
|
|
||||||
someoneDiedInPowderedSnow = true;
|
someoneDiedInPowderedSnow = true;
|
||||||
}
|
}
|
||||||
case DAMAGE_DONE, DAMAGE_HEALED -> throw new IllegalArgumentException(String.format("%s requires a number", stat.name()));
|
case DAMAGE_DONE, DAMAGE_HEALED -> throw new IllegalArgumentException(String.format("%s requires a number", stat.name()));
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import com.alttd.ctf.game.GameManager;
|
|||||||
import com.alttd.galaxy.discord.Bot;
|
import com.alttd.galaxy.discord.Bot;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.dv8tion.jda.api.JDA;
|
import net.dv8tion.jda.api.JDA;
|
||||||
import net.dv8tion.jda.api.Permission;
|
|
||||||
import net.dv8tion.jda.api.entities.*;
|
import net.dv8tion.jda.api.entities.*;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@@ -68,7 +67,7 @@ public class DiscordTeam {
|
|||||||
log.info("Unable to remove team role from server owner");
|
log.info("Unable to remove team role from server owner");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
member.getGuild().removeRoleFromMember(member, role).queue(ignored -> kickFromVoiceIfNeeded(member));
|
member.getGuild().removeRoleFromMember(member, role).queue();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,21 +81,7 @@ public class DiscordTeam {
|
|||||||
member.getRoles().stream()
|
member.getRoles().stream()
|
||||||
.filter(otherRole -> otherRole.getIdLong() == otherTeam.getDiscordRole())
|
.filter(otherRole -> otherRole.getIdLong() == otherTeam.getDiscordRole())
|
||||||
.forEach(otherRole -> member.getGuild().removeRoleFromMember(member, otherRole).queue()));
|
.forEach(otherRole -> member.getGuild().removeRoleFromMember(member, otherRole).queue()));
|
||||||
member.getGuild().addRoleToMember(member, role).queue(ignored -> kickFromVoiceIfNeeded(member));
|
member.getGuild().addRoleToMember(member, role).queue();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void kickFromVoiceIfNeeded(@NotNull Member member) {
|
|
||||||
GuildVoiceState voiceState = member.getVoiceState();
|
|
||||||
if (voiceState == null || !voiceState.inAudioChannel()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
AudioChannel channel = voiceState.getChannel();
|
|
||||||
if (channel == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!member.hasPermission(channel, Permission.VOICE_CONNECT)) {
|
|
||||||
member.getGuild().kickVoiceMember(member).queue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
#Sat Mar 01 19:29:28 CET 2025
|
#Sun Mar 02 00:42:30 CET 2025
|
||||||
buildNumber=102
|
buildNumber=112
|
||||||
version=0.1
|
version=0.1
|
||||||
|
|||||||
Reference in New Issue
Block a user