1.15.1 Can't spawn nmsEntities in old chunks

Discussion in 'Spigot Plugin Development' started by Kepling, Jan 14, 2020.

  1. Hey I'm trying to spawn nms mobs. They spawn fine on a new world made in 1.15.1 But when I try to spawn them in a world made in 1.12.2 and then updated to 1.15.1 it says they spawn but they don't, or at least I can't see or hear them. I tried relogging to see if they would appear but no luck.

    Any help?
     
  2. Could you show your current code?
     
  3. Code (Text):
    package me.kepling.mobs.main;

    import java.lang.reflect.Field;
    import java.text.DecimalFormat;
    import java.util.Iterator;
    import java.util.Random;
    import java.util.UUID;
    import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Creeper;
    import org.bukkit.entity.LivingEntity;
    import org.bukkit.entity.Player;
    import org.bukkit.entity.Skeleton;
    import org.bukkit.entity.Spider;
    import org.bukkit.entity.Zombie;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.SkullMeta;
    import org.bukkit.plugin.java.JavaPlugin;
    import com.mojang.authlib.GameProfile;
    import com.mojang.authlib.properties.Property;

    import me.kepling.mobs.mobs.CreeperFast;
    import me.kepling.mobs.mobs.CreeperStrong;
    import me.kepling.mobs.mobs.CreeperWeak;
    import me.kepling.mobs.mobs.SkeletonArmoured;
    import me.kepling.mobs.mobs.SkeletonFast;
    import me.kepling.mobs.mobs.SkeletonStrong;
    import me.kepling.mobs.mobs.SkeletonWeak;
    import me.kepling.mobs.mobs.SpiderFast;
    import me.kepling.mobs.mobs.SpiderStrong;
    import me.kepling.mobs.mobs.SpiderWeak;
    import me.kepling.mobs.mobs.ZombieArmoured;
    import me.kepling.mobs.mobs.ZombieFast;
    import me.kepling.mobs.mobs.ZombieStrong;
    import me.kepling.mobs.mobs.ZombieWeak;

    import org.bukkit.event.entity.CreatureSpawnEvent;
    import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
    import net.minecraft.server.v1_15_R1.EntityCreeper;
    import net.minecraft.server.v1_15_R1.EntitySkeleton;
    import net.minecraft.server.v1_15_R1.EntitySpider;
    import net.minecraft.server.v1_15_R1.EntityTypes;
    import net.minecraft.server.v1_15_R1.EntityZombie;
    import net.minecraft.server.v1_15_R1.World;

    public class Main extends JavaPlugin implements Listener {

        private static DecimalFormat df0 = new DecimalFormat(".#");

        public void onEnable() {
            getServer().getPluginManager().registerEvents(this, this);
        }

        public void onDisable() {
            for (Iterator<org.bukkit.World> it = Bukkit.getWorlds().iterator(); it.hasNext();) {
                org.bukkit.World world = it.next();

                removeCustomMobs(world);
            }
        }

        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (cmd.getName().equalsIgnoreCase("mobs")) {
                if ((sender instanceof Player)) {
                    Player player = (Player) sender;
                    Location loc = player.getLocation();
                    if (args.length == 0) {
                        if (sender.hasPermission("mobs.command")) {

                        } else {
                            player.sendMessage(
                                    "§cI'm sorry, but you do not have permission to preform this command. Please contact the server administrators if you belive that this is in error.");
                        }
                    } else if (args[0].equalsIgnoreCase("killall")) {
                        if (sender.hasPermission("mobs.killall")) {
                            removeCustomMobs(loc.getWorld());
                        } else {
                            player.sendMessage(
                                    "§cI'm sorry, but you do not have permission to preform this command. Please contact the server administrators if you belive that this is in error.");
                        }
                    } else {
                        if (sender.hasPermission("mobs.spawn")) {

                            EntityTypes<EntityZombie> typeZombie = EntityTypes.ZOMBIE;
                            EntityTypes<EntitySkeleton> typeSkeleton = EntityTypes.SKELETON;
                            EntityTypes<EntityCreeper> typeCreeper = EntityTypes.CREEPER;
                            EntityTypes<EntitySpider> typeSpider = EntityTypes.SPIDER;
                            World world = ((CraftWorld) loc.getWorld()).getHandle();
                            net.minecraft.server.v1_15_R1.Entity mob;

                            switch (args[0]) {
                            default:
                                mob = new EntityZombie(typeZombie, world);
                                break;
                            case "ZombieFast":
                                mob = new ZombieFast(typeZombie, world);
                                break;
                            case "ZombieStrong":
                                mob = new ZombieStrong(typeZombie, world);
                                break;
                            case "ZombieWeak":
                                mob = new ZombieWeak(typeZombie, world);
                                break;
                            case "ZombieArmoured":
                                mob = new ZombieArmoured(typeZombie, world);
                                break;
                            case "SkeletonFast":
                                mob = new SkeletonFast(typeSkeleton, world);
                                break;
                            case "SkeletonStrong":
                                mob = new SkeletonStrong(typeSkeleton, world);
                                break;
                            case "SkeletonWeak":
                                mob = new SkeletonWeak(typeSkeleton, world);
                                break;
                            case "SkeletonArmoured":
                                mob = new SkeletonArmoured(typeSkeleton, world);
                                break;
                            case "CreeperFast":
                                mob = new CreeperFast(typeCreeper, world);
                                break;
                            case "CreeperStrong":
                                mob = new CreeperStrong(typeCreeper, world);
                                break;
                            case "CreeperWeak":
                                mob = new CreeperWeak(typeCreeper, world);
                                break;
                            case "SpiderFast":
                                mob = new SpiderFast(typeSpider, world);
                                break;
                            case "SpiderStrong":
                                mob = new SpiderStrong(typeSpider, world);
                                break;
                            case "SpiderWeak":
                                mob = new SpiderWeak(typeSpider, world);
                                break;
                            }

                            mob.setPosition(loc.getX(), loc.getY(), loc.getZ());

                        } else {
                            player.sendMessage(
                                    "§cI'm sorry, but you do not have permission to preform this command. Please contact the server administrators if you belive that this is in error.");
                        }
                    }

                }
            }
            return false;
        }

        @EventHandler
        public void onCreatureSpawnEvent(CreatureSpawnEvent event) {
            LivingEntity entity = event.getEntity();
            Location loc = entity.getLocation();

            if ((entity instanceof Zombie || entity instanceof Skeleton || entity instanceof Creeper
                    || entity instanceof Spider) && event.getSpawnReason() == SpawnReason.NATURAL) {
                event.setCancelled(true);
               
                if (entity.getNearbyEntities(15, 15, 15).size() < 15) {

                    Random r = new Random();
                    World world = ((CraftWorld) loc.getWorld()).getHandle();
                    net.minecraft.server.v1_15_R1.Entity mob = null;

                    if (entity instanceof Zombie) {
                       
                        EntityTypes<EntityZombie> typeZombie = EntityTypes.ZOMBIE;

                        int typeInt = r.nextInt(4);

                        switch (typeInt) {
                        default:
                            mob = new ZombieFast(typeZombie, world);
                            break;
                        case 1:
                            mob = new ZombieStrong(typeZombie, world);
                            break;
                        case 2:
                            mob = new ZombieWeak(typeZombie, world);
                            break;
                        case 3:
                            mob = new ZombieArmoured(typeZombie, world);
                            break;
                        }

                        if (mob != null) {
                            mob.setPosition(loc.getX(), loc.getY(), loc.getZ());
                        }

                    }
                    if (entity instanceof Skeleton) {

                        EntityTypes<EntitySkeleton> typeSkeleton = EntityTypes.SKELETON;

                        int typeInt = r.nextInt(4);

                        switch (typeInt) {
                        default:
                            mob = new SkeletonFast(typeSkeleton, world);
                            break;
                        case 1:
                            mob = new SkeletonStrong(typeSkeleton, world);
                            break;
                        case 2:
                            mob = new SkeletonWeak(typeSkeleton, world);
                            break;
                        case 3:
                            mob = new SkeletonArmoured(typeSkeleton, world);
                            break;
                        }

                    }
                    if (entity instanceof Creeper) {

                        EntityTypes<EntityCreeper> typeCreeper = EntityTypes.CREEPER;

                        int typeInt = r.nextInt(3);

                        switch (typeInt) {
                        default:
                            mob = new CreeperFast(typeCreeper, world);
                            break;
                        case 1:
                            mob = new CreeperStrong(typeCreeper, world);
                            break;
                        case 2:
                            mob = new CreeperWeak(typeCreeper, world);
                            break;
                        }

                    }
                    if (entity instanceof Spider) {

                        EntityTypes<EntitySpider> typeSpider = EntityTypes.SPIDER;

                        int typeInt = r.nextInt(3);

                        switch (typeInt) {
                        default:
                            mob = new SpiderFast(typeSpider, world);
                            break;
                        case 1:
                            mob = new SpiderStrong(typeSpider, world);
                            break;
                        case 2:
                            mob = new SpiderWeak(typeSpider, world);
                            break;
                        }

                    }
                }
            }
        }

        public void removeCustomMobs(org.bukkit.World world) {
            for (Iterator<LivingEntity> it = world.getLivingEntities().iterator(); it.hasNext();) {
                LivingEntity entity = it.next();
                if (entity.getScoreboardTags().contains("CustomMob")) {
                    entity.remove();
                }
            }
        }

        public static ItemStack getHead(String name) {
            for (Heads head : Heads.values()) {
                if (head.getName().equalsIgnoreCase(name)) {
                    return head.getItemStack();
                }
            }
            return null;
        }

        public static ItemStack createHead(String url, String name, UUID uuid) {
            ItemStack head = new ItemStack(Material.PLAYER_HEAD, 1, (short) 3);
            if (url.isEmpty())
                return head;

            SkullMeta headMeta = (SkullMeta) head.getItemMeta();
            GameProfile profile = new GameProfile(uuid, null);

            profile.getProperties().put("textures", new Property("textures", url));

            try {
                Field profileField = headMeta.getClass().getDeclaredField("profile");
                profileField.setAccessible(true);
                profileField.set(headMeta, profile);

            } catch (IllegalArgumentException | NoSuchFieldException | SecurityException | IllegalAccessException error) {
                error.printStackTrace();
            }
            headMeta.setDisplayName(name);
            head.setItemMeta(headMeta);
            return head;
        }

        public static boolean isNumber(String string) {
            if (string == null || string.isEmpty()) {
                return false;
            }
            int i = 0;
            if (string.charAt(0) == '-') {
                if (string.length() > 1) {
                    i++;
                } else {
                    return false;
                }
            }
            for (; i < string.length(); i++) {
                if (!Character.isDigit(string.charAt(i))) {
                    return false;
                }
            }
            return true;
        }
    }
    I tried making a new 1.15.1 world and then replacing the chunks using MCA Selector.
    Mobs still didn't spawn in the area I copied from the other world but they did spawn outside that area (in the 1.15.1 generated chunks)