From 783474c9589150f566ed6541481e16e3f8d04d6c Mon Sep 17 00:00:00 2001 From: Lixfel Date: Mon, 28 Aug 2023 23:31:00 +0200 Subject: [PATCH 1/4] WIP villager AI Signed-off-by: Lixfel --- .../de/steamwar/fightsystem/FightSystem.java | 2 +- .../de/steamwar/fightsystem/ai/AIPlayer.java | 45 ++++++++ .../de/steamwar/fightsystem/commands/GUI.java | 3 +- .../countdown/EnternCountdown.java | 8 +- .../de/steamwar/fightsystem/fight/Fight.java | 7 +- .../fightsystem/fight/FightPlayer.java | 23 ++-- .../steamwar/fightsystem/fight/FightTeam.java | 102 ++++++++++-------- .../fightsystem/fight/JoinRequest.java | 5 +- .../fightsystem/listener/InFightDamage.java | 17 ++- .../fightsystem/listener/IngameDeath.java | 13 ++- .../fightsystem/listener/NormalJoin.java | 14 ++- .../fightsystem/listener/Recording.java | 18 ++-- .../steamwar/fightsystem/record/Recorder.java | 3 +- .../fightsystem/utils/TechHiderWrapper.java | 7 +- .../winconditions/Wincondition.java | 10 +- .../winconditions/WinconditionAllDead.java | 10 +- .../WinconditionCaptainDead.java | 13 +-- 17 files changed, 196 insertions(+), 104 deletions(-) create mode 100644 FightSystem_Core/src/de/steamwar/fightsystem/ai/AIPlayer.java diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index ff07546..ccca371 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -105,7 +105,7 @@ public class FightSystem extends JavaPlugin { techHider = new TechHiderWrapper(); new FightWorld(); new FightUI(); - new FightStatistics(); + //new FightStatistics(); new BungeeFightInfo(); new WinconditionAllDead(); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/ai/AIPlayer.java b/FightSystem_Core/src/de/steamwar/fightsystem/ai/AIPlayer.java new file mode 100644 index 0000000..1730174 --- /dev/null +++ b/FightSystem_Core/src/de/steamwar/fightsystem/ai/AIPlayer.java @@ -0,0 +1,45 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2023 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.fightsystem.ai; + +import com.comphenix.tinyprotocol.Reflection; +import de.steamwar.fightsystem.Config; +import de.steamwar.sql.SteamwarUser; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Villager; + +import java.util.UUID; + +public class AIPlayer { + private static final Reflection.MethodInvoker getHandle = Reflection.getMethod("{obc}.entity.CraftEntity", "getHandle"); + private static final Reflection.FieldAccessor entityUUID = Reflection.getField("{nms.world.entity}.Entity", UUID.class, 0); + + private final LivingEntity player; + + public AIPlayer(SteamwarUser user) { + player = Config.world.spawn(Config.SpecSpawn, Villager.class, entity -> entityUUID.set(getHandle.invoke(entity), user.getUUID())); + player.setCustomName(user.getUserName()); + player.setAI(false); + } + + public LivingEntity getEntity() { + return player; + } +} diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java index cb63550..3dd7779 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/commands/GUI.java @@ -33,6 +33,7 @@ import de.steamwar.sql.SteamwarUser; import net.md_5.bungee.api.ChatMessageType; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -101,7 +102,7 @@ public class GUI { FightTeam team = Fight.getPlayerTeam(p); if(team == null) return; - players.removeIf(swItemUUIDPair -> !team.equals(Fight.getPlayerTeam(Bukkit.getPlayer(swItemUUIDPair.getObject())))); + players.removeIf(swItemUUIDPair -> !team.equals(Fight.getPlayerTeam((LivingEntity) Bukkit.getEntity(swItemUUIDPair.getObject())))); SWListInv inv = new SWListInv<>(p, msg.parse("REMOVE_TITLE", p), players, (ClickType click, UUID player) -> { Commands.kick(p, SteamwarUser.get(player).getUserName()); p.closeInventory(); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java b/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java index c5c19b5..a98e9b6 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java @@ -58,7 +58,7 @@ public class EnternCountdown extends Countdown { @Override public void countdownFinished() { FightSystem.getMessage().sendPrefixless("ENTERN_ALLOWED", fightPlayer.getPlayer(), ChatMessageType.ACTION_BAR); - FightSystem.getTechHider().reloadChunks(fightPlayer.getPlayer(), chunkPos, false); + fightPlayer.withPlayer(player -> FightSystem.getTechHider().reloadChunks(player, chunkPos, false)); } @Override @@ -68,7 +68,9 @@ public class EnternCountdown extends Countdown { @Override protected void broadcast(String message, int divisor) { - fightPlayer.getPlayer().playSound(fightPlayer.getPlayer().getLocation(), sound, 100.0f, 1.0f); - sendCountdownMessage(fightPlayer.getPlayer(), message, time / divisor, appendix); + fightPlayer.withPlayer(player -> { + player.playSound(player.getLocation(), sound, 100.0f, 1.0f); + sendCountdownMessage(player, message, time / divisor, appendix); + }); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java index 6f465e8..380f39e 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java @@ -29,6 +29,7 @@ import de.steamwar.fightsystem.record.GlobalRecorder; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Sound; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import java.util.Collection; @@ -45,7 +46,7 @@ public class Fight { teams.add(blueTeam); } - public static FightTeam getPlayerTeam(Player player) { + public static FightTeam getPlayerTeam(LivingEntity player) { if(redTeam.isPlayerInTeam(player)) return redTeam; if(blueTeam.isPlayerInTeam(player)) @@ -62,7 +63,7 @@ public class Fight { throw new IllegalArgumentException(); } - public static FightPlayer getFightPlayer(Player player) { + public static FightPlayer getFightPlayer(LivingEntity player) { if(redTeam.isPlayerInTeam(player)) return redTeam.getFightPlayer(player); if(blueTeam.isPlayerInTeam(player)) @@ -70,7 +71,7 @@ public class Fight { return null; } - public static boolean fighting(Player player) { + public static boolean fighting(LivingEntity player) { return getPlayerTeam(player) != null; } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java index ed2e6d5..4f34137 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java @@ -24,28 +24,30 @@ import de.steamwar.fightsystem.countdown.EnternCountdown; import de.steamwar.sql.PersonalKit; import de.steamwar.sql.SteamwarUser; import org.bukkit.Bukkit; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import java.util.UUID; +import java.util.function.Consumer; public class FightPlayer { private final UUID uuid; - private Player player; + private LivingEntity entity; private final FightTeam team; private boolean isOut; private Kit kit; private int kills; private EnternCountdown enternCountdown = null; - FightPlayer(Player player, FightTeam team) { + FightPlayer(LivingEntity player, FightTeam team) { this.uuid = player.getUniqueId(); - this.player = player; + this.entity = player; this.team = team; this.isOut = false; kit = Kit.getKitByName(Config.MemberDefault); if(Config.PersonalKits){ - PersonalKit personalKit = PersonalKit.getKitInUse(SteamwarUser.get(player.getUniqueId()).getId(), Config.SchematicType.toDB()); + PersonalKit personalKit = PersonalKit.getKitInUse(SteamwarUser.get(uuid).getId(), Config.SchematicType.toDB()); if(personalKit != null){ kit = new Kit(personalKit); } @@ -74,11 +76,16 @@ public class FightPlayer { enternCountdown = null; } - public Player getPlayer() { + public LivingEntity getPlayer() { Player bukkit = Bukkit.getPlayer(uuid); if(bukkit != null) - player = bukkit; - return player; + entity = bukkit; + return entity; + } + + public void withPlayer(Consumer function) { + if(entity instanceof Player) + function.accept((Player) entity); } public boolean isLiving() { @@ -87,7 +94,7 @@ public class FightPlayer { public boolean isLeader() { FightPlayer leader = team.getLeader(); - return leader != null && leader.getPlayer() == player; + return leader != null && leader.getPlayer() == entity; } public Kit getKit() { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java index dbd812c..f67a0a1 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -41,6 +41,7 @@ import de.steamwar.techhider.ProtocolUtils; import net.md_5.bungee.api.ChatMessageType; import org.bukkit.*; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.scoreboard.NameTagVisibility; import org.bukkit.scoreboard.Team; @@ -134,7 +135,7 @@ public class FightTeam { new OneShotStateDependent(Config.replayserver(), FightState.PreLeaderSetup, () -> Bukkit.getScheduler().runTask(FightSystem.getPlugin(), this::reset)); new OneShotStateDependent(ArenaMode.All, FightState.PostSchemSetup, () -> { if(leader != null) - notReadyKit.loadToPlayer(leader.getPlayer()); + leader.withPlayer(notReadyKit::loadToPlayer); }); } @@ -165,10 +166,10 @@ public class FightTeam { } public void teleportToSpawn(){ - players.forEach((player, fp) -> Objects.requireNonNull(Bukkit.getPlayer(player)).teleport(spawn)); + players.forEach((player, fp) -> fp.getPlayer().teleport(spawn)); } - public FightPlayer getFightPlayer(Player player) { + public FightPlayer getFightPlayer(LivingEntity player) { return players.get(player.getUniqueId()); } @@ -180,15 +181,15 @@ public class FightTeam { return true; } - public boolean isPlayerInTeam(Player player) { + public boolean isPlayerInTeam(LivingEntity player) { return players.containsKey(player.getUniqueId()); } - public boolean canPlayerEntern(Player player) { + public boolean canPlayerEntern(LivingEntity player) { return getFightPlayer(player).canEntern(); } - public boolean isPlayerLeader(Player player) { + public boolean isPlayerLeader(LivingEntity player) { if(leader != null) return leader.getPlayer().equals(player); else @@ -202,12 +203,12 @@ public class FightTeam { Set playerSet = new HashSet<>(players.keySet()); for(UUID uuid : playerSet){ - Player player = Bukkit.getPlayer(uuid); + LivingEntity player = (LivingEntity) Bukkit.getEntity(uuid); if(player == null) removePlayer(players.get(uuid).getPlayer()); } FightPlayer leaderBackup = leader; - playerSet.removeIf(uuid -> Bukkit.getPlayer(uuid) == null); + playerSet.removeIf(uuid -> Bukkit.getEntity(uuid) == null); players.clear(); leader = null; @@ -216,7 +217,7 @@ public class FightTeam { addMember(leaderBackup.getPlayer(), true); } - playerSet.forEach(uuid -> addMember(Bukkit.getPlayer(uuid), true)); + playerSet.forEach(uuid -> addMember((LivingEntity) Bukkit.getEntity(uuid), true)); if(ArenaMode.VariableTeams.contains(Config.mode) && isLeaderless()){ List onlinePlayers = new ArrayList<>(Bukkit.getOnlinePlayers()); @@ -250,11 +251,11 @@ public class FightTeam { }); } - public void addMember(Player player) { + public void addMember(LivingEntity player) { addMember(player, false); } - private void addMember(Player player, boolean silent) { + private void addMember(LivingEntity player, boolean silent) { final List chunksToReload = FightSystem.getTechHider().prepareChunkReload(player, false); FightPlayer fightPlayer = getFightPlayer(player) != null ? getFightPlayer(player) : new FightPlayer(player, this); fightPlayer.revive(); @@ -263,22 +264,26 @@ public class FightTeam { team.addEntry(player.getName()); player.setHealth(20); - player.setFoodLevel(20); - player.getInventory().clear(); - BountifulWrapper.impl.setAttackSpeed(player); player.teleport(spawn); - if(FightState.Spectate.contains(FightState.getFightState())) { - Fight.setPlayerGamemode(player, GameMode.SPECTATOR); - } else { - Fight.setPlayerGamemode(player, GameMode.SURVIVAL); - (FightState.ingame() ? fightPlayer.getKit() : memberKit).loadToPlayer(player); - } + fightPlayer.withPlayer(p -> { + BountifulWrapper.impl.setAttackSpeed(p); + p.setFoodLevel(20); + p.getInventory().clear(); + + if(FightState.Spectate.contains(FightState.getFightState())) { + Fight.setPlayerGamemode(p, GameMode.SPECTATOR); + } else { + Fight.setPlayerGamemode(p, GameMode.SURVIVAL); + (FightState.ingame() ? fightPlayer.getKit() : memberKit).loadToPlayer(p); + } + }); + if(FightState.Running.contains(FightState.getFightState())) fightPlayer.startEnternCountdown(); GlobalRecorder.getInstance().playerJoins(player); - FightSystem.getTechHider().reloadChunks(player, chunksToReload, false); + fightPlayer.withPlayer(p -> FightSystem.getTechHider().reloadChunks(p, chunksToReload, false)); if(isLeaderless()) setLeader(fightPlayer, silent); @@ -286,10 +291,10 @@ public class FightTeam { FightUI.addSubtitle("UI_PLAYER_JOINS", prefix, player.getName()); } - public void removePlayer(Player player) { + public void removePlayer(LivingEntity player) { FightPlayer fightPlayer = getFightPlayer(player); - PersonalKitCreator.closeIfInKitCreator(player); + fightPlayer.withPlayer(PersonalKitCreator::closeIfInKitCreator); List chunksToReload = FightSystem.getTechHider().prepareChunkReload(player, true); players.remove(player.getUniqueId()); team.removeEntry(player.getName()); @@ -301,16 +306,19 @@ public class FightTeam { removeLeader(); GlobalRecorder.getInstance().entityDespawns(player); - Fight.setPlayerGamemode(player, GameMode.SPECTATOR); player.teleport(Config.SpecSpawn); - player.getInventory().clear(); - if(player.isOnline()){ - FightSystem.getTechHider().reloadChunks(player, chunksToReload, true); + fightPlayer.withPlayer(p -> { + Fight.setPlayerGamemode(p, GameMode.SPECTATOR); + p.getInventory().clear(); - if(ArenaMode.VariableTeams.contains(Config.mode)) - HotbarKit.SPECTATOR_KIT.loadToPlayer(player); - } + if(p.isOnline()){ + FightSystem.getTechHider().reloadChunks(p, chunksToReload, true); + + if(ArenaMode.VariableTeams.contains(Config.mode)) + HotbarKit.SPECTATOR_KIT.loadToPlayer(p); + } + }); } public boolean isLeaderless() { @@ -335,7 +343,7 @@ public class FightTeam { } private void setLeader(FightPlayer leader, boolean silent) { - PersonalKitCreator.closeIfInKitCreator(leader.getPlayer()); + leader.withPlayer(PersonalKitCreator::closeIfInKitCreator); this.leader = leader; designatedLeader = null; @@ -354,11 +362,12 @@ public class FightTeam { if(!Config.PersonalKits) leader.setKit(Kit.getKitByName(Config.LeaderDefault)); - Player player = leader.getPlayer(); - if(FightState.getFightState() != FightState.POST_SCHEM_SETUP) - chooseSchemKit.loadToPlayer(player); - else - notReadyKit.loadToPlayer(player); + leader.withPlayer(player -> { + if(FightState.getFightState() != FightState.POST_SCHEM_SETUP) + chooseSchemKit.loadToPlayer(player); + else + notReadyKit.loadToPlayer(player); + }); if(FightState.getFightState() == FightState.PRE_LEADER_SETUP && !Fight.getOpposite(this).isLeaderless()){ FightState.setFightState(FightState.PRE_SCHEM_SETUP); @@ -405,7 +414,7 @@ public class FightTeam { } public void setReady(boolean ready) { - Player l = leader.getPlayer(); + LivingEntity l = leader.getPlayer(); if(!schematic.hasSchematic()){ FightSystem.getMessage().sendPrefixless("SCHEMATIC_REQUIRED", l, ChatMessageType.ACTION_BAR); @@ -415,12 +424,12 @@ public class FightTeam { this.ready = ready; if(ready) { broadcast("TEAM_READY"); - readyKit.loadToPlayer(l); + leader.withPlayer(readyKit::loadToPlayer); if(Fight.getOpposite(this).isReady() || ArenaMode.SoloLeader.contains(Config.mode)) FightState.setFightState(FightState.PRE_RUNNING); } else { broadcast("TEAM_NOT_READY"); - notReadyKit.loadToPlayer(l); + leader.withPlayer(notReadyKit::loadToPlayer); } } @@ -493,17 +502,18 @@ public class FightTeam { @Override public void enable() { for(FightPlayer fightPlayer : players.values()) { - Player player = fightPlayer.getPlayer(); - PersonalKitCreator.closeIfInKitCreator(player); + fightPlayer.withPlayer(player -> { + PersonalKitCreator.closeIfInKitCreator(player); - player.closeInventory(); - fightPlayer.getKit().loadToPlayer(player); + player.closeInventory(); + fightPlayer.getKit().loadToPlayer(player); + }); } } @Override public void disable() { - players.values().forEach(fightPlayer -> fightPlayer.getPlayer().getInventory().clear()); + players.values().forEach(fightPlayer -> fightPlayer.withPlayer(p -> p.getInventory().clear())); } } @@ -516,14 +526,14 @@ public class FightTeam { @Override public void enable() { players.values().forEach(fightPlayer -> { - Fight.setPlayerGamemode(fightPlayer.getPlayer(), GameMode.SPECTATOR); + fightPlayer.withPlayer(player -> Fight.setPlayerGamemode(player, GameMode.SPECTATOR)); fightPlayer.getPlayer().teleport(FightTeam.this.spawn); }); } @Override public void disable() { - players.values().forEach(fightPlayer -> Fight.setPlayerGamemode(fightPlayer.getPlayer(), GameMode.SURVIVAL)); + players.values().forEach(fightPlayer -> fightPlayer.withPlayer(player -> Fight.setPlayerGamemode(player, GameMode.SURVIVAL))); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java index 13ab67a..4b44d40 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java @@ -68,11 +68,10 @@ public class JoinRequest { if(leader == null) continue; - Player leaderPlayer = leader.getPlayer(); - if(leaderPlayer == null) + if(leader.getPlayer() == null) continue; - FightSystem.getMessage().sendPrefixless("JOIN_REQUEST_NOTIFICATION", leaderPlayer, "REQUESTS", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/requests"), player.getName(), team.getColoredName()); + leader.withPlayer(leaderPlayer -> FightSystem.getMessage().sendPrefixless("JOIN_REQUEST_NOTIFICATION", leaderPlayer, "REQUESTS", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/requests"), player.getName(), team.getColoredName())); } activeRequests.put(player, this); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/InFightDamage.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/InFightDamage.java index 9be2167..7194fdd 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/InFightDamage.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/InFightDamage.java @@ -19,7 +19,6 @@ package de.steamwar.fightsystem.listener; -import de.steamwar.fightsystem.ArenaMode; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; @@ -28,7 +27,7 @@ import de.steamwar.fightsystem.states.StateDependentListener; import de.steamwar.fightsystem.winconditions.Winconditions; import net.md_5.bungee.api.ChatMessageType; import org.bukkit.entity.Arrow; -import org.bukkit.entity.Player; +import org.bukkit.entity.LivingEntity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; @@ -43,25 +42,25 @@ public class InFightDamage implements Listener { @EventHandler public void handleEntityDamageByEntity(EntityDamageByEntityEvent event) { - if(!(event.getEntity() instanceof Player)) + if(!(event.getEntity() instanceof LivingEntity)) //Target is not a player return; - Player player = ((Player) event.getEntity()); + LivingEntity player = ((LivingEntity) event.getEntity()); if(!Fight.fighting(player)) return; - Player damager; + LivingEntity damager; - if(event.getDamager() instanceof Player) { - damager = ((Player) event.getDamager()).getPlayer(); + if(event.getDamager() instanceof LivingEntity) { + damager = (LivingEntity) event.getDamager(); }else if(event.getDamager() instanceof Arrow) { Arrow damagerArrow = (Arrow) event.getDamager(); - if(!(damagerArrow.getShooter() instanceof Player)) + if(!(damagerArrow.getShooter() instanceof LivingEntity)) //Shooter is not a player return; - damager = (Player) damagerArrow.getShooter(); + damager = (LivingEntity) damagerArrow.getShooter(); }else{ //Damager is not a player return; diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java index 75d80cf..1058968 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java @@ -26,10 +26,12 @@ import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; import de.steamwar.fightsystem.utils.FightUI; import de.steamwar.fightsystem.utils.SWSound; -import org.bukkit.entity.Player; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -42,7 +44,7 @@ public class IngameDeath implements Listener { } @EventHandler - public void broadcastDeath(PlayerDeathEvent event) { + public void broadcastDeath(EntityDeathEvent event) { onPlayerEnd(event.getEntity(), fightPlayer -> { FightUI.addSubtitle("UI_PLAYER_DEATH", fightPlayer.getTeam().getPrefix(), fightPlayer.getPlayer().getName()); Fight.playSound(SWSound.ENTITY_WITHER_DEATH.getSound(), 100.0F, 1.0F); @@ -64,8 +66,11 @@ public class IngameDeath implements Listener { onPlayerEnd(event.getPlayer(), FightPlayer::setOut); } - private void onPlayerEnd(Player player, Consumer withLivingPlayer) { - FightPlayer fightPlayer = Fight.getFightPlayer(player); + private void onPlayerEnd(Entity player, Consumer withLivingPlayer) { + if(!(player instanceof LivingEntity)) + return; + + FightPlayer fightPlayer = Fight.getFightPlayer((LivingEntity) player); if(fightPlayer == null || !fightPlayer.isLiving()) return; diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/NormalJoin.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/NormalJoin.java index 371ae75..931f0b7 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/NormalJoin.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/NormalJoin.java @@ -20,10 +20,14 @@ package de.steamwar.fightsystem.listener; import de.steamwar.fightsystem.ArenaMode; +import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.ai.AIPlayer; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; +import de.steamwar.sql.SteamwarUser; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -43,7 +47,15 @@ public class NormalJoin implements Listener { FightTeam team = Fight.teams().stream().filter(t -> player.getUniqueId().equals(t.getDesignatedLeader())).findAny( // Player is designated leader of a team ).orElse(Fight.teams().stream().filter(t -> t.canbeLeader(player)).findAny().orElse(null)); // Else search empty team - if(team != null) + if(team != null) { team.addMember(player); + FightTeam aiTeam = Fight.getOpposite(team); + AIPlayer aiPlayer = new AIPlayer(SteamwarUser.get(0)); + aiTeam.addMember(aiPlayer.getEntity()); + Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> { + FightState.setFightState(FightState.POST_SCHEM_SETUP); + aiTeam.setReady(true); + }, 1); + } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java index ca3c654..1a6aaec 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java @@ -31,7 +31,10 @@ import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependent; import de.steamwar.fightsystem.states.StateDependentListener; import de.steamwar.fightsystem.states.StateDependentTask; -import de.steamwar.fightsystem.utils.*; +import de.steamwar.fightsystem.utils.BountifulWrapper; +import de.steamwar.fightsystem.utils.CraftbukkitWrapper; +import de.steamwar.fightsystem.utils.FlatteningWrapper; +import de.steamwar.fightsystem.utils.SWSound; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -281,12 +284,13 @@ public class Recording implements Listener { if(!fp.isLiving()) continue; - Player player = fp.getPlayer(); - BountifulWrapper.impl.recordHandItems(player); - GlobalRecorder.getInstance().item(player, disarmNull(player.getInventory().getHelmet()), "HEAD"); - GlobalRecorder.getInstance().item(player, disarmNull(player.getInventory().getChestplate()), "CHEST"); - GlobalRecorder.getInstance().item(player, disarmNull(player.getInventory().getLeggings()), "LEGS"); - GlobalRecorder.getInstance().item(player, disarmNull(player.getInventory().getBoots()), "FEET"); + fp.withPlayer(player -> { + BountifulWrapper.impl.recordHandItems(player); + GlobalRecorder.getInstance().item(player, disarmNull(player.getInventory().getHelmet()), "HEAD"); + GlobalRecorder.getInstance().item(player, disarmNull(player.getInventory().getChestplate()), "CHEST"); + GlobalRecorder.getInstance().item(player, disarmNull(player.getInventory().getLeggings()), "LEGS"); + GlobalRecorder.getInstance().item(player, disarmNull(player.getInventory().getBoots()), "FEET"); + }); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java index 2b5f3c7..969cd52 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java @@ -36,6 +36,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; @@ -148,7 +149,7 @@ public interface Recorder { * 0x08: Message following * */ - default void playerJoins(Player p){ + default void playerJoins(LivingEntity p){ SteamwarUser user = SteamwarUser.get(p.getUniqueId()); write(0x00, p.getEntityId(), user.getId()); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHiderWrapper.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHiderWrapper.java index 284c174..5b443da 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHiderWrapper.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHiderWrapper.java @@ -30,6 +30,7 @@ import de.steamwar.techhider.ProtocolUtils; import de.steamwar.techhider.TechHider; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -58,13 +59,13 @@ public class TechHiderWrapper extends StateDependent { techHider.disable(); } - public List prepareChunkReload(Player p, boolean hide) { - if(!ENABLED) + public List prepareChunkReload(LivingEntity p, boolean hide) { + if(!ENABLED || !(p instanceof Player)) return Collections.emptyList(); List chunksToReload = new ArrayList<>(); Config.ArenaRegion.forEachChunk((x, z) -> { - if(bypass(p, x, z) == hide) + if(bypass((Player) p, x, z) == hide) chunksToReload.add(new ProtocolUtils.ChunkPos(x, z)); }); return chunksToReload; diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Wincondition.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Wincondition.java index a01d660..8e6e283 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Wincondition.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Wincondition.java @@ -24,7 +24,8 @@ import de.steamwar.fightsystem.countdown.Countdown; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.StateDependentCountdown; -import org.bukkit.entity.Player; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import java.util.ArrayList; import java.util.List; @@ -53,8 +54,11 @@ public abstract class Wincondition { FightSystem.setSpectateState(team, windescription, subtitle, params); } - protected FightTeam isTarget(Player player){ - return Fight.getPlayerTeam(player); + protected FightTeam isTarget(Entity player){ + if(!(player instanceof LivingEntity)) + return null; + + return Fight.getPlayerTeam((LivingEntity) player); } public static List getPrintableWinconditions(){ diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java index 882b9ad..1ab835c 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java @@ -24,10 +24,10 @@ import de.steamwar.fightsystem.fight.FightPlayer; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; -import org.bukkit.entity.Player; +import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.player.PlayerQuitEvent; public class WinconditionAllDead extends Wincondition implements Listener { @@ -38,8 +38,8 @@ public class WinconditionAllDead extends Wincondition implements Listener { } @EventHandler - public void handlePlayerDeath(PlayerDeathEvent event) { - handleDeath(event.getEntity().getPlayer()); + public void handlePlayerDeath(EntityDeathEvent event) { + handleDeath(event.getEntity()); } @EventHandler @@ -47,7 +47,7 @@ public class WinconditionAllDead extends Wincondition implements Listener { handleDeath(event.getPlayer()); } - private void handleDeath(Player player){ + private void handleDeath(Entity player){ FightTeam team = isTarget(player); if(team == null) return; diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java index 6bbaf0e..fef7ff6 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java @@ -23,10 +23,11 @@ import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; -import org.bukkit.entity.Player; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.player.PlayerQuitEvent; public class WinconditionCaptainDead extends Wincondition implements Listener { @@ -37,8 +38,8 @@ public class WinconditionCaptainDead extends Wincondition implements Listener { } @EventHandler - public void handlePlayerDeath(PlayerDeathEvent event) { - handleDeath(event.getEntity().getPlayer()); + public void handlePlayerDeath(EntityDeathEvent event) { + handleDeath(event.getEntity()); } @EventHandler @@ -46,12 +47,12 @@ public class WinconditionCaptainDead extends Wincondition implements Listener { handleDeath(event.getPlayer()); } - private void handleDeath(Player player){ + private void handleDeath(Entity player){ FightTeam team = isTarget(player); if(team == null) return; - if(team.isPlayerLeader(player)) { + if(team.isPlayerLeader((LivingEntity) player)) { win(Fight.getOpposite(team), "WIN_LEADER_DEAD", team.getPrefix() + team.getLeader().getPlayer().getName()); } } From a9453aa8597401eb160f3ba221148062f53093c0 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Mon, 28 Aug 2023 23:35:02 +0200 Subject: [PATCH 2/4] Rename for better clarity Signed-off-by: Lixfel --- .../de/steamwar/fightsystem/FightSystem.java | 2 +- .../fightsystem/commands/InfoCommand.java | 2 +- .../countdown/EnternCountdown.java | 8 ++-- .../fightsystem/fight/FightPlayer.java | 6 +-- .../steamwar/fightsystem/fight/FightTeam.java | 46 +++++++++---------- .../fightsystem/fight/JoinRequest.java | 4 +- .../fightsystem/listener/IngameDeath.java | 4 +- .../fightsystem/listener/Recording.java | 4 +- .../steamwar/fightsystem/record/Recorder.java | 2 +- .../fightsystem/utils/BungeeFightInfo.java | 8 ++-- .../fightsystem/utils/FightStatistics.java | 6 +-- .../winconditions/WinconditionAllDead.java | 2 +- .../winconditions/WinconditionAmongUs.java | 4 +- .../WinconditionCaptainDead.java | 2 +- 14 files changed, 50 insertions(+), 50 deletions(-) diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index ccca371..ff07546 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -105,7 +105,7 @@ public class FightSystem extends JavaPlugin { techHider = new TechHiderWrapper(); new FightWorld(); new FightUI(); - //new FightStatistics(); + new FightStatistics(); new BungeeFightInfo(); new WinconditionAllDead(); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/commands/InfoCommand.java b/FightSystem_Core/src/de/steamwar/fightsystem/commands/InfoCommand.java index 42491a5..3024a65 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/commands/InfoCommand.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/commands/InfoCommand.java @@ -51,7 +51,7 @@ public class InfoCommand implements CommandExecutor { FightSystem.getMessage().send("INFO_RANKED", player, !FightStatistics.isUnranked()); for(FightTeam team : Fight.teams()) { if(!team.isLeaderless()) - FightSystem.getMessage().send("INFO_LEADER", player, team.getColoredName(), team.getLeader().getPlayer().getName()); + FightSystem.getMessage().send("INFO_LEADER", player, team.getColoredName(), team.getLeader().getEntity().getName()); if(team.getSchematic() != 0) { SchematicNode schematic = SchematicNode.getSchematicNode(team.getSchematic()); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java b/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java index a98e9b6..7517be6 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/countdown/EnternCountdown.java @@ -57,18 +57,18 @@ public class EnternCountdown extends Countdown { @Override public void countdownFinished() { - FightSystem.getMessage().sendPrefixless("ENTERN_ALLOWED", fightPlayer.getPlayer(), ChatMessageType.ACTION_BAR); - fightPlayer.withPlayer(player -> FightSystem.getTechHider().reloadChunks(player, chunkPos, false)); + FightSystem.getMessage().sendPrefixless("ENTERN_ALLOWED", fightPlayer.getEntity(), ChatMessageType.ACTION_BAR); + fightPlayer.ifPlayer(player -> FightSystem.getTechHider().reloadChunks(player, chunkPos, false)); } @Override protected void prepareFinish() { - chunkPos = FightSystem.getTechHider().prepareChunkReload(fightPlayer.getPlayer(), false); + chunkPos = FightSystem.getTechHider().prepareChunkReload(fightPlayer.getEntity(), false); } @Override protected void broadcast(String message, int divisor) { - fightPlayer.withPlayer(player -> { + fightPlayer.ifPlayer(player -> { player.playSound(player.getLocation(), sound, 100.0f, 1.0f); sendCountdownMessage(player, message, time / divisor, appendix); }); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java index 4f34137..ec89b25 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java @@ -76,14 +76,14 @@ public class FightPlayer { enternCountdown = null; } - public LivingEntity getPlayer() { + public LivingEntity getEntity() { Player bukkit = Bukkit.getPlayer(uuid); if(bukkit != null) entity = bukkit; return entity; } - public void withPlayer(Consumer function) { + public void ifPlayer(Consumer function) { if(entity instanceof Player) function.accept((Player) entity); } @@ -94,7 +94,7 @@ public class FightPlayer { public boolean isLeader() { FightPlayer leader = team.getLeader(); - return leader != null && leader.getPlayer() == entity; + return leader != null && leader.getEntity() == entity; } public Kit getKit() { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java index f67a0a1..1184916 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -135,7 +135,7 @@ public class FightTeam { new OneShotStateDependent(Config.replayserver(), FightState.PreLeaderSetup, () -> Bukkit.getScheduler().runTask(FightSystem.getPlugin(), this::reset)); new OneShotStateDependent(ArenaMode.All, FightState.PostSchemSetup, () -> { if(leader != null) - leader.withPlayer(notReadyKit::loadToPlayer); + leader.ifPlayer(notReadyKit::loadToPlayer); }); } @@ -166,7 +166,7 @@ public class FightTeam { } public void teleportToSpawn(){ - players.forEach((player, fp) -> fp.getPlayer().teleport(spawn)); + players.forEach((player, fp) -> fp.getEntity().teleport(spawn)); } public FightPlayer getFightPlayer(LivingEntity player) { @@ -191,7 +191,7 @@ public class FightTeam { public boolean isPlayerLeader(LivingEntity player) { if(leader != null) - return leader.getPlayer().equals(player); + return leader.getEntity().equals(player); else return false; } @@ -205,7 +205,7 @@ public class FightTeam { for(UUID uuid : playerSet){ LivingEntity player = (LivingEntity) Bukkit.getEntity(uuid); if(player == null) - removePlayer(players.get(uuid).getPlayer()); + removePlayer(players.get(uuid).getEntity()); } FightPlayer leaderBackup = leader; playerSet.removeIf(uuid -> Bukkit.getEntity(uuid) == null); @@ -213,8 +213,8 @@ public class FightTeam { leader = null; if(leaderBackup != null){ - playerSet.remove(leaderBackup.getPlayer().getUniqueId()); - addMember(leaderBackup.getPlayer(), true); + playerSet.remove(leaderBackup.getEntity().getUniqueId()); + addMember(leaderBackup.getEntity(), true); } playerSet.forEach(uuid -> addMember((LivingEntity) Bukkit.getEntity(uuid), true)); @@ -266,7 +266,7 @@ public class FightTeam { player.setHealth(20); player.teleport(spawn); - fightPlayer.withPlayer(p -> { + fightPlayer.ifPlayer(p -> { BountifulWrapper.impl.setAttackSpeed(p); p.setFoodLevel(20); p.getInventory().clear(); @@ -283,7 +283,7 @@ public class FightTeam { fightPlayer.startEnternCountdown(); GlobalRecorder.getInstance().playerJoins(player); - fightPlayer.withPlayer(p -> FightSystem.getTechHider().reloadChunks(p, chunksToReload, false)); + fightPlayer.ifPlayer(p -> FightSystem.getTechHider().reloadChunks(p, chunksToReload, false)); if(isLeaderless()) setLeader(fightPlayer, silent); @@ -294,7 +294,7 @@ public class FightTeam { public void removePlayer(LivingEntity player) { FightPlayer fightPlayer = getFightPlayer(player); - fightPlayer.withPlayer(PersonalKitCreator::closeIfInKitCreator); + fightPlayer.ifPlayer(PersonalKitCreator::closeIfInKitCreator); List chunksToReload = FightSystem.getTechHider().prepareChunkReload(player, true); players.remove(player.getUniqueId()); team.removeEntry(player.getName()); @@ -308,7 +308,7 @@ public class FightTeam { GlobalRecorder.getInstance().entityDespawns(player); player.teleport(Config.SpecSpawn); - fightPlayer.withPlayer(p -> { + fightPlayer.ifPlayer(p -> { Fight.setPlayerGamemode(p, GameMode.SPECTATOR); p.getInventory().clear(); @@ -343,7 +343,7 @@ public class FightTeam { } private void setLeader(FightPlayer leader, boolean silent) { - leader.withPlayer(PersonalKitCreator::closeIfInKitCreator); + leader.ifPlayer(PersonalKitCreator::closeIfInKitCreator); this.leader = leader; designatedLeader = null; @@ -351,9 +351,9 @@ public class FightTeam { setReady(false); if(!silent) - FightUI.addSubtitle("UI_LEADER_JOINS", prefix, leader.getPlayer().getName()); + FightUI.addSubtitle("UI_LEADER_JOINS", prefix, leader.getEntity().getName()); - Optional maxRank = SchematicNode.getAllAccessibleSchematicsOfType(SteamwarUser.get(leader.getPlayer().getUniqueId()).getId(), Config.SchematicType.toDB()).stream().map(SchematicNode::getRank).max(Integer::compare); + Optional maxRank = SchematicNode.getAllAccessibleSchematicsOfType(SteamwarUser.get(leader.getEntity().getUniqueId()).getId(), Config.SchematicType.toDB()).stream().map(SchematicNode::getRank).max(Integer::compare); if(Config.RanksEnabled) schemRank = maxRank.orElse(1); else @@ -362,7 +362,7 @@ public class FightTeam { if(!Config.PersonalKits) leader.setKit(Kit.getKitByName(Config.LeaderDefault)); - leader.withPlayer(player -> { + leader.ifPlayer(player -> { if(FightState.getFightState() != FightState.POST_SCHEM_SETUP) chooseSchemKit.loadToPlayer(player); else @@ -414,7 +414,7 @@ public class FightTeam { } public void setReady(boolean ready) { - LivingEntity l = leader.getPlayer(); + LivingEntity l = leader.getEntity(); if(!schematic.hasSchematic()){ FightSystem.getMessage().sendPrefixless("SCHEMATIC_REQUIRED", l, ChatMessageType.ACTION_BAR); @@ -424,12 +424,12 @@ public class FightTeam { this.ready = ready; if(ready) { broadcast("TEAM_READY"); - leader.withPlayer(readyKit::loadToPlayer); + leader.ifPlayer(readyKit::loadToPlayer); if(Fight.getOpposite(this).isReady() || ArenaMode.SoloLeader.contains(Config.mode)) FightState.setFightState(FightState.PRE_RUNNING); } else { broadcast("TEAM_NOT_READY"); - leader.withPlayer(notReadyKit::loadToPlayer); + leader.ifPlayer(notReadyKit::loadToPlayer); } } @@ -468,7 +468,7 @@ public class FightTeam { } public double getCurrentHearts() { - return players.values().stream().filter(FightPlayer::isLiving).mapToDouble(fp -> fp.getPlayer().getHealth()).sum(); + return players.values().stream().filter(FightPlayer::isLiving).mapToDouble(fp -> fp.getEntity().getHealth()).sum(); } public double getHeartRatio(){ @@ -502,7 +502,7 @@ public class FightTeam { @Override public void enable() { for(FightPlayer fightPlayer : players.values()) { - fightPlayer.withPlayer(player -> { + fightPlayer.ifPlayer(player -> { PersonalKitCreator.closeIfInKitCreator(player); player.closeInventory(); @@ -513,7 +513,7 @@ public class FightTeam { @Override public void disable() { - players.values().forEach(fightPlayer -> fightPlayer.withPlayer(p -> p.getInventory().clear())); + players.values().forEach(fightPlayer -> fightPlayer.ifPlayer(p -> p.getInventory().clear())); } } @@ -526,14 +526,14 @@ public class FightTeam { @Override public void enable() { players.values().forEach(fightPlayer -> { - fightPlayer.withPlayer(player -> Fight.setPlayerGamemode(player, GameMode.SPECTATOR)); - fightPlayer.getPlayer().teleport(FightTeam.this.spawn); + fightPlayer.ifPlayer(player -> Fight.setPlayerGamemode(player, GameMode.SPECTATOR)); + fightPlayer.getEntity().teleport(FightTeam.this.spawn); }); } @Override public void disable() { - players.values().forEach(fightPlayer -> fightPlayer.withPlayer(player -> Fight.setPlayerGamemode(player, GameMode.SURVIVAL))); + players.values().forEach(fightPlayer -> fightPlayer.ifPlayer(player -> Fight.setPlayerGamemode(player, GameMode.SURVIVAL))); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java index 4b44d40..9bdfe27 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java @@ -68,10 +68,10 @@ public class JoinRequest { if(leader == null) continue; - if(leader.getPlayer() == null) + if(leader.getEntity() == null) continue; - leader.withPlayer(leaderPlayer -> FightSystem.getMessage().sendPrefixless("JOIN_REQUEST_NOTIFICATION", leaderPlayer, "REQUESTS", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/requests"), player.getName(), team.getColoredName())); + leader.ifPlayer(leaderPlayer -> FightSystem.getMessage().sendPrefixless("JOIN_REQUEST_NOTIFICATION", leaderPlayer, "REQUESTS", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/requests"), player.getName(), team.getColoredName())); } activeRequests.put(player, this); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java index 1058968..74a27a6 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java @@ -46,14 +46,14 @@ public class IngameDeath implements Listener { @EventHandler public void broadcastDeath(EntityDeathEvent event) { onPlayerEnd(event.getEntity(), fightPlayer -> { - FightUI.addSubtitle("UI_PLAYER_DEATH", fightPlayer.getTeam().getPrefix(), fightPlayer.getPlayer().getName()); + FightUI.addSubtitle("UI_PLAYER_DEATH", fightPlayer.getTeam().getPrefix(), fightPlayer.getEntity().getName()); Fight.playSound(SWSound.ENTITY_WITHER_DEATH.getSound(), 100.0F, 1.0F); }); } @EventHandler public void broadcastQuit(PlayerQuitEvent event) { - onPlayerEnd(event.getPlayer(), fightPlayer -> FightUI.addSubtitle("UI_PLAYER_LEAVE", fightPlayer.getTeam().getPrefix(), fightPlayer.getPlayer().getName())); + onPlayerEnd(event.getPlayer(), fightPlayer -> FightUI.addSubtitle("UI_PLAYER_LEAVE", fightPlayer.getTeam().getPrefix(), fightPlayer.getEntity().getName())); } @EventHandler(priority = EventPriority.MONITOR) diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java index 1a6aaec..b51964b 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java @@ -284,7 +284,7 @@ public class Recording implements Listener { if(!fp.isLiving()) continue; - fp.withPlayer(player -> { + fp.ifPlayer(player -> { BountifulWrapper.impl.recordHandItems(player); GlobalRecorder.getInstance().item(player, disarmNull(player.getInventory().getHelmet()), "HEAD"); GlobalRecorder.getInstance().item(player, disarmNull(player.getInventory().getChestplate()), "CHEST"); @@ -297,7 +297,7 @@ public class Recording implements Listener { private void despawnTeam(FightTeam team){ for(FightPlayer player : team.getPlayers()){ if(player.isLiving()) - GlobalRecorder.getInstance().entityDespawns(player.getPlayer()); + GlobalRecorder.getInstance().entityDespawns(player.getEntity()); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java index 969cd52..c4f47fa 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java @@ -69,7 +69,7 @@ public interface Recorder { if(FightState.AntiSpectate.contains(FightState.getFightState())){ for(FightPlayer player : team.getPlayers()){ if(player.isLiving()){ - playerJoins(player.getPlayer()); + playerJoins(player.getEntity()); } } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/BungeeFightInfo.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/BungeeFightInfo.java index e03c8bc..fbc3d48 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/BungeeFightInfo.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/BungeeFightInfo.java @@ -52,12 +52,12 @@ public class BungeeFightInfo { Fight.getRedTeam().getColoredName(), FightState.getFightState().name(), StateDependentCountdown.getMainCountdown() != null ? StateDependentCountdown.getMainCountdown().getTimeLeft() : 0, - Fight.getBlueTeam().getLeader() != null ? SteamwarUser.get(Fight.getBlueTeam().getLeader().getPlayer().getUniqueId()).getId() : 0, - Fight.getRedTeam().getLeader() != null ? SteamwarUser.get(Fight.getRedTeam().getLeader().getPlayer().getUniqueId()).getId() : 0, + Fight.getBlueTeam().getLeader() != null ? SteamwarUser.get(Fight.getBlueTeam().getLeader().getEntity().getUniqueId()).getId() : 0, + Fight.getRedTeam().getLeader() != null ? SteamwarUser.get(Fight.getRedTeam().getLeader().getEntity().getUniqueId()).getId() : 0, Fight.getBlueTeam().getSchematic(), Fight.getRedTeam().getSchematic(), - Fight.getBlueTeam().getPlayers().stream().map(p -> SteamwarUser.get(p.getPlayer().getUniqueId()).getId()).collect(Collectors.toList()), - Fight.getRedTeam().getPlayers().stream().map(p -> SteamwarUser.get(p.getPlayer().getUniqueId()).getId()).collect(Collectors.toList()), + Fight.getBlueTeam().getPlayers().stream().map(p -> SteamwarUser.get(p.getEntity().getUniqueId()).getId()).collect(Collectors.toList()), + Fight.getRedTeam().getPlayers().stream().map(p -> SteamwarUser.get(p.getEntity().getUniqueId()).getId()).collect(Collectors.toList()), Bukkit.getOnlinePlayers().stream().filter(p -> Fight.getPlayerTeam(p) == null).map(p -> SteamwarUser.get(p.getUniqueId()).getId()).collect(Collectors.toList()) )); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightStatistics.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightStatistics.java index e98b936..a9fd27f 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightStatistics.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightStatistics.java @@ -136,7 +136,7 @@ public class FightStatistics { } if (!Bukkit.getOnlinePlayers().isEmpty() && !unranked) { - NetworkSender.send(new FightEndsPacket((byte) win, blueSchem == null ? 0 : blueSchem, redSchem == null ? 0 : redSchem, Fight.getBlueTeam().getPlayers().stream().map(FightPlayer::getPlayer).map(p -> SteamwarUser.get(p.getUniqueId())).map(SteamwarUser::getId).collect(Collectors.toList()), Fight.getRedTeam().getPlayers().stream().map(FightPlayer::getPlayer).map(p -> SteamwarUser.get(p.getUniqueId())).map(SteamwarUser::getId).collect(Collectors.toList()), gameMode, (int)(endTime.getEpochSecond() - starttime.toInstant().getEpochSecond()))); + NetworkSender.send(new FightEndsPacket((byte) win, blueSchem == null ? 0 : blueSchem, redSchem == null ? 0 : redSchem, Fight.getBlueTeam().getPlayers().stream().map(FightPlayer::getEntity).map(p -> SteamwarUser.get(p.getUniqueId())).map(SteamwarUser::getId).collect(Collectors.toList()), Fight.getRedTeam().getPlayers().stream().map(FightPlayer::getEntity).map(p -> SteamwarUser.get(p.getUniqueId())).map(SteamwarUser::getId).collect(Collectors.toList()), gameMode, (int)(endTime.getEpochSecond() - starttime.toInstant().getEpochSecond()))); } unranked = false; @@ -144,14 +144,14 @@ public class FightStatistics { private int getLeader(FightTeam team) { if (team.getLeader() != null) - return SteamwarUser.get(team.getLeader().getPlayer().getUniqueId()).getId(); + return SteamwarUser.get(team.getLeader().getEntity().getUniqueId()).getId(); else if (team.getDesignatedLeader() != null) return SteamwarUser.get(team.getDesignatedLeader()).getId(); return 0; } private void savePlayerStats(FightPlayer fp, int fightId) { - SteamwarUser user = SteamwarUser.get(fp.getPlayer().getUniqueId()); + SteamwarUser user = SteamwarUser.get(fp.getEntity().getUniqueId()); de.steamwar.sql.FightPlayer.create(fightId, user.getId(), fp.getTeam().isBlue(), fp.getKit().getName(), fp.getKills(), !fp.isLiving()); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java index 1ab835c..041a752 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java @@ -53,7 +53,7 @@ public class WinconditionAllDead extends Wincondition implements Listener { return; for(FightPlayer fp : team.getPlayers()) { - if(fp.isLiving() && fp.getPlayer() != player) + if(fp.isLiving() && fp.getEntity() != player) return; } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAmongUs.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAmongUs.java index 0be9472..8057208 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAmongUs.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAmongUs.java @@ -54,9 +54,9 @@ public class WinconditionAmongUs extends Wincondition implements Listener { FightPlayer imposter = fightPlayerList.get(random.nextInt(fightPlayerList.size())); for (FightPlayer fightPlayer : fightPlayerList) { if (fightPlayer == imposter) { - FightSystem.getMessage().send("AMONG_US_IMPOSTER_MESSAGE", fightPlayer.getPlayer()); + FightSystem.getMessage().send("AMONG_US_IMPOSTER_MESSAGE", fightPlayer.getEntity()); } else { - FightSystem.getMessage().send("AMONG_US_IMPOSTER_AMONG_MESSAGE", fightPlayer.getPlayer()); + FightSystem.getMessage().send("AMONG_US_IMPOSTER_AMONG_MESSAGE", fightPlayer.getEntity()); } } return imposter; diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java index fef7ff6..53759a9 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java @@ -53,7 +53,7 @@ public class WinconditionCaptainDead extends Wincondition implements Listener { return; if(team.isPlayerLeader((LivingEntity) player)) { - win(Fight.getOpposite(team), "WIN_LEADER_DEAD", team.getPrefix() + team.getLeader().getPlayer().getName()); + win(Fight.getOpposite(team), "WIN_LEADER_DEAD", team.getPrefix() + team.getLeader().getEntity().getName()); } } } From d7b63841a12519ec21c04d5da49261b3f07d1659 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 29 Aug 2023 00:36:28 +0200 Subject: [PATCH 3/4] AI API prototype Signed-off-by: Lixfel --- .../de/steamwar/fightsystem/FightSystem.java | 5 +- .../src/de/steamwar/fightsystem/ai/AI.java | 127 ++++++++++++++++++ .../ai/{AIPlayer.java => LixfelAI.java} | 33 ++--- .../fightsystem/fight/FightPlayer.java | 7 + .../steamwar/fightsystem/fight/FightTeam.java | 2 + .../fightsystem/fight/JoinRequest.java | 7 +- .../fightsystem/listener/NormalJoin.java | 14 +- 7 files changed, 164 insertions(+), 31 deletions(-) create mode 100644 FightSystem_Core/src/de/steamwar/fightsystem/ai/AI.java rename FightSystem_Core/src/de/steamwar/fightsystem/ai/{AIPlayer.java => LixfelAI.java} (54%) diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index ff07546..09500a9 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -21,6 +21,7 @@ package de.steamwar.fightsystem; import com.comphenix.tinyprotocol.TinyProtocol; import de.steamwar.core.Core; +import de.steamwar.fightsystem.ai.LixfelAI; import de.steamwar.fightsystem.commands.*; import de.steamwar.fightsystem.countdown.*; import de.steamwar.fightsystem.event.HellsBells; @@ -105,7 +106,7 @@ public class FightSystem extends JavaPlugin { techHider = new TechHiderWrapper(); new FightWorld(); new FightUI(); - new FightStatistics(); + //new FightStatistics(); new BungeeFightInfo(); new WinconditionAllDead(); @@ -163,6 +164,8 @@ public class FightSystem extends JavaPlugin { }else if(Config.mode == ArenaMode.PREPARE) { Fight.getUnrotated().setSchem(SchematicNode.getSchematicNode(Config.PrepareSchemID)); } + + new LixfelAI(Fight.getBlueTeam()); } @Override diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/ai/AI.java b/FightSystem_Core/src/de/steamwar/fightsystem/ai/AI.java new file mode 100644 index 0000000..33aafdc --- /dev/null +++ b/FightSystem_Core/src/de/steamwar/fightsystem/ai/AI.java @@ -0,0 +1,127 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2023 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.fightsystem.ai; + +import com.comphenix.tinyprotocol.Reflection; +import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.sql.SchematicNode; +import de.steamwar.sql.SteamwarUser; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Villager; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public abstract class AI { + + private static final Map ais = new HashMap<>(); + + public static AI getAI(UUID uuid) { + return ais.get(uuid); + } + + private final FightTeam team; + private final LivingEntity entity; + private final BukkitTask task; + private int cooldown; + + private static final Reflection.MethodInvoker getHandle = Reflection.getMethod("{obc}.entity.CraftEntity", "getHandle"); + private static final Reflection.FieldAccessor entityUUID = Reflection.getField("{nms.world.entity}.Entity", UUID.class, 0); + protected AI(FightTeam team, SteamwarUser user) { + this.team = team; + + entity = Config.world.spawn(Config.SpecSpawn, Villager.class, entity -> entityUUID.set(getHandle.invoke(entity), user.getUUID())); + entity.setCustomName(user.getUserName()); + entity.setAI(false); + + task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::run, 1, 1); + ais.put(user.getUUID(), this); + team.addMember(entity); + } + + public abstract SchematicNode chooseSchematic(); + + public boolean acceptJoinRequest(Player player, FightTeam team) { + return true; + } + + protected abstract void plan(); + + public void cleanup() { + ais.remove(entity.getUniqueId()); + task.cancel(); + } + + public LivingEntity getEntity() { + return entity; + } + + protected void setReady() { + if(FightState.getFightState() != FightState.POST_SCHEM_SETUP) + return; + + if(team.getLeader().getEntity() != entity) + return; + + team.setReady(true); + } + + protected Material getBlock(Vector pos) { + //TODO position translation + cooldown++; + return pos.toLocation(Config.world).getBlock().getType(); + } + + protected void setTNT(Vector pos) { + //TODO position translation + //TODO Check position + //TODO Check AIR is there + cooldown++; + pos.toLocation(Config.world).getBlock().setType(Material.TNT); + } + + protected void move(Vector pos) { + //TODO position translation + //TODO Check position + //TODO falling check + //TODO pathfinding + cooldown += 5; + entity.teleport(pos.toLocation(Config.world)); + } + + private void run() { + if(cooldown > 0) + cooldown--; + + if(cooldown > 0) + return; + + plan(); + } +} diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/ai/AIPlayer.java b/FightSystem_Core/src/de/steamwar/fightsystem/ai/LixfelAI.java similarity index 54% rename from FightSystem_Core/src/de/steamwar/fightsystem/ai/AIPlayer.java rename to FightSystem_Core/src/de/steamwar/fightsystem/ai/LixfelAI.java index 1730174..fcc834b 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/ai/AIPlayer.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/ai/LixfelAI.java @@ -19,27 +19,28 @@ package de.steamwar.fightsystem.ai; -import com.comphenix.tinyprotocol.Reflection; import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SteamwarUser; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Villager; -import java.util.UUID; +import java.util.List; +import java.util.Random; -public class AIPlayer { - private static final Reflection.MethodInvoker getHandle = Reflection.getMethod("{obc}.entity.CraftEntity", "getHandle"); - private static final Reflection.FieldAccessor entityUUID = Reflection.getField("{nms.world.entity}.Entity", UUID.class, 0); - - private final LivingEntity player; - - public AIPlayer(SteamwarUser user) { - player = Config.world.spawn(Config.SpecSpawn, Villager.class, entity -> entityUUID.set(getHandle.invoke(entity), user.getUUID())); - player.setCustomName(user.getUserName()); - player.setAI(false); +public class LixfelAI extends AI { + public LixfelAI(FightTeam team) { + super(team, SteamwarUser.get("public")); } - public LivingEntity getEntity() { - return player; + @Override + public SchematicNode chooseSchematic() { + List publics = SchematicNode.getAllSchematicsOfType(0, Config.SchematicType.toDB()); + return publics.get(new Random().nextInt(publics.size())); + } + + @Override + protected void plan() { + setReady(); + getEntity().setAI(true); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java index ec89b25..41735a7 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java @@ -20,6 +20,7 @@ package de.steamwar.fightsystem.fight; import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.ai.AI; import de.steamwar.fightsystem.countdown.EnternCountdown; import de.steamwar.sql.PersonalKit; import de.steamwar.sql.SteamwarUser; @@ -62,6 +63,7 @@ public class FightPlayer { public void setOut() { isOut = true; stopEnternCountdown(); + ifAI(AI::cleanup); } public void startEnternCountdown() { @@ -83,6 +85,11 @@ public class FightPlayer { return entity; } + public void ifAI(Consumer function) { + if(!(entity instanceof Player)) + function.accept(AI.getAI(uuid)); + } + public void ifPlayer(Consumer function) { if(entity instanceof Player) function.accept((Player) entity); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java index 1184916..03726d3 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -372,6 +372,8 @@ public class FightTeam { if(FightState.getFightState() == FightState.PRE_LEADER_SETUP && !Fight.getOpposite(this).isLeaderless()){ FightState.setFightState(FightState.PRE_SCHEM_SETUP); } + + leader.ifAI(ai -> setSchem(ai.chooseSchematic())); } public Collection getPlayers() { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java index 9bdfe27..4f80744 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java @@ -63,6 +63,8 @@ public class JoinRequest { this.player = player; this.team = team; this.waitOnApproval = new HashSet<>(FightState.ingame() ? Fight.teams() : Collections.singleton(team)); + + activeRequests.put(player, this); for(FightTeam t : waitOnApproval) { FightPlayer leader = t.getLeader(); if(leader == null) @@ -72,9 +74,12 @@ public class JoinRequest { continue; leader.ifPlayer(leaderPlayer -> FightSystem.getMessage().sendPrefixless("JOIN_REQUEST_NOTIFICATION", leaderPlayer, "REQUESTS", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/requests"), player.getName(), team.getColoredName())); + leader.ifAI(ai -> { + if(ai.acceptJoinRequest(player, team)) + accept(t); + }); } - activeRequests.put(player, this); FightSystem.getMessage().sendPrefixless("JOIN_REQUEST_CONFIRMATION", player, ChatMessageType.ACTION_BAR); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/NormalJoin.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/NormalJoin.java index 931f0b7..371ae75 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/NormalJoin.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/NormalJoin.java @@ -20,14 +20,10 @@ package de.steamwar.fightsystem.listener; import de.steamwar.fightsystem.ArenaMode; -import de.steamwar.fightsystem.FightSystem; -import de.steamwar.fightsystem.ai.AIPlayer; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; -import de.steamwar.sql.SteamwarUser; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -47,15 +43,7 @@ public class NormalJoin implements Listener { FightTeam team = Fight.teams().stream().filter(t -> player.getUniqueId().equals(t.getDesignatedLeader())).findAny( // Player is designated leader of a team ).orElse(Fight.teams().stream().filter(t -> t.canbeLeader(player)).findAny().orElse(null)); // Else search empty team - if(team != null) { + if(team != null) team.addMember(player); - FightTeam aiTeam = Fight.getOpposite(team); - AIPlayer aiPlayer = new AIPlayer(SteamwarUser.get(0)); - aiTeam.addMember(aiPlayer.getEntity()); - Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> { - FightState.setFightState(FightState.POST_SCHEM_SETUP); - aiTeam.setReady(true); - }, 1); - } } } From 1cc247f6dd495b1042ac937d188b0bb4280bcae3 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 29 Aug 2023 13:45:46 +0200 Subject: [PATCH 4/4] AI API Signed-off-by: Lixfel --- .../de/steamwar/fightsystem/FightSystem.java | 9 +- .../src/de/steamwar/fightsystem/ai/AI.java | 199 +++++++++++++++--- .../de/steamwar/fightsystem/fight/Fight.java | 2 +- .../fightsystem/fight/FightPlayer.java | 21 +- .../steamwar/fightsystem/fight/FightTeam.java | 86 ++++---- .../fightsystem/fight/JoinRequest.java | 4 +- .../fightsystem/listener/ArenaBorder.java | 15 +- .../steamwar/fightsystem/listener/Chat.java | 2 +- .../fightsystem/listener/IngameDeath.java | 3 +- .../steamwar/fightsystem/record/Recorder.java | 6 +- .../fightsystem/utils/BungeeFightInfo.java | 8 +- .../fightsystem/utils/FightStatistics.java | 7 +- 12 files changed, 252 insertions(+), 110 deletions(-) diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index 09500a9..5de02c4 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -32,7 +32,10 @@ import de.steamwar.fightsystem.fight.FightWorld; import de.steamwar.fightsystem.fight.HotbarKit; import de.steamwar.fightsystem.listener.Shutdown; import de.steamwar.fightsystem.listener.*; -import de.steamwar.fightsystem.record.*; +import de.steamwar.fightsystem.record.FileRecorder; +import de.steamwar.fightsystem.record.FileSource; +import de.steamwar.fightsystem.record.GlobalRecorder; +import de.steamwar.fightsystem.record.LiveRecorder; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.OneShotStateDependent; import de.steamwar.fightsystem.utils.*; @@ -106,7 +109,7 @@ public class FightSystem extends JavaPlugin { techHider = new TechHiderWrapper(); new FightWorld(); new FightUI(); - //new FightStatistics(); + new FightStatistics(); new BungeeFightInfo(); new WinconditionAllDead(); @@ -164,8 +167,6 @@ public class FightSystem extends JavaPlugin { }else if(Config.mode == ArenaMode.PREPARE) { Fight.getUnrotated().setSchem(SchematicNode.getSchematicNode(Config.PrepareSchemID)); } - - new LixfelAI(Fight.getBlueTeam()); } @Override diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/ai/AI.java b/FightSystem_Core/src/de/steamwar/fightsystem/ai/AI.java index 33aafdc..9f51c74 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/ai/AI.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/ai/AI.java @@ -19,29 +19,46 @@ package de.steamwar.fightsystem.ai; -import com.comphenix.tinyprotocol.Reflection; +import de.steamwar.fightsystem.ArenaMode; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.fightsystem.listener.Chat; import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.OneShotStateDependent; +import de.steamwar.fightsystem.utils.Region; import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SteamwarUser; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Note; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Openable; +import org.bukkit.block.data.Powerable; +import org.bukkit.block.data.type.NoteBlock; +import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.entity.Villager; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; +import java.util.logging.Level; public abstract class AI { private static final Map ais = new HashMap<>(); + static { + new OneShotStateDependent(ArenaMode.All, FightState.Spectate, () -> { + ais.values().forEach(AI::stop); + ais.clear(); + }); + } + public static AI getAI(UUID uuid) { return ais.get(uuid); } @@ -49,20 +66,18 @@ public abstract class AI { private final FightTeam team; private final LivingEntity entity; private final BukkitTask task; - private int cooldown; + private final Queue queue = new ArrayDeque<>(); - private static final Reflection.MethodInvoker getHandle = Reflection.getMethod("{obc}.entity.CraftEntity", "getHandle"); - private static final Reflection.FieldAccessor entityUUID = Reflection.getField("{nms.world.entity}.Entity", UUID.class, 0); protected AI(FightTeam team, SteamwarUser user) { this.team = team; - entity = Config.world.spawn(Config.SpecSpawn, Villager.class, entity -> entityUUID.set(getHandle.invoke(entity), user.getUUID())); + entity = (LivingEntity) Config.world.spawnEntity(Config.SpecSpawn, EntityType.VILLAGER); entity.setCustomName(user.getUserName()); entity.setAI(false); task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::run, 1, 1); - ais.put(user.getUUID(), this); - team.addMember(entity); + ais.put(entity.getUniqueId(), this); + team.addMember(entity, user); } public abstract SchematicNode chooseSchematic(); @@ -73,9 +88,12 @@ public abstract class AI { protected abstract void plan(); - public void cleanup() { - ais.remove(entity.getUniqueId()); - task.cancel(); + public void stop() { + if(!entity.isDead()) + entity.remove(); + + if(!task.isCancelled()) + task.cancel(); } public LivingEntity getEntity() { @@ -92,36 +110,151 @@ public abstract class AI { team.setReady(true); } + protected void chat(String message) { + FightSystem.getPlugin().getLogger().log(Level.INFO, entity.getName() + "ยป " + message); + Chat.broadcastChat("PARTICIPANT_CHAT", team.getColoredName(), entity.getName(), message); + } + + protected Vector getPosition() { + Location location = entity.getLocation(); + Region extend = team.getExtendRegion(); + if(Fight.getUnrotated() == team) + return new Vector( + location.getX() - extend.getMinX(), + location.getY() - extend.getMinY(), + location.getZ() - extend.getMinZ() + ); + else + return new Vector( + extend.getMaxX() - location.getX(), + location.getY() - extend.getMinY(), + extend.getMaxZ() - location.getZ() + ); + } + protected Material getBlock(Vector pos) { - //TODO position translation - cooldown++; - return pos.toLocation(Config.world).getBlock().getType(); + queue.add(new Action(1)); + return translate(pos, true).getBlock().getType(); + } + + protected boolean isPowered(Vector pos) { + queue.add(new Action(1)); + return translate(pos, true).getBlock().isBlockPowered(); } protected void setTNT(Vector pos) { - //TODO position translation - //TODO Check position - //TODO Check AIR is there - cooldown++; - pos.toLocation(Config.world).getBlock().setType(Material.TNT); + queue.add(new Action(1) { + @Override + public void run() { + Location location = translate(pos, true); + if(interactionDistanceViolation(location)) + return; + + Block block = location.getBlock(); + if(block.getType() == Material.AIR) + block.setType(Material.TNT); + } + }); + } + + protected void interact(Vector pos) { + queue.add(new Action(1) { + @Override + public void run() { + Location location = translate(pos, true); + if(interactionDistanceViolation(location)) + return; + + interact(location.getBlock()); + } + }); } protected void move(Vector pos) { - //TODO position translation - //TODO Check position - //TODO falling check - //TODO pathfinding - cooldown += 5; - entity.teleport(pos.toLocation(Config.world)); + queue.add(new Action(2) { + @Override + public void run() { + if(!entity.isOnGround()) + return; + + Location location = entity.getLocation(); + Location target = translate(pos, false); + if(Math.abs(location.getX() - target.getX()) > 1 || Math.abs(location.getY() - target.getY()) > 1 || Math.abs(location.getZ() - target.getZ()) > 1) + return; + + entity.teleport(target); + } + }); + } + + private boolean interactionDistanceViolation(Location location) { + return location.distance(entity.getEyeLocation()) > 5; + } + + private void interact(Block block) { + BlockData data = block.getBlockData(); //TODO only 1.14+ compatible at the moment + if (data instanceof NoteBlock) { + NoteBlock noteBlock = (NoteBlock) data; + Note note = noteBlock.getNote(); + noteBlock.setNote(note.isSharped() ? note.flattened() : note.sharped()); + } else if (data instanceof Openable) { + Openable openable = (Openable) data; + openable.setOpen(!openable.isOpen()); + } else if (data instanceof Powerable) { + Material type = block.getType(); + Powerable powerable = (Powerable) data; + boolean isPowered = powerable.isPowered(); + + if(type.name().endsWith("BUTTON")) { + if(isPowered) + return; + + Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> { + if(!block.getType().name().endsWith("BUTTON")) + return; + + powerable.setPowered(false); + block.setBlockData(powerable); + }, type.name().endsWith("STONE_BUTTON") ? 20 : 30); + } + + powerable.setPowered(!isPowered); + } + block.setBlockData(data); } private void run() { - if(cooldown > 0) - cooldown--; + if(queue.isEmpty()) + plan(); - if(cooldown > 0) - return; + if(!queue.isEmpty() && --queue.peek().delay == 0) + queue.poll().run(); + } - plan(); + private Location translate(Vector pos, boolean blockPos) { + Region extend = team.getExtendRegion(); + if(Fight.getUnrotated() == team) + return new Location( + Config.world, + pos.getX() + extend.getMinX(), + pos.getY() + extend.getMinY(), + pos.getZ() + extend.getMinZ() + ); + else + return new Location( + Config.world, + extend.getMaxX() - pos.getX() - (blockPos ? 1 : 0), + pos.getY() + extend.getMinY(), + extend.getMaxZ() - pos.getZ() - (blockPos ? 1 : 0) + ); + } + + private static class Action { + private int delay; + public Action(int delay) { + this.delay = delay; + } + + public void run() {} } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java index 380f39e..f7011d0 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java @@ -88,7 +88,7 @@ public class Fight { } public static FightTeam getUnrotated() { - return Config.BlueRotate ? Fight.getRedTeam() : Fight.getBlueTeam(); + return Config.blueNegZ() ? Fight.getBlueTeam() : Fight.getRedTeam(); } public static void playSound(Sound sound, float volume, float pitch) { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java index 41735a7..1bc6db1 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightPlayer.java @@ -28,12 +28,11 @@ import org.bukkit.Bukkit; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import java.util.UUID; import java.util.function.Consumer; public class FightPlayer { - private final UUID uuid; + private final int id; private LivingEntity entity; private final FightTeam team; private boolean isOut; @@ -41,14 +40,14 @@ public class FightPlayer { private int kills; private EnternCountdown enternCountdown = null; - FightPlayer(LivingEntity player, FightTeam team) { - this.uuid = player.getUniqueId(); - this.entity = player; + FightPlayer(LivingEntity entity, SteamwarUser user, FightTeam team) { + this.id = user.getId(); + this.entity = entity; this.team = team; this.isOut = false; kit = Kit.getKitByName(Config.MemberDefault); if(Config.PersonalKits){ - PersonalKit personalKit = PersonalKit.getKitInUse(SteamwarUser.get(uuid).getId(), Config.SchematicType.toDB()); + PersonalKit personalKit = PersonalKit.getKitInUse(user.getId(), Config.SchematicType.toDB()); if(personalKit != null){ kit = new Kit(personalKit); } @@ -63,7 +62,7 @@ public class FightPlayer { public void setOut() { isOut = true; stopEnternCountdown(); - ifAI(AI::cleanup); + ifAI(AI::stop); } public void startEnternCountdown() { @@ -79,15 +78,19 @@ public class FightPlayer { } public LivingEntity getEntity() { - Player bukkit = Bukkit.getPlayer(uuid); + LivingEntity bukkit = (LivingEntity) Bukkit.getEntity(entity.getUniqueId()); if(bukkit != null) entity = bukkit; return entity; } + public SteamwarUser getUser() { + return SteamwarUser.get(id); + } + public void ifAI(Consumer function) { if(!(entity instanceof Player)) - function.accept(AI.getAI(uuid)); + function.accept(AI.getAI(entity.getUniqueId())); } public void ifPlayer(Consumer function) { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java index 03726d3..74092af 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -203,21 +203,21 @@ public class FightTeam { Set playerSet = new HashSet<>(players.keySet()); for(UUID uuid : playerSet){ - LivingEntity player = (LivingEntity) Bukkit.getEntity(uuid); + Player player = Bukkit.getPlayer(uuid); if(player == null) removePlayer(players.get(uuid).getEntity()); } FightPlayer leaderBackup = leader; - playerSet.removeIf(uuid -> Bukkit.getEntity(uuid) == null); + playerSet.removeIf(uuid -> Bukkit.getPlayer(uuid) == null); players.clear(); leader = null; if(leaderBackup != null){ playerSet.remove(leaderBackup.getEntity().getUniqueId()); - addMember(leaderBackup.getEntity(), true); + addMember(leaderBackup.getEntity(), leaderBackup.getUser(), true); } - playerSet.forEach(uuid -> addMember((LivingEntity) Bukkit.getEntity(uuid), true)); + playerSet.forEach(uuid -> addMember(Bukkit.getPlayer(uuid), SteamwarUser.get(uuid), true)); if(ArenaMode.VariableTeams.contains(Config.mode) && isLeaderless()){ List onlinePlayers = new ArrayList<>(Bukkit.getOnlinePlayers()); @@ -251,72 +251,76 @@ public class FightTeam { }); } - public void addMember(LivingEntity player) { - addMember(player, false); + public void addMember(Player player) { + addMember(player, SteamwarUser.get(player.getUniqueId()), false); } - private void addMember(LivingEntity player, boolean silent) { - final List chunksToReload = FightSystem.getTechHider().prepareChunkReload(player, false); - FightPlayer fightPlayer = getFightPlayer(player) != null ? getFightPlayer(player) : new FightPlayer(player, this); + public void addMember(LivingEntity entity, SteamwarUser user) { + addMember(entity, user, false); + } + + public void addMember(LivingEntity entity, SteamwarUser user, boolean silent) { + final List chunksToReload = FightSystem.getTechHider().prepareChunkReload(entity, false); + FightPlayer fightPlayer = getFightPlayer(entity) != null ? getFightPlayer(entity) : new FightPlayer(entity, user, this); fightPlayer.revive(); - players.put(player.getUniqueId(), fightPlayer); - Permanent.getSpectatorTeam().removeEntry(player.getName()); - team.addEntry(player.getName()); + players.put(entity.getUniqueId(), fightPlayer); + Permanent.getSpectatorTeam().removeEntry(entity.getName()); + team.addEntry(entity.getName()); - player.setHealth(20); - player.teleport(spawn); + entity.setHealth(20); + entity.teleport(spawn); - fightPlayer.ifPlayer(p -> { - BountifulWrapper.impl.setAttackSpeed(p); - p.setFoodLevel(20); - p.getInventory().clear(); + fightPlayer.ifPlayer(player -> { + BountifulWrapper.impl.setAttackSpeed(player); + player.setFoodLevel(20); + player.getInventory().clear(); if(FightState.Spectate.contains(FightState.getFightState())) { - Fight.setPlayerGamemode(p, GameMode.SPECTATOR); + Fight.setPlayerGamemode(player, GameMode.SPECTATOR); } else { - Fight.setPlayerGamemode(p, GameMode.SURVIVAL); - (FightState.ingame() ? fightPlayer.getKit() : memberKit).loadToPlayer(p); + Fight.setPlayerGamemode(player, GameMode.SURVIVAL); + (FightState.ingame() ? fightPlayer.getKit() : memberKit).loadToPlayer(player); } }); if(FightState.Running.contains(FightState.getFightState())) fightPlayer.startEnternCountdown(); - GlobalRecorder.getInstance().playerJoins(player); - fightPlayer.ifPlayer(p -> FightSystem.getTechHider().reloadChunks(p, chunksToReload, false)); + GlobalRecorder.getInstance().playerJoins(entity, user); + fightPlayer.ifPlayer(player -> FightSystem.getTechHider().reloadChunks(player, chunksToReload, false)); if(isLeaderless()) setLeader(fightPlayer, silent); else if(!silent) - FightUI.addSubtitle("UI_PLAYER_JOINS", prefix, player.getName()); + FightUI.addSubtitle("UI_PLAYER_JOINS", prefix, entity.getName()); } - public void removePlayer(LivingEntity player) { - FightPlayer fightPlayer = getFightPlayer(player); + public void removePlayer(LivingEntity entity) { + FightPlayer fightPlayer = getFightPlayer(entity); fightPlayer.ifPlayer(PersonalKitCreator::closeIfInKitCreator); - List chunksToReload = FightSystem.getTechHider().prepareChunkReload(player, true); - players.remove(player.getUniqueId()); - team.removeEntry(player.getName()); - Permanent.getSpectatorTeam().addEntry(player.getName()); + List chunksToReload = FightSystem.getTechHider().prepareChunkReload(entity, true); + players.remove(entity.getUniqueId()); + team.removeEntry(entity.getName()); + Permanent.getSpectatorTeam().addEntry(entity.getName()); - FightUI.addSubtitle("UI_PLAYER_LEAVES", prefix, player.getName()); + FightUI.addSubtitle("UI_PLAYER_LEAVES", prefix, entity.getName()); if(fightPlayer.equals(leader)) removeLeader(); - GlobalRecorder.getInstance().entityDespawns(player); - player.teleport(Config.SpecSpawn); + GlobalRecorder.getInstance().entityDespawns(entity); + entity.teleport(Config.SpecSpawn); - fightPlayer.ifPlayer(p -> { - Fight.setPlayerGamemode(p, GameMode.SPECTATOR); - p.getInventory().clear(); + fightPlayer.ifPlayer(player -> { + Fight.setPlayerGamemode(player, GameMode.SPECTATOR); + player.getInventory().clear(); - if(p.isOnline()){ - FightSystem.getTechHider().reloadChunks(p, chunksToReload, true); + if(player.isOnline()){ + FightSystem.getTechHider().reloadChunks(player, chunksToReload, true); if(ArenaMode.VariableTeams.contains(Config.mode)) - HotbarKit.SPECTATOR_KIT.loadToPlayer(p); + HotbarKit.SPECTATOR_KIT.loadToPlayer(player); } }); } @@ -353,7 +357,7 @@ public class FightTeam { if(!silent) FightUI.addSubtitle("UI_LEADER_JOINS", prefix, leader.getEntity().getName()); - Optional maxRank = SchematicNode.getAllAccessibleSchematicsOfType(SteamwarUser.get(leader.getEntity().getUniqueId()).getId(), Config.SchematicType.toDB()).stream().map(SchematicNode::getRank).max(Integer::compare); + Optional maxRank = SchematicNode.getAllAccessibleSchematicsOfType(leader.getUser().getId(), Config.SchematicType.toDB()).stream().map(SchematicNode::getRank).max(Integer::compare); if(Config.RanksEnabled) schemRank = maxRank.orElse(1); else @@ -373,7 +377,7 @@ public class FightTeam { FightState.setFightState(FightState.PRE_SCHEM_SETUP); } - leader.ifAI(ai -> setSchem(ai.chooseSchematic())); + leader.ifAI(ai -> pasteSchem(ai.chooseSchematic())); } public Collection getPlayers() { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java index 4f80744..a7756e4 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/JoinRequest.java @@ -63,6 +63,7 @@ public class JoinRequest { this.player = player; this.team = team; this.waitOnApproval = new HashSet<>(FightState.ingame() ? Fight.teams() : Collections.singleton(team)); + Set alreadyAccepted = new HashSet<>(); activeRequests.put(player, this); for(FightTeam t : waitOnApproval) { @@ -76,11 +77,12 @@ public class JoinRequest { leader.ifPlayer(leaderPlayer -> FightSystem.getMessage().sendPrefixless("JOIN_REQUEST_NOTIFICATION", leaderPlayer, "REQUESTS", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/requests"), player.getName(), team.getColoredName())); leader.ifAI(ai -> { if(ai.acceptJoinRequest(player, team)) - accept(t); + alreadyAccepted.add(t); }); } FightSystem.getMessage().sendPrefixless("JOIN_REQUEST_CONFIRMATION", player, ChatMessageType.ACTION_BAR); + alreadyAccepted.forEach(this::accept); } public boolean required(FightTeam decider) { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/ArenaBorder.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/ArenaBorder.java index 9eab82d..d0a428e 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/ArenaBorder.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/ArenaBorder.java @@ -23,14 +23,15 @@ import de.steamwar.fightsystem.ArenaMode; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; +import de.steamwar.fightsystem.fight.FightPlayer; import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; import de.steamwar.fightsystem.states.StateDependentTask; import net.md_5.bungee.api.ChatMessageType; -import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -69,10 +70,12 @@ public class ArenaBorder implements Listener { } private void damage() { - for(Player player : Bukkit.getServer().getOnlinePlayers()) { - FightTeam team = Fight.getPlayerTeam(player); - if(team != null && player.getLocation().getY() <= Config.PlayerRegion.getMinY()) - player.damage(1); - } + Fight.teams().forEach(team -> { + for(FightPlayer fp : team.getPlayers()) { + LivingEntity entity = fp.getEntity(); + if(fp.isLiving() && entity.getLocation().getY() <= Config.PlayerRegion.getMinY()) + entity.damage(1); + } + }); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Chat.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Chat.java index 9becb1f..827f46c 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Chat.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Chat.java @@ -63,7 +63,7 @@ public class Chat implements Listener { event.setCancelled(true); } - private void broadcastChat(String message, Object... params) { + public static void broadcastChat(String message, Object... params) { GlobalRecorder.getInstance().chat(message, params); FightSystem.getMessage().chat(message, params); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java index 74a27a6..6ff538f 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java @@ -32,7 +32,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerQuitEvent; import java.util.function.Consumer; @@ -57,7 +56,7 @@ public class IngameDeath implements Listener { } @EventHandler(priority = EventPriority.MONITOR) - public void handlePlayerDeath(PlayerDeathEvent event) { + public void handlePlayerDeath(EntityDeathEvent event) { onPlayerEnd(event.getEntity(), FightPlayer::setOut); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java index c4f47fa..d57a29b 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java @@ -69,7 +69,7 @@ public interface Recorder { if(FightState.AntiSpectate.contains(FightState.getFightState())){ for(FightPlayer player : team.getPlayers()){ if(player.isLiving()){ - playerJoins(player.getEntity()); + playerJoins(player.getEntity(), player.getUser()); } } } @@ -149,9 +149,7 @@ public interface Recorder { * 0x08: Message following * */ - default void playerJoins(LivingEntity p){ - SteamwarUser user = SteamwarUser.get(p.getUniqueId()); - + default void playerJoins(LivingEntity p, SteamwarUser user){ write(0x00, p.getEntityId(), user.getId()); entityMoves(p); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/BungeeFightInfo.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/BungeeFightInfo.java index fbc3d48..6ffa0e9 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/BungeeFightInfo.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/BungeeFightInfo.java @@ -52,12 +52,12 @@ public class BungeeFightInfo { Fight.getRedTeam().getColoredName(), FightState.getFightState().name(), StateDependentCountdown.getMainCountdown() != null ? StateDependentCountdown.getMainCountdown().getTimeLeft() : 0, - Fight.getBlueTeam().getLeader() != null ? SteamwarUser.get(Fight.getBlueTeam().getLeader().getEntity().getUniqueId()).getId() : 0, - Fight.getRedTeam().getLeader() != null ? SteamwarUser.get(Fight.getRedTeam().getLeader().getEntity().getUniqueId()).getId() : 0, + Fight.getBlueTeam().getLeader() != null ? Fight.getBlueTeam().getLeader().getUser().getId() : 0, + Fight.getRedTeam().getLeader() != null ? Fight.getRedTeam().getLeader().getUser().getId() : 0, Fight.getBlueTeam().getSchematic(), Fight.getRedTeam().getSchematic(), - Fight.getBlueTeam().getPlayers().stream().map(p -> SteamwarUser.get(p.getEntity().getUniqueId()).getId()).collect(Collectors.toList()), - Fight.getRedTeam().getPlayers().stream().map(p -> SteamwarUser.get(p.getEntity().getUniqueId()).getId()).collect(Collectors.toList()), + Fight.getBlueTeam().getPlayers().stream().map(p -> p.getUser().getId()).collect(Collectors.toList()), + Fight.getRedTeam().getPlayers().stream().map(p -> p.getUser().getId()).collect(Collectors.toList()), Bukkit.getOnlinePlayers().stream().filter(p -> Fight.getPlayerTeam(p) == null).map(p -> SteamwarUser.get(p.getUniqueId()).getId()).collect(Collectors.toList()) )); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightStatistics.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightStatistics.java index a9fd27f..7467e0e 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightStatistics.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/FightStatistics.java @@ -136,7 +136,7 @@ public class FightStatistics { } if (!Bukkit.getOnlinePlayers().isEmpty() && !unranked) { - NetworkSender.send(new FightEndsPacket((byte) win, blueSchem == null ? 0 : blueSchem, redSchem == null ? 0 : redSchem, Fight.getBlueTeam().getPlayers().stream().map(FightPlayer::getEntity).map(p -> SteamwarUser.get(p.getUniqueId())).map(SteamwarUser::getId).collect(Collectors.toList()), Fight.getRedTeam().getPlayers().stream().map(FightPlayer::getEntity).map(p -> SteamwarUser.get(p.getUniqueId())).map(SteamwarUser::getId).collect(Collectors.toList()), gameMode, (int)(endTime.getEpochSecond() - starttime.toInstant().getEpochSecond()))); + NetworkSender.send(new FightEndsPacket((byte) win, blueSchem == null ? 0 : blueSchem, redSchem == null ? 0 : redSchem, Fight.getBlueTeam().getPlayers().stream().map(FightPlayer::getUser).map(SteamwarUser::getId).collect(Collectors.toList()), Fight.getRedTeam().getPlayers().stream().map(FightPlayer::getUser).map(SteamwarUser::getId).collect(Collectors.toList()), gameMode, (int)(endTime.getEpochSecond() - starttime.toInstant().getEpochSecond()))); } unranked = false; @@ -144,14 +144,13 @@ public class FightStatistics { private int getLeader(FightTeam team) { if (team.getLeader() != null) - return SteamwarUser.get(team.getLeader().getEntity().getUniqueId()).getId(); + return team.getLeader().getUser().getId(); else if (team.getDesignatedLeader() != null) return SteamwarUser.get(team.getDesignatedLeader()).getId(); return 0; } private void savePlayerStats(FightPlayer fp, int fightId) { - SteamwarUser user = SteamwarUser.get(fp.getEntity().getUniqueId()); - de.steamwar.sql.FightPlayer.create(fightId, user.getId(), fp.getTeam().isBlue(), fp.getKit().getName(), fp.getKills(), !fp.isLiving()); + de.steamwar.sql.FightPlayer.create(fightId, fp.getUser().getId(), fp.getTeam().isBlue(), fp.getKit().getName(), fp.getKills(), !fp.isLiving()); } }