package tc.oc.lobby.bukkit.gizmos.launcher;
import org.bukkit.*;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.util.Vector;
import tc.oc.commons.bukkit.util.OnlinePlayerMapAdapter;
import tc.oc.lobby.bukkit.Lobby;
import tc.oc.lobby.bukkit.gizmos.Gizmo;
import tc.oc.lobby.bukkit.gizmos.Gizmos;
public class LauncherGizmo extends Gizmo implements Listener {
private final OnlinePlayerMapAdapter<Firework> launchedPlayers = new OnlinePlayerMapAdapter<>(Lobby.get());
private static final Color[] AMERICA_COLORS = {Color.RED, Color.WHITE, Color.BLUE};
public LauncherGizmo(String name, String prefix, String description, Material icon, int cost) {
super(name, prefix, description, icon, cost);
this.launchedPlayers.enable();
}
@Override
protected void initialize() {
Bukkit.getPluginManager().registerEvents(this, Lobby.get());
}
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
if (!(Gizmos.gizmoMap.get(player) instanceof LauncherGizmo)) return;
if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) return;
if (player.getItemInHand().getType() != this.getIcon()) return;
Firework oldFirework = this.launchedPlayers.get(player);
if (oldFirework == null || oldFirework.isDead()) {
Firework firework = this.buildFirework(player.getLocation());
firework.setPassenger(player);
this.launchedPlayers.put(player, firework);
}
}
private Firework buildFirework(Location loc) {
Firework firework = (Firework) loc.getWorld().spawnEntity(loc, EntityType.FIREWORK);
FireworkMeta fwm = firework.getFireworkMeta();
fwm.addEffect(FireworkEffect.builder()
.withColor(AMERICA_COLORS)
.with(FireworkEffect.Type.STAR)
.withTrail()
.withFade(AMERICA_COLORS)
.build());
firework.setFireworkMeta(fwm);
firework.setVelocity(loc.getDirection().divide(new Vector(2, 1, 2)));
return firework;
}
}