new legendary weapons and nether finzlizations

This commit is contained in:
NewGarbo 2016-03-05 03:07:25 +00:00
parent 7b9ff288f3
commit d79107eaaa
16 changed files with 589 additions and 72 deletions

View File

@ -1,5 +1,7 @@
package mineplex.core.common.util;
import org.bukkit.util.Vector;
public class RGBData
{
private double _red;
@ -50,4 +52,19 @@ public class RGBData
+ "green=" + (int) (_green * 255) + ", "
+ "blue=" + (int) (_blue * 255) + "]";
}
public Vector ToVector()
{
return new Vector(Math.max(0.001, _red), _green, _blue);
}
public RGBData Darken()
{
return new RGBData(getFullRed() - 25, getFullGreen() - 25, getFullBlue() - 25);
}
public RGBData Lighten()
{
return new RGBData(getFullRed() + 25, getFullGreen() + 25, getFullBlue() + 25);
}
}

View File

@ -3,6 +3,7 @@ package mineplex.core.common.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

View File

@ -3,14 +3,14 @@ package mineplex.core.common.util;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Random;
import java.util.function.Consumer;
import java.util.function.Function;
import org.bukkit.Location;
import org.bukkit.block.Block;
public class UtilCollections
{
public static Random Random = new Random();
@SafeVarargs
public static <E> NautArrayList<E> newNautList(E... elements)
{
@ -177,7 +177,7 @@ public class UtilCollections
return Arrays.copyOf(array, size);
}
public static Object[] ensureSize(Object[] array, int size)
public static <T> T[] ensureSize(T[] array, int size)
{
if (array.length <= size)
{
@ -186,4 +186,49 @@ public class UtilCollections
return Arrays.copyOf(array, size);
}
public static byte random(byte[] array)
{
return array[Random.nextInt(array.length)];
}
public static short random(short[] array)
{
return array[Random.nextInt(array.length)];
}
public static char random(char[] array)
{
return array[Random.nextInt(array.length)];
}
public static boolean random(boolean[] array)
{
return array[Random.nextInt(array.length)];
}
public static int random(int[] array)
{
return array[Random.nextInt(array.length)];
}
public static long random(long[] array)
{
return array[Random.nextInt(array.length)];
}
public static double random(double[] array)
{
return array[Random.nextInt(array.length)];
}
public static float random(float[] array)
{
return array[Random.nextInt(array.length)];
}
public static <T> T random(T[] array)
{
return array[Random.nextInt(array.length)];
}
}

View File

@ -0,0 +1,24 @@
package mineplex.core.common.util;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.util.Vector;
public class UtilTrig
{
public static List<Vector> GetCirclePoints(Vector origin, int points, double radius)
{
List<Vector> list = new LinkedList<>();
double slice = 2 * Math.PI / points;
for (int point = 0; point < points; point++)
{
double angle = slice * point;
list.add(new Vector(origin.getX() + radius * Math.cos(angle), 0, origin.getZ() + radius * Math.sin(angle)));
}
return list;
}
}

View File

@ -207,6 +207,8 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
private NautHashMap<String, ClanTerritory> _claimMap = new NautHashMap<String, ClanTerritory>();
private NautHashMap<String, Long> _unclaimMap = new NautHashMap<String, Long>();
private DamageManager _damageManager;
public String UserDataDir = UtilServer.getServer().getWorlds().get(0).getWorldFolder().getPath() + File.separator + ".." + File.separator + "CLANS_USER_DATA" + File.separator;
public ClanTips ClanTips;
@ -240,9 +242,9 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
Creature creature = new Creature(plugin);
_npcManager = new NpcManager(plugin, creature);
_condition = new SkillConditionManager(plugin);
DamageManager damageManager = new DamageManager(plugin, _combatManager, _npcManager, _disguiseManager, _condition);
damageManager.addCommand(new KillCommand(damageManager));
_worldEvent = new WorldEventManager(plugin, this, damageManager, _lootManager, blockRestore, _clanRegions, null);
_damageManager = new DamageManager(plugin, _combatManager, _npcManager, _disguiseManager, _condition);
_damageManager.addCommand(new KillCommand(_damageManager));
_worldEvent = new WorldEventManager(plugin, this, _damageManager, _lootManager, blockRestore, _clanRegions, null);
TaskManager taskManager = new TaskManager(plugin, _clientManager, webServerAddress);
@ -286,16 +288,16 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
new PotatoManager(plugin, this);
new Weapon(plugin, energy);
new Gameplay(plugin, this, blockRestore, damageManager);
new Gameplay(plugin, this, blockRestore, _damageManager);
_projectileManager = new ProjectileManager(plugin);
Fire fire = new Fire(plugin, _condition, damageManager);
Fire fire = new Fire(plugin, _condition, _damageManager);
HashSet<String> itemIgnore = new HashSet<String>();
itemIgnore.add("Proximity Explosive");
itemIgnore.add("Proximity Zapper");
ItemFactory itemFactory = new ItemFactory(plugin, blockRestore, _condition, damageManager, energy, fire, _projectileManager, webServerAddress, itemIgnore);
SkillFactory skillManager = new SkillFactory(plugin, damageManager, this, _combatManager, _condition, _projectileManager, _disguiseManager, blockRestore, fire, new Movement(plugin), teleport, energy, webServerAddress);
ItemFactory itemFactory = new ItemFactory(plugin, blockRestore, _condition, _damageManager, energy, fire, _projectileManager, webServerAddress, itemIgnore);
SkillFactory skillManager = new SkillFactory(plugin, _damageManager, this, _combatManager, _condition, _projectileManager, _disguiseManager, blockRestore, fire, new Movement(plugin), teleport, energy, webServerAddress);
skillManager.RemoveSkill("Dwarf Toss", "Block Toss");
skillManager.removeSkill("Whirlwind Axe");
skillManager.removeSkill("Shield Smash");
@ -1059,6 +1061,12 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
public void onJoin(PlayerLoginEvent event)
{
Rank rank = _clientManager.Get(event.getPlayer()).GetRank();
if (_serverName.equals("GClans-1"))
{
return;
}
if (!event.getPlayer().isWhitelisted() && !rank.has(Rank.LEGEND))
{
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Clans is currently in Legend+ only Alpha!");
@ -1198,4 +1206,9 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
{
return player.getName().equals("NewGarbo");
}
public DamageManager getDamageManager()
{
return _damageManager;
}
}

View File

@ -439,6 +439,19 @@ public class ItemMapManager extends MiniPlugin
}
}
public void removeMap(Player player)
{
for (int slot = 0; slot < player.getInventory().getSize(); slot++)
{
ItemStack item = player.getInventory().getItem(slot);
if (item != null && item.getType() == Material.MAP && item.getDurability() >= _mapId && item.getDurability() <= _mapId + 100)
{
player.getInventory().setItem(slot, null);
}
}
}
public ClansUtility getClansUtility()
{
return _clansUtility;

View File

@ -14,6 +14,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.inventory.ItemStack;
@ -27,6 +28,8 @@ import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilCollections;
import mineplex.core.common.util.UtilFile;
import mineplex.core.common.util.UtilItem;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilWorld;
@ -119,15 +122,24 @@ public class NetherManager extends MiniPlugin
Player player = event.getPlayer();
ItemStack item = player.getItemInHand();
if (player.getGameMode() == GameMode.CREATIVE)
{
return;
}
if (!block.getWorld().equals(_netherWorld))
{
return;
}
if (player.getGameMode() == GameMode.CREATIVE)
{
return;
}
_portals
.stream()
.filter(portal -> UtilAlg.getAverageBlockLocation(portal.getToBlocks()).distance(block.getLocation()) < 15)
.limit(1)
.forEach(portal -> {
UtilPlayer.message(player, F.main("Clans", "You are not allowed to break this block."));
event.setCancelled(true);
});
if (!item.getType().equals(Material.GOLD_PICKAXE))
{
@ -144,9 +156,60 @@ public class NetherManager extends MiniPlugin
}
}
@EventHandler
public void placeBlock(BlockPlaceEvent event)
{
Block block = event.getBlock();
Player player = event.getPlayer();
ItemStack item = player.getItemInHand();
if (player.getGameMode() == GameMode.CREATIVE)
{
return;
}
if (!block.getWorld().equals(_netherWorld))
{
return;
}
if (!UtilItem.isFromNether(item))
{
UtilPlayer.message(player, F.main("Clans", "You can only place blocks here that come from " + F.clansNether("The Nether") + "."));
event.setCancelled(true);
return;
}
_portals
.stream()
.filter(portal -> UtilAlg.getAverageBlockLocation(portal.getToBlocks()).distance(block.getLocation()) < 15)
.limit(1)
.forEach(portal -> {
UtilPlayer.message(player, F.main("Clans", "You are not allowed to place blocks here."));
event.setCancelled(true);
});
if (block.getType().equals(Material.OBSIDIAN) || block.getType().equals(Material.PORTAL))
{
UtilPlayer.message(player, F.main("Clans", "You are not allowed to place blocks here."));
event.setCancelled(true);
return;
}
}
@EventHandler
public void update(UpdateEvent event)
{
if (event.getType() == UpdateType.FAST)
{
UtilServer.getPlayersCollection()
.stream()
.filter(player -> player.getWorld().equals(_netherWorld))
.forEach(player -> {
player.setCompassTarget(new Location(_netherWorld, -200.d + UtilMath.r(400), player.getLocation().getY(), -200.d + UtilMath.r(400)));
_clansManager.getItemMapManager().removeMap(player);
});
}
if (event.getType() == UpdateType.SLOW)
{
_portals.forEach(portal -> {

View File

@ -18,6 +18,9 @@ public class Portal
private List<Block> _toPortalBlocks;
private List<Block> _toObsidianBlocks;
private List<Block> _fromBlocks;
private List<Block> _toBlocks;
private Location _toOut;
public final boolean Success;
@ -74,6 +77,11 @@ public class Portal
}
}
_fromBlocks.addAll(_fromObsidianBlocks);
_fromBlocks.addAll(_fromPortalBlocks);
_toBlocks.addAll(_toObsidianBlocks);
_toBlocks.addAll(_toPortalBlocks);
Success = true;
}
@ -102,6 +110,16 @@ public class Portal
return _toObsidianBlocks;
}
public List<Block> getFromBlocks()
{
return _fromBlocks;
}
public List<Block> getToBlocks()
{
return _toBlocks;
}
private boolean isValidPortalBlock(Block block)
{
return block.getType() == Material.OBSIDIAN || block.getType() == Material.PORTAL;

View File

@ -48,6 +48,7 @@ import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilText;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTrig;
import mineplex.core.hologram.Hologram;
import mineplex.core.hologram.HologramInteraction;
import mineplex.core.itemstack.ItemBuilder;
@ -169,9 +170,9 @@ public class Outpost implements Listener
_state = token.OutpostState;
_circleStages = new LoopIterator<Vector>(circleAround(new Vector(0., 0., 0.), 40, .6d));
_circleStages = new LoopIterator<Vector>(UtilTrig.GetCirclePoints(new Vector(0., 0., 0.), 40, .6d));
List<Vector> reverse = circleAround(new Vector(0., 0., 0.), 40, .6d);
List<Vector> reverse = UtilTrig.GetCirclePoints(new Vector(0., 0., 0.), 40, .6d);
Collections.reverse(reverse);
_reverseCircleStages = new LoopIterator<Vector>(reverse);
@ -221,9 +222,9 @@ public class Outpost implements Listener
_outpostManager.getRepository().insertOutpost(toToken());
_circleStages = new LoopIterator<Vector>(circleAround(new Vector(0., 0., 0.), 40, .6d));
_circleStages = new LoopIterator<Vector>(UtilTrig.GetCirclePoints(new Vector(0., 0., 0.), 40, .6d));
List<Vector> reverse = circleAround(new Vector(0., 0., 0.), 40, .6d);
List<Vector> reverse = UtilTrig.GetCirclePoints(new Vector(0., 0., 0.), 40, .6d);
Collections.reverse(reverse);
_reverseCircleStages = new LoopIterator<Vector>(reverse);
@ -328,7 +329,6 @@ public class Outpost implements Listener
if (!_ownerClan.equals(_ownerClan.Clans.getClanUtility().getClanByPlayer(event.getPlayer())))
{
UtilPlayer.message(event.getPlayer(), F.main("Clans", "This is not yours to activate!"));
return;
}
if (event.getClickedBlock() != null && _origin.equals(event.getClickedBlock().getLocation()))
@ -590,21 +590,6 @@ public class Outpost implements Listener
_nameHolograms.forEach(Hologram::start);
}
private List<Vector> circleAround(Vector origin, int points, double radius)
{
List<Vector> list = new LinkedList<>();
double slice = 2 * Math.PI / points;
for (int point = 0; point < points; point++)
{
double angle = slice * point;
list.add(new Vector(origin.getX() + radius * Math.cos(angle), 0, origin.getZ() + radius * Math.sin(angle)));
}
return list;
}
public void kill()
{
_state = OutpostState.DESTRUCTING;

View File

@ -357,17 +357,17 @@ public class Cannon extends SiegeWeapon
if (firepower == 1)
{
hMult = 0.6;
hMult = 1.2;
yAdd = 0.5;
}
else if (firepower == 2)
{
hMult = 1;
hMult = 1.7;
yAdd = 0.55;
}
else if (firepower >= 3)
{
hMult = 1.5;
hMult = 2.35;
yAdd = 0.6;
}

View File

@ -237,7 +237,7 @@ public class Gameplay extends MiniPlugin
HashSet<Block> remove = new HashSet<Block>();
for (Block cur : _bucketWater.keySet())
if (UtilTime.elapsed(_bucketWater.get(cur), 2000)) remove.add(cur);
if (UtilTime.elapsed(_bucketWater.get(cur).longValue(), 2000)) remove.add(cur);
for (Block cur : remove)
_bucketWater.remove(cur);

View File

@ -29,6 +29,8 @@ import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.weight.Weight;
import mineplex.core.common.weight.WeightSet;
import mineplex.core.donation.DonationManager;
import mineplex.core.packethandler.IPacketHandler;
import mineplex.core.packethandler.PacketHandler;
@ -56,9 +58,9 @@ import mineplex.game.clans.items.attributes.weapon.JaggedAttribute;
import mineplex.game.clans.items.attributes.weapon.SharpAttribute;
import mineplex.game.clans.items.commands.GearCommand;
import mineplex.game.clans.items.economy.GoldToken;
import mineplex.core.common.weight.Weight;
import mineplex.core.common.weight.WeightSet;
import mineplex.game.clans.items.legendaries.AlligatorsTooth;
import mineplex.game.clans.items.legendaries.ChitauriScepter;
import mineplex.game.clans.items.legendaries.EnergyCrossbow;
import mineplex.game.clans.items.legendaries.GiantsBroadsword;
import mineplex.game.clans.items.legendaries.HyperAxe;
import mineplex.game.clans.items.legendaries.LegendaryItem;
@ -153,7 +155,7 @@ public class GearManager extends MiniPlugin implements IPacketHandler, Runnable
// TODO: Initialize list of attributes and types
// Initialize various LegendaryItem types
_legendaryWeights = new WeightSet<Class<? extends LegendaryItem>>(AlligatorsTooth.class, WindBlade.class, GiantsBroadsword.class, HyperAxe.class, MagneticMaul.class);
_legendaryWeights = new WeightSet<Class<? extends LegendaryItem>>(ChitauriScepter.class, EnergyCrossbow.class, AlligatorsTooth.class, WindBlade.class, GiantsBroadsword.class, HyperAxe.class, MagneticMaul.class);
// TODO: Add rest of legendaries, find better way?
// Register listeners

View File

@ -0,0 +1,213 @@
package mineplex.game.clans.items.legendaries;
import java.util.Random;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.RGBData;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilCollections;
import mineplex.core.common.util.UtilColor;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilParticle.ParticleType;
import mineplex.core.common.util.UtilParticle.ViewDist;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilShapes;
import mineplex.core.common.util.UtilText;
import mineplex.core.recharge.Recharge;
import mineplex.game.clans.clans.ClansManager;
public class ChitauriScepter extends LegendaryItem
{
private long _lastFire = System.currentTimeMillis();
private long _interactWait;
private RGBData[] colors = { UtilColor.RgbLightBlue, UtilColor.RgbLightBlue.Lighten(), UtilColor.RgbLightBlue.Darken() };
public ChitauriScepter()
{
super("Chitauri Scepter", UtilText.splitLinesToArray(new String[] {
C.cWhite + "Legend says "
+ " ",
"#" + C.cYellow + "Right-Click" + C.cWhite + " to use Scepter."
}, LineFormat.LORE), Material.RECORD_7);
}
@Override
public void update(Player wielder)
{
if ((System.currentTimeMillis() - _lastBlock) < 98 && (System.currentTimeMillis() - _interactWait) >= 98)
{
if (Recharge.Instance.use(wielder, getDisplayName(), 4000, true, true))
{
fire(wielder);
_interactWait = System.currentTimeMillis();
}
}
}
private void fire(final Player player)
{
final Location missileLocation = player.getEyeLocation();
final Location shotFrom = missileLocation.clone();
final Vector direction = missileLocation.getDirection().normalize().multiply(0.3);
final int maxRange = 40;
final int maxDings = maxRange * 3;
final int damage = 6;
new BukkitRunnable()
{
private int dingsDone;
private Location previousLocation = missileLocation;
private void burst()
{
for (Entity cur : missileLocation.getWorld().getEntities())
{
if (cur == player || !(cur instanceof LivingEntity) || (cur instanceof Player && UtilPlayer.isSpectator(cur)))
continue;
LivingEntity entity = (LivingEntity) cur;
Location eLoc = entity.getLocation();
// If they are less than 0.5 blocks away
if (eLoc.clone().add(0, missileLocation.getY() - eLoc.getY(), 0).distance(missileLocation) <= 0.7)
{
// If it is in their body height
if (Math.abs((eLoc.getY() + (entity.getEyeHeight() / 1.5)) - missileLocation.getY()) <= entity
.getEyeHeight() / 2)
{
if (entity != player && (!(entity instanceof Player)))
{
ClansManager.getInstance().getDamageManager().NewDamageEvent(entity, player, null, DamageCause.CUSTOM, damage, true,
true, false, getDisplayName(), getDisplayName());
UtilPlayer.message(entity, F.main("Clans", F.elem(entity.getName()) + " hit you with a " + getDisplayName() + C.mBody + "."));
UtilPlayer.message(player, F.main("Clans", "You hit " + F.elem(player.getName()) + " with your " + getDisplayName() + C.mBody + "."));
}
}
}
}
playParticle(missileLocation, previousLocation);
missileLocation.getWorld().playSound(missileLocation, Sound.BAT_TAKEOFF, 1.2F, 1);
cancel();
}
public void run()
{
if (dingsDone >= maxDings || !player.isOnline())
{
burst();
}
else
{
for (int i = 0; i < 2; i++)
{
Player closestPlayer = null;
double dist = 0;
for (Player closest : UtilServer.getPlayers())
{
if (!closest.getWorld().equals(missileLocation.getWorld()))
{
continue;
}
Location loc = closest.getLocation();
if (closest != player)
{
double dist1 = loc.distance(shotFrom);
if (dist1 < maxRange + 10)
{
double dist2 = missileLocation.distance(loc);
if (closestPlayer == null || dist2 < dist)
{
double dist3 = missileLocation.clone().add(direction).distance(loc);
if (dist3 < dist2)
{
closestPlayer = closest;
dist = dist2;
}
}
}
}
}
if (closestPlayer != null)
{
Vector newDirection = closestPlayer.getLocation().add(0, 1, 0).toVector()
.subtract(missileLocation.toVector());
direction.add(newDirection.normalize().multiply(0.01)).normalize().multiply(0.3);
}
missileLocation.add(direction);
for (Entity cur : missileLocation.getWorld().getEntities())
{
if (cur == player || !(cur instanceof LivingEntity)
|| (cur instanceof Player && UtilPlayer.isSpectator(cur)))
continue;
LivingEntity ent = (LivingEntity) cur;
Location eLoc = ent.getLocation();
// If they are less than 0.5 blocks away
if (eLoc.clone().add(0, missileLocation.getY() - eLoc.getY(), 0).distance(missileLocation) <= 0.7)
{
// If it is in their body height
if (Math.abs((eLoc.getY() + (ent.getEyeHeight() / 1.5)) - missileLocation.getY()) <= ent
.getEyeHeight() / 2)
{
burst();
return;
}
}
}
if (UtilBlock.solid(missileLocation.getBlock()))
{
burst();
return;
}
playParticle(missileLocation, previousLocation);
previousLocation = missileLocation.clone();
dingsDone++;
}
missileLocation.getWorld().playSound(missileLocation, Sound.ORB_PICKUP, 0.7F, 0);
}
}
}.runTaskTimer(ClansManager.getInstance().getPlugin(), 0, 0);
}
private void playParticle(Location start, Location end)
{
for (Location loc : UtilShapes.getLinesDistancedPoints(start, end, 0.06))
{
UtilParticle.PlayParticleToAll(ParticleType.RED_DUST, loc, UtilCollections.random(colors).ToVector(), 1f, 0, ViewDist.LONG);
}
}
}

View File

@ -1,30 +1,50 @@
package mineplex.game.clans.items.legendaries;
import java.util.HashMap;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.ProjectileHitEvent;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.RGBData;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilCollections;
import mineplex.core.common.util.UtilColor;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilParticle.ParticleType;
import mineplex.core.common.util.UtilParticle.ViewDist;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilShapes;
import mineplex.core.common.util.UtilText;
import mineplex.core.recharge.Recharge;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClansManager;
public class EnergyCrossbow extends LegendaryItem
{
private static final long COOLDOWN = 30000;
private long _lastFire = System.currentTimeMillis();
private long _interactWait;
public EnergyCrossbow()
{
super("Energy Crossbow", UtilText.splitLinesToArray(new String[] {
C.cWhite + "This deadly tooth was stolen from a nest of reptillian beasts long ago. "
+ "Legends say that the holder is granted the underwater agility of an Alligator",
" ",
"#" + C.cYellow + "Right-Click" + C.cWhite + " to use" + C.cGreen + " Swim"
}, LineFormat.LORE), Material.RECORD_4);
C.cWhite + "Legend says "
+ " ",
"#" + C.cYellow + "Right-Click" + C.cWhite + " to fire Crossbow."
}, LineFormat.LORE), Material.RECORD_6);
}
@Override
@ -32,22 +52,121 @@ public class EnergyCrossbow extends LegendaryItem
{
if ((System.currentTimeMillis() - _lastBlock) < 98 && (System.currentTimeMillis() - _interactWait) >= 98)
{
if ((System.currentTimeMillis() - _lastFire) >= COOLDOWN)
if (Recharge.Instance.use(wielder, "Crossbow", 4000, true, true))
{
fire(wielder);
_interactWait = System.currentTimeMillis();
}
else
{
UtilPlayer.message(wielder, F.main("Clans", "Energy Crossbow is cooling down!"));
}
}
}
private void fire(Player wielder)
private void fire(final Player player)
{
final Arrow arrow = wielder.shootArrow();
UtilServer.registerEvents(new Listener() {
private Location _lastLoc;
private Arrow _arrow;
private Player _player;
private RGBData[] colors = { UtilColor.RgbLightBlue, UtilColor.RgbLightBlue.Lighten(), UtilColor.RgbLightBlue.Darken() };
{
_player = player;
Arrow arrow = _player.shootArrow();
arrow.setShooter(_player);
_arrow = arrow;
_player.playSound(_arrow.getLocation(), Sound.BAT_TAKEOFF, 2.f, 2.f);
}
@EventHandler
public void update(UpdateEvent event)
{
if (_arrow == null || _arrow.isDead())
{
HandlerList.unregisterAll(this);
return;
}
if (_lastLoc != null)
{
Location lastLoc = _lastLoc.clone();
while (UtilMath.offset(lastLoc, _arrow.getLocation()) > 0.1)
{
lastLoc.add(UtilAlg.getTrajectory(lastLoc, _arrow.getLocation()).multiply(0.1));
UtilParticle.PlayParticleToAll(ParticleType.RED_DUST, lastLoc, UtilCollections.random(colors).ToVector(), 1f, 0, ViewDist.MAX);
}
}
_lastLoc = _arrow.getLocation();
}
private void hit()
{
HandlerList.unregisterAll(this);
for (Location point : UtilShapes.getSphereBlocks(_arrow.getLocation(), 1, 1, true))
UtilParticle.PlayParticleToAll(ParticleType.RED_DUST, _arrow.getLocation().add(point), UtilCollections.random(colors).ToVector(), 1f, 0, ViewDist.MAX);
HashMap<LivingEntity, Double> targets = UtilEnt.getInRadius(_arrow.getLocation(), 3.d);
for (LivingEntity entity : targets.keySet())
{
if (entity.equals(_arrow.getShooter()))
continue;
ClansManager.getInstance().getDamageManager().NewDamageEvent(entity, _player, _arrow,
DamageCause.CUSTOM, 6, true, true, false,
_player.getName(), "Energy Crossbow");
}
_arrow.remove();
_arrow = null;
}
@EventHandler
public void projectileHit(ProjectileHitEvent event)
{
if (!event.getEntity().equals(_arrow))
{
return;
}
ClansManager.getInstance().runSyncLater(this::hit, 1);
}
@EventHandler
public void entityHurt(EntityDamageByEntityEvent event)
{
if (!event.getDamager().equals(_arrow))
{
return;
}
if (event.getEntity().equals(_arrow.getShooter()) || !(event.getEntity() instanceof LivingEntity))
{
_arrow.remove();
_arrow = null;
return;
}
event.setCancelled(true);
ClansManager.getInstance().getDamageManager().NewDamageEvent((LivingEntity) event.getEntity(), _player, _arrow,
DamageCause.CUSTOM, 1.5d, true, true, false,
_player.getName(), "Energy Crossbow");
hit();
}
});
_lastFire = System.currentTimeMillis();
}

View File

@ -12,7 +12,7 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent;
public class HyperAxe extends LegendaryItem
{
public static final long ATTACK_RATE_DURATION = 200;
public static final long ATTACK_RATE_DURATION = 1000 / 17;
private static ValueDistribution amountGen = generateDistribution(0, 3); // [1, 4] speed amount
private static ValueDistribution durationGen = generateDistribution(80, 320); // [4, 16] seconds speed duration
@ -20,11 +20,10 @@ public class HyperAxe extends LegendaryItem
private int _speedDuration;
private long _lastAttack;
public long timeSinceLastAttack() { return System.currentTimeMillis() - _lastAttack; }
public HyperAxe()
{
super("Hyper Axe", new String[]{
super("Hyper Axe", new String[] {
C.cWhite + "Of all the weapons known to man,",
C.cWhite + "none is more prevalent than the",
C.cWhite + "Hyper Axe. Infused with rabbit's",
@ -43,10 +42,9 @@ public class HyperAxe extends LegendaryItem
@Override
public void update(Player wielder)
{
if (isHoldingRightClick() && canBuff())
if (isHoldingRightClick() && canBuff(wielder))
{
buffPlayer(wielder);
_lastAttack = System.currentTimeMillis();
}
}
@ -56,9 +54,9 @@ public class HyperAxe extends LegendaryItem
if (timeSinceLastAttack() >= ATTACK_RATE_DURATION)
{
event.SetIgnoreRate(true);
// log("Ignoring rate!");
event.AddMod("Hyper Axe", 1);
event.AddMod("Hyper Axe", 9);
_lastAttack = System.currentTimeMillis();
}
else
{
@ -66,18 +64,22 @@ public class HyperAxe extends LegendaryItem
}
}
public long timeSinceLastAttack()
{
return System.currentTimeMillis() - _lastAttack;
}
private void buffPlayer(Player wielder)
{
if (!Recharge.Instance.use(wielder, "Hyper Rush", 16000, true, true))
return;
Recharge.Instance.use(wielder, "Hyper Rush", 16000, true, false);
// Give player speed buff
wielder.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, _speedDuration, _speedAmount));
log("Buffing");
}
private boolean canBuff()
private boolean canBuff(Player wielder)
{
return true; // TODO: Implement cooldown? (None specified in docs, sounds OP)
return Recharge.Instance.usable(wielder, "Hyper Rush", true);
}
}

View File

@ -4,6 +4,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.text.WordUtils;
import org.apache.commons.lang3.tuple.Triple;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
@ -40,13 +42,13 @@ import mineplex.game.clans.items.attributes.weapon.HasteAttribute;
import mineplex.game.clans.items.attributes.weapon.JaggedAttribute;
import mineplex.game.clans.items.attributes.weapon.SharpAttribute;
import mineplex.game.clans.items.legendaries.AlligatorsTooth;
import mineplex.game.clans.items.legendaries.ChitauriScepter;
import mineplex.game.clans.items.legendaries.EnergyCrossbow;
import mineplex.game.clans.items.legendaries.GiantsBroadsword;
import mineplex.game.clans.items.legendaries.HyperAxe;
import mineplex.game.clans.items.legendaries.LegendaryItem;
import mineplex.game.clans.items.legendaries.MagneticMaul;
import mineplex.game.clans.items.legendaries.WindBlade;
import org.apache.commons.lang3.text.WordUtils;
import org.apache.commons.lang3.tuple.Triple;
public class GearPage extends ShopPageBase<GearManager, GearShop>
{
@ -98,7 +100,7 @@ public class GearPage extends ShopPageBase<GearManager, GearShop>
}
};
_legendaryItems = Arrays.<Class<? extends LegendaryItem>> asList(AlligatorsTooth.class, WindBlade.class, GiantsBroadsword.class, HyperAxe.class, MagneticMaul.class);
_legendaryItems = Arrays.<Class<? extends LegendaryItem>> asList(ChitauriScepter.class, EnergyCrossbow.class, AlligatorsTooth.class, WindBlade.class, GiantsBroadsword.class, HyperAxe.class, MagneticMaul.class);
_armorSuperPrefixes = Arrays.<Class<? extends ItemAttribute>> asList(LavaAttribute.class);
_armorPrefixes = Arrays.<Class<? extends ItemAttribute>> asList(PaddedAttribute.class, ReinforcedAttribute.class, SlantedAttribute.class);