made bossbar shrink until end of bloodmoon, fixed horde spawning
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user