Rewrite functionality of Flash and Blink to patch phasing with them

This commit is contained in:
AlexTheCoder 2017-08-26 02:04:36 -04:00
parent 5c3b575c3f
commit bc3637833e
2 changed files with 219 additions and 111 deletions

View File

@ -1,6 +1,7 @@
package mineplex.minecraft.game.classcombat.Skill.Assassin;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Effect;
@ -8,32 +9,35 @@ import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.block.Action;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;
import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
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.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilWorld;
import mineplex.core.common.util.UtilParticle.ParticleType;
import mineplex.core.common.util.UtilParticle.ViewDist;
import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType;
import mineplex.minecraft.game.classcombat.Skill.SkillActive;
import mineplex.minecraft.game.classcombat.Skill.SkillFactory;
import mineplex.minecraft.game.classcombat.Skill.event.SkillTeleportEvent;
import net.minecraft.server.v1_8_R3.AxisAlignedBB;
import net.minecraft.server.v1_8_R3.Entity;
public class Blink extends SkillActive
{
private HashMap<Player, Location> _loc = new HashMap<Player, Location>();
private HashMap<Player, Long> _blinkTime = new HashMap<Player, Long>();
private Map<Player, Location> _loc = new HashMap<>();
private Map<Player, Long> _blinkTime = new HashMap<>();
private boolean _allowTrapping = false;
public Blink(SkillFactory skills, String name, ClassType classType, SkillType skillType,
int cost, int levels,
@ -60,6 +64,7 @@ public class Blink extends SkillActive
});
}
@SuppressWarnings("deprecation")
@Override
public boolean CustomCheck(Player player, int level)
{
@ -97,29 +102,36 @@ public class Blink extends SkillActive
return true;
}
@Override
public void Skill(Player player, int level)
public void blinky(Player player)
{
//Smoke Trail
Block lastSmoke = player.getLocation().getBlock();
Location start = player.getLocation().add(new Vector(0, 0.2, 0));
Location test = null;
Location end = start.clone();
Vector dir = player.getLocation().getDirection();
AxisAlignedBB box = null;
Entity ent = ((CraftEntity)player).getHandle();
double maxRange = getMaxRange(player);
double curRange = 0;
while (curRange <= maxRange)
{
Location newTarget = player.getLocation().add(new Vector(0,0.2,0)).add(player.getLocation().getDirection().multiply(curRange));
double range = 0;
if (!UtilBlock.airFoliage(newTarget.getBlock()) || !UtilBlock.airFoliage(newTarget.getBlock().getRelative(BlockFace.UP)))
break;
rangeLoop: while (range <= maxRange)
{
test = start.clone().add(dir.clone().multiply(range));
float halfWidth = ent.width / 2;
float length = ent.length;
box = new AxisAlignedBB(test.getX() - halfWidth, test.getY(), test.getZ() - halfWidth, test.getX() + halfWidth, test.getY() + length, test.getZ() + halfWidth);
//Lock Players
for (Player cur : player.getWorld().getPlayers())
playerLoop: for (Player cur : player.getWorld().getPlayers())
{
if (cur.equals(player) || cur.getGameMode() == GameMode.SPECTATOR)
continue;
if (cur.equals(player) || cur.getGameMode() == GameMode.SPECTATOR || UtilPlayer.isSpectator(cur))
{
continue playerLoop;
}
if (UtilMath.offset(newTarget, cur.getLocation()) > 1)
continue;
if (UtilMath.offset(test, cur.getLocation()) > 1)
{
continue playerLoop;
}
//Action
Location target = cur.getLocation().add(player.getLocation().subtract(cur.getLocation()).toVector().normalize());
@ -133,32 +145,108 @@ public class Blink extends SkillActive
return;
}
//Progress Forwards
curRange += 0.2;
for (Block b : UtilBlock.getInBoundingBox(player.getWorld(), box))
{
if (UtilBlock.airFoliage(b))
{
if (b.getType() == Material.STRING && _allowTrapping)
{
break rangeLoop;
}
}
else
{
break rangeLoop;
}
}
range += 0.2;
end = test.clone();
//Smoke Trail
UtilParticle.PlayParticle(ParticleType.LARGE_SMOKE, newTarget.clone().add(0, 0.5, 0), 0, 0, 0, 0, 1,
UtilParticle.PlayParticle(ParticleType.LARGE_SMOKE, end.clone().add(0, 0.5, 0), 0, 0, 0, 0, 1,
ViewDist.LONGER, UtilServer.getPlayers());
lastSmoke = newTarget.getBlock();
}
//Modify Range
curRange -= 0.4;
if (curRange < 0)
{
curRange = 0;
}
//Destination
Location loc = getDestination(player, curRange);
_loc.put(player, player.getLocation());
//Action
if (curRange > 0)
if (range > 0)
{
player.leaveVehicle();
player.teleport(loc);
player.teleport(end);
}
player.setFallDistance(0);
}
@Override
public void Skill(Player player, int level)
{
Location start = player.getLocation().add(new Vector(0, 0.2, 0));
Location test = null;
Location end = start.clone();
Vector dir = player.getLocation().getDirection();
AxisAlignedBB box = null;
Entity ent = ((CraftEntity)player).getHandle();
double maxRange = getMaxRange(player);
double range = 0;
rangeLoop: while (range <= maxRange)
{
test = start.clone().add(dir.clone().multiply(range));
float halfWidth = ent.width / 2;
float length = ent.length;
box = new AxisAlignedBB(test.getX() - halfWidth, test.getY(), test.getZ() - halfWidth, test.getX() + halfWidth, test.getY() + length, test.getZ() + halfWidth);
//Lock Players
playerLoop: for (Player cur : player.getWorld().getPlayers())
{
if (cur.equals(player) || cur.getGameMode() == GameMode.SPECTATOR || UtilPlayer.isSpectator(cur))
{
continue playerLoop;
}
if (UtilMath.offset(test, cur.getLocation()) > 1)
{
continue playerLoop;
}
//Action
Location target = cur.getLocation().add(player.getLocation().subtract(cur.getLocation()).toVector().normalize());
player.teleport(UtilWorld.locMerge(player.getLocation(), target));
//Inform
UtilPlayer.message(player, F.main(GetClassType().name(), "You used " + F.skill(GetName()) + "."));
//Effect
player.getWorld().playEffect(player.getLocation(), Effect.BLAZE_SHOOT, 0);
return;
}
for (Block b : UtilBlock.getInBoundingBox(player.getWorld(), box))
{
if (UtilBlock.airFoliage(b))
{
if (b.getType() == Material.TRIPWIRE && _allowTrapping)
{
break rangeLoop;
}
}
else
{
break rangeLoop;
}
}
range += 0.2;
end = test.clone();
//Smoke Trail
UtilParticle.PlayParticle(ParticleType.LARGE_SMOKE, end.clone().add(0, 0.5, 0), 0, 0, 0, 0, 1,
ViewDist.LONGER, UtilServer.getPlayers());
}
_loc.put(player, player.getLocation());
if (range > 0)
{
player.teleport(end);
}
player.setFallDistance(0);
@ -242,4 +330,14 @@ public class Blink extends SkillActive
{
return player.getLocation().add(player.getLocation().getDirection().multiply(range).add(new Vector(0, 0.4, 0)));
}
public boolean isAllowTrapping()
{
return _allowTrapping;
}
public void setAllowTrapping(boolean allowTrapping)
{
_allowTrapping = allowTrapping;
}
}

View File

@ -1,12 +1,14 @@
package mineplex.minecraft.game.classcombat.Skill.Assassin;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.Action;
@ -14,22 +16,26 @@ import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilItem;
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.recharge.Recharge;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType;
import mineplex.minecraft.game.classcombat.Skill.SkillActive;
import mineplex.minecraft.game.classcombat.Skill.SkillFactory;
import mineplex.minecraft.game.classcombat.Skill.event.SkillTeleportEvent;
import net.minecraft.server.v1_8_R3.AxisAlignedBB;
import net.minecraft.server.v1_8_R3.Entity;
public class Flash extends SkillActive
{
private HashMap<Player, Integer> _flash = new HashMap<Player, Integer>();
private Map<Player, Integer> _flash = new HashMap<>();
private boolean _allowTrapping = false;
public Flash(SkillFactory skills, String name, ClassType classType, SkillType skillType,
int cost, int levels,
@ -59,6 +65,7 @@ public class Flash extends SkillActive
return "Recharge: #8#-1 Seconds per Charge";
}
@SuppressWarnings("deprecation")
@Override
public boolean CustomCheck(Player player, int level)
{
@ -108,99 +115,92 @@ public class Flash extends SkillActive
if (charges >= 1 + level)
continue;
if (!mineplex.core.recharge.Recharge.Instance.use(cur, "Flash Recharge", 8000 - (1000 * level), false, false))
if (!Recharge.Instance.use(cur, "Flash Recharge", 8000 - (1000 * level), false, false))
continue;
_flash.put(cur, charges + 1);
//Inform
UtilPlayer.message(cur, F.main(GetClassType().name(), "Flash Charges: " + F.elem((charges + 1)+"")));
UtilPlayer.message(cur, F.main(GetClassType().name(), "Flash Charges: " + F.elem((charges + 1) + "")));
}
}
}
@SuppressWarnings("deprecation")
@Override
public void Skill(Player player, int level)
{
//Use Recharge
mineplex.core.recharge.Recharge.Instance.use(player, "Flash Recharge", 8000, false, false);
Recharge.Instance.use(player, "Flash Recharge", 8000, false, false);
_flash.put(player, _flash.get(player) - 1);
//Inform
UtilPlayer.message(player, F.main(GetClassType().name(), "Flash Charges: " + F.elem(_flash.get(player) + "")));
Location start = player.getLocation().add(new Vector(0, 0.2, 0));
Location test = null;
Location end = start.clone();
Vector dir = player.getLocation().getDirection();
AxisAlignedBB box = null;
Entity ent = ((CraftEntity)player).getHandle();
double maxRange = getMaxRange(player);
double curRange = 0;
while (curRange <= maxRange)
double range = 0;
rangeLoop: while (range <= maxRange)
{
Location newTarget = player.getLocation().add(new Vector(0,0.2,0)).add(player.getLocation().getDirection().multiply(curRange));
Location aboveTarget = newTarget.getBlock().getRelative(BlockFace.UP).getLocation();
// half-slab
boolean newTargetIsSlab = newTarget.getBlock().getType() == Material.STEP || newTarget.getBlock().getType() == Material.WOOD_STEP;
boolean aboveTargetIsSlab = aboveTarget.getBlock().getType() == Material.STEP || aboveTarget.getBlock().getType() == Material.WOOD_STEP;
boolean newTargetSlabIsBottom = false;
boolean aboveTargetSlabIsBottom = false;
if (newTargetIsSlab && curRange < 0.5)
test = start.clone().add(dir.clone().multiply(range));
float halfWidth = ent.width / 2;
float length = ent.length;
box = new AxisAlignedBB(test.getX() - halfWidth, test.getY(), test.getZ() - halfWidth, test.getX() + halfWidth, test.getY() + length, test.getZ() + halfWidth);
for (Block b : UtilBlock.getInBoundingBox(player.getWorld(), box))
{
int newTargetData = (int) newTarget.getBlock().getData();
if (b.getType() == Material.STEP || b.getType() == Material.WOOD_STEP || b.getType() == Material.STONE_SLAB2)
{
boolean bottom = false;
int data = b.getData();
if (data <= 7)
{
bottom = true;
}
if (newTargetData <= 7) newTargetSlabIsBottom = true;
boolean locIsBottom = (Math.max(test.getY(), b.getY()) - Math.min(test.getY(), b.getY())) < 0.5;
if (bottom == locIsBottom)
{
break rangeLoop;
}
}
else if (UtilItem.isBoundless(b.getType()))
{
if (b.getType() == Material.TRIPWIRE && _allowTrapping)
{
break rangeLoop;
}
}
else
{
break rangeLoop;
}
}
if (aboveTargetIsSlab && curRange < 0.25)
{
int aboveTargetData = (int) aboveTarget.getBlock().getData();
if (aboveTargetData <= 7) aboveTargetSlabIsBottom = true;
}
if ((!newTargetSlabIsBottom &&
!UtilItem.isBoundless(aboveTarget.getBlock().getType())
|| (!aboveTargetSlabIsBottom)
&& !UtilItem.isBoundless(aboveTarget.getBlock().getType())))
break;
if (!UtilItem.isBoundless(newTarget.getBlock().getType()) && UtilItem.isBoundless(aboveTarget.getBlock().getType())
|| !UtilItem.isBoundless(aboveTarget.getBlock().getType()) && !UtilItem.isBoundless(newTarget.getBlock().getType()))
break;
//Progress Forwards
curRange += 0.1;
range += 0.1;
end = test.clone();
//Smoke Trail
UtilParticle.PlayParticle(ParticleType.FIREWORKS_SPARK, newTarget.clone().add(0, 0.5, 0), 0, 0, 0, 0, 1,
UtilParticle.PlayParticle(ParticleType.FIREWORKS_SPARK, end.clone().add(0, 0.5, 0), 0, 0, 0, 0, 1,
ViewDist.LONGER, UtilServer.getPlayers());
}
//Modify Range
curRange -= 0.4;
if (curRange < 0)
curRange = 0;
//Destination
Location loc = getDestination(player, curRange);
if (UtilItem.isBoundless(UtilAlg.moveForward(loc, 0.15d, player.getLocation().getYaw(), false).getBlock().getType()))
if (range > 0)
{
loc = UtilAlg.moveForward(loc, 0.25d, player.getLocation().getYaw(), true);
}
if (curRange > 0)
{
player.teleport(loc);
player.teleport(end);
}
player.setFallDistance(0);
//Inform
UtilPlayer.message(player, F.main(GetClassType().name(), "Flash Charges: " + F.elem(_flash.get(player)+"")));
//Effect
player.getWorld().playSound(player.getLocation(), Sound.WITHER_SHOOT, 0.4f, 1.2f);
player.getWorld().playSound(player.getLocation(), Sound.SILVERFISH_KILL, 1f, 1.6f);
}
@Override
@ -218,4 +218,14 @@ public class Flash extends SkillActive
{
return player.getLocation().add(player.getLocation().getDirection().multiply(range).add(new Vector(0, 0.4, 0)));
}
public boolean isAllowTrapping()
{
return _allowTrapping;
}
public void setAllowTrapping(boolean allowTrapping)
{
_allowTrapping = allowTrapping;
}
}