Сборки серверов

СливПлатные

Сейчас онлайн

  • Zantexx
  • ggdfdgfdgf
  • Watalaker37821
  • smogy
  • Ermachok
  • Muklosh778
  • njsdfnjnsjf
  • vfvssdvssv
  • itsbalint
  • jinelab700
  • jsjzhjs
  • `No name`
  • sh1zaexe
  • maks1ch
  • Kenny McCormik
  • _PrometheuZ_
  • Bonny
  • ChildFreak
  • DimaViper
  • ZeRexVN
  • RichKunG
  • Burokaller
  • VALEIM_
  • Tarekizor
  • Sh1pu4kass
  • FallenGod
  • karvik
  • LiSnow
  • TIGR51
  • artemetra228
  • stereo
  • Archidok
  • He1ly03
  • 3mk
  • ggshe4ka
  • bombombom
  • raarararra
  • Korolevsky
  • ZloyBoy
  • qalis
  • giraffe_999
  • _Smusken_
  • Eurolian
  • dimasF
  • Zoyhi
  • ErbaevKrasavchik
  • ьрл
  • Fura
  • Gleeb2
  • Wh3L1nuxXaaq
  • Def1x213
  • ytfly
  • Animeas1234
  • Myowl
  • CWoors
  • wanthh
  • mifothebest

Можете помочь с созданием плагина на моб спавнинг? (IDE, Maven, Paper)

Tanri
Всем, привет, можете помочь?
Как сделать так, что бы то, что я положил в 11 слот могло бы быть только яйцо призыва (если клали что то другое, то писалось в чат в лс игроку: "Вы можете положить сюда только яйцо призыва!", так же если положить яйцо призыва, то названия яйца будет сохраняться в config.yml файл (и что бы данное яйцо в config файле могло храниться как переменная для кода, которую можно в коде использовать и редактировать если такое возможно), так же что бы после того, как положили яйцо если по нему нажимали пкм, то тогда открывалось другое меню настроек авто спавна, в котором будут кнопки (в любых слотах): "Спавнить раз в: 1 день" (при нажатии на кнопку может заменяться "1 день", на: "1 час", "3 часа", "5 часов", "8 часов", "2 дня", "3 дня", "5 дней", "7 дней", "14 дней", "21 день" , "30 дней."), разумеется данное значение будет говорить о том, через сколько будет спавниться следующая волна мобов (они будут спанвиться рандомно по карте), так же будет значение: "Спавниться по: 1 (здесь будет писаться как раз название того моба, который в config.yml файле, либо который в яйце)" (так же "1" можно заменить на: "3", "5", "8", "10", "15", "20", "30", "50", "60", "80", "100", "150", "200", "300"), так же если хотите, то можете оформить конфиг файл, что бы красиво смотрелся.

Вот коды, которые у меня пока что есть:
Java:
package yt.tanr1.mob_spawning;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.entity.Zombie;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.scheduler.BukkitRunnable;

import java.io.File;
import java.util.Random;

import static java.awt.SystemColor.menu;

public final class Mob_spawning extends JavaPlugin implements CommandExecutor, Listener {

  private static final int SLOT_INDEX = 10; // Слот, в котором будет яйцо призыва
  private static final String CONFIG_KEY = "summonerEggItem"; // Ключ для хранения информации об яйце призыва в config.yml
  private int spawnInterval;
  private int zombieHealth;
  private boolean isBoss;
  private String bossBarName;
  private boolean spawnAtNight;
  private boolean spawnAutomatically;
  private boolean testMessageEnabled;

  private BukkitRunnable autoSpawnTask;

  @Override
  public void onEnable() {
    getLogger().info("Plugin Enabled!");
    Bukkit.getPluginManager().registerEvents(this, this);
    getServer().getPluginCommand("mob_spawning").setExecutor(this);

    setupConfig();
    loadConfig();

    saveDefaultConfig();
    FileConfiguration config = getConfig();
    Bukkit.getPluginManager().registerEvents(this, this);
    if (spawnAutomatically) {
      startAutoSpawn();
    }
  }

  private void setupConfig() {
    File dir = new File(getDataFolder(), "MobSpawning");
    if (!dir.exists()) {
      dir.mkdirs(); // Создаем папку MobSpawning
    }
    saveResource("config.yml", false);
    FileConfiguration config = getConfig();
    config.options().copyDefaults(true);
    saveConfig();
  }

  private void loadConfig() {
    FileConfiguration config = getConfig();
    spawnInterval = config.getInt("mobs.zombie.time", 1);
    zombieHealth = config.getInt("mobs.zombie.hp", 10);
    isBoss = config.getBoolean("mobs.zombie.bossbar", false);
    bossBarName = config.getString("mobs.zombie.bossbar_name", "Зомби");
    spawnAtNight = config.getBoolean("mobs.zombie.spawn", true);
    spawnAutomatically = config.getBoolean("mobs.zombie.autospawn", false);
    testMessageEnabled = config.getBoolean("mobs.zombie.test_message", true);
  }

  @Override
  public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if (args.length > 0 && "reload".equalsIgnoreCase(args[0])) {
      reloadPlugin();
      sender.sendMessage(ChatColor.GREEN + "Плагин перезагружен!");
      return true;
    }

    if (sender instanceof Player) {
      Player player = (Player) sender;
      if (player.hasPermission("permissions.mob_spawning.gui")) {
        openMainMenu(player);
      } else {
        player.sendMessage(ChatColor.RED + "У вас нет разрешения на открытие этого меню!");
      }
      return true;
    }
    return false;
  }

  private void openMainMenu(Player player) {
    Inventory menu = Bukkit.createInventory(null, 54, ChatColor.DARK_GRAY + "Настройки спавна мобов");

    menu.setItem(10, createItem(Material.ZOMBIE_SPAWN_EGG, ChatColor.GRAY + "Настройки спавна зомби"));
    menu.setItem(11, createItem(Material.AIR, ChatColor.GRAY + "Положите сюда яйцо спавна")); // Обеспечиваем, что слот 11 свободен
    menu.setItem(50, createItem(Material.EGG, ChatColor.GRAY + "Настройки спавна для всех мобов"));
    menu.setItem(49, createItem(Material.BARRIER, ChatColor.RED + "Перезагрузить плагин"));

    for (int i = 0; i < 10; i++) {
      if (menu.getItem(i) == null) {
        menu.setItem(i, new ItemStack(Material.GRAY_STAINED_GLASS_PANE)); // Заполнение пустыми слотами
      }
    }
    for (int i = 12; i < 54; i++) {
      if (menu.getItem(i) == null) {
        menu.setItem(i, new ItemStack(Material.GRAY_STAINED_GLASS_PANE)); // Заполнение пустыми слотами
      }
    }

    player.openInventory(menu);
  }

  private ItemStack createItem(Material material, String name) {
    ItemStack item = new ItemStack(material);
    ItemMeta meta = item.getItemMeta();
    if (meta != null) {
      meta.setDisplayName(name);
      item.setItemMeta(meta);
    }
    return item;
  }

  private void reloadPlugin() {
    onDisable();
    onEnable();
  }

  private void saveConfigValues() {
    FileConfiguration config = getConfig();
    config.set("mobs.zombie.time", spawnInterval);
    config.set("mobs.zombie.hp", zombieHealth);
    config.set("mobs.zombie.bossbar", isBoss);
    config.set("mobs.zombie.bossbar_name", bossBarName);
    config.set("mobs.zombie.spawn", spawnAtNight);
    config.set("mobs.zombie.autospawn", spawnAutomatically);
    config.set("mobs.zombie.test_message", testMessageEnabled);
    saveConfig();
  }

  private void spawnZombie() {
    Random random = new Random();
    Location location = new Location(Bukkit.getWorld("world"), random.nextInt(100) - 50, 64, random.nextInt(100) - 50);
    if (location.getBlock().getType() == Material.AIR && location.clone().add(0, -1, 0).getBlock().getType().isSolid()) {
      Zombie zombie = location.getWorld().spawn(location, Zombie.class);
      zombie.setHealth(zombieHealth);

      // Проверка босс бара
      if (isBoss) {
        // Логика для создания босс бара (например, с использованием BossBar API)
      }

      if (testMessageEnabled) {
        Bukkit.broadcastMessage(ChatColor.GREEN + "Зомби был заспавнен на координатах: " +
          location.getBlockX() + ", " + location.getBlockY() + ", " + location.getBlockZ());
      }
    }
  }

  private void startAutoSpawn() {
    if (spawnAutomatically) {
      autoSpawnTask = new BukkitRunnable() {
        @Override
        public void run() {
          spawnZombie();
        }
      };
      autoSpawnTask.runTaskTimer(this, spawnInterval * 20 * 60, spawnInterval * 20 * 60);
    }
  }
  @EventHandler
  public void onInventoryClick(InventoryClickEvent event) {
    Player player = (Player) event.getWhoClicked();
    Inventory inventory = event.getInventory();

    // Проверяем, что это нужное меню
    if (inventory.getType().equals("Меню Инвентаря")) {
      event.setCancelled(true);

      // Если кликнули ЛКМ по слоту 11
      if (event.getSlot() == 11 && event.getCurrentItem() != null && event.getCurrentItem().getType() != Material.AIR) {
        // Сохранение яйца в конфиг
        saveSpawnEggInConfig(event.getCurrentItem());
        // Открываем меню настроек
        openSpawnSettingsMenu(player);
      } else if (event.getSlot() == 11 && event.getCurrentItem() != null &&
        event.getCurrentItem().getType() != Material.ZOMBIE_SPAWN_EGG) {
        player.sendMessage("Вы можете положить сюда только яйца призыва!");
      }
    }
  }

  // Метод для сохранения яйца в конфигурации
  private void saveSpawnEggInConfig(ItemStack egg) {
    String eggKey = egg.getType().toString().toLowerCase();
    getConfig().set("mobs." + eggKey + ".id", eggKey);
    saveConfig();
  }

  // Метод для открытия меню настроек спавна
  public void openSpawnSettingsMenu(Player player) {
    Inventory settingsMenu = Bukkit.createInventory(null, 27, "Настройки Спавна");

    // Пример настройки времени
    settingsMenu.setItem(0, createSettingsItem("Как часто это будет происходить:", "1 раз в час"));
    settingsMenu.setItem(1, createSettingsItem("Сколько будет спавнов данных мобов за раз:", "1"));

    player.openInventory(settingsMenu);
  }

  // Метод для создания предметов настроек
  public ItemStack createSettingsItem(String title, String description) {
    ItemStack item = new ItemStack(Material.PAPER);
    // Добавьте ItemMeta для создания более профессионального представления
    return item; // Поменяйте это на возвращение предмета с метаданными
  }

  @EventHandler
  public void onSettingsMenuClick(InventoryClickEvent event) {
    Player player = (Player) event.getWhoClicked();
    Inventory inventory = event.getInventory();

    if (inventory.getType().equals("Настройки Спавна")) {
      event.setCancelled(true);
      // Логика обработки нажатий на элементы настроек
      // Здесь можно обрабатывать изменение времени и количества спавнов
    }
  }
}

config.yml:
mobs:
zombie:
id: zombie_spawn_egg
 
Последнее редактирование модератором:
ВерхНиз