Помогите Спавн сундука в случайную позицию

Статус
Закрыто для дальнейших ответов.

Lisenochek

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Lisenochek
Всем привет. Подскажите, как спавнить сундук в случайном месте, а точнее, допустим (10, 0, 10) и до (20, 0, 10).

Вот кусочек кода:
JavaScript:
Всем привет. Подскажите, как спавнить сундук в случайном месте, а точнее, допустим (10, 0, 10) и до (20, 0, 10).

Вот кусочек кода:

Код (Javascript):
for (Player p : Bukkit.getOnlinePlayers()) {
            if (r.nextInt(1000) <= 500) {
              
                Location loc = p.getLocation().add(10, 0, 10);
                Block block = loc.getBlock();
                loc.getBlock().setType(Material.CHEST);
                Chest chest = (Chest)block.getState();
                Inventory inv = chest.getInventory();
              
                inv.addItem(API.splint, API.bandage);
                MessageManager.getManager().msg(p, MsgType.SUCCESS, "Я видел странный самолет, который сбросил ящик недалеко от меня.");
            }
        }
 
Так в чём проблема?Берёшь класс Random и генерируешь рандомные координаты.
 
Java:
    public Location generateBlocks(Location loc1, Location loc2)
    {
    ArrayList<Location> blocks = new ArrayList<Location>();
        int topBlockX = (loc1.getBlockX() < loc2.getBlockX() ? loc2.getBlockX() : loc1.getBlockX());
        int bottomBlockX = (loc1.getBlockX() > loc2.getBlockX() ? loc2.getBlockX() : loc1.getBlockX());

        int topBlockY = (loc1.getBlockY() < loc2.getBlockY() ? loc2.getBlockY() : loc1.getBlockY());
        int bottomBlockY = (loc1.getBlockY() > loc2.getBlockY() ? loc2.getBlockY() : loc1.getBlockY());

        int topBlockZ = (loc1.getBlockZ() < loc2.getBlockZ() ? loc2.getBlockZ() : loc1.getBlockZ());
        int bottomBlockZ = (loc1.getBlockZ() > loc2.getBlockZ() ? loc2.getBlockZ() : loc1.getBlockZ());

        for(int x = bottomBlockX; x <= topBlockX; x++)
        {
            for(int z = bottomBlockZ; z <= topBlockZ; z++)
            {
                for(int y = bottomBlockY; y <= topBlockY; y++)
                {
                    Block block = loc1.getWorld().getBlockAt(x, y, z);
                    if (block.getType() == Material.AIR) {
                        if (block.getRelative(BlockFace.DOWN).getType() != Material.AIR) {
                            blocks.add(block.getLocation());
                        }
                    }
                }
            }
        }
        Collections.shuffle(blocks);
        return blocks.get(new Random().nextInt(blocks.size()));
    }
 
Так в чём проблема?Берёшь класс Random и генерируешь рандомные координаты.

Дэк я пытался, но он спавнил сундук на высоте 4 блока в воздухе, а мне надо, чтобы он
спавнил его на максимальной высоте, где есть блок, т.е на землю.

Вот код:
JavaScript:
for (Player p : Bukkit.getOnlinePlayers()) {

            if (r.nextInt(1000) <= 500) {
             
                int x = r.nextInt(10) + 2;
                int z = r.nextInt(10) + 2;
                int y = p.getLocation().getWorld().getHighestBlockYAt(x, z);
                             
                Location loc = p.getLocation().add(x, y, z);             
                Block block = loc.getBlock();
                loc.getBlock().setType(Material.CHEST);
                Chest chest = (Chest)block.getState();
                Inventory inv = chest.getInventory();
             
                ml.Crate.put(chest.getInventory().getName(), true);
             
                inv.addItem(API.splint, API.bandage);

И это таймер.
 
Здесь не добавляй y,вместо него впиши 1
Спавнит теперь на 1 блок в воздухе
Спавнит теперь на 1 блок в воздухе
И проверка почему-то не работает. Встану я на дом, а он спавнит его на моей высоте в воздухе
 
Спавнит теперь на 1 блок в воздухе

И проверка почему-то не работает. Встану я на дом, а он спавнит его на моей высоте в воздухе
Проверка и не будет работать(твой y нигде не используется),а вместо 1 впиши ноль(логика).Советую сделать так чтобы твой рандом мог и в минус уходить,да и сделай проверку где будет появлятся сундук(иначе игроки будут им грифирить)
 
А то что я дал не походит чтоли?
Location chestloc = generateBlocks(loc1,loc2);
 
У вас слишком запутанный способ.)
Ну всмысле запутанный? Передаешь две локации, метод получает все блоки, проверяет что это воздух и что под ним есть блок, и выдает один рандомный блок с локацией.
 
Ну всмысле запутанный? Передаешь две локации, метод получает все блоки, проверяет что это воздух и что под ним есть блок, и выдает один рандомный блок с локацией.
Я это понимаю,а вот как использовать чужие методы автор темы не понимает(не понимал).
 
Я это понимаю,а вот как использовать чужие методы автор темы не понимает(не понимал).
Я конечно все понимаю (нет), но как тогда использовать y, если надо ставить в строчке 0 ? Все равно ничего не понимаю...
 
Я конечно все понимаю (нет), но как тогда использовать y, если надо ставить в строчке 0 ? Все равно ничего не понимаю...
Просто после
Код:
Location loc = p.getLocation().add(x, y, z);
Допишите:
Код:
loc.setY(y);
 
Пытался сделать проверку на наличие блока, но что-то пошло не так и он ломает и ставит на место блока сундук.

JavaScript:
for (Player p : Bukkit.getOnlinePlayers()) {

            if (r.nextInt(1000) <= 500) {
               
                if(p.getLocation().getBlock().getType() == Material.AIR) {
                               
                    int x = r.nextInt(10) + 2;
                    int z = r.nextInt(10) + 2;
                    int y = p.getLocation().getWorld().getHighestBlockYAt(x, z);
                   
                    Location loc = p.getLocation().add(x, 0, z);
                    loc.setY(y);
                   
                    Block block = loc.getBlock();
                    loc.getBlock().setType(Material.CHEST);
                    Chest chest = (Chest)block.getState();
                    Inventory inv = chest.getInventory();
                   
                    ml.Crate.put(chest.getInventory().getName(), true);
                   
                    inv.addItem(API.splint, API.bandage);
   
                    MessageManager.getManager().msg(p, MsgType.SUCCESS, "Я видел странный самолет, который сбросил ящик недалеко от меня.");
                   
                    //Название ящика
                   
                    try {
                       
                        Field inventoryField = chest.getClass().getDeclaredField("chest");
                        inventoryField.setAccessible(true);
                        TileEntityChest teChest = ((TileEntityChest) inventoryField.get(chest));
                        teChest.a(ChatColor.DARK_GREEN + ChatColor.BOLD.toString() + "Ящик");
                    }
                   
                    catch (Exception e) {
                       
                         e.printStackTrace();
                    }
                }
            }
        }
    }
 
Пробовал, да и проблема решена, не знаю, как сделать проверку. Пробовал (можно смотреть повыше.), но ничего не получалось
Почему блин не работает? Все же вроде бы правильно сделал! Если в позиции блока нету воздуха, тогда ничего не будет, иначе будет ставить:

JavaScript:
for (Player p : Bukkit.getOnlinePlayers()) {
           
            if(p.getLocation().getBlock().getType() != Material.AIR) {
                return;
               
            } else {

                if (r.nextInt(1000) <= 500) {
                                   
                    int x = r.nextInt(10) + 2;
                    int z = r.nextInt(10) + 2;
                    int y = p.getLocation().getWorld().getHighestBlockYAt(x, z);
                   
                    Location loc = p.getLocation().add(x, 0, z);
                    loc.setY(y);
                   
                    Block block = loc.getBlock();
                    loc.getBlock().setType(Material.CHEST);
                    Chest chest = (Chest)block.getState();
                    Inventory inv = chest.getInventory();
                   
                    ml.Crate.put(chest.getInventory().getName(), true);
                   
                    inv.addItem(API.splint, API.bandage);
   
                    MessageManager.getManager().msg(p, MsgType.SUCCESS, "Я видел странный самолет, который сбросил ящик недалеко от меня.");
                   
                    //Название ящика
                   
                    try {
                       
                        Field inventoryField = chest.getClass().getDeclaredField("chest");
                        inventoryField.setAccessible(true);
                        TileEntityChest teChest = ((TileEntityChest) inventoryField.get(chest));
                        teChest.a(ChatColor.DARK_GREEN + ChatColor.BOLD.toString() + "Ящик");
                    }
                   
                    catch (Exception e) {
                       
                         e.printStackTrace();
                    }
                }
            }
        }
    }
 
Ты же получаешь высоту от позиции игрока, а там где ты ставишь может быть уже ниже или выше.

Пояснишь? Немножко не допер. Я ведь не позицию игрока получаю, а позицию блока. Там же getBlock()
 
Ну getHighestBlockYAt ты получаешь там где игрок. Или как оно там работает.
Или я чет путаю.
Это вроде бы отвечает за максимальную высоту относительно чего-то (сам не помню)
 
Это вроде бы отвечает за максимальную высоту относительно чего-то (сам не помню)
1. Получаешь позицию игрока
2. Получаешь 2 случайных числа x и z ОТНОСИТЕЛЬНО позиции игрока
3. Получаешь y с помощью метода getHighestBlockYAt
4. Спавнишь сундук
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх