So i made an NPC with nms, no dependencies or API. But i have 2 issues that would be cool if i could get some help to squash. I don't know how to give my NPC items when the player joins. Another thing is how do i make an NPC interact event. I have tried many methods; that all fail. Any help is appreceated Code: package zach.hubcore.how.Util.NPCs; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.UUID; import net.minecraft.server.v1_8_R3.*; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.craftbukkit.v1_8_R3.CraftServer; import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack; import org.bukkit.entity.Player; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import zach.hubcore.how.Main; import zach.hubcore.how.Util.SpawnSetupConfig; import zach.hubcore.how.Util.Var; import static zach.hubcore.how.Util.Var.sfg; public class NPC implements Listener { protected Player player; private Main mainClass = Main.getInstance(); protected Player player2; private EntityPlayer npc; public String[] getFromPlayer(Player playerBukkit) { EntityPlayer playerNMS = ((CraftPlayer) playerBukkit).getHandle(); GameProfile profile = playerNMS.getProfile(); Property property = profile.getProperties().get("textures").iterator().next(); String texture = property.getValue(); String signature = property.getSignature(); return new String[] {texture, signature}; } public String[] getFromName(String name) { try { URL url_0 = new URL("https://api.mojang.com/users/profiles/minecraft/" + name); InputStreamReader reader_0 = new InputStreamReader(url_0.openStream()); String uuid = new JsonParser().parse(reader_0).getAsJsonObject().get("id").getAsString(); URL url_1 = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid + "?unsigned=false"); InputStreamReader reader_1 = new InputStreamReader(url_1.openStream()); JsonObject textureProperty = new JsonParser().parse(reader_1).getAsJsonObject().get("properties").getAsJsonArray().get(0).getAsJsonObject(); String texture = textureProperty.get("value").getAsString(); String signature = textureProperty.get("signature").getAsString(); return new String[] {texture, signature}; } catch (IOException e) { System.err.println("Could not get skin data from session servers!"); e.printStackTrace(); return null; } } public void addNpcClient(String playerName, Player player) { String[] a = getFromName(playerName); MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); WorldServer world = ((CraftWorld) player.getWorld()).getHandle(); GameProfile profile = new GameProfile(UUID.randomUUID(), ""); profile.getProperties().put("textures", new Property("textures", a[0], a[1])); EntityPlayer npc = new EntityPlayer(server, server.getWorldServer(0), profile, new PlayerInteractManager(server.getWorldServer(0))); //NPC top skin layer DataWatcher watcher = npc.getDataWatcher(); // The NPC Data Watcher watcher.watch(10, (byte) 127); // Get the skin layer PacketPlayOutEntityMetadata packet4 = new PacketPlayOutEntityMetadata(npc.getId(), watcher, true); // Add the watcher to the entity metadata //Item in hand itemstack paramaters ItemStack apple = new ItemStack(Material.PAPER); PacketPlayOutEntityEquipment packet = new PacketPlayOutEntityEquipment(npc.getId(), 0 , CraftItemStack.asNMSCopy(apple)); //Spawn Paramaters npc.setLocation(sfg.getDouble("lobby.spawn.X"), sfg.getDouble("lobby.spawn.Y"), sfg.getDouble("lobby.spawn.Z"),(float) sfg.getDouble("lobby.spawn.Yaw"), (float) sfg.getDouble("lobby.spawn.Pitch")); // PlayerConnection connection = ((CraftPlayer)player).getHandle().playerConnection; ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, npc)); connection.sendPacket(packet); connection.sendPacket(packet4); ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutNamedEntitySpawn(npc)); //Set Position of Yaw ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.yaw * 256 / 360))); PacketPlayOutPlayerInfo removeNPC = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, npc); new BukkitRunnable() { @Override public void run() { connection.sendPacket(removeNPC); } }.runTaskLater(mainClass, 20); } public EntityPlayer getNPC() { return npc; } @EventHandler public void onJoinNPC(PlayerJoinEvent e) { Player player = e.getPlayer(); addNpcClient(player.getName(), player); new BukkitRunnable() { @Override public void run() { } }.runTaskLater(mainClass, 10); } @EventHandler public void onRespawnNPC(PlayerRespawnEvent e) { Player player = e.getPlayer(); SpawnSetupConfig.teleportPlayerToLocation(player, Var.cfg, "spawn"); new BukkitRunnable() { @Override public void run() { addNpcClient(player.getName(), player); } }.runTaskLater(mainClass, 10); } //TODO: make this guy actually do something when i click him @EventHandler public void onNpcClick(PlayerInteractEntityEvent e) { Player player = e.getPlayer(); player.sendMessage(ChatColor.GOLD + "Sent"); } } */