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

Статус
Закрыто для дальнейших ответов.

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;
    }
}
 
Сам решил же проблему, если кому-то будет надо тоже что и мне пишите :)
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх