done
Some checks are pending
Build plugin / build (push) Waiting to run

This commit is contained in:
2vb 2024-07-08 15:08:35 -07:00
parent 84dc304136
commit 7a216b4095
10 changed files with 257 additions and 56 deletions

View File

@ -10,9 +10,12 @@ import lombok.Getter;
import net.megavex.scoreboardlibrary.api.ScoreboardLibrary;
import net.megavex.scoreboardlibrary.api.exception.NoPacketAdapterAvailableException;
import net.megavex.scoreboardlibrary.api.noop.NoopScoreboardLibrary;
import org.bukkit.Bukkit;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import xyz.twovb.sgm.commands.handlers.InvalidArgsHandler;
import xyz.twovb.sgm.commands.handlers.NoPermissionsHandler;
@ -31,7 +34,7 @@ import xyz.twovb.toolbox.utils.CustomLogger;
import java.io.IOException;
import java.util.Objects;
public final class SGM extends JavaPlugin {
public final class SGM extends JavaPlugin implements Listener {
@Getter
private static SGM instance;
@ -71,8 +74,14 @@ public final class SGM extends JavaPlugin {
registerGames();
registerPlaceholders();
levelManager.loadLevels();
// Bukkit.getPluginManager().registerEvents(this, SGM.getInstance());
}
// @EventHandler
// public void onEntityDamage() {
//
// }
private void loadScoreboard() {
try {
scoreboardLibrary = ScoreboardLibrary.loadScoreboardLibrary(this);

View File

@ -70,9 +70,9 @@ public class GameCommand {
new JoinGameGui().getGui().show(player);
}
@Execute(name = "testjoin")
void testjoin(@Context Player player, @Arg("id") String id) {
SGM.getInstance().getGameManager().addPlayerToGame(player, UUID.fromString(id));
@Execute(name = "addplayer")
void testjoin(@Context CommandSender sender, @Arg("player") Player target, @Arg("id") String id) {
SGM.getInstance().getGameManager().addPlayerToGame(target, UUID.fromString(id));
}
}

View File

@ -9,6 +9,7 @@ import dev.rollczi.litecommands.annotations.command.Command;
import dev.rollczi.litecommands.annotations.context.Context;
import dev.rollczi.litecommands.annotations.execute.Execute;
import dev.rollczi.litecommands.annotations.permission.Permission;
import org.bukkit.GameMode;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -63,6 +64,7 @@ public class LevelCommand {
CustomPlayer cPlayer = new CustomPlayer(player);
World world = LevelManager.getLevel(name);
player.teleport(world.getSpawnLocation());
player.setGameMode(GameMode.CREATIVE);
cPlayer.sendMessage("<red>tele&aport");
}

View File

@ -33,6 +33,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDismountEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.*;
@ -40,7 +41,6 @@ import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.scoreboard.Scoreboard;
import org.jetbrains.annotations.NotNull;
import xyz.twovb.sgm.SGM;
import xyz.twovb.sgm.games.GameManager;
@ -62,10 +62,6 @@ public class CTB implements Minigame {
private final UUID uuid;
private final ArrayList<Location> redBrickSpawns = new ArrayList<Location>();
private final ArrayList<Location> blueBrickSpawns = new ArrayList<Location>();
private Location redSpawnLocation;
private Location blueSpawnLocation;
// private final ArrayList<Location> redSpawnArea = new ArrayList<Location>();
// private final ArrayList<Location> blueSpawnArea = new ArrayList<Location>();
private final ArrayList<Player> players = new ArrayList<Player>();
private final HashMap<Player, Location> playerLocationHashMap = new HashMap<>();
// tagger, tagged
@ -73,6 +69,8 @@ public class CTB implements Minigame {
private final HashMap<Player, CtbData.PlayerState> playerStateMap = new HashMap<>();
ScoreboardTeam redTeam;
ScoreboardTeam blueTeam;
private Location redSpawnLocation;
private Location blueSpawnLocation;
private Location redJail;
private Location blueJail;
private World gameWorld;
@ -88,6 +86,9 @@ public class CTB implements Minigame {
private int tagTime;
private int jailTime;
private int redScore = 0;
private int blueScore = 0;
private int taskId;
public CTB() {
@ -104,6 +105,14 @@ public class CTB implements Minigame {
// Perform initialization logic here
gameWorld = createGameWorld(world, uuid);
gameWorld.setAutoSave(false);
gameWorld.setGameRule(GameRule.KEEP_INVENTORY, true);
gameWorld.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false);
gameWorld.setGameRule(GameRule.DO_WEATHER_CYCLE, false);
gameWorld.setGameRule(GameRule.RANDOM_TICK_SPEED, 0);
gameWorld.setGameRule(GameRule.DO_MOB_SPAWNING, false);
gameWorld.setGameRule(GameRule.DO_MOB_SPAWNING, false);
gameWorld.setGameRule(GameRule.DO_MOB_LOOT, false);
// todo get player attributes and then save
if (applyOptions(world)) {
this.teamManager = SGM.getInstance().getScoreboardLibrary().createTeamManager();
this.redTeam = teamManager.createIfAbsent("red_team");
@ -161,20 +170,16 @@ public class CTB implements Minigame {
if (players.isEmpty()) {
this.stop();
}
for (ScoreboardTeam teams : teamManager.teams()) {
if (bricks <= getScore(teams)) {
endGame(teams);
}
}
try {
headerAnimation.nextFrame();
layout.apply(sb);
} catch (IllegalStateException ignored) {
}
for (Player player : gameWorld.getPlayers()) {
if (!players.contains(player)) {
// for (Player gamePlayer : players) {
// gamePlayer.hidePlayer(SGM.getInstance(), player);
// }
sendMessageToAllPlayers(player.getName() + " IS A IMPOSTER");
}
}
for (Player player : players) {
CtbData.Territory territory = getTerritory(player);
CtbData.PlayerState state = playerStateMap.get(player);
@ -198,20 +203,35 @@ public class CTB implements Minigame {
break;
}
}
SGM.getInstance().getCLogger().log(playerStateMap);
// SGM.getInstance().getCLogger().log(playerStateMap);
}
void endGame(ScoreboardTeam team) {
if (team == redTeam) {
sendMessageToAllPlayers("&cRed Team &7has won the game!");
} else if (team == blueTeam) {
sendMessageToAllPlayers("&9Blue Team &7has won the game!");
}
stop();
}
@Override
public void start(CommandSender sender) {
if (checkStart(sender)) {
for (Player player : players) {
EntityEquipment playerEquipment = player.getEquipment();
player.getInventory().clear();
player.teleport(this.spawnLoc);
sb.addPlayer(player);
player.setGameMode(GameMode.ADVENTURE);
playerStateMap.put(player, CtbData.PlayerState.Free);
for (ScoreboardTeam teams : teamManager.teams()) {
if (teams.defaultDisplay().entries().contains(player.getName())) {
if (teams == redTeam) {
player.teleport(this.redSpawnLocation);
} else if (teams == blueTeam) {
player.teleport(this.blueSpawnLocation);
}
}
}
}
for (int i = 0; i <= this.bricks - 1; i++) {
@ -286,6 +306,8 @@ public class CTB implements Minigame {
public void addPlayer(Player player) {
player.teleport(this.spawnLoc);
players.add(player);
player.getInventory().clear();
player.setGameMode(GameMode.ADVENTURE);
sendMessageToAllPlayers(messages.getString("system.player.join").replace("%player%", player.getName()));
}
@ -316,11 +338,16 @@ public class CTB implements Minigame {
@EventHandler
void onPlayerDeath(PlayerDeathEvent event) {
Player player = event.getPlayer();
if (players.contains(player) && state == GameState.STARTED) {
sendMessageToAllPlayers(player.getName() + " was eliminated!");
event.setDeathMessage("");
removePlayer(player);
if (!players.contains(player)) return;
if (state == GameState.STARTED) {
addPlayerToJail(player);
}
event.setCancelled(true);
// if (players.contains(player) && state == GameState.STARTED) {
// sendMessageToAllPlayers(player.getName() + " was eliminated!");
// event.setDeathMessage("");
// removePlayer(player);
// }
}
@EventHandler
@ -341,7 +368,7 @@ public class CTB implements Minigame {
}
private void releasePlayer(Player tagged, Player tagger) {
playerStateMap.replace(tagger, CtbData.PlayerState.Tagging, CtbData.PlayerState.Invulnerable);
playerStateMap.replace(tagger, CtbData.PlayerState.Tagging, CtbData.PlayerState.Free);
playerStateMap.replace(tagged, CtbData.PlayerState.Tagged, CtbData.PlayerState.Invulnerable);
CustomPlayer cTagged = new CustomPlayer(tagged);
CustomPlayer cTagger = new CustomPlayer(tagger);
@ -350,6 +377,12 @@ public class CTB implements Minigame {
taggedPlayerHashMap.remove(tagger);
}
private void jailbreakPlayer(Player jailed) {
playerStateMap.replace(jailed, CtbData.PlayerState.Jailed, CtbData.PlayerState.Invulnerable);
CustomPlayer cPlayer = new CustomPlayer(jailed);
cPlayer.sendMessage(messages.getString("system.player.jail.jailbreak.notify"));
}
@EventHandler
void onPlayerMoveWithBrick(PlayerMoveEvent event) {
if (!(event.getFrom().getX() != event.getTo().getX() || event.getFrom().getZ() != event.getTo().getZ())) return;
@ -362,9 +395,41 @@ public class CTB implements Minigame {
if (territory.equals(CtbData.Territory.Neutral)) {
sendMessageToAllPlayers(messages.getString("system.player.brick.steal.announce").replace("%player%", player.getName()));
playerStateMap.replace(player, CtbData.PlayerState.Stealing, CtbData.PlayerState.Free);
PlayerCaptureBrickEvent captureBrickEvent = new PlayerCaptureBrickEvent(player);
captureBrickEvent.callEvent();
}
}
@EventHandler
void onBrickCapture(PlayerCaptureBrickEvent event) {
Player player = event.getThief();
if (!players.contains(player)) return;
ScoreboardTeam team = getTeam(player);
player.getInventory().clear();
addScore(team, 1);
}
void addScore(ScoreboardTeam team, int scoreToAdd) {
if (team == redTeam) {
// SGM.getInstance().getCLogger().log(redScore);
this.redScore = redScore + scoreToAdd;
// SGM.getInstance().getCLogger().log(redScore);
} else if (team == blueTeam) {
// SGM.getInstance().getCLogger().log(blueScore);
this.blueScore = blueScore + scoreToAdd;
// SGM.getInstance().getCLogger().log(blueScore);
}
}
int getScore(ScoreboardTeam team) {
if (team == redTeam) {
return redScore;
} else if (team == blueTeam) {
return blueScore;
}
return 0;
}
@EventHandler
void onPlayerStealBrick(PlayerStealBrickEvent event) {
Player player = event.getThief();
@ -459,14 +524,6 @@ public class CTB implements Minigame {
Player tagger = event.getTagger();
if (this.state != GameState.STARTED) return;
if (!players.contains(tagged) || !players.contains(tagger)) return;
if (playerStateMap.get(tagged) == CtbData.PlayerState.Stealing) {
ScoreboardTeam team = getTeam(tagged);
if (team == redTeam) {
placeBrick(tagged.getLocation(), blueTeam);
} else if (team == blueTeam) {
placeBrick(tagged.getLocation(), redTeam);
}
}
taggedPlayerHashMap.putIfAbsent(tagger, tagged);
CustomPlayer cTagged = new CustomPlayer(tagged);
CustomPlayer cTagger = new CustomPlayer(tagger);
@ -479,19 +536,34 @@ public class CTB implements Minigame {
tagger.addPassenger(armorStandEntity);
armorStandEntity.addPassenger(tagged);
new BukkitRunnable() {
private int seconds = 0;
private final CustomPlayer cTagged = new CustomPlayer(tagged);
private final CustomPlayer cTagger = new CustomPlayer(tagger);
private int seconds = 1;
@Override
public void run() {
if (playerStateMap.get(tagger) != CtbData.PlayerState.Tagging) this.cancel();
if (seconds > tagTime) {
tagger.sendMessage("out of time");
cTagger.sendMessage(messages.getString("system.player.tag.notime.notify").replace("%player%", tagged.getName()));
cTagged.sendMessage(messages.getString("system.player.tag.notime.info").replace("%player%", tagger.getName()));
playerStateMap.replace(tagger, CtbData.PlayerState.Tagging, CtbData.PlayerState.Invulnerable);
playerStateMap.replace(tagged, CtbData.PlayerState.Tagged, CtbData.PlayerState.Invulnerable);
for (Entity entity : tagger.getPassengers()) {
if (entity instanceof ArmorStand) {
entity.remove();
}
}
this.cancel();
} else {
tagger.sendMessage(String.valueOf(tagTime));
seconds++;
}
}
}.runTaskTimer(SGM.getInstance(), 0, 20L);
}
//TODO MAKE LEVEL CREATE TP U TO RIGHT PLACE
@EventHandler
void onPlayerFreedom(PlayerFreedFromJailEvent event) {
Player tagged = event.getTagged();
@ -529,13 +601,25 @@ public class CTB implements Minigame {
if (teamMember.player() == cPlayer.player()) continue;
teamMember.sendMessage(LegacyComponentSerializer.legacyAmpersand().serialize(event.getMessage()));
}
new BukkitRunnable() {
private int seconds = 1;
@Override
public void run() {
if (playerStateMap.get(player) != CtbData.PlayerState.Jailed) this.cancel();
if (seconds > jailTime) {
jailbreakPlayer(player);
} else {
seconds++;
}
}
}.runTaskTimer(SGM.getInstance(), 0, 20L);
}
@EventHandler
void handleEntityDamage(EntityDamageByEntityEvent event) {
if (this.state != GameState.STARTED) return;
// if (this.state != GameState.STARTED) return;
Entity eventEntity = event.getEntity();
Entity eventDamager = event.getDamager();
@ -543,8 +627,10 @@ public class CTB implements Minigame {
if (!players.contains(interacted) || !players.contains(interacter)) return;
// if (getTerritory(interacted) != getTerritory(interacter)) return;
if (this.state == GameState.STARTED) {
PlayerGameInteractionEvent interactionEvent = new PlayerGameInteractionEvent(interacted, interacter);
Bukkit.getServer().getPluginManager().callEvent(interactionEvent);
}
event.setCancelled(true);
// if (interactionEvent.isCancelled()) {
@ -552,6 +638,21 @@ public class CTB implements Minigame {
// }
}
@EventHandler
void handlePlayerDamage(EntityDamageEvent event) {
if (this.state != GameState.STARTED && this.state != GameState.READY) return;
Entity entity = event.getEntity();
if (!(entity instanceof Player gamePlayer)) return;
if (!players.contains(gamePlayer)) return;
if (this.state == GameState.READY) {
event.setCancelled(true);
} else if (this.state == GameState.STARTED) {
if (playerStateMap.get(gamePlayer) == CtbData.PlayerState.Tagged) {
event.setCancelled(true);
}
}
}
@EventHandler
void onPlayerFree(PlayerGameInteractionEvent event) {
Player interacted = event.getInteracted();
@ -587,11 +688,27 @@ public class CTB implements Minigame {
event.setCancelled(true);
CtbData.Territory territory = getTerritory(interacted);
EntityEquipment interactedEquipment = interacted.getEquipment();
if (territory == CtbData.Territory.Neutral) return;
if (territory == CtbData.Territory.Blue && interacterTeam != blueTeam) return;
if (territory == CtbData.Territory.Red && interacterTeam != redTeam) return;
if (playerStateMap.get(interacter) != CtbData.PlayerState.Free) return;
if (playerStateMap.get(interacted) != CtbData.PlayerState.Free && playerStateMap.get(interacted) != CtbData.PlayerState.Stealing) return;
if (playerStateMap.get(interacted) != CtbData.PlayerState.Free && playerStateMap.get(interacted) != CtbData.PlayerState.Stealing)
return;
if (playerStateMap.get(interacted) == CtbData.PlayerState.Stealing) {
ScoreboardTeam team = getTeam(interacted);
if (team == redTeam) {
if (interactedEquipment.getHelmet().getType().equals(Material.BLUE_WOOL)) {
interacted.getInventory().clear();
placeBrick(interacted.getLocation(), blueTeam);
}
} else if (team == blueTeam) {
if (interactedEquipment.getHelmet().getType().equals(Material.RED_WOOL)) {
interacted.getInventory().clear();
placeBrick(interacted.getLocation(), redTeam);
}
}
}
playerStateMap.replace(interacted, CtbData.PlayerState.Tagged);
playerStateMap.replace(interacter, CtbData.PlayerState.Free, CtbData.PlayerState.Tagging);
PlayerTaggedEvent taggedEvent = new PlayerTaggedEvent(interacted, interacter);
@ -620,7 +737,7 @@ public class CTB implements Minigame {
if (territory == CtbData.Territory.Blue && taggerTeam == blueTeam) return;
if (territory == CtbData.Territory.Red && taggerTeam == redTeam) return;
if (playerStateMap.get(brickTaker) != CtbData.PlayerState.Free) return;
if (brickMaterial != null) return;
if (brickMaterial == null) return;
playerStateMap.replace(brickTaker, CtbData.PlayerState.Free, CtbData.PlayerState.Stealing);
EntityEquipment playerEquipment = event.getPlayer().getEquipment();
playerEquipment.setHelmet(new ItemStack(brickMaterial));
@ -640,6 +757,9 @@ public class CTB implements Minigame {
} else if (team == blueTeam) {
player.teleport(redJail);
}
}
public void freePlayerFromJail(Player player) {
@ -704,8 +824,8 @@ public class CTB implements Minigame {
brickSpawnLoc = brickSpawnLoc.clone().add(0.5, 0, 0.5);
Entity brickEntity = gameWorld.spawnEntity(brickSpawnLoc, EntityType.ARMOR_STAND);
ArmorStand armorStand = (ArmorStand) brickEntity;
armorStand.setInvisible(true);
EntityEquipment armorEquipment = armorStand.getEquipment();
// TODO: make sure the children cannot uneqip the wool :sob:
if (team.equals(redTeam)) {
armorEquipment.setHelmet(new ItemStack(Material.RED_WOOL));
} else if (team.equals(blueTeam)) {

View File

@ -7,7 +7,7 @@ public class CtbData {
public enum PlayerState {
Free(""),
Stealing("<yellow>⚠<bold> ʙᴇ ᴄᴀʀᴇꜰᴜʟ! ʏ ʜᴀᴠᴇ ᴀ ʙʀɪᴄᴋ "),
Stealing("<yellow>⚠<bold> ʙᴇ ᴄᴀʀᴇꜰᴜʟ! ʏ ʜᴀᴠᴇ ᴀ ʙʀɪᴄᴋ </bold>"),
Invulnerable("<gray><bold>ɢᴏ ʙᴀᴄᴋ ᴛᴏ ɴᴇᴜᴛʀᴀʟ!"),
Tagging("<gray><bold>ʏ ᴀʀᴇ ᴛᴀɢɢɪɴɢ: %player%"),
Tagged("<red><bold>ʏ ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ᴛᴀɢɢᴇᴅ!"),

View File

@ -0,0 +1,57 @@
package xyz.twovb.sgm.games.impl.capturethebrick.events;
/*
* Created by 2vb - 7/7/2024
*/
import net.kyori.adventure.text.Component;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import xyz.twovb.sgm.games.impl.capturethebrick.CTB;
import xyz.twovb.toolbox.utils.ChatUtils;
public class PlayerCaptureBrickEvent extends Event implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final Player thief;
private boolean isCancelled;
private String message;
public PlayerCaptureBrickEvent(Player thief) {
this.thief = thief;
this.isCancelled = false;
this.message = CTB.getMessages().getString("system.player.brick.steal.announce");
}
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
public Player getThief() {
return this.thief;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
@Override
public boolean isCancelled() {
return this.isCancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.isCancelled = cancelled;
}
}

View File

@ -51,7 +51,7 @@ public class TeamGui {
public void pickTeam(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
ItemStack clickedItem = event.getCurrentItem();
CTB game = (CTB) SGM.getInstance().getGameManager().findGame(player);
CTB game = (CTB) SGM.getInstance().getGameManager().findGame(target);
if (clickedItem.getType().equals(Material.RED_WOOL)) {
game.addPlayerToTeam(target, CtbData.Teams.Red);
game.sendMessageToAllPlayers(target.getName() + " RED");

View File

@ -52,6 +52,13 @@ public class LevelManager {
case MAP -> new WorldCreator(mapPath + worldName, new NamespacedKey(SGM.getInstance(), key));
};
World world = wc.createWorld();
world.setGameRule(GameRule.KEEP_INVENTORY, true);
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false);
world.setGameRule(GameRule.DO_WEATHER_CYCLE, false);
world.setGameRule(GameRule.RANDOM_TICK_SPEED, 0);
world.setGameRule(GameRule.DO_MOB_SPAWNING, false);
world.setGameRule(GameRule.DO_MOB_SPAWNING, false);
world.setGameRule(GameRule.DO_MOB_LOOT, false);
if (world != null) {
SGM.getInstance().getCLogger().log("Loaded world: " + worldName);
} else {
@ -187,6 +194,10 @@ public class LevelManager {
world.setGameRule(GameRule.KEEP_INVENTORY, true);
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false);
world.setGameRule(GameRule.DO_WEATHER_CYCLE, false);
world.setGameRule(GameRule.RANDOM_TICK_SPEED, 0);
world.setGameRule(GameRule.DO_MOB_SPAWNING, false);
world.setGameRule(GameRule.DO_MOB_SPAWNING, false);
world.setGameRule(GameRule.DO_MOB_LOOT, false);
world.setTime(1000);
genDataFile(level, name, game.toLowerCase());
return LevelResult.SUCCESS;

View File

@ -11,14 +11,19 @@ system:
free:
notify: "&7%player% has been freed from Jail by %rescuer%"
info: "&7You and %player% must now walk back to Neutral before you can do anything."
jailbreak:
notify: "&7It's time for Jailbreak™! You have been released and you must head back to Neutral before you can do anything."
tag:
notime:
notify: "&7You have run out of time to bring %player% to Jail! You must head back to Neutral before you can do anything."
info: "&7%player% has run out of time to take you to Jail! You have been released and you must head back to Neutral before you can do anything."
notify: "&7You have been tagged! %player% now has 25 seconds to take you to Jail or you will be freed!"
info: "&7You have tagged %player%! You have 25 seconds to take them to Jail! Crouch if you would like to set them free."
released:
notify: "&7You have released %player%! You must head back to Neutral before you can do anything."
notify: "&7You have released %player%"
info: "&7%player% let you free! You must head back to Neutral before you can do anything."
full: "&7You have returned to Neutral. You can now get back to the game!"
brick:
steal:
notify: "&7You have stolen a brick. Make it to Neutral without being caught to Capture The Brick™!"
announce: "&7%player% has captured a brick! %score%"
announce: "&7%player% has captured a brick!"

View File

@ -1,7 +1,8 @@
mapInfo:
brickCount: 2
territory: 1
boundary: 3
tagTime: 25
jailTime: 25
spawn: 0,0,0
teams:
red:
@ -10,13 +11,9 @@ teams:
- 0,0,0
playerSpawn: 0,0,0
jail: 0,0,0
tagTime: 25
jailTime: 25
blue:
brickSpawns:
- 0,0,0
- 0,0,0
playerSpawn: 0,0,0
jail: 0,0,0
tagTime: 25
jailTime: 25