Is that the entire tag system done?
Some checks are pending
Build plugin / build (push) Waiting to run

This commit is contained in:
2vb 2024-07-07 06:18:53 -07:00
parent a41702ea64
commit 2cf21c8ce7
2 changed files with 105 additions and 46 deletions

View File

@ -28,15 +28,19 @@ import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDismountEvent;
import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import xyz.twovb.sgm.SGM; import xyz.twovb.sgm.SGM;
@ -154,6 +158,9 @@ public class CTB implements Minigame {
@Override @Override
public void onTick() { public void onTick() {
if (players.isEmpty()) {
this.stop();
}
try { try {
headerAnimation.nextFrame(); headerAnimation.nextFrame();
layout.apply(sb); layout.apply(sb);
@ -171,14 +178,7 @@ public class CTB implements Minigame {
for (Player player : players) { for (Player player : players) {
CtbData.Territory territory = getTerritory(player); CtbData.Territory territory = getTerritory(player);
CtbData.PlayerState state = playerStateMap.get(player); CtbData.PlayerState state = playerStateMap.get(player);
Player tagger = null; Player tagged = taggedPlayerHashMap.get(player);
Player tagged = null;
if (((state == CtbData.PlayerState.Tagged) || (state == CtbData.PlayerState.Tagging)) && taggedPlayerHashMap.containsKey(player)) {
for (Map.Entry<Player, Player> entry : taggedPlayerHashMap.entrySet()) {
tagger = entry.getKey();
tagged = entry.getValue();
}
}
switch (state) { switch (state) {
case Tagging: case Tagging:
if (tagged != null) { if (tagged != null) {
@ -191,26 +191,22 @@ public class CTB implements Minigame {
player.sendActionBar(ChatUtils.translate(state.getFancyText().replace("%territory%", territory.getFancyText()))); player.sendActionBar(ChatUtils.translate(state.getFancyText().replace("%territory%", territory.getFancyText())));
break; break;
case Tagged: case Tagged:
if (tagger != null) { player.sendActionBar(ChatUtils.translate(state.getFancyText()));
player.sendActionBar(ChatUtils.translate(state.getFancyText().replace("!", " ʙʏ " + tagger.getName())));
} else {
player.sendActionBar(ChatUtils.translate(state.getFancyText()));
}
break; break;
case Invulnerable:
player.sendActionBar(ChatUtils.translate(state.getFancyText()));
default: default:
player.sendActionBar(ChatUtils.translate(territory.getFancyText())); player.sendActionBar(ChatUtils.translate(territory.getFancyText()));
break; break;
} }
} }
SGM.getInstance().getCLogger().log(playerStateMap);
} }
@Override @Override
public void start(CommandSender sender) { public void start(CommandSender sender) {
if (checkStart(sender)) { if (checkStart(sender)) {
for (Player player : players) { for (Player player : players) {
// TODO: REMEMBER TO REMOVE THIS BEFORE USING IT AT CAMP
player.setAllowFlight(true);
player.setFlying(true);
player.teleport(this.spawnLoc); player.teleport(this.spawnLoc);
sb.addPlayer(player); sb.addPlayer(player);
playerStateMap.put(player, CtbData.PlayerState.Free); playerStateMap.put(player, CtbData.PlayerState.Free);
@ -265,12 +261,9 @@ public class CTB implements Minigame {
// TODO: make it wait before unloading world // TODO: make it wait before unloading world
// Stop game logic // Stop game logic
state = GameState.ENDING; state = GameState.ENDING;
Player winner; if (!players.isEmpty()) {
if (players.size() <= 1) { players.clear();
winner = players.get(0);
winner.sendMessage("Congratulations on winning the game!");
} }
players.clear(); // Clear player list
GameManager.getActiveGames().remove(uuid); GameManager.getActiveGames().remove(uuid);
HandlerList.unregisterAll(this); HandlerList.unregisterAll(this);
for (Player player : gameWorld.getPlayers()) { for (Player player : gameWorld.getPlayers()) {
@ -286,7 +279,6 @@ public class CTB implements Minigame {
Bukkit.getScheduler().cancelTask(this.taskId); Bukkit.getScheduler().cancelTask(this.taskId);
} }
@Override @Override
public void addPlayer(Player player) { public void addPlayer(Player player) {
player.teleport(this.spawnLoc); player.teleport(this.spawnLoc);
@ -329,33 +321,83 @@ public class CTB implements Minigame {
} }
@EventHandler @EventHandler
void onPlayerWalkWhileTag(PlayerMoveEvent event) { void onPlayerSneak(PlayerToggleSneakEvent event) {
Player tagger = event.getPlayer();
if (!players.contains(tagger)) return;
if (this.state != GameState.STARTED) return;
if (playerStateMap.get(tagger) != CtbData.PlayerState.Tagging) return;
Player tagged = taggedPlayerHashMap.get(tagger);
if (tagged != null) {
releasePlayer(tagged, tagger);
for (Entity entity : tagger.getPassengers()) {
if (entity instanceof ArmorStand) {
entity.remove();
}
}
}
}
private void releasePlayer(Player tagged, Player tagger) {
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);
cTagged.sendMessage(messages.getString("system.player.released.info").replace("%player%", tagger.getName()));
cTagger.sendMessage(messages.getString("system.player.released.notify").replace("%player%", tagged.getName()));
taggedPlayerHashMap.remove(tagger);
}
@EventHandler
void onPlayerWalkWhileInvuln(PlayerMoveEvent event) {
if (!(event.getFrom().getX() != event.getTo().getX() || event.getFrom().getZ() != event.getTo().getZ())) return; if (!(event.getFrom().getX() != event.getTo().getX() || event.getFrom().getZ() != event.getTo().getZ())) return;
Player player = event.getPlayer(); Player player = event.getPlayer();
if (!players.contains(player)) return; if (!players.contains(player)) return;
if (this.state != GameState.STARTED) return; if (this.state != GameState.STARTED) return;
if (playerStateMap.get(player) != CtbData.PlayerState.Tagging) return; if (playerStateMap.get(player) != CtbData.PlayerState.Invulnerable) return;
Player tagged = taggedPlayerHashMap.get(player); CtbData.Territory territory = getTerritory(player);
CustomPlayer cPlayer = new CustomPlayer(player);
if (territory.equals(CtbData.Territory.Neutral)) {
cPlayer.sendMessage(messages.getString("system.player.released.full"));
playerStateMap.replace(player, CtbData.PlayerState.Invulnerable, CtbData.PlayerState.Free);
}
}
@EventHandler
void onPlayerWalkWhileTag(PlayerMoveEvent event) {
if (!(event.getFrom().getX() != event.getTo().getX() || event.getFrom().getZ() != event.getTo().getZ())) return;
Player tagger = event.getPlayer();
if (!players.contains(tagger)) return;
if (this.state != GameState.STARTED) return;
if (playerStateMap.get(tagger) != CtbData.PlayerState.Tagging) return;
ScoreboardTeam team = getTeam(tagger);
Location jail = gameWorld.getSpawnLocation();
if (team.equals(redTeam)) {
jail = redJail;
} else if (team.equals(blueTeam)) {
jail = blueJail;
}
CtbData.Territory territory = getTerritory(tagger);
Player tagged = taggedPlayerHashMap.get(tagger);
if (tagged != null) { if (tagged != null) {
CtbData.Territory territory = getTerritory(player); if (territory == CtbData.Territory.Neutral) {
ScoreboardTeam team = getTeam(player); releasePlayer(tagged, tagger);
Location jail = gameWorld.getSpawnLocation(); for (Entity entity : tagger.getPassengers()) {
if (team.equals(redTeam)) { if (entity instanceof ArmorStand) {
jail = redJail; entity.remove();
} else if (team.equals(blueTeam)) { }
jail = blueJail; }
} }
if (territory.equals(CtbData.Territory.Neutral)) { double distanceToJail = jail.distanceSquared(tagger.getLocation());
Location lastValidPos = playerLocationHashMap.get(player);
player.teleport(Objects.requireNonNullElse(lastValidPos, player.getLocation()));
} else {
playerLocationHashMap.put(player, player.getLocation());
}
double distanceToJail = jail.distanceSquared(player.getLocation());
if (distanceToJail <= 12) { if (distanceToJail <= 12) {
addPlayerToJail(tagged); addPlayerToJail(tagged);
taggedPlayerHashMap.remove(player); taggedPlayerHashMap.remove(tagger);
SGM.getInstance().getCLogger().log(taggedPlayerHashMap); playerStateMap.replace(tagger, CtbData.PlayerState.Tagging, CtbData.PlayerState.Free);
for (Entity entity : tagger.getPassengers()) {
if (entity instanceof ArmorStand) {
entity.remove();
}
}
} }
} }
} }
@ -394,6 +436,22 @@ public class CTB implements Minigame {
CustomPlayer cTagger = new CustomPlayer(tagger); CustomPlayer cTagger = new CustomPlayer(tagger);
cTagged.sendMessage(messages.getString("system.player.tag.notify").replace("%player%", tagger.getName())); cTagged.sendMessage(messages.getString("system.player.tag.notify").replace("%player%", tagger.getName()));
cTagger.sendMessage(messages.getString("system.player.tag.info").replace("%player%", tagged.getName())); cTagger.sendMessage(messages.getString("system.player.tag.info").replace("%player%", tagged.getName()));
Entity seatEntity = gameWorld.spawnEntity(tagger.getLocation(), EntityType.ARMOR_STAND);
ArmorStand armorStandEntity = (ArmorStand) seatEntity;
armorStandEntity.setInvisible(true);
armorStandEntity.setSmall(true);
tagger.addPassenger(armorStandEntity);
armorStandEntity.addPassenger(tagged);
}
@EventHandler
void onDismountAttempt(EntityDismountEvent event) {
if (!(event.getEntity() instanceof Player player)) return;
if (this.state != GameState.STARTED) return;
if (!players.contains(player)) return;
CtbData.PlayerState playerState = playerStateMap.get(player);
if (playerState != CtbData.PlayerState.Tagged) return;
event.setCancelled(true);
} }
@EventHandler @EventHandler
@ -417,6 +475,7 @@ public class CTB implements Minigame {
// Check if a player is allowed to tag, and if the tagged player is allowed to be tagged // Check if a player is allowed to tag, and if the tagged player is allowed to be tagged
// If both are true, call the custom tag event and add players to tagged hashmap // If both are true, call the custom tag event and add players to tagged hashmap
if (this.state != GameState.STARTED) return; if (this.state != GameState.STARTED) return;
event.setCancelled(true);
Entity eventEntity = event.getEntity(); Entity eventEntity = event.getEntity();
Entity eventDamager = event.getDamager(); Entity eventDamager = event.getDamager();
if (!(eventEntity instanceof Player tagged) || !(eventDamager instanceof Player tagger)) return; if (!(eventEntity instanceof Player tagged) || !(eventDamager instanceof Player tagger)) return;
@ -434,14 +493,11 @@ public class CTB implements Minigame {
playerStateMap.replace(tagger, CtbData.PlayerState.Free, CtbData.PlayerState.Tagging); playerStateMap.replace(tagger, CtbData.PlayerState.Free, CtbData.PlayerState.Tagging);
PlayerTaggedEvent taggedEvent = new PlayerTaggedEvent(tagged, tagger); PlayerTaggedEvent taggedEvent = new PlayerTaggedEvent(tagged, tagger);
taggedEvent.callEvent(); taggedEvent.callEvent();
event.setCancelled(true);
} }
public void addPlayerToJail(Player player) { public void addPlayerToJail(Player player) {
CtbData.PlayerState playerState = playerStateMap.get(player); CtbData.PlayerState playerState = playerStateMap.get(player);
// if (playerState != CtbData.PlayerState.Free || playerState != CtbData.PlayerState.Tagged) { playerStateMap.replace(player, playerState, CtbData.PlayerState.Jailed);
// playerStateMap.replace(player, playerState, CtbData.PlayerState.Jailed);
playerStateMap.replace(player, CtbData.PlayerState.Jailed);
PlayerJailedEvent jailedEvent = new PlayerJailedEvent(player); PlayerJailedEvent jailedEvent = new PlayerJailedEvent(player);
jailedEvent.callEvent(); jailedEvent.callEvent();
ScoreboardTeam team = getTeam(player); ScoreboardTeam team = getTeam(player);
@ -450,7 +506,6 @@ public class CTB implements Minigame {
} else if (team == blueTeam) { } else if (team == blueTeam) {
player.teleport(redJail); player.teleport(redJail);
} }
// }
} }
public void freePlayerFromJail(Player player) { public void freePlayerFromJail(Player player) {

View File

@ -11,3 +11,7 @@ system:
tag: tag:
notify: "&7You have been tagged! %player% now has 25 seconds to take you to Jail or you will be freed!" 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." 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%!"
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!"