как сделать что бы entity спавнилось в рандомном месте?

sskail

Пользователь
Сообщения
194
Решения
1
вот мой код:
package entity;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class spawnCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

Player player = (Player) sender;

player.getWorld(Location);
}
}
каак?
 
Решение
Это стоит заменить на ThreadLocalRandom

int y = new Random().nextInt();
Высота имеет четкие ограничения, да и вряд ли моб должен застрять в блоках. Проверять потом на воздух довольно глупо, очень много вызовов пройдет впустую. Если высота, условно, от 0 до 256, почему ты предлагаешь перебирать 232 вариантов?


Java:
final int radius = Integer.MAX_VALUE; // твой радиус мира
final EntityType entityType = EntityType.ZOMBIE; // тип моба
final World world = player.getWorld();

int x = ThreadLocalRandom.current().nextInt(-radius, radius);
int z = ThreadLocalRandom.current().nextInt(-radius, radius);
int y = world.getHighestBlockYAt(x, z);

world.spawnEntity(new Location(x,y,z), entityType);

Это...
Нуу...
Брать 3 рандомных int, смотреть, есть ли там блоки (возможен ли там спавн), если нет, то до тех пор, пока не появится спавн; если да, то спавнить.

Java:
int x = new Random().nextInt();
int y = new Random().nextInt();
int z = new Random().nextInt();

Location locationToSpawnMob = new Location(player.getWorld(), x, y, z);

if (locationToSpawnMob.getBlock().getType() == Material.AIR) {
    //Типа проверка, возможен ли спавн моба в этой локации. Самая элементарная, но не очень хорошая (Т.к. есть блоки, в которых моб может заспавниться и не задохнуться (трава, стекло, вода, ковёр и т.д.))
    locationToSpawnMob.getWorld().spawnEntity(locationToSpawnMob, /* Тип сущности EntityType */, /* Дальше аргументы зависят от того, что тебе надо... */);
} else {
    //Вообще, всё это должно быть в цикле, который будет повторяться до тех пор, пока спавн не будет успешным.
}
 
Это стоит заменить на ThreadLocalRandom

int y = new Random().nextInt();
Высота имеет четкие ограничения, да и вряд ли моб должен застрять в блоках. Проверять потом на воздух довольно глупо, очень много вызовов пройдет впустую. Если высота, условно, от 0 до 256, почему ты предлагаешь перебирать 232 вариантов?


Java:
final int radius = Integer.MAX_VALUE; // твой радиус мира
final EntityType entityType = EntityType.ZOMBIE; // тип моба
final World world = player.getWorld();

int x = ThreadLocalRandom.current().nextInt(-radius, radius);
int z = ThreadLocalRandom.current().nextInt(-radius, radius);
int y = world.getHighestBlockYAt(x, z);

world.spawnEntity(new Location(x,y,z), entityType);

Это решение более правильное. Есть только изъян - моб будет спавнится на самой высокой земле на координатах, то есть не в пещере, а где нибудь на поверхности.
 
Это стоит заменить на ThreadLocalRandom


Высота имеет четкие ограничения, да и вряд ли моб должен застрять в блоках. Проверять потом на воздух довольно глупо, очень много вызовов пройдет впустую. Если высота, условно, от 0 до 256, почему ты предлагаешь перебирать 232 вариантов?


Java:
final int radius = Integer.MAX_VALUE; // твой радиус мира
final EntityType entityType = EntityType.ZOMBIE; // тип моба
final World world = player.getWorld();

int x = ThreadLocalRandom.current().nextInt(-radius, radius);
int z = ThreadLocalRandom.current().nextInt(-radius, radius);
int y = world.getHighestBlockYAt(x, z);

world.spawnEntity(new Location(x,y,z), entityType);

Это решение более правильное. Есть только изъян - моб будет спавнится на самой высокой земле на координатах, то есть не в пещере, а где нибудь на поверхности.
мне как раз в пещере и не надо.
 
Назад
Сверху Снизу