[1.7+] Terra.ya1.ru: Development Thread.

Статус
В этой теме нельзя размещать новые ответы.

xtend

Суетолог
logoz.png
Предисловие:
1. Тема разработки и модификации плагинов для будущих версий сервера Terra.ya1.ru, создана в частности для разработчиков, которые возможно захотят поучаствовать в разработке этих плагинов.
Проще говоря: все новые идеи для создания или модификации плагинов я буду публиковать в этой теме.
2. Данная тема носит экспериментальный характер и предназначена для улучшения работоспособности сервера, а так же для добавления новых фишек.
Тема всегда открыта для обсуждений. Все идеи от сторонних разработчиков будут добавлены и отмечены во втором сообщение темы.
Дополнительная информация по теме:
1. Исходные коды будут публиковаться в свободные источники. [GIT/PASTEBIN]
2. Возможно будет сервер для тестирования альфа-бета версий новых и изменённых плагинов.
Правила разработки:
1. Мы не используем никаких внешних модификаций.
2. Возможно использование лёгко-весых API.
3. Мы не называем названия переменных русским транслитом.
4. Мы не перегружаем код и добиваемся его читабельности.
5. Стараться не использовать большое количество переменных и переопределений.
6. Избегаем больших массивов данных.
7. Желательно использовать Eclipse.
Формат публикации:
1. Основная идея.
2. Чем это может быть полезно.
3. Возможные используемые функции и классы, краткое описание алгоритма их работы. (Из доступных в BukkitAPI).
4. Используемые внешние API (Если имеются.)
5. Ссылка на активный GIT (По желанию.)
В теме не приветствуются:
1. Флуд
2. Сообщения не по теме.
3. Чрезмерное цитирование. Не цитируйте большие посты, просто отметьте ник.
4. Гиперформатирование сообщений. Простые сообщения лучше писать без форматирования.
 
Последнее редактирование:
relpl.png
Активные проекты по улучшению функциональности сервера:
Фикс сессий xAUTH(Системы авторизации): xtend
1. Данный фикс поможет исправить давнюю проблему с сессиями, т.к они генерируются по IP адресу, то наличие нескольких юзеров на одном IP вызывало уязвимость, игрок мог войти от имени другого игрока имея с ним смежный IP адрес.
2. Поможет игрокам, провайдер которых имеет малое количество IP адресов на большое количество юзеров. (В частности ТТК, которые сейчас страдают.)
3. Функции ip2long (из Java) для реализации проверки входа ip адреса пользователя в диапазон IP адресов, в которые входит большое количество пользователей, если IP адрес попал в диапазон, плагин не будет запоминать сессию. Так же нужно добавить команду /loginonce, для одноразовой авторизации без сессии.
4. h2 (Зависимость xAuth), PermissionsEx (Зависимость xAuth), GroupManager (Из Essentials, Зависимость xAuth).
5.Форк: https://github.com/ext4/xAuth
Модификация старого плагина Parties, отображение тега пати над головой игрока: xtend
1. Добавить отображение трёх-четырёх-буквенного тэга с названием пати над головой игрока.
2. Это поможет как при клановых войнах, для опознавания своих и врагов, так и будет просто предоставлять информацию о клане или группе игрока.
3. Множество функций из TagAPI, пока что я сам не разобрался, как оно работает, но в будущем, думаю разберусь) По поводу генерации тэга есть два варианта: Добавление команды для установки тега, либо автоматическая генерация, будут браться три буквы из индекса, спереди, сзади и посередине названия пати. Так же тэг будет отображаться в пати, количество участников в которой будет больше чем "N", для сортировки "живых" пати.
4. TagAPI
5. Позже организую в GITHUB​
 
Последнее редактирование:
@MrCaliB, Терра будет переходить не скоро, ибо у меня в Январе сессия. Доступ к терминалу сервера на данный момент есть только у меня и никто другой не сможет заниматься обновлением сервера, увы, но таковы требования безопасности.
Всё это время будет дорабатываться новый лаунчер от BOGDAN'a, и как только, так по возможности и перейдём на практически любую новую версию.
 
Последнее редактирование:
Думаю пока BOGDAN будет дорабатывать новый лаунчер,уже новая версия выйдет :с
А так удачи!!! Чтоб новый лаунчер был круче :D
 
Мои разработки:
API-Плагин для добавления кастомных предметов
1. Ну как я помню вы писали, что были добавлены новые предметы и подумал, что можно создать плагин который будет грузить кастомные предметы в виде .class .
2. Думаю это облегчит загрузку новых предметов на сервер и можно без изменения основного кода, удалить предмет из сервера.
3. Как я понял, плагин будет использовать файлы ItemStack'ов, Слушателей и импортов из Java и BukkitAPI
4. Единственная библиотека - BukkitAPI
5. Пример плагина который использую на своем сервере: https://github.com/BeYkeRYkt/DinAPI . Инструктаж там не полный. Программная среда: Eclipse

На счет ваших плагинов:
xAuth:
Можно же использовать MAC-Адрес игрока и использовать их как ип.
Parties: А не легче ли сделать через Scoreboard и Teams ? И каждому игроку отправлять пакеты (Ну или посмотрим код в последней версии ClanTag, там вроде добавили тэги кланов через Scoreboard).

Ну и на этом все.
 
@Dinnerspond, что-то наподобии первой идеи уже работает, и даже в версии 3+, что может парсить предметы из YML. По поводу xAUTH и MAC-адресов, MAC-адрес можно получить только тогда, когда ты находишься в одной сети с клиентом. По поводу Scoreboard поподробнее.
 
@XtenD, для работы понадобиться TagAPI (Раньше думал что через Scoreboard, но как видно ошибся), но думаю через Scoreboard скин игрока не потеряется. Ники примерно получатся так:
Tag.jpg

Вот код который взял из ClanTagSC:
Код:
      public static void setTag(String player, String clantag) {
              if(clantag.length() <= 16) {
                WorldServer world = ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle();
                if(clantag == null || clantag.isEmpty()) {
                    clantag = getTag(player, world);
                }

                ScoreboardTeam s = get(clantag);
                world.getScoreboard().addPlayerToTeam(player, s);
              }

          }

      public static void clearTag(String player) {
              WorldServer world = ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle();
              ScoreboardTeam s = getTeam(player, world);
              if(s != null) {
                world.getScoreboard().removePlayerFromTeam(player, s);
              }

          }

          private static ScoreboardTeam getTeam(String player, World world) {
              ScoreboardTeam[] var5;
              int var4 = (var5 = (ScoreboardTeam[])world.getScoreboard().getTeams().toArray(new ScoreboardTeam[world.getScoreboard().getTeams().size()])).length;

              for(int var3 = 0; var3 < var4; ++var3) {
                ScoreboardTeam team = var5[var3];
                if(team.getPlayerNameSet().contains(player)) {
                    return team;
                }
              }

              return null;
          }

          private static String getTag(String player, World world) {
              ScoreboardTeam[] var5;
              int var4 = (var5 = (ScoreboardTeam[])world.getScoreboard().getTeams().toArray(new ScoreboardTeam[world.getScoreboard().getTeams().size()])).length;

              for(int var3 = 0; var3 < var4; ++var3) {
                ScoreboardTeam team = var5[var3];
                if(team.getPlayerNameSet().contains(player)) {
                    return team.getPrefix();
                }
              }

              return "";
          }
         
          private static ScoreboardTeam declareTeam(World world, String name, String clantag) {
                  if(world.getScoreboard().getTeam(name) != null) {
                    world.getScoreboard().removeTeam(world.getScoreboard().getTeam(name));
                  }

                  world.getScoreboard().createTeam(name);
                  world.getScoreboard().getTeam(name).setPrefix(clantag);
                  return world.getScoreboard().getTeam(name);
              }

              private static ScoreboardTeam get(String clantag) {
                  WorldServer world = ((CraftWorld)Bukkit.getWorlds().get(0)).getHandle();
                  Integer[] var5;
                  int var4 = (var5 = (Integer[])list.toArray(new Integer[list.size()])).length;

                  for(int var3 = 0; var3 < var4; ++var3) {
                    int t = var5[var3].intValue();
                    if(world.getScoreboard().getTeam("" + t) != null) {
                        ScoreboardTeam s = world.getScoreboard().getTeam("" + t);
                        if(s.getPrefix().equals(clantag)) {
                          return s;
                        }
                    }
                  }

                  return declareTeam(world, String.valueOf(nextName()), clantag);
              }
             
              private static int nextName() {
                      int at = 0;
                      boolean cont = true;

                      while(cont) {
                        cont = false;
                        Integer[] var5;
                        int var4 = (var5 = (Integer[])list.toArray(new Integer[list.size()])).length;

                        for(int var3 = 0; var3 < var4; ++var3) {
                            int t = var5[var3].intValue();
                            if(t == at) {
                              ++at;
                              cont = true;
                            }
                        }
                      }

                      list.add(Integer.valueOf(at));
                      return at;
                  }
Пришлось использовать декомпилятор fernflower(Хороший декомпилятор, оставляет легкие ошибки).
 
@XtenD , вы уже тут ошибаетесь. Scoreboard появился еще с 1.5, а не с 1.6.
По поводу Scoreboard всё же гляну. Там есть свои подводные камни.
Проверяем эту библиотеку, она весьма интересна:
http://forums.bukkit.org/threads/lib-nametagedit-api-set-prefixes-and-suffixes-on-nametags.146255/
Вышло примерно так, для теста:
Код:
public class TagsListener implements Listener{
    @EventHandler
    public void onPlayerLogin(PlayerJoinEvent event){
        //Да-Да, в одну строку.
        NametagAPI.setPrefix(event.getPlayer().getName(), "[SWAG] ");
    }
}
Результат:
2013-12-06_00.41.47.png
Надо придумать в каком формате отображать:
<clan> nick
clan:nick
clan - nick
clan|nick
и.т.д
 
Последнее редактирование:
@Quish такое невозможно, просто невозможно.
@XtenD хмм... действительно весьма интересный способ делать "ScoreboardTeam" через Packet209Mod
 
Последнее редактирование:
У меня сейчас мозги вспыхнут.
Как насчет
Код:
  [CLAN]
NickName
Или же так невозможно?
 
Ответ на все трудные вопросы у Dinnerspond - Невозможно. Про формат: [Thunderbolts] Quarter_Belt возможно? Чую что Dinnerspond ответит "невозможно".
Это возможно, НО только придется попрощаться с конечностями твоего ника. Максимальный размер ника над головой - 16 символов.
 
Это возможно, НО только придется попрощаться с конечностями твоего ника. Максимальный размер ника над головой - 16 символов.
209 ым пакетом можно впихнуть больше, но нужно ли?
Реализовал подобное через Scoreboard с нативной регистрацией команд, которых будет оочень много.
Кстати был замечен краш клиента, но это скорей всего недостаток оперативы.
Ники игроков:
123123.png
По поводу длинны неймтэга: (Кстати, такую палку видно за милю)
2013-12-06_14.39.00.png
Отображение в Scoreboard:
2013-12-06_14.19.40.png
Код:
public class Tags extends JavaPlugin{
    private Scoreboard scoreboard;
    private List<Team> teams;

    public void onEnable(){
        getServer().getPluginManager().registerEvents(new TagsListener(), this);
        scoreboard = getServer().getScoreboardManager().getMainScoreboard();
        regTeam("red", "Team1");
        regTeam("blue", "Team2");
        teams = Lists.newArrayList(scoreboard.getTeams());
    }
    private void regTeam(String teamname, String teamprefix) {
        if (scoreboard.getTeam(teamName) == null)  scoreboard.registerNewTeam(teamname).setPrefix(teamprefix);
    }
    public class TagsListener implements Listener{
        @EventHandler
        public void onPlayerLogin(PlayerJoinEvent event){
            teams.get(0).addPlayer(event.getPlayer());
        }
    }
}
Думаю сменить List на HashMap, т.к пати не нумеруются как элементы массива.
А хешмап содержит ключи в виде названия пати к её команде.

Опять же интересно каким образом будут подгружаться пати.
Пати создаётся - Регается тима.
Пати удаляется - Удаляется тима.
Игрок выходит из пати - игрока выкидывает из тимы.
Игрок входит в пати - игрока добавляет в тиму.
Пати загружается с диска - ???!
 
Последнее редактирование:
@Dinnerspond, текущий вариант тоже работает, неймтэг пати должен будет генерироваться только при её создании.
 
@XtenD, стоп, как вы сделали никнейм длинне чем 16 О_О ?
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху