package me.TheRedViper.NPCFake;
import java.util.List;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_8_R3.util.CraftChatMessage;
import org.bukkit.entity.Player;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.minecraft.server.v1_8_R3.BlockPosition;
import net.minecraft.server.v1_8_R3.DataWatcher;
import net.minecraft.server.v1_8_R3.ItemStack;
import net.minecraft.server.v1_8_R3.MathHelper;
import net.minecraft.server.v1_8_R3.PacketPlayOutAnimation;
import net.minecraft.server.v1_8_R3.PacketPlayOutBed;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntity.PacketPlayOutEntityLook;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityDestroy;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityEquipment;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityHeadRotation;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityStatus;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityTeleport;
import net.minecraft.server.v1_8_R3.PacketPlayOutNamedEntitySpawn;
import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo;
import net.minecraft.server.v1_8_R3.WorldSettings.EnumGamemode;
public class NPC extends Reflections {
int entityID;
Location location;
GameProfile gameProfile;
public NPC(Location location, String name) {
entityID = (int) Math.ceil(Math.random() * 1000) + 2000;
gameProfile = new GameProfile(UUID.randomUUID(), name);
changeSkin();
this.location = location;
}
public void changeSkin() {
String value = "eyJ0aW1lc3RhbXAiOjE0NjQ3MDk2MzgxNDMsInByb2ZpbGVJZCI6IjNjNGFmODc0NGQ5YjQ2ZTA5NWVmYWIwYTR"
+ "hMmQ4MzE1IiwicHJvZmlsZU5hbWUiOiJEaWVGZXJuYmVkaWVudW5nIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRl"
+ "eHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81ZjMwNmE2MmE"
+ "wN2QxMzM2OGZiN2QyZTc1NDA1ZWZmMjJiM2Q1ZWFmMDEwNDUxNjg0NGVmMDI0MmJkYjYwZDgifX19";
String signatur = "yjH0SXqjNoHb+jdryepgz2DnmpxWkckOD3Ro7DDUckWbsPQ/HDM12oGig+rWtSKJYHDD+0/swKF0"
+ "xaA66ux23HdXkLR7fjc7nu/u5acVz2cmArCdmxXpT1i+PO6lu2Vp/mj0F0C4dV0PswAltd4tGV6MXsSP0rrwosv"
+ "4zB8xnkEH1bwC05Hu0siWV/viHExwkmi46P8xXvz473jrVb4ATgRxUw0vX3n41Ws3/f/OugZqIrfcBvn59NZnL6"
+ "YtqOCM29PH2M8eq1AX+foWsJpn/g9Y/JqwIKgDkam3iL4MaghMkC9Qq2aqCa3Q8a2MEgrdItpitAH78Xmca4JxX6"
+ "48AORFrsVJQ9ui8nAsHc4kY9yUDIFVOUgc+7YVcdLIEIclHwnCUXlFQwOWdWKpf5pRShdD6HkjQEBKUl2sVe54Ga"
+ "0SYS/cnUaO0VJwGN7bbT8/o4w5Wi3CUEna4PykfYIPip0q5u7nuo3SZN2rZj+ZkBIaQd2w2TdcZWSf6asL2O68Ul"
+ "yOu+UTokSjOUd6iGTIcD7VexxRSXvle5tSDLRPT2/J1/oslfUeG4WTBSnzvbqBdx4d2C5/xnwzi9tmpFGhqMxO0ZZb"
+ "xc2n6rLl1/vGw8ID6AZOdew60bxVnXxpjiMwLKBPZ21mS+OdOnxLhApOABv1HG895Hhdpo6n2m0VQxY=";
gameProfile.getProperties().put("textures", new Property("textures", value, signatur));
}
public void animation(int animation) {
PacketPlayOutAnimation packet = new PacketPlayOutAnimation();
setValue(packet, "a", entityID);
setValue(packet, "b", (byte) animation);
sendPacket(packet);
}
public void status(int status) {
PacketPlayOutEntityStatus packet = new PacketPlayOutEntityStatus();
setValue(packet, "a", entityID);
setValue(packet, "b", (byte) status);
sendPacket(packet);
}
public void equip(int slot, ItemStack itemstack) {
PacketPlayOutEntityEquipment packet = new PacketPlayOutEntityEquipment();
setValue(packet, "a", entityID);
setValue(packet, "b", slot);
setValue(packet, "c", itemstack);
sendPacket(packet);
}
@SuppressWarnings("deprecation")
public void sleep(boolean state) {
if(state) {
Location bedLocation = new Location(location.getWorld(), 1, 1, 1);
PacketPlayOutBed packet = new PacketPlayOutBed();
setValue(packet, "a", entityID);
setValue(packet, "b", new BlockPosition(bedLocation.getX(), bedLocation.getY(), bedLocation.getZ()));
for(Player p : Bukkit.getOnlinePlayers()) {
p.sendBlockChange(bedLocation, Material.BED_BLOCK, (byte) 0);
}
sendPacket(packet);
teleport(location.clone().add(0, 0.3, 0));
} else {
animation(2);
teleport(location.clone().subtract(0, 0.3, 0));
}
}
public void spawn() {
PacketPlayOutNamedEntitySpawn packet = new PacketPlayOutNamedEntitySpawn();
setValue(packet, "a", entityID);
setValue(packet, "b", gameProfile.getId());
setValue(packet, "c", getFixLocation(location.getX()));
setValue(packet, "d", getFixLocation(location.getY()));
setValue(packet, "e", getFixLocation(location.getZ()));
setValue(packet, "f", getFixRotation(location.getYaw()));
setValue(packet, "g", getFixRotation(location.getPitch()));
setValue(packet, "h", 0);
DataWatcher w = new DataWatcher(null);
w.a(6, 20F);
w.a(10, (byte) 127);
setValue(packet, "i", w);
addToTabList();
sendPacket(packet);
}
public void teleport(Location loc) {
PacketPlayOutEntityTeleport packet = new PacketPlayOutEntityTeleport();
setValue(packet, "a", entityID);
setValue(packet, "b", getFixLocation(loc.getX()));
setValue(packet, "c", getFixLocation(loc.getY()));
setValue(packet, "d", getFixLocation(loc.getZ()));
setValue(packet, "e", getFixRotation(loc.getYaw()));
setValue(packet, "f", getFixRotation(loc.getPitch()));
sendPacket(packet);
this.location = loc;
headRotation(loc.getYaw(), loc.getPitch());
}
public void headRotation(float yaw, float pitch) {
PacketPlayOutEntityLook packet = new PacketPlayOutEntityLook(entityID, getFixRotation(yaw), getFixRotation(pitch), true);
PacketPlayOutEntityHeadRotation packetHead = new PacketPlayOutEntityHeadRotation();
setValue(packetHead, "a", entityID);
setValue(packetHead, "b", getFixRotation(yaw));
sendPacket(packet);
sendPacket(packetHead);
}
public void destroyEntity() {
PacketPlayOutEntityDestroy packet = new PacketPlayOutEntityDestroy(new int[] {entityID});
removeFromTablist();
sendPacket(packet);
}
@SuppressWarnings("unchecked")
public void addToTabList() {
PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo();
PacketPlayOutPlayerInfo.PlayerInfoData data = packet.new PlayerInfoData(gameProfile, 1, EnumGamemode.NOT_SET,
CraftChatMessage.fromString(gameProfile.getName())[0]);
List<PacketPlayOutPlayerInfo.PlayerInfoData> players = (List<PacketPlayOutPlayerInfo.PlayerInfoData>) getValue(packet, "b");
players.add(data);
setValue(packet, "a", PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER);
setValue(packet, "b", players);
sendPacket(packet);
}
@SuppressWarnings("unchecked")
public void removeFromTablist() {
PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo();
PacketPlayOutPlayerInfo.PlayerInfoData data = packet.new PlayerInfoData(gameProfile, 1, EnumGamemode.NOT_SET,
CraftChatMessage.fromString(gameProfile.getName())[0]);
List<PacketPlayOutPlayerInfo.PlayerInfoData> players = (List<PacketPlayOutPlayerInfo.PlayerInfoData>) getValue(packet, "b");
players.add(data);
setValue(packet, "a", PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER);
setValue(packet, "b", players);
sendPacket(packet);
}
public int getFixLocation(double pos) {
return (int) MathHelper.floor(pos * 32.00);
}
public int getEntityId() {
return entityID;
}
public byte getFixRotation(float yawPitch) {
return (byte) ((int) (yawPitch * 256.0F / 360.0F));
}
public Location getLocation() {
return location;
}
public int getEntityID() {
return entityID;
}
}