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

Помогите Рандомная телепортация игроков

Тема в разделе "Разработка плагинов для новичков", создана пользователем chief, 29 окт 2015.

  1. Автор темы
    chief

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

    Баллы:
    76
    Надо настроить плагин под мои потребности но я не понимаю, каким образом это сделать.
    Это кусочек кода на рандомную телепортацию игроков но он имеет одну небольшую проблему. Иногда он телепортирует на спавн.
    Код:
       public void portSelf(Player p) {
          World world = p.getWorld();
          if(world.getEnvironment().equals(Environment.NETHER)) {
             logger.info(p.getDisplayName() + " is randomporting in the nether!");
             this.netherPort(p);
          } else {
             double randomX = (double)((int)(Math.random() * (double)(xmax - xmin)) + xmin + 0.5);
             double randomZ = (double)((int)(Math.random() * (double)(zmax - zmin)) + zmin + 0.5);
             Location tempLoc = new Location(world, randomX, 1.0D, randomZ);
             int highy = world.getHighestBlockYAt(tempLoc);
             Location spot = new Location(world, randomX, (double)highy, randomZ);
             Location loc = new Location(world, randomX, (double)(highy - 1), randomZ);
             Iterator var13 = avoid.iterator();
    
             while(var13.hasNext()) {
                int b = ((Integer)var13.next()).intValue();
                if(loc.getBlock().getTypeId() == b) {
                   this.portSelf(p);
                   return;
                }
             }
          }
       }
    
    Где zmax - максимальные координаты от центра по оси Z
    Гду zmin - минимальныке координати от центра по оси Z
    Где xmax - максимальные координаты от центра по оси X
    Гду xmin - минимальныке координати от центра по оси X

    Вопрос заключается в следующем. Как сделать так, чтобы телепортация происходила от ~ 100 блоков от центра?
     
    Последнее редактирование: 30 окт 2015
  2. Хостинг MineCraft
    <
  3. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Используй, пожалуйста, тег CODE=Java, а не JavaScript :) В нём можно будет копи-пастить текст без номеров строк.
    Сейчас подумаю над твоим вопросом.[DOUBLEPOST=1446186159,1446185626][/DOUBLEPOST]Не очень понял смысл строки Iterator var13 = avoid.iterator(); и всех ниже её. Можешь рассказать?
    Тем временем мне кажется это рабочее:
    Код:
    public void portSelf(Player p)
    {
        // Исходные данные
        double xmax = 1000, xmin = -1000, zmax = 1000, zmin = -1000;
    
        World world = p.getWorld();
        if(world.getEnvironment().equals(Environment.NETHER))
        {
            logger.log(Level.INFO, "{0} is randomporting in the nether!", p.getDisplayName());
            this.netherPort(p);
        } else {
            Location targetLoc = new Location(world, 0.0, 1.0, 0.0);
            for(;;)
            {
               double randomX = 0.5 + xmin + Math.random() * (xmax - xmin);
               double randomZ = 0.5 + zmin + Math.random() * (zmax - zmin);
               if(randomX * randomX + randomZ * randomZ < safeRadius * safeRadius)
                   continue;
               int highestBlockY = world.getHighestBlockYAt(targetLoc);
               targetLoc.setX(randomX);
               targetLoc.setY(highestBlockY - 1);
               targetLoc.setZ(randomZ);
               break;
            }
            p.teleport(targetLoc);
        }
    }
    
     
    Последнее редактирование: 30 окт 2015
  4. Автор темы
    chief

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

    Баллы:
    76
    Получает блоки под игроком и решает телепортировать туда или нет (Черный список блоков, на ки нельзя телепортировать игрока)

    Надо сделать так, чтобы игроков не телепортировало в радиусе 100 блоков от центра мира, или лучше сделать проверку на приват, но я не очень понимаю, как это можно реализовать[DOUBLEPOST=1446187527,1446187086][/DOUBLEPOST]@Reality_SC К вам еще один вопрос. Вы знаток всего :)
    В текст надо вставить табуляцию но у меня не получается это сделать. Пробовал два метода и ничего не получается ("\t" и "%-20s")
    Код:
    left.add(String.format("y:%.2f %s", mc.thePlayer.posY, Direction.directions[heading]));
    Надо передвинуть "%s" на относительное расстояние от "y:%.2f"
     
  5. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Тогда сам :)
    Поменял код выше, глянь. Если я правильно тебя понял ... при выборе случайной координаты не выбирать её ближе к центру карты, чем 100 блоков? В общем, теорема Пифагора наше всё.
    Это будет выводиться в чате? Если да, то печалька, майновские шрифты не моноширные.
    Символ \t это да, табуляция, но не думаю что майн его как-то корректно воспримет — от силы это будет какой-то константной длины пробел.
    В строке формата вместо %.2f попробуй написать %5.2f, это заставит число всегда перед точкой иметь определённое число знаков, лишние справа будут пробелами (либо %05.2f — нулями).
     
  6. Автор темы
    chief

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

    Баллы:
    76
    Увидел, большое спасибо)
     

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