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

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

Discussion in 'Разработка плагинов для новичков' started by chief, Oct 29, 2015.

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

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

    Trophy Points:
    76
    Надо настроить плагин под мои потребности но я не понимаю, каким образом это сделать.
    Это кусочек кода на рандомную телепортацию игроков но он имеет одну небольшую проблему. Иногда он телепортирует на спавн.
    Code:
       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 блоков от центра?
     
    Last edited: Oct 30, 2015
  2. Хостинг MineCraft
    <
  3. Reality_SC

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

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Используй, пожалуйста, тег CODE=Java, а не JavaScript :) В нём можно будет копи-пастить текст без номеров строк.
    Сейчас подумаю над твоим вопросом.[DOUBLEPOST=1446186159,1446185626][/DOUBLEPOST]Не очень понял смысл строки Iterator var13 = avoid.iterator(); и всех ниже её. Можешь рассказать?
    Тем временем мне кажется это рабочее:
    Code:
    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);
        }
    }
    
     
    Last edited: Oct 30, 2015
  4. Автор темы
    chief

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

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

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

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

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

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

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

Share This Page