Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

[Tutorial/LIB] Создаем Scoreboard'ы

Тема в разделе "Разработка плагинов для новичков", создана пользователем JustBlender, 16 фев 2014.

  1. BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    А ты "p" откуда брал ?
     
  2. Хостинг MineCraft
    <
  3. ShaGTF

    ShaGTF Активный участник Пользователь

    Баллы:
    68
    Имя в Minecraft:
    CoolShaGGy
    Код:
                  ISCOREAPI api = new ISCOREAPI();
                    api.createObjective(ChatColor.DARK_AQUA+"Teams", "Teams");
                    api.createTeam("Player");
                    api.setScore(Bukkit.getOfflinePlayer(ChatColor.RED + "RED"), 0);
                    api.setScore(Bukkit.getOfflinePlayer(ChatColor.BLUE + "BLUE"),
                    api.addPlayerToTeam("Player", p));
                    api.refreshPlayerScoreboard(p);
    Как в коде написано так и писал...
     
  4. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Ты вообще создал эту переменную?
     
  5. BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    "p" - это игрок , которому мы прикрутим Scoreboard. Например:
    PHP:
    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event){
    Player p event.getPlayer();

    ISCOREAPI api = new ISCOREAPI();
                    
    api.createObjective(ChatColor.DARK_AQUA+"Teams""Teams");
                    
    api.createTeam("Player");
                    
    api.setScore(Bukkit.getOfflinePlayer(ChatColor.RED "RED"), 0);
                    
    api.setScore(Bukkit.getOfflinePlayer(ChatColor.BLUE "BLUE"),
                    
    api.addPlayerToTeam("Player"p));
                    
    api.refreshPlayerScoreboard(p);
    //Достижение получено: "Кодер через мобилу"//
    }
     
    ПриветОтЛайки и JustBlender нравится это.
  6. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    ShaGTF, но это уже глупо. Ладно, но это же не английский форум, можно и понять :oops: Подучись кодить (а лучше в скупе добавь, чтобы тем глупых меньше было и я оперативнее помогал :))
     
  7. ShaGTF

    ShaGTF Активный участник Пользователь

    Баллы:
    68
    Имя в Minecraft:
    CoolShaGGy
    Да уж, действительно очень ступил.... Извините, учусь только (Банальная отговорка)
     
  8. Andrew Panassiouk

    Andrew Panassiouk Активный участник Пользователь

    Баллы:
    68
    Skype:
    deathwalker3314
    Имя в Minecraft:
    _TrueLecter_
    Гайд хороший, но есть одно но - кидает ошибку этот код:
    Код:
    private void makeBoard() {
            ISCOREAPI api = new ISCOREAPI();
            api.createObjective(ChatColor.DARK_AQUA + "Очки", "Очки");
            api.createTeam("RED");
            api.createTeam("GREEN");
            api.createTeam("BLUE");
            api.createTeam("YELLOW");
            api.setScore(Bukkit.getOfflinePlayer(ChatColor.RED + "Красный"), 0);
            api.setScore(Bukkit.getOfflinePlayer(ChatColor.BLUE + "Синий"), 0);
            /*
            * api.addPlayerToTeam("Player", p); api.refreshPlayerScoreboard(p);
            */
        }
    
        @Override
        public void onEnable() {
            _log.info("[HtH] Hold The Hill enabled!");
            Bukkit.getPluginManager().registerEvents(this, this);
            kits = new KitUtils(this);
            Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
                public void run() {
                    addScore();
                }
            }, 1);
            makeBoard();
        }
    

    Ошибка такая:
    [​IMG] [/spiler]
     
  9. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Не очень понятно, где 59 строка
     
    ПриветОтЛайки нравится это.
  10. Andrew Panassiouk

    Andrew Panassiouk Активный участник Пользователь

    Баллы:
    68
    Skype:
    deathwalker3314
    Имя в Minecraft:
    _TrueLecter_
    Да-да, ошибся:)
    Там слегка в другом месте ошибка - плагин не экспортировал.
    Там с этим плагинчиком :
    [​IMG]
     
  11. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Дело в том, что метод makeBoard нужно прикреплять именно к игроку.
     
  12. Andrew Panassiouk

    Andrew Panassiouk Активный участник Пользователь

    Баллы:
    68
    Skype:
    deathwalker3314
    Имя в Minecraft:
    _TrueLecter_
    Конкретно на создание жалуется - на эту строку:
    Код:
    ISCOREAPI api = new ISCOREAPI();
    На вот это, уже в ISCOREAPI:
    Код:
    this.board = Bukkit.getScoreboardManager().getNewScoreboard();
    Тобишь на создание объекта.
     
  13. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Странно. Вроде все понятно, создаем класс: ISCOREAPI. Регистрируем их в главном классе. Используем, но в метод onEnable не пихай его
     
  14. Andrew Panassiouk

    Andrew Panassiouk Активный участник Пользователь

    Баллы:
    68
    Skype:
    deathwalker3314
    Имя в Minecraft:
    _TrueLecter_
    Объясню саму затею - есть 4 команды, в ней игроки. Постояли в специальном регионе 1 тик - добавилось 0,005 очка. Скорбоард нужен именно для этой статистики.

    Пробовал как в оигинале сделать - тоже самое.
     
  15. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Дак и пихай ISCOREAPI api = new ISCOREAPI() в метод, где игра начинается.
     
  16. Andrew Panassiouk

    Andrew Panassiouk Активный участник Пользователь

    Баллы:
    68
    Skype:
    deathwalker3314
    Имя в Minecraft:
    _TrueLecter_
    Дык api нужен не локально, а глобально. Полный код класса:
    Код:
    package me.truelecter.hth;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.logging.Logger;
    
    import me.truelecter.hth.kits.KitUtils;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.GameMode;
    import org.bukkit.OfflinePlayer;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scoreboard.Team;
    
    public class HoldTheHill extends JavaPlugin implements Listener {
        private static final Logger _log = Logger.getLogger("Minecraft");
        private KitUtils kits;
        ISCOREAPI api;
     
        private void addScore() {
    
        }
    
        private void makeBoard() {
            api.createObjective(ChatColor.DARK_AQUA + "Очки", "Очки");
            api.createTeam("RED");
            api.createTeam("GREEN");
            api.createTeam("BLUE");
            api.createTeam("YELLOW");
            api.setScore(Bukkit.getOfflinePlayer(ChatColor.RED + "Красный"), 0);
            api.setScore(Bukkit.getOfflinePlayer(ChatColor.BLUE + "Синий"), 0);
            /*
            * api.addPlayerToTeam("Player", p); api.refreshPlayerScoreboard(p);
            */
        }
    
        @Override
        public void onEnable() {
            api = new ISCOREAPI();
            _log.info("[HtH] Hold The Hill enabled!");
            Bukkit.getPluginManager().registerEvents(this, this);
            kits = new KitUtils(this);
            Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
                public void run() {
                    addScore();
                }
            }, 1);
            makeBoard();
        }
    
        public void sendPlayerToGame(Player player, HTHPlayer p) {
            if ((p != null) && (p.getTeam() != HTHTeam.NONE)) {
                p.setState(PlayerState.GAME);
                player.getInventory().clear();
                player.getInventory().setArmorContents(new ItemStack[4]);
                player.setHealth(20);
                player.setFoodLevel(20);
                player.teleport(p.getTeam().getRandomSpawn());
                kits.equiptKit(player);
            }
        }
    
        private void joinToTeam(CommandSender sender, String arg) {
            try {
                HTHPlayer p = getPlayer(sender.getName());
                HTHTeam t = HTHTeam.valueOf(arg.toUpperCase());
                if (t != HTHTeam.NONE) {
                    this.attemptJoin(t, p);
                }
                throw new IllegalArgumentException();
            } catch (IllegalArgumentException e) {
                sender.sendMessage(ChatColor.RED + "Invalid Team specified!");
            }
        }
    
        @Override
        public boolean onCommand(CommandSender sender, Command command,
                String label, String[] args) {
            if (command.getName().equalsIgnoreCase("join")) {
                if (args.length == 1) {
                    switch (args[0]) {
                    case "r": joinToTeam(sender, "RED");
                    case "g": joinToTeam(sender, "GREEN");
                    case "b": joinToTeam(sender, "BLUE");
                    case "y": joinToTeam(sender, "YELLOW");
                    default:
                        sender.sendMessage("Доступные команды :" + "\n"
                                + ChatColor.RED + "Красные - r" + ChatColor.RESET
                                + ", " + "\n" + ChatColor.BLUE + "синие - b"
                                + ChatColor.RESET + ", " + "\n" + ChatColor.GOLD
                                + "желтые - y" + ChatColor.RESET + ", " + "\n"
                                + ChatColor.GREEN + "зеленые - g" + ChatColor.RESET
                                + ".");
                    }
                }
                return true;
            }
            return false;
        }
    
        @EventHandler
        public void onJoin(PlayerJoinEvent event) {
            event.getPlayer().setHealth(20);
            event.getPlayer().setFoodLevel(20);
            event.getPlayer().setGameMode(GameMode.ADVENTURE);
        }
    
        @EventHandler
        public void onQuit(PlayerQuitEvent event) {
            event.setQuitMessage("");
            getServer().broadcastMessage(
                    ChatColor.GRAY + "Игрок " + ChatColor.GOLD
                            + event.getPlayer().getName() + " покинул сервер");
        }
    
        @EventHandler
        public void onPlayerDeath(PlayerDeathEvent e) {
            e.getEntity().setHealth(20);
            e.getEntity().teleport(
                    getPlayer(e.getEntity().getDisplayName()).getTeam()
                            .getRandomSpawn());
        }
    
        public HTHPlayer getPlayer(String name) {
            return null;
        }
    
        public void attemptJoin(HTHTeam team, HTHPlayer p) {
            if (p != null) {
                Player player = Bukkit.getPlayer(p.getName());
                if (player != null) {
                    if (p.getTeam() == HTHTeam.NONE) {
                        int x = team.getNum();
                        Integer[] counts = teamCounts();
                        if (x + 1 - counts[0].intValue() > 2) {
                            player.sendMessage(ChatColor.RED + "Команда полна!");
                            return;
                        }
    
                        p.setTeam(team);
                        api.addPlayerToTeam(team.toString(), player);
                        team.setNum(team.getNum() + 1);
                        player.sendMessage(ChatColor.DARK_PURPLE
                                + "Вы подключились к " + team.getColor()
                                + team.toString());
                        sendPlayerToGame(player, p);
                    } else {
                        player.sendMessage(ChatColor.RED + "В команде же!");
                    }
                }
            }
        }
    
        public Integer[] teamCounts() {
            ArrayList<Integer> x = new ArrayList();
            for (Team t : api.getTeams()) {
                x.add(Integer.valueOf(t.getSize()));
            }
            Integer[] y = new Integer[4];
            y = (Integer[]) x.toArray(y);
            Arrays.sort(y);
            return y;
        }
    
    }
    

    Код:
    api = new ISCOREAPI();
    Поставил это в onEnable()
    Перед этим объявил все функций переменную api:
    Код:
    ISCOREAPI api;
    Тут еще беда. При любом использование скорбоарда летят ошибки. Видимо, сборка буккита с ошибкой.

    Не могли бы вы протестировать плагин у себя? Достаточно будет просто запустить сервер без посторонних плагинов и клиентом написать комманду /join red
     

    Вложения:

    • HtH.zip
      Размер файла:
      39,5 КБ
      Просмотров:
      5
  17. Mr_Grom

    Mr_Grom Активный участник Девелопер Пользователь

    Баллы:
    78
    Имя в Minecraft:
    Failer
    Player[] online = Bukkit.getServer().getOnlinePlayers();
    for (int j = 0; j < online.length; j++) {
    Player o = online[j];
    if(plugin.getConfig().contains("players"+a+"."+o.getName())){
    plugin.sapi.setScoreboard(o);
    int sc = plugin.sapi.getScores(Bukkit.getOfflinePlayer(ChatColor.RED+ "Красный"));
    plugin.sapi.setScore(Bukkit.getOfflinePlayer(ChatColor.RED+ "Красный"), sc + 1); //Присуждаем игроку 1 балл




    ("players"+a+"."+o.getName())){


    что за а ?


    plugin какой именно плугин ему нужен чтобы не ругался
     
  18. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Упс. Удали это, моя вина. (Из своего плагин вытащил)
     
  19. Andrew Panassiouk

    Andrew Panassiouk Активный участник Пользователь

    Баллы:
    68
    Skype:
    deathwalker3314
    Имя в Minecraft:
    _TrueLecter_
    Конструктор класса должен выглядеть как-то так:
    Код:
    public MyClassHelper( MyPlugin plugin ){
     //sapmle text
    }
    В методе onEnable самого плагина ( MyPlugin ) пишешь:
    Код:
    MyClassHelper mch = new MyClassHelper( this );
    
     
  20. Mr_Grom

    Mr_Grom Активный участник Девелопер Пользователь

    Баллы:
    78
    Имя в Minecraft:
    Failer
    @Override
    public void run() {

    int sc = sapi.getScores(Bukkit.getOfflinePlayer(ChatColor.BLUE+ "blabla"));
    sapi.setScore(Bukkit.getOfflinePlayer(ChatColor.BLUE+ "blabla"), sc - 1);

    }


    если на сервере 2 человека отнимает по 2 если 1 то по 1 очку
    вопрос почему и как это лечить
     
  21. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Bukkit.getOfflinePlayer(ChatColor.BLUE+ "blabla")
    Игрок с голубым ником? :eek:
     

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