package be.isach.ultracosmetics.cosmetics.gadgets;
import be.isach.ultracosmetics.UltraCosmetics;
import be.isach.ultracosmetics.player.UltraPlayer;
import be.isach.ultracosmetics.cosmetics.type.GadgetType;
import be.isach.ultracosmetics.util.*;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.List;
/**
* Represents an instance of a smashdown gadget summoned by a player.
*
* @author iSach
* @since 08-08-2015
*/
public class GadgetSmashDown extends Gadget {
private boolean active = false;
private List<FallingBlock> fallingBlocks = new ArrayList<>();
private int i = 1;
private boolean playEffect;
public GadgetSmashDown(UltraPlayer owner, UltraCosmetics ultraCosmetics) {
super(owner, GadgetType.SMASHDOWN, ultraCosmetics);
}
@Override
void onRightClick() {
SoundUtil.playSound(getPlayer().getLocation(), Sounds.FIREWORK_LAUNCH, 2.0f, 1.0f);
getPlayer().setVelocity(new Vector(0, 3, 0));
final int taskId = Bukkit.getScheduler().runTaskTimer(getUltraCosmetics(), () -> {
if (getOwner() != null && getPlayer() != null && isEquipped()) {
UtilParticles.display(Particles.CLOUD, getPlayer().getLocation());
} else {
cancel();
}
}, 0, 1).getTaskId();
Bukkit.getScheduler().runTaskLater(getUltraCosmetics(), () -> {
if (getOwner() != null && getPlayer() != null && isEquipped()) {
Bukkit.getScheduler().cancelTask(taskId);
getOwner().applyVelocity(new Vector(0, -3, 0));
active = true;
}
}, 25);
}
@Override
void onLeftClick() {
}
@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (active && event.getEntity() == getPlayer()) {
event.setCancelled(true);
}
}
@Override
public void onUpdate() {
if (active && getPlayer().isOnGround()) {
this.playEffect = true;
Bukkit.getScheduler().runTaskLaterAsynchronously(getUltraCosmetics(), () -> {
active = false;
}, 5);
return;
}
if (!playEffect) {
return;
}
Location loc = getPlayer().getLocation();
SoundUtil.playSound(getPlayer().getLocation(), Sounds.EXPLODE, 2.0f, 1.0f);
if (i == 5) {
playEffect = false;
active = false;
i = 1;
return;
}
if (getOwner().getCurrentGadget() != this) {
playEffect = false;
active = false;
return;
}
for (Block b : BlockUtils.getBlocksInRadius(loc.clone().add(0, -1, 0), i, true)) {
if (b.getLocation().getBlockY() == loc.getBlockY() - 1) {
if (b.getType() != Material.AIR
&& b.getType() != Material.SIGN_POST
&& b.getType() != Material.CHEST
&& b.getType() != Material.STONE_PLATE
&& b.getType() != Material.WOOD_PLATE
&& b.getType() != Material.WALL_SIGN
&& b.getType() != Material.WALL_BANNER
&& b.getType() != Material.STANDING_BANNER
&& b.getType() != Material.CROPS
&& b.getType() != Material.LONG_GRASS
&& b.getType() != Material.SAPLING
&& b.getType() != Material.DEAD_BUSH
&& b.getType() != Material.RED_ROSE
&& b.getType() != Material.RED_MUSHROOM
&& b.getType() != Material.BROWN_MUSHROOM
&& b.getType() != Material.TORCH
&& b.getType() != Material.LADDER
&& b.getType() != Material.VINE
&& b.getType() != Material.DOUBLE_PLANT
&& b.getType() != Material.PORTAL
&& b.getType() != Material.CACTUS
&& b.getType() != Material.WATER
&& b.getType() != Material.STATIONARY_WATER
&& b.getType() != Material.LAVA
&& b.getType() != Material.STATIONARY_LAVA
&& !BlockUtils.isRocketBlock(b)
&& !BlockUtils.isTreasureChestBlock(b)
&& b.getType().isSolid()
&& b.getType().getId() != 43
&& b.getType().getId() != 44
&& b.getRelative(BlockFace.UP).getType() == Material.AIR) {
Bukkit.getScheduler().runTask(getUltraCosmetics(), () -> {
FallingBlock fb = loc.getWorld().spawnFallingBlock(b.getLocation().clone().add(0, 1.1f, 0),
b.getType(), b.getData());
fb.setVelocity(new Vector(0, 0.3f, 0));
fb.setDropItem(false);
fallingBlocks.add(fb);
fb.getNearbyEntities(1, 1, 1).stream().filter(ent -> ent != getPlayer()
&& ent.getType() != EntityType.FALLING_BLOCK).filter(ent -> affectPlayers).
forEach(ent -> MathUtils.applyVelocity(ent, new Vector(0, 0.5, 0)));
});
}
}
}
i++;
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockChangeState(EntityChangeBlockEvent event) {
if (fallingBlocks.contains(event.getEntity())) {
event.setCancelled(true);
fallingBlocks.remove(event.getEntity());
FallingBlock fb = (FallingBlock) event.getEntity();
Particles.BLOCK_CRACK.display(new Particles.BlockData(Material.getMaterial(fb.getBlockId()), fb.getBlockData()), 0f, 0f, 0f, 0.4f, 50, fb.getLocation(), 128);
SoundUtil.playSound(getPlayer().getLocation(), Sounds.ANVIL_BREAK, 0.05f, 1.0f);
event.getEntity().remove();
}
}
@Override
public void onClear() {
for (FallingBlock block : fallingBlocks) {
block.remove();
}
}
}