1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Создаю ММОРПГ проект (Кастомные мобы, требуется помощь)

Тема в разделе "Разработка плагинов для новичков", создана пользователем slime_j, 11 дек 2021.

Метки:
Статус темы:
Закрыта.
  1. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    Здравствуйте. Я хочу создать ММОРПГ сервер, только начал разбираться в разработке плагинов под майнкарфт. Можно сказать что новичок, зачем взялся сразу за большой проект? Потому что хочу вот и все XD(не осуждайте). Я пытаюсь создать кастомных мобов, что бы при включении сервера на карте в указанных координатах спавнились мобы(со своим названием, какая-то броня, хп, оружие, способности(Например моб ударил игрока и с неким шансом игрока подкидывает), и другие характеристики). На данный момент я создал метод который спавнит лишь 1 моба, метод размещен в onEnable(). Проблема заключается в том, что если я пытаюсь вызвать метод более двух раз в onEnable, спавнится лишь 1 моб(нужно более двух раз). Есть догадка что проблема может быть HashMap, но жду мнение более компитентых людей в этой сфере чем я =)
    Так выглядит код в Main
    Код:
    package custommobs.main;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.logging.Logger;
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.World;
    import org.bukkit.entity.Entity;
    import org.bukkit.plugin.java.JavaPlugin;
    import custommobs.main.components.CustomMob;
    
    
    public class Main extends JavaPlugin{
        private static Main Main;
        public static World world;
        public static int task;
        public Logger log = Bukkit.getLogger();
        public static Map<Entity, CustomMob> entities = new HashMap<>();
        private static int n = 0;
     @Override
     public void onEnable() {
         Main = this;
         log.info("[MOB] Enabled!");
         world = Bukkit.getWorld("world");
         spawnMobs(1304, 90, 745, CustomMob.GRIFER_LVL1, 30*20);
    //     spawnMobs(1308, 91, 749, CustomMob.GRIFER_LVL1, 30*20);
    //     spawnMobs(1310, 91, 756, CustomMob.GRIFER_LVL1, 30*20);
    //     spawnMobs(1305, 91, 752, CustomMob.GRIFER_LVL2, 30*20);
     }
    
     
     
    public static void spawnMobs(int x, int y, int z, CustomMob mobTypes, int spawnTime) {
         n = 0;
    //     Map<Entity, CustomMob> entities = new HashMap<>();
         task = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance1(), () ->{
        
             Set<Entity> spawned = entities.keySet();
             List<Entity> removal = new ArrayList<>();
             //Entity e = (Entity) spawned;
             for(Entity entity : spawned) {
                    if(!entity.isValid()||entity.isDead()) {
                        removal.add(entity);
                        Bukkit.getScheduler().cancelTask(task);
                        n++;
                    }
                }
            if(n==0) {
                spawned.removeAll(removal);
                int diff = 1-entities.size();
                if(diff>=1) {
                    Location loc = new Location(world, x,y,z);
                    CustomMob typeToSpawn = mobTypes;
                    CustomMob type = mobTypes;
                    typeToSpawn = type;
                    entities.put(typeToSpawn.spawn(loc), typeToSpawn);
                }
            }
             if(n>0) {
                 task = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance1(), () ->{
                     spawned.removeAll(removal);
                     int diff = 1-entities.size();
                        if(diff>=1) {
                            Location loc = new Location(world, x,y,z);
                            CustomMob typeToSpawn = mobTypes;
                            CustomMob type = mobTypes;
                            typeToSpawn = type;
                            entities.put(typeToSpawn.spawn(loc), typeToSpawn);
                        }
                        for(Entity entity : spawned) {
                            if(!entity.isValid()||entity.isDead()) {
                                removal.add(entity);
                            }
                        }
                 },spawnTime/2, spawnTime/2);
             }
         },0,10*20);
        
    }
    
     
    
     public Main getInstance1() {
            return Main;
        }
     public static Main getInstance() {
         return Main;
     }
    
    @Override
     public void onDisable() {
        
     }
    }
    
    Так выглядит код в enum class CustomMob
    Код:
    package custommobs.main.components;
    
    import java.util.Arrays;
    import java.util.List;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.attribute.Attribute;
    import org.bukkit.entity.EntityType;
    import org.bukkit.entity.LivingEntity;
    import org.*********ventory.EntityEquipment;
    import org.*********ventory.ItemStack;
    import net.md_5.bungee.api.ChatColor;
    import custommobs.main.Main;
    import custommobs.main.Utils;
    
    public enum CustomMob {
        
        
        GRIFER_LVL1("[§61§f] Разбойник", 30, EntityType.SKELETON, Utils.createItem(Material.NETHERITE_SWORD, 1, true, true, true, ChatColor.GOLD + "Клинок с меткой крови",
                ChatColor.GRAY + "Критический урон " + ChatColor.YELLOW + "%35 "  + "§a✘",
                ChatColor.GRAY + "Вампиризм " + ChatColor.GREEN + "%35 "  + "§c❤",
                ChatColor.DARK_GREEN + "Яд" + ChatColor.DARK_GRAY + " Он убивает...",
                ChatColor.GRAY + "Проклятие крови" + ChatColor.DARK_GRAY + " Иссушает жертву"), Utils.makeArmorSet(new ItemStack(Material.CHAINMAIL_HELMET), new ItemStack(
                Material.CHAINMAIL_CHESTPLATE), new ItemStack(Material.CHAINMAIL_LEGGINGS), new ItemStack(Material.CHAINMAIL_BOOTS)),
                new Lootitem(Utils.createItem(Material.NETHERITE_SWORD, 1, false, true, true, ChatColor.GOLD + "Клинок с меткой крови",
                        ChatColor.GRAY + "Критический урон " + ChatColor.YELLOW + "%35 "  + "§a✘",
                        ChatColor.GRAY + "Вампиризм " + ChatColor.GREEN + "%35 "  + "§c❤",
                        ChatColor.DARK_GREEN + "Яд" + ChatColor.DARK_GRAY + " Он убивает...",
                        ChatColor.GRAY + "Проклятие крови" + ChatColor.DARK_GRAY + " Иссушает жертву"), 1, 1, 88),new Lootitem(Utils.createItem(Material.EMERALD, 1, false, false, false,
            "§aМонетка", "§7Можно обменять на весь мир..."), 1, 10, 88)),
        GRIFER_LVL2("[§61§f] Изверг", 110, EntityType.WITHER_SKELETON, Utils.createItem(Material.NETHERITE_SWORD, 1, true, true, true, ChatColor.GOLD + "Клинок с меткой крови",
                ChatColor.GRAY + "Критический урон " + ChatColor.YELLOW + "%35 "  + "§a✘",
                ChatColor.GRAY + "Вампиризм " + ChatColor.GREEN + "%35 "  + "§c❤",
                ChatColor.DARK_GREEN + "Яд" + ChatColor.DARK_GRAY + " Он убивает...",
                ChatColor.GRAY + "Проклятие крови" + ChatColor.DARK_GRAY + " Иссушает жертву"), Utils.makeArmorSet(new ItemStack(Material.CHAINMAIL_HELMET), new ItemStack(
                Material.CHAINMAIL_CHESTPLATE), new ItemStack(Material.CHAINMAIL_LEGGINGS), new ItemStack(Material.CHAINMAIL_BOOTS)),
                new Lootitem(Utils.createItem(Material.NETHERITE_SWORD, 1, false, true, true, ChatColor.GOLD + "Клинок с меткой крови",
                        ChatColor.GRAY + "Критический урон " + ChatColor.YELLOW + "%35 "  + "§a✘",
                        ChatColor.GRAY + "Вампиризм " + ChatColor.GREEN + "%35 "  + "§c❤",
                        ChatColor.DARK_GREEN + "Яд" + ChatColor.DARK_GRAY + " Он убивает...",
                        ChatColor.GRAY + "Проклятие крови" + ChatColor.DARK_GRAY + " Иссушает жертву"), 1, 1, 88),new Lootitem(Utils.createItem(Material.EMERALD, 1, false, false, false,
            "§aМонетка", "§7Можно обменять на весь мир..."), 1, 10, 88)),
        ;
        
        private String name;
        private double maxHealth;
        private EntityType type;
        private List<Lootitem> lootTable;
        private ItemStack mainItem;
        private ItemStack[] armor;
        
        CustomMob(String name, double maxHealth, EntityType type, ItemStack mainItem, ItemStack[] armor, Lootitem...lootitems ) {
            this.name = name;
            this.maxHealth = maxHealth;
            this.type = type;
            this.mainItem = mainItem;
            this.armor=armor;
            lootTable = Arrays.asList(lootitems);
            
        }
        
        public LivingEntity spawn(Location location) {
            LivingEntity entity = (LivingEntity) location.getWorld().spawnEntity(location, type);
            entity.setCustomNameVisible(true);
            Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance(), () ->{
                entity.setCustomName(Utils.color(name +"§r§c" + (int) entity.getHealth() + "/" + (int) maxHealth + "❤"));
            },0,10);
            entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(maxHealth);
            entity.setHealth(maxHealth);
            EntityEquipment inv = entity.getEquipment();
            if (armor !=null)inv.setArmorContents(armor);
            inv.setBootsDropChance(30);
            inv.setLeggingsDropChance(30);
            inv.setChestplateDropChance(30);
            inv.setHelmetDropChance(30);
            inv.setItemInMainHand(mainItem);
            inv.setItemInMainHandDropChance(30);
            
            return entity;
        }
        
        public void tryDropLoot(Location location) {
            for(Lootitem item: lootTable) {
                item.tryDropItem(location);
            }
        }
        
        public String getName() {
            return name;
        }
        
        public double getMaxHealth() {
            return maxHealth;
        }
    }
    
    
    
     
  2. Автор темы
    slime_j

    slime_j Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    slime_j
    Сам решил же проблему, если кому-то будет надо тоже что и мне пишите :)
     
Статус темы:
Закрыта.

Поделиться этой страницей