Mineplex/GOD DAMN COSMETICS/gadget/gadgets/item/ItemFreezeCannon.java

199 lines
5.7 KiB
Java
Raw Normal View History

package mineplex.core.gadget.gadgets.item;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import org.bukkit.Effect;
import org.bukkit.EntityEffect;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilText;
import mineplex.core.gadget.GadgetManager;
import mineplex.core.gadget.gadgets.Ammo;
import mineplex.core.gadget.types.ItemGadget;
import mineplex.core.projectile.IThrown;
import mineplex.core.projectile.ProjectileUser;
import mineplex.core.recharge.Recharge;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class ItemFreezeCannon extends ItemGadget implements IThrown
{
private HashMap<Player, Long> _playerMap = new HashMap<>();
public ItemFreezeCannon(GadgetManager manager)
{
super(manager, "Freeze Cannon",
UtilText.splitLineToArray(C.cWhite + "Let someone cool off inside their very own ice cube!", LineFormat.LORE),
-1,
Material.ICE, (byte) 0, 8000, new Ammo("Freeze Cannon", "100 Ice Blocks", Material.ICE, (byte) 0, new String[]
{
C.cWhite + "100 Ice Blocks for you to launch!"
}, -1, 1));
}
@Override
public void ActivateCustom(Player player)
{
Item item = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), new ItemStack(Material.ICE));
UtilAction.velocity(item, player.getLocation().getDirection(),
1, false, 0, 0.2, 10, false);
Manager.getProjectileManager().AddThrow(item, player, this, 5000, true, true, true, true,
null, 1f, 1f, null, null, 0, UpdateType.TICK, 0.5f);
//Inform
UtilPlayer.message(player, F.main("Skill", "You used " + F.skill(getName()) + "."));
//Effect
item.getWorld().playSound(item.getLocation(), Sound.EXPLODE, 0.5f, 0.5f);
}
@Override
public void Collide(LivingEntity target, Block block, ProjectileUser data)
{
if (target instanceof Player && Manager.selectEntity(this, target))
{
Player p = (Player) target;
int ticks = 4 * 20;
if(isClear(p.getLocation()))
{
Manager.getBlockRestore().add(p.getLocation().getBlock(), Material.STAINED_GLASS.getId(), (byte)5, 0, (byte)0, ticks*50);
Manager.getBlockRestore().add(p.getLocation().getBlock().getRelative(BlockFace.UP), Material.STAINED_GLASS.getId(), (byte)5, 0, (byte)0, ticks*50);
if(p.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() == Material.AIR)
{
Manager.getBlockRestore().add(p.getLocation().getBlock().getRelative(BlockFace.DOWN), Material.STAINED_GLASS.getId(), (byte)5, 0, (byte)0, ticks*50);
}
p.setWalkSpeed(0);
_playerMap.put(p, System.currentTimeMillis() + (ticks * 50));
p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, ticks, 250, true, false));
p.teleport(target.getLocation().getBlock().getLocation().add(0.5, 0, 0.5));
Recharge.Instance.useForce(p, "Double Jump", ticks*50);
p.setAllowFlight(false);
p.getWorld().playSound(p.getLocation(), Sound.FIZZ, 0.25f, 0.75f);
}
//Effect
target.playEffect(EntityEffect.HURT);
}
smash(data.getThrown());
}
@EventHandler
public void onMove(PlayerMoveEvent event)
{
if(!_playerMap.containsKey(event.getPlayer())) return;
if(event.getFrom().distanceSquared(event.getTo()) > 0.3)
{
event.setCancelled(true);
}
}
public boolean isClear(Location loc)
{
Block b = loc.getBlock();
ArrayList<Block> blocks = UtilBlock.getInBoundingBox(b.getLocation().subtract(1, 0, 1), b.getLocation().add(1, 1, 1));
for(Block test : blocks)
{
if(test.getType() == Material.PORTAL) return false;
}
if(b.getType() != Material.AIR) return false;
if(b.getRelative(BlockFace.UP).getType() != Material.AIR) return false;
return true;
}
@EventHandler
public void cleanup(UpdateEvent event)
{
if(event.getType() == UpdateType.FAST)
{
for(Iterator<Player> it = _playerMap.keySet().iterator(); it.hasNext();)
{
Player p = it.next();
Long time = _playerMap.get(p);
if(time == null)
{
p.setWalkSpeed(0.2f);
p.setAllowFlight(false);
it.remove();
continue;
}
if(time < System.currentTimeMillis())
{
p.setWalkSpeed(0.2f);
p.setAllowFlight(false);
it.remove();
continue;
}
}
}
if(event.getType() == UpdateType.TICK)
{
for(Player p : _playerMap.keySet())
{
Long time = _playerMap.get(p);
if(time <= System.currentTimeMillis()) continue;
for(Player op : UtilServer.getPlayers())
{
if(op.equals(p)) continue;
op.sendBlockChange(p.getLocation(), Material.ICE, (byte) 0);
op.sendBlockChange(p.getLocation().add(0, 1, 0), Material.ICE, (byte) 0);
}
}
}
}
@Override
public void Idle(ProjectileUser data)
{
smash(data.getThrown());
}
@Override
public void Expire(ProjectileUser data)
{
smash(data.getThrown());
}
@Override
public void ChunkUnload(ProjectileUser data)
{
data.getThrown().remove();
}
public void smash(Entity ent)
{
//Effect
ent.getWorld().playEffect(ent.getLocation(), Effect.STEP_SOUND, Material.ICE);
//Remove
ent.remove();
}
}