use of net.minecraft.server.v1_12_R1.MovingObjectPosition in project custom-items-gradle by knokko.
the class Raytracer method raytrace.
/**
* <p>Performs a raytrace from {@code startLocation} towards {@code startLocation + vector}.
* The {@code vector} determines both the direction and the maximum distance of the raytrace!</p>
*
* <p>If an intersection with any block or entity was found, a RaytraceResult representing the intersection
* that is closest to {@code startLocation} will be returned. If no such intersection was found, this
* method will return null.</p>
*
* <p>Entities included in {@code entitiesToExclude} and dropped item entities will be ignored by
* the raytrace.</p>
*
* @param startLocation The location from which the raytrace will start
* @param vector The direction and maximum distance of the raytrace
* @param entitiesToExclude An array of entities that will be ignored by this raytrace, may contain null
* @return A RaytraceResult for the nearest intersection, or null if no intersection was found
*/
public static RaytraceResult raytrace(Location startLocation, Vector vector, Entity... entitiesToExclude) {
// Important variables
World world = startLocation.getWorld();
Vec3D rayStart = new Vec3D(startLocation.getX(), startLocation.getY(), startLocation.getZ());
Vec3D velocityVec = new Vec3D(vector.getX(), vector.getY(), vector.getZ());
Vec3D rayEnd = new Vec3D(rayStart.x + velocityVec.x, rayStart.y + velocityVec.y, rayStart.z + velocityVec.z);
CraftWorld craftWorld = (CraftWorld) world;
WorldServer nmsWorld = craftWorld.getHandle();
// Start with infinity to make sure that any other distance will be shorter
double nearestDistanceSq = Double.POSITIVE_INFINITY;
Vec3D intersectionPos = null;
// The block raytrace
MovingObjectPosition rayResult = nmsWorld.rayTrace(rayStart, rayEnd, true, true, false);
if (rayResult != null && rayResult.type == EnumMovingObjectType.BLOCK) {
double blockDistanceSq = rayResult.pos.distanceSquared(rayStart);
if (blockDistanceSq < vector.lengthSquared()) {
intersectionPos = rayResult.pos;
nearestDistanceSq = blockDistanceSq;
}
}
// The entity raytrace
AxisAlignedBB movementBB = new AxisAlignedBB(rayStart.x, rayStart.y, rayStart.z, rayEnd.x, rayEnd.y, rayEnd.z);
List<net.minecraft.server.v1_12_R1.Entity> nmsEntityList = nmsWorld.getEntities(null, movementBB);
net.minecraft.server.v1_12_R1.Entity intersectedEntity = null;
entityListLoop: for (net.minecraft.server.v1_12_R1.Entity nmsEntity : nmsEntityList) {
// It's currently convenient to ignore dropped items
if (nmsEntity instanceof EntityItem)
continue entityListLoop;
// Since the entities in entitiesToExclude could be null, it's important to call equals() on craftEntity
CraftEntity craftEntity = nmsEntity.getBukkitEntity();
for (Entity exclude : entitiesToExclude) if (craftEntity.equals(exclude))
continue entityListLoop;
// Check if we intersect this entity and check if the distance to it is smaller than the nearest distance so far
MovingObjectPosition entityIntersection = nmsEntity.getBoundingBox().b(rayStart, rayEnd);
if (entityIntersection != null) {
double distanceSq = rayStart.distanceSquared(entityIntersection.pos);
if (distanceSq < nearestDistanceSq) {
nearestDistanceSq = distanceSq;
intersectedEntity = nmsEntity;
intersectionPos = entityIntersection.pos;
}
}
}
// Determining the final result
if (nearestDistanceSq < Double.POSITIVE_INFINITY) {
Location hitLocation = new Location(world, intersectionPos.x, intersectionPos.y, intersectionPos.z);
if (intersectedEntity != null) {
return RaytraceResult.hitEntity(intersectedEntity.getBukkitEntity(), hitLocation);
} else {
return RaytraceResult.hitBlock(hitLocation);
}
} else {
return null;
}
}
use of net.minecraft.server.v1_12_R1.MovingObjectPosition in project Warlords by ebicep.
the class FlagSpawnPointOption method register.
@Override
public void register(Game game) {
this.game = game;
// We register a gamemarker to prevent any captures for our own team if we lost our flag
game.registerGameMarker(FlagCaptureInhibitMarker.class, pFlag -> {
return !(info.getFlag() instanceof SpawnFlagLocation) && info.getTeam() == pFlag.getPlayer().getTeam();
});
game.registerGameMarker(DebugLocationMarker.class, DebugLocationMarker.create(Material.BANNER, 0, this.getClass(), "Flag spawn: " + info.getTeam(), this.info.getSpawnLocation()));
game.registerGameMarker(DebugLocationMarker.class, DebugLocationMarker.create(Material.BANNER, 15, this.getClass(), "Flag: " + info.getTeam(), () -> info.getFlag().getLocation(), () -> info.getFlag().getDebugInformation()));
FlagHolder holder = FlagHolder.create(() -> info);
game.registerGameMarker(FlagHolder.class, holder);
if (this.registerCompassMarker) {
game.registerGameMarker(CompassTargetMarker.class, holder);
}
game.registerGameMarker(ScoreboardHandler.class, scoreboard = new SimpleScoreboardHandler(info.getTeam() == Team.RED ? 20 : 21, "flag") {
@Override
public List<String> computeLines(@Nullable WarlordsPlayer player) {
String flagName = info.getTeam().coloredPrefix();
FlagLocation flag = info.getFlag();
if (flag instanceof SpawnFlagLocation) {
return singletonList(flagName + " Flag: " + ChatColor.GREEN + "Safe");
} else if (flag instanceof PlayerFlagLocation) {
PlayerFlagLocation pFlag = (PlayerFlagLocation) flag;
String extra = pFlag.getPickUpTicks() == 0 ? "" : ChatColor.YELLOW + " +" + pFlag.getComputedHumanMultiplier() + "§e%";
return singletonList(flagName + " Flag: " + ChatColor.RED + "Stolen!" + extra);
} else if (flag instanceof GroundFlagLocation) {
GroundFlagLocation gFlag = (GroundFlagLocation) flag;
return singletonList(flagName + " Flag: " + ChatColor.YELLOW + "Dropped! " + ChatColor.GRAY + gFlag.getDespawnTimerSeconds());
} else {
return singletonList(flagName + " Flag: " + ChatColor.GRAY + "Respawning...");
}
}
});
game.registerEvents(new Listener() {
@EventHandler(priority = EventPriority.LOW)
public void onArmorStandBreak(EntityDamageByEntityEvent event) {
boolean isOurArmorStand = renderer.getRenderedArmorStands().contains(event.getEntity());
WarlordsPlayer wp = Warlords.getPlayer(event.getDamager());
if (wp != null && wp.getGame() == game && isOurArmorStand) {
onFlagInteract(wp);
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW)
public void onPotentialFlagInteract(PlayerInteractEntityEvent event) {
onPotentialFlagInteract((PlayerEvent) event);
}
@EventHandler(priority = EventPriority.LOW)
public void onPotentialFlagInteract(PlayerInteractEvent event) {
onPotentialFlagInteract((PlayerEvent) event);
}
private void onPotentialFlagInteract(PlayerEvent event) {
WarlordsPlayer wp = Warlords.getPlayer(event.getPlayer());
if (wp != null && wp.getGame() == game) {
Location playerLocation = wp.getEntity().getEyeLocation();
Vector direction = wp.getEntity().getLocation().getDirection().multiply(3);
Vec3D from = new Vec3D(playerLocation.getX(), playerLocation.getY(), playerLocation.getZ());
Vec3D to = new Vec3D(playerLocation.getX() + direction.getX(), playerLocation.getY() + direction.getY(), playerLocation.getZ() + direction.getZ());
checkFlagInteract(playerLocation, wp, from, to, renderer);
}
}
private void checkFlagInteract(Location playerLocation, WarlordsPlayer wp, Vec3D from, Vec3D to, FlagRenderer render) {
Location entityLoc = new Location(playerLocation.getWorld(), 0, 0, 0);
for (Entity stand : render.getRenderedArmorStands()) {
stand.getLocation(entityLoc);
if (entityLoc.getWorld() == playerLocation.getWorld() && entityLoc.distanceSquared(playerLocation) < 5 * 5) {
AxisAlignedBB aabb = new AxisAlignedBB(entityLoc.getX() - 0.5, entityLoc.getY(), entityLoc.getZ() - 0.5, entityLoc.getX() + 0.5, entityLoc.getY() + 2, entityLoc.getZ() + 0.5);
MovingObjectPosition mop = aabb.a(from, to);
if (mop != null) {
onFlagInteract(wp);
break;
}
}
}
}
private void onFlagInteract(WarlordsPlayer wp) {
Team team = wp.getTeam();
if (wp.isDeath()) {
return;
}
if (renderer.getLastFlagState() != info.getFlag()) {
// Prevent the player from interacting when the render state is outdated
return;
}
wp.setFlagCooldown(2);
if (info.getFlag() instanceof GroundFlagLocation) {
GroundFlagLocation groundFlagLocation = (GroundFlagLocation) info.getFlag();
if (team == info.getTeam()) {
// Return flag
info.setFlag(new SpawnFlagLocation(info.getSpawnLocation(), wp));
} else {
// Steal flag
info.setFlag(new PlayerFlagLocation(wp, groundFlagLocation.getDamageTimer()));
if (wp.getEntity().getVehicle() != null) {
wp.getEntity().getVehicle().remove();
}
}
} else if (info.getFlag() instanceof SpawnFlagLocation) {
if (team == info.getTeam()) {
// Nothing
wp.sendMessage("§cYou can't steal your own team's flag!");
} else {
// Steal flag
info.setFlag(new PlayerFlagLocation(wp, 0));
wp.getCooldownManager().addCooldown(new RegularCooldown<FlagSpawnPointOption>("Flag Damage Resistance", "RES", FlagSpawnPointOption.class, null, wp, CooldownTypes.BUFF, cooldownManager -> {
}, 15 * 20) {
@Override
public float modifyDamageAfterInterveneFromSelf(WarlordsDamageHealingEvent event, float currentDamageValue) {
return currentDamageValue * .9f;
}
});
}
}
}
});
}
use of net.minecraft.server.v1_12_R1.MovingObjectPosition in project custom-items-gradle by knokko.
the class EntityLineIntersection method distanceToStart.
public static double distanceToStart(Entity entity, Location lineStartLocation, Vector direction, double safeUpperBound) {
net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
Vec3D lineStart = new Vec3D(lineStartLocation.getX(), lineStartLocation.getY(), lineStartLocation.getZ());
Vec3D lineEnd = new Vec3D(lineStartLocation.getX() + safeUpperBound * direction.getX(), lineStartLocation.getY() + safeUpperBound * direction.getY(), lineStartLocation.getZ() + safeUpperBound * direction.getZ());
MovingObjectPosition intersection = nmsEntity.getBoundingBox().b(lineStart, lineEnd);
if (intersection != null) {
return Math.sqrt(intersection.pos.distanceSquared(lineStart));
} else {
return Double.POSITIVE_INFINITY;
}
}
Aggregations