package be.isach.ultracosmetics.v1_9_R2;
import be.isach.ultracosmetics.UltraCosmeticsData;
import be.isach.ultracosmetics.treasurechests.ChestType;
import be.isach.ultracosmetics.treasurechests.TreasureChestDesign;
import be.isach.ultracosmetics.util.MathUtils;
import be.isach.ultracosmetics.util.PacketSender;
import be.isach.ultracosmetics.util.Particles;
import be.isach.ultracosmetics.util.UtilParticles;
import be.isach.ultracosmetics.v1_9_R2.pathfinders.CustomPathFinderGoalPanic;
import be.isach.ultracosmetics.version.IEntityUtil;
import com.google.common.collect.Sets;
import net.minecraft.server.v1_9_R2.*;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_9_R2.CraftWorld;
import org.bukkit.craftbukkit.v1_9_R2.entity.*;
import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftItemStack;
import org.bukkit.entity.Creature;
import org.bukkit.entity.Player;
import org.bukkit.entity.Wither;
import org.bukkit.inventory.Inventory;
import org.bukkit.util.Vector;
import java.lang.reflect.Field;
import java.util.*;
/**
* Created by Sacha on 14/03/16.
*/
public class EntityUtil implements IEntityUtil {
@Override
public void setPassenger(org.bukkit.entity.Entity vehicle, org.bukkit.entity.Entity passenger) {
vehicle.setPassenger(passenger);
}
@Override
public void resetWitherSize(Wither wither) {
((CraftWither) wither).getHandle().l(600);
}
@Override
public void setHorseSpeed(org.bukkit.entity.Entity horse, double speed) {
((CraftHorse) horse).getHandle().getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(speed);
}
Random r = new Random();
private Map<Player, List<EntityArmorStand>> fakeArmorStandsMap = new HashMap<>();
private Map<Player, List<org.bukkit.entity.Entity>> cooldownJumpMap = new HashMap<>();
@Override
public void sendBlizzard(final Player player, Location loc, boolean affectPlayers, Vector v) {
if (!fakeArmorStandsMap.containsKey(player))
fakeArmorStandsMap.put(player, new ArrayList<EntityArmorStand>());
if (!cooldownJumpMap.containsKey(player))
cooldownJumpMap.put(player, new ArrayList<org.bukkit.entity.Entity>());
final List<EntityArmorStand> fakeArmorStands = fakeArmorStandsMap.get(player);
final List<org.bukkit.entity.Entity> cooldownJump = cooldownJumpMap.get(player);
final EntityArmorStand as = new EntityArmorStand(((CraftWorld) player.getWorld()).getHandle());
as.setInvisible(true);
as.setSmall(true);
as.setGravity(false);
as.setArms(true);
as.setHeadPose(new Vector3f((float) (r.nextInt(360)),
(float) (r.nextInt(360)),
(float) (r.nextInt(360))));
as.setLocation(loc.getX() + MathUtils.randomDouble(-1.5, 1.5), loc.getY() + MathUtils.randomDouble(0, .5) - 0.75, loc.getZ() + MathUtils.randomDouble(-1.5, 1.5), 0, 0);
fakeArmorStands.add(as);
for (Player players : player.getWorld().getPlayers()) {
PacketSender.send(players, new PacketPlayOutSpawnEntityLiving(as));
PacketSender.send(players, new PacketPlayOutEntityEquipment(as.getId(), EnumItemSlot.HEAD, CraftItemStack.asNMSCopy(new org.bukkit.inventory.ItemStack(org.bukkit.Material.PACKED_ICE))));
}
UtilParticles.display(Particles.CLOUD, loc.clone().add(MathUtils.randomDouble(-1.5, 1.5), MathUtils.randomDouble(0, .5) - 0.75, MathUtils.randomDouble(-1.5, 1.5)), 2, 0.4f);
Bukkit.getScheduler().runTaskLater(UltraCosmeticsData.get().getPlugin(), new Runnable() {
@Override
public void run() {
for (Player pl : player.getWorld().getPlayers()) {
if(as == null) {
continue;
}
PacketSender.send(pl, new PacketPlayOutEntityDestroy(as.getId()));
}
fakeArmorStands.remove(as);
}
}, 20);
if (affectPlayers)
as.getBukkitEntity().getNearbyEntities(0.5, 0.5, 0.5).stream().filter(ent -> !cooldownJump.contains(ent) && ent != player).forEachOrdered(ent -> {
MathUtils.applyVelocity(ent, new Vector(0, 1, 0).add(v));
cooldownJump.add(ent);
Bukkit.getScheduler().runTaskLater(UltraCosmeticsData.get().getPlugin(), () -> cooldownJump.remove(ent), 20);
});
}
@Override
public void clearBlizzard(Player player) {
if (!fakeArmorStandsMap.containsKey(player)) return;
for (EntityArmorStand as : fakeArmorStandsMap.get(player))
for (Player pl : player.getWorld().getPlayers())
PacketSender.send(pl, new PacketPlayOutEntityDestroy(as.getId()));
fakeArmorStandsMap.remove(player);
cooldownJumpMap.remove(player);
}
@Override
public void clearPathfinders(org.bukkit.entity.Entity entity) {
Entity nmsEntity = ((CraftEntity) entity).getHandle();
try {
Field bField = PathfinderGoalSelector.class.getDeclaredField("b");
bField.setAccessible(true);
Field cField = PathfinderGoalSelector.class.getDeclaredField("c");
cField.setAccessible(true);
bField.set(((EntityInsentient) nmsEntity).goalSelector, Sets.newLinkedHashSet());
bField.set(((EntityInsentient) nmsEntity).targetSelector, Sets.newLinkedHashSet());
cField.set(((EntityInsentient) nmsEntity).goalSelector, Sets.newLinkedHashSet());
cField.set(((EntityInsentient) nmsEntity).targetSelector, Sets.newLinkedHashSet());
} catch (Exception exc) {
exc.printStackTrace();
}
}
@Override
public void makePanic(org.bukkit.entity.Entity entity) {
EntityInsentient insentient = (EntityInsentient) ((CraftEntity) entity).getHandle();
insentient.goalSelector.a(3, new CustomPathFinderGoalPanic((EntityCreature) insentient, 0.4d));
}
@Override
public void sendDestroyPacket(Player player, org.bukkit.entity.Entity entity) {
PacketPlayOutEntityDestroy packet = new PacketPlayOutEntityDestroy(((CraftEntity) entity).getHandle().getId());
((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
}
@Override
public void move(Creature creature, Location loc) {
EntityCreature ec = ((CraftCreature) creature).getHandle();
ec.P = 1;
if (loc == null) return;
ec.getNavigation().a(loc.getX(), loc.getY(), loc.getZ(), (1.0D + 2.0D * 0.5d) * 1.0D);
}
@Override
public void moveDragon(Player player, Vector vector, org.bukkit.entity.Entity entity) {
EntityEnderDragon ec = ((CraftEnderDragon) entity).getHandle();
ec.hurtTicks = -1;
ec.getBukkitEntity().setVelocity(vector);
ec.pitch = player.getLocation().getPitch();
ec.yaw = player.getLocation().getYaw() - 180;
Vector v = ec.getBukkitEntity().getLocation().getDirection();
Vector v1 = ec.getBukkitEntity().getLocation().getDirection().multiply(-1);
ec.move(v1.getX(), v.getY(), v1.getZ());
}
@Override
public void setClimb(org.bukkit.entity.Entity entity) {
((CraftEntity) entity).getHandle().P = 1;
}
@Override
public void moveShip(Player player, org.bukkit.entity.Entity entity, Vector vector) {
EntityBoat ec = ((CraftBoat) entity).getHandle();
ec.getBukkitEntity().setVelocity(vector);
ec.pitch = player.getLocation().getPitch();
ec.yaw = player.getLocation().getYaw() - 180;
ec.move(1, 0, 0);
}
@Override
public void playChestAnimation(Block b, boolean open, TreasureChestDesign design) {
Location location = b.getLocation();
World world = ((CraftWorld) location.getWorld()).getHandle();
BlockPosition position = new BlockPosition(location.getX(), location.getY(), location.getZ());
if (design.getChestType() == ChestType.ENDER) {
TileEntityEnderChest tileChest = (TileEntityEnderChest) world.getTileEntity(position);
world.playBlockAction(position, tileChest.getBlock(), 1, open ? 1 : 0);
} else {
TileEntityChest tileChest = (TileEntityChest) world.getTileEntity(position);
world.playBlockAction(position, tileChest.getBlock(), 1, open ? 1 : 0);
}
}
@Override
public org.bukkit.entity.Entity spawnItem(org.bukkit.inventory.ItemStack itemStack, Location blockLocation) {
EntityItem ei = new EntityItem(
((CraftWorld)blockLocation.clone().add(0.5D, 1.2D, 0.5D).getWorld()).getHandle(),
blockLocation.clone().add(0.5D, 1.2D, 0.5D).getX(),
blockLocation.clone().add(0.5D, 1.2D, 0.5D).getY(),
blockLocation.clone().add(0.5D, 1.2D, 0.5D).getZ(),
CraftItemStack.asNMSCopy(itemStack)) {
private boolean a(EntityItem entityitem) {
return false;
}
};
ei.getBukkitEntity().setVelocity(new Vector(0.0D, 0.25D, 0.0D));
ei.pickupDelay = 2147483647;
ei.getBukkitEntity().setCustomName(UUID.randomUUID().toString());
ei.pickupDelay = 20;
((CraftWorld) blockLocation.clone().add(0.5D, 1.2D, 0.5D).getWorld()).getHandle().addEntity(ei);
return ei.getBukkitEntity();
}
@Override
public boolean isSameInventory(Inventory first, Inventory second) {
return ((CraftInventory) first).getInventory().equals(((CraftInventory) second).getInventory());
}
@Override
public void follow(org.bukkit.entity.Entity toFollow, org.bukkit.entity.Entity follower) {
Entity pett = ((CraftEntity) follower).getHandle();
((EntityInsentient) pett).getNavigation().a(2);
Object petf = ((CraftEntity) follower).getHandle();
Location targetLocation = toFollow.getLocation();
PathEntity path;
path = ((EntityInsentient) petf).getNavigation().a(targetLocation.getX() + 1, targetLocation.getY(), targetLocation.getZ() + 1);
if (path != null) {
((EntityInsentient) petf).getNavigation().a(path, 1.05D);
((EntityInsentient) petf).getNavigation().a(1.05D);
}
}
@Override
public void chickenFall(Player player) {
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
if (!entityPlayer.onGround && entityPlayer.motY < 0.0D) {
Vector v = player.getVelocity();
player.setVelocity(v);
entityPlayer.motY *= 0.85;
}
}
@Override
public void sendTeleportPacket(Player player, org.bukkit.entity.Entity entity) {
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
}
@Override
public boolean isMoving(org.bukkit.entity.Player entity) {
EntityPlayer ent = ((CraftPlayer) entity).getHandle();
long time = System.currentTimeMillis() - ent.I();
if(time > 0.001) {
Bukkit.broadcastMessage("MOVING");
return true;
}
Bukkit.broadcastMessage("NOT MOVING");
return false;
}
}