- Баллы
- 96
- Имя в Minecraft
- DonDays
//delete
Последнее редактирование:
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
public static int X_LIMIT = 8000;
public static int Z_LIMIT = 3000;
public static int NX_LIMIT = 0;
public static int NZ_LIMIT = 0;
Спасибо, сейчас выведу.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;
Лучше вывести это в конфиг
А лучше сделай указание радиуса от спавна, в котором будет появляться игрокСпасибо, сейчас выведу.
Еще не разобрался сА лучше сделай указание радиуса от спавна, в котором будет появляться игрок
А с помощью Math рандомные корды получить нельзя?Вывести в конфиг максимальные значения, либо опрашивать максимальные корды у WorldBorder, либо спрашивать у сервера.
Проверять куда телепортируешь - будет очень не приятно игроку, если его тпшнет в лаву/в воду/на кактус/к аллаху.
И всё.
Можно, но придётся умножать значение. Но на сколько умножать? Опять обращаться к Math.random()?А с помощью 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.
Ещё лучше, если при этом ты будешь проверять ещё и блоки по бокам, от новой локации. Там, напимер, может быть пламя или кактус.
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); }
ок.Stack Overflow'у привет.
А если я порезал WB мир с радиусом 350 блоков?Ну можно вот так например сделать:
Код: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); }
Math.random() == new Random().nextDouble()проще использовать обычный Random
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; }
