package nmt.minecraft.Regicide.Game.Scheduling;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.Location;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.scheduler.BukkitRunnable;
import nmt.minecraft.Regicide.RegicidePlugin;
import nmt.minecraft.Regicide.Game.RegicideGame;
import nmt.minecraft.Regicide.Game.Player.RPlayer;
public class EndGameCinematic extends BukkitRunnable {
private List<Player> players;
private RegicideGame game;
private class KeepStill extends BukkitRunnable {
private long index;
private static final long heldTime = 200;
private static final int fireworkInterval = 30;
public KeepStill() {
index = 0;
if (players.size() > 3)
for (int i = 3; i < players.size(); i++) {
int j = 3;
for (; j < players.size(); j++) {
if (i == j) {
continue;
}
players.get(i).hidePlayer(players.get(j));
}
}
this.runTaskTimer(RegicidePlugin.regicidePlugin, 0, 1);
}
public void run() {
if (players.isEmpty()) {
return;
}
// PotionEffect inst = new PotionEffect(PotionEffectType.SLOW, 10, 100);
// players.get(0).addPotionEffect(inst);
// if (players.size() > 1)
// players.get(1).addPotionEffect(inst);
// if (players.size() > 2)
// players.get(2).addPotionEffect(inst);
Player cache;
Location locc;
//Teleport 1st Place winner
cache = players.get(0);
locc = cache.getLocation().clone();
locc.setX(game.getFirstPlace().getX());
locc.setY(game.getFirstPlace().getY());
locc.setZ(game.getFirstPlace().getZ());
cache.teleport(locc);
//If there is a second place winner, teleport the player.
if (players.size() >= 2) {
cache = players.get(1);
locc = cache.getLocation().clone();
locc.setX(game.getSecondPlace().getX());
locc.setY(game.getSecondPlace().getY());
locc.setZ(game.getSecondPlace().getZ());
cache.teleport(locc);
}
//If there is a third place winner, teleport the player.
if (players.size() >= 3)
{
cache = players.get(2);
locc = cache.getLocation().clone();
locc.setX(game.getThirdPlace().getX());
locc.setY(game.getThirdPlace().getY());
locc.setZ(game.getThirdPlace().getZ());
cache.teleport(locc);
}
this.index++;
if (index >= heldTime) {
new FinalPositions().run();
this.cancel();
return;
}
if (index % fireworkInterval == 0) {
launchFireworks(game.getFirstPlace());
launchFireworks(game.getSecondPlace());
launchFireworks(game.getThirdPlace());
}
}
private void launchFireworks(Location locPoint) {
Firework firework = locPoint.getWorld().spawn(locPoint, Firework.class);
FireworkMeta fm = firework.getFireworkMeta();
fm.addEffect(FireworkEffect.builder()
.flicker(false)
.trail(true)
.with(Type.BALL)
.with(Type.BALL_LARGE)
.with(Type.STAR)
.withColor(Color.YELLOW)
.withColor(Color.ORANGE)
.withFade(Color.RED)
.withFade(Color.PURPLE)
.build());
fm.setPower(1);
firework.setFireworkMeta(fm);
}
}
private class FinalPositions extends BukkitRunnable {
public void run() {
if (players.isEmpty()) {
return;
}
if (players.size() > 3)
for (int i = 3; i < players.size(); i++) {
int j = 3;
for (; j < players.size(); j++) {
if (i == j) {
continue;
}
players.get(i).showPlayer(players.get(j));
}
}
for (Player player : players) {
player.teleport(game.getExitLocation());
player.getPlayer().getActivePotionEffects().clear();
}
}
}
/**
* Created the cinematic and runs it. The palyer list should be sorted!!
* @param participants
*/
public EndGameCinematic(RegicideGame game, List<RPlayer> participants) {
this.players = new LinkedList<Player>();
this.game = game;
if (participants.isEmpty()) {
return;
}
for (RPlayer p : participants) {
players.add(p.getPlayer());
}
}
public void run() {
//teleport first, second, and third places
if (players.isEmpty()) {
return;
}
players.get(0).teleport(game.getFirstPlace());
if (players.size() >= 2) {
players.get(1).teleport(game.getSecondPlace());
}
if (players.size() >= 3)
{
players.get(2).teleport(game.getThirdPlace());
}
//teleport rest of people to other location
if (players.size() >= 4) {
for(int i = 3; i < players.size(); i++) {
players.get(i).teleport(game.getOtherPlace());
}
}
new KeepStill();
}
}