Implement Map voting

This commit is contained in:
Sam 2018-06-21 03:34:43 +01:00 committed by Alexander Meech
parent 8799d44fd4
commit 1181aa21e0
9 changed files with 295 additions and 60 deletions

View File

@ -6,11 +6,13 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@ -33,8 +35,10 @@ import nautilus.game.arcade.GameMode;
import nautilus.game.arcade.GameType;
import nautilus.game.arcade.game.Game;
import nautilus.game.arcade.game.Game.GameState;
import nautilus.game.arcade.managers.voting.Vote;
import nautilus.game.arcade.managers.voting.VotingManager;
import nautilus.game.arcade.managers.voting.types.GameVote;
import nautilus.game.arcade.managers.voting.types.MapVote;
public class GameCreationManager implements Listener
{
@ -65,16 +69,6 @@ public class GameCreationManager implements Listener
Manager.registerEvents(this);
}
public String GetLastMap()
{
return _lastMap;
}
public void SetLastMap(String file)
{
_lastMap = file;
}
@EventHandler
public void NextGame(UpdateEvent event)
{
@ -171,7 +165,20 @@ public class GameCreationManager implements Listener
if (_votingManager.getFinishedVote() != null)
{
gameType = ((GameVote) _votingManager.getFinishedVote()).getWinner();
Vote vote = _votingManager.getFinishedVote();
if (vote instanceof GameVote)
{
GameVote gameVote = ((GameVote) _votingManager.getFinishedVote());
gameType = gameVote.getWinner();
MapPref = gameVote.getWinningMap().getName();
}
else if (vote instanceof MapVote)
{
MapPref = ((MapVote) vote).getWinner().getName();
}
_votingManager.deactivate();
}
else if (_votingManager.isVoteInProgress())
@ -197,7 +204,7 @@ public class GameCreationManager implements Listener
//Pick Game
if (gameType == null)
{
// If voting is enabled
// If game voting is enabled
if (Manager.GetServerConfig().GameVoting)
{
List<GameType> typesToVote = new ArrayList<>(Manager.GetGameList());
@ -214,7 +221,28 @@ public class GameCreationManager implements Listener
typesToVote.remove(UtilMath.r(typesToVote.size()));
}
_votingManager.callVote(new GameVote(Manager, typesToVote));
Map<GameType, List<String>> mapsToVote = new HashMap<>();
typesToVote.forEach(votingGameType ->
{
// Load the maps for this game type
loadMaps(votingGameType, votingGameType.getGameClass());
List<String> votingGameMaps = _maps.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
// While there are more than 5 maps, remove a random one
while (votingGameMaps.size() > VotingManager.MAPS_TO_VOTE_ON)
{
votingGameMaps.remove(UtilMath.r(votingGameMaps.size()));
}
// Merge map names from all sources together
mapsToVote.put(votingGameType, votingGameMaps);
});
_votingManager.callVote(new GameVote(Manager, typesToVote, mapsToVote));
return;
}
else
@ -237,6 +265,20 @@ public class GameCreationManager implements Listener
return;
}
Class<? extends Game> gameClass = gameType.getGameClass();
// If map voting and ONLY map voting is enabled
if (Manager.GetServerConfig().MapVoting && !Manager.GetServerConfig().GameVoting)
{
loadMaps(gameType, gameClass);
// Apply the same logic as game voting and merge all those names together
_votingManager.callVote(new MapVote(Manager, _maps.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList())));
return;
}
//Reset Changes
Manager.GetCreature().SetDisableCustomDrops(false);
Manager.GetDamage().resetConfiguration();
@ -252,7 +294,6 @@ public class GameCreationManager implements Listener
_lastGames.add(0, gameType);
boolean setVars = false;
Class<? extends Game> gameClass = gameType.getGameClass();
try
{
@ -335,6 +376,8 @@ public class GameCreationManager implements Listener
if (MapPref != null)
{
MapPref = MapPref.replace(" ", "");
System.out.println("Map Preference: " + MapPref);
Map<GameType, List<String>> matches = new HashMap<>();
@ -352,7 +395,7 @@ public class GameCreationManager implements Listener
if (MapSource == null || entryType == MapSource)
{
matchList.add(map);
System.out.print("Map Preference: " + map);
System.out.print("Map Preference Found: " + map);
}
}
});
@ -395,6 +438,11 @@ public class GameCreationManager implements Listener
selectedMap = UtilAlg.Random(_maps.get(gameType));
if (selectedMap == null)
{
continue;
}
// Not the last map
if (!selectedMap.equals(_lastMap))
{

View File

@ -186,8 +186,7 @@ public class GameManager implements Listener
if (prepTime > 0)
Manager.GetGame().PrepareTime = prepTime;
if (!finished)
return true;
return !finished;
}
return false;
}
@ -196,37 +195,41 @@ public class GameManager implements Listener
public void DisplayPrepareTime(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
{
return;
if (Manager.GetGame() == null || Manager.GetGame().GetState() != GameState.Prepare)
return;
}
Game game = Manager.GetGame();
if (isInTutorial(true))
if (game == null || game.GetState() != GameState.Prepare)
{
return;
}
if (isInTutorial(true))
{
return;
}
double percentage = (double) (System.currentTimeMillis() - game.GetStateTime()) / game.PrepareTime;
for (Player player : UtilServer.getPlayers())
UtilTextBottom.displayProgress("Game Start", percentage,
UtilTime.MakeStr(Math.max(0, game.PrepareTime - (System.currentTimeMillis() - game.GetStateTime()))), player);
UtilTextBottom.displayProgress("Game Start", percentage, UtilTime.MakeStr(Math.max(0, game.PrepareTime - (System.currentTimeMillis() - game.GetStateTime()))), UtilServer.getPlayers());
}
@EventHandler
public void updateGameTutorials(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
{
return;
}
Game game = Manager.GetGame();
if (game == null)
if (game == null || game.GetState() != GameState.Prepare)
{
return;
if (game.GetState() != GameState.Prepare)
return;
}
if (game.EnableTutorials)
{
@ -247,10 +250,16 @@ public class GameManager implements Listener
public void StateUpdate(UpdateEvent event)
{
if (event.getType() != UpdateType.SEC)
{
return;
}
Game game = Manager.GetGame();
if (game == null) return;
if (game == null)
{
return;
}
switch (game.GetState())
{
@ -262,8 +271,10 @@ public class GameManager implements Listener
}
break;
case Recruit:
int validPlayers = Manager.getValidPlayersForGameStart().size();
//Stop Countdown!
if (game.GetCountdown() != -1 && Manager.getValidPlayersForGameStart().size() < Manager.GetPlayerMin() && !game.GetCountdownForce())
if (game.GetCountdown() != -1 && validPlayers < Manager.GetPlayerMin() && !game.GetCountdownForce())
{
game.SetCountdown(-1);
Manager.GetLobby().DisplayWaiting();
@ -271,11 +282,15 @@ public class GameManager implements Listener
if (Manager.IsGameAutoStart())
{
if (Manager.getValidPlayersForGameStart().size() >= Manager.GetPlayerFull())
if (validPlayers >= Manager.GetPlayerFull())
{
StateCountdown(game, 10, false);
}
else if (Manager.getValidPlayersForGameStart().size() >= Manager.GetPlayerMin())
else if (validPlayers >= Manager.GetPlayerFull() * 0.75D)
{
StateCountdown(game, 30, false);
}
else if (validPlayers >= Manager.GetPlayerMin())
{
StateCountdown(game, 60, false);
}
@ -301,15 +316,17 @@ public class GameManager implements Listener
{
int players = game.GetPlayers(true).size();
if (players < 2 || game.PlaySoundGameStart)
if (game.PlaySoundGameStart)
{
for (Player player : UtilServer.getPlayersCollection())
{
for (Player player : UtilServer.getPlayers())
player.playSound(player.getLocation(), Sound.NOTE_PLING, 2f, 2f);
}
}
if (players < 2)
{
game.Announce(C.cWhite + C.Bold + game.GetName() + " ended, not enough players!");
game.Announce(C.cWhiteB + game.GetName() + " ended, not enough players!");
game.SetState(GameState.Dead);
}
else

View File

@ -592,36 +592,27 @@ public abstract class LobbyManager implements Listener
}
@EventHandler
public void InventoryUpdate(UpdateEvent event)
public void inventoryUpdate(UpdateEvent event)
{
if (!_manager.IsHotbarInventory())
if (event.getType() != UpdateType.SEC || !_manager.IsHotbarInventory())
{
return;
}
if (event.getType() != UpdateType.FAST)
Game game = _manager.GetGame();
if (game != null && game.GetState() != GameState.Recruit && game.GadgetsDisabled)
{
return;
}
if (_manager.GetGame() == null)
{
return;
}
if (_manager.GetGame().GetState() != GameState.Recruit && _manager.GetGame().GadgetsDisabled)
{
return;
}
for (Player player : UtilServer.getPlayers())
for (Player player : UtilServer.getPlayersCollection())
{
if (player.getOpenInventory().getType() != InventoryType.CRAFTING)
{
continue;
}
//Cosmetic Menu
_manager.getCosmeticManager().giveInterfaceItem(player);
_manager.getBoosterManager().giveInterfaceItem(player);
_manager.getTitles().giveBookIfNotExists(player, false);

View File

@ -89,7 +89,6 @@ public abstract class Vote<T extends Voteable>
_voteData.put(player, new VoteData<>(value, getRankWeight(_manager.GetClients().Get(player).getPrimaryGroup())));
}
player.closeInventory();
_winnerCache = null;
}

View File

@ -2,6 +2,7 @@ package nautilus.game.arcade.managers.voting;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
@ -94,7 +95,7 @@ public class VotingManager extends ListenerComponent
@EventHandler
public void playerInteract(PlayerInteractEvent event)
{
if (!isVoteInProgress())
if (event.getAction() == Action.PHYSICAL || !isVoteInProgress())
{
return;
}
@ -107,7 +108,12 @@ public class VotingManager extends ListenerComponent
return;
}
_shop.openPageForPlayer(player, new VotingPage<>(_currentVote.getManager(), _shop, player, _currentVote));
openVotePage(player, _currentVote);
}
public void openVotePage(Player player, Vote<?> vote)
{
_shop.openPageForPlayer(player, new VotingPage<>(_currentVote.getManager(), _shop, player, vote));
}
@EventHandler
@ -129,7 +135,7 @@ public class VotingManager extends ListenerComponent
secondary = temp;
}
UtilTextBottom.display(primary + "Use " + secondary + C.Bold + "/vote" + primary + " to pick the next " + secondary + C.Bold + _currentVote.getName(), UtilServer.getPlayers());
UtilTextBottom.display(primary + "Click the " + secondary + C.Bold + "Paper" + primary + " to pick the next " + secondary + C.Bold + _currentVote.getName(), UtilServer.getPlayers());
_colourTick = !_colourTick;
}
else if (event.getType() == UpdateType.SEC)

View File

@ -1,6 +1,9 @@
package nautilus.game.arcade.managers.voting.types;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Material;
@ -18,22 +21,90 @@ import nautilus.game.arcade.managers.voting.Vote;
public class GameVote extends Vote<GameType>
{
public GameVote(ArcadeManager manager, List<GameType> values)
private final Map<GameType, MapVote> _mapVotes;
private VotableMap _winningMap;
public GameVote(ArcadeManager manager, List<GameType> values, Map<GameType, List<String>> gameMaps)
{
super(manager, "Game", new ItemBuilder(Material.PAPER)
.setTitle(C.cGreenB + "Vote for the next Game")
.addLore("", "Click to vote on the next", "game that's going to be played!")
.build(), values);
if (gameMaps.isEmpty())
{
_mapVotes = Collections.emptyMap();
}
else
{
_mapVotes = new HashMap<>();
gameMaps.forEach((gameType, maps) ->
{
_mapVotes.put(gameType, new MapVote(manager, maps));
});
}
}
@Override
public void vote(Player player, GameType value)
{
super.vote(player, value);
if (_mapVotes.isEmpty())
{
player.closeInventory();
}
else if (value != null)
{
MapVote mapVote = _mapVotes.get(value);
if (mapVote != null)
{
getManager().GetGameCreationManager().getVotingManager().openVotePage(player, mapVote);
}
else
{
player.closeInventory();
}
}
}
@Override
public GameType getWinner()
{
GameType winner = super.getWinner();
MapVote mapVote = _mapVotes.get(winner);
if (mapVote != null)
{
_winningMap = mapVote.getWinner();
}
return winner;
}
@Override
public void onEnd()
{
Bukkit.broadcastMessage(C.cGreenB + getWinner().getName() + C.cWhiteB + " won the " + getName() + " Vote!");
String message = C.cGreenB + getWinner().getName() + C.cWhiteB;
if (_winningMap != null)
{
message += " and map " + C.cGreenB + _winningMap.getDisplayName() + C.cWhiteB;
}
Bukkit.broadcastMessage(message + " won the vote!");
for (Player player : UtilServer.getPlayersCollection())
{
player.playSound(player.getLocation(), Sound.NOTE_PIANO, 1, 1);
}
}
public VotableMap getWinningMap()
{
return _winningMap;
}
}

View File

@ -0,0 +1,49 @@
package nautilus.game.arcade.managers.voting.types;
import java.util.List;
import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import mineplex.core.common.util.C;
import mineplex.core.common.util.UtilServer;
import mineplex.core.itemstack.ItemBuilder;
import nautilus.game.arcade.ArcadeManager;
import nautilus.game.arcade.managers.voting.Vote;
public class MapVote extends Vote<VotableMap>
{
public MapVote(ArcadeManager manager, List<String> maps)
{
super(manager, "Map", new ItemBuilder(Material.PAPER)
.setTitle(C.cGreenB + "Vote for the next Map")
.addLore("", "Click to vote on the next", "map that's going to be played!")
.build(), maps.stream()
.map(VotableMap::new)
.collect(Collectors.toList()));
}
@Override
public void vote(Player player, VotableMap value)
{
super.vote(player, value);
player.closeInventory();
}
@Override
public void onEnd()
{
Bukkit.broadcastMessage(C.cGreenB + getWinner().getDisplayName() + C.cWhiteB + " won the vote!");
for (Player player : UtilServer.getPlayersCollection())
{
player.playSound(player.getLocation(), Sound.NOTE_PIANO, 1, 1);
}
}
}

View File

@ -0,0 +1,43 @@
package nautilus.game.arcade.managers.voting.types;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import nautilus.game.arcade.managers.voting.Voteable;
public class VotableMap implements Voteable
{
private final String _name;
private final ItemStack _itemStack;
public VotableMap(String name)
{
_name = name;
_itemStack = new ItemStack(Material.PAPER);
}
@Override
public String getName()
{
return _name;
}
public String getDisplayName()
{
String[] split = getName().split("_");
if (split.length == 1)
{
return getName();
}
return split[1];
}
@Override
public ItemStack getItemStack()
{
return _itemStack;
}
}

View File

@ -12,6 +12,7 @@ import nautilus.game.arcade.ArcadeManager;
import nautilus.game.arcade.managers.voting.Vote;
import nautilus.game.arcade.managers.voting.Vote.VoteData;
import nautilus.game.arcade.managers.voting.Voteable;
import nautilus.game.arcade.managers.voting.types.VotableMap;
public class VotingPage<T extends Voteable> extends ShopPageBase<ArcadeManager, VotingShop>
{
@ -41,22 +42,32 @@ public class VotingPage<T extends Voteable> extends ShopPageBase<ArcadeManager,
{
_vote.removeVote(player);
playRemoveSound(player);
player.sendMessage(F.main("Game", "You voted for " + F.name("Random") + "."));
});
String lowerName = _vote.getName().toLowerCase();
for (T voteable : _vote.getValues())
{
String name = voteable.getName();
if (voteable instanceof VotableMap)
{
name = ((VotableMap) voteable).getDisplayName();
}
ItemBuilder builder = new ItemBuilder(voteable.getItemStack())
.setTitle(C.cGreenB + voteable.getName())
.addLore("", "Click to vote for " + voteable.getName(), "to be the next " + lowerName + "!")
.setTitle(C.cGreenB + name)
.addLore("Click to vote for " + name, "to be the next " + lowerName + "!")
.setGlow(playerVote != null && playerVote.getValue().equals(voteable));
String fName = name;
addButton(slot++, builder.build(), (player, clickType) ->
{
_vote.vote(player, voteable);
playAcceptSound(player);
player.sendMessage(F.main("Game", "You voted for " + F.name(voteable.getName()) + "."));
player.sendMessage(F.main("Game", "You voted for " + F.name(fName) + "."));
});
}
}