Added utility methods to check for players within a sight pyramid

This commit is contained in:
Cheese 2015-03-25 17:13:22 +11:00
parent 9142227dd4
commit 4a25265c7c
4 changed files with 519 additions and 514 deletions

View File

@ -6,6 +6,7 @@ import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -92,6 +93,10 @@ public class UtilAlg
if (y <= 0) pitch += 90; if (y <= 0) pitch += 90;
else pitch -= 90; else pitch -= 90;
//Fix for two vectors at same Y giving 180
if (pitch == 180)
pitch = 0;
return (float) pitch; return (float) pitch;
} }
@ -244,4 +249,15 @@ public class UtilAlg
return bestLoc; return bestLoc;
} }
public static boolean isInPyramid(Vector a, Vector b, double angleLimit)
{
return (Math.abs(GetPitch(a) - GetPitch(b)) < angleLimit) && (Math.abs(GetYaw(a) - GetYaw(b)) < angleLimit);
}
public static boolean isTargetInPlayerPyramid(Player player, Player target, double angleLimit)
{
return isInPyramid(player.getLocation().getDirection(), UtilAlg.getTrajectory(player.getEyeLocation(), target.getEyeLocation()), angleLimit) ||
isInPyramid(player.getLocation().getDirection(), UtilAlg.getTrajectory(player.getEyeLocation(), target.getLocation()), angleLimit);
}
} }

View File

@ -514,6 +514,26 @@ public class UtilPlayer
return players; return players;
} }
public static HashMap<Player, Double> getPlayersInPyramid(Player player, double angleLimit, double distance)
{
HashMap<Player, Double> players = new HashMap<Player, Double>();
for (Player cur : player.getWorld().getPlayers())
{
if (UtilPlayer.isSpectator(cur))
continue;
//Get lower offset (eye to eye, eye to feet)
double offset = Math.min(UtilMath.offset(player.getEyeLocation(), cur.getEyeLocation()),
UtilMath.offset(player.getEyeLocation(), cur.getLocation()));
if (offset < distance && UtilAlg.isTargetInPlayerPyramid(player, cur, angleLimit))
players.put(cur, 1 - (offset / distance));
}
return players;
}
public static void health(Player player, double mod) public static void health(Player player, double mod)
{ {
if (player.isDead()) if (player.isDead())

View File

@ -39,9 +39,11 @@ import mineplex.core.chat.Chat;
import mineplex.core.common.Rank; import mineplex.core.common.Rank;
import mineplex.core.common.util.C; import mineplex.core.common.util.C;
import mineplex.core.common.util.F; import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilGear;
import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilInv;
import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.cosmetic.CosmeticManager; import mineplex.core.cosmetic.CosmeticManager;
import mineplex.core.creature.Creature; import mineplex.core.creature.Creature;
import mineplex.core.disguise.DisguiseManager; import mineplex.core.disguise.DisguiseManager;
@ -66,6 +68,8 @@ import mineplex.core.status.ServerStatusManager;
import mineplex.core.task.TaskManager; import mineplex.core.task.TaskManager;
import mineplex.core.teleport.Teleport; import mineplex.core.teleport.Teleport;
import mineplex.core.timing.TimingManager; import mineplex.core.timing.TimingManager;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.minecraft.game.classcombat.Class.ClassManager; import mineplex.minecraft.game.classcombat.Class.ClassManager;
import mineplex.minecraft.game.classcombat.Condition.SkillConditionManager; import mineplex.minecraft.game.classcombat.Condition.SkillConditionManager;
import mineplex.minecraft.game.classcombat.Skill.SkillFactory; import mineplex.minecraft.game.classcombat.Skill.SkillFactory;
@ -127,8 +131,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation
private Fire _fire; private Fire _fire;
private ProjectileManager _projectileManager; private ProjectileManager _projectileManager;
private Portal _portal; private Portal _portal;
private ArcadeShop _arcadeShop; private ArcadeShop _arcadeShop;
@ -1197,7 +1199,6 @@ public class ArcadeManager extends MiniPlugin implements IRelation
//Set Spec State //Set Spec State
player.setVelocity(new Vector(0,1,0)); player.setVelocity(new Vector(0,1,0));
// player.setGameMode(GameMode.CREATIVE); //
player.setAllowFlight(true); player.setAllowFlight(true);
player.setFlying(true); player.setFlying(true);
player.setFlySpeed(0.1f); player.setFlySpeed(0.1f);

View File

@ -1500,38 +1500,6 @@ public class SurvivalGames extends SoloGame
Collection<Block> blocks = UtilBlock.getInRadius(event.getEntity().getLocation(), 2.4).keySet(); Collection<Block> blocks = UtilBlock.getInRadius(event.getEntity().getLocation(), 2.4).keySet();
// Iterator<Block> blockIter = blocks.iterator();
// while (blockIter.hasNext())
// {
// Block block = blockIter.next();
//
// block.setType(Material.NETHERRACK);
//
// //Dont destroy above hollow ground
//
// if (!UtilBlock.solid(block.getRelative(BlockFace.DOWN)))
// {
// blockIter.remove();
// continue;
// }
//
// //Unstable, feel free to destroy!
// if (!isStableBlock(block))
// continue;
//
// //Check for block stability via neighbours
// int stableSides = 0;
// if (isStableBlock(block.getRelative(BlockFace.NORTH))) stableSides++;
// if (isStableBlock(bl ck.getRelative(BlockFace.EAST))) stableSides++;
// if (isStableBlock(block.getRelative(BlockFace.SOUTH))) stableSides++;
// if (isStableBlock(block.getRelative(BlockFace.WEST))) stableSides++;
//
// //Stable!
// if (stableSides >= 3)
// blockIter.remove();
// }
Manager.GetExplosion().BlockExplosion(blocks, event.getEntity().getLocation(), false); Manager.GetExplosion().BlockExplosion(blocks, event.getEntity().getLocation(), false);
} }