ProjectAres/PGM/src/main/java/tc/oc/pgm/fireworks/ObjectivesFireworkListener....

100 lines
4.5 KiB
Java

package tc.oc.pgm.fireworks;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.geometry.Cuboid;
import tc.oc.commons.bukkit.util.BlockUtils;
import tc.oc.commons.bukkit.util.BukkitUtils;
import tc.oc.pgm.controlpoint.events.ControllerChangeEvent;
import tc.oc.pgm.core.CoreLeakEvent;
import tc.oc.pgm.destroyable.DestroyableDestroyedEvent;
import tc.oc.pgm.flag.event.FlagCaptureEvent;
import tc.oc.pgm.regions.Region;
import tc.oc.pgm.wool.PlayerWoolPlaceEvent;
public class ObjectivesFireworkListener implements Listener {
public void spawnFireworkDisplay(Location center, Color color, int count, double radius, int power) {
FireworkEffect effect = FireworkEffect.builder().with(Type.BURST)
.withFlicker()
.withColor(color)
.withFade(Color.BLACK)
.build();
for(int i = 0; i < count; i++) {
double angle = 2 * Math.PI / count * i;
double dx = radius * Math.cos(angle);
double dz = radius * Math.sin(angle);
Location baseLocation = center.clone().add(dx, 0, dz);
Block block = baseLocation.getBlock();
if(block == null || !block.getType().isOccluding()) {
FireworkUtil.spawnFirework(FireworkUtil.getOpenSpaceAbove(baseLocation), effect, power);
}
}
}
public void spawnFireworkDisplay(World world, Region region, Color color, int count, double radiusMultiplier, int power) {
final Cuboid bound = region.getBounds();
final double radius = bound.maximum().minus(bound.minimum()).times(0.5).length();
final Location center = bound.minimum().getMidpoint(bound.maximum()).toLocation(world);
this.spawnFireworkDisplay(center, color, count, radiusMultiplier * radius, power);
}
@EventHandler(priority = EventPriority.MONITOR)
public void onWoolPlace(final PlayerWoolPlaceEvent event) {
if(FireworksConfig.Goals.enabled() && event.getWool().isVisible()) {
this.spawnFireworkDisplay(BlockUtils.center(event.getBlock()),
event.getWool().getDyeColor().getColor(),
6, 2, 2);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onCoreLeak(final CoreLeakEvent event) {
if(FireworksConfig.Goals.enabled() && event.getCore().isVisible()) {
this.spawnFireworkDisplay(event.getMatch().getWorld(),
event.getCore().getCasingRegion(),
event.getCore().getColor(),
8, 1.5, 2);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onDestroyableBreak(final DestroyableDestroyedEvent event) {
if(FireworksConfig.Goals.enabled() && event.getDestroyable().isVisible()) {
this.spawnFireworkDisplay(event.getMatch().getWorld(),
event.getDestroyable().getBlockRegion(),
event.getDestroyable().getColor(),
4, 3, 2);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onHillCapture(final ControllerChangeEvent event) {
if(FireworksConfig.Goals.enabled() && event.getControlPoint().isVisible() && event.getNewController() != null) {
this.spawnFireworkDisplay(event.getMatch().getWorld(),
event.getControlPoint().getCaptureRegion(),
BukkitUtils.colorOf(event.getNewController().getColor()),
8, 1, 2);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onFlagCapture(final FlagCaptureEvent event) {
if(FireworksConfig.Goals.enabled() && event.getGoal().isVisible()) {
this.spawnFireworkDisplay(event.getMatch().getWorld(),
event.getNet().getRegion(),
event.getGoal().getDyeColor().getColor(),
6, 1, 2);
}
}
}