added countdown and sounds
This commit is contained in:
@@ -9,6 +9,7 @@ import eu.mhsl.craftattack.spawn.event.appliances.deathrun.listeners.DeathrunPor
|
|||||||
import eu.mhsl.craftattack.spawn.event.appliances.eventController.Event;
|
import eu.mhsl.craftattack.spawn.event.appliances.eventController.Event;
|
||||||
import eu.mhsl.craftattack.spawn.event.appliances.eventController.Scorable;
|
import eu.mhsl.craftattack.spawn.event.appliances.eventController.Scorable;
|
||||||
import eu.mhsl.craftattack.spawn.event.appliances.eventController.scoreboard.EventScoreboardBuilder;
|
import eu.mhsl.craftattack.spawn.event.appliances.eventController.scoreboard.EventScoreboardBuilder;
|
||||||
|
import net.kyori.adventure.sound.Sound;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
import net.kyori.adventure.title.Title;
|
import net.kyori.adventure.title.Title;
|
||||||
@@ -28,7 +29,7 @@ import java.util.UUID;
|
|||||||
@Appliance.Flags(autoload = false)
|
@Appliance.Flags(autoload = false)
|
||||||
public class Deathrun extends Appliance implements Event, Scorable {
|
public class Deathrun extends Appliance implements Event, Scorable {
|
||||||
private final EventScoreboardBuilder scoreboardBuilder = new EventScoreboardBuilder(this, 3, 2, 3);
|
private final EventScoreboardBuilder scoreboardBuilder = new EventScoreboardBuilder(this, 3, 2, 3);
|
||||||
private final double borderDistance = 75;
|
private final double borderDistance = 100;
|
||||||
private final int borderVisibilityDistance = 8;
|
private final int borderVisibilityDistance = 8;
|
||||||
private long durationSeconds;
|
private long durationSeconds;
|
||||||
private boolean isBeforeStart = true;
|
private boolean isBeforeStart = true;
|
||||||
@@ -81,15 +82,25 @@ public class Deathrun extends Appliance implements Event, Scorable {
|
|||||||
// TODO: Soll PvP überhaupt aktiviert werden? Soll Respawn erlaubt sein?
|
// TODO: Soll PvP überhaupt aktiviert werden? Soll Respawn erlaubt sein?
|
||||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||||
player.showTitle(title);
|
player.showTitle(title);
|
||||||
player.sendMessage(Component.text("PvP wird in 10 Minuten aktiviert!", NamedTextColor.GOLD));
|
player.sendMessage(Component.text("Start! Laufe Richtung Osten (positiv x)!", NamedTextColor.YELLOW));
|
||||||
});
|
});
|
||||||
|
Bukkit.getScheduler().runTaskLater(
|
||||||
|
Main.instance(),
|
||||||
|
() -> Bukkit.getOnlinePlayers().forEach(player ->
|
||||||
|
player.sendMessage(Component.text("PvP wird in 10 Minuten aktiviert!", NamedTextColor.GOLD))
|
||||||
|
),
|
||||||
|
Ticks.TICKS_PER_SECOND * 5
|
||||||
|
);
|
||||||
|
|
||||||
this.world.getWorldBorder().setSize(this.world.getWorldBorder().getMaxSize());
|
this.world.getWorldBorder().setSize(this.world.getWorldBorder().getMaxSize());
|
||||||
this.pvpTask = Bukkit.getScheduler().runTaskLater(
|
this.pvpTask = Bukkit.getScheduler().runTaskLater(
|
||||||
Main.instance(),
|
Main.instance(),
|
||||||
() -> {
|
() -> {
|
||||||
this.pvpDisabled = false;
|
this.pvpDisabled = false;
|
||||||
Bukkit.getOnlinePlayers().forEach(player -> player.sendMessage(Component.text("PvP ist jetzt aktiviert!", NamedTextColor.GOLD)));
|
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||||
|
player.sendMessage(Component.text("PvP ist jetzt aktiviert!", NamedTextColor.GOLD));
|
||||||
|
player.playSound(Sound.sound(org.bukkit.Sound.ENTITY_EXPERIENCE_ORB_PICKUP, Sound.Source.MASTER, 500f, 2f));
|
||||||
|
});
|
||||||
},
|
},
|
||||||
Ticks.TICKS_PER_SECOND * 60 * 10
|
Ticks.TICKS_PER_SECOND * 60 * 10
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand;
|
|||||||
import eu.mhsl.craftattack.spawn.core.util.IteratorUtil;
|
import eu.mhsl.craftattack.spawn.core.util.IteratorUtil;
|
||||||
import eu.mhsl.craftattack.spawn.core.util.entity.PlayerUtils;
|
import eu.mhsl.craftattack.spawn.core.util.entity.PlayerUtils;
|
||||||
import eu.mhsl.craftattack.spawn.core.util.server.PluginMessage;
|
import eu.mhsl.craftattack.spawn.core.util.server.PluginMessage;
|
||||||
|
import eu.mhsl.craftattack.spawn.core.util.text.ComponentUtil;
|
||||||
|
import eu.mhsl.craftattack.spawn.core.util.text.Countdown;
|
||||||
import eu.mhsl.craftattack.spawn.event.appliances.eventController.commands.BigEventCommand;
|
import eu.mhsl.craftattack.spawn.event.appliances.eventController.commands.BigEventCommand;
|
||||||
import eu.mhsl.craftattack.spawn.event.appliances.eventController.commands.JoinCraftattackCommand;
|
import eu.mhsl.craftattack.spawn.event.appliances.eventController.commands.JoinCraftattackCommand;
|
||||||
import net.kyori.adventure.sound.Sound;
|
import net.kyori.adventure.sound.Sound;
|
||||||
@@ -27,6 +29,13 @@ public class EventController extends Appliance {
|
|||||||
private List<Appliance> eventAppliances = null;
|
private List<Appliance> eventAppliances = null;
|
||||||
private Event selectedEvent = null;
|
private Event selectedEvent = null;
|
||||||
private int timerTaskId = -1;
|
private int timerTaskId = -1;
|
||||||
|
private long durationMinutes;
|
||||||
|
private final Countdown countdown = new Countdown(
|
||||||
|
10,
|
||||||
|
this::format,
|
||||||
|
this::announce,
|
||||||
|
this::startEvent
|
||||||
|
);
|
||||||
|
|
||||||
private final Map<GameRule<Boolean>, Boolean> gameRulesAfterStart = Map.ofEntries(
|
private final Map<GameRule<Boolean>, Boolean> gameRulesAfterStart = Map.ofEntries(
|
||||||
entry(GameRule.DO_DAYLIGHT_CYCLE, true),
|
entry(GameRule.DO_DAYLIGHT_CYCLE, true),
|
||||||
@@ -72,6 +81,36 @@ public class EventController extends Appliance {
|
|||||||
this.selectedEvent = null;
|
this.selectedEvent = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void scheduleStart(long durationMinutes) {
|
||||||
|
if(this.selectedEvent == null) throw new ApplianceCommand.Error("There is no event selected!");
|
||||||
|
this.durationMinutes = durationMinutes;
|
||||||
|
this.countdown.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancelStart() {
|
||||||
|
this.countdown.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Component format(Countdown.AnnouncementData data) {
|
||||||
|
return Component.text()
|
||||||
|
.append(ComponentUtil.createRainbowText(this.selectedEvent.getClass().getSimpleName(), 10))
|
||||||
|
.append(Component.text(" startet in ", NamedTextColor.GOLD))
|
||||||
|
.append(Component.text(data.count(), NamedTextColor.AQUA))
|
||||||
|
.append(Component.text(" " + data.unit() + "!", NamedTextColor.GOLD))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void announce(Component message) {
|
||||||
|
IteratorUtil.onlinePlayers(player -> {
|
||||||
|
player.sendMessage(message);
|
||||||
|
player.playSound(Sound.sound(org.bukkit.Sound.ENTITY_EXPERIENCE_ORB_PICKUP, Sound.Source.MASTER, 500f, 1f));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startEvent() {
|
||||||
|
this.startEvent(this.durationMinutes);
|
||||||
|
}
|
||||||
|
|
||||||
public void startEvent(long durationMinutes) {
|
public void startEvent(long durationMinutes) {
|
||||||
if(this.selectedEvent == null) throw new ApplianceCommand.Error("There is no event selected!");
|
if(this.selectedEvent == null) throw new ApplianceCommand.Error("There is no event selected!");
|
||||||
IteratorUtil.worlds(world -> IteratorUtil.setGameRules(this.gameRulesAfterStart, false));
|
IteratorUtil.worlds(world -> IteratorUtil.setGameRules(this.gameRulesAfterStart, false));
|
||||||
|
|||||||
@@ -35,12 +35,12 @@ public class BigEventCommand extends ApplianceCommand<EventController> {
|
|||||||
}
|
}
|
||||||
case "start": {
|
case "start": {
|
||||||
if(args.length == 1) {
|
if(args.length == 1) {
|
||||||
this.getAppliance().startEvent(60 * 2);
|
this.getAppliance().scheduleStart(60 * 2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(args.length == 2) {
|
if(args.length == 2) {
|
||||||
try {
|
try {
|
||||||
this.getAppliance().startEvent(Long.parseLong(args[1]));
|
this.getAppliance().scheduleStart(Long.parseLong(args[1]));
|
||||||
} catch(NumberFormatException e) {
|
} catch(NumberFormatException e) {
|
||||||
throw new Error("Last argument has to be a long.");
|
throw new Error("Last argument has to be a long.");
|
||||||
}
|
}
|
||||||
@@ -48,6 +48,7 @@ public class BigEventCommand extends ApplianceCommand<EventController> {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "stop": {
|
case "stop": {
|
||||||
|
this.getAppliance().cancelStart();
|
||||||
this.getAppliance().stopEvent();
|
this.getAppliance().stopEvent();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user