diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index b449484..a3f6b49 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -91,6 +91,7 @@ public class FightSystem extends JavaPlugin { new BlockFadeListener(); new LeaveableArena(); new HotbarKit.HotbarKitListener(); + new JoinRequestListener(); new OneShotStateDependent(ArenaMode.All, FightState.PreSchemSetup, () -> Fight.playSound(SWSound.BLOCK_NOTE_PLING.getSound(), 100.0f, 2.0f)); new EnterHandler(); @@ -133,7 +134,6 @@ public class FightSystem extends JavaPlugin { new TBCommand(); new DeclineCommand(); new GamemodeCommand(); - new InviteCommand(); new ReadyCommand(); new AkCommand(); new LeaderCommand(); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties index ae4ae52..15cf595 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties @@ -239,3 +239,10 @@ WIN_LESS_DAMAGE={0} §7less damaged WIN_POINTS={0} has more points WIN_POINTS_EQUAL=§7Equal points WIN_TECHKO={0} §7is tech K.O. + + +# Invites +JOIN_REQUEST=§7Request participation +JOIN_REQUEST_TITLE=Request participation +JOIN_REQUEST_ALREADY=§cYou have already sent a participation request +JOIN_REQUEST_TEAM=§eJoin {0} diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem_de.properties b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem_de.properties index 166ddc8..69ddf0e 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem_de.properties +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem_de.properties @@ -224,3 +224,21 @@ WIN_LESS_DAMAGE={0} §7weniger beschädigt WIN_POINTS={0} hat mehr Punkte WIN_POINTS_EQUAL=§7Gleicher Punktestand WIN_TECHKO={0} §7ist Tech K.O. + + +# Invites +JOIN_REQUEST=§7Teambeitritt anfragen +JOIN_REQUEST_TITLE=Teambeitritt anfragen +JOIN_REQUEST_ALREADY=§cDu hast bereits ein Team um Beitritt angefragt +JOIN_REQUEST_TEAM={0} §ebeitreten + +REQUESTS=§7Offene Beitrittsanfragen +REQUESTS_TITLE=Offene Beitrittsanfragen +REQUEST_DECLINED=§cBeitritt von {0} abgelehnt +YOUR_REQUEST_DECLINED=§cDeine Betrittsanfrage wurde abgelehnt + +UNKNOWN_PLAYER=§cUnbekannter Spieler +NO_JOIN_REQUEST=§cDer Spieler hat noch keinen Beitritt angefragt +NO_CONFIRMATION=§cKeine Zustimmung nötig +ACCEPT_USAGE=§8/§7accept §8[§eSpieler§8] +DECLINE_USAGE=§8/§7decline §8[§eSpieler§8] diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/AcceptCommand.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/AcceptCommand.java index 0e23db4..508a831 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/AcceptCommand.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/commands/AcceptCommand.java @@ -20,13 +20,20 @@ package de.steamwar.fightsystem.commands; import de.steamwar.fightsystem.ArenaMode; +import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.fight.Fight; +import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.fightsystem.fight.JoinRequest; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentCommand; +import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.util.function.BiConsumer; + public class AcceptCommand implements CommandExecutor { public AcceptCommand() { @@ -35,12 +42,45 @@ public class AcceptCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if(!(sender instanceof Player)) { - return false; - } - Player player = (Player) sender; - - Commands.acceptInvitation(player); + onJoinRequest(sender, args, "ACCEPT_USAGE", JoinRequest::accept); return false; } + + public static void onJoinRequest(CommandSender sender, String[] args, String usage, BiConsumer handleJoinRequest) { + if(!(sender instanceof Player)) { + return; + } + Player player = (Player) sender; + if(Commands.checkGetLeader(player) == null) + return; + + if(args.length == 0) { + FightSystem.getMessage().send(usage, sender); + return; + } + + Player target = Bukkit.getPlayer(args[0]); + if(target == null) { + FightSystem.getMessage().send("UNKNOWN_PLAYER", player); + return; + } + + onJoinRequest(player, target, handleJoinRequest); + } + + public static void onJoinRequest(Player player, Player target, BiConsumer handleJoinRequest) { + JoinRequest request = JoinRequest.get(target); + if(request == null) { + FightSystem.getMessage().send("NO_JOIN_REQUEST", player); + return; + } + + FightTeam team = Fight.getPlayerTeam(player); + if(!request.required(team)) { + FightSystem.getMessage().send("NO_CONFIRMATION", player); + return; + } + + handleJoinRequest.accept(request, team); + } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/Commands.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/Commands.java index 5ff08b0..6102728 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/Commands.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/commands/Commands.java @@ -47,14 +47,6 @@ public class Commands { return false; } - private static FightTeam checkGetInvitedTeam(Player p){ - FightTeam fightTeam = Fight.getInvitedTeam(p); - if(fightTeam == null){ - FightSystem.getMessage().sendPrefixless("NO_INVITATION", p, ChatMessageType.ACTION_BAR); - } - return fightTeam; - } - private static FightPlayer checkGetPlayer(Player p){ FightPlayer fightPlayer = Fight.getFightPlayer(p); if(fightPlayer == null){ @@ -104,30 +96,6 @@ public class Commands { fightTeam.skip(); } - static void acceptInvitation(Player p){ - if(checkSetup(p)) - return; - - FightTeam team = checkGetInvitedTeam(p); - if(team == null) - return; - - team.addMember(p); - } - - static void declineInvitation(Player p){ - if(checkSetup(p)) - return; - - FightTeam team = checkGetInvitedTeam(p); - if(team == null) - return; - - FightSystem.getMessage().sendPrefixless("INVITATION_DECLINED", p, ChatMessageType.ACTION_BAR); - team.broadcast("INVITATION_DECLINED_TEAM", p.getName()); - team.getInvited().remove(p); - } - static void leaveTeam(Player p){ if(checkSetup(p)) return; @@ -139,37 +107,6 @@ public class Commands { fightTeam.removePlayer(p); } - static void invite(Player p, String invited){ - if(checkSetup(p)) - return; - - FightTeam fightTeam = checkGetTeam(p); - if(fightTeam == null) - return; - - FightPlayer fightPlayer = checkGetLeader(p); - if(fightPlayer == null) - return; - - Player target = checkGetPlayer(p, invited); - if(target == null) - return; - - if(Fight.getPlayerTeam(target) != null) { - FightSystem.getMessage().sendPrefixless("PLAYER_IN_TEAM", p, ChatMessageType.ACTION_BAR, target.getName()); - return; - } - - if(Fight.getOpposite(fightTeam).getInvited().contains(target) || fightTeam.getInvited().contains(target)) { - FightSystem.getMessage().sendPrefixless("ALREADY_INVITED", p, ChatMessageType.ACTION_BAR, target.getName()); - return; - } - - FightSystem.getMessage().sendPrefixless("INVITATION_SENT", p, ChatMessageType.ACTION_BAR, target.getName()); - fightTeam.getInvited().add(target); - GUI.invitation(p, target); - } - static void kick(Player p, String kicked){ if(checkSetup(p)) return; diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/DeclineCommand.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/DeclineCommand.java index 3fa9906..fdf9afe 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/DeclineCommand.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/commands/DeclineCommand.java @@ -20,12 +20,12 @@ package de.steamwar.fightsystem.commands; import de.steamwar.fightsystem.ArenaMode; +import de.steamwar.fightsystem.fight.JoinRequest; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; public class DeclineCommand implements CommandExecutor { @@ -35,12 +35,7 @@ public class DeclineCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if(!(sender instanceof Player)) { - return false; - } - Player player = (Player) sender; - - Commands.declineInvitation(player); + AcceptCommand.onJoinRequest(sender, args, "DECLINE_USAGE", JoinRequest::decline); return false; } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java index 5b04b80..fd0de29 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java @@ -21,10 +21,7 @@ package de.steamwar.fightsystem.commands; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; -import de.steamwar.fightsystem.fight.Fight; -import de.steamwar.fightsystem.fight.FightPlayer; -import de.steamwar.fightsystem.fight.FightTeam; -import de.steamwar.fightsystem.fight.Kit; +import de.steamwar.fightsystem.fight.*; import de.steamwar.fightsystem.listener.PersonalKitCreator; import de.steamwar.fightsystem.states.FightState; import de.steamwar.inventory.*; @@ -47,23 +44,23 @@ public class GUI { private static final Message msg = FightSystem.getMessage(); - static void invitation(Player p, Player target){ - SWInventory inv = new SWInventory(target, 9, msg.parse("INVITATION_TITLE", target, p.getName())); - inv.setItem(0, SWItem.getDye(10), (byte)10, msg.parse("INVITATION_ACCEPT", target), (ClickType click) ->{ - Commands.acceptInvitation(target); - target.closeInventory(); + private static void addTeamRequest(Player p, SWInventory inv, int pos, FightTeam team) { + int colorCode = team.getColor().ordinal(); + inv.setItem(pos, SWItem.getDye(colorCode), (byte)colorCode, msg.parse("JOIN_REQUEST_TEAM", p, team.getColoredName()), click -> { + p.closeInventory(); + new JoinRequest(p, team); }); - inv.setItem(8, SWItem.getDye(1), (byte)1, msg.parse("INVITATION_DECLINE", target), (ClickType click) ->{ - Commands.declineInvitation(target); - target.closeInventory(); - }); - inv.addCloseCallback((ClickType click) ->{ - if(Fight.getInvitedTeam(target) != null){ - msg.sendPrefixless("INVITATION_CHAT_ACCEPT", target); - msg.sendPrefixless("INVITATION_CHAT_DECLINE", target); - } - }); - inv.setCallback(-999, (ClickType click) -> target.closeInventory()); + } + + public static void joinRequest(Player p) { + if(JoinRequest.get(p) != null) { + msg.sendPrefixless("JOIN_REQUEST_ALREADY", p, ChatMessageType.ACTION_BAR); + return; + } + + SWInventory inv = new SWInventory(p, 9, msg.parse("JOIN_REQUEST_TITLE", p)); + addTeamRequest(p, inv, 0, Fight.getBlueTeam()); + addTeamRequest(p, inv, 8, Fight.getRedTeam()); inv.open(); } @@ -84,12 +81,11 @@ public class GUI { inv.open(); } - public static void chooseInvitation(Player p){ - List> players = SWListInv.createPlayerList(p.getUniqueId()); - players.removeIf(swItemUUIDPair -> Fight.getFightPlayer(Bukkit.getPlayer(swItemUUIDPair.getObject())) != null); - SWListInv inv = new SWListInv<>(p, msg.parse("INVITE_TITLE", p), players, (ClickType click, UUID player) -> { - Commands.invite(p, SteamwarUser.get(player).getUserName()); + public static void chooseJoinRequests(Player p){ + List> players = JoinRequest.openRequests(Fight.getPlayerTeam(p)); + SWListInv inv = new SWListInv<>(p, msg.parse("REQUESTS_TITLE", p), players, (ClickType click, Player player) -> { p.closeInventory(); + AcceptCommand.onJoinRequest(p, player, click.isLeftClick() ? JoinRequest::accept : JoinRequest::decline); }); inv.setCallback(-999, (ClickType click) -> p.closeInventory()); inv.open(); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/InviteCommand.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/InviteCommand.java deleted file mode 100644 index 67cf6b1..0000000 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/InviteCommand.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - This file is a part of the SteamWar software. - - Copyright (C) 2020 SteamWar.de-Serverteam - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -package de.steamwar.fightsystem.commands; - -import de.steamwar.fightsystem.ArenaMode; -import de.steamwar.fightsystem.FightSystem; -import de.steamwar.fightsystem.states.FightState; -import de.steamwar.fightsystem.states.StateDependentCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -public class InviteCommand implements CommandExecutor { - - public InviteCommand() { - new StateDependentCommand(ArenaMode.VariableTeams, FightState.Setup, "invite", this); - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if(!(sender instanceof Player)) { - return false; - } - Player player = (Player) sender; - - if(args.length != 1){ - FightSystem.getMessage().sendPrefixless("INVITE_HELP", player); - return false; - } - - Commands.invite(player, args[0]); - return false; - } -} diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java b/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java index e4acee0..fa13c7c 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java @@ -25,17 +25,32 @@ import de.steamwar.fightsystem.fight.FightPlayer; import de.steamwar.fightsystem.utils.Message; import de.steamwar.fightsystem.utils.SWSound; import de.steamwar.fightsystem.utils.TechHider; +import de.steamwar.fightsystem.winconditions.Wincondition; import net.md_5.bungee.api.ChatMessageType; import java.util.List; public class EnternCountdown extends Countdown { + private static int calcTime(FightPlayer fp) { + int time = Config.EnterStages.get(fp.getKit().getEnterStage()); + + Countdown countdown = Wincondition.getTimeOverCountdown(); + if(countdown != null) { + time -= Config.TimeoutTime - countdown.getTimeLeft(); + + if(time < 0) + time = 0; + } + + return time; + } + private final FightPlayer fightPlayer; private List chunkPos; public EnternCountdown(FightPlayer fp) { - super(Config.EnterStages.get(fp.getKit().getEnterStage()), new Message("ENTERN_COUNTDOWN"), SWSound.BLOCK_NOTE_PLING, false); + super(calcTime(fp), new Message("ENTERN_COUNTDOWN"), SWSound.BLOCK_NOTE_PLING, false); fightPlayer = fp; enable(); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java index 5c2b0ee..e4d0bf2 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java @@ -63,14 +63,6 @@ public class Fight { throw new IllegalArgumentException(); } - public static FightTeam getInvitedTeam(Player player){ - if(redTeam.getInvited().contains(player)) - return redTeam; - else if(blueTeam.getInvited().contains(player)) - return blueTeam; - return null; - } - public static FightPlayer getFightPlayer(Player player) { if(redTeam.isPlayerInTeam(player)) return redTeam.getFightPlayer(player); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java index 5f3651a..2b13154 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java @@ -48,13 +48,18 @@ public class FightPlayer { kills = 0; } + public void revive() { + isOut = false; + } + public void setOut() { isOut = true; stopEnternCountdown(); } - public void setEnternCountdown(EnternCountdown countdown){ - enternCountdown = countdown; + public void startEnternCountdown() { + if(Config.EnterStages.size() > kit.getEnterStage() && kit.getEnterStage() >= 0) + enternCountdown = new EnternCountdown(this); } public void stopEnternCountdown(){ diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java index e76b0fa..cb5b4b2 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -64,7 +64,7 @@ public class FightTeam { setKitButton(notReadyKit, true); if(!ArenaMode.RankedEvent.contains(Config.mode)){ - notReadyKit.setItem(2, "INVITE_PLAYERS", new ItemBuilder(Material.PAPER).removeAllAttributes().build(), GUI::chooseInvitation); + notReadyKit.setItem(2, "REQUESTS", new ItemBuilder(Material.PAPER).removeAllAttributes().build(), GUI::chooseJoinRequests); notReadyKit.setItem(3, "REMOVE_PLAYERS", new ItemBuilder(SWItem.getMaterial("FIREWORK_CHARGE")).removeAllAttributes().build(), GUI::chooseRemove); } @@ -88,7 +88,6 @@ public class FightTeam { private int schemRank; private final Map players = new HashMap<>(); - private final Set invited = new HashSet<>(); private String name; private String prefix; @@ -198,7 +197,6 @@ public class FightTeam { skip = false; ready = false; schematic.reset(); - invited.clear(); Set playerSet = new HashSet<>(players.keySet()); for(Player player : playerSet){ @@ -243,20 +241,28 @@ public class FightTeam { addMember(player, false); } - public void addMember(Player player, boolean silent) { + private void addMember(Player player, boolean silent) { final List chunksToReload = TechHider.prepareChunkReload(player, false); - FightPlayer fightPlayer = new FightPlayer(player, this); + FightPlayer fightPlayer = getFightPlayer(player) != null ? getFightPlayer(player) : new FightPlayer(player, this); + fightPlayer.revive(); players.put(player, fightPlayer); - invited.remove(player); team.addEntry(player.getName()); - Fight.setPlayerGamemode(player, GameMode.SURVIVAL); player.setHealth(20); player.setFoodLevel(20); player.getInventory().clear(); BountifulWrapper.impl.setAttackSpeed(player); player.teleport(spawn); - memberKit.loadToPlayer(player); + + if(FightState.Spectate.contains(FightState.getFightState())) { + Fight.setPlayerGamemode(player, GameMode.SPECTATOR); + } else { + Fight.setPlayerGamemode(player, GameMode.SURVIVAL); + (FightState.ingame() ? fightPlayer.getKit() : memberKit).loadToPlayer(player); + } + if(FightState.Running.contains(FightState.getFightState())) + fightPlayer.startEnternCountdown(); + GlobalRecorder.getInstance().playerJoins(player); TechHider.reloadChunks(player, chunksToReload, false); @@ -286,6 +292,7 @@ public class FightTeam { if(player.isOnline()){ TechHider.reloadChunks(player, chunksToReload, true); + HotbarKit.spectatorKit.loadToPlayer(player); } } @@ -414,10 +421,6 @@ public class FightTeam { } } - public Set getInvited() { - return invited; - } - public String getName() { return name; } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/HotbarKit.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/HotbarKit.java index bf0a686..9ea2135 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/HotbarKit.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/HotbarKit.java @@ -23,9 +23,12 @@ import de.steamwar.core.Core; import de.steamwar.fightsystem.ArenaMode; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.commands.GUI; import de.steamwar.fightsystem.listener.PersonalKitCreator; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; +import de.steamwar.fightsystem.utils.ItemBuilder; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -42,6 +45,12 @@ import java.util.function.Consumer; public class HotbarKit extends Kit { + public static final HotbarKit spectatorKit = new HotbarKit(); + static { + for(int i = 0; i < 9; i++) + spectatorKit.setItem(i, "JOIN_REQUEST", new ItemBuilder(Material.PAPER).removeAllAttributes().build(), GUI::joinRequest); + } + private static final int HOTBAR_SIZE = 9; private final String[] nameTags; @@ -82,7 +91,7 @@ public class HotbarKit extends Kit { public static class HotbarKitListener implements Listener { public HotbarKitListener() { - new StateDependentListener(ArenaMode.AntiReplay, FightState.Setup, this); + new StateDependentListener(ArenaMode.AntiReplay, FightState.All, this); } @EventHandler diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java new file mode 100644 index 0000000..e4d54d3 --- /dev/null +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java @@ -0,0 +1,88 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2022 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.steamwar.fightsystem.fight; + +import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.inventory.SWItem; +import de.steamwar.inventory.SWListInv; +import net.md_5.bungee.api.ChatMessageType; +import org.bukkit.entity.Player; + +import java.util.*; +import java.util.stream.Collectors; + +public class JoinRequest { + + private static final Map activeRequests = new HashMap<>(); + + public static List> openRequests(FightTeam team) { + //TODO set lore + return activeRequests.values().stream().filter(request -> request.waitOnApproval.contains(team)).map(request -> new SWListInv.SWListEntry<>(SWItem.getPlayerSkull(request.player), request.player)).collect(Collectors.toList()); + } + + public static void clearRequests() { + //TODO notify players + activeRequests.forEach((player, joinRequest) -> { + + }); + activeRequests.clear(); + } + + public static JoinRequest get(Player player) { + return activeRequests.get(player); + } + + private final Player player; + private final FightTeam team; + private final Set waitOnApproval; + + public JoinRequest(Player player, FightTeam team) { + this.player = player; + this.team = team; + this.waitOnApproval = new HashSet<>(FightState.ingame() ? Fight.teams() : Collections.singleton(team)); + //TODO send request out + + activeRequests.put(player, new JoinRequest(player, team)); + } + + public boolean required(FightTeam decider) { + return waitOnApproval.contains(decider); + } + + public void accept(FightTeam acceptor) { + waitOnApproval.remove(acceptor); + + if(waitOnApproval.isEmpty()) { + team.addMember(player); + activeRequests.remove(player); + } + } + + public void decline() { + FightSystem.getMessage().sendPrefixless("YOUR_REQUEST_DECLINED", player, ChatMessageType.ACTION_BAR); + waitOnApproval.forEach(t -> t.broadcast("REQUEST_DECLINED", player.getName())); + silentDecline(); + } + + public void silentDecline() { + activeRequests.remove(player); + } +} diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/JoinRequestListener.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/JoinRequestListener.java new file mode 100644 index 0000000..11ab3be --- /dev/null +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/JoinRequestListener.java @@ -0,0 +1,63 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2022 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.steamwar.fightsystem.listener; + +import de.steamwar.fightsystem.ArenaMode; +import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.fight.Fight; +import de.steamwar.fightsystem.fight.HotbarKit; +import de.steamwar.fightsystem.fight.JoinRequest; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.OneShotStateDependent; +import de.steamwar.fightsystem.states.StateDependentListener; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class JoinRequestListener implements Listener { + + public JoinRequestListener() { + new OneShotStateDependent(ArenaMode.VariableTeams, FightState.PreLeaderSetup, () -> Bukkit.getScheduler().runTask(FightSystem.getPlugin(), JoinRequest::clearRequests)); + new OneShotStateDependent(ArenaMode.VariableTeams, FightState.PreRunning, () -> Bukkit.getScheduler().runTask(FightSystem.getPlugin(), JoinRequest::clearRequests)); + + new StateDependentListener(ArenaMode.VariableTeams, FightState.All, this); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + if (!Config.ArenaLeaveable && !Fight.fighting(player)) { + HotbarKit.spectatorKit.loadToPlayer(player); + } + } + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + JoinRequest request = JoinRequest.get(event.getPlayer()); + if(request != null) + request.silentDecline(); + } +} diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/EnterHandler.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/EnterHandler.java index cec63a4..ee5aa79 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/EnterHandler.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/EnterHandler.java @@ -19,8 +19,6 @@ package de.steamwar.fightsystem.utils; -import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.countdown.EnternCountdown; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightPlayer; import de.steamwar.fightsystem.fight.FightTeam; @@ -53,8 +51,7 @@ public class EnterHandler implements IStateDependent { private void registerTeam(FightTeam team){ for(FightPlayer fp : team.getPlayers()){ - if(Config.EnterStages.size() > fp.getKit().getEnterStage() && fp.getKit().getEnterStage() >= 0) - fp.setEnternCountdown(new EnternCountdown(fp)); + fp.startEnternCountdown(); } } diff --git a/FightSystem_Core/src/plugin.yml b/FightSystem_Core/src/plugin.yml index a740a86..6aa27b1 100644 --- a/FightSystem_Core/src/plugin.yml +++ b/FightSystem_Core/src/plugin.yml @@ -15,7 +15,6 @@ commands: accept: decline: leave: - invite: ready: kit: remove: