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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Lisenochek, 20 июл 2016.

Статус темы:
Закрыта.
  1. Автор темы
    Lisenochek

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

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

    Вот кусочек кода:
    Код:
    Всем привет. Подскажите, как спавнить сундук в случайном месте, а точнее, допустим (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, "Я видел странный самолет, который сбросил ящик недалеко от меня.");
                }
            }
     
  2. Хостинг MineCraft
    <
  3. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    Так в чём проблема?Берёшь класс Random и генерируешь рандомные координаты.
     
  4. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Код:
        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()));
        }
     
  5. Автор темы
    Lisenochek

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

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

    Вот код:
    Код:
    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);
    И это таймер.
     
  6. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    Здесь не добавляй y,вместо него впиши 1
     
  7. Larin

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

    Баллы:
    103
    World.getHighestBlockAt
     
  8. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Спавнит теперь на 1 блок в воздухе[DOUBLEPOST=1469025941,1469025853][/DOUBLEPOST]
    И проверка почему-то не работает. Встану я на дом, а он спавнит его на моей высоте в воздухе
     
  9. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    Проверка и не будет работать(твой y нигде не используется),а вместо 1 впиши ноль(логика).Советую сделать так чтобы твой рандом мог и в минус уходить,да и сделай проверку где будет появлятся сундук(иначе игроки будут им грифирить)
     
  10. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    А то что я дал не походит чтоли?
    Location chestloc = generateBlocks(loc1,loc2);
     
  11. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    У вас слишком запутанный способ.)
     
  12. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Ну всмысле запутанный? Передаешь две локации, метод получает все блоки, проверяет что это воздух и что под ним есть блок, и выдает один рандомный блок с локацией.
     
  13. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    Я это понимаю,а вот как использовать чужие методы автор темы не понимает(не понимал).
     
  14. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Я конечно все понимаю (нет), но как тогда использовать y, если надо ставить в строчке 0 ? Все равно ничего не понимаю...
     
  15. Larin

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

    Баллы:
    103
    Долбоёбы,
    Я вам давно ответ написал.
     
  16. Novichock

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

    Баллы:
    76
    Skype:
    pavel.batalov1
    Просто после
    Код:
    Location loc = p.getLocation().add(x, y, z);
    
    Допишите:
    Код:
    loc.setY(y);
    
     
  17. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Пытался сделать проверку на наличие блока, но что-то пошло не так и он ломает и ставит на место блока сундук.

    Код:
    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();
                        }
                    }
                }
            }
        }
     
  18. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Пробовал, да и проблема решена, не знаю, как сделать проверку. Пробовал (можно смотреть повыше.), но ничего не получалось[DOUBLEPOST=1469035489,1469032886][/DOUBLEPOST]Почему блин не работает? Все же вроде бы правильно сделал! Если в позиции блока нету воздуха, тогда ничего не будет, иначе будет ставить:

    Код:
    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();
                        }
                    }
                }
            }
        }
     
  19. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Пояснишь? Немножко не допер. Я ведь не позицию игрока получаю, а позицию блока. Там же getBlock()
     
  20. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Это вроде бы отвечает за максимальную высоту относительно чего-то (сам не помню)
     
  21. Larin

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

    Баллы:
    103
    1. Получаешь позицию игрока
    2. Получаешь 2 случайных числа x и z ОТНОСИТЕЛЬНО позиции игрока
    3. Получаешь y с помощью метода getHighestBlockYAt
    4. Спавнишь сундук
     
Статус темы:
Закрыта.

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