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; package mineplex.minecraft.game.classcombat.Skill.Assassin;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Effect; import org.bukkit.Effect;
@ -8,32 +9,35 @@ import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; 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.entity.Player;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType;
import mineplex.core.common.util.F; import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilParticle; 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.UtilPlayer;
import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilWorld; import mineplex.core.common.util.UtilWorld;
import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType;
import mineplex.core.common.util.UtilParticle.ViewDist;
import mineplex.minecraft.game.classcombat.Skill.SkillActive; import mineplex.minecraft.game.classcombat.Skill.SkillActive;
import mineplex.minecraft.game.classcombat.Skill.SkillFactory; import mineplex.minecraft.game.classcombat.Skill.SkillFactory;
import mineplex.minecraft.game.classcombat.Skill.event.SkillTeleportEvent; 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 public class Blink extends SkillActive
{ {
private HashMap<Player, Location> _loc = new HashMap<Player, Location>(); private Map<Player, Location> _loc = new HashMap<>();
private HashMap<Player, Long> _blinkTime = new HashMap<Player, Long>(); private Map<Player, Long> _blinkTime = new HashMap<>();
private boolean _allowTrapping = false;
public Blink(SkillFactory skills, String name, ClassType classType, SkillType skillType, public Blink(SkillFactory skills, String name, ClassType classType, SkillType skillType,
int cost, int levels, int cost, int levels,
@ -60,6 +64,7 @@ public class Blink extends SkillActive
}); });
} }
@SuppressWarnings("deprecation")
@Override @Override
public boolean CustomCheck(Player player, int level) public boolean CustomCheck(Player player, int level)
{ {
@ -97,29 +102,36 @@ public class Blink extends SkillActive
return true; return true;
} }
@Override public void blinky(Player player)
public void Skill(Player player, int level)
{ {
//Smoke Trail Location start = player.getLocation().add(new Vector(0, 0.2, 0));
Block lastSmoke = player.getLocation().getBlock(); 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 maxRange = getMaxRange(player);
double curRange = 0; double range = 0;
while (curRange <= maxRange)
{
Location newTarget = player.getLocation().add(new Vector(0,0.2,0)).add(player.getLocation().getDirection().multiply(curRange));
if (!UtilBlock.airFoliage(newTarget.getBlock()) || !UtilBlock.airFoliage(newTarget.getBlock().getRelative(BlockFace.UP))) rangeLoop: while (range <= maxRange)
break; {
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 //Lock Players
for (Player cur : player.getWorld().getPlayers()) playerLoop: for (Player cur : player.getWorld().getPlayers())
{ {
if (cur.equals(player) || cur.getGameMode() == GameMode.SPECTATOR) if (cur.equals(player) || cur.getGameMode() == GameMode.SPECTATOR || UtilPlayer.isSpectator(cur))
continue; {
continue playerLoop;
}
if (UtilMath.offset(newTarget, cur.getLocation()) > 1) if (UtilMath.offset(test, cur.getLocation()) > 1)
continue; {
continue playerLoop;
}
//Action //Action
Location target = cur.getLocation().add(player.getLocation().subtract(cur.getLocation()).toVector().normalize()); Location target = cur.getLocation().add(player.getLocation().subtract(cur.getLocation()).toVector().normalize());
@ -133,32 +145,108 @@ public class Blink extends SkillActive
return; return;
} }
//Progress Forwards for (Block b : UtilBlock.getInBoundingBox(player.getWorld(), box))
curRange += 0.2; {
if (UtilBlock.airFoliage(b))
{
if (b.getType() == Material.STRING && _allowTrapping)
{
break rangeLoop;
}
}
else
{
break rangeLoop;
}
}
range += 0.2;
end = test.clone();
//Smoke Trail //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()); 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()); _loc.put(player, player.getLocation());
//Action if (range > 0)
if (curRange > 0)
{ {
player.leaveVehicle(); player.teleport(end);
player.teleport(loc); }
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); 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))); 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; package mineplex.minecraft.game.classcombat.Skill.Assassin;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Sound; 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.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
@ -14,22 +16,26 @@ import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import mineplex.core.common.util.F; 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.UtilItem;
import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ParticleType;
import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilParticle.ViewDist;
import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilServer;
import mineplex.core.recharge.Recharge;
import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.event.UpdateEvent;
import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType; import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType;
import mineplex.minecraft.game.classcombat.Skill.SkillActive; import mineplex.minecraft.game.classcombat.Skill.SkillActive;
import mineplex.minecraft.game.classcombat.Skill.SkillFactory; import mineplex.minecraft.game.classcombat.Skill.SkillFactory;
import mineplex.minecraft.game.classcombat.Skill.event.SkillTeleportEvent; 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 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, public Flash(SkillFactory skills, String name, ClassType classType, SkillType skillType,
int cost, int levels, int cost, int levels,
@ -59,6 +65,7 @@ public class Flash extends SkillActive
return "Recharge: #8#-1 Seconds per Charge"; return "Recharge: #8#-1 Seconds per Charge";
} }
@SuppressWarnings("deprecation")
@Override @Override
public boolean CustomCheck(Player player, int level) public boolean CustomCheck(Player player, int level)
{ {
@ -108,99 +115,92 @@ public class Flash extends SkillActive
if (charges >= 1 + level) if (charges >= 1 + level)
continue; 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; continue;
_flash.put(cur, charges + 1); _flash.put(cur, charges + 1);
//Inform //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 @Override
public void Skill(Player player, int level) public void Skill(Player player, int level)
{ {
//Use Recharge //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); _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 maxRange = getMaxRange(player);
double curRange = 0; double range = 0;
while (curRange <= maxRange)
rangeLoop: while (range <= maxRange)
{ {
Location newTarget = player.getLocation().add(new Vector(0,0.2,0)).add(player.getLocation().getDirection().multiply(curRange)); test = start.clone().add(dir.clone().multiply(range));
Location aboveTarget = newTarget.getBlock().getRelative(BlockFace.UP).getLocation(); float halfWidth = ent.width / 2;
float length = ent.length;
// half-slab box = new AxisAlignedBB(test.getX() - halfWidth, test.getY(), test.getZ() - halfWidth, test.getX() + halfWidth, test.getY() + length, test.getZ() + halfWidth);
boolean newTargetIsSlab = newTarget.getBlock().getType() == Material.STEP || newTarget.getBlock().getType() == Material.WOOD_STEP; for (Block b : UtilBlock.getInBoundingBox(player.getWorld(), box))
boolean aboveTargetIsSlab = aboveTarget.getBlock().getType() == Material.STEP || aboveTarget.getBlock().getType() == Material.WOOD_STEP;
boolean newTargetSlabIsBottom = false;
boolean aboveTargetSlabIsBottom = false;
if (newTargetIsSlab && curRange < 0.5)
{ {
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) range += 0.1;
{ end = test.clone();
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;
//Smoke Trail //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()); ViewDist.LONGER, UtilServer.getPlayers());
} }
//Modify Range if (range > 0)
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()))
{ {
loc = UtilAlg.moveForward(loc, 0.25d, player.getLocation().getYaw(), true); player.teleport(end);
}
if (curRange > 0)
{
player.teleport(loc);
} }
player.setFallDistance(0); player.setFallDistance(0);
//Inform
UtilPlayer.message(player, F.main(GetClassType().name(), "Flash Charges: " + F.elem(_flash.get(player)+"")));
//Effect //Effect
player.getWorld().playSound(player.getLocation(), Sound.WITHER_SHOOT, 0.4f, 1.2f); player.getWorld().playSound(player.getLocation(), Sound.WITHER_SHOOT, 0.4f, 1.2f);
player.getWorld().playSound(player.getLocation(), Sound.SILVERFISH_KILL, 1f, 1.6f); player.getWorld().playSound(player.getLocation(), Sound.SILVERFISH_KILL, 1f, 1.6f);
} }
@Override @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))); 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;
}
} }