Add all the mechanics to the win effects

This commit is contained in:
LCastr0 2017-05-03 22:05:54 -03:00
parent 4e56d2133b
commit bbfa632106
6 changed files with 372 additions and 20 deletions

View File

@ -1,14 +1,39 @@
package mineplex.core.gadget.gadgets.wineffect.rankrooms.rankwineffects;
import org.bukkit.Bukkit;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Guardian;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.EventHandler;
import org.bukkit.util.Vector;
import mineplex.core.common.MaterialData;
import mineplex.core.common.Rank;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.disguise.disguises.DisguisePlayer;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.gadgets.wineffect.rankrooms.WinEffectRankBased;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class WinEffectRankEternal extends WinEffectRankBased
{
private DisguisePlayer _npc;
private Guardian _guardian = null;
private int _step = 0;
private static final int POINTS = 100;
private static final float RADIUS = 15F;
private static final int BLOCK_RADIUS = 5;
public WinEffectRankEternal(GadgetManager manager)
{
super(manager, Rank.ETERNAL, WinEffectType.RANK_WIN_EFFECT);
@ -17,13 +42,82 @@ public class WinEffectRankEternal extends WinEffectRankBased
@Override
public void play()
{
Bukkit.broadcastMessage("Playing effect win effect eternal: " + getName());
Location loc = getBaseLocation();
loc.setDirection(_player.getLocation().subtract(loc).toVector().multiply(-1));
_npc = getNPC(getPlayer(), loc, true);
}
@Override
public void finish()
{
Bukkit.broadcastMessage("Playing effect win effect eternal: " + getName());
if (_guardian != null)
{
_guardian.remove();
_guardian = null;
}
_step = 0;
}
@EventHandler
public void onUpdate(UpdateEvent event)
{
if (!isRunning())
return;
if (event.getType() != UpdateType.FASTEST)
return;
Location npcLocation = _npc.getEntity().getBukkitEntity().getLocation();
if (_guardian == null)
{
_guardian = npcLocation.getWorld().spawn(npcLocation.add(0, 20, 0), Guardian.class);
}
double increment = (2 * Math.PI) / POINTS;
double angle = _step * increment;
Vector vector = new Vector(Math.cos(angle) * RADIUS, 0, Math.sin(angle) * RADIUS);
_guardian.setVelocity(new Vector(0,0,0));
_guardian.teleport(_player.getLocation().clone().add(vector));
Vector direction = npcLocation.toVector().subtract(_guardian.getEyeLocation().toVector());
Location enderLocation = _guardian.getLocation().setDirection(direction);
_guardian.teleport(enderLocation);
_step++;
if (_step % 2 == 0)
zap();
if (_step == 25)
{
breakBlocks();
}
}
private void zap()
{
if (_guardian != null)
{
_guardian.setTarget((LivingEntity) _npc.getEntity().getBukkitEntity());
}
}
private void breakBlocks()
{
Set<Block> blocks = UtilBlock.getBlocksInRadius(_npc.getEntity().getBukkitEntity().getLocation(), BLOCK_RADIUS, BLOCK_RADIUS);
for (Block block : blocks)
{
MaterialData materialData = MaterialData.of(block.getType(), block.getData());
block.setType(Material.AIR);
FallingBlock fallingBlock = block.getLocation().getWorld().spawnFallingBlock(block.getLocation(), materialData.getMaterial(), materialData.getData());
fallingBlock.setDropItem(false);
UtilAction.velocity(fallingBlock, UtilAlg.getTrajectory(fallingBlock.getLocation(), _npc.getEntity().getBukkitEntity().getLocation()).multiply(-1), .75, true, 0.8, 0, 1.0, true);
}
ArmorStand armorStand = (ArmorStand) _npc.getEntity().getBukkitEntity();
armorStand.setHealth(0);
}
}

View File

@ -1,14 +1,39 @@
package mineplex.core.gadget.gadgets.wineffect.rankrooms.rankwineffects;
import org.bukkit.Bukkit;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEnderDragon;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.FallingBlock;
import org.bukkit.event.EventHandler;
import org.bukkit.util.Vector;
import mineplex.core.common.MaterialData;
import mineplex.core.common.Rank;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.disguise.disguises.DisguisePlayer;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.gadgets.wineffect.rankrooms.WinEffectRankBased;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class WinEffectRankHero extends WinEffectRankBased
{
private DisguisePlayer _npc;
private EnderDragon _enderDragon = null;
private int _step = 0;
private static final int POINTS = 100;
private static final float RADIUS = 15F;
private static final int BLOCK_RADIUS = 5;
public WinEffectRankHero(GadgetManager manager)
{
super(manager, Rank.HERO, WinEffectType.RANK_WIN_EFFECT);
@ -17,13 +42,82 @@ public class WinEffectRankHero extends WinEffectRankBased
@Override
public void play()
{
Bukkit.broadcastMessage("Playing effect win effect hero: " + getName());
Location loc = getBaseLocation();
loc.setDirection(_player.getLocation().subtract(loc).toVector().multiply(-1));
_npc = getNPC(getPlayer(), loc, true);
}
@Override
public void finish()
{
Bukkit.broadcastMessage("Playing effect win effect hero: " + getName());
if (_enderDragon != null)
{
_enderDragon.remove();
_enderDragon = null;
}
_step = 0;
}
@EventHandler
public void onUpdate(UpdateEvent event)
{
if (!isRunning())
return;
if (_step > 70)
return;
if (_step == 70)
{
breakBlocks();
}
if (event.getType() != UpdateType.FASTEST)
return;
Location npcLocation = _npc.getEntity().getBukkitEntity().getLocation();
if (_enderDragon == null)
{
_enderDragon = npcLocation.getWorld().spawn(npcLocation.add(0, 20, 0), EnderDragon.class);
}
double increment = (2 * Math.PI) / POINTS;
double angle = _step * increment;
Vector vector = new Vector(Math.cos(angle) * RADIUS, 0, Math.sin(angle) * RADIUS);
_enderDragon.setVelocity(new Vector(0,0,0));
_enderDragon.teleport(_player.getLocation().clone().add(vector));
Vector direction = npcLocation.toVector().subtract(_enderDragon.getEyeLocation().toVector()).multiply(-1);
Location enderLocation = _enderDragon.getLocation().setDirection(direction);
_enderDragon.teleport(enderLocation);
_step++;
if (_step >= 50)
setTarget();
}
private void setTarget()
{
((CraftEnderDragon) _enderDragon).getHandle().setTargetBlock(_baseLocation.getBlockX(), _baseLocation.getBlockY(), _baseLocation.getBlockZ());
}
private void breakBlocks()
{
Set<Block> blocks = UtilBlock.getBlocksInRadius(_baseLocation.add(0, 1, 0), BLOCK_RADIUS, BLOCK_RADIUS);
for (Block block : blocks)
{
MaterialData materialData = MaterialData.of(block.getType(), block.getData());
block.setType(Material.AIR);
FallingBlock fallingBlock = block.getLocation().getWorld().spawnFallingBlock(block.getLocation(), materialData.getMaterial(), materialData.getData());
fallingBlock.setDropItem(false);
UtilAction.velocity(fallingBlock, UtilAlg.getTrajectory(fallingBlock.getLocation(), _npc.getEntity().getBukkitEntity().getLocation()).multiply(-1), .75, true, 0.8, 0, 1.0, true);
}
ArmorStand armorStand = (ArmorStand) _npc.getEntity().getBukkitEntity();
armorStand.setHealth(0);
}
}

View File

@ -1,14 +1,39 @@
package mineplex.core.gadget.gadgets.wineffect.rankrooms.rankwineffects;
import org.bukkit.Bukkit;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Wither;
import org.bukkit.entity.WitherSkull;
import org.bukkit.event.EventHandler;
import org.bukkit.util.Vector;
import mineplex.core.common.MaterialData;
import mineplex.core.common.Rank;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.disguise.disguises.DisguisePlayer;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.gadgets.wineffect.rankrooms.WinEffectRankBased;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class WinEffectRankLegend extends WinEffectRankBased
{
private DisguisePlayer _npc;
private Wither _wither = null;
private int _step = 0;
private static final int POINTS = 100;
private static final float RADIUS = 15F;
private static final int BLOCK_RADIUS = 5;
public WinEffectRankLegend(GadgetManager manager)
{
super(manager, Rank.LEGEND, WinEffectType.RANK_WIN_EFFECT);
@ -17,13 +42,80 @@ public class WinEffectRankLegend extends WinEffectRankBased
@Override
public void play()
{
Bukkit.broadcastMessage("Playing effect win effect legend: " + getName());
Location loc = getBaseLocation();
loc.setDirection(_player.getLocation().subtract(loc).toVector().multiply(-1));
_npc = getNPC(getPlayer(), loc, true);
}
@Override
public void finish()
{
Bukkit.broadcastMessage("Playing effect win effect legend: " + getName());
if (_wither != null)
{
_wither.remove();
_wither = null;
}
_step = 0;
}
@EventHandler
public void onUpdate(UpdateEvent event)
{
if (!isRunning())
return;
if (event.getType() != UpdateType.FASTEST)
return;
Location npcLocation = _npc.getEntity().getBukkitEntity().getLocation();
if (_wither == null)
{
_wither = npcLocation.getWorld().spawn(npcLocation.add(0, 20, 0), Wither.class);
}
double increment = (2 * Math.PI) / POINTS;
double angle = _step * increment;
Vector vector = new Vector(Math.cos(angle) * RADIUS, 0, Math.sin(angle) * RADIUS);
_wither.setVelocity(new Vector(0,0,0));
_wither.teleport(_player.getLocation().clone().add(vector));
Vector direction = npcLocation.toVector().subtract(_wither.getEyeLocation().toVector());
Location enderLocation = _wither.getLocation().setDirection(direction);
_wither.teleport(enderLocation);
_step++;
if (_step % 5 == 0)
spawnSkull();
if (_step == 40)
breakBlocks();
}
private void spawnSkull()
{
if (_wither != null)
{
_wither.launchProjectile(WitherSkull.class);
}
}
private void breakBlocks()
{
Set<Block> blocks = UtilBlock.getBlocksInRadius(_npc.getEntity().getBukkitEntity().getLocation(), BLOCK_RADIUS, BLOCK_RADIUS);
for (Block block : blocks)
{
MaterialData materialData = MaterialData.of(block.getType(), block.getData());
block.setType(Material.AIR);
FallingBlock fallingBlock = block.getLocation().getWorld().spawnFallingBlock(block.getLocation(), materialData.getMaterial(), materialData.getData());
fallingBlock.setDropItem(false);
UtilAction.velocity(fallingBlock, UtilAlg.getTrajectory(fallingBlock.getLocation(), _npc.getEntity().getBukkitEntity().getLocation()).multiply(-1), .75, true, 0.8, 0, 1.0, true);
}
ArmorStand armorStand = (ArmorStand) _npc.getEntity().getBukkitEntity();
armorStand.setHealth(0);
}
}

View File

@ -1,14 +1,33 @@
package mineplex.core.gadget.gadgets.wineffect.rankrooms.rankwineffects;
import org.bukkit.Bukkit;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Giant;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageEvent;
import mineplex.core.common.MaterialData;
import mineplex.core.common.Rank;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.disguise.disguises.DisguisePlayer;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.gadgets.wineffect.rankrooms.WinEffectRankBased;
public class WinEffectRankTitan extends WinEffectRankBased
{
private DisguisePlayer _npc;
private Giant _giant = null;
private static final int RADIUS = 5;
public WinEffectRankTitan(GadgetManager manager)
{
super(manager, Rank.TITAN, WinEffectType.RANK_WIN_EFFECT);
@ -17,13 +36,48 @@ public class WinEffectRankTitan extends WinEffectRankBased
@Override
public void play()
{
Bukkit.broadcastMessage("Playing effect win effect titan: " + getName());
Location loc = getBaseLocation();
loc.setDirection(_player.getLocation().subtract(loc).toVector().multiply(-1));
_npc = getNPC(getPlayer(), loc);
_giant = loc.getWorld().spawn(loc.add(0, 20, 0), Giant.class);
}
@Override
public void finish()
{
Bukkit.broadcastMessage("Playing effect win effect titan: " + getName());
if (_giant != null)
{
_giant.remove();
_giant = null;
}
}
@EventHandler
public void onGiantFall(EntityDamageEvent event)
{
if (_giant == null)
return;
if (event.getCause().equals(EntityDamageEvent.DamageCause.FALL))
{
if (event.getEntity().equals(_giant))
{
Set<Block> blocks = UtilBlock.getBlocksInRadius(_npc.getEntity().getBukkitEntity().getLocation(), RADIUS, RADIUS);
for (Block block : blocks)
{
MaterialData materialData = MaterialData.of(block.getType(), block.getData());
block.setType(Material.AIR);
FallingBlock fallingBlock = block.getLocation().getWorld().spawnFallingBlock(block.getLocation(), materialData.getMaterial(), materialData.getData());
fallingBlock.setDropItem(false);
UtilAction.velocity(fallingBlock, UtilAlg.getTrajectory(fallingBlock.getLocation(), _npc.getEntity().getBukkitEntity().getLocation()).multiply(-1), .75, true, 0.8, 0, 1.0, true);
}
ArmorStand armorStand = (ArmorStand) _npc.getEntity().getBukkitEntity();
armorStand.setHealth(0);
}
}
}
}

View File

@ -5,10 +5,10 @@ import java.util.Set;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityExplodeEvent;
@ -17,7 +17,6 @@ import mineplex.core.common.Rank;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilServer;
import mineplex.core.disguise.disguises.DisguisePlayer;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.gadgets.wineffect.rankrooms.WinEffectRankBased;
@ -43,16 +42,11 @@ public class WinEffectRankUltra extends WinEffectRankBased
loc.setDirection(_player.getLocation().subtract(loc).toVector().multiply(-1));
loc.setPitch(0);
loc.setYaw(0);
_npc = getNPC(getPlayer(), loc);
_npc = getNPC(getPlayer(), loc, true);
_creeper = loc.getWorld().spawn(loc.add(loc.getDirection().multiply(-3)), Creeper.class);
_creeper.setPowered(true);
_creeper.setTarget((LivingEntity) _npc.getEntity().getBukkitEntity());
for (Player player : UtilServer.getPlayers())
{
player.teleport(_npc.getEntity().getBukkitEntity());
}
}
@Override
@ -76,6 +70,8 @@ public class WinEffectRankUltra extends WinEffectRankBased
fallingBlock.setDropItem(false);
UtilAction.velocity(fallingBlock, UtilAlg.getTrajectory(fallingBlock.getLocation(), _npc.getEntity().getBukkitEntity().getLocation()).multiply(-1), .75, true, 0.8, 0, 1.0, true);
}
ArmorStand armorStand = (ArmorStand) _npc.getEntity().getBukkitEntity();
armorStand.setHealth(0);
}
}

View File

@ -339,6 +339,28 @@ public abstract class WinEffectGadget extends Gadget
Manager.getDisguiseManager().disguise(disguise);
return disguise;
}
/**
* Get a disguised ArmorStand with the skin of the provided player at the provided location. The ArmorStand got 2048 health.
* @param player The player to create the disguise from
* @param loc The location to spawn the ArmorStand at
* @param gravity true if the armorstand should have gravity
* @return Returns a disguised ArmorStand at the given location
*/
public DisguisePlayer getNPC(Player player, Location loc, boolean gravity) {
ArmorStand stand = loc.getWorld().spawn(loc, ArmorStand.class);
stand.setMaxHealth(2048);
stand.setHealth(2048);
stand.setGravity(gravity);
GameProfile profile = new GameProfile(UUID.randomUUID(), player.getName());
profile.getProperties().putAll(((CraftPlayer) player).getHandle().getProfile().getProperties());
DisguisePlayer disguise = new DisguisePlayer(stand, profile);
Manager.getDisguiseManager().disguise(disguise);
return disguise;
}
/**
* Paste a schematic relative to the base location