Click NPC help

Discussion in 'Plugin Development' started by SatchelMC, Dec 22, 2020.

Thread Status:
Not open for further replies.
  1. Offline

    SatchelMC

    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 :D

    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");
    
        }
    
    }
    
    
         */
     
Thread Status:
Not open for further replies.

Share This Page