develop-bloodmoon #10

Merged
MineTec merged 17 commits from develop-bloodmoon into master 2025-11-23 14:03:07 +00:00
3 changed files with 22 additions and 17 deletions
Showing only changes of commit b8725bc0f2 - Show all commits

View File

@@ -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<EntityType, Set<MobEffect>> affectedMobEffectMap = Map.of(
EntityType.ZOMBIE, Set.of(
@@ -91,6 +90,7 @@ public class Bloodmoon extends Appliance {
EntityType.SPIDER
);
private final Map<Player, @Nullable BukkitTask> 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<? extends Player> 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);

View File

@@ -23,7 +23,7 @@ public class BloodmoonCommand extends ApplianceCommand<Bloodmoon> {
switch(args[0]) {
case "start": {
this.getAppliance().startBloodmoon();
this.getAppliance().startBloodmoon(0L);
sender.sendMessage("Started bloodmoon.");
break;
}

View File

@@ -9,19 +9,21 @@ import org.bukkit.event.EventHandler;
public class BloodmoonTimeListener extends ApplianceListener<Bloodmoon> {
@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();
}
}