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

del

DonDays

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
DonDays
//delete
 
Последнее редактирование:
Java:
public static int X_LIMIT = 8000;
public static int Z_LIMIT = 3000;
public static int NX_LIMIT = 0;
public static int NZ_LIMIT = 0;

Лучше вывести это в конфиг
 
Вывести в конфиг максимальные значения, либо опрашивать максимальные корды у WorldBorder, либо спрашивать у сервера.
Проверять куда телепортируешь - будет очень не приятно игроку, если его тпшнет в лаву/в воду/на кактус/к аллаху.
И всё.
 
Вывести в конфиг максимальные значения, либо опрашивать максимальные корды у WorldBorder, либо спрашивать у сервера.
Проверять куда телепортируешь - будет очень не приятно игроку, если его тпшнет в лаву/в воду/на кактус/к аллаху.
И всё.
А с помощью Math рандомные корды получить нельзя?
 
Можно, но придётся умножать значение. Но на сколько умножать? Опять обращаться к Math.random()?
Ну можно вот так например сделать:
Код:
  public Location getSafeLocation(World w)
  {
    int randomX = (int)(Math.random() * 1000.0D);
    int randomZ = (int)(Math.random() * 1000.0D);
    int randomY = w.getHighestBlockYAt(randomX, randomZ);
    Location randomLocation = new Location(w, randomX, randomY, randomZ);
    if (randomLocation.getBlock().getBiome().toString().contains("OCEAN")) {
      return getSafeLocation(w);
    }
    return randomLocation.add(0.0D, 1.0D, 0.0D);
  }
 
Ну можно вот так например сделать:
Код:
  public Location getSafeLocation(World w)
  {
    int randomX = (int)(Math.random() * 1000.0D);
    int randomZ = (int)(Math.random() * 1000.0D);
    int randomY = w.getHighestBlockYAt(randomX, randomZ);
    Location randomLocation = new Location(w, randomX, randomY, randomZ);
    if (randomLocation.getBlock().getBiome().toString().contains("OCEAN")) {
      return getSafeLocation(w);
    }
    return randomLocation.add(0.0D, 1.0D, 0.0D);
  }
Говно, а не код.

Во-первых, лучше проверять блок, который оказался под ногами у игрока. Будь то кактус, лава, вода, воздух - вызывать метод поиска рандомной локации по новой.
Во-вторых, проще использовать обычный Random и брать int.

Ещё лучше, если при этом ты будешь проверять ещё и блоки по бокам, от новой локации. Там, напимер, может быть пламя или кактус.
 
Говно, а не код.

Во-первых, лучше проверять блок, который оказался под ногами у игрока. Будь то кактус, лава, вода, воздух - вызывать метод поиска рандомной локации по новой.
Во-вторых, проще использовать обычный Random и брать int.

Ещё лучше, если при этом ты будешь проверять ещё и блоки по бокам, от новой локации. Там, напимер, может быть пламя или кактус.
Приведи пример твоего НЕ говно кода.
 
Ну можно вот так например сделать:
Код:
  public Location getSafeLocation(World w)
  {
    int randomX = (int)(Math.random() * 1000.0D);
    int randomZ = (int)(Math.random() * 1000.0D);
    int randomY = w.getHighestBlockYAt(randomX, randomZ);
    Location randomLocation = new Location(w, randomX, randomY, randomZ);
    if (randomLocation.getBlock().getBiome().toString().contains("OCEAN")) {
      return getSafeLocation(w);
    }
    return randomLocation.add(0.0D, 1.0D, 0.0D);
  }
Stack Overflow'у привет.
 
Ну можно вот так например сделать:
Код:
  public Location getSafeLocation(World w)
  {
    int randomX = (int)(Math.random() * 1000.0D);
    int randomZ = (int)(Math.random() * 1000.0D);
    int randomY = w.getHighestBlockYAt(randomX, randomZ);
    Location randomLocation = new Location(w, randomX, randomY, randomZ);
    if (randomLocation.getBlock().getBiome().toString().contains("OCEAN")) {
      return getSafeLocation(w);
    }
    return randomLocation.add(0.0D, 1.0D, 0.0D);
  }
А если я порезал WB мир с радиусом 350 блоков?
Так же твой метод будет использовать только положительные координаты.
проще использовать обычный Random
Math.random() == new Random().nextDouble()

Ну и в конце как обычно от меня немножко каках, коли меряться собираемся.
Код немного старый, ибо был сдекомпилен и немного улучшен ещё до того, как появился Java8.
Зависимость от WorldBorder.

Java:
public static final List<Integer> BLACKLIST = Arrays.asList(new Integer[]{8, 9, 10, 11, 18, 51, 81});
public Location chooseSpawn(World world) {
    BorderData bd = this.getWorldBorderPlugin().getWorldBorder(world.getName());

    double xmin = bd.getX() - bd.getRadiusX();
    double xmax = bd.getX() + bd.getRadiusX();
    double zmin = bd.getZ() - bd.getRadiusZ();
    double zmax = bd.getZ() + bd.getRadiusZ();

    double xrand = 0;
    double zrand = 0;
    double y = -1;

    do {
        xrand = ThreadLocalRandom.current().nextDouble(xmin, xmax);
        zrand = ThreadLocalRandom.current().nextDouble(zmin, zmax);

        y = getValidHighestY(world, xrand, zrand);

    } while (y == -1);

    Location location = new Location(world, xrand, y, zrand);
    location.setX(location.getBlockX() + 0.5D);
    location.setZ(location.getBlockZ() + 0.5D);

    return location;
}

private double getValidHighestY(World world, double x, double z) {
    world.getChunkAt(new Location(world, x, 0, z)).load();
    int y = 257;
    int blockid = 0;
    while (y >= 0 && blockid == 0) {
        y--;
        blockid = world.getBlockTypeIdAt((int) x, (int) y, (int) z);
    }

    if (y == 0) {
        return -1;
    }

    if (BLACKLIST.contains(blockid)) {
        return -1;
    }

    return y;
}
 
А если я порезал WB мир с радиусом 350 блоков?
Так же твой метод будет использовать только положительные координаты.

Math.random() == new Random().nextDouble()

Ну и в конце как обычно от меня немножко каках, коли меряться собираемся.
Код немного старый, ибо был сдекомпилен и немного улучшен ещё до того, как появился Java8.
Зависимость от WorldBorder.

Java:
public static final List<Integer> BLACKLIST = Arrays.asList(new Integer[]{8, 9, 10, 11, 18, 51, 81});
public Location chooseSpawn(World world) {
    BorderData bd = this.getWorldBorderPlugin().getWorldBorder(world.getName());

    double xmin = bd.getX() - bd.getRadiusX();
    double xmax = bd.getX() + bd.getRadiusX();
    double zmin = bd.getZ() - bd.getRadiusZ();
    double zmax = bd.getZ() + bd.getRadiusZ();

    double xrand = 0;
    double zrand = 0;
    double y = -1;

    do {
        xrand = ThreadLocalRandom.current().nextDouble(xmin, xmax);
        zrand = ThreadLocalRandom.current().nextDouble(zmin, zmax);

        y = getValidHighestY(world, xrand, zrand);

    } while (y == -1);

    Location location = new Location(world, xrand, y, zrand);
    location.setX(location.getBlockX() + 0.5D);
    location.setZ(location.getBlockZ() + 0.5D);

    return location;
}

private double getValidHighestY(World world, double x, double z) {
    world.getChunkAt(new Location(world, x, 0, z)).load();
    int y = 257;
    int blockid = 0;
    while (y >= 0 && blockid == 0) {
        y--;
        blockid = world.getBlockTypeIdAt((int) x, (int) y, (int) z);
    }

    if (y == 0) {
        return -1;
    }

    if (BLACKLIST.contains(blockid)) {
        return -1;
    }

    return y;
}
Здесь я уже сказать ничего не смогу. Вы сильнее меня в жабке :D
 

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

Назад
Верх