Fix sidebars, implement vault api, coin pickups, and player respawning
This commit is contained in:
parent
f8b99d44bf
commit
a299b167de
8
TODO.md
8
TODO.md
@ -21,7 +21,7 @@
|
|||||||
[X] Never hungry
|
[X] Never hungry
|
||||||
[X] Mobs don't drop bomb items
|
[X] Mobs don't drop bomb items
|
||||||
[ ] Execute commands on game/wave end
|
[ ] Execute commands on game/wave end
|
||||||
[ ] Player Respawning
|
[X] Player Respawning
|
||||||
|
|
||||||
# QOL
|
# QOL
|
||||||
|
|
||||||
@ -33,7 +33,7 @@
|
|||||||
[ ] Leave game when leaving game world
|
[ ] Leave game when leaving game world
|
||||||
[ ] Bomb and target glow different colors
|
[ ] Bomb and target glow different colors
|
||||||
[ ] Play sound once bomb is close to / at target
|
[ ] Play sound once bomb is close to / at target
|
||||||
[ ] Expose coins under vault API
|
[X] Expose coins under vault API
|
||||||
[ ] Animations framework
|
[ ] Animations framework
|
||||||
|
|
||||||
# Malloc beta map
|
# Malloc beta map
|
||||||
@ -60,7 +60,7 @@
|
|||||||
[ ] Post-Round summary in chat
|
[ ] Post-Round summary in chat
|
||||||
[X] Clickable join links in /list
|
[X] Clickable join links in /list
|
||||||
[X] Sidebar
|
[X] Sidebar
|
||||||
[ ] Coin pickup messages in action bar
|
[X] Coin pickup status in sidebar
|
||||||
[ ] Target catches on fire more it is lit
|
[ ] Target catches on fire more it is lit
|
||||||
[ ] Colored titles
|
[ ] Colored titles
|
||||||
[ ] Clickable /leave action
|
[ ] Clickable /leave action
|
||||||
@ -123,7 +123,7 @@
|
|||||||
[X] Restore health+hunger on respawn/game start
|
[X] Restore health+hunger on respawn/game start
|
||||||
[ ] /restart games
|
[ ] /restart games
|
||||||
[ ] Instancing
|
[ ] Instancing
|
||||||
[ ] Respawn during games
|
[X] Respawn during games
|
||||||
[ ] Player revival items
|
[ ] Player revival items
|
||||||
[X] Clear inventory on join/leave
|
[X] Clear inventory on join/leave
|
||||||
|
|
||||||
|
6
pom.xml
6
pom.xml
@ -43,6 +43,12 @@
|
|||||||
<version>2.9.2</version>
|
<version>2.9.2</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.MilkBowl</groupId>
|
||||||
|
<artifactId>VaultAPI</artifactId>
|
||||||
|
<version>1.7</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
198
src/main/java/gg/malloc/defense/GameEconomy.java
Normal file
198
src/main/java/gg/malloc/defense/GameEconomy.java
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
package gg.malloc.defense;
|
||||||
|
|
||||||
|
import net.milkbowl.vault.economy.AbstractEconomy;
|
||||||
|
import net.milkbowl.vault.economy.Economy;
|
||||||
|
import net.milkbowl.vault.economy.EconomyResponse;
|
||||||
|
import net.milkbowl.vault.economy.EconomyResponse.ResponseType;
|
||||||
|
|
||||||
|
import org.bukkit.plugin.ServicesManager;
|
||||||
|
import org.bukkit.plugin.ServicePriority;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.OfflinePlayer;
|
||||||
|
|
||||||
|
import gg.malloc.defense.engine.GameRunner;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class GameEconomy extends AbstractEconomy {
|
||||||
|
|
||||||
|
Plugin m_plugin;
|
||||||
|
|
||||||
|
public GameEconomy(Plugin plugin) {
|
||||||
|
m_plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void register() {
|
||||||
|
ServicesManager manager = m_plugin.getServer().getServicesManager();
|
||||||
|
manager.register(Economy.class, this, m_plugin, ServicePriority.Highest);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse withdrawPlayer(String playerName, double amount) {
|
||||||
|
GameRunner runner = m_plugin.getRunnerForPlayer(playerName);
|
||||||
|
if (runner != null) {
|
||||||
|
Player p = m_plugin.getServer().getPlayer(playerName);
|
||||||
|
if (!has(playerName, amount)) {
|
||||||
|
int newBalance = runner.getState().getPlayerBalance(p);
|
||||||
|
return new EconomyResponse(amount, newBalance, ResponseType.FAILURE, "Not enough money!");
|
||||||
|
} else {
|
||||||
|
runner.spendMoney(p, (int)Math.floor(amount));
|
||||||
|
int newBalance = runner.getState().getPlayerBalance(p);
|
||||||
|
return new EconomyResponse(amount, newBalance, ResponseType.SUCCESS, "");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return new EconomyResponse(0, 0, ResponseType.FAILURE, "Not in a game!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse depositPlayer(String playerName, double amount) {
|
||||||
|
GameRunner runner = m_plugin.getRunnerForPlayer(playerName);
|
||||||
|
if (runner != null) {
|
||||||
|
Player p = m_plugin.getServer().getPlayer(playerName);
|
||||||
|
runner.spendMoney(p, -(int)Math.floor(amount));
|
||||||
|
int newBalance = runner.getState().getPlayerBalance(p);
|
||||||
|
return new EconomyResponse(amount, newBalance, ResponseType.SUCCESS, "");
|
||||||
|
} else {
|
||||||
|
return new EconomyResponse(0, 0, ResponseType.FAILURE, "Not in a game!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getBalance(String playerName) {
|
||||||
|
GameRunner runner = m_plugin.getRunnerForPlayer(playerName);
|
||||||
|
if (runner != null) {
|
||||||
|
Player p = m_plugin.getServer().getPlayer(playerName);
|
||||||
|
return runner.getState().getPlayerBalance(p);
|
||||||
|
} else {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getBalance(String playerName, String worldName) {
|
||||||
|
return getBalance(playerName);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "Malloc Defense";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasBankSupport() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int fractionalDigits() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String format(double amount) {
|
||||||
|
return amount + " grist";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currencyNamePlural() {
|
||||||
|
return "Grist";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currencyNameSingular() {
|
||||||
|
return "Grist";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasAccount(String playerName) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasAccount(String playerName, String worldName) {
|
||||||
|
return hasAccount(playerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean has(String playerName, double amount) {
|
||||||
|
return getBalance(playerName) >= amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean has(String playerName, String worldName, double amount) {
|
||||||
|
return has(playerName, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse withdrawPlayer(String playerName, String worldName, double amount) {
|
||||||
|
return withdrawPlayer(playerName, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse depositPlayer(String playerName, String worldName, double amount) {
|
||||||
|
return depositPlayer(playerName, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final EconomyResponse NO_IMPL_RESPONSE = new EconomyResponse(0, 0, ResponseType.NOT_IMPLEMENTED, "Not implemented.");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse createBank(String name, String player) {
|
||||||
|
return NO_IMPL_RESPONSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse deleteBank(String name) {
|
||||||
|
return NO_IMPL_RESPONSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse bankBalance(String name) {
|
||||||
|
return NO_IMPL_RESPONSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse bankHas(String name, double amount) {
|
||||||
|
return NO_IMPL_RESPONSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse bankWithdraw(String name, double amount) {
|
||||||
|
return NO_IMPL_RESPONSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse bankDeposit(String name, double amount) {
|
||||||
|
return NO_IMPL_RESPONSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse isBankOwner(String name, String player) {
|
||||||
|
return NO_IMPL_RESPONSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EconomyResponse isBankMember(String name, String player) {
|
||||||
|
return NO_IMPL_RESPONSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean createPlayerAccount(String name) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean createPlayerAccount(String name, String worldName) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getBanks() {
|
||||||
|
return new ArrayList<String>();
|
||||||
|
}
|
||||||
|
}
|
@ -14,10 +14,16 @@ import org.bukkit.event.entity.EntityCombustEvent;
|
|||||||
import org.bukkit.event.entity.EntityTargetEvent;
|
import org.bukkit.event.entity.EntityTargetEvent;
|
||||||
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||||
import org.bukkit.event.world.LootGenerateEvent;
|
import org.bukkit.event.world.LootGenerateEvent;
|
||||||
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.SoundCategory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import de.tr7zw.nbtapi.NBTItem;
|
||||||
|
import de.tr7zw.nbtapi.NBTCompound;
|
||||||
|
|
||||||
public class GameEventHandler implements Listener {
|
public class GameEventHandler implements Listener {
|
||||||
Collection<GameRunner> m_runners;
|
Collection<GameRunner> m_runners;
|
||||||
|
|
||||||
@ -78,4 +84,25 @@ public class GameEventHandler implements Listener {
|
|||||||
public void onFoodLevelChange(FoodLevelChangeEvent evt) {
|
public void onFoodLevelChange(FoodLevelChangeEvent evt) {
|
||||||
evt.setCancelled(true);
|
evt.setCancelled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onItemPickup(PlayerPickupItemEvent evt) {
|
||||||
|
NBTItem nbt = new NBTItem(evt.getItem().getItemStack());
|
||||||
|
if (nbt.hasKey("malloc")) {
|
||||||
|
NBTCompound mallocData = nbt.getCompound("malloc");
|
||||||
|
if (mallocData.hasKey("coinValue")) {
|
||||||
|
evt.setCancelled(true);
|
||||||
|
Player player = evt.getPlayer();
|
||||||
|
int coinValue = mallocData.getInteger("coinValue") * evt.getItem().getItemStack().getAmount();
|
||||||
|
player.getWorld().playSound(evt.getPlayer(), Sound.BLOCK_CHAIN_PLACE, SoundCategory.PLAYERS, (float)1.0, (float)1.0);
|
||||||
|
evt.getItem().remove();
|
||||||
|
for(GameRunner runner : m_runners) {
|
||||||
|
if (runner.getPlayers().contains(player)) {
|
||||||
|
runner.depositCoins(coinValue);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ public class Plugin extends JavaPlugin {
|
|||||||
HashMap<String, GameRunner> m_runningGames = new HashMap<>();
|
HashMap<String, GameRunner> m_runningGames = new HashMap<>();
|
||||||
HashMap<Player, GameRunner> m_playerGames = new HashMap<>();
|
HashMap<Player, GameRunner> m_playerGames = new HashMap<>();
|
||||||
GameEventHandler m_handler = new GameEventHandler();
|
GameEventHandler m_handler = new GameEventHandler();
|
||||||
|
GameEconomy m_economy = new GameEconomy(this);
|
||||||
|
|
||||||
public Collection<String> arenaNames() {
|
public Collection<String> arenaNames() {
|
||||||
return m_arenas.keySet();
|
return m_arenas.keySet();
|
||||||
@ -75,6 +76,9 @@ public class Plugin extends JavaPlugin {
|
|||||||
|
|
||||||
getServer().getPluginManager().registerEvents(new PlayerQuitHandler(), this);
|
getServer().getPluginManager().registerEvents(new PlayerQuitHandler(), this);
|
||||||
getServer().getPluginManager().registerEvents(m_handler, this);
|
getServer().getPluginManager().registerEvents(m_handler, this);
|
||||||
|
|
||||||
|
getLogger().info("Registering economy");
|
||||||
|
m_economy.register();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
@ -159,6 +163,14 @@ public class Plugin extends JavaPlugin {
|
|||||||
p.teleport(lobby.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
|
p.teleport(lobby.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GameRunner getRunnerForPlayer(String playerName) {
|
||||||
|
return getRunnerForPlayer(getServer().getPlayer(playerName));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removePlayerFromGames(Player player) {
|
||||||
|
m_playerGames.get(player).removePlayer(player);
|
||||||
|
}
|
||||||
|
|
||||||
public GameRunner getRunnerForPlayer(Player p) {
|
public GameRunner getRunnerForPlayer(Player p) {
|
||||||
GameRunner ret = null;
|
GameRunner ret = null;
|
||||||
if (m_playerGames.containsKey(p)) {
|
if (m_playerGames.containsKey(p)) {
|
||||||
|
@ -26,6 +26,7 @@ public class LeaveGameCommand implements CommandExecutor {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
runner.removePlayer(player);
|
runner.removePlayer(player);
|
||||||
|
m_plugin.removePlayerFromGames(player);
|
||||||
m_plugin.returnPlayerToLobby(player);
|
m_plugin.returnPlayerToLobby(player);
|
||||||
} else {
|
} else {
|
||||||
sender.sendMessage("Only players may use this command.");
|
sender.sendMessage("Only players may use this command.");
|
||||||
|
@ -66,6 +66,7 @@ public class GameRunner {
|
|||||||
TickTask m_lobbyReturnTask;
|
TickTask m_lobbyReturnTask;
|
||||||
TickTask m_bombSmokeTask;
|
TickTask m_bombSmokeTask;
|
||||||
TickTask m_bombCrackleTask;
|
TickTask m_bombCrackleTask;
|
||||||
|
TickTask m_playerRespawnTask;
|
||||||
|
|
||||||
BossBars m_bars;
|
BossBars m_bars;
|
||||||
Sidebars m_sidebars;
|
Sidebars m_sidebars;
|
||||||
@ -94,6 +95,10 @@ public class GameRunner {
|
|||||||
validateGameRule(GameRule.SPECTATORS_GENERATE_CHUNKS, false);
|
validateGameRule(GameRule.SPECTATORS_GENERATE_CHUNKS, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GameState getState() {
|
||||||
|
return m_state;
|
||||||
|
}
|
||||||
|
|
||||||
public GameRunner(Plugin plugin, Game game, Arena arena, World world) {
|
public GameRunner(Plugin plugin, Game game, Arena arena, World world) {
|
||||||
m_plugin = plugin;
|
m_plugin = plugin;
|
||||||
m_game = game;
|
m_game = game;
|
||||||
@ -120,6 +125,19 @@ public class GameRunner {
|
|||||||
}
|
}
|
||||||
}, 80);
|
}, 80);
|
||||||
|
|
||||||
|
m_playerRespawnTask = new TickTask(m_plugin, () -> {
|
||||||
|
m_players.tickRespawnCounters();
|
||||||
|
for (Player p : m_players.getPlayers()) {
|
||||||
|
if (m_players.readyToRespawn(p)) {
|
||||||
|
if (m_players.requestTransition(p, PlayerManager.State.Playing)) {
|
||||||
|
sendRespawnTitle(p);
|
||||||
|
p.teleport(m_world.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_bars.update();
|
||||||
|
}, 20);
|
||||||
|
|
||||||
m_countdownTask = new TickTask(m_plugin, () -> {
|
m_countdownTask = new TickTask(m_plugin, () -> {
|
||||||
if (m_warmupCountdown == 0) {
|
if (m_warmupCountdown == 0) {
|
||||||
requestTransition(Stage.Playing);
|
requestTransition(Stage.Playing);
|
||||||
@ -176,6 +194,16 @@ public class GameRunner {
|
|||||||
m_mobs.handleEntityRetarget(evt);
|
m_mobs.handleEntityRetarget(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void spendMoney(Player p, int amount) {
|
||||||
|
m_players.addPlayerExpenses(p, amount);
|
||||||
|
m_sidebars.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void depositCoins(int amount) {
|
||||||
|
m_state.addPickedUpCoins(amount);
|
||||||
|
m_sidebars.update();
|
||||||
|
}
|
||||||
|
|
||||||
public void handleEntityDamage(EntityDamageEvent evt) {
|
public void handleEntityDamage(EntityDamageEvent evt) {
|
||||||
m_mobs.handleEntityDamage(evt);
|
m_mobs.handleEntityDamage(evt);
|
||||||
if (m_mobs.bombWasHit() && !m_bombFuse.isExploded()) {
|
if (m_mobs.bombWasHit() && !m_bombFuse.isExploded()) {
|
||||||
@ -229,6 +257,8 @@ public class GameRunner {
|
|||||||
m_fuseTask.stop();
|
m_fuseTask.stop();
|
||||||
m_countdownTask.stop();
|
m_countdownTask.stop();
|
||||||
m_lobbyReturnTask.stop();
|
m_lobbyReturnTask.stop();
|
||||||
|
m_playerRespawnTask.stop();
|
||||||
|
m_state.resetBalances();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,6 +283,7 @@ public class GameRunner {
|
|||||||
.create();
|
.create();
|
||||||
broadcastMessage(message);
|
broadcastMessage(message);
|
||||||
m_mobs.clear();
|
m_mobs.clear();
|
||||||
|
m_playerRespawnTask.start();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,6 +319,7 @@ public class GameRunner {
|
|||||||
m_warmupCountdown = 10;
|
m_warmupCountdown = 10;
|
||||||
m_bars.setCountdownProgress(1.0);
|
m_bars.setCountdownProgress(1.0);
|
||||||
m_countdownTask.start();
|
m_countdownTask.start();
|
||||||
|
m_playerRespawnTask.start();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,6 +334,7 @@ public class GameRunner {
|
|||||||
}
|
}
|
||||||
m_countdownTask.stop();
|
m_countdownTask.stop();
|
||||||
m_fuseTask.start();
|
m_fuseTask.start();
|
||||||
|
m_playerRespawnTask.start();
|
||||||
spawnNextBatch();
|
spawnNextBatch();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -311,7 +344,7 @@ public class GameRunner {
|
|||||||
m_lobbyReturnTask.start();
|
m_lobbyReturnTask.start();
|
||||||
m_countdownTask.stop();
|
m_countdownTask.stop();
|
||||||
m_fuseTask.stop();
|
m_fuseTask.stop();
|
||||||
//m_mobs.clear();
|
m_playerRespawnTask.stop();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,7 +363,8 @@ public class GameRunner {
|
|||||||
private void handlePlayerDeath(Player player) {
|
private void handlePlayerDeath(Player player) {
|
||||||
if (m_players.requestTransition(player, PlayerManager.State.Dead)) {
|
if (m_players.requestTransition(player, PlayerManager.State.Dead)) {
|
||||||
m_world.strikeLightningEffect(player.getLocation());
|
m_world.strikeLightningEffect(player.getLocation());
|
||||||
if (!m_players.isAnyoneAlive()) {
|
//if (!m_players.isAnyoneAlive()) {
|
||||||
|
if (false) {
|
||||||
BaseComponent[] message = new ComponentBuilder()
|
BaseComponent[] message = new ComponentBuilder()
|
||||||
.append("Everyone is ").color(ChatColor.LIGHT_PURPLE)
|
.append("Everyone is ").color(ChatColor.LIGHT_PURPLE)
|
||||||
.append("DEAD").color(ChatColor.RED).bold(true)
|
.append("DEAD").color(ChatColor.RED).bold(true)
|
||||||
@ -339,6 +373,14 @@ public class GameRunner {
|
|||||||
broadcastMessage(message);
|
broadcastMessage(message);
|
||||||
requestTransition(Stage.GameOver);
|
requestTransition(Stage.GameOver);
|
||||||
} else {
|
} else {
|
||||||
|
BaseComponent[] message = new ComponentBuilder()
|
||||||
|
.append(player.getName())
|
||||||
|
.append(" has ").color(ChatColor.LIGHT_PURPLE)
|
||||||
|
.append("DIED!").color(ChatColor.RED).bold(true)
|
||||||
|
.append(" :(").color(ChatColor.LIGHT_PURPLE)
|
||||||
|
.create();
|
||||||
|
broadcastMessage(message);
|
||||||
|
sendDeathTitle(player);
|
||||||
m_log.info("Remaining players " + m_players.remainingPlayers());
|
m_log.info("Remaining players " + m_players.remainingPlayers());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -347,12 +389,15 @@ public class GameRunner {
|
|||||||
public void handleEntityDeath(Entity entity) {
|
public void handleEntityDeath(Entity entity) {
|
||||||
boolean wasCarrier = m_mobs.isBombCarrier(entity);
|
boolean wasCarrier = m_mobs.isBombCarrier(entity);
|
||||||
if (m_mobs.killMob(entity)) {
|
if (m_mobs.killMob(entity)) {
|
||||||
|
int COIN_STACK_SIZE = 5;
|
||||||
int coinsToDrop = 60;
|
int coinsToDrop = 60;
|
||||||
while(coinsToDrop > 0) {
|
while(coinsToDrop > 0) {
|
||||||
int droppedCoins = Math.min(coinsToDrop, 5);
|
int droppedCoins = Math.min(coinsToDrop, COIN_STACK_SIZE);
|
||||||
ItemStack coins = Items.makeCoins();
|
ItemStack coins = Items.makeCoins();
|
||||||
coins.setAmount(droppedCoins);
|
coins.setAmount(droppedCoins);
|
||||||
coinsToDrop -= 64;
|
coinsToDrop -= droppedCoins;
|
||||||
|
m_state.addDroppedCoins(droppedCoins);
|
||||||
|
m_sidebars.update();
|
||||||
m_world.dropItem(entity.getLocation(), coins);
|
m_world.dropItem(entity.getLocation(), coins);
|
||||||
}
|
}
|
||||||
m_bars.update();
|
m_bars.update();
|
||||||
@ -433,6 +478,14 @@ public class GameRunner {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sendDeathTitle(Player p) {
|
||||||
|
p.sendTitle(ChatColor.RED.toString() + "You died!", "Wait to respawn...");
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendRespawnTitle(Player p) {
|
||||||
|
p.sendTitle(ChatColor.AQUA.toString() + "Respawn", "");
|
||||||
|
}
|
||||||
|
|
||||||
void sendStageTitle(Player p) {
|
void sendStageTitle(Player p) {
|
||||||
switch(m_stage) {
|
switch(m_stage) {
|
||||||
case Warmup:
|
case Warmup:
|
||||||
@ -451,6 +504,7 @@ public class GameRunner {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
p.getInventory().clear();
|
p.getInventory().clear();
|
||||||
|
m_sidebars.addPlayer(p);
|
||||||
m_players.addPlayer(p);
|
m_players.addPlayer(p);
|
||||||
m_bars.addPlayer(p);
|
m_bars.addPlayer(p);
|
||||||
if (m_stage == Stage.Idle || m_stage == Stage.Warmup) {
|
if (m_stage == Stage.Idle || m_stage == Stage.Warmup) {
|
||||||
@ -471,6 +525,7 @@ public class GameRunner {
|
|||||||
|
|
||||||
public void removePlayer(Player p) {
|
public void removePlayer(Player p) {
|
||||||
p.getInventory().clear();
|
p.getInventory().clear();
|
||||||
|
m_sidebars.removePlayer(p);
|
||||||
m_bars.removePlayer(p);
|
m_bars.removePlayer(p);
|
||||||
m_players.removePlayer(p);
|
m_players.removePlayer(p);
|
||||||
if (m_players.isEmpty()) {
|
if (m_players.isEmpty()) {
|
||||||
|
@ -4,6 +4,8 @@ import gg.malloc.defense.model.Game;
|
|||||||
import gg.malloc.defense.model.Progress;
|
import gg.malloc.defense.model.Progress;
|
||||||
import gg.malloc.defense.model.State;
|
import gg.malloc.defense.model.State;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class GameState implements State {
|
public class GameState implements State {
|
||||||
GameRunner m_runner;
|
GameRunner m_runner;
|
||||||
WaveManager m_waves;
|
WaveManager m_waves;
|
||||||
@ -12,6 +14,9 @@ public class GameState implements State {
|
|||||||
BombFuse m_fuse;
|
BombFuse m_fuse;
|
||||||
PlayerManager m_players;
|
PlayerManager m_players;
|
||||||
|
|
||||||
|
int m_coinsDropped;
|
||||||
|
int m_coinsPickedUp;
|
||||||
|
|
||||||
public GameState(GameRunner runner, WaveManager waves, Game game, MobManager mobs, BombFuse fuse, PlayerManager players) {
|
public GameState(GameRunner runner, WaveManager waves, Game game, MobManager mobs, BombFuse fuse, PlayerManager players) {
|
||||||
m_runner = runner;
|
m_runner = runner;
|
||||||
m_waves = waves;
|
m_waves = waves;
|
||||||
@ -19,6 +24,47 @@ public class GameState implements State {
|
|||||||
m_mobs = mobs;
|
m_mobs = mobs;
|
||||||
m_fuse = fuse;
|
m_fuse = fuse;
|
||||||
m_players = players;
|
m_players = players;
|
||||||
|
m_coinsDropped = 0;
|
||||||
|
m_coinsPickedUp = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRemainingCoins() {
|
||||||
|
return coinsDropped() - coinsPickedUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int coinsDropped() {
|
||||||
|
return m_coinsDropped;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int coinsPickedUp() {
|
||||||
|
return m_coinsPickedUp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int INITIAL_BALANCE = 1500;
|
||||||
|
|
||||||
|
public int getPlayerBalance(Player p) {
|
||||||
|
return coinsPickedUp() - m_players.getPlayerExpenses(p) + INITIAL_BALANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addDroppedCoins(int v) {
|
||||||
|
m_coinsDropped += v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addPickedUpCoins(int v) {
|
||||||
|
m_coinsPickedUp += v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetBalances() {
|
||||||
|
m_coinsDropped = 0;
|
||||||
|
m_coinsPickedUp = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Progress playerRespawnProgress(Player p) {
|
||||||
|
return m_players.getRespawnProgress(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Progress coinProgress() {
|
||||||
|
return new StaticProgress(m_coinsPickedUp, m_coinsDropped);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameRunner.Stage getStage() {
|
public GameRunner.Stage getStage() {
|
||||||
|
@ -16,6 +16,8 @@ import java.util.Collection;
|
|||||||
public class PlayerManager {
|
public class PlayerManager {
|
||||||
HashMap<Player, State> m_playerStates = new HashMap<>();
|
HashMap<Player, State> m_playerStates = new HashMap<>();
|
||||||
HashMap<Player, Boolean> m_playerReadyStates = new HashMap<>();
|
HashMap<Player, Boolean> m_playerReadyStates = new HashMap<>();
|
||||||
|
HashMap<Player, Integer> m_playerExpenses = new HashMap<>();
|
||||||
|
HashMap<Player, Integer> m_respawnCounters = new HashMap<>();
|
||||||
|
|
||||||
public enum State {
|
public enum State {
|
||||||
Idle,
|
Idle,
|
||||||
@ -68,22 +70,22 @@ public class PlayerManager {
|
|||||||
|
|
||||||
// Respawn player
|
// Respawn player
|
||||||
public boolean enterPlaying(Player player) {
|
public boolean enterPlaying(Player player) {
|
||||||
//m_log.fine("Respawning player " + player);
|
|
||||||
player.setGameMode(Bukkit.getDefaultGameMode());
|
player.setGameMode(Bukkit.getDefaultGameMode());
|
||||||
healPlayer(player);
|
healPlayer(player);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean enterDead(Player player) {
|
public boolean enterDead(Player player) {
|
||||||
//m_log.info("Player has died in game" + player);
|
|
||||||
player.setGameMode(GameMode.SPECTATOR);
|
player.setGameMode(GameMode.SPECTATOR);
|
||||||
|
m_respawnCounters.put(player, 15);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addPlayer(Player player) {
|
public void addPlayer(Player player) {
|
||||||
//m_log.info("Adding player " + player);
|
|
||||||
m_playerStates.put(player, State.Idle);
|
m_playerStates.put(player, State.Idle);
|
||||||
m_playerReadyStates.put(player, false);
|
m_playerReadyStates.put(player, false);
|
||||||
|
m_playerExpenses.put(player, 0);
|
||||||
|
m_respawnCounters.put(player, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isReady(Player player) {
|
public boolean isReady(Player player) {
|
||||||
@ -111,14 +113,53 @@ public class PlayerManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Progress getRespawnProgress(Player player) {
|
||||||
|
return new StaticProgress(m_respawnCounters.get(player), 15);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRespawnCounter(Player player) {
|
||||||
|
if (m_respawnCounters.containsKey(player)) {
|
||||||
|
return m_respawnCounters.get(player);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void tickRespawnCounters() {
|
||||||
|
for(Player p : m_respawnCounters.keySet()) {
|
||||||
|
if (m_respawnCounters.get(p) > 0) {
|
||||||
|
m_respawnCounters.put(p, m_respawnCounters.get(p) - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean readyToRespawn(Player player) {
|
||||||
|
return m_respawnCounters.get(player) == 0 && m_playerStates.get(player) == State.Dead;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addPlayerExpenses(Player player, int amount) {
|
||||||
|
if (m_playerExpenses.containsKey(player)) {
|
||||||
|
m_playerExpenses.put(player, m_playerExpenses.get(player) + amount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPlayerExpenses(Player player) {
|
||||||
|
if (m_playerExpenses.containsKey(player)) {
|
||||||
|
return m_playerExpenses.get(player);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean removePlayer(Player player) {
|
public boolean removePlayer(Player player) {
|
||||||
//m_log.info("Removing player " + player);
|
|
||||||
healPlayer(player);
|
healPlayer(player);
|
||||||
requestTransition(player, State.Idle);
|
requestTransition(player, State.Idle);
|
||||||
m_playerStates.remove(player);
|
m_playerStates.remove(player);
|
||||||
m_playerReadyStates.remove(player);
|
m_playerReadyStates.remove(player);
|
||||||
|
m_playerExpenses.remove(player);
|
||||||
|
m_respawnCounters.remove(player);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,9 @@ public interface Progress {
|
|||||||
|
|
||||||
int value();
|
int value();
|
||||||
int maximum();
|
int maximum();
|
||||||
|
default int remaining() {
|
||||||
|
return maximum() - value();
|
||||||
|
}
|
||||||
default double toDouble() {
|
default double toDouble() {
|
||||||
return Math.min(maximum(), Math.max(0.0, value())) / maximum();
|
return Math.min(maximum(), Math.max(0.0, value())) / maximum();
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@ package gg.malloc.defense.model;
|
|||||||
|
|
||||||
import gg.malloc.defense.engine.GameRunner;
|
import gg.malloc.defense.engine.GameRunner;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public interface State {
|
public interface State {
|
||||||
GameRunner.Stage getStage();
|
GameRunner.Stage getStage();
|
||||||
|
|
||||||
@ -9,4 +11,8 @@ public interface State {
|
|||||||
Progress waveProgress();
|
Progress waveProgress();
|
||||||
Progress mobProgress();
|
Progress mobProgress();
|
||||||
Progress playerReadyProgress();
|
Progress playerReadyProgress();
|
||||||
|
Progress coinProgress();
|
||||||
|
|
||||||
|
Progress playerRespawnProgress(Player p);
|
||||||
|
int getPlayerBalance(Player p);
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,9 @@ package gg.malloc.defense.ui;
|
|||||||
|
|
||||||
import gg.malloc.defense.model.Game;
|
import gg.malloc.defense.model.Game;
|
||||||
import gg.malloc.defense.model.State;
|
import gg.malloc.defense.model.State;
|
||||||
|
import gg.malloc.defense.model.Progress;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
import org.bukkit.boss.BossBar;
|
import org.bukkit.boss.BossBar;
|
||||||
import org.bukkit.boss.BarStyle;
|
import org.bukkit.boss.BarStyle;
|
||||||
@ -13,6 +16,7 @@ public class BossBars {
|
|||||||
BossBar m_gameBar = Bukkit.createBossBar("Malloc Defense", BarColor.PURPLE, BarStyle.SOLID);
|
BossBar m_gameBar = Bukkit.createBossBar("Malloc Defense", BarColor.PURPLE, BarStyle.SOLID);
|
||||||
BossBar m_waveBar = Bukkit.createBossBar("Malloc Defense", BarColor.PURPLE, BarStyle.SOLID);
|
BossBar m_waveBar = Bukkit.createBossBar("Malloc Defense", BarColor.PURPLE, BarStyle.SOLID);
|
||||||
BossBar m_bombBar = Bukkit.createBossBar("Bomb Fuse", BarColor.RED, BarStyle.SOLID);
|
BossBar m_bombBar = Bukkit.createBossBar("Bomb Fuse", BarColor.RED, BarStyle.SOLID);
|
||||||
|
HashMap<Player, BossBar> m_respawnBars = new HashMap<>();
|
||||||
|
|
||||||
State m_gameState;
|
State m_gameState;
|
||||||
|
|
||||||
@ -33,12 +37,20 @@ public class BossBars {
|
|||||||
m_gameBar.addPlayer(p);
|
m_gameBar.addPlayer(p);
|
||||||
m_waveBar.addPlayer(p);
|
m_waveBar.addPlayer(p);
|
||||||
m_bombBar.addPlayer(p);
|
m_bombBar.addPlayer(p);
|
||||||
|
BossBar respawnBar = Bukkit.createBossBar("Respawn", BarColor.BLUE, BarStyle.SOLID);
|
||||||
|
respawnBar.addPlayer(p);
|
||||||
|
respawnBar.setVisible(false);
|
||||||
|
m_respawnBars.put(p, respawnBar);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removePlayer(Player p) {
|
public void removePlayer(Player p) {
|
||||||
m_gameBar.removePlayer(p);
|
m_gameBar.removePlayer(p);
|
||||||
m_waveBar.removePlayer(p);
|
m_waveBar.removePlayer(p);
|
||||||
m_bombBar.removePlayer(p);
|
m_bombBar.removePlayer(p);
|
||||||
|
if (m_respawnBars.containsKey(p)) {
|
||||||
|
m_respawnBars.get(p).removePlayer(p);
|
||||||
|
m_respawnBars.remove(p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update() {
|
public void update() {
|
||||||
@ -100,5 +112,15 @@ public class BossBars {
|
|||||||
m_bombBar.setVisible(false);
|
m_bombBar.setVisible(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
for (Player p : m_respawnBars.keySet()) {
|
||||||
|
Progress respawnProgress = m_gameState.playerRespawnProgress(p);
|
||||||
|
if (respawnProgress.value() > 0) {
|
||||||
|
m_respawnBars.get(p).setVisible(true);
|
||||||
|
m_respawnBars.get(p).setProgress(respawnProgress.toDouble());
|
||||||
|
m_respawnBars.get(p).setTitle("Respawning in " + respawnProgress.value());
|
||||||
|
} else {
|
||||||
|
m_respawnBars.get(p).setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import org.bukkit.scoreboard.DisplaySlot;
|
|||||||
import org.bukkit.scoreboard.Score;
|
import org.bukkit.scoreboard.Score;
|
||||||
import org.bukkit.scoreboard.Team;
|
import org.bukkit.scoreboard.Team;
|
||||||
import org.bukkit.scoreboard.Objective;
|
import org.bukkit.scoreboard.Objective;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class Sidebar {
|
public class Sidebar {
|
||||||
Scoreboard m_scoreboard;
|
Scoreboard m_scoreboard;
|
||||||
@ -19,12 +20,14 @@ public class Sidebar {
|
|||||||
ArrayList<String> m_rowKeys;
|
ArrayList<String> m_rowKeys;
|
||||||
HashMap<Integer, String> m_rows;
|
HashMap<Integer, String> m_rows;
|
||||||
ArrayList<Team> m_teams;
|
ArrayList<Team> m_teams;
|
||||||
|
Player m_player;
|
||||||
int m_size;
|
int m_size;
|
||||||
|
|
||||||
State m_state;
|
State m_state;
|
||||||
|
|
||||||
public Sidebar(State state, Scoreboard scoreboard) {
|
public Sidebar(State state, Scoreboard scoreboard, Player player) {
|
||||||
m_state = state;
|
m_state = state;
|
||||||
|
m_player = player;
|
||||||
m_scoreboard = scoreboard;
|
m_scoreboard = scoreboard;
|
||||||
m_objective = m_scoreboard.registerNewObjective("text", "dummy", ChatColor.LIGHT_PURPLE + "" + ChatColor.BOLD + "Malloc Defense");
|
m_objective = m_scoreboard.registerNewObjective("text", "dummy", ChatColor.LIGHT_PURPLE + "" + ChatColor.BOLD + "Malloc Defense");
|
||||||
m_objective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
m_objective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||||
@ -34,6 +37,7 @@ public class Sidebar {
|
|||||||
m_rowKeys.add(ChatColor.BLACK + "" + ChatColor.WHITE);
|
m_rowKeys.add(ChatColor.BLACK + "" + ChatColor.WHITE);
|
||||||
m_rowKeys.add(ChatColor.GOLD+ "" + ChatColor.WHITE);
|
m_rowKeys.add(ChatColor.GOLD+ "" + ChatColor.WHITE);
|
||||||
m_rowKeys.add(ChatColor.WHITE+ "" + ChatColor.WHITE);
|
m_rowKeys.add(ChatColor.WHITE+ "" + ChatColor.WHITE);
|
||||||
|
m_rowKeys.add(ChatColor.BLACK+ "" + ChatColor.BLACK);
|
||||||
for(String key : m_rowKeys) {
|
for(String key : m_rowKeys) {
|
||||||
Team team = m_scoreboard.registerNewTeam(key);
|
Team team = m_scoreboard.registerNewTeam(key);
|
||||||
team.addEntry(key);
|
team.addEntry(key);
|
||||||
@ -50,20 +54,23 @@ public class Sidebar {
|
|||||||
case Warmup:
|
case Warmup:
|
||||||
m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum());
|
m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum());
|
||||||
m_rows.put(1, ChatColor.AQUA + "Get ready!");
|
m_rows.put(1, ChatColor.AQUA + "Get ready!");
|
||||||
m_rows.put(2, ChatColor.AQUA + "Balance: ");
|
m_rows.put(2, ChatColor.AQUA + "Balance: " + m_state.getPlayerBalance(m_player));
|
||||||
m_size = 3;
|
m_rows.put(3, ChatColor.AQUA + "Coins remaining: " + m_state.coinProgress().remaining());
|
||||||
|
m_size = 4;
|
||||||
break;
|
break;
|
||||||
case Countdown:
|
case Countdown:
|
||||||
m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum());
|
m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum());
|
||||||
m_rows.put(1, ChatColor.GOLD + "Wave incoming!");
|
m_rows.put(1, ChatColor.GOLD + "Wave incoming!");
|
||||||
m_rows.put(2, ChatColor.AQUA + "Balance: ");
|
m_rows.put(2, ChatColor.AQUA + "Balance: " + m_state.getPlayerBalance(m_player));
|
||||||
m_size = 3;
|
m_rows.put(3, ChatColor.AQUA + "Coins remaining: " + m_state.coinProgress().remaining());
|
||||||
|
m_size = 4;
|
||||||
break;
|
break;
|
||||||
case Playing:
|
case Playing:
|
||||||
m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum());
|
m_rows.put(0, ChatColor.LIGHT_PURPLE + "Wave " + m_state.waveProgress().value() + " / " + m_state.waveProgress().maximum());
|
||||||
m_rows.put(1, ChatColor.GREEN + "Mobs remaining: " + (m_state.mobProgress().maximum() - m_state.mobProgress().value()));
|
m_rows.put(1, ChatColor.GREEN + "Mobs remaining: " + m_state.mobProgress().remaining());
|
||||||
m_rows.put(2, ChatColor.AQUA + "Balance: ");
|
m_rows.put(2, ChatColor.AQUA + "Balance: " + m_state.getPlayerBalance(m_player));
|
||||||
m_size = 3;
|
m_rows.put(3, ChatColor.AQUA + "Coins remaining: " + m_state.coinProgress().remaining());
|
||||||
|
m_size = 4;
|
||||||
break;
|
break;
|
||||||
case GameOver:
|
case GameOver:
|
||||||
m_rows.put(0, ChatColor.RED + "Game over!");
|
m_rows.put(0, ChatColor.RED + "Game over!");
|
||||||
|
@ -18,7 +18,7 @@ public class Sidebars {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void addPlayer(Player player) {
|
public void addPlayer(Player player) {
|
||||||
m_sidebars.put(player, new Sidebar(m_state, m_scoreboards.getNewScoreboard()));
|
m_sidebars.put(player, new Sidebar(m_state, m_scoreboards.getNewScoreboard(), player));
|
||||||
player.setScoreboard(m_sidebars.get(player).getScoreboard());
|
player.setScoreboard(m_sidebars.get(player).getScoreboard());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ name: Malloc-Defense
|
|||||||
version: 1.0
|
version: 1.0
|
||||||
api-version: 1.18
|
api-version: 1.18
|
||||||
main: gg.malloc.defense.Plugin
|
main: gg.malloc.defense.Plugin
|
||||||
depend: []
|
depend: [Vault]
|
||||||
commands:
|
commands:
|
||||||
ready:
|
ready:
|
||||||
description: Mark yourself as ready for the next wave
|
description: Mark yourself as ready for the next wave
|
||||||
|
Loading…
Reference in New Issue
Block a user