- Баллы
- 36
- Имя в Minecraft
- slime_j
Здравствуйте. Я хочу создать ММОРПГ сервер, только начал разбираться в разработке плагинов под майнкарфт. Можно сказать что новичок, зачем взялся сразу за большой проект? Потому что хочу вот и все XD(не осуждайте). Я пытаюсь создать кастомных мобов, что бы при включении сервера на карте в указанных координатах спавнились мобы(со своим названием, какая-то броня, хп, оружие, способности(Например моб ударил игрока и с неким шансом игрока подкидывает), и другие характеристики). На данный момент я создал метод который спавнит лишь 1 моба, метод размещен в onEnable(). Проблема заключается в том, что если я пытаюсь вызвать метод более двух раз в onEnable, спавнится лишь 1 моб(нужно более двух раз). Есть догадка что проблема может быть HashMap, но жду мнение более компитентых людей в этой сфере чем я =)
Так выглядит код в Main
Так выглядит код в enum class CustomMob
Так выглядит код в 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() {
}
}
Код:
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;
}
}
