Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Стартап Туториал | Создание плагинов | Spigot/CraftBukkit/Bukkit

Статус
Закрыто для дальнейших ответов.
В любой книге о java - коллекции. Там максимум 80 страниц.
Если люди не могут осилить статью хабра на ~10к символов, то о каких 80 стр может идти речь? Для таких людей это как войну и мир прочитать
 
JavaScript:
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            Player p = (Player) sender;
            if(sender instanceof Player)
            {
                if(cmd.getName().equalsIgnoreCase("lab"))
                {
                   
                    Location loc = p.getLocation();
                    loc.setZ(-20);
                    loc.setX(472);
                    p.setCompassTarget(loc);
                   
                }
     }
     return true;
    }

}
При вводе пишет тип команды нету
 
JavaScript:
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            Player p = (Player) sender;
            if(sender instanceof Player)
            {
                if(cmd.getName().equalsIgnoreCase("lab"))
                {
                  
                    Location loc = p.getLocation();
                    loc.setZ(-20);
                    loc.setX(472);
                    p.setCompassTarget(loc);
                  
                }
     }
     return true;
    }

}
При вводе пишет тип команды нету
В plugin.yml команду добавил?
 
В plugin.yml команду добавил?
Делал всё по этому гайду http://rubukkit.org/threads/tutoria...pigot-craftbukkit-bukkit.133861/#post-1438006 ,а в нём об этом даже не писалось . Спасибо что помогли
В plugin.yml команду добавил?
Вот так ?
JavaScript:
commands:
lab:
 
@_MasterCapeXD_, отлично сделал. Только вот помести все скриншоты под спойлеры.
 
в строку public class Main должны дописать extends JavaPlugin.
Я объяснить зачем начинающим "Дивилоперам" не хочешь ?
Учить интерфейсам надо изучая java и писать плагины уже с каким то базовым набором знаний.
 
Придёт же начинающий "Дивилопер" который не знает основ и будет задавать эти вопросы... И да такие люди всегда будут появляться на рб... Хотя бы сократить бы их количество.
Это форум Bukkit, и глубоко затрагивать именно классы/методы Java здесь нет смысла, для этого есть другие сайты. А тут больше по созданию плагинов на платформе Bukkit/Spigot
@_MasterCapeXD_, отлично сделал. Только вот помести все скриншоты под спойлеры.
Спасибо)
 
Имхо годная инструкция.

Другое дело, что всё портят некоторые "профи", которые, судя по всему, пришли тупо за едой (ибо у меня начал жиром протекать монитор), оставляя вроде как "канстрюгдивнуу гредеку", а годным контентом для многохромосомчатых (на подобии меня) в её резонность её саму не снабдили. Не надо так, кхем.
 
Давно не было продолжения данного туториала, ну и ладно, уже есть)
Сегодня мы научимся создавать собственные GUI!


Мы сделаем так, чтобы гуишка открывалась при вводе команды, так мы и вспомним прошлую часть.
Наш GUI будет менюшкой с двумя иконками - Да и Нет, при нажатии на Да игрок получит ссылку на этот туториал, а при нажатии нет, в чат выведет сообщение:
Вы отказались от получения ссылки.


Что-же, начнем. (по просьбе некоторых пользователей, теперь скринов не будет)

Для начала создадим класс GUIBuilder, и в нем метод addIcon(), чтобы этот метод создавал предметы, которые мы будем устанавливать в GUI. Создавать класс мы уже умеем, так что приступим сразу к коду:
Java:
package ya.top.koder.plugin;

import java.util.List;

import org.bukkit.Material;
import org.*********ventory.ItemStack;
import org.*********ventory.meta.ItemMeta;

public class GUIBuilder
{
   
    public static ItemStack addIcon(Material material, String displayname, List<String> lore)
    {
        ItemStack item = new ItemStack(material);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(displayname);
        meta.setLore(lore);
       
        item.setItemMeta(meta);
       
        return item;
       
    }

}

Мы создали метод addIcon, который использует три аргумента, Предмет material, Строку имени, и список строк - lore (описание предмета). Наш метод возвращает тип ItemStack. В самом теле метода мы создаем экземпляр класса ItemStack, с предметом material (укажем мы предмет уже когда начнем устанавливать предметы в инвентарь), потом мы достаем ItemMeta из нашего предмета item. Когда мы получили мету предмета, мы изменяем ее, устанавливая кастомное имя и описание предмета. После всех этих махинаций мы уже измененную мету вставляем в предмет, после чего возвращаем сам предмет, который уже был обработан методом.

Теперь создадим наш GUI, для начала мы должны создать команду.
В классе Main мы регистрируем команду, устанавливаем обработчик команд и создаем сам класс:
Класс Main:
Java:
package ya.top.koder.plugin;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin
{
   
    public void onEnable()
    {
       
        getLogger().info("Norm");
        getLogger().warning("Not Norm");
        getLogger().severe("Bad");
       
        getServer().getPluginManager().registerEvents(new Join(), this);
        getServer().getPluginCommand("maininfo").setExecutor(new myCommand());
        getServer().getPluginCommand("geturl").setExecutor(new GURLCmd());           
       
    }

Класс GURLCmd:
Java:
package ya.top.koder.plugin;

import java.util.List;

import org.bukkit.Bukkit;
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.*********ventory.Inventory;

public class GURLCmd implements CommandExecutor {
   

    //Создаем список строк для установки описания
   
    //Для иконки Да
    private List<String> lore1;
    //Для иконки Нет
    private List<String> lore2;

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
    {
        if(sender instanceof Player)
        {
            Player player = (Player) sender;
           
            if(cmd.getName().equalsIgnoreCase("geturl"))
            {
                Inventory inv = Bukkit.createInventory(null, 9, "§eПолучить ссылку?");
               
                lore1.add("§eПодтвердить получение ссылки");
                lore2.add("§eОтказаться от получения ссылки");
               
                //Устанавливаем предметы в инвентарь (первый слот начинается от нуля)
                inv.setItem(2, GUIBuilder.addIcon(Material.EMERALD_BLOCK, "§aДа", lore1));
                inv.setItem(6, GUIBuilder.addIcon(Material.REDSTONE_BLOCK, "§cНет", lore2));
               
                //Открываем инвентарь
                player.openInventory(inv);
            }
        }
       
        return true;
    }

}

Тут все понятно по комментариям. Надеюсь)
Ну, разве что, как вы видите, мы обратились к классу GUIBuilder и достали из него метод addIcon, и туда установили свои значения.

Теперь мы должны запретить игроку перетаскивать предметы из инвентаря, для этого мы регистрируем ивент)

Класс Main:
Java:
package ya.top.koder.plugin;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin
{
   
    public void onEnable()
    {
       
        getLogger().info("Norm");
        getLogger().warning("Not Norm");
        getLogger().severe("Bad");
       
        getServer().getPluginManager().registerEvents(new Join(), this);
        getServer().getPluginManager().registerEvents(new Click(), this);
        getServer().getPluginCommand("maininfo").setExecutor(new myCommand());
        getServer().getPluginCommand("geturl").setExecutor(new GURLCmd());           
       
    }

Класс Click:
JavaScript:
package ya.top.koder.plugin;

import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;

public class Click implements Listener
{
   
    @EventHandler
    public void on(InventoryClickEvent e)
    {
       
        //Проверяем инвентарь
        if(e.getInventory().getTitle().equals("§eПолучить ссылку?"))
        {
            //Если он, то отменяем ивент
            e.setCancelled(true);
           
            //Если игрок кликнул по иконке Да, то:
            if((e.getCurrentItem().getType() == Material.EMERALD_BLOCK) && (e.getCurrentItem().getItemMeta().getDisplayName().equals("§aДа")))
            {
                //Проверяем, есть ли это игрок
                if(e.getWhoClicked() instanceof Player)
                {
                    //Если да, устанавливаем игрока как того, кто кликнул и отправляем сообщение
                    Player p = (Player) e.getWhoClicked();
                    p.sendMessage("§6http://rubukkit.org/threads/tutorial-sozdanie-plaginov-spigot-craftbukkit-bukkit.133861/page-3");
                }
            //Или если игрок кликнул по иконке Нет, то:
            } else if((e.getCurrentItem().getType() == Material.REDSTONE_BLOCK) && (e.getCurrentItem().getItemMeta().getDisplayName().equals("§cНет")))
            {
                //Проверяем, есть ли это игрок
                if(e.getWhoClicked() instanceof Player)
                {
                    //Если да, устанавливаем игрока как того, кто кликнул и отправляем сообщение
                    Player p = (Player) e.getWhoClicked();
                    p.sendMessage("§cВы отказались от получения ссылки.");
                }
            }
        }
    }

}

После всего этого не забываем вписать команду в plugin.yml:
Код:
name: RuBukkit
description: Tutorial
author: MasterCapeXD
version: 1.0
main: ya.top.koder.plugin.Main
commands:
  maininfo:
    description: Main info of player
  geturl:
    description: get url of this thread

На этом вроде все. 4 часть туториала подошла к концу.
 
Мда
Вообще в этом смысла я не вижу, и соглашусь с @Mr_RoboMan, не умеешь пользоватся документацией и не знаешь английский хоть чуть - чуть -- лучше даже и не начинать
А если по коду, то так не проще?
Material type = e.getCurremtItem().getType();
p.sendMessage(type == блаблабла1 ? "1" : "2");
Думаю суть этого "сложного" кода понятна.
Дальше.
Создать инвентарь один раз, и итем стак тоже один раз, и использовать private static видимо уже не в моде.
Так же не нужна проверка на имя команды, если команда одна или же, если команды в отдельных классах
 
Последнее редактирование:
Создать инвентарь один раз, и итем стак тоже один раз, и использовать private static видимо уже не в моде.
Насчет этого - не понял, что ты имеешь в виду? Чем тебе не нравится метод addIcon()?
А инвентарь и так только в команде создается, больше нигде не используется
 
Почему обязательно шутка? Хороший сайт, доступно объясняют. Ещё и практики кучу.
Я не пишу, что ничему там нельзя научиться, но профессионалом там не стать. Чтобы стать профессионалом надо не одну книжку прочитать и опыта набираться несколько лет. (КЭП)
 
Почему обязательно шутка? Хороший сайт, доступно объясняют. Ещё и практики кучу.
После самообучения (!) я смотрю на JavaRush, как на отходы жизнедеятельности. Не знаю, кого они могут чему научить...
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх