This commit is contained in:
2vb 2024-07-07 18:49:39 -07:00
parent 8b4ebaacd4
commit c470cfda3b
6 changed files with 179 additions and 54 deletions

View File

@ -10,8 +10,6 @@ import lombok.Getter;
import net.megavex.scoreboardlibrary.api.ScoreboardLibrary;
import net.megavex.scoreboardlibrary.api.exception.NoPacketAdapterAvailableException;
import net.megavex.scoreboardlibrary.api.noop.NoopScoreboardLibrary;
import net.megavex.scoreboardlibrary.api.team.TeamManager;
import org.apache.commons.io.FileUtils;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
@ -30,7 +28,6 @@ import xyz.twovb.toolbox.managers.ConfigManager;
import xyz.twovb.toolbox.managers.PlaceholderManager;
import xyz.twovb.toolbox.utils.CustomLogger;
import java.io.File;
import java.io.IOException;
import java.util.Objects;

View File

@ -25,25 +25,24 @@ import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.*;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
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.EntityDismountEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.event.player.*;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Transformation;
import org.jetbrains.annotations.NotNull;
import xyz.twovb.sgm.SGM;
import xyz.twovb.sgm.games.GameManager;
import xyz.twovb.sgm.games.Minigame;
import xyz.twovb.sgm.games.impl.capturethebrick.events.PlayerFreedFromJailEvent;
import xyz.twovb.sgm.games.impl.capturethebrick.events.PlayerJailedEvent;
import xyz.twovb.sgm.games.impl.capturethebrick.events.PlayerTaggedEvent;
import xyz.twovb.sgm.games.impl.capturethebrick.events.*;
import xyz.twovb.sgm.levels.LevelManager;
import xyz.twovb.toolbox.api.CustomPlayer;
import xyz.twovb.toolbox.utils.ChatUtils;
@ -194,7 +193,7 @@ public class CTB implements Minigame {
break;
}
}
// SGM.getInstance().getCLogger().log(playerStateMap);
SGM.getInstance().getCLogger().log(playerStateMap);
}
@Override
@ -479,50 +478,113 @@ public class CTB implements Minigame {
}
@EventHandler
void onPlayerFree(EntityDamageByEntityEvent event) {
// Check if a player is allowed to free someone, and if the tagged player is allowed to be free
// If both are true, call the custom event
void handleEntityDamage(EntityDamageByEntityEvent event) {
if (this.state != GameState.STARTED) return;
Entity eventEntity = event.getEntity();
Entity eventDamager = event.getDamager();
if (!(eventEntity instanceof Player tagged) || !(eventDamager instanceof Player tagger)) return;
if (!players.contains(tagged) || !players.contains(tagger)) return;
if (getTerritory(tagged) != getTerritory(tagger)) return;
ScoreboardTeam taggedTeam = getTeam(tagged);
ScoreboardTeam taggerTeam = getTeam(tagger);
if (taggedTeam != taggerTeam) return;
if (playerStateMap.get(tagged) != CtbData.PlayerState.Jailed) return;
if (playerStateMap.get(tagger) != CtbData.PlayerState.Free) return;
playerStateMap.replace(tagged, CtbData.PlayerState.Jailed, CtbData.PlayerState.Invulnerable);
playerStateMap.replace(tagger, CtbData.PlayerState.Free, CtbData.PlayerState.Invulnerable);
PlayerFreedFromJailEvent freedFromJailEvent = new PlayerFreedFromJailEvent(tagged, tagger);
freedFromJailEvent.callEvent();
if (!(eventEntity instanceof Player interacted) || !(eventDamager instanceof Player interacter)) return;
if (!players.contains(interacted) || !players.contains(interacter)) return;
if (getTerritory(interacted) != getTerritory(interacter)) return;
PlayerGameInteractionEvent interactionEvent = new PlayerGameInteractionEvent(interacted, interacter);
Bukkit.getServer().getPluginManager().callEvent(interactionEvent);
if (interactionEvent.isCancelled()) {
event.setCancelled(true);
}
}
@EventHandler
void onPlayerFree(EntityDamageByEntityEvent event) {
handleEntityDamage(event);
Player interacted = (Player) event.getEntity();
Player interacter = (Player) event.getDamager();
if (this.state != GameState.STARTED) return;
if (!players.contains(interacted) || !players.contains(interacter)) return;
if (getTerritory(interacted) != getTerritory(interacter)) return;
ScoreboardTeam interactedTeam = getTeam(interacted);
ScoreboardTeam interacterTeam = getTeam(interacter);
if (interactedTeam != interacterTeam) return;
if (playerStateMap.get(interacted) != CtbData.PlayerState.Jailed) return;
if (playerStateMap.get(interacter) != CtbData.PlayerState.Free) return;
playerStateMap.replace(interacted, CtbData.PlayerState.Jailed, CtbData.PlayerState.Invulnerable);
playerStateMap.replace(interacter, CtbData.PlayerState.Free, CtbData.PlayerState.Invulnerable);
PlayerFreedFromJailEvent freedFromJailEvent = new PlayerFreedFromJailEvent(interacted, interacter);
Bukkit.getServer().getPluginManager().callEvent(freedFromJailEvent);
event.setCancelled(true);
}
@EventHandler
void onPlayerHit(EntityDamageByEntityEvent event) {
handleEntityDamage(event);
Player interacted = (Player) event.getEntity();
Player interacter = (Player) event.getDamager();
if (this.state != GameState.STARTED) return;
if (!players.contains(interacted) || !players.contains(interacter)) return;
if (getTerritory(interacted) != getTerritory(interacter)) return;
ScoreboardTeam interactedTeam = getTeam(interacted);
ScoreboardTeam interacterTeam = getTeam(interacter);
if (interactedTeam != interacterTeam) return;
if (playerStateMap.get(interacted) != CtbData.PlayerState.Jailed) return;
if (playerStateMap.get(interacter) != CtbData.PlayerState.Free) return;
playerStateMap.replace(interacted, CtbData.PlayerState.Jailed, CtbData.PlayerState.Invulnerable);
playerStateMap.replace(interacter, CtbData.PlayerState.Free, CtbData.PlayerState.Invulnerable);
PlayerFreedFromJailEvent freedFromJailEvent = new PlayerFreedFromJailEvent(interacted, interacter);
Bukkit.getServer().getPluginManager().callEvent(freedFromJailEvent);
event.setCancelled(true);
}
@EventHandler
void onEntityDamage(EntityDamageByEntityEvent event) {
handleEntityDamage(event);
Player interacted = (Player) event.getEntity();
Player interacter = (Player) event.getDamager();
if (this.state != GameState.STARTED) return;
if (!players.contains(interacted) || !players.contains(interacter)) return;
if (getTerritory(interacted) != getTerritory(interacter)) return;
ScoreboardTeam interactedTeam = getTeam(interacted);
ScoreboardTeam interacterTeam = getTeam(interacter);
if (interactedTeam == interacterTeam) return;
event.setCancelled(true);
CtbData.Territory territory = getTerritory(interacted);
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;
playerStateMap.replace(interacted, CtbData.PlayerState.Tagged);
playerStateMap.replace(interacter, CtbData.PlayerState.Free, CtbData.PlayerState.Tagging);
PlayerTaggedEvent taggedEvent = new PlayerTaggedEvent(interacted, interacter);
Bukkit.getServer().getPluginManager().callEvent(taggedEvent);
}
@EventHandler
void onBrickSteal(PlayerInteractAtEntityEvent event) {
// 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 (this.state != GameState.STARTED) return;
Entity eventEntity = event.getEntity();
Entity eventDamager = event.getDamager();
if (!(eventEntity instanceof Player tagged) || !(eventDamager instanceof Player tagger)) return;
if (!players.contains(tagged) || !players.contains(tagger)) return;
if (getTerritory(tagged) != getTerritory(tagger)) return;
ScoreboardTeam taggedTeam = getTeam(tagged);
ScoreboardTeam taggerTeam = getTeam(tagger);
if (taggedTeam == taggerTeam) return;
Entity rightClicked = event.getRightClicked();
Player brickTaker = event.getPlayer();
// if (!(rightClicked instanceof ArmorStand brickEntity)) return;
if (!players.contains(brickTaker)) return;
SGM.getInstance().getCLogger().log(rightClicked);
SGM.getInstance().getCLogger().log(brickTaker);
ScoreboardTeam taggerTeam = getTeam(brickTaker);
event.setCancelled(true);
CtbData.Territory territory = getTerritory(tagged);
if (territory == CtbData.Territory.Blue && taggerTeam != blueTeam) return;
if (territory == CtbData.Territory.Red && taggerTeam != redTeam) return;
if (playerStateMap.get(tagged) != CtbData.PlayerState.Free) return;
if (playerStateMap.get(tagger) != CtbData.PlayerState.Free) return;
playerStateMap.replace(tagged, CtbData.PlayerState.Free, CtbData.PlayerState.Tagged);
playerStateMap.replace(tagger, CtbData.PlayerState.Free, CtbData.PlayerState.Tagging);
PlayerTaggedEvent taggedEvent = new PlayerTaggedEvent(tagged, tagger);
taggedEvent.callEvent();
CtbData.Territory territory = getTerritory(brickTaker);
if (territory == CtbData.Territory.Blue && taggerTeam == blueTeam) return;
if (territory == CtbData.Territory.Red && taggerTeam == redTeam) return;
if (playerStateMap.get(brickTaker) != CtbData.PlayerState.Free) return;
playerStateMap.replace(brickTaker, CtbData.PlayerState.Free, CtbData.PlayerState.Stealing);
PlayerStealBrickEvent playerStealBrickEvent = new PlayerStealBrickEvent(brickTaker);
playerStealBrickEvent.callEvent();
}
public void addPlayerToJail(Player player) {
@ -596,16 +658,26 @@ public class CTB implements Minigame {
private void placeBrick(Location location, ScoreboardTeam team) {
Location brickSpawnLoc = location;
brickSpawnLoc = brickSpawnLoc.clone().add(0.5, 0, 0.5);
Entity brickEntity = gameWorld.spawnEntity(brickSpawnLoc, EntityType.BLOCK_DISPLAY);
BlockDisplay brickDisplay = (BlockDisplay) brickEntity;
Entity brickEntity = gameWorld.spawnEntity(brickSpawnLoc, EntityType.ARMOR_STAND);
ArmorStand armorStand = (ArmorStand) brickEntity;
EntityEquipment armorEquipment = armorStand.getEquipment();
// armorStand.setInvisible(true);
if (team.equals(redTeam)) {
brickDisplay.setBlock(Material.RED_WOOL.createBlockData());
armorEquipment.setHelmet(new ItemStack(Material.RED_WOOL));
} else if (team.equals(blueTeam)) {
brickDisplay.setBlock(Material.BLUE_WOOL.createBlockData());
armorEquipment.setHelmet(new ItemStack(Material.BLUE_WOOL));
}
Transformation transformation = brickDisplay.getTransformation();
transformation.getScale().set(0.5f);
brickDisplay.setTransformation(transformation);
// Entity brickEntity = gameWorld.spawnEntity(brickSpawnLoc, EntityType.BLOCK_DISPLAY);
// BlockDisplay brickDisplay = (BlockDisplay) brickEntity;
// if (team.equals(redTeam)) {
// brickDisplay.setBlock(Material.RED_WOOL.createBlockData());
// } else if (team.equals(blueTeam)) {
// brickDisplay.setBlock(Material.BLUE_WOOL.createBlockData());
// }
// Transformation transformation = brickDisplay.getTransformation();
// transformation.getScale().set(0.5f);
// brickDisplay.setTransformation(transformation);
}
private void setupTeamDisplay(ScoreboardTeam team, String displayName, NamedTextColor color) {

View File

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

View File

@ -0,0 +1,52 @@
package xyz.twovb.sgm.games.impl.capturethebrick.events;
/*
* Created by 2vb - 7/7/2024
*/
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class PlayerGameInteractionEvent extends Event implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final Player interacted;
private final Player interacter;
private boolean isCancelled;
public PlayerGameInteractionEvent(Player interacted, Player interacter) {
this.interacted = interacted;
this.interacter = interacter;
this.isCancelled = false;
}
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
public Player getInteracted() {
return this.interacted;
}
public Player getInteracter() {
return this.interacter;
}
@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

@ -22,7 +22,7 @@ public class PlayerStealBrickEvent extends Event implements Cancellable {
public PlayerStealBrickEvent(Player jailed) {
this.jailed = jailed;
this.isCancelled = false;
this.message = ChatUtils.translate(CTB.getMessages().getString("system.player.jail.notify").replace("%player%", jailed.getName()));
this.message = ChatUtils.translate(CTB.getMessages().getString("system.player.brick.steal.notify"));
}
public static HandlerList getHandlerList() {

View File

@ -17,4 +17,7 @@ system:
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!"
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™!"