Tanri09YT
Пользователь
- Сообщения
- 31
Разрешается выкладывание кода, файлов конфигураций, логов и т.д. только под BB-код CODE
Всем, привет, можете помочь?
Как сделать так, что бы то, что я положил в 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"), так же если хотите, то можете оформить конфиг файл, что бы красиво смотрелся.
Вот коды, которые у меня пока что есть:
Config.yml:
Как сделать так, что бы то, что я положил в 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"), так же если хотите, то можете оформить конфиг файл, что бы красиво смотрелся.
Вот коды, которые у меня пока что есть:
Код:
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
Последнее редактирование модератором: