diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/Bloodmoon.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/Bloodmoon.java index bdc3976..f025005 100644 --- a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/Bloodmoon.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/Bloodmoon.java @@ -34,7 +34,6 @@ import java.util.concurrent.ThreadLocalRandom; @SuppressWarnings("FieldCanBeLocal") public class Bloodmoon extends Appliance { // für alle Dimensionen? einstellbar machen? - // TODO: Bossbar muss kleiner werden public final Map> affectedMobEffectMap = Map.of( EntityType.ZOMBIE, Set.of( @@ -91,6 +90,7 @@ public class Bloodmoon extends Appliance { EntityType.SPIDER ); private final Map hordeSpawnTasks = new HashMap<>(); + private long lastBloodmoonStartTick = 0; public final int ticksPerDay = 24000; public final int bloodmoonLength = ticksPerDay/2; private final int bloodmoonFreeDaysAtStart = 3; @@ -115,7 +115,8 @@ public class Bloodmoon extends Appliance { return this.isActive; } - public void startBloodmoon() { + public void startBloodmoon(long startTick) { + this.lastBloodmoonStartTick = startTick; this.isActive = true; Bukkit.getOnlinePlayers().forEach(this::addPlayerToBossBar); this.startHordeSpawning(this.getRandomHordeSpawnDelay()); @@ -128,6 +129,14 @@ public class Bloodmoon extends Appliance { this.sendStopMessages(); } + public void updateBossBar() { + long tick = Bukkit.getWorlds().getFirst().getFullTime(); + long sinceStart = tick - this.lastBloodmoonStartTick; + float progress = 1f - ((float) sinceStart / this.bloodmoonLength); + if(progress < 0) progress = 1f; + this.bossBar.progress(progress); + } + public boolean isStartTick(long tick) { long day = tick / this.ticksPerDay; if(day % this.bloodmoonDayInterval != 0 || day - this.bloodmoonFreeDaysAtStart <= 0) return false; @@ -150,8 +159,7 @@ public class Bloodmoon extends Appliance { Main.instance(), () -> { if(!this.bloodmoonIsActive()) return; - // TODO: Nur für den speziellen Spieler - this.spawnRandomHorde(); + this.spawnRandomHorde(player); this.startHordeSpawning(this.getRandomHordeSpawnDelay(), player); }, delay @@ -176,15 +184,10 @@ public class Bloodmoon extends Appliance { ); } - public void spawnRandomHorde() { - if(Bukkit.getOnlinePlayers().isEmpty()) return; + public void spawnRandomHorde(Player player) { if(!this.hordesEnabled) return; - List onlinePlayerList = Bukkit.getOnlinePlayers().stream() - .filter(this::getBloodmoonSetting) - .filter(player -> player.getGameMode().equals(GameMode.SURVIVAL)) - .toList(); + if(!player.getGameMode().equals(GameMode.SURVIVAL)) return; ThreadLocalRandom random = ThreadLocalRandom.current(); - Player player = onlinePlayerList.get(random.nextInt(onlinePlayerList.size())); EntityType hordeEntityType = this.hordeMobList.get(random.nextInt(this.hordeMobList.size())); int hordeSize = random.nextInt(this.hordeMinPopulation, this.hordeMaxPopulation + 1); this.spawnHorde(player, hordeSize, hordeEntityType); diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/commands/BloodmoonCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/commands/BloodmoonCommand.java index 30540ad..42a788c 100644 --- a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/commands/BloodmoonCommand.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/commands/BloodmoonCommand.java @@ -23,7 +23,7 @@ public class BloodmoonCommand extends ApplianceCommand { switch(args[0]) { case "start": { - this.getAppliance().startBloodmoon(); + this.getAppliance().startBloodmoon(0L); sender.sendMessage("Started bloodmoon."); break; } diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/listener/BloodmoonTimeListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/listener/BloodmoonTimeListener.java index 13325e3..374d1e2 100644 --- a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/listener/BloodmoonTimeListener.java +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/bloodmoon/listener/BloodmoonTimeListener.java @@ -9,19 +9,21 @@ import org.bukkit.event.EventHandler; public class BloodmoonTimeListener extends ApplianceListener { @EventHandler public void onServerTick(ServerTickStartEvent event) { - if(this.getAppliance().isStartTick(Bukkit.getWorlds().getFirst().getFullTime())) { - this.getAppliance().startBloodmoon(); + long currentTime = Bukkit.getWorlds().getFirst().getFullTime(); + if(this.getAppliance().isStartTick(currentTime)) { + this.getAppliance().startBloodmoon(currentTime); return; } - if(this.getAppliance().isStartTick(Bukkit.getWorlds().getFirst().getFullTime() - this.getAppliance().bloodmoonLength)) { + if(this.getAppliance().isStartTick(currentTime - this.getAppliance().bloodmoonLength)) { this.getAppliance().stopBloodmoon(); return; } - if(this.getAppliance().isStartTick(Bukkit.getWorlds().getFirst().getFullTime() + this.getAppliance().ticksPerDay)) { + this.getAppliance().updateBossBar(); + if(this.getAppliance().isStartTick(currentTime + this.getAppliance().ticksPerDay)) { this.getAppliance().sendAnnouncementMessages(); return; } - if(this.getAppliance().isStartTick(Bukkit.getWorlds().getFirst().getFullTime() + 1000)) { + if(this.getAppliance().isStartTick(currentTime + 1000)) { this.getAppliance().sendPreStartMessages(); } }